@react-fabric/form 1.0.0-beta.35 → 1.0.0-beta.37

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 (69) hide show
  1. package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
  2. package/{src/input/ColorPicker.module.css → css/_colorPicker.css} +13 -13
  3. package/{src/internal/Field.module.css → css/_field.css} +17 -17
  4. package/{src/input/File.module.css → css/_file.css} +7 -7
  5. package/css/styles.css +27 -0
  6. package/dist/cjs/builder/FileField.js +35 -23
  7. package/dist/cjs/builder/SchemaEditor.js +6 -1
  8. package/dist/cjs/builder/components/SchemaArrayForm.js +1 -2
  9. package/dist/cjs/builder/components/SchemaField.js +5 -3
  10. package/dist/cjs/input/ArrayInput.js +3 -4
  11. package/dist/cjs/input/AvatarInput.js +1 -1
  12. package/dist/cjs/input/Checkbox.js +1 -1
  13. package/dist/cjs/input/ColorInput.js +1 -1
  14. package/dist/cjs/input/ColorPicker.js +1 -2
  15. package/dist/cjs/input/Field.js +1 -2
  16. package/dist/cjs/input/File.js +1 -2
  17. package/dist/cjs/input/Radio.js +1 -1
  18. package/dist/cjs/internal/ErrorIcon.js +1 -1
  19. package/dist/cjs/internal/FieldWrapper.js +1 -2
  20. package/dist/cjs/internal/InputWrapper.js +4 -5
  21. package/dist/cjs/select/AutoComplete.js +1 -1
  22. package/dist/cjs/select/Select.js +1 -1
  23. package/dist/esm/builder/FileField.js +37 -25
  24. package/dist/esm/builder/SchemaEditor.js +6 -1
  25. package/dist/esm/builder/components/SchemaArrayForm.js +1 -2
  26. package/dist/esm/builder/components/SchemaField.js +5 -3
  27. package/dist/esm/input/ArrayInput.js +3 -4
  28. package/dist/esm/input/AvatarInput.js +1 -1
  29. package/dist/esm/input/Checkbox.js +1 -1
  30. package/dist/esm/input/ColorInput.js +1 -1
  31. package/dist/esm/input/ColorPicker.js +1 -2
  32. package/dist/esm/input/Field.js +1 -2
  33. package/dist/esm/input/File.js +1 -2
  34. package/dist/esm/input/Radio.js +1 -1
  35. package/dist/esm/internal/ErrorIcon.js +1 -1
  36. package/dist/esm/internal/FieldWrapper.js +1 -2
  37. package/dist/esm/internal/InputWrapper.js +4 -5
  38. package/dist/esm/select/AutoComplete.js +1 -1
  39. package/dist/esm/select/Select.js +1 -1
  40. package/dist/types/builder/FileField.d.ts +3 -1
  41. package/dist/types/builder/SchemaEditor.d.ts +1 -1
  42. package/dist/types/types/schema.d.ts +2 -1
  43. package/package.json +16 -5
  44. package/src/builder/FileField.tsx +48 -23
  45. package/src/builder/SchemaEditor.tsx +6 -1
  46. package/src/builder/components/SchemaArrayForm.tsx +2 -2
  47. package/src/builder/components/SchemaField.tsx +40 -37
  48. package/src/input/ArrayInput.tsx +3 -4
  49. package/src/input/AvatarInput.tsx +1 -1
  50. package/src/input/Checkbox.tsx +1 -1
  51. package/src/input/ColorInput.tsx +1 -1
  52. package/src/input/ColorPicker.tsx +1 -2
  53. package/src/input/Field.tsx +1 -2
  54. package/src/input/File.tsx +2 -5
  55. package/src/input/Radio.tsx +1 -1
  56. package/src/internal/ErrorIcon.tsx +1 -1
  57. package/src/internal/FieldWrapper.tsx +1 -2
  58. package/src/internal/InputWrapper.tsx +6 -7
  59. package/src/select/AutoComplete.tsx +1 -1
  60. package/src/select/Select.tsx +1 -1
  61. package/src/types/schema.ts +2 -1
  62. package/dist/cjs/input/ArrayInput.module.css +0 -1
  63. package/dist/cjs/input/ColorPicker.module.css +0 -1
  64. package/dist/cjs/input/File.module.css +0 -1
  65. package/dist/cjs/internal/Field.module.css +0 -1
  66. package/dist/esm/input/ArrayInput.module.css +0 -1
  67. package/dist/esm/input/ColorPicker.module.css +0 -1
  68. package/dist/esm/input/File.module.css +0 -1
  69. package/dist/esm/internal/Field.module.css +0 -1
