@navikt/ds-react 2.6.0 → 2.6.2
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/_docs.json +19 -0
- package/cjs/form/search/Search.js +5 -1
- package/cjs/form/search/SearchButton.js +6 -3
- package/cjs/util/TextareaAutoSize.js +66 -29
- package/esm/form/search/Search.d.ts +5 -0
- package/esm/form/search/Search.js +5 -1
- package/esm/form/search/Search.js.map +1 -1
- package/esm/form/search/SearchButton.js +6 -3
- package/esm/form/search/SearchButton.js.map +1 -1
- package/esm/util/TextareaAutoSize.js +64 -30
- package/esm/util/TextareaAutoSize.js.map +1 -1
- package/package.json +2 -2
- package/src/form/search/Search.tsx +11 -0
- package/src/form/search/SearchButton.tsx +6 -2
- package/src/form/search/search.stories.tsx +1 -0
- package/src/util/TextareaAutoSize.tsx +79 -41
package/_docs.json
CHANGED
|
@@ -12252,6 +12252,25 @@
|
|
|
12252
12252
|
"name": "((e: SearchClearEvent) => void)"
|
|
12253
12253
|
}
|
|
12254
12254
|
},
|
|
12255
|
+
"onSearchClick": {
|
|
12256
|
+
"defaultValue": null,
|
|
12257
|
+
"description": "Callback for Search-button submit",
|
|
12258
|
+
"name": "onSearchClick",
|
|
12259
|
+
"parent": {
|
|
12260
|
+
"fileName": "src/form/search/Search.tsx",
|
|
12261
|
+
"name": "SearchProps"
|
|
12262
|
+
},
|
|
12263
|
+
"declarations": [
|
|
12264
|
+
{
|
|
12265
|
+
"fileName": "src/form/search/Search.tsx",
|
|
12266
|
+
"name": "SearchProps"
|
|
12267
|
+
}
|
|
12268
|
+
],
|
|
12269
|
+
"required": false,
|
|
12270
|
+
"type": {
|
|
12271
|
+
"name": "((value: string) => void)"
|
|
12272
|
+
}
|
|
12273
|
+
},
|
|
12255
12274
|
"clearButtonLabel": {
|
|
12256
12275
|
"defaultValue": {
|
|
12257
12276
|
"value": "\"Tøm\""
|
|
@@ -47,7 +47,7 @@ const SearchButton_1 = __importDefault(require("./SearchButton"));
|
|
|
47
47
|
exports.SearchContext = react_1.default.createContext(null);
|
|
48
48
|
exports.Search = (0, react_1.forwardRef)((props, ref) => {
|
|
49
49
|
const { inputProps, size = "medium", inputDescriptionId, errorId, showErrorMsg, hasError, } = (0, useFormField_1.useFormField)(props, "searchfield");
|
|
50
|
-
const { className, hideLabel = true, label, description, value, clearButtonLabel, onClear, clearButton = true, children, variant = "primary", defaultValue, onChange } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "value", "clearButtonLabel", "onClear", "clearButton", "children", "variant", "defaultValue", "onChange"]);
|
|
50
|
+
const { className, hideLabel = true, label, description, value, clearButtonLabel, onClear, clearButton = true, children, variant = "primary", defaultValue, onChange, onSearchClick } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "value", "clearButtonLabel", "onClear", "clearButton", "children", "variant", "defaultValue", "onChange", "onSearchClick"]);
|
|
51
51
|
const searchRef = (0, react_1.useRef)(null);
|
|
52
52
|
const mergedRef = (0, react_1.useMemo)(() => (0, __1.mergeRefs)([searchRef, ref]), [ref]);
|
|
53
53
|
const [wrapperRef, setWrapperRef] = (0, react_1.useState)(null);
|
|
@@ -68,6 +68,9 @@ exports.Search = (0, react_1.forwardRef)((props, ref) => {
|
|
|
68
68
|
handleClear({ trigger: "Escape", event: e });
|
|
69
69
|
}
|
|
70
70
|
}, [handleClear]), wrapperRef);
|
|
71
|
+
const handleClick = () => {
|
|
72
|
+
onSearchClick === null || onSearchClick === void 0 ? void 0 : onSearchClick(`${value !== null && value !== void 0 ? value : internalValue}`);
|
|
73
|
+
};
|
|
71
74
|
return (react_1.default.createElement("div", { ref: setWrapperRef, className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${size}`, "navds-search", {
|
|
72
75
|
"navds-search--error": hasError,
|
|
73
76
|
"navds-search--disabled": !!inputProps.disabled,
|
|
@@ -89,6 +92,7 @@ exports.Search = (0, react_1.forwardRef)((props, ref) => {
|
|
|
89
92
|
size,
|
|
90
93
|
disabled: inputProps.disabled,
|
|
91
94
|
variant,
|
|
95
|
+
handleClick,
|
|
92
96
|
} }, children ? children : variant !== "simple" && react_1.default.createElement(SearchButton_1.default, null))),
|
|
93
97
|
react_1.default.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (react_1.default.createElement(__1.ErrorMessage, { size: size }, props.error)))));
|
|
94
98
|
});
|
|
@@ -44,13 +44,16 @@ const __1 = require("../..");
|
|
|
44
44
|
const Search_1 = require("./Search");
|
|
45
45
|
const SearchButton = (0, react_1.forwardRef)((_a, ref) => {
|
|
46
46
|
var _b;
|
|
47
|
-
var { className, children, disabled } = _a, rest = __rest(_a, ["className", "children", "disabled"]);
|
|
47
|
+
var { className, children, disabled, onClick } = _a, rest = __rest(_a, ["className", "children", "disabled", "onClick"]);
|
|
48
48
|
const context = (0, react_1.useContext)(Search_1.SearchContext);
|
|
49
49
|
if (context === null) {
|
|
50
50
|
console.warn("<Search.Button> has to be wrapped in <Search />");
|
|
51
51
|
return null;
|
|
52
52
|
}
|
|
53
|
-
const { size, variant } = context;
|
|
54
|
-
return (react_1.default.createElement(__1.Button, Object.assign({ type: "submit" }, rest, { ref: ref, size: size, variant: variant === "secondary" ? "secondary" : "primary", className: (0, clsx_1.default)("navds-search__button-search", className), disabled: (_b = context === null || context === void 0 ? void 0 : context.disabled) !== null && _b !== void 0 ? _b : disabled,
|
|
53
|
+
const { size, variant, handleClick } = context;
|
|
54
|
+
return (react_1.default.createElement(__1.Button, Object.assign({ type: "submit" }, rest, { ref: ref, size: size, variant: variant === "secondary" ? "secondary" : "primary", className: (0, clsx_1.default)("navds-search__button-search", className), disabled: (_b = context === null || context === void 0 ? void 0 : context.disabled) !== null && _b !== void 0 ? _b : disabled, onClick: (e) => {
|
|
55
|
+
handleClick();
|
|
56
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
57
|
+
}, icon: react_1.default.createElement(ds_icons_1.Search, Object.assign({}, (children ? { "aria-hidden": true } : { title: "Søk" }))) }), children));
|
|
55
58
|
});
|
|
56
59
|
exports.default = SearchButton;
|
|
@@ -33,9 +33,13 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
33
33
|
}
|
|
34
34
|
return t;
|
|
35
35
|
};
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
36
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
40
|
/* https://github.com/mui/material-ui/blob/master/packages/mui-base/src/TextareaAutosize/TextareaAutosize.js */
|
|
38
41
|
const react_1 = __importStar(require("react"));
|
|
42
|
+
const react_dom_1 = __importDefault(require("react-dom"));
|
|
39
43
|
const __1 = require("..");
|
|
40
44
|
/**
|
|
41
45
|
* https://github.com/mui/material-ui/blob/master/packages/mui-utils/src/ownerDocument.ts
|
|
@@ -56,7 +60,7 @@ const TextareaAutosize = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
56
60
|
const shadowRef = (0, react_1.useRef)(null);
|
|
57
61
|
const renders = (0, react_1.useRef)(0);
|
|
58
62
|
const [state, setState] = (0, react_1.useState)({});
|
|
59
|
-
const
|
|
63
|
+
const getUpdatedState = react_1.default.useCallback(() => {
|
|
60
64
|
if (!inputRef.current || !shadowRef.current)
|
|
61
65
|
return;
|
|
62
66
|
const input = inputRef.current;
|
|
@@ -97,42 +101,69 @@ const TextareaAutosize = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
97
101
|
// Take the box sizing into account for applying this value as a style.
|
|
98
102
|
const outerHeightStyle = outerHeight + (boxSizing === "border-box" ? padding + border : 0);
|
|
99
103
|
const overflow = Math.abs(outerHeight - innerHeight) <= 1;
|
|
104
|
+
return { outerHeightStyle, overflow };
|
|
105
|
+
}, [maxRows, minRows, other === null || other === void 0 ? void 0 : other.placeholder]);
|
|
106
|
+
const syncHeight = react_1.default.useCallback(() => {
|
|
107
|
+
const newState = getUpdatedState();
|
|
108
|
+
if (isEmpty(newState)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
100
111
|
setState((prevState) => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
112
|
+
return updateState(prevState, newState);
|
|
113
|
+
});
|
|
114
|
+
}, [getUpdatedState]);
|
|
115
|
+
const updateState = (prevState, newState) => {
|
|
116
|
+
const { outerHeightStyle, overflow } = newState;
|
|
117
|
+
// Need a large enough difference to update the height.
|
|
118
|
+
// This prevents infinite rendering loop.
|
|
119
|
+
if (renders.current < 20 &&
|
|
120
|
+
((outerHeightStyle > 0 &&
|
|
121
|
+
Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1) ||
|
|
122
|
+
prevState.overflow !== overflow)) {
|
|
123
|
+
renders.current += 1;
|
|
124
|
+
return {
|
|
125
|
+
overflow,
|
|
126
|
+
outerHeightStyle,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (process.env.NODE_ENV !== "production") {
|
|
130
|
+
if (renders.current === 20) {
|
|
131
|
+
console.error([
|
|
132
|
+
"Textarea: Too many re-renders. The layout is unstable.",
|
|
133
|
+
"TextareaAutosize limits the number of renders to prevent an infinite loop.",
|
|
134
|
+
].join("\n"));
|
|
121
135
|
}
|
|
122
|
-
|
|
136
|
+
}
|
|
137
|
+
return prevState;
|
|
138
|
+
};
|
|
139
|
+
const withFlushSync = () => {
|
|
140
|
+
const newState = getUpdatedState();
|
|
141
|
+
if (isEmpty(newState)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// In React 18, state updates in a ResizeObserver's callback are happening after the paint which causes flickering
|
|
145
|
+
// when doing some visual updates in it. Using flushSync ensures that the dom will be painted after the states updates happen
|
|
146
|
+
// Related issue - https://github.com/facebook/react/issues/24331
|
|
147
|
+
react_dom_1.default.flushSync(() => {
|
|
148
|
+
setState((prevState) => {
|
|
149
|
+
return updateState(prevState, newState);
|
|
150
|
+
});
|
|
123
151
|
});
|
|
124
|
-
}
|
|
125
|
-
|
|
152
|
+
};
|
|
153
|
+
react_1.default.useEffect(() => {
|
|
126
154
|
const handleResize = (0, __1.debounce)(() => {
|
|
127
155
|
renders.current = 0;
|
|
128
|
-
|
|
156
|
+
if (inputRef.current) {
|
|
157
|
+
withFlushSync();
|
|
158
|
+
}
|
|
129
159
|
});
|
|
130
|
-
const containerWindow = ownerWindow(inputRef.current);
|
|
131
|
-
containerWindow.addEventListener("resize", handleResize);
|
|
132
160
|
let resizeObserver;
|
|
161
|
+
const input = inputRef.current;
|
|
162
|
+
const containerWindow = ownerWindow(input);
|
|
163
|
+
containerWindow.addEventListener("resize", handleResize);
|
|
133
164
|
if (typeof ResizeObserver !== "undefined") {
|
|
134
165
|
resizeObserver = new ResizeObserver(handleResize);
|
|
135
|
-
resizeObserver.observe(
|
|
166
|
+
resizeObserver.observe(input);
|
|
136
167
|
}
|
|
137
168
|
return () => {
|
|
138
169
|
handleResize.clear();
|
|
@@ -141,7 +172,7 @@ const TextareaAutosize = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
141
172
|
resizeObserver.disconnect();
|
|
142
173
|
}
|
|
143
174
|
};
|
|
144
|
-
}
|
|
175
|
+
});
|
|
145
176
|
(0, __1.useClientLayoutEffect)(() => {
|
|
146
177
|
syncHeight();
|
|
147
178
|
});
|
|
@@ -171,4 +202,10 @@ const TextareaAutosize = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
171
202
|
// Create a new layer, increase the isolation of the computed values
|
|
172
203
|
transform: "translateZ(0)" }, style) })));
|
|
173
204
|
});
|
|
205
|
+
function isEmpty(obj) {
|
|
206
|
+
return (obj === undefined ||
|
|
207
|
+
obj === null ||
|
|
208
|
+
Object.keys(obj).length === 0 ||
|
|
209
|
+
((obj === null || obj === void 0 ? void 0 : obj.outerHeightStyle) === 0 && !(obj === null || obj === void 0 ? void 0 : obj.overflow)));
|
|
210
|
+
}
|
|
174
211
|
exports.default = TextareaAutosize;
|
|
@@ -28,6 +28,10 @@ export interface SearchProps extends FormFieldProps, Omit<InputHTMLAttributes<HT
|
|
|
28
28
|
* Callback for click on clear-button or Escape keydown
|
|
29
29
|
*/
|
|
30
30
|
onClear?: (e: SearchClearEvent) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Callback for Search-button submit
|
|
33
|
+
*/
|
|
34
|
+
onSearchClick?: (value: string) => void;
|
|
31
35
|
/**
|
|
32
36
|
* aria-label on clear button
|
|
33
37
|
* @default "Tøm"
|
|
@@ -51,6 +55,7 @@ export interface SearchContextProps {
|
|
|
51
55
|
disabled?: boolean;
|
|
52
56
|
size: "medium" | "small";
|
|
53
57
|
variant: "primary" | "secondary" | "simple";
|
|
58
|
+
handleClick: () => void;
|
|
54
59
|
}
|
|
55
60
|
export declare const SearchContext: React.Context<SearchContextProps | null>;
|
|
56
61
|
export declare const Search: SearchComponent;
|
|
@@ -18,7 +18,7 @@ import SearchButton from "./SearchButton";
|
|
|
18
18
|
export const SearchContext = React.createContext(null);
|
|
19
19
|
export const Search = forwardRef((props, ref) => {
|
|
20
20
|
const { inputProps, size = "medium", inputDescriptionId, errorId, showErrorMsg, hasError, } = useFormField(props, "searchfield");
|
|
21
|
-
const { className, hideLabel = true, label, description, value, clearButtonLabel, onClear, clearButton = true, children, variant = "primary", defaultValue, onChange } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "value", "clearButtonLabel", "onClear", "clearButton", "children", "variant", "defaultValue", "onChange"]);
|
|
21
|
+
const { className, hideLabel = true, label, description, value, clearButtonLabel, onClear, clearButton = true, children, variant = "primary", defaultValue, onChange, onSearchClick } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "value", "clearButtonLabel", "onClear", "clearButton", "children", "variant", "defaultValue", "onChange", "onSearchClick"]);
|
|
22
22
|
const searchRef = useRef(null);
|
|
23
23
|
const mergedRef = useMemo(() => mergeRefs([searchRef, ref]), [ref]);
|
|
24
24
|
const [wrapperRef, setWrapperRef] = useState(null);
|
|
@@ -39,6 +39,9 @@ export const Search = forwardRef((props, ref) => {
|
|
|
39
39
|
handleClear({ trigger: "Escape", event: e });
|
|
40
40
|
}
|
|
41
41
|
}, [handleClear]), wrapperRef);
|
|
42
|
+
const handleClick = () => {
|
|
43
|
+
onSearchClick === null || onSearchClick === void 0 ? void 0 : onSearchClick(`${value !== null && value !== void 0 ? value : internalValue}`);
|
|
44
|
+
};
|
|
42
45
|
return (React.createElement("div", { ref: setWrapperRef, className: cl(className, "navds-form-field", `navds-form-field--${size}`, "navds-search", {
|
|
43
46
|
"navds-search--error": hasError,
|
|
44
47
|
"navds-search--disabled": !!inputProps.disabled,
|
|
@@ -60,6 +63,7 @@ export const Search = forwardRef((props, ref) => {
|
|
|
60
63
|
size,
|
|
61
64
|
disabled: inputProps.disabled,
|
|
62
65
|
variant,
|
|
66
|
+
handleClick,
|
|
63
67
|
} }, children ? children : variant !== "simple" && React.createElement(SearchButton, null))),
|
|
64
68
|
React.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (React.createElement(ErrorMessage, { size: size }, props.error)))));
|
|
65
69
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../../src/form/search/Search.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EACZ,UAAU,EAEV,WAAW,EACX,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,YAAkC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../../src/form/search/Search.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EACZ,UAAU,EAEV,WAAW,EACX,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,YAAkC,MAAM,gBAAgB,CAAC;AAkEhE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAC9C,IAAI,CACL,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAC9B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,MAAM,EACJ,UAAU,EACV,IAAI,GAAG,QAAQ,EACf,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,QAAQ,GACT,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAEvC,MAAM,EACJ,SAAS,EACT,SAAS,GAAG,IAAI,EAChB,KAAK,EACL,WAAW,EACX,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,WAAW,GAAG,IAAI,EAClB,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,YAAY,EACZ,QAAQ,EACR,aAAa,KAEX,KAAK,EADJ,IAAI,UACL,KAAK,EAfH,6KAeL,CAAQ,CAAC;IAEV,MAAM,SAAS,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAE1E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,EAAE,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAS,EAAE,EAAE;QACZ,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3C,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC,CAAC;IAChB,CAAC,EACD,CAAC,QAAQ,EAAE,KAAK,CAAC,CAClB,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAuB,EAAE,EAAE;;QAC1B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAC;QACjB,YAAY,CAAC,EAAE,CAAC,CAAC;QACjB,SAAS,CAAC,OAAO,KAAI,MAAA,MAAA,SAAS,CAAC,OAAO,0CAAE,KAAK,kDAAI,CAAA,CAAC;IACpD,CAAC,EACD,CAAC,YAAY,EAAE,OAAO,CAAC,CACxB,CAAC;IAEF,gBAAgB,CACd,SAAS,EACT,WAAW,CACT,CAAC,CAAC,EAAE,EAAE;QACJ,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YACtB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SAC9C;IACH,CAAC,EACD,CAAC,WAAW,CAAC,CACd,EACD,UAAU,CACX,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,aAAa,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO,CACL,6BACE,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,EAAE,CACX,SAAS,EACT,kBAAkB,EAClB,qBAAqB,IAAI,EAAE,EAC3B,cAAc,EACd;YACE,qBAAqB,EAAE,QAAQ;YAC/B,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ;SAChD,CACF;QAED,oBAAC,KAAK,IACJ,OAAO,EAAE,UAAU,CAAC,EAAE,EACtB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE;gBACvC,eAAe,EAAE,SAAS;aAC3B,CAAC,IAED,KAAK,CACA;QACP,CAAC,CAAC,WAAW,IAAI,CAChB,oBAAC,SAAS,IACR,EAAE,EAAC,KAAK,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE;gBAC7C,eAAe,EAAE,SAAS;aAC3B,CAAC,EACF,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,IAAI,IAET,WAAW,CACF,CACb;QACD,6BAAK,SAAS,EAAC,uBAAuB;YACpC,6BAAK,SAAS,EAAC,6BAA6B;gBACzC,OAAO,KAAK,QAAQ,IAAI,CACvB,oBAAC,UAAU,yBAAa,SAAS,EAAC,2BAA2B,GAAG,CACjE;gBACD,6CACE,GAAG,EAAE,SAAS,IACV,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EACxC,UAAU,IACd,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,aAAa,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,WAAW,EAChB,SAAS,EAAE,EAAE,CACX,SAAS,EACT,qBAAqB,EACrB,wBAAwB,OAAO,EAAE,EACjC,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,IAAI,EAAE,CACrB,IACD;gBACD,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,aAAa,CAAC,IAAI,WAAW,IAAI,CAC1C,gCACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAC3D,SAAS,EAAC,4BAA4B;oBAEtC,8BAAM,SAAS,EAAC,eAAe,IAC5B,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CACvC;oBACP,oBAAC,KAAK,0BAAe,CACd,CACV,CACG;YACN,oBAAC,aAAa,CAAC,QAAQ,IACrB,KAAK,EAAE;oBACL,IAAI;oBACJ,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,OAAO;oBACP,WAAW;iBACZ,IAEA,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,oBAAC,YAAY,OAAG,CACxC,CACrB;QACN,6BACE,SAAS,EAAC,yBAAyB,EACnC,EAAE,EAAE,OAAO,mBACG,oBAAoB,eACxB,QAAQ,IAEjB,YAAY,IAAI,CACf,oBAAC,YAAY,IAAC,IAAI,EAAE,IAAI,IAAG,KAAK,CAAC,KAAK,CAAgB,CACvD,CACG,CACF,CACP,CAAC;AACJ,CAAC,CACiB,CAAC;AAErB,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;AAE7B,eAAe,MAAM,CAAC"}
|
|
@@ -16,14 +16,17 @@ import { Button } from "../..";
|
|
|
16
16
|
import { SearchContext } from "./Search";
|
|
17
17
|
const SearchButton = forwardRef((_a, ref) => {
|
|
18
18
|
var _b;
|
|
19
|
-
var { className, children, disabled } = _a, rest = __rest(_a, ["className", "children", "disabled"]);
|
|
19
|
+
var { className, children, disabled, onClick } = _a, rest = __rest(_a, ["className", "children", "disabled", "onClick"]);
|
|
20
20
|
const context = useContext(SearchContext);
|
|
21
21
|
if (context === null) {
|
|
22
22
|
console.warn("<Search.Button> has to be wrapped in <Search />");
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
|
-
const { size, variant } = context;
|
|
26
|
-
return (React.createElement(Button, Object.assign({ type: "submit" }, rest, { ref: ref, size: size, variant: variant === "secondary" ? "secondary" : "primary", className: cl("navds-search__button-search", className), disabled: (_b = context === null || context === void 0 ? void 0 : context.disabled) !== null && _b !== void 0 ? _b : disabled,
|
|
25
|
+
const { size, variant, handleClick } = context;
|
|
26
|
+
return (React.createElement(Button, Object.assign({ type: "submit" }, rest, { ref: ref, size: size, variant: variant === "secondary" ? "secondary" : "primary", className: cl("navds-search__button-search", className), disabled: (_b = context === null || context === void 0 ? void 0 : context.disabled) !== null && _b !== void 0 ? _b : disabled, onClick: (e) => {
|
|
27
|
+
handleClick();
|
|
28
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
29
|
+
}, icon: React.createElement(Search, Object.assign({}, (children ? { "aria-hidden": true } : { title: "Søk" }))) }), children));
|
|
27
30
|
});
|
|
28
31
|
export default SearchButton;
|
|
29
32
|
//# sourceMappingURL=SearchButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchButton.js","sourceRoot":"","sources":["../../../src/form/search/SearchButton.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,MAAM,EAAe,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAczC,MAAM,YAAY,GAAqB,UAAU,CAC/C,CAAC,
|
|
1
|
+
{"version":3,"file":"SearchButton.js","sourceRoot":"","sources":["../../../src/form/search/SearchButton.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,MAAM,EAAe,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAczC,MAAM,YAAY,GAAqB,UAAU,CAC/C,CAAC,EAAmD,EAAE,GAAG,EAAE,EAAE;;QAA5D,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,OAAW,EAAN,IAAI,cAAjD,gDAAmD,CAAF;IAChD,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,IAAI,OAAO,KAAK,IAAI,EAAE;QACpB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;KACb;IAED,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE/C,OAAO,CACL,oBAAC,MAAM,kBACL,IAAI,EAAC,QAAQ,IACT,IAAI,IACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAC1D,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,EACvD,QAAQ,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,QAAQ,EACvC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,WAAW,EAAE,CAAC;YACd,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,CAAC;QACf,CAAC,EACD,IAAI,EACF,oBAAC,MAAM,oBACD,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAC3D,KAGH,QAAQ,CACF,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -10,7 +10,8 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
/* https://github.com/mui/material-ui/blob/master/packages/mui-base/src/TextareaAutosize/TextareaAutosize.js */
|
|
13
|
-
import React, { forwardRef,
|
|
13
|
+
import React, { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
|
14
|
+
import ReactDOM from "react-dom";
|
|
14
15
|
import { debounce, mergeRefs, useClientLayoutEffect } from "..";
|
|
15
16
|
/**
|
|
16
17
|
* https://github.com/mui/material-ui/blob/master/packages/mui-utils/src/ownerDocument.ts
|
|
@@ -31,7 +32,7 @@ const TextareaAutosize = forwardRef((_a, ref) => {
|
|
|
31
32
|
const shadowRef = useRef(null);
|
|
32
33
|
const renders = useRef(0);
|
|
33
34
|
const [state, setState] = useState({});
|
|
34
|
-
const
|
|
35
|
+
const getUpdatedState = React.useCallback(() => {
|
|
35
36
|
if (!inputRef.current || !shadowRef.current)
|
|
36
37
|
return;
|
|
37
38
|
const input = inputRef.current;
|
|
@@ -72,42 +73,69 @@ const TextareaAutosize = forwardRef((_a, ref) => {
|
|
|
72
73
|
// Take the box sizing into account for applying this value as a style.
|
|
73
74
|
const outerHeightStyle = outerHeight + (boxSizing === "border-box" ? padding + border : 0);
|
|
74
75
|
const overflow = Math.abs(outerHeight - innerHeight) <= 1;
|
|
76
|
+
return { outerHeightStyle, overflow };
|
|
77
|
+
}, [maxRows, minRows, other === null || other === void 0 ? void 0 : other.placeholder]);
|
|
78
|
+
const syncHeight = React.useCallback(() => {
|
|
79
|
+
const newState = getUpdatedState();
|
|
80
|
+
if (isEmpty(newState)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
75
83
|
setState((prevState) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
return updateState(prevState, newState);
|
|
85
|
+
});
|
|
86
|
+
}, [getUpdatedState]);
|
|
87
|
+
const updateState = (prevState, newState) => {
|
|
88
|
+
const { outerHeightStyle, overflow } = newState;
|
|
89
|
+
// Need a large enough difference to update the height.
|
|
90
|
+
// This prevents infinite rendering loop.
|
|
91
|
+
if (renders.current < 20 &&
|
|
92
|
+
((outerHeightStyle > 0 &&
|
|
93
|
+
Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1) ||
|
|
94
|
+
prevState.overflow !== overflow)) {
|
|
95
|
+
renders.current += 1;
|
|
96
|
+
return {
|
|
97
|
+
overflow,
|
|
98
|
+
outerHeightStyle,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (process.env.NODE_ENV !== "production") {
|
|
102
|
+
if (renders.current === 20) {
|
|
103
|
+
console.error([
|
|
104
|
+
"Textarea: Too many re-renders. The layout is unstable.",
|
|
105
|
+
"TextareaAutosize limits the number of renders to prevent an infinite loop.",
|
|
106
|
+
].join("\n"));
|
|
96
107
|
}
|
|
97
|
-
|
|
108
|
+
}
|
|
109
|
+
return prevState;
|
|
110
|
+
};
|
|
111
|
+
const withFlushSync = () => {
|
|
112
|
+
const newState = getUpdatedState();
|
|
113
|
+
if (isEmpty(newState)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// In React 18, state updates in a ResizeObserver's callback are happening after the paint which causes flickering
|
|
117
|
+
// when doing some visual updates in it. Using flushSync ensures that the dom will be painted after the states updates happen
|
|
118
|
+
// Related issue - https://github.com/facebook/react/issues/24331
|
|
119
|
+
ReactDOM.flushSync(() => {
|
|
120
|
+
setState((prevState) => {
|
|
121
|
+
return updateState(prevState, newState);
|
|
122
|
+
});
|
|
98
123
|
});
|
|
99
|
-
}
|
|
100
|
-
useEffect(() => {
|
|
124
|
+
};
|
|
125
|
+
React.useEffect(() => {
|
|
101
126
|
const handleResize = debounce(() => {
|
|
102
127
|
renders.current = 0;
|
|
103
|
-
|
|
128
|
+
if (inputRef.current) {
|
|
129
|
+
withFlushSync();
|
|
130
|
+
}
|
|
104
131
|
});
|
|
105
|
-
const containerWindow = ownerWindow(inputRef.current);
|
|
106
|
-
containerWindow.addEventListener("resize", handleResize);
|
|
107
132
|
let resizeObserver;
|
|
133
|
+
const input = inputRef.current;
|
|
134
|
+
const containerWindow = ownerWindow(input);
|
|
135
|
+
containerWindow.addEventListener("resize", handleResize);
|
|
108
136
|
if (typeof ResizeObserver !== "undefined") {
|
|
109
137
|
resizeObserver = new ResizeObserver(handleResize);
|
|
110
|
-
resizeObserver.observe(
|
|
138
|
+
resizeObserver.observe(input);
|
|
111
139
|
}
|
|
112
140
|
return () => {
|
|
113
141
|
handleResize.clear();
|
|
@@ -116,7 +144,7 @@ const TextareaAutosize = forwardRef((_a, ref) => {
|
|
|
116
144
|
resizeObserver.disconnect();
|
|
117
145
|
}
|
|
118
146
|
};
|
|
119
|
-
}
|
|
147
|
+
});
|
|
120
148
|
useClientLayoutEffect(() => {
|
|
121
149
|
syncHeight();
|
|
122
150
|
});
|
|
@@ -146,5 +174,11 @@ const TextareaAutosize = forwardRef((_a, ref) => {
|
|
|
146
174
|
// Create a new layer, increase the isolation of the computed values
|
|
147
175
|
transform: "translateZ(0)" }, style) })));
|
|
148
176
|
});
|
|
177
|
+
function isEmpty(obj) {
|
|
178
|
+
return (obj === undefined ||
|
|
179
|
+
obj === null ||
|
|
180
|
+
Object.keys(obj).length === 0 ||
|
|
181
|
+
((obj === null || obj === void 0 ? void 0 : obj.outerHeightStyle) === 0 && !(obj === null || obj === void 0 ? void 0 : obj.overflow)));
|
|
182
|
+
}
|
|
149
183
|
export default TextareaAutosize;
|
|
150
184
|
//# sourceMappingURL=TextareaAutoSize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextareaAutoSize.js","sourceRoot":"","sources":["../../src/util/TextareaAutoSize.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,+GAA+G;AAC/G,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"TextareaAutoSize.js","sourceRoot":"","sources":["../../src/util/TextareaAutoSize.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2",
|
|
4
4
|
"description": "Aksel react-components for NAV designsystem",
|
|
5
5
|
"author": "Aksel | NAV designsystem team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@floating-ui/react": "0.17.0",
|
|
40
|
-
"@navikt/ds-icons": "^2.6.
|
|
40
|
+
"@navikt/ds-icons": "^2.6.2",
|
|
41
41
|
"@radix-ui/react-tabs": "1.0.0",
|
|
42
42
|
"@radix-ui/react-toggle-group": "1.0.0",
|
|
43
43
|
"clsx": "^1.2.1",
|
|
@@ -48,6 +48,10 @@ export interface SearchProps
|
|
|
48
48
|
* Callback for click on clear-button or Escape keydown
|
|
49
49
|
*/
|
|
50
50
|
onClear?: (e: SearchClearEvent) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Callback for Search-button submit
|
|
53
|
+
*/
|
|
54
|
+
onSearchClick?: (value: string) => void;
|
|
51
55
|
/**
|
|
52
56
|
* aria-label on clear button
|
|
53
57
|
* @default "Tøm"
|
|
@@ -76,6 +80,7 @@ export interface SearchContextProps {
|
|
|
76
80
|
disabled?: boolean;
|
|
77
81
|
size: "medium" | "small";
|
|
78
82
|
variant: "primary" | "secondary" | "simple";
|
|
83
|
+
handleClick: () => void;
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
export const SearchContext = React.createContext<SearchContextProps | null>(
|
|
@@ -106,6 +111,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
106
111
|
variant = "primary",
|
|
107
112
|
defaultValue,
|
|
108
113
|
onChange,
|
|
114
|
+
onSearchClick,
|
|
109
115
|
...rest
|
|
110
116
|
} = props;
|
|
111
117
|
|
|
@@ -146,6 +152,10 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
146
152
|
wrapperRef
|
|
147
153
|
);
|
|
148
154
|
|
|
155
|
+
const handleClick = () => {
|
|
156
|
+
onSearchClick?.(`${value ?? internalValue}`);
|
|
157
|
+
};
|
|
158
|
+
|
|
149
159
|
return (
|
|
150
160
|
<div
|
|
151
161
|
ref={setWrapperRef}
|
|
@@ -221,6 +231,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
221
231
|
size,
|
|
222
232
|
disabled: inputProps.disabled,
|
|
223
233
|
variant,
|
|
234
|
+
handleClick,
|
|
224
235
|
}}
|
|
225
236
|
>
|
|
226
237
|
{children ? children : variant !== "simple" && <SearchButton />}
|
|
@@ -17,7 +17,7 @@ export type SearchButtonType = React.ForwardRefExoticComponent<
|
|
|
17
17
|
>;
|
|
18
18
|
|
|
19
19
|
const SearchButton: SearchButtonType = forwardRef(
|
|
20
|
-
({ className, children, disabled, ...rest }, ref) => {
|
|
20
|
+
({ className, children, disabled, onClick, ...rest }, ref) => {
|
|
21
21
|
const context = useContext(SearchContext);
|
|
22
22
|
|
|
23
23
|
if (context === null) {
|
|
@@ -25,7 +25,7 @@ const SearchButton: SearchButtonType = forwardRef(
|
|
|
25
25
|
return null;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const { size, variant } = context;
|
|
28
|
+
const { size, variant, handleClick } = context;
|
|
29
29
|
|
|
30
30
|
return (
|
|
31
31
|
<Button
|
|
@@ -36,6 +36,10 @@ const SearchButton: SearchButtonType = forwardRef(
|
|
|
36
36
|
variant={variant === "secondary" ? "secondary" : "primary"}
|
|
37
37
|
className={cl("navds-search__button-search", className)}
|
|
38
38
|
disabled={context?.disabled ?? disabled}
|
|
39
|
+
onClick={(e) => {
|
|
40
|
+
handleClick();
|
|
41
|
+
onClick?.(e);
|
|
42
|
+
}}
|
|
39
43
|
icon={
|
|
40
44
|
<Search
|
|
41
45
|
{...(children ? { "aria-hidden": true } : { title: "Søk" })}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
/* https://github.com/mui/material-ui/blob/master/packages/mui-base/src/TextareaAutosize/TextareaAutosize.js */
|
|
2
|
-
import React, {
|
|
3
|
-
|
|
4
|
-
useCallback,
|
|
5
|
-
useEffect,
|
|
6
|
-
useMemo,
|
|
7
|
-
useRef,
|
|
8
|
-
useState,
|
|
9
|
-
} from "react";
|
|
2
|
+
import React, { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import ReactDOM from "react-dom";
|
|
10
4
|
import { debounce, mergeRefs, useClientLayoutEffect } from "..";
|
|
11
5
|
|
|
12
6
|
/**
|
|
@@ -50,7 +44,7 @@ const TextareaAutosize = forwardRef<HTMLTextAreaElement, TextareaAutosizeProps>(
|
|
|
50
44
|
const renders = useRef(0);
|
|
51
45
|
const [state, setState] = useState<any>({});
|
|
52
46
|
|
|
53
|
-
const
|
|
47
|
+
const getUpdatedState = React.useCallback(() => {
|
|
54
48
|
if (!inputRef.current || !shadowRef.current) return;
|
|
55
49
|
const input = inputRef.current;
|
|
56
50
|
const containerWindow = ownerWindow(input);
|
|
@@ -102,50 +96,85 @@ const TextareaAutosize = forwardRef<HTMLTextAreaElement, TextareaAutosizeProps>(
|
|
|
102
96
|
outerHeight + (boxSizing === "border-box" ? padding + border : 0);
|
|
103
97
|
const overflow = Math.abs(outerHeight - innerHeight) <= 1;
|
|
104
98
|
|
|
99
|
+
return { outerHeightStyle, overflow };
|
|
100
|
+
}, [maxRows, minRows, other?.placeholder]);
|
|
101
|
+
|
|
102
|
+
const syncHeight = React.useCallback(() => {
|
|
103
|
+
const newState = getUpdatedState();
|
|
104
|
+
|
|
105
|
+
if (isEmpty(newState)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
105
109
|
setState((prevState) => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
renders.current < 20 &&
|
|
110
|
-
((outerHeightStyle > 0 &&
|
|
111
|
-
Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) >
|
|
112
|
-
1) ||
|
|
113
|
-
prevState.overflow !== overflow)
|
|
114
|
-
) {
|
|
115
|
-
renders.current += 1;
|
|
116
|
-
return {
|
|
117
|
-
overflow,
|
|
118
|
-
outerHeightStyle,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
110
|
+
return updateState(prevState, newState);
|
|
111
|
+
});
|
|
112
|
+
}, [getUpdatedState]);
|
|
121
113
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
114
|
+
const updateState = (prevState, newState) => {
|
|
115
|
+
const { outerHeightStyle, overflow } = newState;
|
|
116
|
+
// Need a large enough difference to update the height.
|
|
117
|
+
// This prevents infinite rendering loop.
|
|
118
|
+
if (
|
|
119
|
+
renders.current < 20 &&
|
|
120
|
+
((outerHeightStyle > 0 &&
|
|
121
|
+
Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1) ||
|
|
122
|
+
prevState.overflow !== overflow)
|
|
123
|
+
) {
|
|
124
|
+
renders.current += 1;
|
|
125
|
+
return {
|
|
126
|
+
overflow,
|
|
127
|
+
outerHeightStyle,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (process.env.NODE_ENV !== "production") {
|
|
131
|
+
if (renders.current === 20) {
|
|
132
|
+
console.error(
|
|
133
|
+
[
|
|
134
|
+
"Textarea: Too many re-renders. The layout is unstable.",
|
|
135
|
+
"TextareaAutosize limits the number of renders to prevent an infinite loop.",
|
|
136
|
+
].join("\n")
|
|
137
|
+
);
|
|
131
138
|
}
|
|
139
|
+
}
|
|
140
|
+
return prevState;
|
|
141
|
+
};
|
|
132
142
|
|
|
133
|
-
|
|
143
|
+
const withFlushSync = () => {
|
|
144
|
+
const newState = getUpdatedState();
|
|
145
|
+
|
|
146
|
+
if (isEmpty(newState)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// In React 18, state updates in a ResizeObserver's callback are happening after the paint which causes flickering
|
|
151
|
+
// when doing some visual updates in it. Using flushSync ensures that the dom will be painted after the states updates happen
|
|
152
|
+
// Related issue - https://github.com/facebook/react/issues/24331
|
|
153
|
+
ReactDOM.flushSync(() => {
|
|
154
|
+
setState((prevState) => {
|
|
155
|
+
return updateState(prevState, newState);
|
|
156
|
+
});
|
|
134
157
|
});
|
|
135
|
-
}
|
|
158
|
+
};
|
|
136
159
|
|
|
137
|
-
useEffect(() => {
|
|
160
|
+
React.useEffect(() => {
|
|
138
161
|
const handleResize = debounce(() => {
|
|
139
162
|
renders.current = 0;
|
|
140
|
-
|
|
163
|
+
|
|
164
|
+
if (inputRef.current) {
|
|
165
|
+
withFlushSync();
|
|
166
|
+
}
|
|
141
167
|
});
|
|
142
|
-
|
|
168
|
+
let resizeObserver: ResizeObserver;
|
|
169
|
+
|
|
170
|
+
const input = inputRef.current!;
|
|
171
|
+
const containerWindow = ownerWindow(input);
|
|
172
|
+
|
|
143
173
|
containerWindow.addEventListener("resize", handleResize);
|
|
144
|
-
let resizeObserver;
|
|
145
174
|
|
|
146
175
|
if (typeof ResizeObserver !== "undefined") {
|
|
147
176
|
resizeObserver = new ResizeObserver(handleResize);
|
|
148
|
-
resizeObserver.observe(
|
|
177
|
+
resizeObserver.observe(input);
|
|
149
178
|
}
|
|
150
179
|
|
|
151
180
|
return () => {
|
|
@@ -155,7 +184,7 @@ const TextareaAutosize = forwardRef<HTMLTextAreaElement, TextareaAutosizeProps>(
|
|
|
155
184
|
resizeObserver.disconnect();
|
|
156
185
|
}
|
|
157
186
|
};
|
|
158
|
-
}
|
|
187
|
+
});
|
|
159
188
|
|
|
160
189
|
useClientLayoutEffect(() => {
|
|
161
190
|
syncHeight();
|
|
@@ -221,4 +250,13 @@ const TextareaAutosize = forwardRef<HTMLTextAreaElement, TextareaAutosizeProps>(
|
|
|
221
250
|
}
|
|
222
251
|
);
|
|
223
252
|
|
|
253
|
+
function isEmpty(obj: any) {
|
|
254
|
+
return (
|
|
255
|
+
obj === undefined ||
|
|
256
|
+
obj === null ||
|
|
257
|
+
Object.keys(obj).length === 0 ||
|
|
258
|
+
(obj?.outerHeightStyle === 0 && !obj?.overflow)
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
224
262
|
export default TextareaAutosize;
|