@brycks/core-front 0.5.0 → 0.7.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 (60) hide show
  1. package/dist/components/data/List/List.cjs +1 -1
  2. package/dist/components/data/List/List.cjs.map +1 -1
  3. package/dist/components/data/List/List.js +68 -148
  4. package/dist/components/data/List/List.js.map +1 -1
  5. package/dist/components/data/Table/Table.cjs +1 -1
  6. package/dist/components/data/Table/Table.cjs.map +1 -1
  7. package/dist/components/data/Table/Table.js +142 -224
  8. package/dist/components/data/Table/Table.js.map +1 -1
  9. package/dist/components/data/TreeView/TreeView.cjs +1 -1
  10. package/dist/components/data/TreeView/TreeView.cjs.map +1 -1
  11. package/dist/components/data/TreeView/TreeView.js +141 -182
  12. package/dist/components/data/TreeView/TreeView.js.map +1 -1
  13. package/dist/components/feedback/Drawer/Drawer.cjs +1 -22
  14. package/dist/components/feedback/Drawer/Drawer.cjs.map +1 -1
  15. package/dist/components/feedback/Drawer/Drawer.js +84 -184
  16. package/dist/components/feedback/Drawer/Drawer.js.map +1 -1
  17. package/dist/components/feedback/Modal/Modal.cjs +1 -1
  18. package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
  19. package/dist/components/feedback/Modal/Modal.js +65 -150
  20. package/dist/components/feedback/Modal/Modal.js.map +1 -1
  21. package/dist/components/feedback/Toast/Toast.cjs +1 -10
  22. package/dist/components/feedback/Toast/Toast.cjs.map +1 -1
  23. package/dist/components/feedback/Toast/Toast.js +94 -187
  24. package/dist/components/feedback/Toast/Toast.js.map +1 -1
  25. package/dist/components/form/Checkbox/Checkbox.cjs +1 -1
  26. package/dist/components/form/Checkbox/Checkbox.js +11 -11
  27. package/dist/components/form/Combobox/Combobox.cjs +1 -6
  28. package/dist/components/form/Combobox/Combobox.cjs.map +1 -1
  29. package/dist/components/form/Combobox/Combobox.js +187 -283
  30. package/dist/components/form/Combobox/Combobox.js.map +1 -1
  31. package/dist/components/form/Input/Input.cjs +1 -1
  32. package/dist/components/form/Input/Input.cjs.map +1 -1
  33. package/dist/components/form/Input/Input.js +38 -133
  34. package/dist/components/form/Input/Input.js.map +1 -1
  35. package/dist/components/form/Select/Select.cjs +1 -1
  36. package/dist/components/form/Select/Select.cjs.map +1 -1
  37. package/dist/components/form/Select/Select.js +36 -82
  38. package/dist/components/form/Select/Select.js.map +1 -1
  39. package/dist/components/form/TagInput/TagInput.cjs +1 -1
  40. package/dist/components/form/TagInput/TagInput.js +8 -8
  41. package/dist/components/form/Textarea/Textarea.cjs +1 -1
  42. package/dist/components/form/Textarea/Textarea.cjs.map +1 -1
  43. package/dist/components/form/Textarea/Textarea.js +66 -95
  44. package/dist/components/form/Textarea/Textarea.js.map +1 -1
  45. package/dist/components/navigation/ContextMenu/ContextMenu.cjs +1 -1
  46. package/dist/components/navigation/ContextMenu/ContextMenu.js +9 -9
  47. package/dist/components/navigation/Menu/Menu.cjs +1 -1
  48. package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
  49. package/dist/components/navigation/Menu/Menu.js +70 -135
  50. package/dist/components/navigation/Menu/Menu.js.map +1 -1
  51. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  52. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  53. package/dist/components/navigation/Pagination/Pagination.js +87 -157
  54. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  55. package/dist/components/primitives/Button/Button.cjs +1 -1
  56. package/dist/components/primitives/Button/Button.cjs.map +1 -1
  57. package/dist/components/primitives/Button/Button.js +47 -43
  58. package/dist/components/primitives/Button/Button.js.map +1 -1
  59. package/dist/styles.css +1 -1
  60. package/package.json +1 -1
