@spark-web/field 4.0.0-rc.19 → 4.0.0-rc.20

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @spark-web/field
2
2
 
3
+ ## 4.0.0-rc.20
4
+
5
+ ### Minor Changes
6
+
7
+ - Support for component-level theming; button-level theming
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies []:
12
+ - @spark-web/stack@2.0.0-rc.20
13
+ - @spark-web/theme@4.0.0-rc.20
14
+ - @spark-web/utils@2.0.0-rc.20
15
+ - @spark-web/a11y@2.0.0-rc.20
16
+ - @spark-web/icon@2.0.0-rc.20
17
+ - @spark-web/text@2.0.0-rc.20
18
+ - @spark-web/box@2.0.0-rc.20
19
+
3
20
  ## 4.0.0-rc.19
4
21
 
5
22
  ### Major Changes
@@ -1,2 +1,2 @@
1
- export * from "./declarations/src/index";
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhcmstd2ViLWZpZWxkLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi9kZWNsYXJhdGlvbnMvc3JjL2luZGV4LmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEifQ==
1
+ export * from "../src/index";
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhcmstd2ViLWZpZWxkLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=
@@ -1,7 +1,16 @@
1
- 'use strict';
1
+ "use strict";
2
+ // this file might look strange and you might be wondering what it's for
3
+ // it's lets you import your source files by importing this entrypoint
4
+ // as you would import it if it was built with preconstruct build
5
+ // this file is slightly different to some others though
6
+ // it has a require hook which compiles your code with Babel
7
+ // this means that you don't have to set up @babel/register or anything like that
8
+ // but you can still require this module and it'll be compiled
2
9
 
3
- if (process.env.NODE_ENV === "production") {
4
- module.exports = require("./spark-web-field.cjs.prod.js");
5
- } else {
6
- module.exports = require("./spark-web-field.cjs.dev.js");
7
- }
10
+ // this bit of code imports the require hook and registers it
11
+ let unregister = require("../../../node_modules/@preconstruct/hook").___internalHook(typeof __dirname === 'undefined' ? undefined : __dirname, "../../..", "..");
12
+
13
+ // this re-exports the source file
14
+ module.exports = require("../src/index.ts");
15
+
16
+ unregister();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spark-web/field",
3
- "version": "4.0.0-rc.19",
3
+ "version": "4.0.0-rc.20",
4
4
  "homepage": "https://github.com/brighte-labs/spark-web#readme",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,13 +17,13 @@
