@spark-web/text-input 1.1.1 → 1.2.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,4 +1,6 @@
1
1
  export { InputAdornment } from './InputAdornment';
2
+ export { InputContainer } from './InputContainer';
2
3
  export { TextInput, useInput } from './TextInput';
3
4
  export type { AdornmentChild } from './childrenToAdornments';
5
+ export type { InputContainerProps } from './InputContainer';
4
6
  export type { TextInputProps, UseInputProps } from './TextInput';
@@ -112,6 +112,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
112
112
  });
113
113
  };
114
114
 
115
+ var _excluded$1 = ["children", "startAdornment", "endAdornment"];
116
+ var InputContainer = function InputContainer(_ref) {
117
+ var children = _ref.children,
118
+ startAdornment = _ref.startAdornment,
119
+ endAdornment = _ref.endAdornment,
120
+ boxProps = _objectWithoutProperties(_ref, _excluded$1);
121
+
122
+ var _useFieldContext = field.useFieldContext(),
123
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 1),
124
+ _useFieldContext2$ = _useFieldContext2[0],
125
+ disabled = _useFieldContext2$.disabled,
126
+ invalid = _useFieldContext2$.invalid;
127
+
128
+ return /*#__PURE__*/jsxRuntime.jsxs(box.Box, _objectSpread(_objectSpread({
129
+ position: "relative",
130
+ background: disabled ? 'inputDisabled' : 'input'
131
+ }, boxProps), {}, {
132
+ children: [startAdornment, children, /*#__PURE__*/jsxRuntime.jsx(FocusIndicator, {
133
+ invalid: invalid
134
+ }), endAdornment]
135
+ }));
136
+ };
137
+
138
+ var FocusIndicator = function FocusIndicator(_ref2) {
139
+ var invalid = _ref2.invalid;
140
+ return /*#__PURE__*/jsxRuntime.jsx(box.Box, {
141
+ "aria-hidden": "true",
142
+ as: "span",
143
+ data: {
144
+ 'focus-indicator': 'true'
145
+ } // Styles
146
+ ,
147
+ border: invalid ? 'critical' : 'field',
148
+ borderRadius: "small",
149
+ position: "absolute",
150
+ bottom: 0,
151
+ left: 0,
152
+ right: 0,
153
+ top: 0,
154
+ className: css.css({
155
+ pointerEvents: 'none'
156
+ })
157
+ });
158
+ };
159
+
115
160
  /**
116
161
  * Map children for placement within the `TextInput` flex container. Ensures that
117
162
  * placeholders are provided for unused placements.
@@ -144,8 +189,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
144
189
  };
145
190
  };
146
191
 
147
- var _excluded = ["children", "data"],
148
- _excluded2 = ["disabled", "invalid"];
192
+ var _excluded = ["children", "data"];
149
193
 
150
194
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
151
195
  var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
@@ -154,32 +198,27 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
154
198
  consumerProps = _objectWithoutProperties(_ref, _excluded);
155
199
 
156
200
  var _useFieldContext = field.useFieldContext(),
157
- disabled = _useFieldContext.disabled,
158
- invalid = _useFieldContext.invalid,
159
- a11yProps = _objectWithoutProperties(_useFieldContext, _excluded2);
201
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 2),
202
+ _useFieldContext2$ = _useFieldContext2[0],
203
+ disabled = _useFieldContext2$.disabled,
204
+ invalid = _useFieldContext2$.invalid,
205
+ a11yProps = _useFieldContext2[1];
160
206
 
161
207
  var _childrenToAdornments = childrenToAdornments(children),
162
208
  startAdornment = _childrenToAdornments.startAdornment,
163
209
  endAdornment = _childrenToAdornments.endAdornment;
164
210
 
165
- return /*#__PURE__*/jsxRuntime.jsxs(box.Box, {
166
- background: disabled ? 'inputDisabled' : 'input',
167
- border: invalid ? 'critical' : 'field',
168
- borderRadius: "small",
211
+ return /*#__PURE__*/jsxRuntime.jsx(InputContainer, {
169
212
  display: "inline-flex",
170
213
  alignItems: "center",
171
- flexDirection: "row",
172
- height: "medium",
173
- marginY: "none",
174
- className: css.css(useInput({
175
- disabled: disabled,
176
- invalid: invalid
177
- })),
178
- children: [startAdornment, /*#__PURE__*/jsxRuntime.jsx(box.Box, _objectSpread(_objectSpread({
214
+ startAdornment: startAdornment,
215
+ endAdornment: endAdornment,
216
+ children: /*#__PURE__*/jsxRuntime.jsx(box.Box, _objectSpread(_objectSpread(_objectSpread({}, consumerProps), a11yProps), {}, {
179
217
  as: "input",
180
- "aria-invalid": invalid || undefined,
181
218
  ref: forwardedRef,
182
- disabled: disabled // Styles
219
+ data: data,
220
+ disabled: disabled,
221
+ position: "relative" // Styles
183
222
  ,
184
223
  flex: 1,
185
224
  height: "medium",
@@ -188,18 +227,14 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
188
227
  paddingRight: endAdornment ? 'none' : 'medium',
189
228
  className: css.css(useInput({
190
229
  disabled: disabled,
191
- invalid: invalid,
192
- isNested: true
193
- })),
194
- data: data
195
- }, a11yProps), consumerProps)), endAdornment]
230
+ invalid: invalid
231
+ }))
232
+ }))
196
233
  });
