@primer/react 38.29.1-rc.4254fa28f → 38.30.0-rc.dc0369509

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 (52) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/ButtonGroup/ButtonGroup-be1c1123.css +2 -0
  3. package/dist/ButtonGroup/ButtonGroup-be1c1123.css.map +1 -0
  4. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  5. package/dist/ButtonGroup/ButtonGroup.js +1 -0
  6. package/dist/ButtonGroup/ButtonGroup.module.css.js +2 -2
  7. package/dist/Checkbox/Checkbox-7476a7ba.css +2 -0
  8. package/dist/Checkbox/Checkbox-7476a7ba.css.map +1 -0
  9. package/dist/Checkbox/Checkbox.module.css.js +1 -1
  10. package/dist/DataTable/Pagination-aebe86e8.css +2 -0
  11. package/dist/DataTable/Pagination-aebe86e8.css.map +1 -0
  12. package/dist/DataTable/Pagination.module.css.js +1 -1
  13. package/dist/Radio/Radio.d.ts.map +1 -1
  14. package/dist/Radio/Radio.js +2 -1
  15. package/dist/RadioGroup/RadioGroup.js +1 -0
  16. package/dist/RelativeTime/RelativeTime.js +1 -0
  17. package/dist/ScrollableRegion/ScrollableRegion.d.ts.map +1 -1
  18. package/dist/ScrollableRegion/ScrollableRegion.js +1 -0
  19. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  20. package/dist/SegmentedControl/SegmentedControl.js +1 -0
  21. package/dist/SegmentedControl/SegmentedControlButton.d.ts.map +1 -1
  22. package/dist/SegmentedControl/SegmentedControlButton.js +1 -0
  23. package/dist/SegmentedControl/SegmentedControlIconButton.d.ts.map +1 -1
  24. package/dist/SegmentedControl/SegmentedControlIconButton.js +1 -0
  25. package/dist/Select/Select.d.ts.map +1 -1
  26. package/dist/Select/Select.js +6 -2
  27. package/dist/SideNav.d.ts.map +1 -1
  28. package/dist/SideNav.js +2 -0
  29. package/dist/Skeleton/SkeletonBox.d.ts +1 -0
  30. package/dist/Skeleton/SkeletonBox.d.ts.map +1 -1
  31. package/dist/Skeleton/SkeletonBox.js +54 -47
  32. package/dist/SkeletonText/SkeletonText.d.ts.map +1 -1
  33. package/dist/SkeletonText/SkeletonText.js +2 -2
  34. package/dist/Spinner/Spinner.js +1 -0
  35. package/dist/TextInput/TextInput.d.ts.map +1 -1
  36. package/dist/TextInput/TextInput.js +27 -68
  37. package/dist/Textarea/Textarea.d.ts.map +1 -1
  38. package/dist/Textarea/Textarea.js +158 -186
  39. package/dist/_VisuallyHidden.js +2 -2
  40. package/dist/_VisuallyHidden.module.css.js +2 -2
  41. package/dist/live-region/Announce.d.ts.map +1 -1
  42. package/dist/live-region/Announce.js +51 -36
  43. package/dist/utils/character-counter.d.ts +16 -21
  44. package/dist/utils/character-counter.d.ts.map +1 -1
  45. package/dist/utils/character-counter.js +23 -59
  46. package/package.json +2 -2
  47. package/dist/ButtonGroup/ButtonGroup-54ba293b.css +0 -2
  48. package/dist/ButtonGroup/ButtonGroup-54ba293b.css.map +0 -1
  49. package/dist/Checkbox/Checkbox-edc5dc3e.css +0 -2
  50. package/dist/Checkbox/Checkbox-edc5dc3e.css.map +0 -1
  51. package/dist/DataTable/Pagination-b6f8418c.css +0 -2
  52. package/dist/DataTable/Pagination-b6f8418c.css.map +0 -1
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useId, useCallback, useEffect } from 'react';
1
+ import React, { useState, useId, useCallback } from 'react';
2
2
  import { isValidElementType } from 'react-is';
3
3
  import { clsx } from 'clsx';
4
4
  import { AlertFillIcon } from '@primer/octicons-react';