17
17
  "dependencies": {
18
18
  "@babel/runtime": "^7.25.0",
19
19
  "@emotion/react": "^11.14.0",
20
- "@spark-web/a11y": "^2.0.0-rc.19",
21
- "@spark-web/box": "^2.0.0-rc.19",
22
- "@spark-web/icon": "^2.0.0-rc.19",
23
- "@spark-web/stack": "^2.0.0-rc.19",
24
- "@spark-web/text": "^2.0.0-rc.19",
25
- "@spark-web/theme": "^4.0.0-rc.19",
26
- "@spark-web/utils": "^2.0.0-rc.19"
20
+ "@spark-web/a11y": "^2.0.0-rc.20",
21
+ "@spark-web/box": "^2.0.0-rc.20",
22
+ "@spark-web/icon": "^2.0.0-rc.20",
23
+ "@spark-web/stack": "^2.0.0-rc.20",
24
+ "@spark-web/text": "^2.0.0-rc.20",
25
+ "@spark-web/theme": "^4.0.0-rc.20",
26
+ "@spark-web/utils": "^2.0.0-rc.20"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/react": "^18.2.0",
@@ -1,15 +0,0 @@
1
- /// <reference types="react" />
2
- export declare type FieldState = {
3
- disabled: boolean;
4
- invalid: boolean;
5
- };
6
- export declare type InputPropsDerivedFromField = {
7
- 'aria-describedby'?: string;
8
- 'aria-invalid': true | undefined;
9
- id: string;
10
- };
11
- export declare type FieldContextType = [FieldState, InputPropsDerivedFromField];
12
- export declare const FieldContext: import("react").Context<FieldContextType | null>;
13
- export declare const FieldContextProvider: import("react").Provider<FieldContextType | null>;
14
- export declare const FIELD_CONTEXT_ERROR_MESSAGE = "Input components must be inside a `Field`.";
15
- export declare function useFieldContext(): FieldContextType;
@@ -1,51 +0,0 @@
1
- import type { DataAttributeMap } from '@spark-web/utils/internal';
2
- import type { ReactElement, ReactNode } from 'react';
3
- export declare type Tone = keyof typeof messageToneMap;
4
- export declare type FieldProps = {
5
- /** Sets a unique identifier for the component. */
6
- id?: string;
7
- /** Sets data attributes on the component. */
8
- data?: DataAttributeMap;
9
- /** Optionally provide a utility or contextual hint, related to the field. */
10
- adornment?: ReactElement;
11
- /** Input component */
12
- children: ReactNode;
13
- /**
14
- * Indicates that the field is perceivable but disabled, so it is not editable
15
- * or otherwise operable.
16
- */
17
- disabled?: boolean;
18
- /** Provide additional information that will aid user input. */
19
- description?: string;
20
- /** Concisely label the field. */
21
- label: string;
22
- /**
23
- * The label must always be provided for assistive technology, but you may
24
- * hide it from sighted users when the intent can be inferred from context.
25
- */
26
- labelVisibility?: 'hidden' | 'reserve-space' | 'visible';
27
- /** Provide a message, informing the user about changes in state. */
28
- message?: string;
29
- /** Additional context, typically used to indicate that the field is optional. */
30
- secondaryLabel?: string;
31
- /** Provide a tone to influence elements of the field, and its input. */
32
- tone?: Tone;
33
- };
34
- /**
35
- * Using a [context](https://reactjs.org/docs/context.html), the field
36
- * component connects the label, description, and message to the input element.
37
- */
38
- export declare const Field: import("react").ForwardRefExoticComponent<FieldProps & import("react").RefAttributes<HTMLDivElement>>;
39
- export declare function useFieldIds(id?: string): {
40
- descriptionId: string;
41
- inputId: string;
42
- messageId: string;
43
- };
44
- declare const messageToneMap: {
45
- readonly critical: "critical";
46
- readonly neutral: "muted";
47
- readonly positive: "positive";
48
- };
49
- declare type FieldMessageProps = Required<Pick<FieldProps, 'message' | 'id' | 'tone'>>;
50
- export declare const FieldMessage: ({ message, id, tone }: FieldMessageProps) => import("@emotion/react/jsx-runtime").JSX.Element;
51
- export {};
@@ -1,4 +0,0 @@
1
- export { FieldContextProvider, useFieldContext } from "./context.js";
2
- export { Field, FieldMessage, useFieldIds } from "./field.js";
3
- export type { FieldContextType, FieldState, InputPropsDerivedFromField, } from "./context.js";
4
- export type { FieldProps, Tone } from "./field.js";
@@ -1,205 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var react = require('react');
6
- var react$1 = require('@emotion/react');
7
- var a11y = require('@spark-web/a11y');
8
- var box = require('@spark-web/box');
9
- var icon = require('@spark-web/icon');
10
- var stack = require('@spark-web/stack');
11
- var text = require('@spark-web/text');
12
- var theme = require('@spark-web/theme');
13
- var jsxRuntime = require('@emotion/react/jsx-runtime');
14
-
15
- var FieldContext = /*#__PURE__*/react.createContext(null);
16
- var FieldContextProvider = FieldContext.Provider;
17
- var FIELD_CONTEXT_ERROR_MESSAGE = 'Input components must be inside a `Field`.';
18
- function useFieldContext() {
19
- var ctx = react.useContext(FieldContext);
20
- if (!ctx) {
21
- throw new Error(FIELD_CONTEXT_ERROR_MESSAGE);
22
- }
23
- return ctx;
24
- }
25
-
26
- /**
27
- * Using a [context](https://reactjs.org/docs/context.html), the field
28
- * component connects the label, description, and message to the input element.
29
- */
30
- var Field = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
31
- var children = _ref.children,
32
- idProp = _ref.id,
33
- data = _ref.data,
34
- description = _ref.description,
35
- _ref$disabled = _ref.disabled,
36
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
37
- label = _ref.label,
38
- adornment = _ref.adornment,
39
- _ref$labelVisibility = _ref.labelVisibility,
40
- labelVisibility = _ref$labelVisibility === void 0 ? 'visible' : _ref$labelVisibility,
41
- message = _ref.message,
42
- secondaryLabel = _ref.secondaryLabel,
43
- _ref$tone = _ref.tone,
44
- tone = _ref$tone === void 0 ? 'neutral' : _ref$tone;
45
- var _useFieldIds = useFieldIds(idProp),
46
- descriptionId = _useFieldIds.descriptionId,
47
- inputId = _useFieldIds.inputId,
48
- messageId = _useFieldIds.messageId;
49
-
50
- // field context
51
- var invalid = Boolean(message && tone === 'critical');
52
- var fieldContext = react.useMemo(function () {
53
- return [{
54
- disabled: disabled,
55
- invalid: invalid
56
- }, {
57
- 'aria-describedby': a11y.mergeIds(message && messageId, description && descriptionId),
58
- 'aria-invalid': invalid || undefined,
59
- id: inputId
60
- }];
61
- }, [description, descriptionId, disabled, inputId, invalid, message, messageId]);
62
-
63
- // label prep
64
- var hiddenLabel = jsxRuntime.jsxs(a11y.VisuallyHidden, {
65
- as: "label",
66
- htmlFor: inputId,
67
- children: [label, " ", secondaryLabel]
68
- });
69
- var labelElement = {
70
- hidden: hiddenLabel,
71
- visible: jsxRuntime.jsx(box.Box, {
72
- as: "label",
73
- htmlFor: inputId,
74
- children: jsxRuntime.jsxs(text.Text, {
75
- tone: disabled ? 'disabled' : 'neutral',
76
- weight: "semibold",
77
- children: [label, ' ', secondaryLabel && jsxRuntime.jsx(text.Text, {
78
- inline: true,
79
- tone: disabled ? 'disabled' : 'muted',
80
- weight: "regular",
81
- children: secondaryLabel
82
- })]
83
- })
84
- }),
85
- 'reserve-space': jsxRuntime.jsxs(react.Fragment, {
86
- children: [hiddenLabel, jsxRuntime.jsx(text.Text, {
87
- "aria-hidden": true,
88
- children: "\xA0"
89
- })]
90
- })
91
- };
92
- var LabelWrapper = labelVisibility === 'hidden' ? react.Fragment : FieldLabelWrapper;
93
- return jsxRuntime.jsx(FieldContextProvider, {
94
- value: fieldContext,
95
- children: jsxRuntime.jsxs(stack.Stack, {
96
- ref: forwardedRef,
97
- data: data,
98
- gap: "medium",
99
- children: [jsxRuntime.jsxs(LabelWrapper, {
100
- children: [labelElement[labelVisibility], adornment]
101
- }), description && jsxRuntime.jsx(text.Text, {
102
- tone: "muted",
103
- size: "small",
104
- id: descriptionId,
105
- children: description
106
- }), children, message && jsxRuntime.jsx(FieldMessage, {
107
- tone: tone,
108
- id: messageId,
109
- message: message
110
- })]
111
- })
112
- });
113
- });
114
- Field.displayName = 'Field';
115
-
116
- // Utils
117
- // ------------------------------
118
-
119
- function useFieldIds(id) {
120
- var inputId = a11y.useId(id);
121
- var descriptionId = a11y.composeId(inputId, 'description');
122
- var messageId = a11y.composeId(inputId, 'message');
123
- return {
124
- descriptionId: descriptionId,
125
- inputId: inputId,
126
- messageId: messageId
127
- };
128
- }
129
-
130
- // Styled components
131
- // ------------------------------
132
- function FieldLabelWrapper(_ref2) {
133
- var children = _ref2.children;
134
- return jsxRuntime.jsx(box.Box, {
135
- display: "flex",
136
- alignItems: "center",
137
- justifyContent: "spaceBetween",
138
- gap: "large",
139
- children: children
140
- });
141
- }
142
- var messageToneMap = {
143
- critical: 'critical',
144
- neutral: 'muted',
145
- positive: 'positive'
146
- };
147
-
148
- // NOTE: use icons in addition to color for folks with visions issues
149
- var messageIconMap = {
150
- critical: icon.ExclamationCircleIcon,
151
- neutral: null,
152
- positive: icon.CheckCircleIcon
153
- };
154
- var FieldMessage = function FieldMessage(_ref3) {
155
- var message = _ref3.message,
156
- id = _ref3.id,
157
- tone = _ref3.tone;
158
- var textTone = messageToneMap[tone];
159
- var Icon = messageIconMap[tone];
160
- return jsxRuntime.jsxs(box.Box, {
161
- display: "flex",
162
- gap: "xsmall",
163
- children: [Icon ? jsxRuntime.jsx(IndicatorContainer, {
164
- children: jsxRuntime.jsx(Icon, {
165
- size: "xxsmall",
166
- tone: tone
167
- })
168
- }) : null, jsxRuntime.jsx(text.Text, {
169
- tone: textTone,
170
- size: "small",
171
- id: id,
172
- children: message
173
- })]
174
- });
175
- };
176
- function IndicatorContainer(_ref4) {
177
- var children = _ref4.children;
178
- var theme$1 = theme.useTheme();
179
- var _theme$typography$tex = theme$1.typography.text.small,
180
- mobile = _theme$typography$tex.mobile,
181
- tablet = _theme$typography$tex.tablet;
182
- var responsiveStyles = theme$1.utils.responsiveStyles({
183
- mobile: {
184
- height: mobile.capHeight
185
- },
186
- tablet: {
187
- height: tablet.capHeight
188
- }
189
- });
190
- return jsxRuntime.jsx(box.Box, {
191
- display: "flex",
192
- alignItems: "center",
193
- "aria-hidden": true,
194
- cursor: "default",
195
- flexShrink: 0,
196
- css: react$1.css(responsiveStyles),
197
- children: children
198
- });
199
- }
200
-
201
- exports.Field = Field;
202
- exports.FieldContextProvider = FieldContextProvider;
203
- exports.FieldMessage = FieldMessage;
204
- exports.useFieldContext = useFieldContext;
205
- exports.useFieldIds = useFieldIds;
@@ -1,205 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var react = require('react');
6
- var react$1 = require('@emotion/react');
7
- var a11y = require('@spark-web/a11y');
8
- var box = require('@spark-web/box');
9
- var icon = require('@spark-web/icon');
10
- var stack = require('@spark-web/stack');
11
- var text = require('@spark-web/text');
12
- var theme = require('@spark-web/theme');
13
- var jsxRuntime = require('@emotion/react/jsx-runtime');
14
-
15
- var FieldContext = /*#__PURE__*/react.createContext(null);
16
- var FieldContextProvider = FieldContext.Provider;
17
- var FIELD_CONTEXT_ERROR_MESSAGE = 'Input components must be inside a `Field`.';
18
- function useFieldContext() {
19
- var ctx = react.useContext(FieldContext);
20
- if (!ctx) {
21
- throw new Error(FIELD_CONTEXT_ERROR_MESSAGE);
22
- }
23
- return ctx;
24
- }
25
-
26
- /**
27
- * Using a [context](https://reactjs.org/docs/context.html), the field
28
- * component connects the label, description, and message to the input element.
29
- */
30
- var Field = /*#__PURE__*/react.forwardRef(function (_ref, forwardedRef) {
31
- var children = _ref.children,
32
- idProp = _ref.id,
33
- data = _ref.data,
34
- description = _ref.description,
35
- _ref$disabled = _ref.disabled,
36
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
37
- label = _ref.label,
38
- adornment = _ref.adornment,
39
- _ref$labelVisibility = _ref.labelVisibility,
40
- labelVisibility = _ref$labelVisibility === void 0 ? 'visible' : _ref$labelVisibility,
41
- message = _ref.message,
42
- secondaryLabel = _ref.secondaryLabel,
43
- _ref$tone = _ref.tone,
44
- tone = _ref$tone === void 0 ? 'neutral' : _ref$tone;
45
- var _useFieldIds = useFieldIds(idProp),
46
- descriptionId = _useFieldIds.descriptionId,
47
- inputId = _useFieldIds.inputId,
48
- messageId = _useFieldIds.messageId;
49
-
50
- // field context
51
- var invalid = Boolean(message && tone === 'critical');
52
- var fieldContext = react.useMemo(function () {
53
- return [{
54
- disabled: disabled,
55
- invalid: invalid
56
- }, {
57
- 'aria-describedby': a11y.mergeIds(message && messageId, description && descriptionId),
58
- 'aria-invalid': invalid || undefined,
59
- id: inputId
60
- }];
61
- }, [description, descriptionId, disabled, inputId, invalid, message, messageId]);
62
-
63
- // label prep
64
- var hiddenLabel = jsxRuntime.jsxs(a11y.VisuallyHidden, {
65
- as: "label",
66
- htmlFor: inputId,
67
- children: [label, " ", secondaryLabel]
68
- });
69
- var labelElement = {
70
- hidden: hiddenLabel,
71
- visible: jsxRuntime.jsx(box.Box, {
72
- as: "label",
73
- htmlFor: inputId,
74
- children: jsxRuntime.jsxs(text.Text, {
75
- tone: disabled ? 'disabled' : 'neutral',
76
- weight: "semibold",
77
- children: [label, ' ', secondaryLabel && jsxRuntime.jsx(text.Text, {
78
- inline: true,
79
- tone: disabled ? 'disabled' : 'muted',
80
- weight: "regular",
81
- children: secondaryLabel
82
- })]
83
- })
84
- }),
85
- 'reserve-space': jsxRuntime.jsxs(react.Fragment, {
86
- children: [hiddenLabel, jsxRuntime.jsx(text.Text, {
87
- "aria-hidden": true,
88
- children: "\xA0"
89
- })]
90
- })
91
- };
92
- var LabelWrapper = labelVisibility === 'hidden' ? react.Fragment : FieldLabelWrapper;
93
- return jsxRuntime.jsx(FieldContextProvider, {
94
- value: fieldContext,
95
- children: jsxRuntime.jsxs(stack.Stack, {
96
- ref: forwardedRef,
97
- data: data,
98
- gap: "medium",
99
- children: [jsxRuntime.jsxs(LabelWrapper, {
100
- children: [labelElement[labelVisibility], adornment]
101
- }), description && jsxRuntime.jsx(text.Text, {
102
- tone: "muted",
103
- size: "small",
104
- id: descriptionId,
105
- children: description
106
- }), children, message && jsxRuntime.jsx(FieldMessage, {
107
- tone: tone,
108
- id: messageId,
109
- message: message
110
- })]
111
- })
112
- });
113
- });
114
- Field.displayName = 'Field';
115
-
116
- // Utils
117
- // ------------------------------
118
-
119
- function useFieldIds(id) {
120
- var inputId = a11y.useId(id);
121
- var descriptionId = a11y.composeId(inputId, 'description');
122
- var messageId = a11y.composeId(inputId, 'message');
123
- return {
124
- descriptionId: descriptionId,
125
- inputId: inputId,
126
- messageId: messageId
127
- };
128
- }
129
-
130
- // Styled components
131
- // ------------------------------
132
- function FieldLabelWrapper(_ref2) {
133
- var children = _ref2.children;
134
- return jsxRuntime.jsx(box.Box, {
135
- display: "flex",
136
- alignItems: "center",
137
- justifyContent: "spaceBetween",
138
- gap: "large",
139
- children: children
140
- });
141
- }
142
- var messageToneMap = {
143
- critical: 'critical',
144
- neutral: 'muted',
145
- positive: 'positive'
146
- };
147
-
148
- // NOTE: use icons in addition to color for folks with visions issues
149
- var messageIconMap = {
150
- critical: icon.ExclamationCircleIcon,
151
- neutral: null,
152
- positive: icon.CheckCircleIcon
153
- };
154
- var FieldMessage = function FieldMessage(_ref3) {
155
- var message = _ref3.message,
156
- id = _ref3.id,
157
- tone = _ref3.tone;
158
- var textTone = messageToneMap[tone];
159
- var Icon = messageIconMap[tone];
160
- return jsxRuntime.jsxs(box.Box, {
161
- display: "flex",
162
- gap: "xsmall",
163
- children: [Icon ? jsxRuntime.jsx(IndicatorContainer, {
164
- children: jsxRuntime.jsx(Icon, {
165
- size: "xxsmall",
166
- tone: tone
167
- })
168
- }) : null, jsxRuntime.jsx(text.Text, {
169
- tone: textTone,
170
- size: "small",
171
- id: id,
172
- children: message
173
- })]
174
- });
175
- };
176
- function IndicatorContainer(_ref4) {
177
- var children = _ref4.children;
178
- var theme$1 = theme.useTheme();
179
- var _theme$typography$tex = theme$1.typography.text.small,
180
- mobile = _theme$typography$tex.mobile,
181
- tablet = _theme$typography$tex.tablet;
182
- var responsiveStyles = theme$1.utils.responsiveStyles({
183
- mobile: {
184
- height: mobile.capHeight
185
- },
186
- tablet: {
187
- height: tablet.capHeight
188
- }
189
- });
190
- return jsxRuntime.jsx(box.Box, {
191
- display: "flex",
192
- alignItems: "center",
193
- "aria-hidden": true,
194
- cursor: "default",
195
- flexShrink: 0,
196
- css: react$1.css(responsiveStyles),
197
- children: children
198
- });
199
- }
200
-
201
- exports.Field = Field;
202
- exports.FieldContextProvider = FieldContextProvider;
203
- exports.FieldMessage = FieldMessage;
204
- exports.useFieldContext = useFieldContext;
205
- exports.useFieldIds = useFieldIds;
@@ -1,197 +0,0 @@
1
- import { createContext, useContext, forwardRef, useMemo, Fragment } from 'react';
2
- import { css } from '@emotion/react';
3
- import { mergeIds, VisuallyHidden, useId, composeId } from '@spark-web/a11y';
4
- import { Box } from '@spark-web/box';
5
- import { ExclamationCircleIcon, CheckCircleIcon } from '@spark-web/icon';
6
- import { Stack } from '@spark-web/stack';
7
- import { Text } from '@spark-web/text';
8
- import { useTheme } from '@spark-web/theme';
9
- import { jsxs, jsx } from '@emotion/react/jsx-runtime';
10
-
11
- var FieldContext = /*#__PURE__*/createContext(null);
12
- var FieldContextProvider = FieldContext.Provider;
13
- var FIELD_CONTEXT_ERROR_MESSAGE = 'Input components must be inside a `Field`.';
14
- function useFieldContext() {
15
- var ctx = useContext(FieldContext);
16
- if (!ctx) {
17
- throw new Error(FIELD_CONTEXT_ERROR_MESSAGE);
18
- }
19
- return ctx;
20
- }
21
-
22
- /**
23
- * Using a [context](https://reactjs.org/docs/context.html), the field
24
- * component connects the label, description, and message to the input element.
25
- */
26
- var Field = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) {
27
- var children = _ref.children,
28
- idProp = _ref.id,
29
- data = _ref.data,
30
- description = _ref.description,
31
- _ref$disabled = _ref.disabled,
32
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
33
- label = _ref.label,
34
- adornment = _ref.adornment,
35
- _ref$labelVisibility = _ref.labelVisibility,
36
- labelVisibility = _ref$labelVisibility === void 0 ? 'visible' : _ref$labelVisibility,
37
- message = _ref.message,
38
- secondaryLabel = _ref.secondaryLabel,
39
- _ref$tone = _ref.tone,
40
- tone = _ref$tone === void 0 ? 'neutral' : _ref$tone;
41
- var _useFieldIds = useFieldIds(idProp),
42
- descriptionId = _useFieldIds.descriptionId,
43
- inputId = _useFieldIds.inputId,
44
- messageId = _useFieldIds.messageId;
45
-
46
- // field context
47
- var invalid = Boolean(message && tone === 'critical');
48
- var fieldContext = useMemo(function () {
49
- return [{
50
- disabled: disabled,
51
- invalid: invalid
52
- }, {
53
- 'aria-describedby': mergeIds(message && messageId, description && descriptionId),
54
- 'aria-invalid': invalid || undefined,
55
- id: inputId
56
- }];
57
- }, [description, descriptionId, disabled, inputId, invalid, message, messageId]);
58
-
59
- // label prep
60
- var hiddenLabel = jsxs(VisuallyHidden, {
61
- as: "label",
62
- htmlFor: inputId,
63
- children: [label, " ", secondaryLabel]
64
- });
65
- var labelElement = {
66
- hidden: hiddenLabel,
67
- visible: jsx(Box, {
68
- as: "label",
69
- htmlFor: inputId,
70
- children: jsxs(Text, {
71
- tone: disabled ? 'disabled' : 'neutral',
72
- weight: "semibold",
73
- children: [label, ' ', secondaryLabel && jsx(Text, {
74
- inline: true,
75
- tone: disabled ? 'disabled' : 'muted',
76
- weight: "regular",
77
- children: secondaryLabel
78
- })]
79
- })
80
- }),
81
- 'reserve-space': jsxs(Fragment, {
82
- children: [hiddenLabel, jsx(Text, {
83
- "aria-hidden": true,
84
- children: "\xA0"
85
- })]
86
- })
87
- };
88
- var LabelWrapper = labelVisibility === 'hidden' ? Fragment : FieldLabelWrapper;
89
- return jsx(FieldContextProvider, {
90
- value: fieldContext,
91
- children: jsxs(Stack, {
92
- ref: forwardedRef,
93
- data: data,
94
- gap: "medium",
95
- children: [jsxs(LabelWrapper, {
96
- children: [labelElement[labelVisibility], adornment]
97
- }), description && jsx(Text, {
98
- tone: "muted",
99
- size: "small",
100
- id: descriptionId,
101
- children: description
102
- }), children, message && jsx(FieldMessage, {
103
- tone: tone,
104
- id: messageId,
105
- message: message
106
- })]
107
- })
108
- });
109
- });
110
- Field.displayName = 'Field';
111
-
112
- // Utils
113
- // ------------------------------
114
-
115
- function useFieldIds(id) {
116
- var inputId = useId(id);
117
- var descriptionId = composeId(inputId, 'description');
118
- var messageId = composeId(inputId, 'message');
119
- return {
120
- descriptionId: descriptionId,
121
- inputId: inputId,
122
- messageId: messageId
123
- };
124
- }
125
-
126
- // Styled components
127
- // ------------------------------
128
- function FieldLabelWrapper(_ref2) {
129
- var children = _ref2.children;
130
- return jsx(Box, {
131
- display: "flex",
132
- alignItems: "center",
133
- justifyContent: "spaceBetween",
134
- gap: "large",
135
- children: children
136
- });
137
- }
138
- var messageToneMap = {
139
- critical: 'critical',
140
- neutral: 'muted',
141
- positive: 'positive'
142
- };
143
-
144
- // NOTE: use icons in addition to color for folks with visions issues
145
- var messageIconMap = {
146
- critical: ExclamationCircleIcon,
147
- neutral: null,
148
- positive: CheckCircleIcon
149
- };
150
- var FieldMessage = function FieldMessage(_ref3) {
151
- var message = _ref3.message,
152
- id = _ref3.id,
153
- tone = _ref3.tone;
154
- var textTone = messageToneMap[tone];
155
- var Icon = messageIconMap[tone];
156
- return jsxs(Box, {
157
- display: "flex",
158
- gap: "xsmall",
159
- children: [Icon ? jsx(IndicatorContainer, {
160
- children: jsx(Icon, {
161
- size: "xxsmall",
162
- tone: tone
163
- })
164
- }) : null, jsx(Text, {
165
- tone: textTone,
166
- size: "small",
167
- id: id,
168
- children: message
169
- })]
170
- });
171
- };
172
- function IndicatorContainer(_ref4) {
173
- var children = _ref4.children;
174
- var theme = useTheme();
175
- var _theme$typography$tex = theme.typography.text.small,
176
- mobile = _theme$typography$tex.mobile,
177
- tablet = _theme$typography$tex.tablet;
178
- var responsiveStyles = theme.utils.responsiveStyles({
179
- mobile: {
180
- height: mobile.capHeight
181
- },
182
- tablet: {
183
- height: tablet.capHeight
184
- }
185
- });
186
- return jsx(Box, {
187
- display: "flex",
188
- alignItems: "center",
189
- "aria-hidden": true,
190
- cursor: "default",
191
- flexShrink: 0,
192
- css: css(responsiveStyles),
193
- children: children
194
- });
195
- }
196
-
197
- export { Field, FieldContextProvider, FieldMessage, useFieldContext, useFieldIds };