@purpur/library 9.0.7 → 9.0.9

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 (114) hide show
  1. package/CHANGELOG.json +24 -0
  2. package/CHANGELOG.md +15 -1
  3. package/dist/{autocomplete-6qSqK3SI.js → autocomplete-B_OBQM2h.js} +2 -2
  4. package/dist/{autocomplete-6qSqK3SI.js.map → autocomplete-B_OBQM2h.js.map} +1 -1
  5. package/dist/{autocomplete-B4dZx9zF.mjs → autocomplete-DJ3zbA0m.mjs} +2 -2
  6. package/dist/{autocomplete-B4dZx9zF.mjs.map → autocomplete-DJ3zbA0m.mjs.map} +1 -1
  7. package/dist/autocomplete.cjs.js +1 -1
  8. package/dist/autocomplete.es.js +1 -1
  9. package/dist/button-BxdChrq-.js +2 -0
  10. package/dist/button-BxdChrq-.js.map +1 -0
  11. package/dist/button-D-BBdNhd.mjs +105 -0
  12. package/dist/button-D-BBdNhd.mjs.map +1 -0
  13. package/dist/button.cjs.js +1 -1
  14. package/dist/button.es.js +1 -1
  15. package/dist/{calendar-vALLklKV.mjs → calendar-9p_aA7KY.mjs} +2 -2
  16. package/dist/{calendar-vALLklKV.mjs.map → calendar-9p_aA7KY.mjs.map} +1 -1
  17. package/dist/{calendar-CxkJMONO.js → calendar-BSdvi_DA.js} +2 -2
  18. package/dist/{calendar-CxkJMONO.js.map → calendar-BSdvi_DA.js.map} +1 -1
  19. package/dist/calendar.cjs.js +1 -1
  20. package/dist/calendar.es.js +1 -1
  21. package/dist/components/button/src/button.d.ts +64 -4
  22. package/dist/components/button/src/button.d.ts.map +1 -1
  23. package/dist/{date-field-CTJB8O0e.mjs → date-field-Ch2lM7-P.mjs} +2 -2
  24. package/dist/{date-field-CTJB8O0e.mjs.map → date-field-Ch2lM7-P.mjs.map} +1 -1
  25. package/dist/{date-field-CORqon6B.js → date-field-DTI5mQkg.js} +2 -2
  26. package/dist/{date-field-CORqon6B.js.map → date-field-DTI5mQkg.js.map} +1 -1
  27. package/dist/date-field.cjs.js +1 -1
  28. package/dist/date-field.es.js +1 -1
  29. package/dist/{date-picker-CJcIJ5VL.mjs → date-picker-Bt3IaH23.mjs} +4 -4
  30. package/dist/{date-picker-CJcIJ5VL.mjs.map → date-picker-Bt3IaH23.mjs.map} +1 -1
  31. package/dist/{date-picker-Dv3W05Hf.js → date-picker-Dk39IXG5.js} +2 -2
  32. package/dist/{date-picker-Dv3W05Hf.js.map → date-picker-Dk39IXG5.js.map} +1 -1
  33. package/dist/date-picker.cjs.js +1 -1
  34. package/dist/date-picker.es.js +1 -1
  35. package/dist/{drawer-DSFZ61OH.mjs → drawer-B6j8nfAY.mjs} +2 -2
  36. package/dist/{drawer-DSFZ61OH.mjs.map → drawer-B6j8nfAY.mjs.map} +1 -1
  37. package/dist/{drawer-Ce5LNpU2.js → drawer-CJsLdd2x.js} +2 -2
  38. package/dist/{drawer-Ce5LNpU2.js.map → drawer-CJsLdd2x.js.map} +1 -1
  39. package/dist/drawer.cjs.js +1 -1
  40. package/dist/drawer.es.js +1 -1
  41. package/dist/{hero-banner-CkSSlxTW.mjs → hero-banner-B5HKmkXc.mjs} +2 -2
  42. package/dist/{hero-banner-CkSSlxTW.mjs.map → hero-banner-B5HKmkXc.mjs.map} +1 -1
  43. package/dist/{hero-banner-JFaqW20R.js → hero-banner-OnNSuxNT.js} +2 -2
  44. package/dist/{hero-banner-JFaqW20R.js.map → hero-banner-OnNSuxNT.js.map} +1 -1
  45. package/dist/hero-banner.cjs.js +1 -1
  46. package/dist/hero-banner.es.js +1 -1
  47. package/dist/library.cjs.js +1 -1
  48. package/dist/library.es.js +17 -17
  49. package/dist/{modal-2ymCXTup.mjs → modal-B1eJu9HN.mjs} +2 -2
  50. package/dist/{modal-2ymCXTup.mjs.map → modal-B1eJu9HN.mjs.map} +1 -1
  51. package/dist/{modal-CXi2xez5.js → modal-CQiJ98iI.js} +2 -2
  52. package/dist/{modal-CXi2xez5.js.map → modal-CQiJ98iI.js.map} +1 -1
  53. package/dist/modal.cjs.js +1 -1
  54. package/dist/modal.es.js +1 -1
  55. package/dist/{notification-BFSOuDp8.mjs → notification-BtcM7Ndu.mjs} +2 -2
  56. package/dist/{notification-BFSOuDp8.mjs.map → notification-BtcM7Ndu.mjs.map} +1 -1
  57. package/dist/{notification-DdnI2rOh.js → notification-Dsg3Vzfi.js} +2 -2
  58. package/dist/{notification-DdnI2rOh.js.map → notification-Dsg3Vzfi.js.map} +1 -1
  59. package/dist/{notification-banner-CT4ew8IQ.js → notification-banner-B0CUuKZn.js} +2 -2
  60. package/dist/{notification-banner-CT4ew8IQ.js.map → notification-banner-B0CUuKZn.js.map} +1 -1
  61. package/dist/{notification-banner-CQvBezAL.mjs → notification-banner-CbKcE7o4.mjs} +2 -2
  62. package/dist/{notification-banner-CQvBezAL.mjs.map → notification-banner-CbKcE7o4.mjs.map} +1 -1
  63. package/dist/notification-banner.cjs.js +1 -1
  64. package/dist/notification-banner.es.js +1 -1
  65. package/dist/notification.cjs.js +1 -1
  66. package/dist/notification.es.js +1 -1
  67. package/dist/{popover-ZeQKmyEb.mjs → popover-D3b2gHm-.mjs} +2 -2
  68. package/dist/{popover-ZeQKmyEb.mjs.map → popover-D3b2gHm-.mjs.map} +1 -1
  69. package/dist/{popover-D3qWbbU4.js → popover-D6k4-oO1.js} +2 -2
  70. package/dist/{popover-D3qWbbU4.js.map → popover-D6k4-oO1.js.map} +1 -1
  71. package/dist/popover.cjs.js +1 -1
  72. package/dist/popover.es.js +1 -1
  73. package/dist/purpur.css +1 -1
  74. package/dist/{quantity-selector-CjSAaj7d.js → quantity-selector-Bc-4Dnpc.js} +2 -2
  75. package/dist/{quantity-selector-CjSAaj7d.js.map → quantity-selector-Bc-4Dnpc.js.map} +1 -1
  76. package/dist/{quantity-selector-HvyYSKah.mjs → quantity-selector-Djf8APeL.mjs} +3 -3
  77. package/dist/{quantity-selector-HvyYSKah.mjs.map → quantity-selector-Djf8APeL.mjs.map} +1 -1
  78. package/dist/quantity-selector.cjs.js +1 -1
  79. package/dist/quantity-selector.es.js +1 -1
  80. package/dist/{search-field-CanOlkIY.js → search-field-0CBoxcNH.js} +2 -2
  81. package/dist/{search-field-CanOlkIY.js.map → search-field-0CBoxcNH.js.map} +1 -1
  82. package/dist/{search-field-BOmCVr5b.mjs → search-field-aP_i6Nr0.mjs} +3 -3
  83. package/dist/{search-field-BOmCVr5b.mjs.map → search-field-aP_i6Nr0.mjs.map} +1 -1
  84. package/dist/search-field.cjs.js +1 -1
  85. package/dist/search-field.es.js +1 -1
  86. package/dist/{stepper-DYjJgEHL.js → stepper-BaoOY4Ea.js} +2 -2
  87. package/dist/{stepper-DYjJgEHL.js.map → stepper-BaoOY4Ea.js.map} +1 -1
  88. package/dist/{stepper-D7T0wed7.mjs → stepper-CTdGj87I.mjs} +3 -3
  89. package/dist/{stepper-D7T0wed7.mjs.map → stepper-CTdGj87I.mjs.map} +1 -1
  90. package/dist/stepper.cjs.js +1 -1
  91. package/dist/stepper.es.js +1 -1
  92. package/dist/{table-B4pts_r4.mjs → table-D7qthqj_.mjs} +5 -5
  93. package/dist/{table-B4pts_r4.mjs.map → table-D7qthqj_.mjs.map} +1 -1
  94. package/dist/{table-Bv_BISXV.js → table-TdOPMFoP.js} +2 -2
  95. package/dist/{table-Bv_BISXV.js.map → table-TdOPMFoP.js.map} +1 -1
  96. package/dist/table.cjs.js +1 -1
  97. package/dist/table.es.js +1 -1
  98. package/dist/{text-field-5rIuW8gc.mjs → text-field-9zPmL99g.mjs} +2 -2
  99. package/dist/{text-field-5rIuW8gc.mjs.map → text-field-9zPmL99g.mjs.map} +1 -1
  100. package/dist/{text-field-Xt6T3zjO.js → text-field-CKCwxTJX.js} +2 -2
  101. package/dist/{text-field-Xt6T3zjO.js.map → text-field-CKCwxTJX.js.map} +1 -1
  102. package/dist/text-field.cjs.js +1 -1
  103. package/dist/text-field.es.js +1 -1
  104. package/dist/{tooltip-DkwyNxrQ.mjs → tooltip-BtGtu3ph.mjs} +2 -2
  105. package/dist/{tooltip-DkwyNxrQ.mjs.map → tooltip-BtGtu3ph.mjs.map} +1 -1
  106. package/dist/{tooltip-svlZkXBs.js → tooltip-eUP35j3v.js} +2 -2
  107. package/dist/{tooltip-svlZkXBs.js.map → tooltip-eUP35j3v.js.map} +1 -1
  108. package/dist/tooltip.cjs.js +1 -1
  109. package/dist/tooltip.es.js +1 -1
  110. package/package.json +20 -20
  111. package/dist/button-BfYKNBmC.mjs +0 -102
  112. package/dist/button-BfYKNBmC.mjs.map +0 -1
  113. package/dist/button-DDYGuqZ0.js +0 -2
  114. package/dist/button-DDYGuqZ0.js.map +0 -1