@@ -8,9 +8,11 @@ import { TextInputWrapper } from '../internal/components/TextInputWrapper.js';
8
8
  import TextInputAction from '../internal/components/TextInputInnerAction.js';
9
9
  import UnstyledTextInput from '../internal/components/UnstyledTextInput.js';
10
10
  import VisuallyHidden from '../_VisuallyHidden.js';
11
- import { CharacterCounter } from '../utils/character-counter.js';
11
+ import visuallyHiddenClasses from '../_VisuallyHidden.module.css.js';
12
+ import { SCREEN_READER_DELAY, getCharacterCountState } from '../utils/character-counter.js';
12
13
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
13
14
  import { useProvidedRefOrCreate } from '../hooks/useProvidedRefOrCreate.js';
15
+ import { AriaStatus } from '../live-region/AriaStatus.js';
14
16
  import Text from '../Text/Text.js';
15
17
 
16
18
  // using forwardRef is important so that other components can autofocus the input
@@ -46,16 +48,22 @@ const TextInput = /*#__PURE__*/React.forwardRef(({
46
48
  'data-component': dataComponent,
47
49
  ...inputProps
48
50
  }, ref) => {
51
+ var _counter$isOverLimit;
49
52
  const [isInputFocused, setIsInputFocused] = useState(false);
50
53
  const inputRef = useProvidedRefOrCreate(ref);
51
- const [characterCount, setCharacterCount] = useState('');
52
- const [isOverLimit, setIsOverLimit] = useState(false);
53
- const [screenReaderMessage, setScreenReaderMessage] = useState('');
54
- const characterCounterRef = useRef(null);
55
- const lastCountedLengthRef = useRef(null);
56
- const lastCharacterCountRef = useRef('');
57
- const lastIsOverLimitRef = useRef(false);
58
- const lastScreenReaderMessageRef = useRef('');
54
+
55
+ // For uncontrolled usage we track the length of the input's content so the
56
+ // character counter can be derived during render rather than synced from an
57
+ // effect (which would trigger an extra render on every keystroke). For
58
+ // controlled usage the `value` prop is the source of truth.
59
+ const isControlled = value !== undefined;
60
+ const [uncontrolledLength, setUncontrolledLength] = useState(() => defaultValue !== undefined ? String(defaultValue).length : 0);
61
+ const currentLength = isControlled ? String(value).length : uncontrolledLength;
62
+
63
+ // The counter and validation state are derived directly from the current
64
+ // length, so they stay in sync with the input without an extra render.
65
+ const counter = characterLimit ? getCharacterCountState(currentLength, characterLimit) : undefined;
66
+ const isOverLimit = (_counter$isOverLimit = counter === null || counter === void 0 ? void 0 : counter.isOverLimit) !== null && _counter$isOverLimit !== void 0 ? _counter$isOverLimit : false;
59
67
 
60
68
  // this class is necessary to style FilterSearch, plz no touchy!
61
69
  const wrapperClasses = clsx(className, 'TextInput-wrapper');
@@ -84,63 +92,13 @@ const TextInput = /*#__PURE__*/React.forwardRef(({
84
92
  onBlur && onBlur(e_1);
85
93
  }, [onBlur]);
86
94
 
87
- // Initialize character counter
88
- useEffect(() => {
89
- if (characterLimit) {
90
- characterCounterRef.current = new CharacterCounter({
91
- onCountUpdate: (count, overLimit, message) => {
92
- if (message !== lastCharacterCountRef.current) {
93
- lastCharacterCountRef.current = message;
94
- setCharacterCount(message);
95
- }
96
- if (overLimit !== lastIsOverLimitRef.current) {
97
- lastIsOverLimitRef.current = overLimit;
98
- setIsOverLimit(overLimit);
99
- }
100
- },
101
- onScreenReaderAnnounce: message_0 => {
102
- if (message_0 !== lastScreenReaderMessageRef.current) {
103
- lastScreenReaderMessageRef.current = message_0;
104
- setScreenReaderMessage(message_0);
105
- }
106
- }
107
- });
108
- lastCountedLengthRef.current = null;
109
- return () => {
110
- var _characterCounterRef$;
111
- (_characterCounterRef$ = characterCounterRef.current) === null || _characterCounterRef$ === void 0 ? void 0 : _characterCounterRef$.cleanup();
112
- characterCounterRef.current = null;
113
- lastCountedLengthRef.current = null;
114
- lastCharacterCountRef.current = '';
115
- lastIsOverLimitRef.current = false;
116
- lastScreenReaderMessageRef.current = '';
117
- };
118
- }
119
- }, [characterLimit]);
120
-
121
- // Update character count when value changes or on mount
122
- useEffect(() => {
123
- if (characterLimit && characterCounterRef.current) {
124
- const currentValue = value !== undefined ? String(value) : defaultValue !== undefined ? String(defaultValue) : '';
125
- const currentLength = currentValue.length;
126
- if (currentLength !== lastCountedLengthRef.current) {
127
- lastCountedLengthRef.current = currentLength;
128
- characterCounterRef.current.updateCharacterCount(currentLength, characterLimit);
129
- }
130
- }
131
- }, [value, defaultValue, characterLimit]);
132
-
133
95
  // Handle input change with character counter
134
96
  const handleInputChange = useCallback(e_2 => {
135
- if (characterLimit && characterCounterRef.current) {
136
- const currentLength_0 = e_2.target.value.length;
137
- if (currentLength_0 !== lastCountedLengthRef.current) {
138
- lastCountedLengthRef.current = currentLength_0;
139
- characterCounterRef.current.updateCharacterCount(currentLength_0, characterLimit);
140
- }
97
+ if (characterLimit && !isControlled) {
98
+ setUncontrolledLength(e_2.target.value.length);
141
99
  }
142
100
  onChange === null || onChange === void 0 ? void 0 : onChange(e_2);
143
- }, [onChange, characterLimit]);
101
+ }, [onChange, characterLimit, isControlled]);
144
102
  const characterCountId = useId();
145
103
  const characterCountStaticMessageId = useId();
146
104
  const isValid = isOverLimit ? 'error' : validationStatus;
@@ -202,10 +160,11 @@ const TextInput = /*#__PURE__*/React.forwardRef(({
202
160
  children: typeof TrailingVisual !== 'string' && isValidElementType(TrailingVisual) ? /*#__PURE__*/jsx(TrailingVisual, {}) : TrailingVisual
203
161
  }), trailingAction]
204
162
  }), characterLimit && /*#__PURE__*/jsxs(Fragment, {
205
- children: [/*#__PURE__*/jsx(VisuallyHidden, {
206
- "aria-live": "polite",
207
- role: "status",
208
- children: screenReaderMessage
163
+ children: [/*#__PURE__*/jsx(AriaStatus, {
164
+ announceOnShow: false,
165
+ delayMs: SCREEN_READER_DELAY,
166
+ className: visuallyHiddenClasses.InternalVisuallyHidden,
167
+ children: counter === null || counter === void 0 ? void 0 : counter.message
209
168
  }), /*#__PURE__*/jsxs(VisuallyHidden, {
210
169
  id: characterCountStaticMessageId,
211
170
  children: ["You can enter up to ", characterLimit, " ", characterLimit === 1 ? 'character' : 'characters']
@@ -217,7 +176,7 @@ const TextInput = /*#__PURE__*/React.forwardRef(({
217
176
  "data-component": "TextInput.CharacterCounter",
218
177
  children: [isOverLimit && /*#__PURE__*/jsx(AlertFillIcon, {
219
178
  size: 16
220
- }), characterCount]
179
+ }), counter === null || counter === void 0 ? void 0 : counter.message]
221
180
  })]
222
181
  })]
223
182
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/Textarea/Textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAe,MAAM,OAAO,CAAA;AAC/D,OAAO,KAA8C,MAAM,OAAO,CAAA;AAElE,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAA;AAE7E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAA;AAOlD,eAAO,MAAM,qBAAqB,IAAI,CAAA;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,uBAAuB,SAAS,CAAA;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAA;IACvC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAA;IACpD;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,CAAA;AAE/C;;;GAGG;AACH,QAAA,MAAM,QAAQ;IA/CZ;;OAEG;eACQ,OAAO;IAClB;;OAEG;uBACgB,oBAAoB;IACvC;;OAEG;YACK,OAAO;IACf;;OAEG;aACM,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU;IACpD;;OAEG;eACQ,OAAO;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;YACK,KAAK,CAAC,aAAa;IAC3B;;;OAGG;qBACc,MAAM;2FA2IxB,CAAA;wBAK0B,cAAc,CAAC,OAAO,QAAQ,CAAC;AAA1D,wBAA0D"}
1
+ {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../src/Textarea/Textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAe,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAqC,MAAM,OAAO,CAAA;AAEzD,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAA;AAE7E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAA;AASlD,eAAO,MAAM,qBAAqB,IAAI,CAAA;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,uBAAuB,SAAS,CAAA;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAA;IACvC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAA;IACpD;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,CAAA;AAE/C;;;GAGG;AACH,QAAA,MAAM,QAAQ;IA/CZ;;OAEG;eACQ,OAAO;IAClB;;OAEG;uBACgB,oBAAoB;IACvC;;OAEG;YACK,OAAO;IACf;;OAEG;aACM,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU;IACpD;;OAEG;eACQ,OAAO;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;gBACS,MAAM;IAClB;;OAEG;YACK,KAAK,CAAC,aAAa;IAC3B;;;OAGG;qBACc,MAAM;2FA6HxB,CAAA;wBAK0B,cAAc,CAAC,OAAO,QAAQ,CAAC;AAA1D,wBAA0D"}
@@ -1,12 +1,14 @@
1
1
  import { c } from 'react-compiler-runtime';
2
- import React, { useRef, useId, useEffect } from 'react';
2
+ import React, { useId, useState } from 'react';
3
3
  import { TextInputBaseWrapper } from '../internal/components/TextInputWrapper.js';
4
4
  import classes from './TextArea.module.css.js';
5
5
  import { AlertFillIcon } from '@primer/octicons-react';
6
- import { CharacterCounter } from '../utils/character-counter.js';
6
+ import { SCREEN_READER_DELAY, getCharacterCountState } from '../utils/character-counter.js';
7
7
  import VisuallyHidden from '../_VisuallyHidden.js';
8
+ import visuallyHiddenClasses from '../_VisuallyHidden.module.css.js';
8
9
  import { clsx } from 'clsx';
9
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
+ import { AriaStatus } from '../live-region/AriaStatus.js';
10
12
  import Text from '../Text/Text.js';
11
13
 
12
14
  const DEFAULT_TEXTAREA_ROWS = 7;
@@ -17,7 +19,7 @@ const DEFAULT_TEXTAREA_RESIZE = 'both';
17
19
  * This component accepts all native HTML <textarea> attributes as props.
18
20
  */
19
21
  const Textarea = /*#__PURE__*/React.forwardRef((t0, ref) => {
20
- const $ = c(68);
22
+ const $ = c(76);
21
23
  let block;
22
24
  let characterLimit;
23
25
  let className;
@@ -95,200 +97,170 @@ const Textarea = /*#__PURE__*/React.forwardRef((t0, ref) => {
95
97
  const rows = t1 === undefined ? DEFAULT_TEXTAREA_ROWS : t1;
96
98
  const cols = t2 === undefined ? DEFAULT_TEXTAREA_COLS : t2;
97
99
  const resize = t3 === undefined ? DEFAULT_TEXTAREA_RESIZE : t3;
98
- const [characterCount, setCharacterCount] = React.useState("");
99
- const [isOverLimit, setIsOverLimit] = React.useState(false);
100
- const [screenReaderMessage, setScreenReaderMessage] = React.useState("");
101
- const characterCounterRef = useRef(null);
102
100
  const characterCountId = useId();
103
101
  const characterCountStaticMessageId = useId();
102
+ const isControlled = value !== undefined;
104
103
  let t4;
105
- let t5;
106
- if ($[18] !== characterLimit) {
107
- t4 = () => {
108
- if (characterLimit) {
109
- characterCounterRef.current = new CharacterCounter({
110
- onCountUpdate: (count, overLimit, message) => {
111
- setCharacterCount(message);
112
- setIsOverLimit(overLimit);
113
- },
114
- onScreenReaderAnnounce: message_0 => {
115
- setScreenReaderMessage(message_0);
116
- }
117
- });
118
- return () => {
119
- var _characterCounterRef$;
120
- (_characterCounterRef$ = characterCounterRef.current) === null || _characterCounterRef$ === void 0 ? void 0 : _characterCounterRef$.cleanup();
121
- };
122
- }
123
- };
124
- t5 = [characterLimit];
125
- $[18] = characterLimit;
104
+ if ($[18] !== defaultValue) {
105
+ t4 = () => defaultValue !== undefined ? String(defaultValue).length : 0;
106
+ $[18] = defaultValue;
126
107
  $[19] = t4;
127
- $[20] = t5;
128
108
  } else {
129
109
  t4 = $[19];
130
- t5 = $[20];
131
- }
132
- useEffect(t4, t5);
133
- let t6;
134
- let t7;
135
- if ($[21] !== characterLimit || $[22] !== defaultValue || $[23] !== value) {
136
- t6 = () => {
137
- if (characterLimit && characterCounterRef.current) {
138
- const currentValue = value !== undefined ? String(value) : defaultValue !== undefined ? String(defaultValue) : "";
139
- characterCounterRef.current.updateCharacterCount(currentValue.length, characterLimit);
140
- }
141
- };
142
- t7 = [value, defaultValue, characterLimit];
143
- $[21] = characterLimit;
144
- $[22] = defaultValue;
145
- $[23] = value;
146
- $[24] = t6;
147
- $[25] = t7;
148
- } else {
149
- t6 = $[24];
150
- t7 = $[25];
151
- }
152
- useEffect(t6, t7);
153
- let t8;
154
- if ($[26] !== characterLimit || $[27] !== onChange) {
155
- t8 = e => {
156
- var _onChange;
157
- if (characterLimit && characterCounterRef.current) {
158
- characterCounterRef.current.updateCharacterCount(e.target.value.length, characterLimit);
159
- }
160
- (_onChange = onChange) === null || _onChange === void 0 ? void 0 : _onChange(e);
161
- };
162
- $[26] = characterLimit;
163
- $[27] = onChange;
164
- $[28] = t8;
165
- } else {
166
- t8 = $[28];
167
- }
168
- const handleTextareaChange = t8;
169
- const isValid = isOverLimit ? "error" : validationStatus;
170
- const t9 = isValid === "error" ? "true" : "false";
171
- let t10;
172
- if ($[29] !== maxHeight || $[30] !== minHeight || $[31] !== style) {
173
- t10 = {
174
- minHeight,
175
- maxHeight,
176
- ...style
177
- };
178
- $[29] = maxHeight;
179
- $[30] = minHeight;
180
- $[31] = style;
181
- $[32] = t10;
182
- } else {
183
- t10 = $[32];
184
- }
185
- let t11;
186
- if ($[33] !== characterCountStaticMessageId || $[34] !== characterLimit || $[35] !== rest) {
187
- t11 = characterLimit ? [characterCountStaticMessageId, rest["aria-describedby"]].filter(Boolean).join(" ") || undefined : rest["aria-describedby"];
188
- $[33] = characterCountStaticMessageId;
189
- $[34] = characterLimit;
190
- $[35] = rest;
191
- $[36] = t11;
192
- } else {
193
- t11 = $[36];
194
110
  }
195
- let t12;
196
- if ($[37] !== cols || $[38] !== defaultValue || $[39] !== disabled || $[40] !== handleTextareaChange || $[41] !== ref || $[42] !== required || $[43] !== resize || $[44] !== rest || $[45] !== rows || $[46] !== t10 || $[47] !== t11 || $[48] !== t9 || $[49] !== value) {
197
- t12 = /*#__PURE__*/jsx("textarea", {
198
- value: value,
199
- defaultValue: defaultValue,
200
- "data-resize": resize,
201
- "aria-required": required,
202
- "aria-invalid": t9,
203
- ref: ref,
204
- disabled: disabled,
205
- rows: rows,
206
- cols: cols,
207
- className: classes.TextArea,
208
- onChange: handleTextareaChange,
209
- style: t10,
210
- ...rest,
211
- "aria-describedby": t11
212
- });
213
- $[37] = cols;
214
- $[38] = defaultValue;
215
- $[39] = disabled;
216
- $[40] = handleTextareaChange;
217
- $[41] = ref;
218
- $[42] = required;
219
- $[43] = resize;
220
- $[44] = rest;
221
- $[45] = rows;
222
- $[46] = t10;
223
- $[47] = t11;
224
- $[48] = t9;
225
- $[49] = value;
226
- $[50] = t12;
227
- } else {
228
- t12 = $[50];
229
- }
230
- let t13;
231
- if ($[51] !== block || $[52] !== className || $[53] !== contrast || $[54] !== disabled || $[55] !== isValid || $[56] !== t12) {
232
- t13 = /*#__PURE__*/jsx(TextInputBaseWrapper, {
233
- validationStatus: isValid,
234
- disabled: disabled,
235
- block: block,
236
- contrast: contrast,
237
- className: className,
238
- children: t12
239
- });
240
- $[51] = block;
241
- $[52] = className;
242
- $[53] = contrast;
243
- $[54] = disabled;
244
- $[55] = isValid;
245
- $[56] = t12;
246
- $[57] = t13;
247
- } else {
248
- t13 = $[57];
249
- }
250
- let t14;
251
- if ($[58] !== characterCount || $[59] !== characterCountId || $[60] !== characterCountStaticMessageId || $[61] !== characterLimit || $[62] !== isOverLimit || $[63] !== screenReaderMessage) {
252
- t14 = characterLimit && /*#__PURE__*/jsxs(Fragment, {
253
- children: [/*#__PURE__*/jsx(VisuallyHidden, {
254
- "aria-live": "polite",
255
- role: "status",
256
- children: screenReaderMessage
257
- }), /*#__PURE__*/jsxs(VisuallyHidden, {
258
- id: characterCountStaticMessageId,
259
- children: ["You can enter up to ", characterLimit, " ", characterLimit === 1 ? "character" : "characters"]
260
- }), /*#__PURE__*/jsxs(Text, {
261
- "aria-hidden": "true",
262
- id: characterCountId,
263
- size: "small",
264
- className: clsx(classes.CharacterCounter, isOverLimit && classes["CharacterCounter--error"]),
265
- children: [isOverLimit && /*#__PURE__*/jsx(AlertFillIcon, {
266
- size: 16
267
- }), characterCount]
111
+ const [uncontrolledLength, setUncontrolledLength] = useState(t4);
112
+ const currentLength = isControlled ? String(value).length : uncontrolledLength;
113
+ let t5;
114
+ if ($[20] !== block || $[21] !== characterCountId || $[22] !== characterCountStaticMessageId || $[23] !== characterLimit || $[24] !== className || $[25] !== cols || $[26] !== contrast || $[27] !== currentLength || $[28] !== defaultValue || $[29] !== disabled || $[30] !== isControlled || $[31] !== maxHeight || $[32] !== minHeight || $[33] !== onChange || $[34] !== ref || $[35] !== required || $[36] !== resize || $[37] !== rest || $[38] !== rows || $[39] !== style || $[40] !== validationStatus || $[41] !== value) {
115
+ var _counter$isOverLimit;
116
+ const counter = characterLimit ? getCharacterCountState(currentLength, characterLimit) : undefined;
117
+ const isOverLimit = (_counter$isOverLimit = counter === null || counter === void 0 ? void 0 : counter.isOverLimit) !== null && _counter$isOverLimit !== void 0 ? _counter$isOverLimit : false;
118
+ let t6;
119
+ if ($[43] !== characterLimit || $[44] !== isControlled || $[45] !== onChange) {
120
+ t6 = e => {
121
+ var _onChange;
122
+ if (characterLimit && !isControlled) {
123
+ setUncontrolledLength(e.target.value.length);
124
+ }
125
+ (_onChange = onChange) === null || _onChange === void 0 ? void 0 : _onChange(e);
126
+ };
127
+ $[43] = characterLimit;
128
+ $[44] = isControlled;
129
+ $[45] = onChange;
130
+ $[46] = t6;
131
+ } else {
132
+ t6 = $[46];
133
+ }
134
+ const handleTextareaChange = t6;
135
+ const isValid = isOverLimit ? "error" : validationStatus;
136
+ const t7 = isValid === "error" ? "true" : "false";
137
+ let t8;
138
+ if ($[47] !== maxHeight || $[48] !== minHeight || $[49] !== style) {
139
+ t8 = {
140
+ minHeight,
141
+ maxHeight,
142
+ ...style
143
+ };
144
+ $[47] = maxHeight;
145
+ $[48] = minHeight;
146
+ $[49] = style;
147
+ $[50] = t8;
148
+ } else {
149
+ t8 = $[50];
150
+ }
151
+ let t9;
152
+ if ($[51] !== characterCountStaticMessageId || $[52] !== characterLimit || $[53] !== rest) {
153
+ t9 = characterLimit ? [characterCountStaticMessageId, rest["aria-describedby"]].filter(Boolean).join(" ") || undefined : rest["aria-describedby"];
154
+ $[51] = characterCountStaticMessageId;
155
+ $[52] = characterLimit;
156
+ $[53] = rest;
157
+ $[54] = t9;
158
+ } else {
159
+ t9 = $[54];
160
+ }
161
+ let t10;
162
+ if ($[55] !== cols || $[56] !== defaultValue || $[57] !== disabled || $[58] !== handleTextareaChange || $[59] !== ref || $[60] !== required || $[61] !== resize || $[62] !== rest || $[63] !== rows || $[64] !== t7 || $[65] !== t8 || $[66] !== t9 || $[67] !== value) {
163
+ t10 = /*#__PURE__*/jsx("textarea", {
164
+ value: value,
165
+ defaultValue: defaultValue,
166
+ "data-resize": resize,
167
+ "aria-required": required,
168
+ "aria-invalid": t7,
169
+ ref: ref,
170
+ disabled: disabled,
171
+ rows: rows,
172
+ cols: cols,
173
+ className: classes.TextArea,
174
+ onChange: handleTextareaChange,
175
+ style: t8,
176
+ ...rest,
177
+ "aria-describedby": t9
178
+ });
179
+ $[55] = cols;
180
+ $[56] = defaultValue;
181
+ $[57] = disabled;
182
+ $[58] = handleTextareaChange;
183
+ $[59] = ref;
184
+ $[60] = required;
185
+ $[61] = resize;
186
+ $[62] = rest;
187
+ $[63] = rows;
188
+ $[64] = t7;
189
+ $[65] = t8;
190
+ $[66] = t9;
191
+ $[67] = value;
192
+ $[68] = t10;
193
+ } else {
194
+ t10 = $[68];
195
+ }
196
+ let t11;
197
+ if ($[69] !== block || $[70] !== className || $[71] !== contrast || $[72] !== disabled || $[73] !== isValid || $[74] !== t10) {
198
+ t11 = /*#__PURE__*/jsx(TextInputBaseWrapper, {
199
+ validationStatus: isValid,
200
+ disabled: disabled,
201
+ block: block,
202
+ contrast: contrast,
203
+ className: className,
204
+ children: t10
205
+ });
206
+ $[69] = block;
207
+ $[70] = className;
208
+ $[71] = contrast;
209
+ $[72] = disabled;
210
+ $[73] = isValid;
211
+ $[74] = t10;
212
+ $[75] = t11;
213
+ } else {
214
+ t11 = $[75];
215
+ }
216
+ t5 = /*#__PURE__*/jsxs(Fragment, {
217
+ children: [t11, characterLimit && /*#__PURE__*/jsxs(Fragment, {
218
+ children: [/*#__PURE__*/jsx(AriaStatus, {
219
+ announceOnShow: false,
220
+ delayMs: SCREEN_READER_DELAY,
221
+ className: visuallyHiddenClasses.InternalVisuallyHidden,
222
+ children: counter === null || counter === void 0 ? void 0 : counter.message
223
+ }), /*#__PURE__*/jsxs(VisuallyHidden, {
224
+ id: characterCountStaticMessageId,
225
+ children: ["You can enter up to ", characterLimit, " ", characterLimit === 1 ? "character" : "characters"]
226
+ }), /*#__PURE__*/jsxs(Text, {
227
+ "aria-hidden": "true",
228
+ id: characterCountId,
229
+ size: "small",
230
+ className: clsx(classes.CharacterCounter, isOverLimit && classes["CharacterCounter--error"]),
231
+ children: [isOverLimit && /*#__PURE__*/jsx(AlertFillIcon, {
232
+ size: 16
233
+ }), counter === null || counter === void 0 ? void 0 : counter.message]
234
+ })]
268
235
  })]
269
236
  });
270
- $[58] = characterCount;
271
- $[59] = characterCountId;
272
- $[60] = characterCountStaticMessageId;
273
- $[61] = characterLimit;
274
- $[62] = isOverLimit;
275
- $[63] = screenReaderMessage;
276
- $[64] = t14;
277
- } else {
278
- t14 = $[64];
279
- }
280
- let t15;
281
- if ($[65] !== t13 || $[66] !== t14) {
282
- t15 = /*#__PURE__*/jsxs(Fragment, {
283
- children: [t13, t14]
284
- });
285
- $[65] = t13;
286
- $[66] = t14;
287
- $[67] = t15;
237
+ $[20] = block;
238
+ $[21] = characterCountId;
239
+ $[22] = characterCountStaticMessageId;
240
+ $[23] = characterLimit;
241
+ $[24] = className;
242
+ $[25] = cols;
243
+ $[26] = contrast;
244
+ $[27] = currentLength;
245
+ $[28] = defaultValue;
246
+ $[29] = disabled;
247
+ $[30] = isControlled;
248
+ $[31] = maxHeight;
249
+ $[32] = minHeight;
250
+ $[33] = onChange;
251
+ $[34] = ref;
252
+ $[35] = required;
253
+ $[36] = resize;
254
+ $[37] = rest;
255
+ $[38] = rows;
256
+ $[39] = style;
257
+ $[40] = validationStatus;
258
+ $[41] = value;
259
+ $[42] = t5;
288
260
  } else {
289
- t15 = $[67];
261
+ t5 = $[42];
290
262
  }
291
- return t15;
263
+ return t5;
292
264
  });
293
265
  Textarea.displayName = 'Textarea';
294
266
  Textarea.__SLOT__ = Symbol('Textarea');
@@ -1,5 +1,5 @@
1
1
  import { c } from 'react-compiler-runtime';
2
- import classes from './_VisuallyHidden.module.css.js';
2
+ import visuallyHiddenClasses from './_VisuallyHidden.module.css.js';
3
3
  import { clsx } from 'clsx';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -36,7 +36,7 @@ function VisuallyHidden(t0) {
36
36
  let t2;
37
37
  if ($[6] !== className || $[7] !== t1) {
38
38
  t2 = clsx(className, {
39
- [classes.InternalVisuallyHidden]: t1
39
+ [visuallyHiddenClasses.InternalVisuallyHidden]: t1
40
40
  });
41
41
  $[6] = className;
42
42
  $[7] = t1;
@@ -1,5 +1,5 @@
1
1
  import './_VisuallyHidden-1f156b61.css';
2
2
 
3
- var classes = {"InternalVisuallyHidden":"prc-src-InternalVisuallyHidden-2YaI6"};
3
+ var visuallyHiddenClasses = {"InternalVisuallyHidden":"prc-src-InternalVisuallyHidden-2YaI6"};
4
4
 
5
- export { classes as default };
5
+ export { visuallyHiddenClasses as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Announce.d.ts","sourceRoot":"","sources":["../../src/live-region/Announce.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAA;AAEjE,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,KAAK,CAAC,WAAW,IAAI,gBAAgB,CACxE,EAAE,EACF,KAAK,EACL;IACE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;CACpC,CACF,CAAA;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,qBAwGtF"}
1
+ {"version":3,"file":"Announce.d.ts","sourceRoot":"","sources":["../../src/live-region/Announce.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAA;AAEjE,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,KAAK,CAAC,WAAW,IAAI,gBAAgB,CACxE,EAAE,EACF,KAAK,EACL;IACE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;CACpC,CACF,CAAA;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,qBAsGtF"}