@codecademy/gamut 67.6.4-alpha.1643c9.0 → 67.6.4-alpha.1d4469.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ConnectedForm/ConnectedFormGroup.d.ts +6 -5
- package/dist/ConnectedForm/ConnectedFormGroup.js +1 -1
- package/dist/Form/elements/FormGroupLabel.d.ts +2 -2
- package/dist/Form/elements/FormGroupLabel.js +11 -6
- package/dist/GridForm/GridFormInputGroup/GridFormRadioGroupInput/index.js +19 -11
- package/dist/GridForm/types.d.ts +5 -5
- package/dist/Tip/InfoTip/index.d.ts +22 -8
- package/dist/Tip/InfoTip/index.js +9 -2
- package/dist/Tip/InfoTip/utils.d.ts +13 -0
- package/dist/Tip/InfoTip/utils.js +47 -0
- package/dist/Tip/shared/utils.d.ts +19 -0
- package/dist/Tip/shared/utils.js +104 -0
- package/package.json +2 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { FormGroupProps
|
|
2
|
+
import { FormGroupProps } from '..';
|
|
3
|
+
import { InfoTipPropsWithoutAria } from '../Tip/InfoTip/utils';
|
|
3
4
|
import { ConnectedField, FieldProps, SubmitContextProps } from './types';
|
|
4
5
|
export interface ConnectedFormGroupBaseProps extends Omit<FormGroupProps, 'label' | 'disabled' | 'description' | 'htmlFor'> {
|
|
5
6
|
customError?: string;
|
|
@@ -9,11 +10,11 @@ export interface ConnectedFormGroupBaseProps extends Omit<FormGroupProps, 'label
|
|
|
9
10
|
label: React.ReactNode;
|
|
10
11
|
required?: boolean;
|
|
11
12
|
/**
|
|
12
|
-
* InfoTip to display next to the field label.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* InfoTip to display next to the field label. The InfoTip button is
|
|
14
|
+
* automatically labelled by the field label. To override this behavior,
|
|
15
|
+
* provide `ariaLabel` or `ariaLabelledby`.
|
|
15
16
|
*/
|
|
16
|
-
infotip?:
|
|
17
|
+
infotip?: InfoTipPropsWithoutAria;
|
|
17
18
|
}
|
|
18
19
|
export interface ConnectedFormGroupProps<T extends ConnectedField> extends SubmitContextProps, ConnectedFormGroupBaseProps {
|
|
19
20
|
/**
|
|
@@ -13,7 +13,7 @@ const ErrorAnchor = /*#__PURE__*/_styled(Anchor, {
|
|
|
13
13
|
label: "ErrorAnchor"
|
|
14
14
|
})(css({
|
|
15
15
|
color: 'feedback-error'
|
|
16
|
-
}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
16
|
+
}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYW9CIiwiZmlsZSI6Ii4uLy4uL3NyYy9Db25uZWN0ZWRGb3JtL0Nvbm5lY3RlZEZvcm1Hcm91cC50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGb3JtRXJyb3IsIEZvcm1Hcm91cCwgRm9ybUdyb3VwTGFiZWwsIEZvcm1Hcm91cFByb3BzIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgQW5jaG9yIH0gZnJvbSAnLi4vQW5jaG9yJztcbmltcG9ydCB7IEhpZGRlblRleHQgfSBmcm9tICcuLi9IaWRkZW5UZXh0JztcbmltcG9ydCB7IE1hcmtkb3duIH0gZnJvbSAnLi4vTWFya2Rvd24nO1xuaW1wb3J0IHsgSW5mb1RpcFByb3BzV2l0aG91dEFyaWEgfSBmcm9tICcuLi9UaXAvSW5mb1RpcC91dGlscyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRGaWVsZCwgRmllbGRQcm9wcywgU3VibWl0Q29udGV4dFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRFcnJvck1lc3NhZ2UsIHVzZUZpZWxkIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IEVycm9yQW5jaG9yID0gc3R5bGVkKEFuY2hvcikoXG4gIGNzcyh7XG4gICAgY29sb3I6ICdmZWVkYmFjay1lcnJvcicsXG4gIH0pXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZEZvcm1Hcm91cEJhc2VQcm9wc1xuICBleHRlbmRzIE9taXQ8XG4gICAgRm9ybUdyb3VwUHJvcHMsXG4gICAgJ2xhYmVsJyB8ICdkaXNhYmxlZCcgfCAnZGVzY3JpcHRpb24nIHwgJ2h0bWxGb3InXG4gID4ge1xuICBjdXN0b21FcnJvcj86IHN0cmluZztcbiAgZXJyb3JUeXBlPzogJ2luaXRpYWwnIHwgJ2Fic29sdXRlJztcbiAgaGlkZUxhYmVsPzogYm9vbGVhbjtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogUmVhY3QuUmVhY3ROb2RlO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmZvVGlwIHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgZmllbGQgbGFiZWwuIFRoZSBJbmZvVGlwIGJ1dHRvbiBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IGxhYmVsbGVkIGJ5IHRoZSBmaWVsZCBsYWJlbC4gVG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcixcbiAgICogcHJvdmlkZSBgYXJpYUxhYmVsYCBvciBgYXJpYUxhYmVsbGVkYnlgLlxuICAgKi9cbiAgaW5mb3RpcD86IEluZm9UaXBQcm9wc1dpdGhvdXRBcmlhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZEZvcm1Hcm91cFByb3BzPFQgZXh0ZW5kcyBDb25uZWN0ZWRGaWVsZD5cbiAgZXh0ZW5kcyBTdWJtaXRDb250ZXh0UHJvcHMsXG4gICAgQ29ubmVjdGVkRm9ybUdyb3VwQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIGEgYGNvbXBvbmVudGAga2V5IHRvIHNwZWNpZnkgd2hhdCBDb25uZWN0ZWRGb3JtSW5wdXQgdG8gcmVuZGVyIC0gdGhlIHJlbWFpbmluZyBrZXkvdmFsdWUgcGFpcnMgYXJlIHRoYXQgY29tcG9uZW50cyBkZXNpcmVkIHByb3BzLlxuICAgKi9cbiAgZmllbGQ6IE9taXQ8UmVhY3QuQ29tcG9uZW50UHJvcHM8VD4sICduYW1lJyB8ICdkaXNhYmxlZCc+ICYgRmllbGRQcm9wczxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvbm5lY3RlZEZvcm1Hcm91cDxUIGV4dGVuZHMgQ29ubmVjdGVkRmllbGQ+KHtcbiAgY3VzdG9tRXJyb3IsXG4gIGNoaWxkcmVuLFxuICBkaXNhYmxlZCA9IGZhbHNlLFxuICBlcnJvclR5cGUgPSAnYWJzb2x1dGUnLFxuICBmaWVsZCxcbiAgaGlkZUxhYmVsLFxuICBpZCxcbiAgbGFiZWwsXG4gIG5hbWUsXG4gIGxhYmVsU2l6ZSxcbiAgc3BhY2luZyA9ICdmaXQnLFxuICBpc1NvbG9GaWVsZCxcbiAgaW5mb3RpcCxcbn06IENvbm5lY3RlZEZvcm1Hcm91cFByb3BzPFQ+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGlzRmlyc3RFcnJvciwgaXNEaXNhYmxlZCwgc2V0RXJyb3IsIHZhbGlkYXRpb24gfSA9IHVzZUZpZWxkKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICB9KTtcbiAgY29uc3QgeyBjb21wb25lbnQ6IENvbXBvbmVudCwgLi4ucmVzdCB9ID0gZmllbGQ7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY3VzdG9tRXJyb3IpIHtcbiAgICAgIHNldEVycm9yKG5hbWUsIHtcbiAgICAgICAgdHlwZTogJ21hbnVhbCcsXG4gICAgICAgIG1lc3NhZ2U6IGN1c3RvbUVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbY3VzdG9tRXJyb3IsIG5hbWUsIHNldEVycm9yXSk7XG5cbiAgY29uc3QgcmVuZGVyZWRMYWJlbCA9IChcbiAgICA8Rm9ybUdyb3VwTGFiZWxcbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgaHRtbEZvcj17aWQgfHwgbmFtZX1cbiAgICAgIGluZm90aXA9e2luZm90aXB9XG4gICAgICBpc1NvbG9GaWVsZD17aXNTb2xvRmllbGR9XG4gICAgICByZXF1aXJlZD17ISF2YWxpZGF0aW9uPy5yZXF1aXJlZH1cbiAgICAgIHNpemU9e2xhYmVsU2l6ZX1cbiAgICA+XG4gICAgICB7bGFiZWx9XG4gICAgPC9Gb3JtR3JvdXBMYWJlbD5cbiAgKTtcblxuICBjb25zdCB0ZXh0RXJyb3IgPSBjdXN0b21FcnJvciB8fCBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICBjb25zdCBzaG93RXJyb3IgPSAhISh0ZXh0RXJyb3IgJiYgIWhpZGVMYWJlbCk7XG4gIGNvbnN0IGVycm9ySWQgPSBzaG93RXJyb3IgPyBgJHtpZCB8fCBuYW1lfV9lcnJvcmAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUdyb3VwIHNwYWNpbmc9e2hpZGVMYWJlbCA/ICd0aWdodCcgOiBzcGFjaW5nfT5cbiAgICAgIHtoaWRlTGFiZWwgPyA8SGlkZGVuVGV4dD57cmVuZGVyZWRMYWJlbH08L0hpZGRlblRleHQ+IDogcmVuZGVyZWRMYWJlbH1cbiAgICAgIDxDb21wb25lbnRcbiAgICAgICAgey4uLihyZXN0IGFzIGFueSl9XG4gICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e2Vycm9ySWR9XG4gICAgICAgIGFyaWEtaW52YWxpZD17c2hvd0Vycm9yfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIG5hbWU9e25hbWV9XG4gICAgICAvPlxuICAgICAge2NoaWxkcmVufVxuICAgICAge3Nob3dFcnJvciAmJiAoXG4gICAgICAgIDxGb3JtRXJyb3JcbiAgICAgICAgICBhcmlhLWxpdmU9e2lzRmlyc3RFcnJvciA/ICdhc3NlcnRpdmUnIDogJ29mZid9XG4gICAgICAgICAgaWQ9e2Vycm9ySWR9XG4gICAgICAgICAgcm9sZT17aXNGaXJzdEVycm9yID8gJ2FsZXJ0JyA6ICdzdGF0dXMnfVxuICAgICAgICAgIHZhcmlhbnQ9e2Vycm9yVHlwZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxNYXJrZG93blxuICAgICAgICAgICAgaW5saW5lXG4gICAgICAgICAgICBvdmVycmlkZXM9e3tcbiAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBbJ2hyZWYnLCAndGFyZ2V0J10sXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBFcnJvckFuY2hvcixcbiAgICAgICAgICAgICAgICBwcm9jZXNzTm9kZTogKFxuICAgICAgICAgICAgICAgICAgbm9kZTogdW5rbm93bixcbiAgICAgICAgICAgICAgICAgIHByb3BzOiB7IG9uQ2xpY2s/OiAoKSA9PiB2b2lkIH1cbiAgICAgICAgICAgICAgICApID0+IDxFcnJvckFuY2hvciB7Li4ucHJvcHN9IC8+LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHNraXBEZWZhdWx0T3ZlcnJpZGVzPXt7IGE6IHRydWUgfX1cbiAgICAgICAgICAgIHNwYWNpbmc9XCJub25lXCJcbiAgICAgICAgICAgIHRleHQ9e3RleHRFcnJvcn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Zvcm1FcnJvcj5cbiAgICAgICl9XG4gICAgPC9Gb3JtR3JvdXA+XG4gICk7XG59XG4iXX0= */");
|
|
17
17
|
export function ConnectedFormGroup({
|
|
18
18
|
customError,
|
|
19
19
|
children,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { StyleProps } from '@codecademy/variance';
|
|
2
2
|
import { HTMLAttributes } from 'react';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { InfoTipPropsWithoutAria } from '../../Tip/InfoTip/utils';
|
|
5
5
|
import { BaseInputProps } from '../types';
|
|
6
6
|
declare const labelSizeVariants: (props: import("@codecademy/variance/dist/types/config").VariantProps<"size", false | "small" | "large"> & {
|
|
7
7
|
theme?: import("@emotion/react").Theme | undefined;
|
|
@@ -15,7 +15,7 @@ export type FormGroupLabelProps = HTMLAttributes<HTMLDivElement> & HTMLAttribute
|
|
|
15
15
|
/**
|
|
16
16
|
* [The for/id string of a label or labelable form-related element](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor). The outer FormGroup or FormLabel should have an identical string as the inner FormElement for accessibility purposes.
|
|
17
17
|
*/
|
|
18
|
-
infotip?:
|
|
18
|
+
infotip?: InfoTipPropsWithoutAria;
|
|
19
19
|
size?: 'small' | 'large';
|
|
20
20
|
/**
|
|
21
21
|
* Solo fields should always be required and have no optional/required text
|
|
@@ -4,6 +4,7 @@ import { useId } from 'react';
|
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { FlexBox } from '../..';
|
|
6
6
|
import { InfoTip } from '../../Tip/InfoTip';
|
|
7
|
+
import { createInfoTipProps } from '../../Tip/InfoTip/utils';
|
|
7
8
|
import { Text } from '../../Typography/Text';
|
|
8
9
|
import { formBaseStyles, formFieldTextDisabledStyles } from '../styles';
|
|
9
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
@@ -31,7 +32,7 @@ const labelStates = states({
|
|
|
31
32
|
const Label = /*#__PURE__*/_styled("label", {
|
|
32
33
|
target: "e1t0n89n0",
|
|
33
34
|
label: "Label"
|
|
34
|
-
})(labelSizeVariants, labelStates, process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
35
|
+
})(labelSizeVariants, labelStates, process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Gb3JtL2VsZW1lbnRzL0Zvcm1Hcm91cExhYmVsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1RGMiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0Zvcm0vZWxlbWVudHMvRm9ybUdyb3VwTGFiZWwudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RhdGVzLCB2YXJpYW50IH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtc3R5bGVzJztcbmltcG9ydCB7IFN0eWxlUHJvcHMgfSBmcm9tICdAY29kZWNhZGVteS92YXJpYW5jZSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBIVE1MQXR0cmlidXRlcywgdXNlSWQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEZsZXhCb3ggfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBJbmZvVGlwLCBJbmZvVGlwUHJvcHMgfSBmcm9tICcuLi8uLi9UaXAvSW5mb1RpcCc7XG5pbXBvcnQge1xuICBjcmVhdGVJbmZvVGlwUHJvcHMsXG4gIEluZm9UaXBQcm9wc1dpdGhvdXRBcmlhLFxufSBmcm9tICcuLi8uLi9UaXAvSW5mb1RpcC91dGlscyc7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vLi4vVHlwb2dyYXBoeS9UZXh0JztcbmltcG9ydCB7IGZvcm1CYXNlU3R5bGVzLCBmb3JtRmllbGRUZXh0RGlzYWJsZWRTdHlsZXMgfSBmcm9tICcuLi9zdHlsZXMnO1xuaW1wb3J0IHsgQmFzZUlucHV0UHJvcHMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IGxhYmVsU2l6ZVZhcmlhbnRzID0gdmFyaWFudCh7XG4gIGRlZmF1bHRWYXJpYW50OiAnc21hbGwnLFxuICBwcm9wOiAnc2l6ZScsXG4gIGJhc2U6IHsgZGlzcGxheTogJ2Jsb2NrJywgLi4uZm9ybUJhc2VTdHlsZXMgfSxcbiAgdmFyaWFudHM6IHtcbiAgICBzbWFsbDoge1xuICAgICAgbGluZUhlaWdodDogJ2Jhc2UnLFxuICAgIH0sXG4gICAgbGFyZ2U6IHtcbiAgICAgIGZvbnRTaXplOiAyMixcbiAgICAgIGxpbmVIZWlnaHQ6ICdiYXNlJyxcbiAgICAgIGZvbnRXZWlnaHQ6ICd0aXRsZScsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBsYWJlbFN0YXRlcyA9IHN0YXRlcyh7XG4gIGRpc2FibGVkOiBmb3JtRmllbGRUZXh0RGlzYWJsZWRTdHlsZXMsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBMYWJlbFZhcmlhbnRzXG4gIGV4dGVuZHMgU3R5bGVQcm9wczx0eXBlb2YgbGFiZWxTaXplVmFyaWFudHM+LFxuICAgIFN0eWxlUHJvcHM8dHlwZW9mIGxhYmVsU3RhdGVzPiB7fVxuXG5leHBvcnQgdHlwZSBGb3JtR3JvdXBMYWJlbFByb3BzID0gSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+ICZcbiAgSFRNTEF0dHJpYnV0ZXM8SFRNTExhYmVsRWxlbWVudD4gJlxuICBMYWJlbFZhcmlhbnRzICZcbiAgUGljazxCYXNlSW5wdXRQcm9wcywgJ2h0bWxGb3InIHwgJ3JlcXVpcmVkJz4gJiB7XG4gICAgLyoqXG4gICAgICogW1RoZSBmb3IvaWQgc3RyaW5nIG9mIGEgbGFiZWwgb3IgbGFiZWxhYmxlIGZvcm0tcmVsYXRlZCBlbGVtZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTExhYmVsRWxlbWVudC9odG1sRm9yKS4gVGhlIG91dGVyIEZvcm1Hcm91cCBvciBGb3JtTGFiZWwgc2hvdWxkIGhhdmUgYW4gaWRlbnRpY2FsIHN0cmluZyBhcyB0aGUgaW5uZXIgRm9ybUVsZW1lbnQgZm9yIGFjY2Vzc2liaWxpdHkgcHVycG9zZXMuXG4gICAgICovXG4gICAgaW5mb3RpcD86IEluZm9UaXBQcm9wc1dpdGhvdXRBcmlhO1xuICAgIHNpemU/OiAnc21hbGwnIHwgJ2xhcmdlJztcbiAgICAvKipcbiAgICAgKiBTb2xvIGZpZWxkcyBzaG91bGQgYWx3YXlzIGJlIHJlcXVpcmVkIGFuZCBoYXZlIG5vIG9wdGlvbmFsL3JlcXVpcmVkIHRleHRcbiAgICAgKi9cbiAgICBpc1NvbG9GaWVsZD86IGJvb2xlYW47XG4gIH07XG5cbmNvbnN0IExhYmVsID0gc3R5bGVkLmxhYmVsPEZvcm1Hcm91cExhYmVsUHJvcHM+KGxhYmVsU2l6ZVZhcmlhbnRzLCBsYWJlbFN0YXRlcyk7XG5cbmV4cG9ydCBjb25zdCBGb3JtR3JvdXBMYWJlbDogUmVhY3QuRkM8Rm9ybUdyb3VwTGFiZWxQcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBkaXNhYmxlZCxcbiAgaHRtbEZvcixcbiAgaW5mb3RpcCxcbiAgaXNTb2xvRmllbGQsXG4gIHJlcXVpcmVkLFxuICBzaXplLFxuICAuLi5yZXN0XG59KSA9PiB7XG4gIGNvbnN0IGxhYmVsSWQgPSB1c2VJZCgpO1xuICBjb25zdCB7IGluZm90aXBQcm9wcywgc2hvdWxkTGFiZWxJbmZvVGlwIH0gPSBpbmZvdGlwXG4gICAgPyBjcmVhdGVJbmZvVGlwUHJvcHMoaW5mb3RpcCwgbGFiZWxJZClcbiAgICA6IHtcbiAgICAgICAgaW5mb3RpcFByb3BzOiB1bmRlZmluZWQgYXMgSW5mb1RpcFByb3BzIHwgdW5kZWZpbmVkLFxuICAgICAgICBzaG91bGRMYWJlbEluZm9UaXA6IGZhbHNlLFxuICAgICAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGbGV4Qm94IGp1c3RpZnlDb250ZW50PVwic3BhY2UtYmV0d2VlblwiIG1iPXs0fT5cbiAgICAgIDxMYWJlbFxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgYXM9e2h0bWxGb3IgPyAnbGFiZWwnIDogJ2Rpdid9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGh0bWxGb3I9e2h0bWxGb3J9XG4gICAgICAgIGlkPXtpbmZvdGlwICYmIHNob3VsZExhYmVsSW5mb1RpcCA/IGxhYmVsSWQgOiB1bmRlZmluZWR9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgeyFpc1NvbG9GaWVsZCAmJlxuICAgICAgICAgIChyZXF1aXJlZCA/IChcbiAgICAgICAgICAgIDxUZXh0IGFyaWEtaGlkZGVuIGFzPVwic3BhblwiPlxuICAgICAgICAgICAgICAqXG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICdcXHUwMEEwKG9wdGlvbmFsKSdcbiAgICAgICAgICApKX1cbiAgICAgIDwvTGFiZWw+XG4gICAgICB7aW5mb3RpcFByb3BzICYmIDxJbmZvVGlwIHsuLi5pbmZvdGlwUHJvcHN9IC8+fVxuICAgIDwvRmxleEJveD5cbiAgKTtcbn07XG4iXX0= */");
|
|
35
36
|
export const FormGroupLabel = ({
|
|
36
37
|
children,
|
|
37
38
|
className,
|
|
@@ -44,8 +45,13 @@ export const FormGroupLabel = ({
|
|
|
44
45
|
...rest
|
|
45
46
|
}) => {
|
|
46
47
|
const labelId = useId();
|
|
47
|
-
const
|
|
48
|
-
|
|
48
|
+
const {
|
|
49
|
+
infotipProps,
|
|
50
|
+
shouldLabelInfoTip
|
|
51
|
+
} = infotip ? createInfoTipProps(infotip, labelId) : {
|
|
52
|
+
infotipProps: undefined,
|
|
53
|
+
shouldLabelInfoTip: false
|
|
54
|
+
};
|
|
49
55
|
return /*#__PURE__*/_jsxs(FlexBox, {
|
|
50
56
|
justifyContent: "space-between",
|
|
51
57
|
mb: 4,
|
|
@@ -62,9 +68,8 @@ export const FormGroupLabel = ({
|
|
|
62
68
|
as: "span",
|
|
63
69
|
children: "*"
|
|
64
70
|
}) : '\u00A0(optional)')]
|
|
65
|
-
}),
|
|
66
|
-
...
|
|
67
|
-
ariaLabelledby: shouldLabelInfoTip ? labelId : infotip.ariaLabelledby
|
|
71
|
+
}), infotipProps && /*#__PURE__*/_jsx(InfoTip, {
|
|
72
|
+
...infotipProps
|
|
68
73
|
})]
|
|
69
74
|
});
|
|
70
75
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import isString from 'lodash/isString';
|
|
2
|
+
import { useId, createElement as _createElement } from 'react';
|
|
2
3
|
import * as React from 'react';
|
|
3
4
|
import { Radio, RadioGroup } from '../../../Form';
|
|
4
|
-
import {
|
|
5
|
+
import { createInfoTipProps } from '../../../Tip/InfoTip/utils';
|
|
5
6
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
7
|
export const GridFormRadioGroupInput = ({
|
|
7
8
|
className,
|
|
@@ -13,6 +14,7 @@ export const GridFormRadioGroupInput = ({
|
|
|
13
14
|
error
|
|
14
15
|
}) => {
|
|
15
16
|
const ariaLabel = field.ariaLabel ?? (isString(field.label) ? field.label : undefined);
|
|
17
|
+
const defaultLabelId = useId();
|
|
16
18
|
return /*#__PURE__*/_jsx(RadioGroup, {
|
|
17
19
|
"aria-invalid": error,
|
|
18
20
|
"aria-label": ariaLabel,
|
|
@@ -31,16 +33,22 @@ export const GridFormRadioGroupInput = ({
|
|
|
31
33
|
children: field.options.map(({
|
|
32
34
|
label,
|
|
33
35
|
value,
|
|
36
|
+
infotip,
|
|
34
37
|
...rest
|
|
35
|
-
}) =>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
}) => {
|
|
39
|
+
const optionLabelId = `${defaultLabelId}-${value}`;
|
|
40
|
+
const infotipProps = infotip ? createInfoTipProps(infotip, optionLabelId).infotipProps : undefined;
|
|
41
|
+
return /*#__PURE__*/_createElement(Radio, {
|
|
42
|
+
...register(field.name, field.validation),
|
|
43
|
+
disabled: disabled,
|
|
44
|
+
error: error,
|
|
45
|
+
id: field.id,
|
|
46
|
+
infotip: infotipProps,
|
|
47
|
+
key: value,
|
|
48
|
+
label: label,
|
|
49
|
+
value: value,
|
|
50
|
+
...rest
|
|
51
|
+
});
|
|
52
|
+
})
|
|
45
53
|
});
|
|
46
54
|
};
|
package/dist/GridForm/types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { MinimalCheckboxProps } from '../ConnectedForm';
|
|
|
5
5
|
import { CheckboxLabelUnion, TextAreaProps } from '../Form';
|
|
6
6
|
import { CheckboxPaddingProps } from '../Form/types';
|
|
7
7
|
import { ColumnProps } from '../Layout';
|
|
8
|
-
import {
|
|
8
|
+
import { InfoTipPropsWithoutAria } from '../Tip/InfoTip/utils';
|
|
9
9
|
import { Text, TextProps } from '../Typography/Text';
|
|
10
10
|
export interface BaseFormInputProps {
|
|
11
11
|
className?: string;
|
|
@@ -26,11 +26,11 @@ export type BaseFormField<Value> = {
|
|
|
26
26
|
*/
|
|
27
27
|
id?: string;
|
|
28
28
|
/**
|
|
29
|
-
* InfoTip to display next to the field label.
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* InfoTip to display next to the field label. The InfoTip button is
|
|
30
|
+
* automatically labelled by the field label. To override this behavior,
|
|
31
|
+
* provide `ariaLabel` or `ariaLabelledby`.
|
|
32
32
|
*/
|
|
33
|
-
infotip?:
|
|
33
|
+
infotip?: InfoTipPropsWithoutAria;
|
|
34
34
|
isSoloField?: boolean;
|
|
35
35
|
name: string;
|
|
36
36
|
onUpdate?: (value: Value) => void;
|
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { TipBaseAlignment, TipBaseProps } from '../shared/types';
|
|
3
|
-
|
|
3
|
+
type InfoTipPropsWithAriaLabel = TipBaseProps & {
|
|
4
4
|
alignment?: TipBaseAlignment;
|
|
5
5
|
/**
|
|
6
|
-
* Accessible label for the InfoTip button.
|
|
6
|
+
* Accessible label for the InfoTip button. ariaLabel or ariaLabelledby should be provided for accessibility.
|
|
7
7
|
*/
|
|
8
8
|
ariaLabel?: string;
|
|
9
|
+
ariaLabelledby?: never;
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Accessible role description for the InfoTip button. Useful for translation.
|
|
12
|
+
* @default "More information button"
|
|
13
|
+
*/
|
|
14
|
+
ariaRoleDescription?: string;
|
|
15
|
+
emphasis?: 'low' | 'high';
|
|
16
|
+
/**
|
|
17
|
+
* Called when the info tip is clicked - the onClick function is called after the DOM updates and the tip is mounted.
|
|
18
|
+
*/
|
|
19
|
+
onClick?: (arg0: {
|
|
20
|
+
isTipHidden: boolean;
|
|
21
|
+
}) => void;
|
|
22
|
+
};
|
|
23
|
+
type InfoTipPropsWithAriaLabelledby = TipBaseProps & {
|
|
24
|
+
alignment?: TipBaseAlignment;
|
|
25
|
+
ariaLabel?: never;
|
|
26
|
+
/**
|
|
27
|
+
* ID of an element that labels the InfoTip button.
|
|
11
28
|
*/
|
|
12
29
|
ariaLabelledby?: string;
|
|
13
30
|
/**
|
|
@@ -16,11 +33,6 @@ export type InfoTipProps = TipBaseProps & {
|
|
|
16
33
|
*/
|
|
17
34
|
ariaRoleDescription?: string;
|
|
18
35
|
emphasis?: 'low' | 'high';
|
|
19
|
-
/**
|
|
20
|
-
* When true, the InfoTip button will be labelled by the form field's label element.
|
|
21
|
-
* This is automatic for string labels, but can be opted into for ReactNode labels.
|
|
22
|
-
*/
|
|
23
|
-
labelledByFieldLabel?: boolean;
|
|
24
36
|
/**
|
|
25
37
|
* Called when the info tip is clicked - the onClick function is called after the DOM updates and the tip is mounted.
|
|
26
38
|
*/
|
|
@@ -28,4 +40,6 @@ export type InfoTipProps = TipBaseProps & {
|
|
|
28
40
|
isTipHidden: boolean;
|
|
29
41
|
}) => void;
|
|
30
42
|
};
|
|
43
|
+
export type InfoTipProps = InfoTipPropsWithAriaLabel | InfoTipPropsWithAriaLabelledby;
|
|
31
44
|
export declare const InfoTip: React.FC<InfoTipProps>;
|
|
45
|
+
export {};
|
|
@@ -3,7 +3,7 @@ import { getFocusableElements as getFocusableElementsUtil } from '../../utils/fo
|
|
|
3
3
|
import { FloatingTip } from '../shared/FloatingTip';
|
|
4
4
|
import { InlineTip } from '../shared/InlineTip';
|
|
5
5
|
import { tipDefaultProps } from '../shared/types';
|
|
6
|
-
import {
|
|
6
|
+
import { isFloatingElementOpen } from '../shared/utils';
|
|
7
7
|
import { InfoTipButton } from './InfoTipButton';
|
|
8
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
9
|
const MODAL_SELECTOR = 'dialog[open],[role="dialog"]:not([aria-hidden="true"]),[role="alertdialog"]:not([aria-hidden="true"])';
|
|
@@ -78,7 +78,14 @@ export const InfoTip = ({
|
|
|
78
78
|
const handleGlobalEscapeKey = e => {
|
|
79
79
|
if (e.key !== 'Escape') return;
|
|
80
80
|
const openModals = document.querySelectorAll(MODAL_SELECTOR);
|
|
81
|
-
const hasUnrelatedModal = Array.from(openModals).some(modal =>
|
|
81
|
+
const hasUnrelatedModal = Array.from(openModals).some(modal => {
|
|
82
|
+
// Only consider floating elements that are actually open
|
|
83
|
+
if (!isFloatingElementOpen(modal)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Check if it's unrelated to this InfoTip
|
|
87
|
+
return wrapperRef.current && !modal.contains(wrapperRef.current);
|
|
88
|
+
});
|
|
82
89
|
if (hasUnrelatedModal) return;
|
|
83
90
|
e.preventDefault();
|
|
84
91
|
e.stopPropagation();
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InfoTipProps } from './index';
|
|
2
|
+
/**
|
|
3
|
+
* InfoTip props that allow both ariaLabel and ariaLabelledby to be optional.
|
|
4
|
+
* Used in components that automatically provide ariaLabelledby when neither is provided.
|
|
5
|
+
*/
|
|
6
|
+
export type InfoTipPropsWithoutAria = Omit<InfoTipProps, 'ariaLabel' | 'ariaLabelledby'> & {
|
|
7
|
+
ariaLabel?: string;
|
|
8
|
+
ariaLabelledby?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const createInfoTipProps: (props: InfoTipPropsWithoutAria, fallbackAriaLabelledby?: string) => {
|
|
11
|
+
infotipProps: InfoTipProps;
|
|
12
|
+
shouldLabelInfoTip: boolean;
|
|
13
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InfoTip props that allow both ariaLabel and ariaLabelledby to be optional.
|
|
3
|
+
* Used in components that automatically provide ariaLabelledby when neither is provided.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const createInfoTipProps = (props, fallbackAriaLabelledby) => {
|
|
7
|
+
const {
|
|
8
|
+
ariaLabel,
|
|
9
|
+
ariaLabelledby,
|
|
10
|
+
...rest
|
|
11
|
+
} = props;
|
|
12
|
+
const hasAriaLabel = ariaLabel !== undefined;
|
|
13
|
+
const hasAriaLabelledby = ariaLabelledby !== undefined;
|
|
14
|
+
if (hasAriaLabel) {
|
|
15
|
+
return {
|
|
16
|
+
infotipProps: {
|
|
17
|
+
...rest,
|
|
18
|
+
ariaLabel
|
|
19
|
+
},
|
|
20
|
+
shouldLabelInfoTip: false
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (hasAriaLabelledby) {
|
|
24
|
+
return {
|
|
25
|
+
infotipProps: {
|
|
26
|
+
...rest,
|
|
27
|
+
ariaLabelledby
|
|
28
|
+
},
|
|
29
|
+
shouldLabelInfoTip: false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (fallbackAriaLabelledby) {
|
|
33
|
+
return {
|
|
34
|
+
infotipProps: {
|
|
35
|
+
...rest,
|
|
36
|
+
ariaLabelledby: fallbackAriaLabelledby
|
|
37
|
+
},
|
|
38
|
+
shouldLabelInfoTip: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
infotipProps: {
|
|
43
|
+
...rest
|
|
44
|
+
},
|
|
45
|
+
shouldLabelInfoTip: false
|
|
46
|
+
};
|
|
47
|
+
};
|
|
@@ -6,3 +6,22 @@ export declare const escapeKeyPressHandler: (event: React.KeyboardEvent<HTMLDivE
|
|
|
6
6
|
* Uses the modern checkVisibility API with a fallback for older browsers.
|
|
7
7
|
*/
|
|
8
8
|
export declare const isElementVisible: (element: Element) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a floating element (modal, dialog, popover, overlay, etc.) is actually open and blocking.
|
|
11
|
+
*
|
|
12
|
+
* A floating element is considered "open" and blocking if:
|
|
13
|
+
* 1. It's a <dialog> element with the open attribute (always blocking per HTML spec), OR
|
|
14
|
+
* 2. It has role="alertdialog" (always blocking per ARIA spec), OR
|
|
15
|
+
* 3. It has role="dialog" AND:
|
|
16
|
+
* - It's not aria-hidden="true", AND
|
|
17
|
+
* - It doesn't have aria-expanded="false" (for collapsible dialogs), AND
|
|
18
|
+
* - It's actually visible (not just in DOM), AND
|
|
19
|
+
* - It has aria-modal="true" (indicates blocking modal per ARIA spec)
|
|
20
|
+
*
|
|
21
|
+
* Non-blocking popovers and collapsible dialogs without aria-modal="true" are not considered
|
|
22
|
+
* blocking and should not prevent InfoTip from closing.
|
|
23
|
+
*
|
|
24
|
+
* @param element - The DOM element to check
|
|
25
|
+
* @returns `true` if the floating element is actually open and blocking, `false` otherwise
|
|
26
|
+
*/
|
|
27
|
+
export declare const isFloatingElementOpen: (element: Element) => boolean;
|
package/dist/Tip/shared/utils.js
CHANGED
|
@@ -15,4 +15,108 @@ export const escapeKeyPressHandler = event => {
|
|
|
15
15
|
export const isElementVisible = element => {
|
|
16
16
|
if (!(element instanceof HTMLElement)) return false;
|
|
17
17
|
return element.checkVisibility?.() ?? true;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if a floating element (modal, dialog, popover, overlay, etc.) is actually open and blocking.
|
|
22
|
+
*
|
|
23
|
+
* A floating element is considered "open" and blocking if:
|
|
24
|
+
* 1. It's a <dialog> element with the open attribute (always blocking per HTML spec), OR
|
|
25
|
+
* 2. It has role="alertdialog" (always blocking per ARIA spec), OR
|
|
26
|
+
* 3. It has role="dialog" AND:
|
|
27
|
+
* - It's not aria-hidden="true", AND
|
|
28
|
+
* - It doesn't have aria-expanded="false" (for collapsible dialogs), AND
|
|
29
|
+
* - It's actually visible (not just in DOM), AND
|
|
30
|
+
* - It has aria-modal="true" (indicates blocking modal per ARIA spec)
|
|
31
|
+
*
|
|
32
|
+
* Non-blocking popovers and collapsible dialogs without aria-modal="true" are not considered
|
|
33
|
+
* blocking and should not prevent InfoTip from closing.
|
|
34
|
+
*
|
|
35
|
+
* @param element - The DOM element to check
|
|
36
|
+
* @returns `true` if the floating element is actually open and blocking, `false` otherwise
|
|
37
|
+
*/
|
|
38
|
+
export const isFloatingElementOpen = element => {
|
|
39
|
+
if (!isElementVisible(element)) return false;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Native <dialog> elements are always blocking when open.
|
|
43
|
+
* Per HTML spec, dialog elements with the open attribute are modal.
|
|
44
|
+
*/
|
|
45
|
+
if (element instanceof HTMLDialogElement) {
|
|
46
|
+
return element.open === true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Elements with role="dialog" or role="alertdialog".
|
|
51
|
+
* Per ARIA spec, role="alertdialog" is always modal (blocking).
|
|
52
|
+
* role="dialog" requires aria-modal="true" to be blocking.
|
|
53
|
+
*/
|
|
54
|
+
const role = element.getAttribute('role');
|
|
55
|
+
if (role !== 'dialog' && role !== 'alertdialog') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Cache attribute values to avoid multiple DOM reads.
|
|
61
|
+
* Check aria-hidden first as it's a common exclusion case.
|
|
62
|
+
*/
|
|
63
|
+
const ariaHidden = element.getAttribute('aria-hidden');
|
|
64
|
+
if (ariaHidden === 'true') {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check for collapsible dialogs (like help menus).
|
|
70
|
+
* If aria-expanded exists and is false, the dialog is closed.
|
|
71
|
+
* These dialogs stay in DOM but are collapsed when closed.
|
|
72
|
+
*/
|
|
73
|
+
const ariaExpanded = element.getAttribute('aria-expanded');
|
|
74
|
+
if (ariaExpanded === 'false') {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Per ARIA spec, role="alertdialog" is always modal (blocking).
|
|
80
|
+
* At this point, we've already verified:
|
|
81
|
+
* - The element is visible (not hidden via CSS)
|
|
82
|
+
* - It's not aria-hidden="true"
|
|
83
|
+
* - It's not aria-expanded="false"
|
|
84
|
+
* So if it's an alertdialog, it's open and blocking.
|
|
85
|
+
* Handle alertdialog here to avoid expensive DOM queries for dialog elements.
|
|
86
|
+
*/
|
|
87
|
+
if (role === 'alertdialog') {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* For role="dialog", check if any child button with aria-expanded indicates the dialog is closed.
|
|
93
|
+
* Some dialogs use a toggle button pattern where the button's aria-expanded
|
|
94
|
+
* reflects the dialog's state.
|
|
95
|
+
* Only perform this expensive querySelector operation after all other checks pass.
|
|
96
|
+
*/
|
|
97
|
+
const toggleButton = element.querySelector('button[aria-expanded], [role="button"][aria-expanded]');
|
|
98
|
+
if (toggleButton && toggleButton.getAttribute('aria-expanded') === 'false') {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* For role="dialog", check aria-modal attribute.
|
|
104
|
+
* aria-modal="true" indicates a blocking modal (Modal, Dialog).
|
|
105
|
+
* aria-modal="false" or absence indicates non-blocking.
|
|
106
|
+
*/
|
|
107
|
+
const ariaModal = element.getAttribute('aria-modal');
|
|
108
|
+
if (ariaModal === 'true') {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (ariaModal === 'false') {
|
|
112
|
+
// Explicitly non-modal, should not block
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Elements with role="dialog" but without aria-modal="true" are non-blocking.
|
|
118
|
+
* These include collapsible dialogs (help menus) and popovers (Popover, InfoTip, Tooltip)
|
|
119
|
+
* that use role="dialog". They should not prevent InfoTip from closing.
|
|
120
|
+
*/
|
|
121
|
+
return false;
|
|
18
122
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codecademy/gamut",
|
|
3
3
|
"description": "Styleguide & Component library for Codecademy",
|
|
4
|
-
"version": "67.6.4-alpha.
|
|
4
|
+
"version": "67.6.4-alpha.1d4469.0",
|
|
5
5
|
"author": "Codecademy Engineering <dev@codecademy.com>",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@codecademy/gamut-icons": "9.54.0",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"dist/**/[A-Z]**/[A-Z]*.js",
|
|
57
57
|
"dist/**/[A-Z]**/index.js"
|
|
58
58
|
],
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "28326eabca0f7f2c94acef4126f97cb7be55b21c"
|
|
60
60
|
}
|