@spark-web/text-input 1.1.0 → 1.2.1

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';
@@ -67,6 +67,7 @@ var InputAdornment = function InputAdornment(_ref) {
67
67
  paddingLeft: paddingLeft,
68
68
  paddingRight: paddingRight,
69
69
  children: /*#__PURE__*/jsxRuntime.jsx(box.Box, {
70
+ display: "flex",
70
71
  alignItems: "center",
71
72
  justifyContent: "center",
72
73
  style: {
@@ -111,6 +112,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
111
112
  });
112
113
  };
113
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
+
114
160
  /**
115
161
  * Map children for placement within the `TextInput` flex container. Ensures that
116
162
  * placeholders are provided for unused placements.
@@ -143,8 +189,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
143
189
  };
144
190
  };
145
191
 
146
- var _excluded = ["children", "data"],
147
- _excluded2 = ["disabled", "invalid"];
192
+ var _excluded = ["children", "data"];
148
193
 
149
194
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
150
195
  var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
@@ -153,31 +198,27 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
153
198
  consumerProps = _objectWithoutProperties(_ref, _excluded);
154
199
 
155
200
  var _useFieldContext = field.useFieldContext(),
156
- disabled = _useFieldContext.disabled,
157
- invalid = _useFieldContext.invalid,
158
- 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];
159
206
 
160
207
  var _childrenToAdornments = childrenToAdornments(children),
161
208
  startAdornment = _childrenToAdornments.startAdornment,
162
209
  endAdornment = _childrenToAdornments.endAdornment;
163
210
 
164
- return /*#__PURE__*/jsxRuntime.jsxs(box.Box, {
165
- background: disabled ? 'inputDisabled' : 'input',
166
- border: invalid ? 'critical' : 'field',
167
- borderRadius: "small",
211
+ return /*#__PURE__*/jsxRuntime.jsx(InputContainer, {
168
212
  display: "inline-flex",
169
213
  alignItems: "center",
170
- flexDirection: "row",
171
- height: "medium",
172
- marginY: "none",
173
- className: css.css(useInput({
174
- disabled: disabled,
175
- invalid: invalid
176
- })),
177
- 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), {}, {
178
217
  as: "input",
179
218
  ref: forwardedRef,
180
- disabled: disabled // Styles
219
+ data: data,
220
+ disabled: disabled,
221
+ position: "relative" // Styles
181
222
  ,
182
223
  flex: 1,
183
224
  height: "medium",
@@ -186,18 +227,14 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
186
227
  paddingRight: endAdornment ? 'none' : 'medium',
187
228
  className: css.css(useInput({
188
229
  disabled: disabled,
189
- invalid: invalid,
190
- isNested: true
191
- })),
192
- data: data
193
- }, a11yProps), consumerProps)), endAdornment]
230
+ invalid: invalid
231
+ }))
232
+ }))
194
233
  });
195
234
  });
196
235
  TextInput.displayName = 'TextInput';
197
236
  var useInput = function useInput(_ref2) {
198
- var disabled = _ref2.disabled,
199
- _ref2$isNested = _ref2.isNested,
200
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
237
+ var disabled = _ref2.disabled;
201
238
  var theme$1 = theme.useTheme();
202
239
  var focusRingStyles = a11y.useFocusRing({
203
240
  always: true
@@ -213,27 +250,19 @@ var useInput = function useInput(_ref2) {
213
250
  typographyStyles = _textStyles[0],
214
251
  responsiveStyles = _textStyles[1];
215
252
 
216
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
253
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
217
254
  ':focus': {
218
- // This removes the nested input outline visibility since
219
- // the wrapper will be outlined, but still visibly focusable
220
- // to windows high contrast mode users.
221
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
222
- outline: '2px solid transparent',
223
- outlineOffset: '2px'
224
- }
225
- } : {
255
+ outline: 'none'
256
+ },
226
257
  ':enabled': {
227
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
258
+ ':focus + [data-focus-indicator]': _objectSpread({
228
259
  borderColor: theme$1.border.color.fieldAccent
229
- })
230
- },
231
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
232
- borderColor: theme$1.border.color.fieldAccent
233
- })
260
+ }, focusRingStyles)
261
+ }
234
262
  });
235
263
  };
236
264
 
237
265
  exports.InputAdornment = InputAdornment;
266
+ exports.InputContainer = InputContainer;
238
267
  exports.TextInput = TextInput;
239
268
  exports.useInput = useInput;