@@ -168,43 +168,46 @@ export const SchemaField = ({
168
168
  }, 10);
169
169
  }, []);
170
170
 
171
- const handleTypeChange = useCallback((type: DATA_TYPES) => {
172
- if (type) {
173
- const modelRef = getModel();
174
- let reset = {
175
- datatype: type,
176
- id: field,
177
- label: modelRef.label,
178
- defaultValue: modelRef.defaultValue,
179
- required: modelRef.required,
180
- multiple: type === DATA_TYPES.AVATAR ? false : modelRef.multiple,
181
- minItems: modelRef.minItems,
182
- maxItems: modelRef.maxItems,
183
- } as DefaultSchema & ValueType;
184
- if (type === DATA_TYPES.STRING) {
185
- reset = Object.assign(reset, {
186
- optionList: modelRef.optionList,
187
- options: modelRef.options,
188
- regex: modelRef.regex,
189
- } as StringSchema);
190
- } else if (type === DATA_TYPES.DATE) {
191
- reset = Object.assign(reset, {
192
- type: "date",
193
- } as DateSchema);
194
- } else if (type === DATA_TYPES.NUMBER || type === DATA_TYPES.RANGE) {
195
- reset = Object.assign(reset, {
196
- min: modelRef.min,
197
- max: modelRef.max,
198
- step: modelRef.step,
199
- } as NumberSchema);
171
+ const handleTypeChange = useCallback(
172
+ (type: DATA_TYPES) => {
173
+ if (type) {
174
+ const modelRef = getModel();
175
+ let reset = {
176
+ datatype: type,
177
+ id,
178
+ label: modelRef.label,
179
+ defaultValue: modelRef.defaultValue,
180
+ required: modelRef.required,
181
+ multiple: type === DATA_TYPES.AVATAR ? false : modelRef.multiple,
182
+ minItems: modelRef.minItems,
183
+ maxItems: modelRef.maxItems,
184
+ } as DefaultSchema & ValueType;
185
+ if (type === DATA_TYPES.STRING) {
186
+ reset = Object.assign(reset, {
187
+ optionList: modelRef.optionList,
188
+ options: modelRef.options,
189
+ regex: modelRef.regex,
190
+ } as StringSchema);
191
+ } else if (type === DATA_TYPES.DATE) {
192
+ reset = Object.assign(reset, {
193
+ type: "date",
194
+ } as DateSchema);
195
+ } else if (type === DATA_TYPES.NUMBER || type === DATA_TYPES.RANGE) {
196
+ reset = Object.assign(reset, {
197
+ min: modelRef.min,
198
+ max: modelRef.max,
199
+ step: modelRef.step,
200
+ } as NumberSchema);
201
+ }
202
+ if (type === DATA_TYPES.AVATAR) {
203
+ setMultiple(false);
204
+ }
205
+ onTypeChange(reset);
206
+ setType(type);
200
207
  }
201
- if (type === DATA_TYPES.AVATAR) {
202
- setMultiple(false);
203
- }
204
- onTypeChange(reset);
205
- setType(type);
206
- }
207
- }, []);
208
+ },
209
+ [id],
210
+ );
208
211
 
209
212
  return (
210
213
  <SortableItem id={fieldId} className="flex flex-nowrap gap-1 group/field">
@@ -276,7 +279,7 @@ export const SchemaField = ({
276
279
  icon={CoreIcons.list}
277
280
  aria-label="Custom options"
278
281
  onClick={() => {
279
- void openOptionModal();
282
+ void openOptionModal({ title: `${id} Options` });
280
283
  }}
281
284
  />
282
285
  )}
@@ -44,7 +44,6 @@ import {
44
44
  import { useFieldArray, useFormContext } from "react-hook-form";
45
45
  import { useTranslation } from "react-i18next";
46
46
  import { FieldWrapper } from "../internal/FieldWrapper";
47
- import classes from "./ArrayInput.module.css";
48
47
 
49
48
  import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
50
49
  import { CSS } from "@dnd-kit/utilities";
@@ -257,7 +256,7 @@ export const ArrayInput = ({
257
256
  () => (
258
257
  <div className="flex justify-end">
259
258
  <Tooltip
260
- color="danger"
259
+ color="danger-200"
261
260
  content={
262
261
  isString(error)
263
262
  ? `${error}`
@@ -282,7 +281,7 @@ export const ArrayInput = ({
282
281
  onClick={() => handleAdd(onAdd?.())}
283
282
  data-invalid={!!error}
284
283
  disabled={!!disabled || readOnly || fields.length > maxItems}
285
- className={classNames(classes.addButton, "me-10")}
284
+ className={classNames("fabric-addButton", "me-10")}
286
285
  >
287
286
  {addLabel ?? t("addArray")}
288
287
  </Button>
@@ -293,7 +292,7 @@ export const ArrayInput = ({
293
292
  );
294
293
 
295
294
  return (
296
- <div className={classes.arrayInput}>
295
+ <div className={"fabric-arrayInput"}>
297
296
  <FieldWrapper
298
297
  {...rest}
299
298
  appendLabel={
@@ -99,7 +99,7 @@ export const AvatarInput = ({
99
99
  <div className="flex flex-nowrap items-end">
100
100
  <div className="inline-block leading-none rounded-full relative outline overflow-hidden">
101
101
  <Avatar name="temp" size={size} avatar={base64} />
102
- <div className="absolute inset-x-0 bottom-0 cursor-pointer bg-opacity-20 hover:bg-opacity-50 bg-black text-white text-xs text-center py-1">
102
+ <div className="absolute inset-x-0 bottom-0 cursor-pointer bg-black/20 hover:bg-black/50 text-white text-xs text-center py-1">
103
103
  <span>Edit</span>
104
104
  <input
105
105
  type="file"
@@ -151,7 +151,7 @@ export const Checkbox = ({
151
151
  <Icon
152
152
  className={classNames(
153
153
  "p-0.5",
154
- actualValue && icon && !iconChecked && "bg-primary-500 text-white",
154
+ actualValue && icon && !iconChecked && "bg-primary-500 text-white!",
155
155
  )}
156
156
  size="1.25em"
157
157
  color={invalid ? "danger" : "primary"}
@@ -127,7 +127,7 @@ export const ColorInput = ({
127
127
  className={classNames(
128
128
  "flex-content min-h-[1.5em] min-w-[3.5em] self-stretch flex items-center outline-tint-200 rounded",
129
129
  !disabled && "bg-base",
130
- !noOutline && "bg-[var(--fabric-input)] outline overflow-hidden",
130
+ !noOutline && "bg-(--fabric-input) outline overflow-hidden",
131
131
  )}
132
132
  >
133
133
  {decorateStart && (
@@ -32,7 +32,6 @@ import {
32
32
  type FC,
33
33
  } from "react";
34
34
  import { SketchPicker } from "react-color";
35
- import classes from "./ColorPicker.module.css";
36
35
 
37
36
  export interface ColorProps {
38
37
  /**
@@ -130,7 +129,7 @@ export const ColorPicker: FC<ColorProps> = memo(
130
129
  return (
131
130
  <SketchPicker
132
131
  width="16rem"
133
- className={classes.colorPicker}
132
+ className={"fabric-colorPicker"}
134
133
  styles={
135
134
  {
136
135
  default: {
@@ -28,7 +28,6 @@ import {
28
28
  } from "@react-fabric/core/dist/types/types";
29
29
  import classNames from "classnames";
30
30
  import { cloneElement } from "react";
31
- import classes from "../internal/Field.module.css";
32
31
  import { FieldWrapper } from "../internal/FieldWrapper";
33
32
 
34
33
  export interface FieldProps extends ChildrenProp, CssProp {
@@ -84,7 +83,7 @@ export const Field = ({
84
83
  <FieldWrapper {...rest}>
85
84
  <div
86
85
  className={classNames(
87
- classes.fieldGroup,
86
+ "fabric-fieldGroup",
88
87
  !plain && !noOutline && "outline",
89
88
  !plain && "bg-base",
90
89
  plain && "flex-wrap",
@@ -44,7 +44,6 @@ import {
44
44
  import { InputWrapper } from "../internal/InputWrapper";
45
45
  import { type InputProps } from "../types";
46
46
  import { handleEnter } from "../utils";
47
- import classes from "./File.module.css";
48
47
 
49
48
  export interface FileInputProps
50
49
  extends InputProps<AnyObject>,
@@ -195,10 +194,8 @@ export const FileInput = ({
195
194
  <input
196
195
  className={classNames(
197
196
  "appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0",
198
- classes.fileInput,
199
- isArray(actualValue) &&
200
- actualValue?.length &&
201
- "text-[var(--fabric-bg)]",
197
+ "fabric-fileInput",
198
+ isArray(actualValue) && actualValue?.length && "text-(--fabric-bg)",
202
199
  )}
203
200
  aria-invalid={invalid}
204
201
  aria-disabled={disabled}
@@ -126,7 +126,7 @@ export const Radio = ({
126
126
  <Icon
127
127
  className={classNames(
128
128
  "p-0.5 hidden peer-checked:inline-block",
129
- icon && !iconChecked && "bg-primary-500 text-white",
129
+ icon && !iconChecked && "bg-primary-500 text-white!",
130
130
  )}
131
131
  color={invalid ? "danger" : "primary"}
132
132
  size="1.25em"
@@ -48,7 +48,7 @@ export const ErrorIcon = ({ error = "", invalid }: KeyValue) => {
48
48
  ) as string)
49
49
  }
50
50
  placement="bottom"
51
- color="danger"
51
+ color="danger-200"
52
52
  >
53
53
  <Icon
54
54
  className="flex-content first:ms-2 self-center"
@@ -22,7 +22,6 @@
22
22
  */
23
23
 
24
24
  import classNames from "classnames";
25
- import classes from "./Field.module.css";
26
25
 
27
26
  export const FieldWrapper = ({
28
27
  label,
@@ -41,7 +40,7 @@ export const FieldWrapper = ({
41
40
  return (
42
41
  <div
43
42
  className={classNames(
44
- classes.fieldWrapper,
43
+ "fabric-fieldWrapper",
45
44
  className,
46
45
  inline ? "flex flex-nowrap gap-1" : "block",
47
46
  )}
@@ -34,7 +34,6 @@ import {
34
34
  } from "react";
35
35
  import { Fragment } from "react/jsx-runtime";
36
36
  import { ErrorIcon } from "./ErrorIcon";
37
- import classes from "./Field.module.css";
38
37
  import { FieldWrapper } from "./FieldWrapper";
39
38
 
40
39
  export const InputWrapper = ({
@@ -104,11 +103,11 @@ export const InputWrapper = ({
104
103
  role="none"
105
104
  ref={wrapperRef}
106
105
  className={classNames(
107
- classes.inputWrapper,
108
- invalid && classes.invalidWrapper,
106
+ "fabric-inputWrapper",
107
+ invalid && "fabric-invalidWrapper",
109
108
  !noOutline &&
110
109
  !noBorder &&
111
- "bg-[var(--fabric-input)] outline overflow-hidden",
110
+ "bg-(--fabric-input) outline overflow-hidden",
112
111
  "flex flex-nowrap items-center flex-1",
113
112
  textarea ? "rounded-capped group" : "rounded",
114
113
  isExpanded
@@ -129,7 +128,7 @@ export const InputWrapper = ({
129
128
  <div
130
129
  onClickCapture={doFocus}
131
130
  className={classNames(
132
- classes.decorate,
131
+ "fabric-decorate",
133
132
  "text-muted leading-none flex-content",
134
133
  isString(decorateStart) && "px-1",
135
134
  )}
@@ -145,7 +144,7 @@ export const InputWrapper = ({
145
144
  onClick={handleClear}
146
145
  className={classNames(
147
146
  "text-tint-500 hover:text-tint-700 p-1 z-1 flex-content",
148
- classes.inputClear,
147
+ "fabric-inputClear",
149
148
  textarea && "self-start mt-1 me-1",
150
149
  )}
151
150
  />
@@ -154,7 +153,7 @@ export const InputWrapper = ({
154
153
  <div
155
154
  onClickCapture={doFocus}
156
155
  className={classNames(
157
- classes.decorate,
156
+ "fabric-decorate",
158
157
  "text-muted leading-none flex-content",
159
158
  isString(decorateEnd) && "px-1",
160
159
  decorateEndHideWhenEmpty && "peer-placeholder-shown:hidden",
@@ -328,7 +328,7 @@ export const AutoComplete = ({
328
328
  >
329
329
  <Options
330
330
  ref={refs.setFloating}
331
- className="outline shadow-lg max-h-[40vh] z-[var(--z-popover)]"
331
+ className="outline shadow-lg max-h-[40vh] z-(--z-popover)"
332
332
  style={{
333
333
  width: refs.reference.current?.getBoundingClientRect().width,
334
334
  ...floatingStyles,
@@ -330,7 +330,7 @@ export const Select = <T extends AnyObject = string>({
330
330
  >
331
331
  <Options
332
332
  ref={refs.setFloating}
333
- className="outline shadow-lg max-h-[40vh] z-[var(--z-popover)]"
333
+ className="outline shadow-lg max-h-[40vh] z-(--z-popover)"
334
334
  style={{
335
335
  width: refs.reference.current?.getBoundingClientRect().width,
336
336
  ...floatingStyles,
@@ -150,5 +150,6 @@ export interface SchemaEditorProps {
150
150
  */
151
151
  children?: Elements<JSX.Element> | Array<Elements<JSX.Element>>;
152
152
 
153
- onChange: (schema: FormSchema) => void;
153
+ onChange?: (schema: FormSchema) => void;
154
+ onSubmit?: (schema: FormSchema) => void;
154
155
  }
@@ -1 +0,0 @@
1
- @layer var{.arrayInput{& [data-ref=fieldWrapper]{flex:1 1 0%}& .addButton :global(.buttonInner){color:theme(colors.tint.600);outline:1px dashed theme(colors.tint.600);&[data-invalid=true]{background-color:theme(colors.danger.100);color:theme(colors.danger.600);outline:1px dashed theme(colors.danger.600)}}}}
@@ -1 +0,0 @@
1
- @layer comp{.colorPicker{--color-shadow:theme(borderColor.base);& input{background-color:theme(backgroundColor.base);border:1px solid theme(borderColor.base);border-radius:theme(borderRadius.sm);box-shadow:none;color:theme(textColor.base);line-height:2;padding:0 4px!important;&:focus{border-color:theme(borderColor.primary.DEFAULT)}}& label{color:theme(textColor.base)}& :global(.flexbox-fix){border-color:theme(borderColor.muted);justify-content:center;&>div>div{text-align:center}& span>div{box-shadow:inset 0 0 1px 1px theme(borderColor.base)!important}}& :global(.saturation-black)~div{pointer-events:none}}}
@@ -1 +0,0 @@
1
- @layer comp{.fileInput{&::-webkit-file-upload-button{background-color:theme(backgroundColor.primary.500);border:0;border-radius:theme(borderRadius.DEFAULT);color:theme(textColor.white);cursor:pointer;opacity:.8;padding-block:0;&:hover{opacity:.9}}&[aria-invalid=true]::-webkit-file-upload-button{background-color:theme(backgroundColor.danger.500)}&:disabled::-webkit-file-upload-button{background-color:theme(backgroundColor.muted);pointer-events:none}&[readOnly]{pointer-events:none}}}
@@ -1 +0,0 @@
1
- @layer comp{}@layer var{.inputWrapper{&:after{inset-inline:50%;transition:all .3s;transition-delay:.1s}& .decorate:has([data-ref=button]){align-self:stretch;display:flex}&:has(input[disabled],textarea[disabled]){background-color:theme(colors.tint.50);cursor:not-allowed;& input,& textarea{cursor:not-allowed}}&:focus-within,&:has([data-open=true]){background-color:var(--fabric-input-focus);outline-color:var(--primary);z-index:1;&:not(:has([aria-readonly=true]:not([hidden]))):after{inset-inline:0}}&:global(.fixed){box-shadow:0 0 2rem .5rem var(--fabric-shadow)}& input,& textarea{max-width:100%}&>input[type=number]+.inputClear{margin-inline:-3rem 0}& input::-ms-clear,& select::-ms-clear,& textarea::-ms-clear{display:none}& input[type=search]::-webkit-search-cancel-button{display:none}& input[type=password]:not(:placeholder-shown){font-family:caption;letter-spacing:2px}& input[type=date]::-webkit-calendar-picker-indicator,& input[type=datetime-local]::-webkit-calendar-picker-indicator{appearance:none;display:none}& input[type=date]:global(.empty)::-webkit-datetime-edit,& input[type=datetime-local]:global(.empty)::-webkit-datetime-edit{color:theme(colors.tint.400)}& input:-webkit-autofill{box-shadow:0 0 0 999em var(--fabric-input) inset;-webkit-text-fill-color:theme(colors.accent.700)}& input:-webkit-autofill:focus{box-shadow:0 0 0 999em var(--fabric-input-focus) inset;-webkit-text-fill-color:theme(colors.accent.700)}&.invalidWrapper{outline-color:theme(colors.danger.500);&:after{background-color:theme(colors.danger.500)}}}.fieldGroup{>*{line-height:1}>:not(:first-child){&,&>[data-ref=button]>[role=button],&>[role=button],&>div{border-end-start-radius:0;border-start-start-radius:0}}>:not(:last-child){&,&>[data-ref=button]>[role=button],&>[role=button],&>div{border-end-end-radius:0;border-start-end-radius:0}}}}
@@ -1 +0,0 @@
1
- @layer var{.arrayInput{& [data-ref=fieldWrapper]{flex:1 1 0%}& .addButton :global(.buttonInner){color:theme(colors.tint.600);outline:1px dashed theme(colors.tint.600);&[data-invalid=true]{background-color:theme(colors.danger.100);color:theme(colors.danger.600);outline:1px dashed theme(colors.danger.600)}}}}
@@ -1 +0,0 @@
1
- @layer comp{.colorPicker{--color-shadow:theme(borderColor.base);& input{background-color:theme(backgroundColor.base);border:1px solid theme(borderColor.base);border-radius:theme(borderRadius.sm);box-shadow:none;color:theme(textColor.base);line-height:2;padding:0 4px!important;&:focus{border-color:theme(borderColor.primary.DEFAULT)}}& label{color:theme(textColor.base)}& :global(.flexbox-fix){border-color:theme(borderColor.muted);justify-content:center;&>div>div{text-align:center}& span>div{box-shadow:inset 0 0 1px 1px theme(borderColor.base)!important}}& :global(.saturation-black)~div{pointer-events:none}}}
@@ -1 +0,0 @@
1
- @layer comp{.fileInput{&::-webkit-file-upload-button{background-color:theme(backgroundColor.primary.500);border:0;border-radius:theme(borderRadius.DEFAULT);color:theme(textColor.white);cursor:pointer;opacity:.8;padding-block:0;&:hover{opacity:.9}}&[aria-invalid=true]::-webkit-file-upload-button{background-color:theme(backgroundColor.danger.500)}&:disabled::-webkit-file-upload-button{background-color:theme(backgroundColor.muted);pointer-events:none}&[readOnly]{pointer-events:none}}}
@@ -1 +0,0 @@
1
- @layer comp{}@layer var{.inputWrapper{&:after{inset-inline:50%;transition:all .3s;transition-delay:.1s}& .decorate:has([data-ref=button]){align-self:stretch;display:flex}&:has(input[disabled],textarea[disabled]){background-color:theme(colors.tint.50);cursor:not-allowed;& input,& textarea{cursor:not-allowed}}&:focus-within,&:has([data-open=true]){background-color:var(--fabric-input-focus);outline-color:var(--primary);z-index:1;&:not(:has([aria-readonly=true]:not([hidden]))):after{inset-inline:0}}&:global(.fixed){box-shadow:0 0 2rem .5rem var(--fabric-shadow)}& input,& textarea{max-width:100%}&>input[type=number]+.inputClear{margin-inline:-3rem 0}& input::-ms-clear,& select::-ms-clear,& textarea::-ms-clear{display:none}& input[type=search]::-webkit-search-cancel-button{display:none}& input[type=password]:not(:placeholder-shown){font-family:caption;letter-spacing:2px}& input[type=date]::-webkit-calendar-picker-indicator,& input[type=datetime-local]::-webkit-calendar-picker-indicator{appearance:none;display:none}& input[type=date]:global(.empty)::-webkit-datetime-edit,& input[type=datetime-local]:global(.empty)::-webkit-datetime-edit{color:theme(colors.tint.400)}& input:-webkit-autofill{box-shadow:0 0 0 999em var(--fabric-input) inset;-webkit-text-fill-color:theme(colors.accent.700)}& input:-webkit-autofill:focus{box-shadow:0 0 0 999em var(--fabric-input-focus) inset;-webkit-text-fill-color:theme(colors.accent.700)}&.invalidWrapper{outline-color:theme(colors.danger.500);&:after{background-color:theme(colors.danger.500)}}}.fieldGroup{>*{line-height:1}>:not(:first-child){&,&>[data-ref=button]>[role=button],&>[role=button],&>div{border-end-start-radius:0;border-start-start-radius:0}}>:not(:last-child){&,&>[data-ref=button]>[role=button],&>[role=button],&>div{border-end-end-radius:0;border-start-end-radius:0}}}}