@@ -1,13 +1,8 @@
1
- import { jsxs as p, jsx as t } from "react/jsx-runtime";
2
- import { forwardRef as L, useState as j } from "react";
3
- import { cx as B } from "../../../utils/styles.js";
4
- const C = {
5
- sm: { height: 32, fontSize: 13, padding: 10 },
6
- md: { height: 40, fontSize: 14, padding: 12 },
7
- lg: { height: 48, fontSize: 15, padding: 14 }
8
- };
9
- function N() {
10
- return /* @__PURE__ */ t("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ t(
1
+ import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
+ import { forwardRef as b } from "react";
3
+ import { cx as i } from "../../../utils/styles.js";
4
+ function w() {
5
+ return /* @__PURE__ */ e("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ e(
11
6
  "path",
12
7
  {
13
8
  d: "M2.5 4.5L6 8L9.5 4.5",
@@ -18,97 +13,56 @@ function N() {
18
13
  }
19
14
  ) });
20
15
  }
21
- const R = L(function({
22
- size: c = "md",
23
- variant: s = "outline",
24
- isInvalid: o,
25
- placeholder: a,
26
- className: u,
27
- style: f,
28
- testId: b,
29
- disabled: n,
30
- children: g,
31
- onFocus: h,
32
- onBlur: y,
33
- value: i,
16
+ const y = b(function({
17
+ size: l = "md",
18
+ variant: n = "outline",
19
+ isInvalid: c,
20
+ placeholder: r,
21
+ className: a,
22
+ style: d,
23
+ testId: p,
24
+ disabled: t,
25
+ children: h,
26
+ value: s,
34
27
  ...k
35
28
  }, m) {
36
- const [d, l] = j(!1), r = C[c], S = i !== void 0 && i !== "", v = {
37
- position: "relative",
38
- display: "inline-flex",
39
- width: "100%"
40
- }, w = () => {
41
- const e = {
42
- width: "100%",
43
- height: r.height,
44
- paddingLeft: r.padding,
45
- paddingRight: r.padding + 24,
46
- fontSize: r.fontSize,
47
- fontFamily: "var(--brycks-font-sans)",
48
- color: S || !a ? "var(--brycks-foreground-default)" : "var(--brycks-foreground-muted)",
49
- backgroundColor: s === "filled" ? "var(--brycks-background-muted)" : "var(--brycks-background-app)",
50
- border: `1px solid ${o ? "var(--brycks-error-default)" : d ? "var(--brycks-border-focus)" : s === "filled" ? "transparent" : "var(--brycks-border-default)"}`,
51
- borderRadius: "var(--brycks-radius-default)",
52
- outline: "none",
53
- cursor: n ? "not-allowed" : "pointer",
54
- appearance: "none",
55
- WebkitAppearance: "none",
56
- transition: "all 200ms ease-out",
57
- boxShadow: d ? o ? "0 0 0 3px rgba(239, 68, 68, 0.15)" : "0 0 0 3px rgba(85, 120, 244, 0.15)" : "none"
58
- };
59
- return n && (e.opacity = 0.5), e;
60
- }, x = {
61
- position: "absolute",
62
- right: r.padding,
63
- top: "50%",
64
- transform: "translateY(-50%)",
65
- pointerEvents: "none",
66
- color: "var(--brycks-foreground-muted)",
67
- transition: "transform 200ms ease-out"
68
- }, z = (e) => {
69
- l(!0), h?.(e);
70
- }, F = (e) => {
71
- l(!1), y?.(e);
72
- };
73
- return /* @__PURE__ */ p(
29
+ const u = !(s !== void 0 && s !== "") && !!r;
30
+ return /* @__PURE__ */ o(
74
31
  "div",
75
32
  {
76
- className: B(
33
+ className: i(
77
34
  "brycks-select-wrapper",
78
- `brycks-select-wrapper--${s}`,
79
- `brycks-select-wrapper--${c}`,
80
- o && "brycks-select-wrapper--invalid",
81
- n && "brycks-select-wrapper--disabled",
82
- u
35
+ `brycks-select-wrapper--${n}`,
36
+ `brycks-select-wrapper--${l}`,
37
+ c && "brycks-select-wrapper--invalid",
38
+ t && "brycks-select-wrapper--disabled",
39
+ a
83
40
  ),
84
- style: { ...v, ...f },
41
+ style: d,
85
42
  children: [
86
- /* @__PURE__ */ p(
43
+ /* @__PURE__ */ o(
87
44
  "select",
88
45
  {
89
46
  ref: m,
90
- className: "brycks-select",
91
- style: w(),
92
- disabled: n,
93
- "aria-invalid": o,
94
- "data-testid": b,
95
- value: i,
96
- onFocus: z,
97
- onBlur: F,
47
+ className: i("brycks-select", u && "brycks-select--placeholder"),
48
+ disabled: t,
49
+ "aria-invalid": c,
50
+ "data-testid": p,
51
+ value: s,
98
52
  ...k,
99
53
  children: [
100
- a && /* @__PURE__ */ t("option", { value: "", disabled: !0, children: a }),
101
- g
54
+ r && /* @__PURE__ */ e("option", { value: "", disabled: !0, children: r }),
55
+ h
102
56
  ]
103
57
  }
104
58
  ),
105
- /* @__PURE__ */ t("span", { style: x, children: /* @__PURE__ */ t(N, {}) })
59
+ /* @__PURE__ */ e("span", { className: "brycks-select-icon", children: /* @__PURE__ */ e(w, {}) })
106
60
  ]
107
61
  }
108
62
  );
109
63
  });
110
- R.displayName = "Select";
64
+ y.displayName = "Select";
111
65
  export {
112
- R as Select
66
+ y as Select
113
67
  };
114
68
  //# sourceMappingURL=Select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sources":["../../../../src/components/form/Select/Select.tsx"],"sourcesContent":["/**\r\n * Select Component\r\n *\r\n * Native select with custom styling for cross-browser consistency.\r\n * Maintains accessibility while providing Apple-inspired visuals.\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n useState,\r\n type CSSProperties,\r\n type SelectHTMLAttributes,\r\n type ReactNode,\r\n} from 'react'\r\nimport { cx } from '../../../utils/styles'\r\n\r\nexport type SelectSize = 'sm' | 'md' | 'lg'\r\nexport type SelectVariant = 'outline' | 'filled'\r\n\r\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\r\n /** Select size */\r\n size?: SelectSize\r\n /** Visual variant */\r\n variant?: SelectVariant\r\n /** Error state */\r\n isInvalid?: boolean\r\n /** Placeholder option */\r\n placeholder?: string\r\n /** Custom class name */\r\n className?: string\r\n /** Test ID */\r\n testId?: string\r\n /** Children (option elements) */\r\n children?: ReactNode\r\n}\r\n\r\nconst sizeStyles: Record<SelectSize, { height: number; fontSize: number; padding: number }> = {\r\n sm: { height: 32, fontSize: 13, padding: 10 },\r\n md: { height: 40, fontSize: 14, padding: 12 },\r\n lg: { height: 48, fontSize: 15, padding: 14 },\r\n}\r\n\r\n/** Chevron down icon */\r\nfunction ChevronIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.5L6 8L9.5 4.5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\r\n {\r\n size = 'md',\r\n variant = 'outline',\r\n isInvalid,\r\n placeholder,\r\n className,\r\n style,\r\n testId,\r\n disabled,\r\n children,\r\n onFocus,\r\n onBlur,\r\n value,\r\n ...props\r\n },\r\n ref\r\n) {\r\n const [isFocused, setIsFocused] = useState(false)\r\n\r\n const sizeValue = sizeStyles[size]\r\n const hasValue = value !== undefined && value !== ''\r\n\r\n const wrapperStyle: CSSProperties = {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n width: '100%',\r\n }\r\n\r\n const getSelectStyle = (): CSSProperties => {\r\n const base: CSSProperties = {\r\n width: '100%',\r\n height: sizeValue.height,\r\n paddingLeft: sizeValue.padding,\r\n paddingRight: sizeValue.padding + 24,\r\n fontSize: sizeValue.fontSize,\r\n fontFamily: 'var(--brycks-font-sans)',\r\n color: hasValue || !placeholder ? 'var(--brycks-foreground-default)' : 'var(--brycks-foreground-muted)',\r\n backgroundColor: variant === 'filled' ? 'var(--brycks-background-muted)' : 'var(--brycks-background-app)',\r\n border: `1px solid ${\r\n isInvalid\r\n ? 'var(--brycks-error-default)'\r\n : isFocused\r\n ? 'var(--brycks-border-focus)'\r\n : variant === 'filled'\r\n ? 'transparent'\r\n : 'var(--brycks-border-default)'\r\n }`,\r\n borderRadius: 'var(--brycks-radius-default)',\r\n outline: 'none',\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n appearance: 'none',\r\n WebkitAppearance: 'none',\r\n transition: 'all 200ms ease-out',\r\n boxShadow: isFocused\r\n ? isInvalid\r\n ? '0 0 0 3px rgba(239, 68, 68, 0.15)'\r\n : '0 0 0 3px rgba(85, 120, 244, 0.15)'\r\n : 'none',\r\n }\r\n\r\n if (disabled) {\r\n base.opacity = 0.5\r\n }\r\n\r\n return base\r\n }\r\n\r\n const iconStyle: CSSProperties = {\r\n position: 'absolute',\r\n right: sizeValue.padding,\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n pointerEvents: 'none',\r\n color: 'var(--brycks-foreground-muted)',\r\n transition: 'transform 200ms ease-out',\r\n }\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLSelectElement>) => {\r\n setIsFocused(true)\r\n onFocus?.(e)\r\n }\r\n\r\n const handleBlur = (e: React.FocusEvent<HTMLSelectElement>) => {\r\n setIsFocused(false)\r\n onBlur?.(e)\r\n }\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'brycks-select-wrapper',\r\n `brycks-select-wrapper--${variant}`,\r\n `brycks-select-wrapper--${size}`,\r\n isInvalid && 'brycks-select-wrapper--invalid',\r\n disabled && 'brycks-select-wrapper--disabled',\r\n className\r\n )}\r\n style={{ ...wrapperStyle, ...style }}\r\n >\r\n <select\r\n ref={ref}\r\n className=\"brycks-select\"\r\n style={getSelectStyle()}\r\n disabled={disabled}\r\n aria-invalid={isInvalid}\r\n data-testid={testId}\r\n value={value}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n {...props}\r\n >\r\n {placeholder && (\r\n <option value=\"\" disabled>\r\n {placeholder}\r\n </option>\r\n )}\r\n {children}\r\n </select>\r\n\r\n <span style={iconStyle}>\r\n <ChevronIcon />\r\n </span>\r\n </div>\r\n )\r\n})\r\n\r\nSelect.displayName = 'Select'\r\n"],"names":["sizeStyles","ChevronIcon","jsx","Select","forwardRef","size","variant","isInvalid","placeholder","className","style","testId","disabled","children","onFocus","onBlur","value","props","ref","isFocused","setIsFocused","useState","sizeValue","hasValue","wrapperStyle","getSelectStyle","base","iconStyle","handleFocus","handleBlur","jsxs","cx"],"mappings":"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"}
1
+ {"version":3,"file":"Select.js","sources":["../../../../src/components/form/Select/Select.tsx"],"sourcesContent":["/**\n * Select Component\n *\n * Native select with custom styling for cross-browser consistency.\n * Maintains accessibility while providing Apple-inspired visuals.\n */\n\nimport {\n forwardRef,\n type SelectHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\nexport type SelectVariant = 'outline' | 'filled'\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n /** Select size */\n size?: SelectSize\n /** Visual variant */\n variant?: SelectVariant\n /** Error state */\n isInvalid?: boolean\n /** Placeholder option */\n placeholder?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n /** Children (option elements) */\n children?: ReactNode\n}\n\n/** Chevron down icon */\nfunction ChevronIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n {\n size = 'md',\n variant = 'outline',\n isInvalid,\n placeholder,\n className,\n style,\n testId,\n disabled,\n children,\n value,\n ...props\n },\n ref\n) {\n const hasValue = value !== undefined && value !== ''\n const showPlaceholderColor = !hasValue && !!placeholder\n\n return (\n <div\n className={cx(\n 'brycks-select-wrapper',\n `brycks-select-wrapper--${variant}`,\n `brycks-select-wrapper--${size}`,\n isInvalid && 'brycks-select-wrapper--invalid',\n disabled && 'brycks-select-wrapper--disabled',\n className\n )}\n style={style}\n >\n <select\n ref={ref}\n className={cx('brycks-select', showPlaceholderColor && 'brycks-select--placeholder')}\n disabled={disabled}\n aria-invalid={isInvalid}\n data-testid={testId}\n value={value}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n\n <span className=\"brycks-select-icon\">\n <ChevronIcon />\n </span>\n </div>\n )\n})\n\nSelect.displayName = 'Select'\n"],"names":["ChevronIcon","jsx","Select","forwardRef","size","variant","isInvalid","placeholder","className","style","testId","disabled","children","value","props","ref","showPlaceholderColor","jsxs","cx"],"mappings":";;;AAmCA,SAASA,IAAc;AACrB,SACE,gBAAAC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEO,MAAMC,IAASC,EAA2C,SAC/D;AAAA,EACE,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AAEA,QAAMC,IAAuB,EADZH,MAAU,UAAaA,MAAU,OACR,CAAC,CAACN;AAE5C,SACE,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA,0BAA0Bb,CAAO;AAAA,QACjC,0BAA0BD,CAAI;AAAA,QAC9BE,KAAa;AAAA,QACbK,KAAY;AAAA,QACZH;AAAA,MAAA;AAAA,MAEF,OAAAC;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAF;AAAA,YACA,WAAWG,EAAG,iBAAiBF,KAAwB,4BAA4B;AAAA,YACnF,UAAAL;AAAA,YACA,gBAAcL;AAAA,YACd,eAAaI;AAAA,YACb,OAAAG;AAAA,YACC,GAAGC;AAAA,YAEH,UAAA;AAAA,cAAAP,uBACE,UAAA,EAAO,OAAM,IAAG,UAAQ,IACtB,UAAAA,GACH;AAAA,cAEDK;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,0BAGF,QAAA,EAAK,WAAU,sBACd,UAAA,gBAAAX,EAACD,KAAY,EAAA,CACf;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AAEDE,EAAO,cAAc;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),o=require("react"),de=require("../../../utils/styles.cjs"),b=require("../../../design-system/tokens/motion.cjs"),n=require("../../../design-system/tokens/spacing.cjs"),g=require("../../../design-system/primitives/sizing.cjs"),j=require("../../../design-system/tokens/typography.cjs"),ge={sm:{height:g.componentHeights.sm,fontSize:j.fontSizes.base-1,tagHeight:n.spacing[5],padding:g.componentPaddingX.xs,gap:n.spacing[1]},md:{height:g.componentHeights.md,fontSize:j.fontSizes.base,tagHeight:n.spacing[6],padding:g.componentPaddingX.sm,gap:n.spacing[1.5]},lg:{height:g.componentHeights.lg,fontSize:j.fontSizes.md,tagHeight:n.spacing[7],padding:g.componentPaddingX.sm,gap:n.spacing[2]}};function pe(){return a.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:a.jsx("path",{d:"M3 3l6 6M9 3l-6 6",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}const N=o.forwardRef(function({value:w,defaultValue:G=[],onChange:T,placeholder:U="Add tags...",size:L="md",maxTags:C,allowDuplicates:M=!1,delimiters:q=["Enter",","],disabled:y=!1,isInvalid:D=!1,readOnly:P=!1,validateTag:E,transformTag:A=m=>m.trim(),suggestions:V,renderTag:B,maxTagsMessage:W=m=>`Maximum ${m} tags allowed`,duplicateMessage:F="Tag already exists","aria-label":Y="Tag input",className:J,testId:Q},z){const[m,Z]=o.useState(G),[p,k]=o.useState(""),[O,X]=o.useState(!1),[$,v]=o.useState(null),[f,c]=o.useState(!1),[S,h]=o.useState(-1),H=o.useRef(null),K=o.useRef(null),r=w!==void 0?w:m,i=ge[L],x=!y&&!P,u=V?.filter(e=>e.label.toLowerCase().includes(p.toLowerCase())&&!r.some(t=>t.id===e.id))||[],d=o.useCallback(e=>{w===void 0&&Z(e),T?.(e)},[w,T]),I=o.useCallback(e=>{const t=A(e);if(!t)return!1;if(C&&r.length>=C)return v(W(C)),!1;if(!M&&r.some(l=>l.label.toLowerCase()===t.toLowerCase()))return v(F),!1;if(E){const l=E(t);if(l!==!0)return v(typeof l=="string"?l:"Invalid tag"),!1}const s={id:`tag-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,label:t};return d([...r,s]),k(""),v(null),!0},[r,C,M,E,A,d,W,F]),R=o.useCallback(e=>{x&&d(r.filter(t=>t.id!==e))},[x,r,d]),_=o.useCallback(e=>{const t=e.target.value;if(t.includes(",")){const s=t.split(",");s.forEach((l,ue)=>{ue<s.length-1&&l.trim()&&I(l)}),k(s[s.length-1])}else k(t);v(null),c(!0),h(-1)},[I]),ee=o.useCallback(e=>{if(x){if(f&&u.length>0){if(e.key==="ArrowDown"){e.preventDefault(),h(t=>Math.min(t+1,u.length-1));return}if(e.key==="ArrowUp"){e.preventDefault(),h(t=>Math.max(t-1,0));return}if((e.key==="Enter"||e.key==="Tab")&&S>=0){e.preventDefault();const t=u[S];t&&(d([...r,t]),k(""),c(!1),h(-1));return}}if(q.includes(e.key)&&p){e.preventDefault(),I(p),c(!1);return}if(e.key==="Backspace"&&!p&&r.length>0){R(r[r.length-1].id);return}e.key==="Escape"&&(c(!1),h(-1))}},[x,f,u,S,q,p,r,I,R,d]);o.useEffect(()=>{if(!f)return;const e=t=>{K.current?.contains(t.target)||c(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f]);const te={position:"relative",width:"100%"},ne={display:"flex",flexWrap:"wrap",alignItems:"center",gap:i.gap,minHeight:i.height,padding:`${n.spacing[1]}px ${i.padding}px`,backgroundColor:y?"var(--brycks-background-muted)":"var(--brycks-background-default)",border:`1px solid ${D||$?"var(--brycks-error-default)":O?"var(--brycks-primary-default)":"var(--brycks-border-default)"}`,borderRadius:"var(--brycks-radius-md)",transition:`all ${b.durations.fast}ms ${b.easings.easeOut}`,cursor:y?"not-allowed":"text",boxShadow:O?"var(--brycks-focus-ring)":void 0},re=e=>({display:"inline-flex",alignItems:"center",gap:n.spacing[1],height:i.tagHeight,padding:`0 ${n.spacing[2]}px`,fontSize:i.fontSize-1,fontWeight:500,color:e.color?"white":"var(--brycks-foreground-default)",backgroundColor:e.color||"var(--brycks-background-muted)",borderRadius:"var(--brycks-radius-full)",whiteSpace:"nowrap"}),oe={display:"flex",alignItems:"center",justifyContent:"center",width:n.spacing[4],height:n.spacing[4],marginLeft:n.spacing[.5],marginRight:-n.spacing[1],color:"inherit",opacity:.7,cursor:"pointer",borderRadius:"var(--brycks-radius-full)",transition:`all ${b.durations.fast}ms ${b.easings.easeOut}`},se={flex:1,minWidth:100,height:i.tagHeight,padding:0,fontSize:i.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:"transparent",border:"none",outline:"none"},ae={position:"absolute",top:"100%",left:0,right:0,marginTop:n.spacing[1],maxHeight:200,overflowY:"auto",backgroundColor:"var(--brycks-background-elevated)",border:"1px solid var(--brycks-border-default)",borderRadius:"var(--brycks-radius-lg)",boxShadow:"var(--brycks-shadow-lg)",zIndex:"var(--brycks-z-dropdown)",padding:n.spacing[1]},ie=e=>({display:"flex",alignItems:"center",gap:g.componentGap.md,padding:`${n.spacing[2]}px ${n.spacing[3]}px`,fontSize:i.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:e?"var(--brycks-background-muted)":"transparent",borderRadius:"var(--brycks-radius-md)",cursor:"pointer",transition:`background-color ${b.durations.fast}ms ${b.easings.easeOut}`}),le={marginTop:n.spacing[1],fontSize:j.fontSizes.sm,color:"var(--brycks-error-default)"},ce=(e,t)=>a.jsxs("span",{style:re(e),children:[e.label,x&&a.jsx("button",{type:"button","aria-label":`Remove ${e.label}`,style:oe,onClick:s=>{s.stopPropagation(),t()},onMouseEnter:s=>{s.currentTarget.style.opacity="1",s.currentTarget.style.backgroundColor="rgba(0,0,0,0.1)"},onMouseLeave:s=>{s.currentTarget.style.opacity="0.7",s.currentTarget.style.backgroundColor="transparent"},children:a.jsx(pe,{})})]},e.id);return a.jsxs("div",{ref:K,className:de.cx("brycks-tag-input",`brycks-tag-input--${L}`,J),style:te,"data-testid":Q,children:[a.jsxs("div",{style:ne,onClick:()=>!y&&H.current?.focus(),children:[r.map(e=>B?B(e,()=>R(e.id)):ce(e,()=>R(e.id))),a.jsx("input",{ref:e=>{H.current=e,typeof z=="function"?z(e):z&&(z.current=e)},type:"text",role:"combobox","aria-label":Y,"aria-expanded":f&&u.length>0,"aria-autocomplete":"list","aria-invalid":D||!!$,value:p,placeholder:r.length===0?U:"",disabled:y,readOnly:P,style:se,onChange:_,onKeyDown:ee,onFocus:()=>{X(!0),c(!0)},onBlur:()=>X(!1)})]}),f&&u.length>0&&a.jsx("ul",{role:"listbox",style:ae,children:u.map((e,t)=>a.jsx("li",{role:"option","aria-selected":t===S,style:ie(t===S),onClick:()=>{d([...r,e]),k(""),c(!1),H.current?.focus()},onMouseEnter:()=>h(t),children:e.label},e.id))}),$&&a.jsx("div",{style:le,children:$})]})});N.displayName="TagInput";exports.TagInput=N;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),o=require("react"),de=require("../../../utils/styles.cjs"),g=require("../../../design-system/primitives/sizing.cjs"),b=require("../../../design-system/tokens/motion.cjs"),n=require("../../../design-system/tokens/spacing.cjs"),j=require("../../../design-system/tokens/typography.cjs"),ge={sm:{height:g.componentHeights.sm,fontSize:j.fontSizes.base-1,tagHeight:n.spacing[5],padding:g.componentPaddingX.xs,gap:n.spacing[1]},md:{height:g.componentHeights.md,fontSize:j.fontSizes.base,tagHeight:n.spacing[6],padding:g.componentPaddingX.sm,gap:n.spacing[1.5]},lg:{height:g.componentHeights.lg,fontSize:j.fontSizes.md,tagHeight:n.spacing[7],padding:g.componentPaddingX.sm,gap:n.spacing[2]}};function pe(){return a.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:a.jsx("path",{d:"M3 3l6 6M9 3l-6 6",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}const N=o.forwardRef(function({value:w,defaultValue:G=[],onChange:T,placeholder:U="Add tags...",size:L="md",maxTags:C,allowDuplicates:M=!1,delimiters:q=["Enter",","],disabled:y=!1,isInvalid:D=!1,readOnly:P=!1,validateTag:E,transformTag:A=m=>m.trim(),suggestions:V,renderTag:B,maxTagsMessage:W=m=>`Maximum ${m} tags allowed`,duplicateMessage:F="Tag already exists","aria-label":Y="Tag input",className:J,testId:Q},z){const[m,Z]=o.useState(G),[p,k]=o.useState(""),[O,X]=o.useState(!1),[$,v]=o.useState(null),[f,c]=o.useState(!1),[S,h]=o.useState(-1),H=o.useRef(null),K=o.useRef(null),r=w!==void 0?w:m,i=ge[L],x=!y&&!P,u=V?.filter(e=>e.label.toLowerCase().includes(p.toLowerCase())&&!r.some(t=>t.id===e.id))||[],d=o.useCallback(e=>{w===void 0&&Z(e),T?.(e)},[w,T]),I=o.useCallback(e=>{const t=A(e);if(!t)return!1;if(C&&r.length>=C)return v(W(C)),!1;if(!M&&r.some(l=>l.label.toLowerCase()===t.toLowerCase()))return v(F),!1;if(E){const l=E(t);if(l!==!0)return v(typeof l=="string"?l:"Invalid tag"),!1}const s={id:`tag-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,label:t};return d([...r,s]),k(""),v(null),!0},[r,C,M,E,A,d,W,F]),R=o.useCallback(e=>{x&&d(r.filter(t=>t.id!==e))},[x,r,d]),_=o.useCallback(e=>{const t=e.target.value;if(t.includes(",")){const s=t.split(",");s.forEach((l,ue)=>{ue<s.length-1&&l.trim()&&I(l)}),k(s[s.length-1])}else k(t);v(null),c(!0),h(-1)},[I]),ee=o.useCallback(e=>{if(x){if(f&&u.length>0){if(e.key==="ArrowDown"){e.preventDefault(),h(t=>Math.min(t+1,u.length-1));return}if(e.key==="ArrowUp"){e.preventDefault(),h(t=>Math.max(t-1,0));return}if((e.key==="Enter"||e.key==="Tab")&&S>=0){e.preventDefault();const t=u[S];t&&(d([...r,t]),k(""),c(!1),h(-1));return}}if(q.includes(e.key)&&p){e.preventDefault(),I(p),c(!1);return}if(e.key==="Backspace"&&!p&&r.length>0){R(r[r.length-1].id);return}e.key==="Escape"&&(c(!1),h(-1))}},[x,f,u,S,q,p,r,I,R,d]);o.useEffect(()=>{if(!f)return;const e=t=>{K.current?.contains(t.target)||c(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f]);const te={position:"relative",width:"100%"},ne={display:"flex",flexWrap:"wrap",alignItems:"center",gap:i.gap,minHeight:i.height,padding:`${n.spacing[1]}px ${i.padding}px`,backgroundColor:y?"var(--brycks-background-muted)":"var(--brycks-background-default)",border:`1px solid ${D||$?"var(--brycks-error-default)":O?"var(--brycks-primary-default)":"var(--brycks-border-default)"}`,borderRadius:"var(--brycks-radius-md)",transition:`all ${b.durations.fast}ms ${b.easings.easeOut}`,cursor:y?"not-allowed":"text",boxShadow:O?"var(--brycks-focus-ring)":void 0},re=e=>({display:"inline-flex",alignItems:"center",gap:n.spacing[1],height:i.tagHeight,padding:`0 ${n.spacing[2]}px`,fontSize:i.fontSize-1,fontWeight:500,color:e.color?"white":"var(--brycks-foreground-default)",backgroundColor:e.color||"var(--brycks-background-muted)",borderRadius:"var(--brycks-radius-full)",whiteSpace:"nowrap"}),oe={display:"flex",alignItems:"center",justifyContent:"center",width:n.spacing[4],height:n.spacing[4],marginLeft:n.spacing[.5],marginRight:-n.spacing[1],color:"inherit",opacity:.7,cursor:"pointer",borderRadius:"var(--brycks-radius-full)",transition:`all ${b.durations.fast}ms ${b.easings.easeOut}`},se={flex:1,minWidth:100,height:i.tagHeight,padding:0,fontSize:i.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:"transparent",border:"none",outline:"none"},ae={position:"absolute",top:"100%",left:0,right:0,marginTop:n.spacing[1],maxHeight:200,overflowY:"auto",backgroundColor:"var(--brycks-background-elevated)",border:"1px solid var(--brycks-border-default)",borderRadius:"var(--brycks-radius-lg)",boxShadow:"var(--brycks-shadow-lg)",zIndex:"var(--brycks-z-dropdown)",padding:n.spacing[1]},ie=e=>({display:"flex",alignItems:"center",gap:g.componentGap.md,padding:`${n.spacing[2]}px ${n.spacing[3]}px`,fontSize:i.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:e?"var(--brycks-background-muted)":"transparent",borderRadius:"var(--brycks-radius-md)",cursor:"pointer",transition:`background-color ${b.durations.fast}ms ${b.easings.easeOut}`}),le={marginTop:n.spacing[1],fontSize:j.fontSizes.sm,color:"var(--brycks-error-default)"},ce=(e,t)=>a.jsxs("span",{style:re(e),children:[e.label,x&&a.jsx("button",{type:"button","aria-label":`Remove ${e.label}`,style:oe,onClick:s=>{s.stopPropagation(),t()},onMouseEnter:s=>{s.currentTarget.style.opacity="1",s.currentTarget.style.backgroundColor="rgba(0,0,0,0.1)"},onMouseLeave:s=>{s.currentTarget.style.opacity="0.7",s.currentTarget.style.backgroundColor="transparent"},children:a.jsx(pe,{})})]},e.id);return a.jsxs("div",{ref:K,className:de.cx("brycks-tag-input",`brycks-tag-input--${L}`,J),style:te,"data-testid":Q,children:[a.jsxs("div",{style:ne,onClick:()=>!y&&H.current?.focus(),children:[r.map(e=>B?B(e,()=>R(e.id)):ce(e,()=>R(e.id))),a.jsx("input",{ref:e=>{H.current=e,typeof z=="function"?z(e):z&&(z.current=e)},type:"text",role:"combobox","aria-label":Y,"aria-expanded":f&&u.length>0,"aria-autocomplete":"list","aria-invalid":D||!!$,value:p,placeholder:r.length===0?U:"",disabled:y,readOnly:P,style:se,onChange:_,onKeyDown:ee,onFocus:()=>{X(!0),c(!0)},onBlur:()=>X(!1)})]}),f&&u.length>0&&a.jsx("ul",{role:"listbox",style:ae,children:u.map((e,t)=>a.jsx("li",{role:"option","aria-selected":t===S,style:ie(t===S),onClick:()=>{d([...r,e]),k(""),c(!1),H.current?.focus()},onMouseEnter:()=>h(t),children:e.label},e.id))}),$&&a.jsx("div",{style:le,children:$})]})});N.displayName="TagInput";exports.TagInput=N;
2
2
  //# sourceMappingURL=TagInput.cjs.map
@@ -1,14 +1,14 @@
1
1
  import { jsxs as H, jsx as s } from "react/jsx-runtime";
2
2
  import { forwardRef as he, useState as p, useRef as q, useCallback as w, useEffect as me } from "react";
3
3
  import { cx as ye } from "../../../utils/styles.js";
4
- import { durations as T, easings as D } from "../../../design-system/tokens/motion.js";
4
+ import { componentPaddingX as T, componentHeights as D, componentGap as be } from "../../../design-system/primitives/sizing.js";
5
+ import { durations as M, easings as A } from "../../../design-system/tokens/motion.js";
5
6
  import { spacing as r } from "../../../design-system/tokens/spacing.js";
6
- import { componentPaddingX as M, componentHeights as A, componentGap as be } from "../../../design-system/primitives/sizing.js";
7
7
  import { fontSizes as R } from "../../../design-system/tokens/typography.js";
8
8
  const ke = {
9
- sm: { height: A.sm, fontSize: R.base - 1, tagHeight: r[5], padding: M.xs, gap: r[1] },
10
- md: { height: A.md, fontSize: R.base, tagHeight: r[6], padding: M.sm, gap: r[1.5] },
11
- lg: { height: A.lg, fontSize: R.md, tagHeight: r[7], padding: M.sm, gap: r[2] }
9
+ sm: { height: D.sm, fontSize: R.base - 1, tagHeight: r[5], padding: T.xs, gap: r[1] },
10
+ md: { height: D.md, fontSize: R.base, tagHeight: r[6], padding: T.sm, gap: r[1.5] },
11
+ lg: { height: D.lg, fontSize: R.md, tagHeight: r[7], padding: T.sm, gap: r[2] }
12
12
  };
13
13
  function ve() {
14
14
  return /* @__PURE__ */ s("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ s("path", { d: "M3 3l6 6M9 3l-6 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) });
@@ -129,7 +129,7 @@ const we = he(function({
129
129
  backgroundColor: h ? "var(--brycks-background-muted)" : "var(--brycks-background-default)",
130
130
  border: `1px solid ${K || $ ? "var(--brycks-error-default)" : V ? "var(--brycks-primary-default)" : "var(--brycks-border-default)"}`,
131
131
  borderRadius: "var(--brycks-radius-md)",
132
- transition: `all ${T.fast}ms ${D.easeOut}`,
132
+ transition: `all ${M.fast}ms ${A.easeOut}`,
133
133
  cursor: h ? "not-allowed" : "text",
134
134
  boxShadow: V ? "var(--brycks-focus-ring)" : void 0
135
135
  }, se = (e) => ({
@@ -156,7 +156,7 @@ const we = he(function({
156
156
  opacity: 0.7,
157
157
  cursor: "pointer",
158
158
  borderRadius: "var(--brycks-radius-full)",
159
- transition: `all ${T.fast}ms ${D.easeOut}`
159
+ transition: `all ${M.fast}ms ${A.easeOut}`
160
160
  }, ce = {
161
161
  flex: 1,
162
162
  minWidth: 100,
@@ -191,7 +191,7 @@ const we = he(function({
191
191
  backgroundColor: e ? "var(--brycks-background-muted)" : "transparent",
192
192
  borderRadius: "var(--brycks-radius-md)",
193
193
  cursor: "pointer",
194
- transition: `background-color ${T.fast}ms ${D.easeOut}`
194
+ transition: `background-color ${M.fast}ms ${A.easeOut}`
195
195
  }), fe = {
196
196
  marginTop: r[1],
197
197
  fontSize: R.sm,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),r=require("react"),J=require("../../../utils/styles.cjs"),K={sm:{fontSize:13,padding:10,lineHeight:1.5},md:{fontSize:14,padding:12,lineHeight:1.5},lg:{fontSize:15,padding:14,lineHeight:1.5}},m=r.forwardRef(function({size:p="md",variant:i="outline",isInvalid:n,autoResize:a,minRows:H=3,maxRows:w=10,showCount:v,maxLength:o,className:z,style:C,testId:j,disabled:c,value:s,defaultValue:l,onChange:T,onFocus:F,onBlur:$,...R},q){const[h,y]=r.useState(!1),[b,x]=r.useState(0),E=r.useRef(null),d=q||E,t=K[p],k=t.fontSize*t.lineHeight,u=k*H+t.padding*2,g=k*w+t.padding*2,S=r.useCallback(()=>{const e=d.current;if(!e||!a)return;e.style.height="auto";const D=e.scrollHeight,G=Math.min(Math.max(D,u),g);e.style.height=`${G}px`},[a,u,g,d]);r.useEffect(()=>{S()},[s,S]),r.useEffect(()=>{const e=String(s??l??"");x(e.length)},[s,l]);const M=()=>{const e={width:"100%",minHeight:u,maxHeight:a?g:void 0,padding:t.padding,fontSize:t.fontSize,lineHeight:t.lineHeight,fontFamily:"var(--brycks-font-sans)",color:"var(--brycks-foreground-default)",backgroundColor:i==="filled"?"var(--brycks-background-muted)":"var(--brycks-background-app)",border:`1px solid ${n?"var(--brycks-error-default)":h?"var(--brycks-border-focus)":i==="filled"?"transparent":"var(--brycks-border-default)"}`,borderRadius:"var(--brycks-radius-default)",outline:"none",resize:a?"none":"vertical",transition:"all 200ms ease-out",boxShadow:h?n?"0 0 0 3px rgba(239, 68, 68, 0.15)":"0 0 0 3px rgba(85, 120, 244, 0.15)":"none"};return c&&(e.opacity=.5,e.cursor="not-allowed",e.resize="none"),e},N={position:"relative",width:"100%"},B={position:"absolute",bottom:8,right:12,fontSize:11,color:b>=(o??1/0)?"var(--brycks-error-default)":"var(--brycks-foreground-muted)",pointerEvents:"none",transition:"color 150ms ease-out"},P=e=>{x(e.target.value.length),T?.(e)},O=e=>{y(!0),F?.(e)},A=e=>{y(!1),$?.(e)};return f.jsxs("div",{className:J.cx("brycks-textarea-wrapper",`brycks-textarea-wrapper--${i}`,`brycks-textarea-wrapper--${p}`,n&&"brycks-textarea-wrapper--invalid",c&&"brycks-textarea-wrapper--disabled",z),style:{...N,...C},children:[f.jsx("textarea",{ref:d,className:"brycks-textarea",style:M(),disabled:c,"aria-invalid":n,"data-testid":j,value:s,defaultValue:l,maxLength:o,onChange:P,onFocus:O,onBlur:A,...R}),v&&f.jsxs("span",{style:B,children:[b,o?`/${o}`:""]})]})});m.displayName="Textarea";exports.Textarea=m;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react/jsx-runtime"),e=require("react"),H=require("../../../utils/styles.cjs"),O={sm:{fontSize:13,padding:10,lineHeight:1.5},md:{fontSize:14,padding:12,lineHeight:1.5},lg:{fontSize:15,padding:14,lineHeight:1.5}},b=e.forwardRef(function({size:x="md",variant:k="outline",isInvalid:u,autoResize:n,minRows:S=3,maxRows:w=10,showCount:C,maxLength:r,className:j,style:T,testId:N,disabled:c,value:i,defaultValue:o,onChange:$,...q},a){const[p,d]=e.useState(0),y=e.useRef(null),v=e.useCallback(t=>{y.current=t,typeof a=="function"?a(t):a&&(a.current=t)},[a]),s=O[x],f=s.fontSize*s.lineHeight,l=f*S+s.padding*2,g=f*w+s.padding*2,m=e.useCallback(()=>{const t=y.current;if(!t||!n)return;t.style.height="auto";const E=t.scrollHeight,P=Math.min(Math.max(E,l),g);t.style.height=`${P}px`},[n,l,g]);e.useEffect(()=>{m()},[i,m]),e.useEffect(()=>{const t=String(i??o??"");d(t.length)},[i,o]);const z={minHeight:l,maxHeight:n?g:void 0,resize:c||n?"none":"vertical"},M=t=>{d(t.target.value.length),$?.(t)},R=p>=(r??1/0);return h.jsxs("div",{className:H.cx("brycks-textarea-wrapper",`brycks-textarea-wrapper--${k}`,`brycks-textarea-wrapper--${x}`,u&&"brycks-textarea-wrapper--invalid",c&&"brycks-textarea-wrapper--disabled",j),style:T,children:[h.jsx("textarea",{ref:v,className:"brycks-textarea",style:z,disabled:c,"aria-invalid":u,"data-testid":N,value:i,defaultValue:o,maxLength:r,onChange:M,...q}),C&&h.jsxs("span",{className:H.cx("brycks-textarea-count",R&&"brycks-textarea-count--limit"),children:[p,r?`/${r}`:""]})]})});b.displayName="Textarea";exports.Textarea=b;
2
2
  //# sourceMappingURL=Textarea.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.cjs","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\r\n * Textarea Component\r\n *\r\n * Multi-line text input with Apple-inspired styling.\r\n * Supports auto-resize and character counting.\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n type CSSProperties,\r\n type TextareaHTMLAttributes,\r\n} from 'react'\r\nimport { cx } from '../../../utils/styles'\r\n\r\nexport type TextareaSize = 'sm' | 'md' | 'lg'\r\nexport type TextareaVariant = 'outline' | 'filled'\r\n\r\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\r\n /** Textarea size */\r\n size?: TextareaSize\r\n /** Visual variant */\r\n variant?: TextareaVariant\r\n /** Error state */\r\n isInvalid?: boolean\r\n /** Auto resize based on content */\r\n autoResize?: boolean\r\n /** Minimum rows */\r\n minRows?: number\r\n /** Maximum rows */\r\n maxRows?: number\r\n /** Show character count */\r\n showCount?: boolean\r\n /** Max character length */\r\n maxLength?: number\r\n /** Custom class name */\r\n className?: string\r\n /** Test ID */\r\n testId?: string\r\n}\r\n\r\nconst sizeStyles: Record<TextareaSize, { fontSize: number; padding: number; lineHeight: number }> = {\r\n sm: { fontSize: 13, padding: 10, lineHeight: 1.5 },\r\n md: { fontSize: 14, padding: 12, lineHeight: 1.5 },\r\n lg: { fontSize: 15, padding: 14, lineHeight: 1.5 },\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\r\n {\r\n size = 'md',\r\n variant = 'outline',\r\n isInvalid,\r\n autoResize,\r\n minRows = 3,\r\n maxRows = 10,\r\n showCount,\r\n maxLength,\r\n className,\r\n style,\r\n testId,\r\n disabled,\r\n value,\r\n defaultValue,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n ...props\r\n },\r\n ref\r\n) {\r\n const [isFocused, setIsFocused] = useState(false)\r\n const [charCount, setCharCount] = useState(0)\r\n const internalRef = useRef<HTMLTextAreaElement>(null)\r\n const textareaRef = (ref as React.RefObject<HTMLTextAreaElement>) || internalRef\r\n\r\n const sizeValue = sizeStyles[size]\r\n const lineHeightPx = sizeValue.fontSize * sizeValue.lineHeight\r\n const minHeight = lineHeightPx * minRows + sizeValue.padding * 2\r\n const maxHeight = lineHeightPx * maxRows + sizeValue.padding * 2\r\n\r\n const adjustHeight = useCallback(() => {\r\n const textarea = textareaRef.current\r\n if (!textarea || !autoResize) return\r\n\r\n textarea.style.height = 'auto'\r\n const scrollHeight = textarea.scrollHeight\r\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight)\r\n textarea.style.height = `${newHeight}px`\r\n }, [autoResize, minHeight, maxHeight, textareaRef])\r\n\r\n useEffect(() => {\r\n adjustHeight()\r\n }, [value, adjustHeight])\r\n\r\n useEffect(() => {\r\n const initialValue = String(value ?? defaultValue ?? '')\r\n setCharCount(initialValue.length)\r\n }, [value, defaultValue])\r\n\r\n const getTextareaStyle = (): CSSProperties => {\r\n const base: CSSProperties = {\r\n width: '100%',\r\n minHeight,\r\n maxHeight: autoResize ? maxHeight : undefined,\r\n padding: sizeValue.padding,\r\n fontSize: sizeValue.fontSize,\r\n lineHeight: sizeValue.lineHeight,\r\n fontFamily: 'var(--brycks-font-sans)',\r\n color: 'var(--brycks-foreground-default)',\r\n backgroundColor: variant === 'filled' ? 'var(--brycks-background-muted)' : 'var(--brycks-background-app)',\r\n border: `1px solid ${\r\n isInvalid\r\n ? 'var(--brycks-error-default)'\r\n : isFocused\r\n ? 'var(--brycks-border-focus)'\r\n : variant === 'filled'\r\n ? 'transparent'\r\n : 'var(--brycks-border-default)'\r\n }`,\r\n borderRadius: 'var(--brycks-radius-default)',\r\n outline: 'none',\r\n resize: autoResize ? 'none' : 'vertical',\r\n transition: 'all 200ms ease-out',\r\n boxShadow: isFocused\r\n ? isInvalid\r\n ? '0 0 0 3px rgba(239, 68, 68, 0.15)'\r\n : '0 0 0 3px rgba(85, 120, 244, 0.15)'\r\n : 'none',\r\n }\r\n\r\n if (disabled) {\r\n base.opacity = 0.5\r\n base.cursor = 'not-allowed'\r\n base.resize = 'none'\r\n }\r\n\r\n return base\r\n }\r\n\r\n const wrapperStyle: CSSProperties = {\r\n position: 'relative',\r\n width: '100%',\r\n }\r\n\r\n const countStyle: CSSProperties = {\r\n position: 'absolute',\r\n bottom: 8,\r\n right: 12,\r\n fontSize: 11,\r\n color: charCount >= (maxLength ?? Infinity)\r\n ? 'var(--brycks-error-default)'\r\n : 'var(--brycks-foreground-muted)',\r\n pointerEvents: 'none',\r\n transition: 'color 150ms ease-out',\r\n }\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n setCharCount(e.target.value.length)\r\n onChange?.(e)\r\n }\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\r\n setIsFocused(true)\r\n onFocus?.(e)\r\n }\r\n\r\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\r\n setIsFocused(false)\r\n onBlur?.(e)\r\n }\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'brycks-textarea-wrapper',\r\n `brycks-textarea-wrapper--${variant}`,\r\n `brycks-textarea-wrapper--${size}`,\r\n isInvalid && 'brycks-textarea-wrapper--invalid',\r\n disabled && 'brycks-textarea-wrapper--disabled',\r\n className\r\n )}\r\n style={{ ...wrapperStyle, ...style }}\r\n >\r\n <textarea\r\n ref={textareaRef}\r\n className=\"brycks-textarea\"\r\n style={getTextareaStyle()}\r\n disabled={disabled}\r\n aria-invalid={isInvalid}\r\n data-testid={testId}\r\n value={value}\r\n defaultValue={defaultValue}\r\n maxLength={maxLength}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n {...props}\r\n />\r\n\r\n {showCount && (\r\n <span style={countStyle}>\r\n {charCount}{maxLength ? `/${maxLength}` : ''}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n})\r\n\r\nTextarea.displayName = 'Textarea'\r\n"],"names":["sizeStyles","Textarea","forwardRef","size","variant","isInvalid","autoResize","minRows","maxRows","showCount","maxLength","className","style","testId","disabled","value","defaultValue","onChange","onFocus","onBlur","props","ref","isFocused","setIsFocused","useState","charCount","setCharCount","internalRef","useRef","textareaRef","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","useCallback","textarea","scrollHeight","newHeight","useEffect","initialValue","getTextareaStyle","base","wrapperStyle","countStyle","handleChange","handleFocus","handleBlur","jsxs","cx","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Textarea.cjs","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\n * Textarea Component\n *\n * Multi-line text input with Apple-inspired styling.\n * Supports auto-resize and character counting.\n */\n\nimport {\n forwardRef,\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type TextareaHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TextareaSize = 'sm' | 'md' | 'lg'\nexport type TextareaVariant = 'outline' | 'filled'\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** Textarea size */\n size?: TextareaSize\n /** Visual variant */\n variant?: TextareaVariant\n /** Error state */\n isInvalid?: boolean\n /** Auto resize based on content */\n autoResize?: boolean\n /** Minimum rows */\n minRows?: number\n /** Maximum rows */\n maxRows?: number\n /** Show character count */\n showCount?: boolean\n /** Max character length */\n maxLength?: number\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeStyles: Record<TextareaSize, { fontSize: number; padding: number; lineHeight: number }> = {\n sm: { fontSize: 13, padding: 10, lineHeight: 1.5 },\n md: { fontSize: 14, padding: 12, lineHeight: 1.5 },\n lg: { fontSize: 15, padding: 14, lineHeight: 1.5 },\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n size = 'md',\n variant = 'outline',\n isInvalid,\n autoResize,\n minRows = 3,\n maxRows = 10,\n showCount,\n maxLength,\n className,\n style,\n testId,\n disabled,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref\n) {\n const [charCount, setCharCount] = useState(0)\n const internalRef = useRef<HTMLTextAreaElement>(null)\n // Merge the forwarded ref (object OR callback) with our internal ref. The old\n // `(ref as RefObject) || internalRef` broke with callback refs: a function ref\n // is truthy, so `.current` was undefined and autoResize silently stopped.\n const setTextareaRef = useCallback(\n (node: HTMLTextAreaElement | null) => {\n internalRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n },\n [ref]\n )\n\n const sizeValue = sizeStyles[size]\n const lineHeightPx = sizeValue.fontSize * sizeValue.lineHeight\n const minHeight = lineHeightPx * minRows + sizeValue.padding * 2\n const maxHeight = lineHeightPx * maxRows + sizeValue.padding * 2\n\n const adjustHeight = useCallback(() => {\n const textarea = internalRef.current\n if (!textarea || !autoResize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight)\n textarea.style.height = `${newHeight}px`\n }, [autoResize, minHeight, maxHeight])\n\n useEffect(() => {\n adjustHeight()\n }, [value, adjustHeight])\n\n useEffect(() => {\n const initialValue = String(value ?? defaultValue ?? '')\n setCharCount(initialValue.length)\n }, [value, defaultValue])\n\n // Only the computed min/max height (derived from rows + font metrics) and the\n // resize mode are dynamic; the rest of the visual styling lives in CSS.\n const textareaStyle: CSSProperties = {\n minHeight,\n maxHeight: autoResize ? maxHeight : undefined,\n resize: disabled || autoResize ? 'none' : 'vertical',\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length)\n onChange?.(e)\n }\n\n const atLimit = charCount >= (maxLength ?? Infinity)\n\n return (\n <div\n className={cx(\n 'brycks-textarea-wrapper',\n `brycks-textarea-wrapper--${variant}`,\n `brycks-textarea-wrapper--${size}`,\n isInvalid && 'brycks-textarea-wrapper--invalid',\n disabled && 'brycks-textarea-wrapper--disabled',\n className\n )}\n style={style}\n >\n <textarea\n ref={setTextareaRef}\n className=\"brycks-textarea\"\n style={textareaStyle}\n disabled={disabled}\n aria-invalid={isInvalid}\n data-testid={testId}\n value={value}\n defaultValue={defaultValue}\n maxLength={maxLength}\n onChange={handleChange}\n {...props}\n />\n\n {showCount && (\n <span className={cx('brycks-textarea-count', atLimit && 'brycks-textarea-count--limit')}>\n {charCount}{maxLength ? `/${maxLength}` : ''}\n </span>\n )}\n </div>\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"names":["sizeStyles","Textarea","forwardRef","size","variant","isInvalid","autoResize","minRows","maxRows","showCount","maxLength","className","style","testId","disabled","value","defaultValue","onChange","props","ref","charCount","setCharCount","useState","internalRef","useRef","setTextareaRef","useCallback","node","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","textarea","scrollHeight","newHeight","useEffect","initialValue","textareaStyle","handleChange","e","atLimit","jsxs","cx","jsx"],"mappings":"+KA4CMA,EAA8F,CAClG,GAAI,CAAE,SAAU,GAAI,QAAS,GAAI,WAAY,GAAA,EAC7C,GAAI,CAAE,SAAU,GAAI,QAAS,GAAI,WAAY,GAAA,EAC7C,GAAI,CAAE,SAAU,GAAI,QAAS,GAAI,WAAY,GAAA,CAC/C,EAEaC,EAAWC,EAAAA,WAA+C,SACrE,CACE,KAAAC,EAAO,KACP,QAAAC,EAAU,UACV,UAAAC,EACA,WAAAC,EACA,QAAAC,EAAU,EACV,QAAAC,EAAU,GACV,UAAAC,EACA,UAAAC,EACA,UAAAC,EACA,MAAAC,EACA,OAAAC,EACA,SAAAC,EACA,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,CAAC,EACtCC,EAAcC,EAAAA,OAA4B,IAAI,EAI9CC,EAAiBC,EAAAA,YACpBC,GAAqC,CACpCJ,EAAY,QAAUI,EAClB,OAAOR,GAAQ,WAAYA,EAAIQ,CAAI,EAC9BR,IAAMA,EAA2D,QAAUQ,EACtF,EACA,CAACR,CAAG,CAAA,EAGAS,EAAY5B,EAAWG,CAAI,EAC3B0B,EAAeD,EAAU,SAAWA,EAAU,WAC9CE,EAAYD,EAAetB,EAAUqB,EAAU,QAAU,EACzDG,EAAYF,EAAerB,EAAUoB,EAAU,QAAU,EAEzDI,EAAeN,EAAAA,YAAY,IAAM,CACrC,MAAMO,EAAWV,EAAY,QAC7B,GAAI,CAACU,GAAY,CAAC3B,EAAY,OAE9B2B,EAAS,MAAM,OAAS,OACxB,MAAMC,EAAeD,EAAS,aACxBE,EAAY,KAAK,IAAI,KAAK,IAAID,EAAcJ,CAAS,EAAGC,CAAS,EACvEE,EAAS,MAAM,OAAS,GAAGE,CAAS,IACtC,EAAG,CAAC7B,EAAYwB,EAAWC,CAAS,CAAC,EAErCK,EAAAA,UAAU,IAAM,CACdJ,EAAA,CACF,EAAG,CAACjB,EAAOiB,CAAY,CAAC,EAExBI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAe,OAAOtB,GAASC,GAAgB,EAAE,EACvDK,EAAagB,EAAa,MAAM,CAClC,EAAG,CAACtB,EAAOC,CAAY,CAAC,EAIxB,MAAMsB,EAA+B,CACnC,UAAAR,EACA,UAAWxB,EAAayB,EAAY,OACpC,OAAQjB,GAAYR,EAAa,OAAS,UAAA,EAGtCiC,EAAgBC,GAA8C,CAClEnB,EAAamB,EAAE,OAAO,MAAM,MAAM,EAClCvB,IAAWuB,CAAC,CACd,EAEMC,EAAUrB,IAAcV,GAAa,KAE3C,OACEgC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,0BACA,4BAA4BvC,CAAO,GACnC,4BAA4BD,CAAI,GAChCE,GAAa,mCACbS,GAAY,oCACZH,CAAA,EAEF,MAAAC,EAEA,SAAA,CAAAgC,EAAAA,IAAC,WAAA,CACC,IAAKnB,EACL,UAAU,kBACV,MAAOa,EACP,SAAAxB,EACA,eAAcT,EACd,cAAaQ,EACb,MAAAE,EACA,aAAAC,EACA,UAAAN,EACA,SAAU6B,EACT,GAAGrB,CAAA,CAAA,EAGLT,UACE,OAAA,CAAK,UAAWkC,KAAG,wBAAyBF,GAAW,8BAA8B,EACnF,SAAA,CAAArB,EAAWV,EAAY,IAAIA,CAAS,GAAK,EAAA,CAAA,CAC5C,CAAA,CAAA,CAAA,CAIR,CAAC,EAEDT,EAAS,YAAc"}
@@ -1,121 +1,92 @@
1
- import { jsxs as k, jsx as K } from "react/jsx-runtime";
2
- import { forwardRef as O, useState as m, useRef as Q, useCallback as U, useEffect as H } from "react";
3
- import { cx as V } from "../../../utils/styles.js";
4
- const W = {
1
+ import { jsxs as y, jsx as A } from "react/jsx-runtime";
2
+ import { forwardRef as B, useState as D, useRef as F, useCallback as u, useEffect as H } from "react";
3
+ import { cx as k } from "../../../utils/styles.js";
4
+ const G = {
5
5
  sm: { fontSize: 13, padding: 10, lineHeight: 1.5 },
6
6
  md: { fontSize: 14, padding: 12, lineHeight: 1.5 },
7
7
  lg: { fontSize: 15, padding: 14, lineHeight: 1.5 }
8
- }, X = O(function({
9
- size: p = "md",
10
- variant: s = "outline",
11
- isInvalid: r,
12
- autoResize: n,
8
+ }, I = B(function({
9
+ size: h = "md",
10
+ variant: b = "outline",
11
+ isInvalid: g,
12
+ autoResize: a,
13
13
  minRows: S = 3,
14
14
  maxRows: w = 10,
15
- showCount: v,
16
- maxLength: o,
17
- className: z,
18
- style: C,
19
- testId: F,
20
- disabled: i,
21
- value: a,
15
+ showCount: C,
16
+ maxLength: n,
17
+ className: N,
18
+ style: T,
19
+ testId: $,
20
+ disabled: s,
21
+ value: r,
22
22
  defaultValue: c,
23
- onChange: $,
24
- onFocus: T,
25
- onBlur: j,
26
- ...N
27
- }, B) {
28
- const [u, f] = m(!1), [h, b] = m(0), E = Q(null), l = B || E, t = W[p], y = t.fontSize * t.lineHeight, d = y * S + t.padding * 2, g = y * w + t.padding * 2, x = U(() => {
29
- const e = l.current;
30
- if (!e || !n) return;
31
- e.style.height = "auto";
32
- const G = e.scrollHeight, J = Math.min(Math.max(G, d), g);
33
- e.style.height = `${J}px`;
34
- }, [n, d, g, l]);
23
+ onChange: j,
24
+ ...z
25
+ }, e) {
26
+ const [p, x] = D(0), d = F(null), v = u(
27
+ (t) => {
28
+ d.current = t, typeof e == "function" ? e(t) : e && (e.current = t);
29
+ },
30
+ [e]
31
+ ), i = G[h], m = i.fontSize * i.lineHeight, o = m * S + i.padding * 2, l = m * w + i.padding * 2, f = u(() => {
32
+ const t = d.current;
33
+ if (!t || !a) return;
34
+ t.style.height = "auto";
35
+ const R = t.scrollHeight, q = Math.min(Math.max(R, o), l);
36
+ t.style.height = `${q}px`;
37
+ }, [a, o, l]);
35
38
  H(() => {
36
- x();
37
- }, [a, x]), H(() => {
38
- const e = String(a ?? c ?? "");
39
- b(e.length);
40
- }, [a, c]);
41
- const M = () => {
42
- const e = {
43
- width: "100%",
44
- minHeight: d,
45
- maxHeight: n ? g : void 0,
46
- padding: t.padding,
47
- fontSize: t.fontSize,
48
- lineHeight: t.lineHeight,
49
- fontFamily: "var(--brycks-font-sans)",
50
- color: "var(--brycks-foreground-default)",
51
- backgroundColor: s === "filled" ? "var(--brycks-background-muted)" : "var(--brycks-background-app)",
52
- border: `1px solid ${r ? "var(--brycks-error-default)" : u ? "var(--brycks-border-focus)" : s === "filled" ? "transparent" : "var(--brycks-border-default)"}`,
53
- borderRadius: "var(--brycks-radius-default)",
54
- outline: "none",
55
- resize: n ? "none" : "vertical",
56
- transition: "all 200ms ease-out",
57
- boxShadow: u ? r ? "0 0 0 3px rgba(239, 68, 68, 0.15)" : "0 0 0 3px rgba(85, 120, 244, 0.15)" : "none"
58
- };
59
- return i && (e.opacity = 0.5, e.cursor = "not-allowed", e.resize = "none"), e;
60
- }, R = {
61
- position: "relative",
62
- width: "100%"
63
- }, P = {
64
- position: "absolute",
65
- bottom: 8,
66
- right: 12,
67
- fontSize: 11,
68
- color: h >= (o ?? 1 / 0) ? "var(--brycks-error-default)" : "var(--brycks-foreground-muted)",
69
- pointerEvents: "none",
70
- transition: "color 150ms ease-out"
71
- }, q = (e) => {
72
- b(e.target.value.length), $?.(e);
73
- }, A = (e) => {
74
- f(!0), T?.(e);
75
- }, D = (e) => {
76
- f(!1), j?.(e);
77
- };
78
- return /* @__PURE__ */ k(
39
+ f();
40
+ }, [r, f]), H(() => {
41
+ const t = String(r ?? c ?? "");
42
+ x(t.length);
43
+ }, [r, c]);
44
+ const M = {
45
+ minHeight: o,
46
+ maxHeight: a ? l : void 0,
47
+ resize: s || a ? "none" : "vertical"
48
+ }, E = (t) => {
49
+ x(t.target.value.length), j?.(t);
50
+ }, P = p >= (n ?? 1 / 0);
51
+ return /* @__PURE__ */ y(
79
52
  "div",
80
53
  {
81
- className: V(
54
+ className: k(
82
55
  "brycks-textarea-wrapper",
83
- `brycks-textarea-wrapper--${s}`,
84
- `brycks-textarea-wrapper--${p}`,
85
- r && "brycks-textarea-wrapper--invalid",
86
- i && "brycks-textarea-wrapper--disabled",
87
- z
56
+ `brycks-textarea-wrapper--${b}`,
57
+ `brycks-textarea-wrapper--${h}`,
58
+ g && "brycks-textarea-wrapper--invalid",
59
+ s && "brycks-textarea-wrapper--disabled",
60
+ N
88
61
  ),
89
- style: { ...R, ...C },
62
+ style: T,
90
63
  children: [
91
- /* @__PURE__ */ K(
64
+ /* @__PURE__ */ A(
92
65
  "textarea",
93
66
  {
94
- ref: l,
67
+ ref: v,
95
68
  className: "brycks-textarea",
96
- style: M(),
97
- disabled: i,
98
- "aria-invalid": r,
99
- "data-testid": F,
100
- value: a,
69
+ style: M,
70
+ disabled: s,
71
+ "aria-invalid": g,
72
+ "data-testid": $,
73
+ value: r,
101
74
  defaultValue: c,
102
- maxLength: o,
103
- onChange: q,
104
- onFocus: A,
105
- onBlur: D,
106
- ...N
75
+ maxLength: n,
76
+ onChange: E,
77
+ ...z
107
78
  }
108
79
  ),
109
- v && /* @__PURE__ */ k("span", { style: P, children: [
110
- h,
111
- o ? `/${o}` : ""
80
+ C && /* @__PURE__ */ y("span", { className: k("brycks-textarea-count", P && "brycks-textarea-count--limit"), children: [
81
+ p,
82
+ n ? `/${n}` : ""
112
83
  ] })
113
84
  ]
114
85
  }
115
86
  );
116
87
  });
117
- X.displayName = "Textarea";
88
+ I.displayName = "Textarea";
118
89
  export {
119
- X as Textarea
90
+ I as Textarea
120
91
  };
121
92
  //# sourceMappingURL=Textarea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\r\n * Textarea Component\r\n *\r\n * Multi-line text input with Apple-inspired styling.\r\n * Supports auto-resize and character counting.\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n useState,\r\n useEffect,\r\n useRef,\r\n useCallback,\r\n type CSSProperties,\r\n type TextareaHTMLAttributes,\r\n} from 'react'\r\nimport { cx } from '../../../utils/styles'\r\n\r\nexport type TextareaSize = 'sm' | 'md' | 'lg'\r\nexport type TextareaVariant = 'outline' | 'filled'\r\n\r\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\r\n /** Textarea size */\r\n size?: TextareaSize\r\n /** Visual variant */\r\n variant?: TextareaVariant\r\n /** Error state */\r\n isInvalid?: boolean\r\n /** Auto resize based on content */\r\n autoResize?: boolean\r\n /** Minimum rows */\r\n minRows?: number\r\n /** Maximum rows */\r\n maxRows?: number\r\n /** Show character count */\r\n showCount?: boolean\r\n /** Max character length */\r\n maxLength?: number\r\n /** Custom class name */\r\n className?: string\r\n /** Test ID */\r\n testId?: string\r\n}\r\n\r\nconst sizeStyles: Record<TextareaSize, { fontSize: number; padding: number; lineHeight: number }> = {\r\n sm: { fontSize: 13, padding: 10, lineHeight: 1.5 },\r\n md: { fontSize: 14, padding: 12, lineHeight: 1.5 },\r\n lg: { fontSize: 15, padding: 14, lineHeight: 1.5 },\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\r\n {\r\n size = 'md',\r\n variant = 'outline',\r\n isInvalid,\r\n autoResize,\r\n minRows = 3,\r\n maxRows = 10,\r\n showCount,\r\n maxLength,\r\n className,\r\n style,\r\n testId,\r\n disabled,\r\n value,\r\n defaultValue,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n ...props\r\n },\r\n ref\r\n) {\r\n const [isFocused, setIsFocused] = useState(false)\r\n const [charCount, setCharCount] = useState(0)\r\n const internalRef = useRef<HTMLTextAreaElement>(null)\r\n const textareaRef = (ref as React.RefObject<HTMLTextAreaElement>) || internalRef\r\n\r\n const sizeValue = sizeStyles[size]\r\n const lineHeightPx = sizeValue.fontSize * sizeValue.lineHeight\r\n const minHeight = lineHeightPx * minRows + sizeValue.padding * 2\r\n const maxHeight = lineHeightPx * maxRows + sizeValue.padding * 2\r\n\r\n const adjustHeight = useCallback(() => {\r\n const textarea = textareaRef.current\r\n if (!textarea || !autoResize) return\r\n\r\n textarea.style.height = 'auto'\r\n const scrollHeight = textarea.scrollHeight\r\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight)\r\n textarea.style.height = `${newHeight}px`\r\n }, [autoResize, minHeight, maxHeight, textareaRef])\r\n\r\n useEffect(() => {\r\n adjustHeight()\r\n }, [value, adjustHeight])\r\n\r\n useEffect(() => {\r\n const initialValue = String(value ?? defaultValue ?? '')\r\n setCharCount(initialValue.length)\r\n }, [value, defaultValue])\r\n\r\n const getTextareaStyle = (): CSSProperties => {\r\n const base: CSSProperties = {\r\n width: '100%',\r\n minHeight,\r\n maxHeight: autoResize ? maxHeight : undefined,\r\n padding: sizeValue.padding,\r\n fontSize: sizeValue.fontSize,\r\n lineHeight: sizeValue.lineHeight,\r\n fontFamily: 'var(--brycks-font-sans)',\r\n color: 'var(--brycks-foreground-default)',\r\n backgroundColor: variant === 'filled' ? 'var(--brycks-background-muted)' : 'var(--brycks-background-app)',\r\n border: `1px solid ${\r\n isInvalid\r\n ? 'var(--brycks-error-default)'\r\n : isFocused\r\n ? 'var(--brycks-border-focus)'\r\n : variant === 'filled'\r\n ? 'transparent'\r\n : 'var(--brycks-border-default)'\r\n }`,\r\n borderRadius: 'var(--brycks-radius-default)',\r\n outline: 'none',\r\n resize: autoResize ? 'none' : 'vertical',\r\n transition: 'all 200ms ease-out',\r\n boxShadow: isFocused\r\n ? isInvalid\r\n ? '0 0 0 3px rgba(239, 68, 68, 0.15)'\r\n : '0 0 0 3px rgba(85, 120, 244, 0.15)'\r\n : 'none',\r\n }\r\n\r\n if (disabled) {\r\n base.opacity = 0.5\r\n base.cursor = 'not-allowed'\r\n base.resize = 'none'\r\n }\r\n\r\n return base\r\n }\r\n\r\n const wrapperStyle: CSSProperties = {\r\n position: 'relative',\r\n width: '100%',\r\n }\r\n\r\n const countStyle: CSSProperties = {\r\n position: 'absolute',\r\n bottom: 8,\r\n right: 12,\r\n fontSize: 11,\r\n color: charCount >= (maxLength ?? Infinity)\r\n ? 'var(--brycks-error-default)'\r\n : 'var(--brycks-foreground-muted)',\r\n pointerEvents: 'none',\r\n transition: 'color 150ms ease-out',\r\n }\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n setCharCount(e.target.value.length)\r\n onChange?.(e)\r\n }\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\r\n setIsFocused(true)\r\n onFocus?.(e)\r\n }\r\n\r\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\r\n setIsFocused(false)\r\n onBlur?.(e)\r\n }\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'brycks-textarea-wrapper',\r\n `brycks-textarea-wrapper--${variant}`,\r\n `brycks-textarea-wrapper--${size}`,\r\n isInvalid && 'brycks-textarea-wrapper--invalid',\r\n disabled && 'brycks-textarea-wrapper--disabled',\r\n className\r\n )}\r\n style={{ ...wrapperStyle, ...style }}\r\n >\r\n <textarea\r\n ref={textareaRef}\r\n className=\"brycks-textarea\"\r\n style={getTextareaStyle()}\r\n disabled={disabled}\r\n aria-invalid={isInvalid}\r\n data-testid={testId}\r\n value={value}\r\n defaultValue={defaultValue}\r\n maxLength={maxLength}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n {...props}\r\n />\r\n\r\n {showCount && (\r\n <span style={countStyle}>\r\n {charCount}{maxLength ? `/${maxLength}` : ''}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n})\r\n\r\nTextarea.displayName = 'Textarea'\r\n"],"names":["sizeStyles","Textarea","forwardRef","size","variant","isInvalid","autoResize","minRows","maxRows","showCount","maxLength","className","style","testId","disabled","value","defaultValue","onChange","onFocus","onBlur","props","ref","isFocused","setIsFocused","useState","charCount","setCharCount","internalRef","useRef","textareaRef","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","useCallback","textarea","scrollHeight","newHeight","useEffect","initialValue","getTextareaStyle","base","wrapperStyle","countStyle","handleChange","handleFocus","handleBlur","jsxs","cx","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Textarea.js","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\n * Textarea Component\n *\n * Multi-line text input with Apple-inspired styling.\n * Supports auto-resize and character counting.\n */\n\nimport {\n forwardRef,\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type TextareaHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TextareaSize = 'sm' | 'md' | 'lg'\nexport type TextareaVariant = 'outline' | 'filled'\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** Textarea size */\n size?: TextareaSize\n /** Visual variant */\n variant?: TextareaVariant\n /** Error state */\n isInvalid?: boolean\n /** Auto resize based on content */\n autoResize?: boolean\n /** Minimum rows */\n minRows?: number\n /** Maximum rows */\n maxRows?: number\n /** Show character count */\n showCount?: boolean\n /** Max character length */\n maxLength?: number\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeStyles: Record<TextareaSize, { fontSize: number; padding: number; lineHeight: number }> = {\n sm: { fontSize: 13, padding: 10, lineHeight: 1.5 },\n md: { fontSize: 14, padding: 12, lineHeight: 1.5 },\n lg: { fontSize: 15, padding: 14, lineHeight: 1.5 },\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n size = 'md',\n variant = 'outline',\n isInvalid,\n autoResize,\n minRows = 3,\n maxRows = 10,\n showCount,\n maxLength,\n className,\n style,\n testId,\n disabled,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref\n) {\n const [charCount, setCharCount] = useState(0)\n const internalRef = useRef<HTMLTextAreaElement>(null)\n // Merge the forwarded ref (object OR callback) with our internal ref. The old\n // `(ref as RefObject) || internalRef` broke with callback refs: a function ref\n // is truthy, so `.current` was undefined and autoResize silently stopped.\n const setTextareaRef = useCallback(\n (node: HTMLTextAreaElement | null) => {\n internalRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n },\n [ref]\n )\n\n const sizeValue = sizeStyles[size]\n const lineHeightPx = sizeValue.fontSize * sizeValue.lineHeight\n const minHeight = lineHeightPx * minRows + sizeValue.padding * 2\n const maxHeight = lineHeightPx * maxRows + sizeValue.padding * 2\n\n const adjustHeight = useCallback(() => {\n const textarea = internalRef.current\n if (!textarea || !autoResize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight)\n textarea.style.height = `${newHeight}px`\n }, [autoResize, minHeight, maxHeight])\n\n useEffect(() => {\n adjustHeight()\n }, [value, adjustHeight])\n\n useEffect(() => {\n const initialValue = String(value ?? defaultValue ?? '')\n setCharCount(initialValue.length)\n }, [value, defaultValue])\n\n // Only the computed min/max height (derived from rows + font metrics) and the\n // resize mode are dynamic; the rest of the visual styling lives in CSS.\n const textareaStyle: CSSProperties = {\n minHeight,\n maxHeight: autoResize ? maxHeight : undefined,\n resize: disabled || autoResize ? 'none' : 'vertical',\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length)\n onChange?.(e)\n }\n\n const atLimit = charCount >= (maxLength ?? Infinity)\n\n return (\n <div\n className={cx(\n 'brycks-textarea-wrapper',\n `brycks-textarea-wrapper--${variant}`,\n `brycks-textarea-wrapper--${size}`,\n isInvalid && 'brycks-textarea-wrapper--invalid',\n disabled && 'brycks-textarea-wrapper--disabled',\n className\n )}\n style={style}\n >\n <textarea\n ref={setTextareaRef}\n className=\"brycks-textarea\"\n style={textareaStyle}\n disabled={disabled}\n aria-invalid={isInvalid}\n data-testid={testId}\n value={value}\n defaultValue={defaultValue}\n maxLength={maxLength}\n onChange={handleChange}\n {...props}\n />\n\n {showCount && (\n <span className={cx('brycks-textarea-count', atLimit && 'brycks-textarea-count--limit')}>\n {charCount}{maxLength ? `/${maxLength}` : ''}\n </span>\n )}\n </div>\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"names":["sizeStyles","Textarea","forwardRef","size","variant","isInvalid","autoResize","minRows","maxRows","showCount","maxLength","className","style","testId","disabled","value","defaultValue","onChange","props","ref","charCount","setCharCount","useState","internalRef","useRef","setTextareaRef","useCallback","node","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","textarea","scrollHeight","newHeight","useEffect","initialValue","textareaStyle","handleChange","e","atLimit","jsxs","cx","jsx"],"mappings":"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"}