@@ -67,6 +67,7 @@ var InputAdornment = function InputAdornment(_ref) {
67
67
  paddingLeft: paddingLeft,
68
68
  paddingRight: paddingRight,
69
69
  children: /*#__PURE__*/jsxRuntime.jsx(box.Box, {
70
+ display: "flex",
70
71
  alignItems: "center",
71
72
  justifyContent: "center",
72
73
  style: {
@@ -111,6 +112,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
111
112
  });
112
113
  };
113
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
+
114
160
  /**
115
161
  * Map children for placement within the `TextInput` flex container. Ensures that
116
162
  * placeholders are provided for unused placements.
@@ -143,8 +189,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
143
189
  };
144
190
  };
145
191
 
146
- var _excluded = ["children", "data"],
147
- _excluded2 = ["disabled", "invalid"];
192
+ var _excluded = ["children", "data"];
148
193
 
149
194
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
150
195
  var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
@@ -153,31 +198,27 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
153
198
  consumerProps = _objectWithoutProperties(_ref, _excluded);
154
199
 
155
200
  var _useFieldContext = field.useFieldContext(),
156
- disabled = _useFieldContext.disabled,
157
- invalid = _useFieldContext.invalid,
158
- 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];
159
206
 
160
207
  var _childrenToAdornments = childrenToAdornments(children),
161
208
  startAdornment = _childrenToAdornments.startAdornment,
162
209
  endAdornment = _childrenToAdornments.endAdornment;
163
210
 
164
- return /*#__PURE__*/jsxRuntime.jsxs(box.Box, {
165
- background: disabled ? 'inputDisabled' : 'input',
166
- border: invalid ? 'critical' : 'field',
167
- borderRadius: "small",
211
+ return /*#__PURE__*/jsxRuntime.jsx(InputContainer, {
168
212
  display: "inline-flex",
169
213
  alignItems: "center",
170
- flexDirection: "row",
171
- height: "medium",
172
- marginY: "none",
173
- className: css.css(useInput({
174
- disabled: disabled,
175
- invalid: invalid
176
- })),
177
- 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), {}, {
178
217
  as: "input",
179
218
  ref: forwardedRef,
180
- disabled: disabled // Styles
219
+ data: data,
220
+ disabled: disabled,
221
+ position: "relative" // Styles
181
222
  ,
182
223
  flex: 1,
183
224
  height: "medium",
@@ -186,18 +227,14 @@ var TextInput = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
186
227
  paddingRight: endAdornment ? 'none' : 'medium',
187
228
  className: css.css(useInput({
188
229
  disabled: disabled,
189
- invalid: invalid,
190
- isNested: true
191
- })),
192
- data: data
193
- }, a11yProps), consumerProps)), endAdornment]
230
+ invalid: invalid
231
+ }))
232
+ }))
194
233
  });
195
234
  });
196
235
  TextInput.displayName = 'TextInput';
197
236
  var useInput = function useInput(_ref2) {
198
- var disabled = _ref2.disabled,
199
- _ref2$isNested = _ref2.isNested,
200
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
237
+ var disabled = _ref2.disabled;
201
238
  var theme$1 = theme.useTheme();
202
239
  var focusRingStyles = a11y.useFocusRing({
203
240
  always: true
@@ -213,27 +250,19 @@ var useInput = function useInput(_ref2) {
213
250
  typographyStyles = _textStyles[0],
214
251
  responsiveStyles = _textStyles[1];
215
252
 
216
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
253
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
217
254
  ':focus': {
218
- // This removes the nested input outline visibility since
219
- // the wrapper will be outlined, but still visibly focusable
220
- // to windows high contrast mode users.
221
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
222
- outline: '2px solid transparent',
223
- outlineOffset: '2px'
224
- }
225
- } : {
255
+ outline: 'none'
256
+ },
226
257
  ':enabled': {
227
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
258
+ ':focus + [data-focus-indicator]': _objectSpread({
228
259
  borderColor: theme$1.border.color.fieldAccent
229
- })
230
- },
231
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
232
- borderColor: theme$1.border.color.fieldAccent
233
- })
260
+ }, focusRingStyles)
261
+ }
234
262
  });
235
263
  };
236
264
 
237
265
  exports.InputAdornment = InputAdornment;
266
+ exports.InputContainer = InputContainer;
238
267
  exports.TextInput = TextInput;
239
268
  exports.useInput = useInput;
