@spark-web/text-input 2.0.4 → 4.0.0-rc.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.
@@ -1,279 +0,0 @@
1
- import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';
2
- import { Box } from '@spark-web/box';
3
- import { useFieldContext, FieldContextProvider } from '@spark-web/field';
4
- import { useTheme } from '@spark-web/theme';
5
- import { useMemo, createContext, Children, isValidElement, forwardRef } from 'react';
6
- import { jsx, jsxs } from 'react/jsx-runtime';
7
- import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';
8
- import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
9
- import { css } from '@emotion/css';
10
- import { useFocusRing } from '@spark-web/a11y';
11
- import { useOverflowStrategy, useText } from '@spark-web/text';
12
-
13
- /**
14
- * Components like the `SelectInput` may subscribe to the adornment context and
15
- * change their appearance or behaviour.
16
- */
17
- var InputAdornmentContext = /*#__PURE__*/createContext(null);
18
- var placementToPadding = {
19
- start: {
20
- paddingLeft: 'medium',
21
- paddingRight: 'xsmall'
22
- },
23
- end: {
24
- paddingLeft: 'xsmall',
25
- paddingRight: 'medium'
26
- }
27
- };
28
-
29
- /**
30
- * Places an element at the "start" or "end" of the input, only one adornment
31
- * may be provided for each placement. By default, the adornment element will be
32
- * wrapped to provide alignment and spacing, use the "raw" property to opt-out
33
- * of this behaviour.
34
- *
35
- * @example
36
- * <TextInput>
37
- * <InputAdornment placement="start">
38
- * <Text tone="placeholder">$</Text>
39
- * </InputAdornment>
40
- * </TextInput>
41
- */
42
- var InputAdornment = function InputAdornment(_ref) {
43
- var children = _ref.children,
44
- fieldLabel = _ref.fieldLabel,
45
- placement = _ref.placement,
46
- raw = _ref.raw;
47
- var theme = useTheme();
48
- var adornmentContext = useMemo(function () {
49
- return {
50
- placement: placement
51
- };
52
- }, [placement]);
53
- var _placementToPadding$p = placementToPadding[placement],
54
- paddingLeft = _placementToPadding$p.paddingLeft,
55
- paddingRight = _placementToPadding$p.paddingRight;
56
- var content = children;
57
-
58
- if (!raw) {
59
- content = /*#__PURE__*/jsx(Box, {
60
- paddingLeft: paddingLeft,
61
- paddingRight: paddingRight,
62
- children: /*#__PURE__*/jsx(Box, {
63
- display: "flex",
64
- alignItems: "center",
65
- justifyContent: "center",
66
- style: {
67
- minWidth: theme.sizing.xxsmall
68
- },
69
- children: children
70
- })
71
- });
72
- }
73
-
74
- var wrappedContent = /*#__PURE__*/jsx(InputAdornmentContext.Provider, {
75
- value: adornmentContext,
76
- children: content
77
- });
78
-
79
- if (fieldLabel) {
80
- return /*#__PURE__*/jsx(FieldAdornment, {
81
- fieldLabel: fieldLabel,
82
- children: wrappedContent
83
- });
84
- }
85
-
86
- return wrappedContent;
87
- };
88
- /**
89
- * Wrap the element with a field provider to override the parent field label.
90
- * Only split-out from `InputAdornment` to avoid the conditional hook rule.
91
- */
92
-
93
- var FieldAdornment = function FieldAdornment(_ref2) {
94
- var children = _ref2.children,
95
- fieldLabel = _ref2.fieldLabel;
96
- var parentFieldContext = useFieldContext();
97
- var fieldContext = useMemo(function () {
98
- return _objectSpread(_objectSpread({}, parentFieldContext), {}, {
99
- accessibilityLabel: fieldLabel
100
- });
101
- }, [fieldLabel, parentFieldContext]);
102
- return /*#__PURE__*/jsx(FieldContextProvider, {
103
- value: fieldContext,
104
- children: children
105
- });
106
- };
107
-
108
- var _excluded$1 = ["children", "startAdornment", "endAdornment"];
109
- var InputContainer = function InputContainer(_ref) {
110
- var children = _ref.children,
111
- startAdornment = _ref.startAdornment,
112
- endAdornment = _ref.endAdornment,
113
- boxProps = _objectWithoutProperties(_ref, _excluded$1);
114
-
115
- var _useFieldContext = useFieldContext(),
116
- _useFieldContext2 = _slicedToArray(_useFieldContext, 1),
117
- _useFieldContext2$ = _useFieldContext2[0],
118
- disabled = _useFieldContext2$.disabled,
119
- invalid = _useFieldContext2$.invalid;
120
-
121
- return /*#__PURE__*/jsxs(Box, _objectSpread(_objectSpread({
122
- borderRadius: "small",
123
- position: "relative",
124
- background: disabled ? 'inputDisabled' : 'input'
125
- }, boxProps), {}, {
126
- children: [startAdornment, children, /*#__PURE__*/jsx(FocusIndicator, {
127
- invalid: invalid
128
- }), endAdornment]
129
- }));
130
- };
131
-
132
- var FocusIndicator = function FocusIndicator(_ref2) {
133
- var invalid = _ref2.invalid;
134
- return /*#__PURE__*/jsx(Box, {
135
- "aria-hidden": "true",
136
- as: "span",
137
- data: {
138
- 'focus-indicator': 'true'
139
- } // Styles
140
- ,
141
- border: invalid ? 'critical' : 'field',
142
- borderRadius: "small",
143
- position: "absolute",
144
- bottom: 0,
145
- left: 0,
146
- right: 0,
147
- top: 0,
148
- className: css({
149
- pointerEvents: 'none'
150
- })
151
- });
152
- };
153
-
154
- /**
155
- * Map children for placement within the `TextInput` flex container. Ensures that
156
- * placeholders are provided for unused placements.
157
- */
158
- var childrenToAdornments = function childrenToAdornments(children) {
159
- var startAdornment = null;
160
- var endAdornment = null;
161
-
162
- if (!children) {
163
- return {
164
- startAdornment: startAdornment,
165
- endAdornment: endAdornment
166
- };
167
- }
168
-
169
- Children.forEach(children, function (child) {
170
- if ( /*#__PURE__*/isValidElement(child)) {
171
- if (child.props.placement === 'end') {
172
- endAdornment = child;
173
- }
174
-
175
- if (child.props.placement === 'start') {
176
- startAdornment = child;
177
- }
178
- }
179
- });
180
- return {
181
- startAdornment: startAdornment,
182
- endAdornment: endAdornment
183
- };
184
- };
185
-
186
- var _excluded = ["children", "data"];
187
-
188
- /** Organize and emphasize information quickly and effectively in a list of text elements. */
189
- var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
190
- var children = _ref.children,
191
- data = _ref.data,
192
- consumerProps = _objectWithoutProperties(_ref, _excluded);
193
-
194
- var _useFieldContext = useFieldContext(),
195
- _useFieldContext2 = _slicedToArray(_useFieldContext, 2),
196
- _useFieldContext2$ = _useFieldContext2[0],
197
- disabled = _useFieldContext2$.disabled,
198
- invalid = _useFieldContext2$.invalid,
199
- a11yProps = _useFieldContext2[1];
200
-
201
- var _childrenToAdornments = childrenToAdornments(children),
202
- startAdornment = _childrenToAdornments.startAdornment,
203
- endAdornment = _childrenToAdornments.endAdornment;
204
-
205
- var _useInputStyles = useInputStyles({
206
- disabled: disabled,
207
- invalid: invalid,
208
- startAdornment: Boolean(startAdornment),
209
- endAdornment: Boolean(endAdornment)
210
- }),
211
- _useInputStyles2 = _slicedToArray(_useInputStyles, 2),
212
- boxProps = _useInputStyles2[0],
213
- inputStyles = _useInputStyles2[1];
214
-
215
- return /*#__PURE__*/jsx(InputContainer, {
216
- display: "inline-flex",
217
- alignItems: "center",
218
- startAdornment: startAdornment,
219
- endAdornment: endAdornment,
220
- children: /*#__PURE__*/jsx(Box, _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, boxProps), consumerProps), a11yProps), {}, {
221
- as: "input",
222
- className: css(inputStyles),
223
- data: data,
224
- disabled: disabled,
225
- ref: forwardedRef
226
- }))
227
- });
228
- });
229
- TextInput.displayName = 'TextInput';
230
-
231
- /**
232
- * Returns a tuple where the first item is an object of props to spread onto the
233
- * underlying Box component that our inputs are created with, and the second
234
- * item is a CSS object to be passed to Emotion's `css` function
235
- **/
236
- var useInputStyles = function useInputStyles(_ref2) {
237
- var disabled = _ref2.disabled,
238
- startAdornment = _ref2.startAdornment,
239
- endAdornment = _ref2.endAdornment;
240
- var theme = useTheme();
241
- var overflowStyles = useOverflowStrategy('truncate');
242
- var focusRingStyles = useFocusRing({
243
- always: true
244
- });
245
- var textStyles = useText({
246
- baseline: false,
247
- tone: disabled ? 'disabled' : 'neutral',
248
- size: 'standard',
249
- weight: 'regular'
250
- });
251
-
252
- var _textStyles = _slicedToArray(textStyles, 2),
253
- typographyStyles = _textStyles[0],
254
- responsiveStyles = _textStyles[1];
255
-
256
- return [{
257
- flex: 1,
258
- position: 'relative',
259
- height: 'medium',
260
- paddingLeft: startAdornment ? 'none' : 'medium',
261
- paddingRight: endAdornment ? 'none' : 'medium',
262
- shadow: 'small',
263
- width: 'full'
264
- }, _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), overflowStyles), {}, {
265
- ':enabled': {
266
- ':focus + [data-focus-indicator]': _objectSpread({
267
- borderColor: theme.border.color.fieldAccent
268
- }, focusRingStyles)
269
- },
270
- ':focus': {
271
- outline: 'none'
272
- },
273
- '&[aria-invalid=true]': {
274
- color: theme.color.foreground.muted
275
- }
276
- })];
277
- };
278
-
279
- export { InputAdornment, InputContainer, TextInput, useInputStyles };