package/dist/table.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./table-Bv_BISXV.js");exports.Table=e.Table;exports.createColumnHelper=e.createColumnHelper;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./table-TdOPMFoP.js");exports.Table=e.Table;exports.createColumnHelper=e.createColumnHelper;
2
2
  //# sourceMappingURL=table.cjs.js.map
package/dist/table.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import { T as r, c as l } from "./table-B4pts_r4.mjs";
1
+ import { T as r, c as l } from "./table-D7qthqj_.mjs";
2
2
  export {
3
3
  r as Table,
4
4
  l as createColumnHelper
@@ -1,6 +1,6 @@
1
1
  import { jsx as i, jsxs as u } from "react/jsx-runtime";
2
2
  import { useRef as T, forwardRef as k, useId as B, isValidElement as H } from "react";
3
- import { b as L } from "./button-BfYKNBmC.mjs";
3
+ import { b as L } from "./button-D-BBdNhd.mjs";
4
4
  import { F as M } from "./field-error-text-CBSX8dGx.mjs";
5
5
  import { F as S } from "./field-helper-text-C5ee4SFV.mjs";
6
6
  import { r as D } from "./check-circle-filled.es-umBwOv5_.mjs";
@@ -182,4 +182,4 @@ export {
182
182
  C as T,
183
183
  _e as i
184
184
  };
185
- //# sourceMappingURL=text-field-5rIuW8gc.mjs.map
185
+ //# sourceMappingURL=text-field-9zPmL99g.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-field-5rIuW8gc.mjs","sources":["../../../components/text-field/src/utils.ts","../../../components/text-field/src/text-field.tsx"],"sourcesContent":["import { type MutableRefObject, useRef } from \"react\";\n\nexport const useMutableRefObject = <T>(value: T): MutableRefObject<T> => {\n return useRef<T>(value) as MutableRefObject<T>;\n};\n","import React, {\n forwardRef,\n type HTMLInputTypeAttribute,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useId,\n} from \"react\";\nimport { Button } from \"@purpur/button\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconClose } from \"@purpur/icon/close\";\nimport { Label } from \"@purpur/label\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./text-field.module.scss\";\nimport { useMutableRefObject } from \"./utils\";\n\ntype TextFieldBaseProps = {\n /**\n * Use to display e.g. a button before the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n beforeField?: ReactNode;\n /**\n * Use to display e.g. a button after the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n afterField?: ReactNode;\n /**\n * Use to display e.g. an icon at the end inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n endAdornment?: ReactNode;\n /**\n * Use to render error message below the text field. The text field renders with error appearance.\n * */\n errorText?: string;\n /**\n * Use to give context about the field's input. Renders below the field.\n * */\n helperText?: string;\n /**\n * The label of the text field.\n * */\n label?: string;\n /**\n * Use to render a spinner at the end inside of the text field.\n */\n loading?: boolean;\n /**\n * Hide the asterisk for required fields.\n * This is useful when the field is required but the context already indicates that.\n */\n hideRequiredAsterisk?: boolean;\n /**\n * Use to display e.g. an icon at the start inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n startAdornment?: ReactNode;\n /**\n * Use to set the type of the field.\n */\n type?: Extract<\n HTMLInputTypeAttribute,\n \"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\"\n >;\n /**\n * Use to render text field with valid appearance. A check\n * icon will render at the start inside of the input.\n */\n valid?: boolean;\n negative?: boolean;\n};\n\ntype TextFieldClearProps =\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel: string;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n }\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel?: never;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear?: never;\n };\n\nexport type TextFieldProps = Omit<BaseProps<\"input\">, \"type\"> &\n TextFieldBaseProps &\n TextFieldClearProps;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-text-field\";\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n beforeField,\n afterField,\n endAdornment,\n errorText,\n helperText,\n hideRequiredAsterisk = false,\n label,\n loading = false,\n onClear,\n startAdornment,\n valid = false,\n negative = false,\n ...inputProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = inputProps.id ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = valid && !errorText;\n const helperTextId = helperText ? `${inputId}-helper-text` : undefined;\n const startAdornments: ReactNode[] = [startAdornment].filter((adornment) => !!adornment);\n const hasValue =\n typeof inputProps.value === \"number\"\n ? inputProps.value !== undefined\n : inputProps.value?.length;\n const hasClearButton =\n hasValue &&\n !inputProps.disabled &&\n !inputProps.readOnly &&\n !loading &&\n onClear &&\n clearButtonAriaLabel;\n\n const internalRef = useMutableRefObject<HTMLInputElement | null>(null);\n const setRef = (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n const handleClear = () => {\n onClear?.();\n internalRef.current?.focus();\n };\n\n const localEndAdornments: ReactNode[] = [\n loading && (\n <Spinner\n key=\"spinner\"\n disabled={inputProps.disabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n negative={negative}\n />\n ),\n hasClearButton && (\n <Button\n negative={negative}\n key=\"clear-button\"\n variant=\"tertiary-purple\"\n onClick={handleClear}\n iconOnly\n aria-label={clearButtonAriaLabel ?? \"\"}\n data-testid={getTestId(\"clear-button\")}\n tabIndex={-1}\n >\n <IconClose size=\"xs\" />\n </Button>\n ),\n isValid && (\n <IconCheckCircleFilled\n key=\"valid-icon\"\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`, {\n [`${rootClassName}__valid-icon--negative`]: negative,\n })}\n />\n ),\n ].filter((adornment) => !!adornment);\n\n const inputContainerClassnames = cx(`${rootClassName}__input-container`, {\n [`${rootClassName}__input-container--start-adornment`]: startAdornments.length,\n [`${rootClassName}__input-container--end-adornment`]:\n localEndAdornments.length || endAdornment,\n [`${rootClassName}__input-container--disabled`]: inputProps.disabled,\n [`${rootClassName}__input-container--has-clear-button`]: hasClearButton,\n [`${rootClassName}__input-container--readonly`]: inputProps.readOnly && !inputProps.disabled,\n [`${rootClassName}__input-container--negative`]: negative,\n });\n\n return (\n <div className={cx(className, rootClassName)}>\n {label && (\n <Label\n htmlFor={inputId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={inputProps.disabled}\n negative={negative}\n >\n {inputProps.required && !hideRequiredAsterisk && <span aria-hidden>*</span>}\n {label}\n </Label>\n )}\n <div className={cx(`${rootClassName}__field-row`)}>\n {!!beforeField && beforeField}\n <div className={inputContainerClassnames}>\n {!!startAdornments.length && (\n <div\n data-testid={getTestId(\"start-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {startAdornments}\n </div>\n )}\n <input\n {...inputProps}\n id={inputId}\n ref={setRef}\n data-testid={getTestId(\"input\")}\n aria-describedby={inputProps[\"aria-describedby\"] || helperTextId}\n aria-invalid={inputProps[\"aria-invalid\"] || !!errorText}\n className={cx([\n `${rootClassName}__input`,\n {\n [`${rootClassName}__input--valid`]: isValid,\n [`${rootClassName}__input--error`]: !!errorText,\n [`${rootClassName}__input--negative`]: negative,\n },\n ])}\n />\n <div\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n {(!!localEndAdornments.length || endAdornment) && (\n <div\n data-testid={getTestId(\"end-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {localEndAdornments}\n {endAdornment}\n </div>\n )}\n </div>\n {!!afterField && afterField}\n </div>\n {helperTextId && (\n <FieldHelperText\n data-testid={getTestId(\"helper-text\")}\n id={helperTextId}\n negative={negative}\n disabled={inputProps.disabled}\n >\n {helperText}\n </FieldHelperText>\n )}\n {errorText && (\n <FieldErrorText data-testid={getTestId(\"error-text\")} negative={negative}>\n {errorText}\n </FieldErrorText>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport const isTextField = (child?: ReactNode): child is ReactElement<TextFieldProps> =>\n isValidElement<TextFieldProps>(child) &&\n (child.type as any).displayName === TextField.displayName; // eslint-disable-line @typescript-eslint/no-explicit-any\n"],"names":["useMutableRefObject","value","useRef","cx","c","styles","rootClassName","TextField","forwardRef","dataTestId","className","clearButtonAriaLabel","beforeField","afterField","endAdornment","errorText","helperText","hideRequiredAsterisk","label","loading","onClear","startAdornment","valid","negative","inputProps","ref","randomId","useId","inputId","getTestId","name","isValid","helperTextId","startAdornments","adornment","hasClearButton","internalRef","setRef","node","handleClear","localEndAdornments","jsx","Spinner","Button","IconClose","IconCheckCircleFilled","inputContainerClassnames","jsxs","Label","FieldHelperText","FieldErrorText","isTextField","child","isValidElement"],"mappings":"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"}
1
+ {"version":3,"file":"text-field-9zPmL99g.mjs","sources":["../../../components/text-field/src/utils.ts","../../../components/text-field/src/text-field.tsx"],"sourcesContent":["import { type MutableRefObject, useRef } from \"react\";\n\nexport const useMutableRefObject = <T>(value: T): MutableRefObject<T> => {\n return useRef<T>(value) as MutableRefObject<T>;\n};\n","import React, {\n forwardRef,\n type HTMLInputTypeAttribute,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useId,\n} from \"react\";\nimport { Button } from \"@purpur/button\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconClose } from \"@purpur/icon/close\";\nimport { Label } from \"@purpur/label\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./text-field.module.scss\";\nimport { useMutableRefObject } from \"./utils\";\n\ntype TextFieldBaseProps = {\n /**\n * Use to display e.g. a button before the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n beforeField?: ReactNode;\n /**\n * Use to display e.g. a button after the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n afterField?: ReactNode;\n /**\n * Use to display e.g. an icon at the end inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n endAdornment?: ReactNode;\n /**\n * Use to render error message below the text field. The text field renders with error appearance.\n * */\n errorText?: string;\n /**\n * Use to give context about the field's input. Renders below the field.\n * */\n helperText?: string;\n /**\n * The label of the text field.\n * */\n label?: string;\n /**\n * Use to render a spinner at the end inside of the text field.\n */\n loading?: boolean;\n /**\n * Hide the asterisk for required fields.\n * This is useful when the field is required but the context already indicates that.\n */\n hideRequiredAsterisk?: boolean;\n /**\n * Use to display e.g. an icon at the start inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n startAdornment?: ReactNode;\n /**\n * Use to set the type of the field.\n */\n type?: Extract<\n HTMLInputTypeAttribute,\n \"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\"\n >;\n /**\n * Use to render text field with valid appearance. A check\n * icon will render at the start inside of the input.\n */\n valid?: boolean;\n negative?: boolean;\n};\n\ntype TextFieldClearProps =\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel: string;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n }\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel?: never;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear?: never;\n };\n\nexport type TextFieldProps = Omit<BaseProps<\"input\">, \"type\"> &\n TextFieldBaseProps &\n TextFieldClearProps;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-text-field\";\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n beforeField,\n afterField,\n endAdornment,\n errorText,\n helperText,\n hideRequiredAsterisk = false,\n label,\n loading = false,\n onClear,\n startAdornment,\n valid = false,\n negative = false,\n ...inputProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = inputProps.id ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = valid && !errorText;\n const helperTextId = helperText ? `${inputId}-helper-text` : undefined;\n const startAdornments: ReactNode[] = [startAdornment].filter((adornment) => !!adornment);\n const hasValue =\n typeof inputProps.value === \"number\"\n ? inputProps.value !== undefined\n : inputProps.value?.length;\n const hasClearButton =\n hasValue &&\n !inputProps.disabled &&\n !inputProps.readOnly &&\n !loading &&\n onClear &&\n clearButtonAriaLabel;\n\n const internalRef = useMutableRefObject<HTMLInputElement | null>(null);\n const setRef = (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n const handleClear = () => {\n onClear?.();\n internalRef.current?.focus();\n };\n\n const localEndAdornments: ReactNode[] = [\n loading && (\n <Spinner\n key=\"spinner\"\n disabled={inputProps.disabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n negative={negative}\n />\n ),\n hasClearButton && (\n <Button\n negative={negative}\n key=\"clear-button\"\n variant=\"tertiary-purple\"\n onClick={handleClear}\n iconOnly\n aria-label={clearButtonAriaLabel ?? \"\"}\n data-testid={getTestId(\"clear-button\")}\n tabIndex={-1}\n >\n <IconClose size=\"xs\" />\n </Button>\n ),\n isValid && (\n <IconCheckCircleFilled\n key=\"valid-icon\"\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`, {\n [`${rootClassName}__valid-icon--negative`]: negative,\n })}\n />\n ),\n ].filter((adornment) => !!adornment);\n\n const inputContainerClassnames = cx(`${rootClassName}__input-container`, {\n [`${rootClassName}__input-container--start-adornment`]: startAdornments.length,\n [`${rootClassName}__input-container--end-adornment`]:\n localEndAdornments.length || endAdornment,\n [`${rootClassName}__input-container--disabled`]: inputProps.disabled,\n [`${rootClassName}__input-container--has-clear-button`]: hasClearButton,\n [`${rootClassName}__input-container--readonly`]: inputProps.readOnly && !inputProps.disabled,\n [`${rootClassName}__input-container--negative`]: negative,\n });\n\n return (\n <div className={cx(className, rootClassName)}>\n {label && (\n <Label\n htmlFor={inputId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={inputProps.disabled}\n negative={negative}\n >\n {inputProps.required && !hideRequiredAsterisk && <span aria-hidden>*</span>}\n {label}\n </Label>\n )}\n <div className={cx(`${rootClassName}__field-row`)}>\n {!!beforeField && beforeField}\n <div className={inputContainerClassnames}>\n {!!startAdornments.length && (\n <div\n data-testid={getTestId(\"start-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {startAdornments}\n </div>\n )}\n <input\n {...inputProps}\n id={inputId}\n ref={setRef}\n data-testid={getTestId(\"input\")}\n aria-describedby={inputProps[\"aria-describedby\"] || helperTextId}\n aria-invalid={inputProps[\"aria-invalid\"] || !!errorText}\n className={cx([\n `${rootClassName}__input`,\n {\n [`${rootClassName}__input--valid`]: isValid,\n [`${rootClassName}__input--error`]: !!errorText,\n [`${rootClassName}__input--negative`]: negative,\n },\n ])}\n />\n <div\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n {(!!localEndAdornments.length || endAdornment) && (\n <div\n data-testid={getTestId(\"end-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {localEndAdornments}\n {endAdornment}\n </div>\n )}\n </div>\n {!!afterField && afterField}\n </div>\n {helperTextId && (\n <FieldHelperText\n data-testid={getTestId(\"helper-text\")}\n id={helperTextId}\n negative={negative}\n disabled={inputProps.disabled}\n >\n {helperText}\n </FieldHelperText>\n )}\n {errorText && (\n <FieldErrorText data-testid={getTestId(\"error-text\")} negative={negative}>\n {errorText}\n </FieldErrorText>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport const isTextField = (child?: ReactNode): child is ReactElement<TextFieldProps> =>\n isValidElement<TextFieldProps>(child) &&\n (child.type as any).displayName === TextField.displayName; // eslint-disable-line @typescript-eslint/no-explicit-any\n"],"names":["useMutableRefObject","value","useRef","cx","c","styles","rootClassName","TextField","forwardRef","dataTestId","className","clearButtonAriaLabel","beforeField","afterField","endAdornment","errorText","helperText","hideRequiredAsterisk","label","loading","onClear","startAdornment","valid","negative","inputProps","ref","randomId","useId","inputId","getTestId","name","isValid","helperTextId","startAdornments","adornment","hasClearButton","internalRef","setRef","node","handleClear","localEndAdornments","jsx","Spinner","Button","IconClose","IconCheckCircleFilled","inputContainerClassnames","jsxs","Label","FieldHelperText","FieldErrorText","isTextField","child","isValidElement"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const n=require("react/jsx-runtime"),s=require("react"),k=require("./button-DDYGuqZ0.js"),z=require("./field-error-text-FhQulSV5.js"),H=require("./field-helper-text-DSKO-Tce.js"),B=require("./check-circle-filled.es-5-GXE9l4.js"),M=require("./close.es-VL3lKi1O.js"),S=require("./label-yHK80hhV.js"),D=require("./spinner-tKunS_o-.js"),G=require("./bind-DeUYJ6m9.js"),J={"purpur-text-field":"_purpur-text-field_1n0q1_1","purpur-text-field__label":"_purpur-text-field__label_1n0q1_7","purpur-text-field__label-text":"_purpur-text-field__label-text_1n0q1_12","purpur-text-field__field-row":"_purpur-text-field__field-row_1n0q1_15","purpur-text-field__frame":"_purpur-text-field__frame_1n0q1_19","purpur-text-field__frame--negative":"_purpur-text-field__frame--negative_1n0q1_26","purpur-text-field__input-container":"_purpur-text-field__input-container_1n0q1_29","purpur-text-field__input-container--disabled":"_purpur-text-field__input-container--disabled_1n0q1_40","purpur-text-field__input-container--readonly":"_purpur-text-field__input-container--readonly_1n0q1_43","purpur-text-field__input-container--has-clear-button":"_purpur-text-field__input-container--has-clear-button_1n0q1_46","purpur-text-field__input-container--end-adornment":"_purpur-text-field__input-container--end-adornment_1n0q1_49","purpur-text-field__input":"_purpur-text-field__input_1n0q1_29","purpur-text-field__input-container--start-adornment":"_purpur-text-field__input-container--start-adornment_1n0q1_55","purpur-text-field__input-container--negative":"_purpur-text-field__input-container--negative_1n0q1_61","purpur-text-field__input--valid":"_purpur-text-field__input--valid_1n0q1_109","purpur-text-field__input--error":"_purpur-text-field__input--error_1n0q1_109","purpur-text-field__input--negative":"_purpur-text-field__input--negative_1n0q1_130","purpur-text-field__adornment-container":"_purpur-text-field__adornment-container_1n0q1_146","purpur-text-field__valid-icon":"_purpur-text-field__valid-icon_1n0q1_151","purpur-text-field__valid-icon--negative":"_purpur-text-field__valid-icon--negative_1n0q1_154"},K=d=>s.useRef(d),_=G.c.bind(J),e="purpur-text-field",m=s.forwardRef(({["data-testid"]:d,className:R,clearButtonAriaLabel:b,beforeField:q,afterField:v,endAdornment:p,errorText:l,helperText:h,hideRequiredAsterisk:C=!1,label:$,loading:j=!1,onClear:y,startAdornment:I,valid:T=!1,negative:i=!1,...t},u)=>{const w=s.useId(),c=t.id??w,r=a=>d?`${d}-${a}`:void 0,N=T&&!l,o=h?`${c}-helper-text`:void 0,x=[I].filter(a=>!!a),g=(typeof t.value=="number"?t.value!==void 0:t.value?.length)&&!t.disabled&&!t.readOnly&&!j&&y&&b,F=K(null),E=a=>{F.current=a,typeof u=="function"?u(a):u&&(u.current=a)},O=()=>{y?.(),F.current?.focus()},f=[j&&n.jsx(D.Spinner,{disabled:t.disabled,size:"xs","data-testid":r("spinner"),negative:i},"spinner"),g&&n.jsx(k.Button,{negative:i,variant:"tertiary-purple",onClick:O,iconOnly:!0,"aria-label":b??"","data-testid":r("clear-button"),tabIndex:-1,children:n.jsx(M.r,{size:"xs"})},"clear-button"),N&&n.jsx(B.r,{"data-testid":r("valid-icon"),className:_(`${e}__valid-icon`,{[`${e}__valid-icon--negative`]:i})},"valid-icon")].filter(a=>!!a),V=_(`${e}__input-container`,{[`${e}__input-container--start-adornment`]:x.length,[`${e}__input-container--end-adornment`]:f.length||p,[`${e}__input-container--disabled`]:t.disabled,[`${e}__input-container--has-clear-button`]:g,[`${e}__input-container--readonly`]:t.readOnly&&!t.disabled,[`${e}__input-container--negative`]:i});return n.jsxs("div",{className:_(R,e),children:[$&&n.jsxs(S.Label,{htmlFor:c,className:_(`${e}__label`),"data-testid":r("label"),disabled:t.disabled,negative:i,children:[t.required&&!C&&n.jsx("span",{"aria-hidden":!0,children:"*"}),$]}),n.jsxs("div",{className:_(`${e}__field-row`),children:[!!q&&q,n.jsxs("div",{className:V,children:[!!x.length&&n.jsx("div",{"data-testid":r("start-adornments"),className:_(`${e}__adornment-container`),children:x}),n.jsx("input",{...t,id:c,ref:E,"data-testid":r("input"),"aria-describedby":t["aria-describedby"]||o,"aria-invalid":t["aria-invalid"]||!!l,className:_([`${e}__input`,{[`${e}__input--valid`]:N,[`${e}__input--error`]:!!l,[`${e}__input--negative`]:i}])}),n.jsx("div",{className:_(`${e}__frame`,{[`${e}__frame--negative`]:i})}),(!!f.length||p)&&n.jsxs("div",{"data-testid":r("end-adornments"),className:_(`${e}__adornment-container`),children:[f,p]})]}),!!v&&v]}),o&&n.jsx(H.FieldHelperText,{"data-testid":r("helper-text"),id:o,negative:i,disabled:t.disabled,children:h}),l&&n.jsx(z.FieldErrorText,{"data-testid":r("error-text"),negative:i,children:l})]})});m.displayName="TextField";const L=d=>s.isValidElement(d)&&d.type.displayName===m.displayName;exports.TextField=m;exports.isTextField=L;
2
- //# sourceMappingURL=text-field-Xt6T3zjO.js.map
1
+ "use strict";const n=require("react/jsx-runtime"),s=require("react"),k=require("./button-BxdChrq-.js"),z=require("./field-error-text-FhQulSV5.js"),H=require("./field-helper-text-DSKO-Tce.js"),B=require("./check-circle-filled.es-5-GXE9l4.js"),M=require("./close.es-VL3lKi1O.js"),S=require("./label-yHK80hhV.js"),D=require("./spinner-tKunS_o-.js"),G=require("./bind-DeUYJ6m9.js"),J={"purpur-text-field":"_purpur-text-field_1n0q1_1","purpur-text-field__label":"_purpur-text-field__label_1n0q1_7","purpur-text-field__label-text":"_purpur-text-field__label-text_1n0q1_12","purpur-text-field__field-row":"_purpur-text-field__field-row_1n0q1_15","purpur-text-field__frame":"_purpur-text-field__frame_1n0q1_19","purpur-text-field__frame--negative":"_purpur-text-field__frame--negative_1n0q1_26","purpur-text-field__input-container":"_purpur-text-field__input-container_1n0q1_29","purpur-text-field__input-container--disabled":"_purpur-text-field__input-container--disabled_1n0q1_40","purpur-text-field__input-container--readonly":"_purpur-text-field__input-container--readonly_1n0q1_43","purpur-text-field__input-container--has-clear-button":"_purpur-text-field__input-container--has-clear-button_1n0q1_46","purpur-text-field__input-container--end-adornment":"_purpur-text-field__input-container--end-adornment_1n0q1_49","purpur-text-field__input":"_purpur-text-field__input_1n0q1_29","purpur-text-field__input-container--start-adornment":"_purpur-text-field__input-container--start-adornment_1n0q1_55","purpur-text-field__input-container--negative":"_purpur-text-field__input-container--negative_1n0q1_61","purpur-text-field__input--valid":"_purpur-text-field__input--valid_1n0q1_109","purpur-text-field__input--error":"_purpur-text-field__input--error_1n0q1_109","purpur-text-field__input--negative":"_purpur-text-field__input--negative_1n0q1_130","purpur-text-field__adornment-container":"_purpur-text-field__adornment-container_1n0q1_146","purpur-text-field__valid-icon":"_purpur-text-field__valid-icon_1n0q1_151","purpur-text-field__valid-icon--negative":"_purpur-text-field__valid-icon--negative_1n0q1_154"},K=d=>s.useRef(d),_=G.c.bind(J),e="purpur-text-field",m=s.forwardRef(({["data-testid"]:d,className:R,clearButtonAriaLabel:b,beforeField:q,afterField:v,endAdornment:p,errorText:l,helperText:h,hideRequiredAsterisk:C=!1,label:$,loading:j=!1,onClear:y,startAdornment:I,valid:T=!1,negative:i=!1,...t},u)=>{const w=s.useId(),c=t.id??w,r=a=>d?`${d}-${a}`:void 0,N=T&&!l,o=h?`${c}-helper-text`:void 0,x=[I].filter(a=>!!a),g=(typeof t.value=="number"?t.value!==void 0:t.value?.length)&&!t.disabled&&!t.readOnly&&!j&&y&&b,F=K(null),E=a=>{F.current=a,typeof u=="function"?u(a):u&&(u.current=a)},O=()=>{y?.(),F.current?.focus()},f=[j&&n.jsx(D.Spinner,{disabled:t.disabled,size:"xs","data-testid":r("spinner"),negative:i},"spinner"),g&&n.jsx(k.Button,{negative:i,variant:"tertiary-purple",onClick:O,iconOnly:!0,"aria-label":b??"","data-testid":r("clear-button"),tabIndex:-1,children:n.jsx(M.r,{size:"xs"})},"clear-button"),N&&n.jsx(B.r,{"data-testid":r("valid-icon"),className:_(`${e}__valid-icon`,{[`${e}__valid-icon--negative`]:i})},"valid-icon")].filter(a=>!!a),V=_(`${e}__input-container`,{[`${e}__input-container--start-adornment`]:x.length,[`${e}__input-container--end-adornment`]:f.length||p,[`${e}__input-container--disabled`]:t.disabled,[`${e}__input-container--has-clear-button`]:g,[`${e}__input-container--readonly`]:t.readOnly&&!t.disabled,[`${e}__input-container--negative`]:i});return n.jsxs("div",{className:_(R,e),children:[$&&n.jsxs(S.Label,{htmlFor:c,className:_(`${e}__label`),"data-testid":r("label"),disabled:t.disabled,negative:i,children:[t.required&&!C&&n.jsx("span",{"aria-hidden":!0,children:"*"}),$]}),n.jsxs("div",{className:_(`${e}__field-row`),children:[!!q&&q,n.jsxs("div",{className:V,children:[!!x.length&&n.jsx("div",{"data-testid":r("start-adornments"),className:_(`${e}__adornment-container`),children:x}),n.jsx("input",{...t,id:c,ref:E,"data-testid":r("input"),"aria-describedby":t["aria-describedby"]||o,"aria-invalid":t["aria-invalid"]||!!l,className:_([`${e}__input`,{[`${e}__input--valid`]:N,[`${e}__input--error`]:!!l,[`${e}__input--negative`]:i}])}),n.jsx("div",{className:_(`${e}__frame`,{[`${e}__frame--negative`]:i})}),(!!f.length||p)&&n.jsxs("div",{"data-testid":r("end-adornments"),className:_(`${e}__adornment-container`),children:[f,p]})]}),!!v&&v]}),o&&n.jsx(H.FieldHelperText,{"data-testid":r("helper-text"),id:o,negative:i,disabled:t.disabled,children:h}),l&&n.jsx(z.FieldErrorText,{"data-testid":r("error-text"),negative:i,children:l})]})});m.displayName="TextField";const L=d=>s.isValidElement(d)&&d.type.displayName===m.displayName;exports.TextField=m;exports.isTextField=L;
2
+ //# sourceMappingURL=text-field-CKCwxTJX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-field-Xt6T3zjO.js","sources":["../../../components/text-field/src/utils.ts","../../../components/text-field/src/text-field.tsx"],"sourcesContent":["import { type MutableRefObject, useRef } from \"react\";\n\nexport const useMutableRefObject = <T>(value: T): MutableRefObject<T> => {\n return useRef<T>(value) as MutableRefObject<T>;\n};\n","import React, {\n forwardRef,\n type HTMLInputTypeAttribute,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useId,\n} from \"react\";\nimport { Button } from \"@purpur/button\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconClose } from \"@purpur/icon/close\";\nimport { Label } from \"@purpur/label\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./text-field.module.scss\";\nimport { useMutableRefObject } from \"./utils\";\n\ntype TextFieldBaseProps = {\n /**\n * Use to display e.g. a button before the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n beforeField?: ReactNode;\n /**\n * Use to display e.g. a button after the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n afterField?: ReactNode;\n /**\n * Use to display e.g. an icon at the end inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n endAdornment?: ReactNode;\n /**\n * Use to render error message below the text field. The text field renders with error appearance.\n * */\n errorText?: string;\n /**\n * Use to give context about the field's input. Renders below the field.\n * */\n helperText?: string;\n /**\n * The label of the text field.\n * */\n label?: string;\n /**\n * Use to render a spinner at the end inside of the text field.\n */\n loading?: boolean;\n /**\n * Hide the asterisk for required fields.\n * This is useful when the field is required but the context already indicates that.\n */\n hideRequiredAsterisk?: boolean;\n /**\n * Use to display e.g. an icon at the start inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n startAdornment?: ReactNode;\n /**\n * Use to set the type of the field.\n */\n type?: Extract<\n HTMLInputTypeAttribute,\n \"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\"\n >;\n /**\n * Use to render text field with valid appearance. A check\n * icon will render at the start inside of the input.\n */\n valid?: boolean;\n negative?: boolean;\n};\n\ntype TextFieldClearProps =\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel: string;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n }\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel?: never;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear?: never;\n };\n\nexport type TextFieldProps = Omit<BaseProps<\"input\">, \"type\"> &\n TextFieldBaseProps &\n TextFieldClearProps;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-text-field\";\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n beforeField,\n afterField,\n endAdornment,\n errorText,\n helperText,\n hideRequiredAsterisk = false,\n label,\n loading = false,\n onClear,\n startAdornment,\n valid = false,\n negative = false,\n ...inputProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = inputProps.id ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = valid && !errorText;\n const helperTextId = helperText ? `${inputId}-helper-text` : undefined;\n const startAdornments: ReactNode[] = [startAdornment].filter((adornment) => !!adornment);\n const hasValue =\n typeof inputProps.value === \"number\"\n ? inputProps.value !== undefined\n : inputProps.value?.length;\n const hasClearButton =\n hasValue &&\n !inputProps.disabled &&\n !inputProps.readOnly &&\n !loading &&\n onClear &&\n clearButtonAriaLabel;\n\n const internalRef = useMutableRefObject<HTMLInputElement | null>(null);\n const setRef = (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n const handleClear = () => {\n onClear?.();\n internalRef.current?.focus();\n };\n\n const localEndAdornments: ReactNode[] = [\n loading && (\n <Spinner\n key=\"spinner\"\n disabled={inputProps.disabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n negative={negative}\n />\n ),\n hasClearButton && (\n <Button\n negative={negative}\n key=\"clear-button\"\n variant=\"tertiary-purple\"\n onClick={handleClear}\n iconOnly\n aria-label={clearButtonAriaLabel ?? \"\"}\n data-testid={getTestId(\"clear-button\")}\n tabIndex={-1}\n >\n <IconClose size=\"xs\" />\n </Button>\n ),\n isValid && (\n <IconCheckCircleFilled\n key=\"valid-icon\"\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`, {\n [`${rootClassName}__valid-icon--negative`]: negative,\n })}\n />\n ),\n ].filter((adornment) => !!adornment);\n\n const inputContainerClassnames = cx(`${rootClassName}__input-container`, {\n [`${rootClassName}__input-container--start-adornment`]: startAdornments.length,\n [`${rootClassName}__input-container--end-adornment`]:\n localEndAdornments.length || endAdornment,\n [`${rootClassName}__input-container--disabled`]: inputProps.disabled,\n [`${rootClassName}__input-container--has-clear-button`]: hasClearButton,\n [`${rootClassName}__input-container--readonly`]: inputProps.readOnly && !inputProps.disabled,\n [`${rootClassName}__input-container--negative`]: negative,\n });\n\n return (\n <div className={cx(className, rootClassName)}>\n {label && (\n <Label\n htmlFor={inputId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={inputProps.disabled}\n negative={negative}\n >\n {inputProps.required && !hideRequiredAsterisk && <span aria-hidden>*</span>}\n {label}\n </Label>\n )}\n <div className={cx(`${rootClassName}__field-row`)}>\n {!!beforeField && beforeField}\n <div className={inputContainerClassnames}>\n {!!startAdornments.length && (\n <div\n data-testid={getTestId(\"start-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {startAdornments}\n </div>\n )}\n <input\n {...inputProps}\n id={inputId}\n ref={setRef}\n data-testid={getTestId(\"input\")}\n aria-describedby={inputProps[\"aria-describedby\"] || helperTextId}\n aria-invalid={inputProps[\"aria-invalid\"] || !!errorText}\n className={cx([\n `${rootClassName}__input`,\n {\n [`${rootClassName}__input--valid`]: isValid,\n [`${rootClassName}__input--error`]: !!errorText,\n [`${rootClassName}__input--negative`]: negative,\n },\n ])}\n />\n <div\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n {(!!localEndAdornments.length || endAdornment) && (\n <div\n data-testid={getTestId(\"end-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {localEndAdornments}\n {endAdornment}\n </div>\n )}\n </div>\n {!!afterField && afterField}\n </div>\n {helperTextId && (\n <FieldHelperText\n data-testid={getTestId(\"helper-text\")}\n id={helperTextId}\n negative={negative}\n disabled={inputProps.disabled}\n >\n {helperText}\n </FieldHelperText>\n )}\n {errorText && (\n <FieldErrorText data-testid={getTestId(\"error-text\")} negative={negative}>\n {errorText}\n </FieldErrorText>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport const isTextField = (child?: ReactNode): child is ReactElement<TextFieldProps> =>\n isValidElement<TextFieldProps>(child) &&\n (child.type as any).displayName === TextField.displayName; // eslint-disable-line @typescript-eslint/no-explicit-any\n"],"names":["useMutableRefObject","value","useRef","cx","c","styles","rootClassName","TextField","forwardRef","dataTestId","className","clearButtonAriaLabel","beforeField","afterField","endAdornment","errorText","helperText","hideRequiredAsterisk","label","loading","onClear","startAdornment","valid","negative","inputProps","ref","randomId","useId","inputId","getTestId","name","isValid","helperTextId","startAdornments","adornment","hasClearButton","internalRef","setRef","node","handleClear","localEndAdornments","jsx","Spinner","Button","IconClose","IconCheckCircleFilled","inputContainerClassnames","jsxs","Label","FieldHelperText","FieldErrorText","isTextField","child","isValidElement"],"mappings":"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"}
1
+ {"version":3,"file":"text-field-CKCwxTJX.js","sources":["../../../components/text-field/src/utils.ts","../../../components/text-field/src/text-field.tsx"],"sourcesContent":["import { type MutableRefObject, useRef } from \"react\";\n\nexport const useMutableRefObject = <T>(value: T): MutableRefObject<T> => {\n return useRef<T>(value) as MutableRefObject<T>;\n};\n","import React, {\n forwardRef,\n type HTMLInputTypeAttribute,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useId,\n} from \"react\";\nimport { Button } from \"@purpur/button\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconClose } from \"@purpur/icon/close\";\nimport { Label } from \"@purpur/label\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./text-field.module.scss\";\nimport { useMutableRefObject } from \"./utils\";\n\ntype TextFieldBaseProps = {\n /**\n * Use to display e.g. a button before the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n beforeField?: ReactNode;\n /**\n * Use to display e.g. a button after the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n afterField?: ReactNode;\n /**\n * Use to display e.g. an icon at the end inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n endAdornment?: ReactNode;\n /**\n * Use to render error message below the text field. The text field renders with error appearance.\n * */\n errorText?: string;\n /**\n * Use to give context about the field's input. Renders below the field.\n * */\n helperText?: string;\n /**\n * The label of the text field.\n * */\n label?: string;\n /**\n * Use to render a spinner at the end inside of the text field.\n */\n loading?: boolean;\n /**\n * Hide the asterisk for required fields.\n * This is useful when the field is required but the context already indicates that.\n */\n hideRequiredAsterisk?: boolean;\n /**\n * Use to display e.g. an icon at the start inside of the text field.\n *\n * _NOTE: Should ideally only be used by other purpur components!_\n */\n startAdornment?: ReactNode;\n /**\n * Use to set the type of the field.\n */\n type?: Extract<\n HTMLInputTypeAttribute,\n \"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\"\n >;\n /**\n * Use to render text field with valid appearance. A check\n * icon will render at the start inside of the input.\n */\n valid?: boolean;\n negative?: boolean;\n};\n\ntype TextFieldClearProps =\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel: string;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n }\n | {\n /**\n * An accessible label for the clear button.\n * */\n clearButtonAriaLabel?: never;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear?: never;\n };\n\nexport type TextFieldProps = Omit<BaseProps<\"input\">, \"type\"> &\n TextFieldBaseProps &\n TextFieldClearProps;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-text-field\";\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n beforeField,\n afterField,\n endAdornment,\n errorText,\n helperText,\n hideRequiredAsterisk = false,\n label,\n loading = false,\n onClear,\n startAdornment,\n valid = false,\n negative = false,\n ...inputProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = inputProps.id ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = valid && !errorText;\n const helperTextId = helperText ? `${inputId}-helper-text` : undefined;\n const startAdornments: ReactNode[] = [startAdornment].filter((adornment) => !!adornment);\n const hasValue =\n typeof inputProps.value === \"number\"\n ? inputProps.value !== undefined\n : inputProps.value?.length;\n const hasClearButton =\n hasValue &&\n !inputProps.disabled &&\n !inputProps.readOnly &&\n !loading &&\n onClear &&\n clearButtonAriaLabel;\n\n const internalRef = useMutableRefObject<HTMLInputElement | null>(null);\n const setRef = (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n const handleClear = () => {\n onClear?.();\n internalRef.current?.focus();\n };\n\n const localEndAdornments: ReactNode[] = [\n loading && (\n <Spinner\n key=\"spinner\"\n disabled={inputProps.disabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n negative={negative}\n />\n ),\n hasClearButton && (\n <Button\n negative={negative}\n key=\"clear-button\"\n variant=\"tertiary-purple\"\n onClick={handleClear}\n iconOnly\n aria-label={clearButtonAriaLabel ?? \"\"}\n data-testid={getTestId(\"clear-button\")}\n tabIndex={-1}\n >\n <IconClose size=\"xs\" />\n </Button>\n ),\n isValid && (\n <IconCheckCircleFilled\n key=\"valid-icon\"\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`, {\n [`${rootClassName}__valid-icon--negative`]: negative,\n })}\n />\n ),\n ].filter((adornment) => !!adornment);\n\n const inputContainerClassnames = cx(`${rootClassName}__input-container`, {\n [`${rootClassName}__input-container--start-adornment`]: startAdornments.length,\n [`${rootClassName}__input-container--end-adornment`]:\n localEndAdornments.length || endAdornment,\n [`${rootClassName}__input-container--disabled`]: inputProps.disabled,\n [`${rootClassName}__input-container--has-clear-button`]: hasClearButton,\n [`${rootClassName}__input-container--readonly`]: inputProps.readOnly && !inputProps.disabled,\n [`${rootClassName}__input-container--negative`]: negative,\n });\n\n return (\n <div className={cx(className, rootClassName)}>\n {label && (\n <Label\n htmlFor={inputId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={inputProps.disabled}\n negative={negative}\n >\n {inputProps.required && !hideRequiredAsterisk && <span aria-hidden>*</span>}\n {label}\n </Label>\n )}\n <div className={cx(`${rootClassName}__field-row`)}>\n {!!beforeField && beforeField}\n <div className={inputContainerClassnames}>\n {!!startAdornments.length && (\n <div\n data-testid={getTestId(\"start-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {startAdornments}\n </div>\n )}\n <input\n {...inputProps}\n id={inputId}\n ref={setRef}\n data-testid={getTestId(\"input\")}\n aria-describedby={inputProps[\"aria-describedby\"] || helperTextId}\n aria-invalid={inputProps[\"aria-invalid\"] || !!errorText}\n className={cx([\n `${rootClassName}__input`,\n {\n [`${rootClassName}__input--valid`]: isValid,\n [`${rootClassName}__input--error`]: !!errorText,\n [`${rootClassName}__input--negative`]: negative,\n },\n ])}\n />\n <div\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n {(!!localEndAdornments.length || endAdornment) && (\n <div\n data-testid={getTestId(\"end-adornments\")}\n className={cx(`${rootClassName}__adornment-container`)}\n >\n {localEndAdornments}\n {endAdornment}\n </div>\n )}\n </div>\n {!!afterField && afterField}\n </div>\n {helperTextId && (\n <FieldHelperText\n data-testid={getTestId(\"helper-text\")}\n id={helperTextId}\n negative={negative}\n disabled={inputProps.disabled}\n >\n {helperText}\n </FieldHelperText>\n )}\n {errorText && (\n <FieldErrorText data-testid={getTestId(\"error-text\")} negative={negative}>\n {errorText}\n </FieldErrorText>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport const isTextField = (child?: ReactNode): child is ReactElement<TextFieldProps> =>\n isValidElement<TextFieldProps>(child) &&\n (child.type as any).displayName === TextField.displayName; // eslint-disable-line @typescript-eslint/no-explicit-any\n"],"names":["useMutableRefObject","value","useRef","cx","c","styles","rootClassName","TextField","forwardRef","dataTestId","className","clearButtonAriaLabel","beforeField","afterField","endAdornment","errorText","helperText","hideRequiredAsterisk","label","loading","onClear","startAdornment","valid","negative","inputProps","ref","randomId","useId","inputId","getTestId","name","isValid","helperTextId","startAdornments","adornment","hasClearButton","internalRef","setRef","node","handleClear","localEndAdornments","jsx","Spinner","Button","IconClose","IconCheckCircleFilled","inputContainerClassnames","jsxs","Label","FieldHelperText","FieldErrorText","isTextField","child","isValidElement"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./text-field-Xt6T3zjO.js");exports.TextField=e.TextField;exports.isTextField=e.isTextField;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./text-field-CKCwxTJX.js");exports.TextField=e.TextField;exports.isTextField=e.isTextField;
2
2
  //# sourceMappingURL=text-field.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { T as s, i as t } from "./text-field-5rIuW8gc.mjs";
1
+ import { T as s, i as t } from "./text-field-9zPmL99g.mjs";
2
2
  export {
3
3
  s as TextField,
4
4
  t as isTextField
@@ -1,7 +1,7 @@
1
1
  import { jsx as p, Fragment as Qe, jsxs as Y } from "react/jsx-runtime";
2
2
  import * as i from "react";
3
3
  import { forwardRef as et, useState as tt, Children as nt } from "react";
4
- import { b as rt, a as ot } from "./button-BfYKNBmC.mjs";
4
+ import { b as rt, a as ot } from "./button-D-BBdNhd.mjs";
5
5
  import { r as st } from "./info.es-u0pS2u7W.mjs";
6
6
  import { P as it, a as at } from "./paragraph-Ci50OF1u.mjs";
7
7
  import { f as ct } from "./variables-Dr3Hsdn-.mjs";
@@ -1061,4 +1061,4 @@ export {
1061
1061
  Sn as a,
1062
1062
  Ln as b
1063
1063
  };
1064
- //# sourceMappingURL=tooltip-DkwyNxrQ.mjs.map
1064
+ //# sourceMappingURL=tooltip-BtGtu3ph.mjs.map