@@ -63,6 +63,7 @@ var InputAdornment = function InputAdornment(_ref) {
63
63
  paddingLeft: paddingLeft,
64
64
  paddingRight: paddingRight,
65
65
  children: /*#__PURE__*/jsx(Box, {
66
+ display: "flex",
66
67
  alignItems: "center",
67
68
  justifyContent: "center",
68
69
  style: {
@@ -107,6 +108,51 @@ var FieldAdornment = function FieldAdornment(_ref2) {
107
108
  });
108
109
  };
109
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
+
110
156
  /**
111
157
  * Map children for placement within the `TextInput` flex container. Ensures that
112
158
  * placeholders are provided for unused placements.
@@ -139,8 +185,7 @@ var childrenToAdornments = function childrenToAdornments(children) {
139
185
  };
140
186
  };
141
187
 
142
- var _excluded = ["children", "data"],
143
- _excluded2 = ["disabled", "invalid"];
188
+ var _excluded = ["children", "data"];
144
189
 
145
190
  /** Organize and emphasize information quickly and effectively in a list of text elements. */
146
191
  var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
@@ -149,31 +194,27 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
149
194
  consumerProps = _objectWithoutProperties(_ref, _excluded);
150
195
 
151
196
  var _useFieldContext = useFieldContext(),
152
- disabled = _useFieldContext.disabled,
153
- invalid = _useFieldContext.invalid,
154
- 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];
155
202
 
156
203
  var _childrenToAdornments = childrenToAdornments(children),
157
204
  startAdornment = _childrenToAdornments.startAdornment,
158
205
  endAdornment = _childrenToAdornments.endAdornment;
159
206
 
160
- return /*#__PURE__*/jsxs(Box, {
161
- background: disabled ? 'inputDisabled' : 'input',
162
- border: invalid ? 'critical' : 'field',
163
- borderRadius: "small",
207
+ return /*#__PURE__*/jsx(InputContainer, {
164
208
  display: "inline-flex",
165
209
  alignItems: "center",
166
- flexDirection: "row",
167
- height: "medium",
168
- marginY: "none",
169
- className: css(useInput({
170
- disabled: disabled,
171
- invalid: invalid
172
- })),
173
- children: [startAdornment, /*#__PURE__*/jsx(Box, _objectSpread(_objectSpread({
210
+ startAdornment: startAdornment,
211
+ endAdornment: endAdornment,
212
+ children: /*#__PURE__*/jsx(Box, _objectSpread(_objectSpread(_objectSpread({}, consumerProps), a11yProps), {}, {
174
213
  as: "input",
175
214
  ref: forwardedRef,
176
- disabled: disabled // Styles
215
+ data: data,
216
+ disabled: disabled,
217
+ position: "relative" // Styles
177
218
  ,
178
219
  flex: 1,
179
220
  height: "medium",
@@ -182,18 +223,14 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
182
223
  paddingRight: endAdornment ? 'none' : 'medium',
183
224
  className: css(useInput({
184
225
  disabled: disabled,
185
- invalid: invalid,
186
- isNested: true
187
- })),
188
- data: data
189
- }, a11yProps), consumerProps)), endAdornment]
226
+ invalid: invalid
227
+ }))
228
+ }))
190
229
  });
191
230
  });
192
231
  TextInput.displayName = 'TextInput';
193
232
  var useInput = function useInput(_ref2) {
194
- var disabled = _ref2.disabled,
195
- _ref2$isNested = _ref2.isNested,
196
- isNested = _ref2$isNested === void 0 ? false : _ref2$isNested;
233
+ var disabled = _ref2.disabled;
197
234
  var theme = useTheme();
198
235
  var focusRingStyles = useFocusRing({
199
236
  always: true
@@ -209,25 +246,16 @@ var useInput = function useInput(_ref2) {
209
246
  typographyStyles = _textStyles[0],
210
247
  responsiveStyles = _textStyles[1];
211
248
 
212
- return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), isNested ? {
249
+ return _objectSpread(_objectSpread(_objectSpread({}, typographyStyles), responsiveStyles), {}, {
213
250
  ':focus': {
214
- // This removes the nested input outline visibility since
215
- // the wrapper will be outlined, but still visibly focusable
216
- // to windows high contrast mode users.
217
- // @see https://tailwindcss.com/docs/outline-style#removing-outlines
218
- outline: '2px solid transparent',
219
- outlineOffset: '2px'
220
- }
221
- } : {
251
+ outline: 'none'
252
+ },
222
253
  ':enabled': {
223
- '&:focus': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
254
+ ':focus + [data-focus-indicator]': _objectSpread({
224
255
  borderColor: theme.border.color.fieldAccent
225
- })
226
- },
227
- ':focus-within': _objectSpread(_objectSpread({}, focusRingStyles), {}, {
228
- borderColor: theme.border.color.fieldAccent
229
- })
256
+ }, focusRingStyles)
257
+ }
230
258
  });
231
259
  };
232
260
 
233
- 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.0",
3
+ "version": "1.2.1",
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": "^3.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",