@brycks/core-front 0.5.0 → 0.6.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.
- package/dist/components/data/List/List.cjs +1 -1
- package/dist/components/data/List/List.cjs.map +1 -1
- package/dist/components/data/List/List.js +68 -148
- package/dist/components/data/List/List.js.map +1 -1
- package/dist/components/data/Table/Table.cjs +1 -1
- package/dist/components/data/Table/Table.cjs.map +1 -1
- package/dist/components/data/Table/Table.js +142 -224
- package/dist/components/data/Table/Table.js.map +1 -1
- package/dist/components/data/TreeView/TreeView.cjs +1 -1
- package/dist/components/data/TreeView/TreeView.cjs.map +1 -1
- package/dist/components/data/TreeView/TreeView.js +141 -182
- package/dist/components/data/TreeView/TreeView.js.map +1 -1
- package/dist/components/feedback/Drawer/Drawer.cjs +1 -22
- package/dist/components/feedback/Drawer/Drawer.cjs.map +1 -1
- package/dist/components/feedback/Drawer/Drawer.js +84 -184
- package/dist/components/feedback/Drawer/Drawer.js.map +1 -1
- package/dist/components/feedback/Modal/Modal.cjs +1 -1
- package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
- package/dist/components/feedback/Modal/Modal.js +65 -150
- package/dist/components/feedback/Modal/Modal.js.map +1 -1
- package/dist/components/feedback/Toast/Toast.cjs +1 -10
- package/dist/components/feedback/Toast/Toast.cjs.map +1 -1
- package/dist/components/feedback/Toast/Toast.js +94 -187
- package/dist/components/feedback/Toast/Toast.js.map +1 -1
- package/dist/components/form/Checkbox/Checkbox.cjs +1 -1
- package/dist/components/form/Checkbox/Checkbox.js +11 -11
- package/dist/components/form/Combobox/Combobox.cjs +1 -6
- package/dist/components/form/Combobox/Combobox.cjs.map +1 -1
- package/dist/components/form/Combobox/Combobox.js +187 -283
- package/dist/components/form/Combobox/Combobox.js.map +1 -1
- package/dist/components/form/Input/Input.cjs +1 -1
- package/dist/components/form/Input/Input.cjs.map +1 -1
- package/dist/components/form/Input/Input.js +38 -133
- package/dist/components/form/Input/Input.js.map +1 -1
- package/dist/components/form/Select/Select.cjs +1 -1
- package/dist/components/form/Select/Select.cjs.map +1 -1
- package/dist/components/form/Select/Select.js +36 -82
- package/dist/components/form/Select/Select.js.map +1 -1
- package/dist/components/form/TagInput/TagInput.cjs +1 -1
- package/dist/components/form/TagInput/TagInput.js +8 -8
- package/dist/components/form/Textarea/Textarea.cjs +1 -1
- package/dist/components/form/Textarea/Textarea.cjs.map +1 -1
- package/dist/components/form/Textarea/Textarea.js +61 -95
- package/dist/components/form/Textarea/Textarea.js.map +1 -1
- package/dist/components/navigation/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/components/navigation/ContextMenu/ContextMenu.js +9 -9
- package/dist/components/navigation/Menu/Menu.cjs +1 -1
- package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
- package/dist/components/navigation/Menu/Menu.js +70 -135
- package/dist/components/navigation/Menu/Menu.js.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
- package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +87 -157
- package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { cx as
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
22
|
-
size:
|
|
23
|
-
variant:
|
|
24
|
-
isInvalid:
|
|
25
|
-
placeholder:
|
|
26
|
-
className:
|
|
27
|
-
style:
|
|
28
|
-
testId:
|
|
29
|
-
disabled:
|
|
30
|
-
children:
|
|
31
|
-
|
|
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
|
|
37
|
-
|
|
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:
|
|
33
|
+
className: i(
|
|
77
34
|
"brycks-select-wrapper",
|
|
78
|
-
`brycks-select-wrapper--${
|
|
79
|
-
`brycks-select-wrapper--${
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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:
|
|
41
|
+
style: d,
|
|
85
42
|
children: [
|
|
86
|
-
/* @__PURE__ */
|
|
43
|
+
/* @__PURE__ */ o(
|
|
87
44
|
"select",
|
|
88
45
|
{
|
|
89
46
|
ref: m,
|
|
90
|
-
className: "brycks-select",
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
"
|
|
94
|
-
|
|
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
|
-
|
|
101
|
-
|
|
54
|
+
r && /* @__PURE__ */ e("option", { value: "", disabled: !0, children: r }),
|
|
55
|
+
h
|
|
102
56
|
]
|
|
103
57
|
}
|
|
104
58
|
),
|
|
105
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ e("span", { className: "brycks-select-icon", children: /* @__PURE__ */ e(w, {}) })
|
|
106
60
|
]
|
|
107
61
|
}
|
|
108
62
|
);
|
|
109
63
|
});
|
|
110
|
-
|
|
64
|
+
y.displayName = "Select";
|
|
111
65
|
export {
|
|
112
|
-
|
|
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":["/**\
|
|
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"),
|
|
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 {
|
|
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:
|
|
10
|
-
md: { height:
|
|
11
|
-
lg: { height:
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react/jsx-runtime"),e=require("react"),m=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}},H=e.forwardRef(function({size:x="md",variant:b="outline",isInvalid:d,autoResize:a,minRows:S=3,maxRows:k=10,showCount:w,maxLength:n,className:j,style:C,testId:T,disabled:s,value:r,defaultValue:c,onChange:N,...$},q){const[p,y]=e.useState(0),v=e.useRef(null),o=q||v,i=O[x],u=i.fontSize*i.lineHeight,l=u*S+i.padding*2,g=u*k+i.padding*2,f=e.useCallback(()=>{const t=o.current;if(!t||!a)return;t.style.height="auto";const E=t.scrollHeight,P=Math.min(Math.max(E,l),g);t.style.height=`${P}px`},[a,l,g,o]);e.useEffect(()=>{f()},[r,f]),e.useEffect(()=>{const t=String(r??c??"");y(t.length)},[r,c]);const z={minHeight:l,maxHeight:a?g:void 0,resize:s||a?"none":"vertical"},M=t=>{y(t.target.value.length),N?.(t)},R=p>=(n??1/0);return h.jsxs("div",{className:m.cx("brycks-textarea-wrapper",`brycks-textarea-wrapper--${b}`,`brycks-textarea-wrapper--${x}`,d&&"brycks-textarea-wrapper--invalid",s&&"brycks-textarea-wrapper--disabled",j),style:C,children:[h.jsx("textarea",{ref:o,className:"brycks-textarea",style:z,disabled:s,"aria-invalid":d,"data-testid":T,value:r,defaultValue:c,maxLength:n,onChange:M,...$}),w&&h.jsxs("span",{className:m.cx("brycks-textarea-count",R&&"brycks-textarea-count--limit"),children:[p,n?`/${n}`:""]})]})});H.displayName="Textarea";exports.Textarea=H;
|
|
2
2
|
//# sourceMappingURL=Textarea.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.cjs","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\
|
|
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 const textareaRef = (ref as React.RefObject<HTMLTextAreaElement>) || internalRef\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 = textareaRef.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, textareaRef])\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={textareaRef}\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","textareaRef","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","useCallback","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,EAC9CC,EAAeN,GAAgDI,EAE/DG,EAAY1B,EAAWG,CAAI,EAC3BwB,EAAeD,EAAU,SAAWA,EAAU,WAC9CE,EAAYD,EAAepB,EAAUmB,EAAU,QAAU,EACzDG,EAAYF,EAAenB,EAAUkB,EAAU,QAAU,EAEzDI,EAAeC,EAAAA,YAAY,IAAM,CACrC,MAAMC,EAAWP,EAAY,QAC7B,GAAI,CAACO,GAAY,CAAC1B,EAAY,OAE9B0B,EAAS,MAAM,OAAS,OACxB,MAAMC,EAAeD,EAAS,aACxBE,EAAY,KAAK,IAAI,KAAK,IAAID,EAAcL,CAAS,EAAGC,CAAS,EACvEG,EAAS,MAAM,OAAS,GAAGE,CAAS,IACtC,EAAG,CAAC5B,EAAYsB,EAAWC,EAAWJ,CAAW,CAAC,EAElDU,EAAAA,UAAU,IAAM,CACdL,EAAA,CACF,EAAG,CAACf,EAAOe,CAAY,CAAC,EAExBK,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAe,OAAOrB,GAASC,GAAgB,EAAE,EACvDK,EAAae,EAAa,MAAM,CAClC,EAAG,CAACrB,EAAOC,CAAY,CAAC,EAIxB,MAAMqB,EAA+B,CACnC,UAAAT,EACA,UAAWtB,EAAauB,EAAY,OACpC,OAAQf,GAAYR,EAAa,OAAS,UAAA,EAGtCgC,EAAgBC,GAA8C,CAClElB,EAAakB,EAAE,OAAO,MAAM,MAAM,EAClCtB,IAAWsB,CAAC,CACd,EAEMC,EAAUpB,IAAcV,GAAa,KAE3C,OACE+B,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,0BACA,4BAA4BtC,CAAO,GACnC,4BAA4BD,CAAI,GAChCE,GAAa,mCACbS,GAAY,oCACZH,CAAA,EAEF,MAAAC,EAEA,SAAA,CAAA+B,EAAAA,IAAC,WAAA,CACC,IAAKlB,EACL,UAAU,kBACV,MAAOY,EACP,SAAAvB,EACA,eAAcT,EACd,cAAaQ,EACb,MAAAE,EACA,aAAAC,EACA,UAAAN,EACA,SAAU4B,EACT,GAAGpB,CAAA,CAAA,EAGLT,UACE,OAAA,CAAK,UAAWiC,KAAG,wBAAyBF,GAAW,8BAA8B,EACnF,SAAA,CAAApB,EAAWV,EAAY,IAAIA,CAAS,GAAK,EAAA,CAAA,CAC5C,CAAA,CAAA,CAAA,CAIR,CAAC,EAEDT,EAAS,YAAc"}
|
|
@@ -1,121 +1,87 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { cx as
|
|
4
|
-
const
|
|
1
|
+
import { jsxs as f, jsx as q } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as A, useState as B, useRef as D, useCallback as F, useEffect as y } from "react";
|
|
3
|
+
import { cx as H } 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
|
-
},
|
|
9
|
-
size:
|
|
10
|
-
variant:
|
|
11
|
-
isInvalid:
|
|
12
|
-
autoResize:
|
|
13
|
-
minRows:
|
|
14
|
-
maxRows:
|
|
15
|
-
showCount:
|
|
16
|
-
maxLength:
|
|
17
|
-
className:
|
|
8
|
+
}, I = A(function({
|
|
9
|
+
size: h = "md",
|
|
10
|
+
variant: k = "outline",
|
|
11
|
+
isInvalid: g,
|
|
12
|
+
autoResize: e,
|
|
13
|
+
minRows: u = 3,
|
|
14
|
+
maxRows: b = 10,
|
|
15
|
+
showCount: S,
|
|
16
|
+
maxLength: a,
|
|
17
|
+
className: w,
|
|
18
18
|
style: C,
|
|
19
|
-
testId:
|
|
19
|
+
testId: N,
|
|
20
20
|
disabled: i,
|
|
21
|
-
value:
|
|
22
|
-
defaultValue:
|
|
21
|
+
value: r,
|
|
22
|
+
defaultValue: s,
|
|
23
23
|
onChange: $,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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(
|
|
24
|
+
...j
|
|
25
|
+
}, z) {
|
|
26
|
+
const [p, x] = B(0), T = D(null), c = z || T, n = G[h], d = n.fontSize * n.lineHeight, o = d * u + n.padding * 2, l = d * b + n.padding * 2, m = F(() => {
|
|
27
|
+
const t = c.current;
|
|
28
|
+
if (!t || !e) return;
|
|
29
|
+
t.style.height = "auto";
|
|
30
|
+
const P = t.scrollHeight, R = Math.min(Math.max(P, o), l);
|
|
31
|
+
t.style.height = `${R}px`;
|
|
32
|
+
}, [e, o, l, c]);
|
|
33
|
+
y(() => {
|
|
34
|
+
m();
|
|
35
|
+
}, [r, m]), y(() => {
|
|
36
|
+
const t = String(r ?? s ?? "");
|
|
37
|
+
x(t.length);
|
|
38
|
+
}, [r, s]);
|
|
39
|
+
const v = {
|
|
40
|
+
minHeight: o,
|
|
41
|
+
maxHeight: e ? l : void 0,
|
|
42
|
+
resize: i || e ? "none" : "vertical"
|
|
43
|
+
}, M = (t) => {
|
|
44
|
+
x(t.target.value.length), $?.(t);
|
|
45
|
+
}, E = p >= (a ?? 1 / 0);
|
|
46
|
+
return /* @__PURE__ */ f(
|
|
79
47
|
"div",
|
|
80
48
|
{
|
|
81
|
-
className:
|
|
49
|
+
className: H(
|
|
82
50
|
"brycks-textarea-wrapper",
|
|
83
|
-
`brycks-textarea-wrapper--${
|
|
84
|
-
`brycks-textarea-wrapper--${
|
|
85
|
-
|
|
51
|
+
`brycks-textarea-wrapper--${k}`,
|
|
52
|
+
`brycks-textarea-wrapper--${h}`,
|
|
53
|
+
g && "brycks-textarea-wrapper--invalid",
|
|
86
54
|
i && "brycks-textarea-wrapper--disabled",
|
|
87
|
-
|
|
55
|
+
w
|
|
88
56
|
),
|
|
89
|
-
style:
|
|
57
|
+
style: C,
|
|
90
58
|
children: [
|
|
91
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ q(
|
|
92
60
|
"textarea",
|
|
93
61
|
{
|
|
94
|
-
ref:
|
|
62
|
+
ref: c,
|
|
95
63
|
className: "brycks-textarea",
|
|
96
|
-
style:
|
|
64
|
+
style: v,
|
|
97
65
|
disabled: i,
|
|
98
|
-
"aria-invalid":
|
|
99
|
-
"data-testid":
|
|
100
|
-
value:
|
|
101
|
-
defaultValue:
|
|
102
|
-
maxLength:
|
|
103
|
-
onChange:
|
|
104
|
-
|
|
105
|
-
onBlur: D,
|
|
106
|
-
...N
|
|
66
|
+
"aria-invalid": g,
|
|
67
|
+
"data-testid": N,
|
|
68
|
+
value: r,
|
|
69
|
+
defaultValue: s,
|
|
70
|
+
maxLength: a,
|
|
71
|
+
onChange: M,
|
|
72
|
+
...j
|
|
107
73
|
}
|
|
108
74
|
),
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
75
|
+
S && /* @__PURE__ */ f("span", { className: H("brycks-textarea-count", E && "brycks-textarea-count--limit"), children: [
|
|
76
|
+
p,
|
|
77
|
+
a ? `/${a}` : ""
|
|
112
78
|
] })
|
|
113
79
|
]
|
|
114
80
|
}
|
|
115
81
|
);
|
|
116
82
|
});
|
|
117
|
-
|
|
83
|
+
I.displayName = "Textarea";
|
|
118
84
|
export {
|
|
119
|
-
|
|
85
|
+
I as Textarea
|
|
120
86
|
};
|
|
121
87
|
//# sourceMappingURL=Textarea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../../../src/components/form/Textarea/Textarea.tsx"],"sourcesContent":["/**\
|
|
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 const textareaRef = (ref as React.RefObject<HTMLTextAreaElement>) || internalRef\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 = textareaRef.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, textareaRef])\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={textareaRef}\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","textareaRef","sizeValue","lineHeightPx","minHeight","maxHeight","adjustHeight","useCallback","textarea","scrollHeight","newHeight","useEffect","initialValue","textareaStyle","handleChange","e","atLimit","jsxs","cx","jsx"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),r=require("react"),z=require("react-dom"),L=require("../../../utils/styles.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),r=require("react"),z=require("react-dom"),L=require("../../../utils/styles.cjs"),v=require("../../../design-system/primitives/sizing.cjs"),M=require("../../../design-system/tokens/spacing.cjs"),S=require("../../../design-system/tokens/motion.cjs"),j=require("../../../design-system/tokens/typography.cjs"),I=r.createContext(null);function R(){return o.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:o.jsx("path",{d:"M4.5 3l3 3-3 3",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function P({items:i,position:h,onClose:u,level:p=0}){const[l,x]=r.useState(-1),[b,c]=r.useState(null),y=r.useRef(null),a=i.filter(e=>!e.separator&&!e.disabled),g=r.useCallback(e=>{switch(e.key){case"ArrowDown":e.preventDefault(),e.stopPropagation(),x(n=>{const s=n+1;return s>=a.length?0:s});break;case"ArrowUp":e.preventDefault(),e.stopPropagation(),x(n=>{const s=n-1;return s<0?a.length-1:s});break;case"ArrowRight":{e.preventDefault(),e.stopPropagation();const n=a[l];if(n?.children){const s=i.indexOf(n);c(s)}break}case"ArrowLeft":p>0&&(e.preventDefault(),e.stopPropagation(),u());break;case"Enter":case" ":if(e.preventDefault(),e.stopPropagation(),l>=0){const n=a[l];if(n?.children){const s=i.indexOf(n);c(s)}else n?.onClick&&(n.onClick(),u())}break;case"Escape":e.preventDefault(),e.stopPropagation(),u();break}},[l,a,i,p,u]);r.useEffect(()=>{y.current?.focus()},[]);const w={position:"fixed",top:h.y,left:h.x,minWidth:180,maxWidth:280,backgroundColor:"var(--brycks-background-elevated)",border:"1px solid var(--brycks-border-default)",borderRadius:"var(--brycks-radius-lg)",boxShadow:"var(--brycks-shadow-lg)",padding:M.spacing[1],zIndex:"var(--brycks-z-dropdown)",outline:"none"},C=(e,n)=>({display:"flex",alignItems:"center",gap:M.spacing[2],padding:`${v.componentPaddingY.sm}px ${v.componentPaddingX.sm}px`,fontSize:j.fontSizes.sm,fontWeight:400,color:n?"var(--brycks-foreground-disabled)":"var(--brycks-foreground-default)",backgroundColor:e?"var(--brycks-background-muted)":"transparent",borderRadius:"var(--brycks-radius-md)",cursor:n?"not-allowed":"pointer",transition:`background-color ${S.durations.fast}ms ${S.easings.easeOut}`}),k={display:"flex",alignItems:"center",justifyContent:"center",width:v.iconSizes.sm,height:v.iconSizes.sm,color:"inherit"},d={marginLeft:"auto",fontSize:j.fontSizes.xs,color:"var(--brycks-foreground-muted)"},m={height:1,margin:`${M.spacing[1]}px 0`,backgroundColor:"var(--brycks-border-default)"};let t=-1;return o.jsx("ul",{ref:y,role:"menu",tabIndex:0,style:w,onKeyDown:g,children:i.map((e,n)=>{if(e.separator)return o.jsx("li",{role:"separator",style:m},e.id);e.disabled||t++;const s=t,E=!e.disabled&&s===l,f=e.children&&e.children.length>0;return o.jsxs("li",{role:"menuitem","aria-disabled":e.disabled,"aria-haspopup":f?"menu":void 0,"aria-expanded":f&&b===n?"true":void 0,style:C(E,!!e.disabled),onMouseEnter:()=>{e.disabled||(x(s),c(f?n:null))},onMouseLeave:()=>{f||c(null)},onClick:()=>{e.disabled||(f?c(n):e.onClick&&(e.onClick(),u()))},children:[e.icon&&o.jsx("span",{style:k,children:e.icon}),o.jsx("span",{style:{flex:1},children:e.label}),e.shortcut&&o.jsx("span",{style:d,children:e.shortcut}),f&&o.jsx("span",{style:k,children:o.jsx(R,{})}),f&&b===n&&e.children&&o.jsx(P,{items:e.children,position:{x:176,y:0},onClose:()=>c(null),level:p+1})]},e.id)})})}const D=r.forwardRef(function({items:h,children:u,onOpen:p,onClose:l,disabled:x=!1,className:b,testId:c},y){const[a,g]=r.useState(!1),[w,C]=r.useState({x:0,y:0}),k=r.useCallback(t=>{if(x)return;t.preventDefault(),t.stopPropagation();const e=Math.min(t.clientX,window.innerWidth-200),n=Math.min(t.clientY,window.innerHeight-300);C({x:e,y:n}),g(!0),p?.()},[x,p]),d=r.useCallback(()=>{g(!1),l?.()},[l]);r.useEffect(()=>{if(!a)return;const t=()=>{d()};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[a,d]),r.useEffect(()=>{if(!a)return;const t=e=>{e.key==="Escape"&&d()};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[a,d]);const m={display:"contents"};return o.jsx(I.Provider,{value:{closeMenu:d},children:o.jsxs("div",{ref:y,className:L.cx("brycks-contextmenu",b),style:m,"data-testid":c,onContextMenu:k,children:[u,a&&z.createPortal(o.jsx("div",{style:{position:"fixed",inset:0,zIndex:"var(--brycks-z-dropdown)"},onMouseDown:t=>t.stopPropagation(),children:o.jsx(P,{items:h,position:w,onClose:d})}),document.body)]})})});D.displayName="ContextMenu";function q(){const i=r.useContext(I);if(!i)throw new Error("useContextMenu must be used within a ContextMenu");return i}exports.ContextMenu=D;exports.useContextMenu=q;
|
|
2
2
|
//# sourceMappingURL=ContextMenu.cjs.map
|