197
234
  });
198
235
  TextInput.displayName = 'TextInput';
199
236
  var useInput = function useInput(_ref2) {
200
- var disabled = _ref2.disabled,
201
- _ref2$isNested = _ref2.isNested,
202
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
237
+ var disabled = _ref2.disabled;
203
238
  var theme$1 = theme.useTheme();
204
239
  var focusRingStyles = a11y.useFocusRing({
205
240
  always: true
@@ -215,27 +250,19 @@ var useInput = function useInput(_ref2) {
215
250
  typographyStyles = _textStyles[0],
216
251
  responsiveStyles = _textStyles[1];
217
252
 
218
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
253
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
219
254
  ':focus': {
220
- // This removes the nested input outline visibility since
221
- // the wrapper will be outlined, but still visibly focusable
222
- // to windows high contrast mode users.
223
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
224
- outline: '2px solid transparent',
225
- outlineOffset: '2px'
226
- }
227
- } : {
255
+ outline: 'none'
256
+ },
228
257
  ':enabled': {
229
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
258
+ ':focus + [data-focus-indicator]': _objectSpread({
230
259
  borderColor: theme$1.border.color.fieldAccent
231
- })
232
- },
233
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
234
- borderColor: theme$1.border.color.fieldAccent
235
- })
260
+ }, focusRingStyles)
261
+ }
236
262
  });
237
263
  };
238
264
 
239
265
  exports.InputAdornment = InputAdornment;
266
+ exports.InputContainer = InputContainer;
240
267
  exports.TextInput = TextInput;
241
268
  exports.useInput = useInput;
@@ -112,6 +112,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
112
112
  });
113
113
  };
114
114
 
