@khanacademy/wonder-blocks-card 1.4.30 → 1.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @khanacademy/wonder-blocks-card
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8e11e83: Card's dismiss button now reads its default `aria-label` ("Close") from `WonderBlocksConfigProvider`. The `labels.dismissButtonAriaLabel` prop overrides the built-in translation, and is now optional when `onDismiss` is set.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [6bd5d0c]
12
+ - Updated dependencies [8e11e83]
13
+ - @khanacademy/wonder-blocks-config@0.5.0
14
+
3
15
  ## 1.4.30
4
16
 
5
17
  ### Patch Changes
@@ -71,8 +71,8 @@ type StyleProps = {
71
71
  * ### Accessibility
72
72
  *
73
73
  * When the `onDismiss` prop is provided, a dismiss button will be rendered.
74
- * In this case, the `labels.dismissButtonAriaLabel` prop is required to provide
75
- * a translatable screen reader label for the dismiss button.
74
+ * It has a built-in, translated screen reader label ("Close"), which can be
75
+ * overridden using the `labels.dismissButtonAriaLabel` prop.
76
76
  *
77
77
  * See additional Accessibility docs.
78
78
  */
@@ -119,8 +119,8 @@ declare const Card: React.ForwardRefExoticComponent<(Omit<{
119
119
  role?: AriaProps["role"];
120
120
  } & {
121
121
  onDismiss: (e?: React.SyntheticEvent) => void;
122
- labels: {
123
- dismissButtonAriaLabel: string;
122
+ labels?: {
123
+ dismissButtonAriaLabel?: string;
124
124
  dismissButtonAriaDescribedBy?: string;
125
125
  } & Record<string, any>;
126
126
  }, "ref"> | Omit<{
@@ -210,8 +210,8 @@ declare const Card: React.ForwardRefExoticComponent<(Omit<{
210
210
  role?: AriaProps["role"];
211
211
  } & {
212
212
  onDismiss: (e?: React.SyntheticEvent) => void;
213
- labels: {
214
- dismissButtonAriaLabel: string;
213
+ labels?: {
214
+ dismissButtonAriaLabel?: string;
215
215
  dismissButtonAriaDescribedBy?: string;
216
216
  } & Record<string, any>;
217
217
  }, "ref"> | Omit<{
@@ -3,7 +3,10 @@ import type { StyleType } from "@khanacademy/wonder-blocks-core";
3
3
  type Props = {
4
4
  /** Optional click handler */
5
5
  onClick?: (e?: React.SyntheticEvent) => unknown;
6
- /** Screen reader label for close button */
6
+ /**
7
+ * Screen reader label for close button. This overrides the default label
8
+ * provided by `WonderBlocksConfigProvider`.
9
+ */
7
10
  "aria-label"?: string;
8
11
  /** Optional aria-describedby attribute */
9
12
  "aria-describedby"?: string;
package/dist/es/index.js CHANGED
@@ -4,11 +4,12 @@ import { StyleSheet } from 'aphrodite';
4
4
  import { View } from '@khanacademy/wonder-blocks-core';
5
5
  import { sizing, semanticColor, border, boxShadow, font } from '@khanacademy/wonder-blocks-tokens';
6
6
  import xIcon from '@phosphor-icons/core/bold/x-bold.svg';
7
+ import { useWonderBlocksI18n } from '@khanacademy/wonder-blocks-config';
7
8
  import IconButton from '@khanacademy/wonder-blocks-icon-button';
8
9
  import { focusStyles } from '@khanacademy/wonder-blocks-styles';
9
10
 
10
- const DismissButton=props=>{const{onClick,style,testId,"aria-describedby":ariaDescribedBy}=props;return jsx(IconButton,{icon:xIcon,"aria-label":props["aria-label"]||"Close","aria-describedby":ariaDescribedBy,onClick:onClick,kind:"tertiary",actionType:"neutral",style:[componentStyles.root,style],testId:testId})};const componentStyles=StyleSheet.create({root:{position:"absolute",insetInlineEnd:sizing.size_080,insetBlockStart:sizing.size_080,zIndex:1,":focus":focusStyles.focus[":focus-visible"]}});
11
+ const DismissButton=props=>{const{onClick,style,testId,"aria-describedby":ariaDescribedBy}=props;const{strings}=useWonderBlocksI18n();return jsx(IconButton,{icon:xIcon,"aria-label":props["aria-label"]||strings.iconAltClose,"aria-describedby":ariaDescribedBy,onClick:onClick,kind:"tertiary",actionType:"neutral",style:[componentStyles.root,style],testId:testId})};const componentStyles=StyleSheet.create({root:{position:"absolute",insetInlineEnd:sizing.size_080,insetBlockStart:sizing.size_080,zIndex:1,":focus":focusStyles.focus[":focus-visible"]}});
11
12
 
12
- const Card=React.forwardRef(function Card(props,ref){const{styles,labels,tag,testId,background="base-default",borderRadius="small",paddingSize="small",elevation="none",children,onDismiss,inert,"aria-labelledby":ariaLabelledBy,"aria-busy":ariaBusy,role}=props;const isBackgroundToken=background==="base-default"||background==="base-subtle";const componentStyles=getComponentStyles({background:isBackgroundToken?background:null,borderRadius,paddingSize,elevation});return jsxs(View,{"aria-busy":ariaBusy,"aria-label":labels?.cardAriaLabel,"aria-labelledby":ariaLabelledBy,style:[componentStyles.root,!isBackgroundToken&&{background:`url(${background})`,backgroundSize:"cover"},styles?.root],ref:ref,role:role,tag:tag,testId:testId,inert:inert?"":undefined,children:[onDismiss?jsx(DismissButton,{"aria-label":labels?.dismissButtonAriaLabel||"Close","aria-describedby":labels?.dismissButtonAriaDescribedBy,onClick:e=>onDismiss?.(e),testId:testId&&`${testId}-dismiss-button`}):null,children]})});const styleMap={backgroundColor:{"base-subtle":semanticColor.core.background.base.subtle,"base-default":semanticColor.core.background.base.default},borderRadius:{small:border.radius.radius_080,medium:border.radius.radius_120},padding:{none:sizing.size_0,small:sizing.size_160,medium:sizing.size_240},elevation:{none:"none",low:boxShadow.low}};const getComponentStyles=({background="base-default",borderRadius="small",paddingSize="small",elevation="none"})=>{const bgColor=background;return StyleSheet.create({root:{backgroundColor:bgColor&&styleMap.backgroundColor[bgColor],borderColor:semanticColor.core.border.neutral.subtle,borderStyle:"solid",borderWidth:border.width.thin,fontFamily:font.family.sans,minInlineSize:sizing.size_280,position:"relative",borderRadius:styleMap.borderRadius[borderRadius],boxShadow:styleMap.elevation[elevation],padding:styleMap.padding[paddingSize]}})};
13
+ const Card=React.forwardRef(function Card(props,ref){const{styles,labels,tag,testId,background="base-default",borderRadius="small",paddingSize="small",elevation="none",children,onDismiss,inert,"aria-labelledby":ariaLabelledBy,"aria-busy":ariaBusy,role}=props;const isBackgroundToken=background==="base-default"||background==="base-subtle";const componentStyles=getComponentStyles({background:isBackgroundToken?background:null,borderRadius,paddingSize,elevation});return jsxs(View,{"aria-busy":ariaBusy,"aria-label":labels?.cardAriaLabel,"aria-labelledby":ariaLabelledBy,style:[componentStyles.root,!isBackgroundToken&&{background:`url(${background})`,backgroundSize:"cover"},styles?.root],ref:ref,role:role,tag:tag,testId:testId,inert:inert?"":undefined,children:[onDismiss?jsx(DismissButton,{"aria-label":labels?.dismissButtonAriaLabel,"aria-describedby":labels?.dismissButtonAriaDescribedBy,onClick:e=>onDismiss?.(e),testId:testId&&`${testId}-dismiss-button`}):null,children]})});const styleMap={backgroundColor:{"base-subtle":semanticColor.core.background.base.subtle,"base-default":semanticColor.core.background.base.default},borderRadius:{small:border.radius.radius_080,medium:border.radius.radius_120},padding:{none:sizing.size_0,small:sizing.size_160,medium:sizing.size_240},elevation:{none:"none",low:boxShadow.low}};const getComponentStyles=({background="base-default",borderRadius="small",paddingSize="small",elevation="none"})=>{const bgColor=background;return StyleSheet.create({root:{backgroundColor:bgColor&&styleMap.backgroundColor[bgColor],borderColor:semanticColor.core.border.neutral.subtle,borderStyle:"solid",borderWidth:border.width.thin,fontFamily:font.family.sans,minInlineSize:sizing.size_280,position:"relative",borderRadius:styleMap.borderRadius[borderRadius],boxShadow:styleMap.elevation[elevation],padding:styleMap.padding[paddingSize]}})};
13
14
 
14
15
  export { Card };
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ var aphrodite = require('aphrodite');
8
8
  var wonderBlocksCore = require('@khanacademy/wonder-blocks-core');
9
9
  var wonderBlocksTokens = require('@khanacademy/wonder-blocks-tokens');
10
10
  var xIcon = require('@phosphor-icons/core/bold/x-bold.svg');
11
+ var wonderBlocksConfig = require('@khanacademy/wonder-blocks-config');
11
12
  var IconButton = require('@khanacademy/wonder-blocks-icon-button');
12
13
  var wonderBlocksStyles = require('@khanacademy/wonder-blocks-styles');
13
14
 
@@ -35,8 +36,8 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
35
36
  var xIcon__default = /*#__PURE__*/_interopDefaultLegacy(xIcon);
36
37
  var IconButton__default = /*#__PURE__*/_interopDefaultLegacy(IconButton);
37
38
 
38
- const DismissButton=props=>{const{onClick,style,testId,"aria-describedby":ariaDescribedBy}=props;return jsxRuntime.jsx(IconButton__default["default"],{icon:xIcon__default["default"],"aria-label":props["aria-label"]||"Close","aria-describedby":ariaDescribedBy,onClick:onClick,kind:"tertiary",actionType:"neutral",style:[componentStyles.root,style],testId:testId})};const componentStyles=aphrodite.StyleSheet.create({root:{position:"absolute",insetInlineEnd:wonderBlocksTokens.sizing.size_080,insetBlockStart:wonderBlocksTokens.sizing.size_080,zIndex:1,":focus":wonderBlocksStyles.focusStyles.focus[":focus-visible"]}});
39
+ const DismissButton=props=>{const{onClick,style,testId,"aria-describedby":ariaDescribedBy}=props;const{strings}=wonderBlocksConfig.useWonderBlocksI18n();return jsxRuntime.jsx(IconButton__default["default"],{icon:xIcon__default["default"],"aria-label":props["aria-label"]||strings.iconAltClose,"aria-describedby":ariaDescribedBy,onClick:onClick,kind:"tertiary",actionType:"neutral",style:[componentStyles.root,style],testId:testId})};const componentStyles=aphrodite.StyleSheet.create({root:{position:"absolute",insetInlineEnd:wonderBlocksTokens.sizing.size_080,insetBlockStart:wonderBlocksTokens.sizing.size_080,zIndex:1,":focus":wonderBlocksStyles.focusStyles.focus[":focus-visible"]}});
39
40
 
40
- const Card=React__namespace.forwardRef(function Card(props,ref){const{styles,labels,tag,testId,background="base-default",borderRadius="small",paddingSize="small",elevation="none",children,onDismiss,inert,"aria-labelledby":ariaLabelledBy,"aria-busy":ariaBusy,role}=props;const isBackgroundToken=background==="base-default"||background==="base-subtle";const componentStyles=getComponentStyles({background:isBackgroundToken?background:null,borderRadius,paddingSize,elevation});return jsxRuntime.jsxs(wonderBlocksCore.View,{"aria-busy":ariaBusy,"aria-label":labels?.cardAriaLabel,"aria-labelledby":ariaLabelledBy,style:[componentStyles.root,!isBackgroundToken&&{background:`url(${background})`,backgroundSize:"cover"},styles?.root],ref:ref,role:role,tag:tag,testId:testId,inert:inert?"":undefined,children:[onDismiss?jsxRuntime.jsx(DismissButton,{"aria-label":labels?.dismissButtonAriaLabel||"Close","aria-describedby":labels?.dismissButtonAriaDescribedBy,onClick:e=>onDismiss?.(e),testId:testId&&`${testId}-dismiss-button`}):null,children]})});const styleMap={backgroundColor:{"base-subtle":wonderBlocksTokens.semanticColor.core.background.base.subtle,"base-default":wonderBlocksTokens.semanticColor.core.background.base.default},borderRadius:{small:wonderBlocksTokens.border.radius.radius_080,medium:wonderBlocksTokens.border.radius.radius_120},padding:{none:wonderBlocksTokens.sizing.size_0,small:wonderBlocksTokens.sizing.size_160,medium:wonderBlocksTokens.sizing.size_240},elevation:{none:"none",low:wonderBlocksTokens.boxShadow.low}};const getComponentStyles=({background="base-default",borderRadius="small",paddingSize="small",elevation="none"})=>{const bgColor=background;return aphrodite.StyleSheet.create({root:{backgroundColor:bgColor&&styleMap.backgroundColor[bgColor],borderColor:wonderBlocksTokens.semanticColor.core.border.neutral.subtle,borderStyle:"solid",borderWidth:wonderBlocksTokens.border.width.thin,fontFamily:wonderBlocksTokens.font.family.sans,minInlineSize:wonderBlocksTokens.sizing.size_280,position:"relative",borderRadius:styleMap.borderRadius[borderRadius],boxShadow:styleMap.elevation[elevation],padding:styleMap.padding[paddingSize]}})};
41
+ const Card=React__namespace.forwardRef(function Card(props,ref){const{styles,labels,tag,testId,background="base-default",borderRadius="small",paddingSize="small",elevation="none",children,onDismiss,inert,"aria-labelledby":ariaLabelledBy,"aria-busy":ariaBusy,role}=props;const isBackgroundToken=background==="base-default"||background==="base-subtle";const componentStyles=getComponentStyles({background:isBackgroundToken?background:null,borderRadius,paddingSize,elevation});return jsxRuntime.jsxs(wonderBlocksCore.View,{"aria-busy":ariaBusy,"aria-label":labels?.cardAriaLabel,"aria-labelledby":ariaLabelledBy,style:[componentStyles.root,!isBackgroundToken&&{background:`url(${background})`,backgroundSize:"cover"},styles?.root],ref:ref,role:role,tag:tag,testId:testId,inert:inert?"":undefined,children:[onDismiss?jsxRuntime.jsx(DismissButton,{"aria-label":labels?.dismissButtonAriaLabel,"aria-describedby":labels?.dismissButtonAriaDescribedBy,onClick:e=>onDismiss?.(e),testId:testId&&`${testId}-dismiss-button`}):null,children]})});const styleMap={backgroundColor:{"base-subtle":wonderBlocksTokens.semanticColor.core.background.base.subtle,"base-default":wonderBlocksTokens.semanticColor.core.background.base.default},borderRadius:{small:wonderBlocksTokens.border.radius.radius_080,medium:wonderBlocksTokens.border.radius.radius_120},padding:{none:wonderBlocksTokens.sizing.size_0,small:wonderBlocksTokens.sizing.size_160,medium:wonderBlocksTokens.sizing.size_240},elevation:{none:"none",low:wonderBlocksTokens.boxShadow.low}};const getComponentStyles=({background="base-default",borderRadius="small",paddingSize="small",elevation="none"})=>{const bgColor=background;return aphrodite.StyleSheet.create({root:{backgroundColor:bgColor&&styleMap.backgroundColor[bgColor],borderColor:wonderBlocksTokens.semanticColor.core.border.neutral.subtle,borderStyle:"solid",borderWidth:wonderBlocksTokens.border.width.thin,fontFamily:wonderBlocksTokens.font.family.sans,minInlineSize:wonderBlocksTokens.sizing.size_280,position:"relative",borderRadius:styleMap.borderRadius[borderRadius],boxShadow:styleMap.elevation[elevation],padding:styleMap.padding[paddingSize]}})};
41
42
 
42
43
  exports.Card = Card;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Card component for Wonder Blocks.",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "1.4.30",
6
+ "version": "1.5.0",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -21,6 +21,7 @@
21
21
  "types": "dist/index.d.ts",
22
22
  "source": "src/index.js",
23
23
  "dependencies": {
24
+ "@khanacademy/wonder-blocks-config": "0.5.0",
24
25
  "@khanacademy/wonder-blocks-core": "12.5.0",
25
26
  "@khanacademy/wonder-blocks-icon-button": "12.0.2",
26
27
  "@khanacademy/wonder-blocks-tokens": "18.1.0"