@shapesos/clay 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/chat.cjs +259 -417
  2. package/dist/chat.cjs.map +1 -1
  3. package/dist/chat.d.cts +16 -22
  4. package/dist/chat.d.ts +16 -22
  5. package/dist/chat.js +16 -6
  6. package/dist/chunk-72TJUKMV.js +1 -0
  7. package/dist/{chunk-UKM5VQKW.js → chunk-BIATJTD4.js} +5 -5
  8. package/dist/chunk-BIATJTD4.js.map +1 -0
  9. package/dist/chunk-DRBRT57F.js +1 -0
  10. package/dist/chunk-DRBRT57F.js.map +1 -0
  11. package/dist/chunk-JC2RQL5O.js +76 -0
  12. package/dist/chunk-JC2RQL5O.js.map +1 -0
  13. package/dist/{chunk-6HNZQ2BF.js → chunk-JF3P66JF.js} +2 -1
  14. package/dist/chunk-JF3P66JF.js.map +1 -0
  15. package/dist/chunk-K2Q5MQWJ.js +17 -0
  16. package/dist/chunk-K2Q5MQWJ.js.map +1 -0
  17. package/dist/chunk-MLCRDVQ2.js +89 -0
  18. package/dist/chunk-MLCRDVQ2.js.map +1 -0
  19. package/dist/chunk-OLJIJYB5.js +46 -0
  20. package/dist/chunk-OLJIJYB5.js.map +1 -0
  21. package/dist/chunk-PCBRMJJJ.js +415 -0
  22. package/dist/chunk-PCBRMJJJ.js.map +1 -0
  23. package/dist/chunk-SMTOVZ3O.js +19 -0
  24. package/dist/chunk-SMTOVZ3O.js.map +1 -0
  25. package/dist/{chunk-A6DKIFWS.js → chunk-WQ2QTUYA.js} +9 -1
  26. package/dist/chunk-WQ2QTUYA.js.map +1 -0
  27. package/dist/chunk-WZHNMC6P.js +77 -0
  28. package/dist/chunk-WZHNMC6P.js.map +1 -0
  29. package/dist/icon.cjs +38 -23
  30. package/dist/icon.cjs.map +1 -1
  31. package/dist/icon.d.cts +6 -2
  32. package/dist/icon.d.ts +6 -2
  33. package/dist/icon.js +6 -4
  34. package/dist/index.cjs +417 -449
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +5 -11
  37. package/dist/index.d.ts +5 -11
  38. package/dist/index.js +42 -34
  39. package/dist/index.js.map +1 -1
  40. package/dist/keyboard-shortcut.cjs +238 -0
  41. package/dist/keyboard-shortcut.cjs.map +1 -0
  42. package/dist/keyboard-shortcut.d.cts +19 -0
  43. package/dist/keyboard-shortcut.d.ts +19 -0
  44. package/dist/keyboard-shortcut.js +14 -0
  45. package/dist/keyboard-shortcut.js.map +1 -0
  46. package/dist/lottie.cjs +5 -5
  47. package/dist/lottie.cjs.map +1 -1
  48. package/dist/lottie.js +1 -1
  49. package/dist/text-area.cjs +497 -0
  50. package/dist/text-area.cjs.map +1 -0
  51. package/dist/text-area.d.cts +18 -0
  52. package/dist/text-area.d.ts +18 -0
  53. package/dist/text-area.js +11 -0
  54. package/dist/text-area.js.map +1 -0
  55. package/dist/tokens.cjs +9 -0
  56. package/dist/tokens.cjs.map +1 -1
  57. package/dist/tokens.d.cts +2 -0
  58. package/dist/tokens.d.ts +2 -0
  59. package/dist/tokens.js +2 -2
  60. package/dist/utils.cjs +60 -0
  61. package/dist/utils.cjs.map +1 -0
  62. package/dist/utils.d.cts +7 -0
  63. package/dist/utils.d.ts +7 -0
  64. package/dist/utils.js +13 -0
  65. package/dist/utils.js.map +1 -0
  66. package/package.json +17 -1
  67. package/dist/chunk-2GFOESHR.js +0 -613
  68. package/dist/chunk-2GFOESHR.js.map +0 -1
  69. package/dist/chunk-6HNZQ2BF.js.map +0 -1
  70. package/dist/chunk-7AJSQJQ5.js +0 -1
  71. package/dist/chunk-A6DKIFWS.js.map +0 -1
  72. package/dist/chunk-P7NISN4V.js +0 -115
  73. package/dist/chunk-P7NISN4V.js.map +0 -1
  74. package/dist/chunk-UKM5VQKW.js.map +0 -1
  75. /package/dist/{chunk-7AJSQJQ5.js.map → chunk-72TJUKMV.js.map} +0 -0
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-DRBRT57F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,76 @@
1
+ import {
2
+ typographyMixin,
3
+ typographyTypes
4
+ } from "./chunk-WQ2QTUYA.js";
5
+ import {
6
+ colors
7
+ } from "./chunk-JF3P66JF.js";
8
+ import {
9
+ mergeRefs
10
+ } from "./chunk-K2Q5MQWJ.js";
11
+
12
+ // src/components/text-area/text-area.tsx
13
+ import { forwardRef, useCallback, useLayoutEffect, useRef } from "react";
14
+
15
+ // src/components/text-area/text-area-styles.ts
16
+ import styled from "styled-components";
17
+ var StyledTextArea = styled.textarea`
18
+ ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
19
+ color: ${colors["brown-100"]};
20
+ border: none;
21
+ outline: none;
22
+ resize: none;
23
+ width: 100%;
24
+ background: transparent;
25
+ vertical-align: bottom;
26
+ max-height: ${({ $maxHeight }) => $maxHeight ? `${$maxHeight}px` : "none"};
27
+ overflow-y: ${({ $maxHeight }) => $maxHeight ? "auto" : "hidden"};
28
+
29
+ &::placeholder {
30
+ color: ${colors["brown-50"]};
31
+ }
32
+
33
+ &:disabled {
34
+ opacity: 0.5;
35
+ cursor: not-allowed;
36
+ }
37
+ `;
38
+
39
+ // src/components/text-area/text-area.tsx
40
+ import { jsx } from "react/jsx-runtime";
41
+ var TextArea = forwardRef(function TextArea2({ value, onChange, placeholder, maxHeight, rows = 1, autoFocus, onKeyDown, disabled, className }, externalRef) {
42
+ const internalRef = useRef(null);
43
+ useLayoutEffect(() => {
44
+ const el = internalRef.current;
45
+ if (el) {
46
+ el.style.height = "auto";
47
+ el.style.height = `${el.scrollHeight}px`;
48
+ }
49
+ }, [value]);
50
+ const handleChange = useCallback(
51
+ (e) => {
52
+ onChange(e.target.value);
53
+ },
54
+ [onChange]
55
+ );
56
+ return /* @__PURE__ */ jsx(
57
+ StyledTextArea,
58
+ {
59
+ ref: mergeRefs(internalRef, externalRef),
60
+ value,
61
+ onChange: handleChange,
62
+ placeholder,
63
+ $maxHeight: maxHeight,
64
+ rows,
65
+ autoFocus,
66
+ onKeyDown,
67
+ disabled,
68
+ className
69
+ }
70
+ );
71
+ });
72
+
73
+ export {
74
+ TextArea
75
+ };
76
+ //# sourceMappingURL=chunk-JC2RQL5O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/text-area/text-area.tsx","../src/components/text-area/text-area-styles.ts"],"sourcesContent":["import { forwardRef, useCallback, useLayoutEffect, useRef, type ChangeEvent } from \"react\";\n\nimport { mergeRefs } from \"@/utils/merge-refs\";\nimport { StyledTextArea } from \"./text-area-styles\";\nimport type { TextAreaProps } from \"./types\";\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function TextArea(\n { value, onChange, placeholder, maxHeight, rows = 1, autoFocus, onKeyDown, disabled, className },\n externalRef\n) {\n const internalRef = useRef<HTMLTextAreaElement>(null);\n\n // Auto-resize: recalculates height whenever value changes so the textarea\n // grows/shrinks to fit its content (also restores correct height when the\n // component re-mounts or becomes visible again after being hidden).\n useLayoutEffect(() => {\n const el = internalRef.current;\n if (el) {\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }\n }, [value]);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <StyledTextArea\n ref={mergeRefs(internalRef, externalRef)}\n value={value}\n onChange={handleChange}\n placeholder={placeholder}\n $maxHeight={maxHeight}\n rows={rows}\n autoFocus={autoFocus}\n onKeyDown={onKeyDown}\n disabled={disabled}\n className={className}\n />\n );\n});\n","import styled from \"styled-components\";\n\nimport { colors } from \"../../tokens/colors\";\nimport { typographyMixin, typographyTypes } from \"../../tokens/typography\";\n\nexport const StyledTextArea = styled.textarea<{ $maxHeight?: number }>`\n ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};\n color: ${colors[\"brown-100\"]};\n border: none;\n outline: none;\n resize: none;\n width: 100%;\n background: transparent;\n vertical-align: bottom;\n max-height: ${({ $maxHeight }) => ($maxHeight ? `${$maxHeight}px` : \"none\")};\n overflow-y: ${({ $maxHeight }) => ($maxHeight ? \"auto\" : \"hidden\")};\n\n &::placeholder {\n color: ${colors[\"brown-50\"]};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,YAAY,aAAa,iBAAiB,cAAgC;;;ACAnF,OAAO,YAAY;AAKZ,IAAM,iBAAiB,OAAO;AAAA,IACjC,gBAAgB,gBAAgB,oBAAoB,CAAC;AAAA,WAC9C,OAAO,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOd,CAAC,EAAE,WAAW,MAAO,aAAa,GAAG,UAAU,OAAO,MAAO;AAAA,gBAC7D,CAAC,EAAE,WAAW,MAAO,aAAa,SAAS,QAAS;AAAA;AAAA;AAAA,aAGvD,OAAO,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADa3B;AAzBG,IAAM,WAAW,WAA+C,SAASA,UAC9E,EAAE,OAAO,UAAU,aAAa,WAAW,OAAO,GAAG,WAAW,WAAW,UAAU,UAAU,GAC/F,aACA;AACA,QAAM,cAAc,OAA4B,IAAI;AAKpD,kBAAgB,MAAM;AACpB,UAAM,KAAK,YAAY;AACvB,QAAI,IAAI;AACN,SAAG,MAAM,SAAS;AAClB,SAAG,MAAM,SAAS,GAAG,GAAG,YAAY;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe;AAAA,IACnB,CAAC,MAAwC;AACvC,eAAS,EAAE,OAAO,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,UAAU,aAAa,WAAW;AAAA,MACvC;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["TextArea"]}
@@ -3,6 +3,7 @@ var colors = {
3
3
  // White
4
4
  white: "#FFFFFF",
5
5
  "white-alpha-85": "rgba(255, 255, 255, 0.85)",
6
+ "white-alpha-40": "rgba(255, 255, 255, 0.40)",
6
7
  // Brown
7
8
  "brown-10": "#FAF9F8",
8
9
  "brown-20": "#F5F3F0",
@@ -88,4 +89,4 @@ var colors = {
88
89
  export {
89
90
  colors
90
91
  };
91
- //# sourceMappingURL=chunk-6HNZQ2BF.js.map
92
+ //# sourceMappingURL=chunk-JF3P66JF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/colors.ts"],"sourcesContent":["export const colors = {\n // White\n white: \"#FFFFFF\",\n \"white-alpha-85\": \"rgba(255, 255, 255, 0.85)\",\n \"white-alpha-40\": \"rgba(255, 255, 255, 0.40)\",\n\n // Brown\n \"brown-10\": \"#FAF9F8\",\n \"brown-20\": \"#F5F3F0\",\n \"brown-30\": \"#EEEBE5\",\n \"brown-40\": \"#E6E2DA\",\n \"brown-50\": \"#CFCBC4\",\n \"brown-60\": \"#A19E99\",\n \"brown-70\": \"#73716D\",\n \"brown-80\": \"#5C5A57\",\n \"brown-90\": \"#2E2D2C\",\n \"brown-100\": \"#171716\",\n \"brown-alpha-12\": \"rgba(23, 23, 22, 0.12)\",\n \"brown-alpha-20\": \"rgba(23, 23, 22, 0.20)\",\n \"brown-alpha-55\": \"rgba(23, 23, 22, 0.55)\",\n \"brown-alpha-70\": \"rgba(23, 23, 22, 0.70)\",\n \"brown-alpha-80\": \"rgba(23, 23, 22, 0.80)\",\n \"brown-alpha-90\": \"rgba(23, 23, 22, 0.90)\",\n\n // Fuchsia\n \"fuchsia-50\": \"#FAF5FF\",\n \"fuchsia-300\": \"#F0ABFC\",\n \"fuchsia-500\": \"#D946EF\",\n \"fuchsia-600\": \"#C026D3\",\n \"fuchsia-800\": \"#86198F\",\n\n // Pink\n \"pink-50\": \"#FDF2F8\",\n \"pink-400\": \"#F472B6\",\n \"pink-600\": \"#DB2777\",\n \"pink-800\": \"#9D174D\",\n\n // Violet\n \"violet-50\": \"#F5F3FF\",\n \"violet-400\": \"#A78BFA\",\n \"violet-600\": \"#7C3AED\",\n \"violet-800\": \"#5B21B6\",\n\n // Indigo\n \"indigo-50\": \"#EEF2FF\",\n \"indigo-400\": \"#818CF8\",\n \"indigo-500\": \"#6366F1\",\n \"indigo-600\": \"#4F46E5\",\n \"indigo-800\": \"#3730A3\",\n\n // Cyan\n \"cyan-50\": \"#E7FEFF\",\n \"cyan-300\": \"#67E8F9\",\n \"cyan-600\": \"#0891B2\",\n \"cyan-900\": \"#164E63\",\n\n // Teal\n \"teal-50\": \"#EBFDF9\",\n \"teal-300\": \"#5EEAD4\",\n \"teal-600\": \"#0D9488\",\n\n // Rose\n \"rose-400\": \"#FB7185\",\n\n // Purple\n \"purple-400\": \"#C084FC\",\n\n // Blue\n \"blue-50\": \"#EFF6FF\",\n \"blue-100\": \"#DBEAFE\",\n \"blue-300\": \"#93C5FD\",\n \"blue-400\": \"#60A5FA\",\n \"blue-600\": \"#2563EB\",\n \"blue-800\": \"#1E40AF\",\n\n // Sky\n \"sky-300\": \"#7DD3FC\",\n\n // Green\n \"green-50\": \"#ECF9F0\",\n \"green-100\": \"#D4F1D9\",\n \"green-400\": \"#3DC269\",\n \"green-700\": \"#277C43\",\n \"green-800\": \"#1C5930\",\n\n // Orange\n \"orange-50\": \"#FFF7ED\",\n \"orange-100\": \"#FFEDD5\",\n \"orange-200\": \"#FED7AA\",\n \"orange-500\": \"#F97316\",\n \"orange-600\": \"#EA580C\",\n\n // Red\n \"red-50\": \"#FEF2F2\",\n \"red-100\": \"#FEE2E2\",\n \"red-200\": \"#FECACA\",\n \"red-400\": \"#F7776C\",\n \"red-500\": \"#EF4444\",\n \"red-600\": \"#DC2626\",\n} as const;\n\nexport type ColorToken = keyof typeof colors;\n"],"mappings":";AAAO,IAAM,SAAS;AAAA;AAAA,EAEpB,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA,EAGlB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA,EAGlB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA;AAAA,EAGf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,YAAY;AAAA;AAAA,EAGZ,cAAc;AAAA;AAAA,EAGd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAGb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;","names":[]}
@@ -0,0 +1,17 @@
1
+ // src/utils/merge-refs.ts
2
+ function mergeRefs(...refs) {
3
+ return (node) => {
4
+ for (const ref of refs) {
5
+ if (typeof ref === "function") {
6
+ ref(node);
7
+ } else if (ref) {
8
+ ref.current = node;
9
+ }
10
+ }
11
+ };
12
+ }
13
+
14
+ export {
15
+ mergeRefs
16
+ };
17
+ //# sourceMappingURL=chunk-K2Q5MQWJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/merge-refs.ts"],"sourcesContent":["import type { Ref } from \"react\";\n\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): (node: T | null) => void {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n"],"mappings":";AAEO,SAAS,aAAgB,MAAwD;AACtF,SAAO,CAAC,SAAS;AACf,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,IAAI;AAAA,MACV,WAAW,KAAK;AACd,QAAC,IAAyC,UAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ Icon
3
+ } from "./chunk-OLJIJYB5.js";
4
+ import {
5
+ colors
6
+ } from "./chunk-JF3P66JF.js";
7
+
8
+ // src/components/icon-button/icon-button-styles.ts
9
+ import styled from "styled-components";
10
+ var PADDING = {
11
+ short: {
12
+ small: "4px",
13
+ medium: "6px"
14
+ },
15
+ long: {
16
+ small: "4px 6px",
17
+ medium: "6px 10px"
18
+ }
19
+ };
20
+ var BORDER_RADIUS = {
21
+ small: 6,
22
+ medium: 10
23
+ };
24
+ var Button = styled.button`
25
+ display: inline-flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ padding: ${({ $size, $variant }) => PADDING[$variant][$size]};
29
+ border: none;
30
+ border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;
31
+ background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : "transparent"};
32
+ color: ${colors["brown-100"]};
33
+ cursor: pointer;
34
+ transition: background-color 100ms ease;
35
+
36
+ &:hover {
37
+ background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : colors["brown-20"]};
38
+ }
39
+
40
+ &:active {
41
+ background: ${colors["brown-40"]};
42
+ }
43
+
44
+ &:disabled {
45
+ color: ${colors["brown-50"]};
46
+ background: transparent;
47
+ cursor: not-allowed;
48
+ }
49
+ `;
50
+
51
+ // src/components/icon-button/icon-button.tsx
52
+ import { jsx } from "react/jsx-runtime";
53
+ var ICON_SIZE_BY_BUTTON_SIZE = {
54
+ small: 16,
55
+ medium: 20
56
+ };
57
+ function IconButton({
58
+ icon,
59
+ size = "small",
60
+ variant = "short",
61
+ isSelected = false,
62
+ disabled = false,
63
+ onClick,
64
+ className,
65
+ id,
66
+ as,
67
+ "aria-label": ariaLabel
68
+ }) {
69
+ return /* @__PURE__ */ jsx(
70
+ Button,
71
+ {
72
+ className,
73
+ id,
74
+ as,
75
+ $size: size,
76
+ $variant: variant,
77
+ $isSelected: isSelected,
78
+ disabled,
79
+ onClick: disabled ? void 0 : onClick,
80
+ "aria-label": ariaLabel,
81
+ children: /* @__PURE__ */ jsx(Icon, { icon, size: ICON_SIZE_BY_BUTTON_SIZE[size] })
82
+ }
83
+ );
84
+ }
85
+
86
+ export {
87
+ IconButton
88
+ };
89
+ //# sourceMappingURL=chunk-MLCRDVQ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/icon-button/icon-button-styles.ts","../src/components/icon-button/icon-button.tsx"],"sourcesContent":["import styled from \"styled-components\";\n\nimport { colors } from \"../../tokens/colors\";\nimport type { IconButtonSize, IconButtonVariant } from \"./types\";\n\nconst PADDING: Record<IconButtonVariant, Record<IconButtonSize, string>> = {\n short: {\n small: \"4px\",\n medium: \"6px\",\n },\n long: {\n small: \"4px 6px\",\n medium: \"6px 10px\",\n },\n};\n\nconst BORDER_RADIUS: Record<IconButtonSize, number> = {\n small: 6,\n medium: 10,\n};\n\nexport const Button = styled.button<{\n $size: IconButtonSize;\n $variant: IconButtonVariant;\n $isSelected: boolean;\n}>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${({ $size, $variant }) => PADDING[$variant][$size]};\n border: none;\n border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;\n background: ${({ $isSelected }) => ($isSelected ? colors[\"brown-40\"] : \"transparent\")};\n color: ${colors[\"brown-100\"]};\n cursor: pointer;\n transition: background-color 100ms ease;\n\n &:hover {\n background: ${({ $isSelected }) => ($isSelected ? colors[\"brown-40\"] : colors[\"brown-20\"])};\n }\n\n &:active {\n background: ${colors[\"brown-40\"]};\n }\n\n &:disabled {\n color: ${colors[\"brown-50\"]};\n background: transparent;\n cursor: not-allowed;\n }\n`;\n","import { Icon } from \"../icon/icon\";\nimport { Button } from \"./icon-button-styles\";\nimport type { IconButtonProps, IconButtonSize } from \"./types\";\n\nconst ICON_SIZE_BY_BUTTON_SIZE: Record<IconButtonSize, number> = {\n small: 16,\n medium: 20,\n};\n\nexport function IconButton({\n icon,\n size = \"small\",\n variant = \"short\",\n isSelected = false,\n disabled = false,\n onClick,\n className,\n id,\n as,\n \"aria-label\": ariaLabel,\n}: IconButtonProps): React.ReactNode {\n return (\n <Button\n className={className}\n id={id}\n as={as}\n $size={size}\n $variant={variant}\n $isSelected={isSelected}\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n aria-label={ariaLabel}\n >\n <Icon icon={icon} size={ICON_SIZE_BY_BUTTON_SIZE[size]} />\n </Button>\n );\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,YAAY;AAKnB,IAAM,UAAqE;AAAA,EACzE,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,gBAAgD;AAAA,EACpD,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA,aAQhB,CAAC,EAAE,OAAO,SAAS,MAAM,QAAQ,QAAQ,EAAE,KAAK,CAAC;AAAA;AAAA,mBAE3C,CAAC,EAAE,MAAM,MAAM,cAAc,KAAK,CAAC;AAAA,gBACtC,CAAC,EAAE,YAAY,MAAO,cAAc,OAAO,UAAU,IAAI,aAAc;AAAA,WAC5E,OAAO,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKZ,CAAC,EAAE,YAAY,MAAO,cAAc,OAAO,UAAU,IAAI,OAAO,UAAU,CAAE;AAAA;AAAA;AAAA;AAAA,kBAI5E,OAAO,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,aAIvB,OAAO,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;;;ACbzB;AA7BN,IAAM,2BAA2D;AAAA,EAC/D,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqC;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA,SAAS,WAAW,SAAY;AAAA,MAChC,cAAY;AAAA,MAEZ,8BAAC,QAAK,MAAY,MAAM,yBAAyB,IAAI,GAAG;AAAA;AAAA,EAC1D;AAEJ;","names":[]}
@@ -0,0 +1,46 @@
1
+ // src/components/icon/icon.tsx
2
+ import { forwardRef } from "react";
3
+
4
+ // src/components/icon/icon-styles.ts
5
+ import styled from "styled-components";
6
+ var STROKE_WIDTH_BY_SIZE = {
7
+ 12: 1.4,
8
+ 14: 1.4,
9
+ 16: 1.8,
10
+ 18: 1.8,
11
+ 20: 1.8,
12
+ 24: 1.8
13
+ };
14
+ var DEFAULT_STROKE_WIDTH = 1.8;
15
+ function getStrokeWidth(size) {
16
+ return STROKE_WIDTH_BY_SIZE[size] ?? DEFAULT_STROKE_WIDTH;
17
+ }
18
+ var IconWrapper = styled.span`
19
+ display: inline-flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ color: ${({ $color }) => $color ?? "currentColor"};
23
+ flex-shrink: 0;
24
+ `;
25
+
26
+ // src/components/icon/icon.tsx
27
+ import { jsx } from "react/jsx-runtime";
28
+ var DEFAULT_SIZE = 16;
29
+ var Icon = forwardRef(function Icon2({ icon: IconComponent, size = DEFAULT_SIZE, color, className, "aria-label": ariaLabel }, ref) {
30
+ return /* @__PURE__ */ jsx(
31
+ IconWrapper,
32
+ {
33
+ ref,
34
+ className,
35
+ $color: color,
36
+ "aria-label": ariaLabel,
37
+ role: ariaLabel ? "img" : void 0,
38
+ children: /* @__PURE__ */ jsx(IconComponent, { width: size, height: size, strokeWidth: getStrokeWidth(size) })
39
+ }
40
+ );
41
+ });
42
+
43
+ export {
44
+ Icon
45
+ };
46
+ //# sourceMappingURL=chunk-OLJIJYB5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/icon/icon.tsx","../src/components/icon/icon-styles.ts"],"sourcesContent":["import { forwardRef } from \"react\";\n\nimport { IconWrapper, getStrokeWidth } from \"./icon-styles\";\nimport type { IconProps } from \"./types\";\n\nconst DEFAULT_SIZE = 16;\n\nexport const Icon = forwardRef<HTMLSpanElement, IconProps>(function Icon(\n { icon: IconComponent, size = DEFAULT_SIZE, color, className, \"aria-label\": ariaLabel },\n ref\n) {\n return (\n <IconWrapper\n ref={ref}\n className={className}\n $color={color}\n aria-label={ariaLabel}\n role={ariaLabel ? \"img\" : undefined}\n >\n <IconComponent width={size} height={size} strokeWidth={getStrokeWidth(size)} />\n </IconWrapper>\n );\n});\n","import styled from \"styled-components\";\n\nexport const STROKE_WIDTH_BY_SIZE: Record<number, number> = {\n 12: 1.4,\n 14: 1.4,\n 16: 1.8,\n 18: 1.8,\n 20: 1.8,\n 24: 1.8,\n};\n\nexport const DEFAULT_STROKE_WIDTH = 1.8;\n\nexport function getStrokeWidth(size: number): number {\n return STROKE_WIDTH_BY_SIZE[size] ?? DEFAULT_STROKE_WIDTH;\n}\n\nexport const IconWrapper = styled.span<{ $color?: string }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${({ $color }) => $color ?? \"currentColor\"};\n flex-shrink: 0;\n`;\n"],"mappings":";AAAA,SAAS,kBAAkB;;;ACA3B,OAAO,YAAY;AAEZ,IAAM,uBAA+C;AAAA,EAC1D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,uBAAuB;AAE7B,SAAS,eAAe,MAAsB;AACnD,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,IAAM,cAAc,OAAO;AAAA;AAAA;AAAA;AAAA,WAIvB,CAAC,EAAE,OAAO,MAAM,UAAU,cAAc;AAAA;AAAA;;;ADF7C;AAdN,IAAM,eAAe;AAEd,IAAM,OAAO,WAAuC,SAASA,MAClE,EAAE,MAAM,eAAe,OAAO,cAAc,OAAO,WAAW,cAAc,UAAU,GACtF,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,cAAY;AAAA,MACZ,MAAM,YAAY,QAAQ;AAAA,MAE1B,8BAAC,iBAAc,OAAO,MAAM,QAAQ,MAAM,aAAa,eAAe,IAAI,GAAG;AAAA;AAAA,EAC/E;AAEJ,CAAC;","names":["Icon"]}