115
+ var _excluded$1 = ["children", "startAdornment", "endAdornment"];
116
+ var InputContainer = function InputContainer(_ref) {
117
+ var children = _ref.children,
118
+ startAdornment = _ref.startAdornment,
119
+ endAdornment = _ref.endAdornment,
120
+ boxProps = _objectWithoutProperties(_ref, _excluded$1);
121
+
122
+ var _useFieldContext = field.useFieldContext(),
123
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 1),
124
+ _useFieldContext2$ = _useFieldContext2[0],
125
+ disabled = _useFieldContext2$.disabled,
126
+ invalid = _useFieldContext2$.invalid;
127
+
128
+ return /*#__PURE__*/jsxRuntime.jsxs(box.Box, _objectSpread(_objectSpread({
129
+ position: "relative",
130
+ background: disabled ? 'inputDisabled' : 'input'
131
+ }, boxProps), {}, {
132
+ children: [startAdornment, children, /*#__PURE__*/jsxRuntime.jsx(FocusIndicator, {
133
+ invalid: invalid
134
+ }), endAdornment]
135
+ }));
136
+ };
137
+
138
+ var FocusIndicator = function FocusIndicator(_ref2) {
139
+ var invalid = _ref2.invalid;
140
+ return /*#__PURE__*/jsxRuntime.jsx(box.Box, {
141
+ "aria-hidden": "true",
142
+ as: "span",
143
+ data: {
144
+ 'focus-indicator': 'true'
145
+ } // Styles
146
+ ,
147
+ border: invalid ? 'critical' : 'field',
148
+ borderRadius: "small",
149
+ position: "absolute",
150
+ bottom: 0,
151
+ left: 0,
152
+ right: 0,
153
+ top: 0,
154
+ className: css.css({
155
+ pointerEvents: 'none'
156
+ })
157
+ });
158
+ };
159
+
115
160
  /**
116
161
  * Map children for placement within the `TextInput` flex container. Ensures that
117
162
  * placeholders are provided for unused placements.
@@ -144,8 +189,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
144
189
  };
145
190
  };
146
191
 
147
- var _excluded = ["children", "data"],
148
- _excluded2 = ["disabled", "invalid"];
192
+ var _excluded = ["children", "data"];
149
193
 
150
194
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
151
195
  var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
@@ -154,32 +198,27 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
154
198
  consumerProps = _objectWithoutProperties(_ref, _excluded);
155
199
 
156
200
  var _useFieldContext = field.useFieldContext(),
157
- disabled = _useFieldContext.disabled,
158
- invalid = _useFieldContext.invalid,
159
- a11yProps = _objectWithoutProperties(_useFieldContext, _excluded2);
201
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 2),
202
+ _useFieldContext2$ = _useFieldContext2[0],
203
+ disabled = _useFieldContext2$.disabled,
204
+ invalid = _useFieldContext2$.invalid,
205
+ a11yProps = _useFieldContext2[1];
160
206
 
161
207
  var _childrenToAdornments = childrenToAdornments(children),
162
208
  startAdornment = _childrenToAdornments.startAdornment,
163
209
  endAdornment = _childrenToAdornments.endAdornment;
164
210
 
165
- return /*#__PURE__*/jsxRuntime.jsxs(box.Box, {
166
- background: disabled ? 'inputDisabled' : 'input',
167
- border: invalid ? 'critical' : 'field',
168
- borderRadius: "small",
211
+ return /*#__PURE__*/jsxRuntime.jsx(InputContainer, {
169
212
  display: "inline-flex",
170
213
  alignItems: "center",
171
- flexDirection: "row",
172
- height: "medium",
173
- marginY: "none",
174
- className: css.css(useInput({
175
- disabled: disabled,
176
- invalid: invalid
177
- })),
178
- children: [startAdornment, /*#__PURE__*/jsxRuntime.jsx(box.Box, _objectSpread(_objectSpread({
214
+ startAdornment: startAdornment,
215
+ endAdornment: endAdornment,
216
+ children: /*#__PURE__*/jsxRuntime.jsx(box.Box, _objectSpread(_objectSpread(_objectSpread({}, consumerProps), a11yProps), {}, {
179
217
  as: "input",
180
- "aria-invalid": invalid || undefined,
181
218
  ref: forwardedRef,
182
- disabled: disabled // Styles
219
+ data: data,
220
+ disabled: disabled,
221
+ position: "relative" // Styles
183
222
  ,
184
223
  flex: 1,
185
224
  height: "medium",
@@ -188,18 +227,14 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
188
227
  paddingRight: endAdornment ? 'none' : 'medium',
189
228
  className: css.css(useInput({
190
229
  disabled: disabled,
191
- invalid: invalid,
192
- isNested: true
193
- })),
194
- data: data
195
- }, a11yProps), consumerProps)), endAdornment]
230
+ invalid: invalid
231
+ }))
232
+ }))
196
233
  });
197
234
  });
198
235
  TextInput.displayName = 'TextInput';
199
236
  var useInput = function useInput(_ref2) {
200
- var disabled = _ref2.disabled,
201
- _ref2$isNested = _ref2.isNested,
202
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
237
+ var disabled = _ref2.disabled;
203
238
  var theme$1 = theme.useTheme();
204
239
  var focusRingStyles = a11y.useFocusRing({
205
240
  always: true
@@ -215,27 +250,19 @@ var useInput = function useInput(_ref2) {
215
250
  typographyStyles = _textStyles[0],
216
251
  responsiveStyles = _textStyles[1];
217
252
 
218
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
253
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
219
254
  ':focus': {
220
- // This removes the nested input outline visibility since
221
- // the wrapper will be outlined, but still visibly focusable
222
- // to windows high contrast mode users.
223
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
224
- outline: '2px solid transparent',
225
- outlineOffset: '2px'
226
- }
227
- } : {
255
+ outline: 'none'
256
+ },
228
257
  ':enabled': {
229
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
258
+ ':focus + [data-focus-indicator]': _objectSpread({
230
259
  borderColor: theme$1.border.color.fieldAccent
231
- })
232
- },
233
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
234
- borderColor: theme$1.border.color.fieldAccent
235
- })
260
+ }, focusRingStyles)
261
+ }
236
262
  });
237
263
  };
238
264
 
239
265
  exports.InputAdornment = InputAdornment;
266
+ exports.InputContainer = InputContainer;
240
267
  exports.TextInput = TextInput;
241
268
  exports.useInput = useInput;
@@ -108,6 +108,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
108
108
  });
109
109
  };
110
110
 
111
+ var _excluded$1 = ["children", "startAdornment", "endAdornment"];
112
+ var InputContainer = function InputContainer(_ref) {
113
+ var children = _ref.children,
114
+ startAdornment = _ref.startAdornment,
115
+ endAdornment = _ref.endAdornment,
116
+ boxProps = _objectWithoutProperties(_ref, _excluded$1);
117
+
118
+ var _useFieldContext = useFieldContext(),
119
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 1),
120
+ _useFieldContext2$ = _useFieldContext2[0],
121
+ disabled = _useFieldContext2$.disabled,
122
+ invalid = _useFieldContext2$.invalid;
123
+
124
+ return /*#__PURE__*/jsxs(Box, _objectSpread(_objectSpread({
125
+ position: "relative",
126
+ background: disabled ? 'inputDisabled' : 'input'
127
+ }, boxProps), {}, {
128
+ children: [startAdornment, children, /*#__PURE__*/jsx(FocusIndicator, {
129
+ invalid: invalid
130
+ }), endAdornment]
131
+ }));
132
+ };
133
+
134
+ var FocusIndicator = function FocusIndicator(_ref2) {
135
+ var invalid = _ref2.invalid;
136
+ return /*#__PURE__*/jsx(Box, {
137
+ "aria-hidden": "true",
138
+ as: "span",
139
+ data: {
140
+ 'focus-indicator': 'true'
141
+ } // Styles
142
+ ,
143
+ border: invalid ? 'critical' : 'field',
144
+ borderRadius: "small",
145
+ position: "absolute",
146
+ bottom: 0,
147
+ left: 0,
148
+ right: 0,
149
+ top: 0,
150
+ className: css({
151
+ pointerEvents: 'none'
152
+ })
153
+ });
154
+ };
155
+
111
156
  /**
112
157
  * Map children for placement within the `TextInput` flex container. Ensures that
113
158
  * placeholders are provided for unused placements.
@@ -140,8 +185,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
140
185
  };
141
186
  };
142
187
 
143
- var _excluded = ["children", "data"],
144
- _excluded2 = ["disabled", "invalid"];
188
+ var _excluded = ["children", "data"];
145
189
 
146
190
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
147
191
  var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
@@ -150,32 +194,27 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
150
194
  consumerProps = _objectWithoutProperties(_ref, _excluded);
151
195
 
152
196
  var _useFieldContext = useFieldContext(),
153
- disabled = _useFieldContext.disabled,
154
- invalid = _useFieldContext.invalid,
155
- a11yProps = _objectWithoutProperties(_useFieldContext, _excluded2);
197
+ _useFieldContext2 = _slicedToArray(_useFieldContext, 2),
198
+ _useFieldContext2$ = _useFieldContext2[0],
199
+ disabled = _useFieldContext2$.disabled,
200
+ invalid = _useFieldContext2$.invalid,
201
+ a11yProps = _useFieldContext2[1];
156
202
 
157
203
  var _childrenToAdornments = childrenToAdornments(children),
158
204
  startAdornment = _childrenToAdornments.startAdornment,
159
205
  endAdornment = _childrenToAdornments.endAdornment;
160
206
 
161
- return /*#__PURE__*/jsxs(Box, {
162
- background: disabled ? 'inputDisabled' : 'input',
163
- border: invalid ? 'critical' : 'field',
164
- borderRadius: "small",
207
+ return /*#__PURE__*/jsx(InputContainer, {
165
208
  display: "inline-flex",
166
209
  alignItems: "center",
167
- flexDirection: "row",
168
- height: "medium",
169
- marginY: "none",
170
- className: css(useInput({
171
- disabled: disabled,
172
- invalid: invalid
173
- })),
174
- children: [startAdornment, /*#__PURE__*/jsx(Box, _objectSpread(_objectSpread({
210
+ startAdornment: startAdornment,
211
+ endAdornment: endAdornment,
212
+ children: /*#__PURE__*/jsx(Box, _objectSpread(_objectSpread(_objectSpread({}, consumerProps), a11yProps), {}, {
175
213
  as: "input",
176
- "aria-invalid": invalid || undefined,
177
214
  ref: forwardedRef,
178
- disabled: disabled // Styles
215
+ data: data,
216
+ disabled: disabled,
217
+ position: "relative" // Styles
179
218
  ,
180
219
  flex: 1,
181
220
  height: "medium",
@@ -184,18 +223,14 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
184
223
  paddingRight: endAdornment ? 'none' : 'medium',
185
224
  className: css(useInput({
186
225
  disabled: disabled,
187
- invalid: invalid,
188
- isNested: true
189
- })),
190
- data: data
191
- }, a11yProps), consumerProps)), endAdornment]
226
+ invalid: invalid
227
+ }))
228
+ }))
192
229
  });
193
230
  });
194
231
  TextInput.displayName = 'TextInput';
195
232
  var useInput = function useInput(_ref2) {
196
- var disabled = _ref2.disabled,
197
- _ref2$isNested = _ref2.isNested,
198
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
233
+ var disabled = _ref2.disabled;
199
234
  var theme = useTheme();
200
235
  var focusRingStyles = useFocusRing({
201
236
  always: true
@@ -211,25 +246,16 @@ var useInput = function useInput(_ref2) {
211
246
  typographyStyles = _textStyles[0],
212
247
  responsiveStyles = _textStyles[1];
213
248
 
214
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
249
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
215
250
  ':focus': {
216
- // This removes the nested input outline visibility since
217
- // the wrapper will be outlined, but still visibly focusable
218
- // to windows high contrast mode users.
219
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
220
- outline: '2px solid transparent',
221
- outlineOffset: '2px'
222
- }
223
- } : {
251
+ outline: 'none'
252
+ },
224
253
  ':enabled': {
225
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
254
+ ':focus + [data-focus-indicator]': _objectSpread({
226
255
  borderColor: theme.border.color.fieldAccent
227
- })
228
- },
229
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
230
- borderColor: theme.border.color.fieldAccent
231
- })
256
+ }, focusRingStyles)
257
+ }
232
258
  });
233
259
  };
234
260
 
235
- export { InputAdornment, TextInput, useInput };
261
+ export { InputAdornment, InputContainer, TextInput, useInput };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spark-web/text-input",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/spark-web-text-input.cjs.js",
6
6
  "module": "dist/spark-web-text-input.esm.js",
@@ -8,14 +8,14 @@
8
8
  "dist"
9
9
  ],
10
10
  "dependencies": {
11
- "@babel/runtime": "^7.14.6",
12
- "@emotion/css": "^11.7.1",
13
- "@spark-web/a11y": "^1.0.4",
14
- "@spark-web/box": "^1.0.4",
15
- "@spark-web/field": "^1.1.0",
16
- "@spark-web/text": "^1.0.4",
17
- "@spark-web/theme": "^3.0.0",
18
- "@spark-web/utils": "^1.1.2"
11
+ "@babel/runtime": "^7.18.0",
12
+ "@emotion/css": "^11.9.0",
13
+ "@spark-web/a11y": "^1.0.5",
14
+ "@spark-web/box": "^1.0.5",
15
+ "@spark-web/field": "^2.0.0",
16
+ "@spark-web/text": "^1.0.5",
17
+ "@spark-web/theme": "^3.0.1",
18
+ "@spark-web/utils": "^1.1.3"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@types/react": "^17.0.12",