@cloudscape-design/components-themeable 3.0.1326 → 3.0.1327
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/lib/internal/manifest.json +1 -1
- package/lib/internal/scss/action-card/styles.scss +4 -2
- package/lib/internal/scss/box/styles.scss +1 -0
- package/lib/internal/scss/box/visual-accent.scss +117 -0
- package/lib/internal/scss/button-dropdown/styles.scss +6 -0
- package/lib/internal/scss/internal/generated/custom-css-properties/index.scss +1 -1
- package/lib/internal/template/action-card/interfaces.d.ts +40 -1
- package/lib/internal/template/action-card/interfaces.d.ts.map +1 -1
- package/lib/internal/template/action-card/interfaces.js.map +1 -1
- package/lib/internal/template/action-card/internal.d.ts.map +1 -1
- package/lib/internal/template/action-card/internal.js +32 -9
- package/lib/internal/template/action-card/internal.js.map +1 -1
- package/lib/internal/template/action-card/styles.css.js +17 -17
- package/lib/internal/template/action-card/styles.scoped.css +96 -92
- package/lib/internal/template/action-card/styles.selectors.js +17 -17
- package/lib/internal/template/box/interfaces.d.ts +59 -0
- package/lib/internal/template/box/interfaces.d.ts.map +1 -1
- package/lib/internal/template/box/interfaces.js.map +1 -1
- package/lib/internal/template/box/internal.d.ts +1 -1
- package/lib/internal/template/box/internal.d.ts.map +1 -1
- package/lib/internal/template/box/internal.js +4 -2
- package/lib/internal/template/box/internal.js.map +1 -1
- package/lib/internal/template/box/styles.css.js +224 -193
- package/lib/internal/template/box/styles.scoped.css +424 -238
- package/lib/internal/template/box/styles.selectors.js +224 -193
- package/lib/internal/template/button-dropdown/category-elements/category-element.d.ts +1 -1
- package/lib/internal/template/button-dropdown/category-elements/category-element.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/category-elements/category-element.js +3 -3
- package/lib/internal/template/button-dropdown/category-elements/category-element.js.map +1 -1
- package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.d.ts +1 -1
- package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.js +22 -12
- package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.js.map +1 -1
- package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.d.ts +1 -1
- package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.js +12 -10
- package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.js.map +1 -1
- package/lib/internal/template/button-dropdown/filter.d.ts +8 -0
- package/lib/internal/template/button-dropdown/filter.d.ts.map +1 -0
- package/lib/internal/template/button-dropdown/filter.js +18 -0
- package/lib/internal/template/button-dropdown/filter.js.map +1 -0
- package/lib/internal/template/button-dropdown/index.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/index.js +3 -3
- package/lib/internal/template/button-dropdown/index.js.map +1 -1
- package/lib/internal/template/button-dropdown/interfaces.d.ts +41 -0
- package/lib/internal/template/button-dropdown/interfaces.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/interfaces.js.map +1 -1
- package/lib/internal/template/button-dropdown/internal-interfaces.d.ts +12 -0
- package/lib/internal/template/button-dropdown/internal-interfaces.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/internal-interfaces.js.map +1 -1
- package/lib/internal/template/button-dropdown/internal.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/internal.js +46 -7
- package/lib/internal/template/button-dropdown/internal.js.map +1 -1
- package/lib/internal/template/button-dropdown/item-element/index.d.ts +1 -1
- package/lib/internal/template/button-dropdown/item-element/index.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/item-element/index.js +35 -16
- package/lib/internal/template/button-dropdown/item-element/index.js.map +1 -1
- package/lib/internal/template/button-dropdown/items-list.d.ts +1 -1
- package/lib/internal/template/button-dropdown/items-list.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/items-list.js +4 -4
- package/lib/internal/template/button-dropdown/items-list.js.map +1 -1
- package/lib/internal/template/button-dropdown/styles.css.js +23 -22
- package/lib/internal/template/button-dropdown/styles.scoped.css +38 -32
- package/lib/internal/template/button-dropdown/styles.selectors.js +23 -22
- package/lib/internal/template/button-dropdown/tooltip.d.ts +2 -1
- package/lib/internal/template/button-dropdown/tooltip.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/tooltip.js +22 -14
- package/lib/internal/template/button-dropdown/tooltip.js.map +1 -1
- package/lib/internal/template/button-dropdown/utils/filter-items.d.ts +4 -0
- package/lib/internal/template/button-dropdown/utils/filter-items.d.ts.map +1 -0
- package/lib/internal/template/button-dropdown/utils/filter-items.js +55 -0
- package/lib/internal/template/button-dropdown/utils/filter-items.js.map +1 -0
- package/lib/internal/template/button-dropdown/utils/use-button-dropdown.d.ts +7 -1
- package/lib/internal/template/button-dropdown/utils/use-button-dropdown.d.ts.map +1 -1
- package/lib/internal/template/button-dropdown/utils/use-button-dropdown.js +77 -13
- package/lib/internal/template/button-dropdown/utils/use-button-dropdown.js.map +1 -1
- package/lib/internal/template/error-boundary/internal.d.ts.map +1 -1
- package/lib/internal/template/error-boundary/internal.js +1 -0
- package/lib/internal/template/error-boundary/internal.js.map +1 -1
- package/lib/internal/template/internal/base-component/index.js +3 -3
- package/lib/internal/template/internal/base-component/index.js.map +1 -1
- package/lib/internal/template/internal/base-component/styles.scoped.css +17 -1
- package/lib/internal/template/internal/environment.js +2 -2
- package/lib/internal/template/internal/environment.json +2 -2
- package/lib/internal/template/internal/generated/styles/tokens.d.ts +132 -0
- package/lib/internal/template/internal/generated/styles/tokens.js +132 -0
- package/lib/internal/template/internal/generated/theming/index.cjs +1884 -0
- package/lib/internal/template/internal/generated/theming/index.js +1884 -0
- package/lib/internal/template/item-card/internal.js +1 -1
- package/lib/internal/template/item-card/internal.js.map +1 -1
- package/lib/internal/template/multiselect/embedded.d.ts +2 -2
- package/lib/internal/template/multiselect/internal.d.ts +1 -1
- package/lib/internal/template/select/parts/filter.d.ts +1 -1
- package/lib/internal/template/table/index.d.ts.map +1 -1
- package/lib/internal/template/table/index.js +5 -3
- package/lib/internal/template/table/index.js.map +1 -1
- package/lib/internal/template/test-utils/dom/action-card/index.d.ts +4 -2
- package/lib/internal/template/test-utils/dom/action-card/index.js +5 -3
- package/lib/internal/template/test-utils/dom/action-card/index.js.map +1 -1
- package/lib/internal/template/test-utils/dom/button-dropdown/index.d.ts +16 -0
- package/lib/internal/template/test-utils/dom/button-dropdown/index.js +24 -0
- package/lib/internal/template/test-utils/dom/button-dropdown/index.js.map +1 -1
- package/lib/internal/template/test-utils/selectors/button-dropdown/index.d.ts +16 -0
- package/lib/internal/template/test-utils/selectors/button-dropdown/index.js +24 -0
- package/lib/internal/template/test-utils/selectors/button-dropdown/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -163,11 +163,13 @@
|
|
|
163
163
|
@include mixins.apply-state-styles('disabled');
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
&:not(.disabled):has(button:hover)
|
|
166
|
+
&:not(.disabled):has(.header-button:hover),
|
|
167
|
+
&:not(.disabled):has(.overlay-button:hover) {
|
|
167
168
|
@include mixins.apply-state-styles('hover');
|
|
168
169
|
}
|
|
169
170
|
|
|
170
|
-
&:not(.disabled):has(button:active)
|
|
171
|
+
&:not(.disabled):has(.header-button:active),
|
|
172
|
+
&:not(.disabled):has(.overlay-button:active) {
|
|
171
173
|
@include mixins.apply-state-styles('active');
|
|
172
174
|
}
|
|
173
175
|
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
@use 'sass:map';
|
|
7
|
+
@use 'sass:meta';
|
|
8
|
+
@use '../internal/styles/tokens' as awsui;
|
|
9
|
+
|
|
10
|
+
// T-shirt size keywords mirror the Box spacing scale (see spacing.scss).
|
|
11
|
+
// `full` renders fully rounded corners (a circle when combined with `aspectRatio: 'equal'`).
|
|
12
|
+
$accent-radii: (
|
|
13
|
+
'xxxs': awsui.$space-xxxs,
|
|
14
|
+
'xxs': awsui.$space-xxs,
|
|
15
|
+
'xs': awsui.$space-xs,
|
|
16
|
+
's': awsui.$space-s,
|
|
17
|
+
'm': awsui.$space-m,
|
|
18
|
+
'l': awsui.$space-l,
|
|
19
|
+
'xl': awsui.$space-xl,
|
|
20
|
+
'xxl': awsui.$space-xxl,
|
|
21
|
+
'xxxl': awsui.$space-xxxl,
|
|
22
|
+
'full': 50%,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
@mixin accent-radius($value) {
|
|
26
|
+
border-start-start-radius: $value;
|
|
27
|
+
border-start-end-radius: $value;
|
|
28
|
+
border-end-start-radius: $value;
|
|
29
|
+
border-end-end-radius: $value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ─── Base visual accent container ─────────────────────────────────────────────
|
|
33
|
+
// Applied whenever the `visualAccent` prop is set. Provides the container layout. Corners are
|
|
34
|
+
// square by default; the `.visual-accent-radius-*` classes below apply corner rounding for the
|
|
35
|
+
// curated `borderRadius` keywords.
|
|
36
|
+
.visual-accent {
|
|
37
|
+
display: inline-flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
padding-block: awsui.$space-xxs;
|
|
41
|
+
padding-inline: awsui.$space-xs;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── Accent border radius (t-shirt size keywords) ─────────────────────────────
|
|
46
|
+
// Mirror the Box spacing scale so `borderRadius` keywords align with `padding` / `margin`.
|
|
47
|
+
@each $name, $value in $accent-radii {
|
|
48
|
+
.visual-accent-radius-#{$name} {
|
|
49
|
+
@include accent-radius($value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─── Accent aspect ratio ──────────────────────────────────────────────────────
|
|
54
|
+
// `auto` — default; the container's width follows its content.
|
|
55
|
+
// `equal` — equal width and height, suitable for icon wrapping. Combine with
|
|
56
|
+
// `borderRadius: 'full'` to render a circle.
|
|
57
|
+
|
|
58
|
+
.visual-accent-aspect-auto {
|
|
59
|
+
// Reset any square constraints so content can size the container naturally.
|
|
60
|
+
aspect-ratio: auto;
|
|
61
|
+
inline-size: auto;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.visual-accent-aspect-equal {
|
|
65
|
+
// Equal padding on all sides.
|
|
66
|
+
padding-block: awsui.$space-xs;
|
|
67
|
+
padding-inline: awsui.$space-xs;
|
|
68
|
+
// Force the element to be a square regardless of content dimensions.
|
|
69
|
+
// The width is constrained to match the height (content + padding).
|
|
70
|
+
aspect-ratio: 1 / 1;
|
|
71
|
+
// Prevent content from stretching the box wider than tall.
|
|
72
|
+
overflow: hidden;
|
|
73
|
+
// Let the box shrink-wrap to its height, width follows via aspect-ratio.
|
|
74
|
+
inline-size: fit-content;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ─── Accent colors ──────────────────────────────────────────────────────────────
|
|
78
|
+
// Light/dark values are resolved by the design tokens, so no explicit dark-mode
|
|
79
|
+
// overrides are needed here.
|
|
80
|
+
//
|
|
81
|
+
// The selectors chain the `.visual-accent` base class with the `.visual-accent-{color}`
|
|
82
|
+
// modifier (both are always applied together whenever `visualAccent` is set) to reach a
|
|
83
|
+
// specificity of (0,3,0). This intentionally beats the `color` prop's `.box.color-*`
|
|
84
|
+
// selector (0,2,0) so the accent's coordinated foreground color always wins, regardless of
|
|
85
|
+
// stylesheet source order. Winning here preserves the guaranteed background/foreground color
|
|
86
|
+
// contrast of the accent pair. Descendants (nested Box, Icon) inherit this color.
|
|
87
|
+
//
|
|
88
|
+
// Token variables are looked up dynamically from the tokens module, so adding a color only
|
|
89
|
+
// requires extending `$accent-colors`.
|
|
90
|
+
$accent-colors: (
|
|
91
|
+
'red',
|
|
92
|
+
'yellow',
|
|
93
|
+
'indigo',
|
|
94
|
+
'green',
|
|
95
|
+
'orange',
|
|
96
|
+
'purple',
|
|
97
|
+
'mint',
|
|
98
|
+
'lime',
|
|
99
|
+
'grey',
|
|
100
|
+
'teal',
|
|
101
|
+
'cyan',
|
|
102
|
+
'blue',
|
|
103
|
+
'violet',
|
|
104
|
+
'fuchsia',
|
|
105
|
+
'magenta',
|
|
106
|
+
'pink',
|
|
107
|
+
'rose',
|
|
108
|
+
'amber'
|
|
109
|
+
);
|
|
110
|
+
$tokens: meta.module-variables('awsui');
|
|
111
|
+
|
|
112
|
+
@each $accent in $accent-colors {
|
|
113
|
+
.box.visual-accent.visual-accent-#{$accent} {
|
|
114
|
+
background-color: map.get($tokens, 'color-background-accent-#{$accent}');
|
|
115
|
+
color: map.get($tokens, 'color-text-accent-#{$accent}');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
2
|
import { BaseComponentProps } from '../types/base-component';
|
|
3
|
-
import { CancelableEventHandler } from '../types/events';
|
|
3
|
+
import { BaseNavigationDetail, CancelableEventHandler } from '../types/events';
|
|
4
4
|
import { NativeAttributes } from '../types/native-attributes';
|
|
5
5
|
export interface ActionCardProps extends BaseComponentProps {
|
|
6
6
|
/**
|
|
@@ -19,6 +19,33 @@ export interface ActionCardProps extends BaseComponentProps {
|
|
|
19
19
|
* Called when the user clicks on the action card.
|
|
20
20
|
*/
|
|
21
21
|
onClick?: CancelableEventHandler<ActionCardProps.ClickDetail>;
|
|
22
|
+
/**
|
|
23
|
+
* Turns the action card into a link, pointing to the given URL. The card is rendered using an `a` element instead of a `button`.
|
|
24
|
+
* For example, use this property if selecting the card should navigate the user to another page.
|
|
25
|
+
*/
|
|
26
|
+
href?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Specifies where to open the linked URL (for example, to open in a new browser window or tab use `_blank`).
|
|
29
|
+
* This property only applies when an `href` is provided.
|
|
30
|
+
*/
|
|
31
|
+
target?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Adds a `rel` attribute to the link. By default, the component sets the `rel` attribute to "noopener noreferrer" when `target` is `"_blank"`.
|
|
34
|
+
* If the `rel` property is provided, it overrides the default behavior.
|
|
35
|
+
* This property only applies when an `href` is provided.
|
|
36
|
+
*/
|
|
37
|
+
rel?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Specifies whether the linked URL, when selected, will prompt the user to download instead of navigate.
|
|
40
|
+
* You can specify a string value that will be suggested as the name of the downloaded file.
|
|
41
|
+
* This property only applies when an `href` is provided.
|
|
42
|
+
*/
|
|
43
|
+
download?: boolean | string;
|
|
44
|
+
/**
|
|
45
|
+
* Called when the user clicks on the action card with the left mouse button without pressing
|
|
46
|
+
* modifier keys (that is, CTRL, ALT, SHIFT, META), and the action card has an `href` set.
|
|
47
|
+
*/
|
|
48
|
+
onFollow?: CancelableEventHandler<ActionCardProps.FollowDetail>;
|
|
22
49
|
/**
|
|
23
50
|
* Adds an aria-label to the action card.
|
|
24
51
|
*/
|
|
@@ -65,10 +92,22 @@ export interface ActionCardProps extends BaseComponentProps {
|
|
|
65
92
|
* @awsuiSystem core
|
|
66
93
|
*/
|
|
67
94
|
nativeButtonAttributes?: NativeAttributes<React.ButtonHTMLAttributes<HTMLButtonElement>>;
|
|
95
|
+
/**
|
|
96
|
+
* Attributes to add to the native `a` element (when `href` is provided).
|
|
97
|
+
* Some attributes will be automatically combined with internal attribute values:
|
|
98
|
+
* - `className` will be appended.
|
|
99
|
+
* - Event handlers will be chained, unless the default is prevented.
|
|
100
|
+
*
|
|
101
|
+
* We do not support using this attribute to apply custom styling.
|
|
102
|
+
*
|
|
103
|
+
* @awsuiSystem core
|
|
104
|
+
*/
|
|
105
|
+
nativeAnchorAttributes?: NativeAttributes<React.AnchorHTMLAttributes<HTMLAnchorElement>>;
|
|
68
106
|
}
|
|
69
107
|
export declare namespace ActionCardProps {
|
|
70
108
|
interface ClickDetail {
|
|
71
109
|
}
|
|
110
|
+
type FollowDetail = BaseNavigationDetail;
|
|
72
111
|
type IconVerticalAlignment = 'top' | 'center';
|
|
73
112
|
type Variant = 'default' | 'embedded';
|
|
74
113
|
interface Ref {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/action-card/interfaces.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/action-card/interfaces.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAE9D;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAEhE;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB;;OAEG;IACH,qBAAqB,CAAC,EAAE,eAAe,CAAC,qBAAqB,CAAC;IAE9D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC;IAElC;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAEzF;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,CAAC;CAC1F;AAED,yBAAiB,eAAe,CAAC;IAE/B,UAAiB,WAAW;KAAG;IAE/B,KAAY,YAAY,GAAG,oBAAoB,CAAC;IAEhD,KAAY,qBAAqB,GAAG,KAAK,GAAG,QAAQ,CAAC;IACrD,KAAY,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IAE7C,UAAiB,GAAG;QAClB;;WAEG;QACH,KAAK,IAAI,IAAI,CAAC;KACf;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/action-card/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { ReactNode } from 'react';\n\nimport { BaseComponentProps } from '../types/base-component';\nimport { CancelableEventHandler } from '../types/events';\nimport { NativeAttributes } from '../types/native-attributes';\n\nexport interface ActionCardProps extends BaseComponentProps {\n /**\n * The header content displayed at the top of the action card.\n */\n header?: ReactNode;\n\n /**\n * The description content displayed below the header.\n */\n description?: ReactNode;\n\n /**\n * The main content of the action card.\n */\n children?: ReactNode;\n\n /**\n * Called when the user clicks on the action card.\n */\n onClick?: CancelableEventHandler<ActionCardProps.ClickDetail>;\n\n /**\n * Adds an aria-label to the action card.\n */\n ariaLabel?: string;\n\n /**\n * Adds an aria-describedby reference for the action card.\n */\n ariaDescribedby?: string;\n\n /**\n * Determines whether the action card is disabled.\n */\n disabled?: boolean;\n\n /**\n * Removes the default padding from the header area.\n */\n disableHeaderPaddings?: boolean;\n\n /**\n * Removes the default padding from the content area.\n */\n disableContentPaddings?: boolean;\n\n /**\n * Displays an icon next to the content. You can use the `iconVerticalAlignment` property to control vertical alignment.\n */\n icon?: React.ReactNode;\n\n /**\n * Specifies the vertical alignment of the icon.\n */\n iconVerticalAlignment?: ActionCardProps.IconVerticalAlignment;\n\n /**\n * Specifies the visual variant of the card, which controls the border radius and padding.\n *\n * - `default` - Uses container-level border radius and padding (larger).\n * - `embedded` - Uses compact border radius and padding (smaller).\n */\n variant?: ActionCardProps.Variant;\n\n /**\n * Attributes to add to the native button element.\n * Some attributes will be automatically combined with internal attribute values:\n * - `className` will be appended.\n * - Event handlers will be chained, unless the default is prevented.\n *\n * We do not support using this attribute to apply custom styling.\n *\n * @awsuiSystem core\n */\n nativeButtonAttributes?: NativeAttributes<React.ButtonHTMLAttributes<HTMLButtonElement>>;\n}\n\nexport namespace ActionCardProps {\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n export interface ClickDetail {}\n\n export type IconVerticalAlignment = 'top' | 'center';\n export type Variant = 'default' | 'embedded';\n\n export interface Ref {\n /**\n * Sets focus on the action card.\n */\n focus(): void;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/action-card/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { ReactNode } from 'react';\n\nimport { BaseComponentProps } from '../types/base-component';\nimport { BaseNavigationDetail, CancelableEventHandler } from '../types/events';\nimport { NativeAttributes } from '../types/native-attributes';\n\nexport interface ActionCardProps extends BaseComponentProps {\n /**\n * The header content displayed at the top of the action card.\n */\n header?: ReactNode;\n\n /**\n * The description content displayed below the header.\n */\n description?: ReactNode;\n\n /**\n * The main content of the action card.\n */\n children?: ReactNode;\n\n /**\n * Called when the user clicks on the action card.\n */\n onClick?: CancelableEventHandler<ActionCardProps.ClickDetail>;\n\n /**\n * Turns the action card into a link, pointing to the given URL. The card is rendered using an `a` element instead of a `button`.\n * For example, use this property if selecting the card should navigate the user to another page.\n */\n href?: string;\n\n /**\n * Specifies where to open the linked URL (for example, to open in a new browser window or tab use `_blank`).\n * This property only applies when an `href` is provided.\n */\n target?: string;\n\n /**\n * Adds a `rel` attribute to the link. By default, the component sets the `rel` attribute to \"noopener noreferrer\" when `target` is `\"_blank\"`.\n * If the `rel` property is provided, it overrides the default behavior.\n * This property only applies when an `href` is provided.\n */\n rel?: string;\n\n /**\n * Specifies whether the linked URL, when selected, will prompt the user to download instead of navigate.\n * You can specify a string value that will be suggested as the name of the downloaded file.\n * This property only applies when an `href` is provided.\n */\n download?: boolean | string;\n\n /**\n * Called when the user clicks on the action card with the left mouse button without pressing\n * modifier keys (that is, CTRL, ALT, SHIFT, META), and the action card has an `href` set.\n */\n onFollow?: CancelableEventHandler<ActionCardProps.FollowDetail>;\n\n /**\n * Adds an aria-label to the action card.\n */\n ariaLabel?: string;\n\n /**\n * Adds an aria-describedby reference for the action card.\n */\n ariaDescribedby?: string;\n\n /**\n * Determines whether the action card is disabled.\n */\n disabled?: boolean;\n\n /**\n * Removes the default padding from the header area.\n */\n disableHeaderPaddings?: boolean;\n\n /**\n * Removes the default padding from the content area.\n */\n disableContentPaddings?: boolean;\n\n /**\n * Displays an icon next to the content. You can use the `iconVerticalAlignment` property to control vertical alignment.\n */\n icon?: React.ReactNode;\n\n /**\n * Specifies the vertical alignment of the icon.\n */\n iconVerticalAlignment?: ActionCardProps.IconVerticalAlignment;\n\n /**\n * Specifies the visual variant of the card, which controls the border radius and padding.\n *\n * - `default` - Uses container-level border radius and padding (larger).\n * - `embedded` - Uses compact border radius and padding (smaller).\n */\n variant?: ActionCardProps.Variant;\n\n /**\n * Attributes to add to the native button element.\n * Some attributes will be automatically combined with internal attribute values:\n * - `className` will be appended.\n * - Event handlers will be chained, unless the default is prevented.\n *\n * We do not support using this attribute to apply custom styling.\n *\n * @awsuiSystem core\n */\n nativeButtonAttributes?: NativeAttributes<React.ButtonHTMLAttributes<HTMLButtonElement>>;\n\n /**\n * Attributes to add to the native `a` element (when `href` is provided).\n * Some attributes will be automatically combined with internal attribute values:\n * - `className` will be appended.\n * - Event handlers will be chained, unless the default is prevented.\n *\n * We do not support using this attribute to apply custom styling.\n *\n * @awsuiSystem core\n */\n nativeAnchorAttributes?: NativeAttributes<React.AnchorHTMLAttributes<HTMLAnchorElement>>;\n}\n\nexport namespace ActionCardProps {\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n export interface ClickDetail {}\n\n export type FollowDetail = BaseNavigationDetail;\n\n export type IconVerticalAlignment = 'top' | 'center';\n export type Variant = 'default' | 'embedded';\n\n export interface Ref {\n /**\n * Sets focus on the action card.\n */\n focus(): void;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/action-card/internal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAStC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/action-card/internal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAStC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAGlF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAK/C,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG,0BAA0B,CAAC;AAEnF,QAAA,MAAM,kBAAkB,0HAiOvB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -5,20 +5,23 @@ import clsx from 'clsx';
|
|
|
5
5
|
import { useMergeRefs, useUniqueId, warnOnce } from '@cloudscape-design/component-toolkit/internal';
|
|
6
6
|
import { getBaseProps } from '../internal/base-component';
|
|
7
7
|
import InternalStructuredItem from '../internal/components/structured-item';
|
|
8
|
-
import { fireCancelableEvent } from '../internal/events';
|
|
8
|
+
import { fireCancelableEvent, isPlainLeftClick } from '../internal/events';
|
|
9
9
|
import useForwardFocus from '../internal/hooks/forward-focus';
|
|
10
|
+
import { checkSafeUrl } from '../internal/utils/check-safe-url';
|
|
10
11
|
import WithNativeAttributes from '../internal/utils/with-native-attributes';
|
|
11
12
|
import styles from './styles.css.js';
|
|
12
13
|
import testStyles from './test-classes/styles.css.js';
|
|
13
|
-
const InternalActionCard = React.forwardRef(({ header, description, children, onClick, ariaLabel, ariaDescribedby, disabled, disableHeaderPaddings, disableContentPaddings, icon, iconVerticalAlignment, variant, nativeButtonAttributes, __internalRootRef, ...rest }, ref) => {
|
|
14
|
+
const InternalActionCard = React.forwardRef(({ header, description, children, onClick, onFollow, href, target, rel, download, ariaLabel, ariaDescribedby, disabled, disableHeaderPaddings, disableContentPaddings, icon, iconVerticalAlignment, variant, nativeButtonAttributes, nativeAnchorAttributes, __internalRootRef, ...rest }, ref) => {
|
|
14
15
|
const baseProps = getBaseProps(rest);
|
|
15
|
-
const
|
|
16
|
+
const containerRef = useRef(null);
|
|
16
17
|
const rootRef = useRef(null);
|
|
17
18
|
const headerId = useUniqueId('action-card-header-');
|
|
18
19
|
const standaloneButtonId = useUniqueId('action-card-button-');
|
|
19
20
|
const descriptionId = useUniqueId('action-card-description-');
|
|
20
21
|
const bodyId = useUniqueId('action-card-body-');
|
|
21
|
-
useForwardFocus(ref,
|
|
22
|
+
useForwardFocus(ref, containerRef);
|
|
23
|
+
checkSafeUrl('ActionCard', href);
|
|
24
|
+
const isAnchor = Boolean(href);
|
|
22
25
|
if (!header && !ariaLabel) {
|
|
23
26
|
warnOnce('ActionCard', 'An accessible name is required. Provide either a `header` or an `ariaLabel` prop so the action card has a meaningful label for screen reader users.');
|
|
24
27
|
}
|
|
@@ -26,6 +29,9 @@ const InternalActionCard = React.forwardRef(({ header, description, children, on
|
|
|
26
29
|
if (disabled) {
|
|
27
30
|
return event.preventDefault();
|
|
28
31
|
}
|
|
32
|
+
if (isAnchor && isPlainLeftClick(event)) {
|
|
33
|
+
fireCancelableEvent(onFollow, { href, target }, event);
|
|
34
|
+
}
|
|
29
35
|
fireCancelableEvent(onClick, {}, event);
|
|
30
36
|
};
|
|
31
37
|
const headerRowEmpty = !header && !description;
|
|
@@ -37,16 +43,26 @@ const InternalActionCard = React.forwardRef(({ header, description, children, on
|
|
|
37
43
|
if (!ariaDescribedby && description && (ariaLabel || header)) {
|
|
38
44
|
ariaDescribedby = descriptionId;
|
|
39
45
|
}
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
// Shared props between <a>-tag and <button>-tag
|
|
47
|
+
const interactiveProps = {
|
|
42
48
|
className: clsx(styles['header-button'], testStyles.button, disabled && styles.disabled, variant && styles[`variant-${variant}`]),
|
|
43
49
|
onClick: handleButtonClick,
|
|
44
50
|
'aria-describedby': ariaDescribedby,
|
|
45
51
|
'aria-disabled': disabled || undefined,
|
|
46
52
|
};
|
|
53
|
+
// <a>-tag specific props
|
|
54
|
+
const anchorProps = {
|
|
55
|
+
href: disabled ? undefined : href,
|
|
56
|
+
role: disabled ? 'link' : undefined,
|
|
57
|
+
tabIndex: disabled ? 0 : undefined,
|
|
58
|
+
target,
|
|
59
|
+
// security recommendation: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#target
|
|
60
|
+
rel: rel !== null && rel !== void 0 ? rel : (target === '_blank' ? 'noopener noreferrer' : undefined),
|
|
61
|
+
download,
|
|
62
|
+
};
|
|
63
|
+
const renderInteractiveElement = (props, children) => isAnchor ? (React.createElement(WithNativeAttributes, { ...props, ...anchorProps, tag: "a", componentName: "ActionCard", nativeAttributes: nativeAnchorAttributes, ref: containerRef }, children)) : (React.createElement(WithNativeAttributes, { ...props, type: "button", tag: "button", componentName: "ActionCard", nativeAttributes: nativeButtonAttributes, ref: containerRef }, children));
|
|
47
64
|
const headerSection = !headerRowEmpty ? (React.createElement("div", { className: clsx(styles.header, disableHeaderPaddings && styles['no-padding']) },
|
|
48
|
-
React.createElement(InternalStructuredItem, { content: header && (React.createElement("div", { className: clsx(styles['header-inner'], testStyles.header, disabled && styles.disabled) },
|
|
49
|
-
React.createElement(WithNativeAttributes, { ...buttonProps, tag: "button", componentName: "ActionCard", nativeAttributes: nativeButtonAttributes, ref: buttonRef, id: headerId }, header))), secondaryContent: description && (React.createElement("div", { id: descriptionId, className: clsx(styles.description, testStyles.description, disabled && styles.disabled, header && styles['has-header']) }, description)), disablePaddings: disableHeaderPaddings }))) : null;
|
|
65
|
+
React.createElement(InternalStructuredItem, { content: header && (React.createElement("div", { className: clsx(styles['header-inner'], testStyles.header, disabled && styles.disabled) }, renderInteractiveElement({ ...interactiveProps, id: headerId }, header))), secondaryContent: description && (React.createElement("div", { id: descriptionId, className: clsx(styles.description, testStyles.description, disabled && styles.disabled, header && styles['has-header']) }, description)), disablePaddings: disableHeaderPaddings }))) : null;
|
|
50
66
|
// When there's no header, a standalone overlay button is rendered.
|
|
51
67
|
// If ariaLabel is provided, it's used directly. Otherwise, derive the button's
|
|
52
68
|
// accessible name from the first available content: description or children.
|
|
@@ -59,7 +75,14 @@ const InternalActionCard = React.forwardRef(({ header, description, children, on
|
|
|
59
75
|
standaloneButtonLabelledBy = bodyId;
|
|
60
76
|
}
|
|
61
77
|
}
|
|
62
|
-
const
|
|
78
|
+
const standaloneOverlayProps = {
|
|
79
|
+
...interactiveProps,
|
|
80
|
+
id: standaloneButtonId,
|
|
81
|
+
className: clsx(styles['overlay-button'], testStyles.button, disabled && styles.disabled, variant && styles[`variant-${variant}`]),
|
|
82
|
+
'aria-label': ariaLabel || undefined,
|
|
83
|
+
'aria-labelledby': standaloneButtonLabelledBy,
|
|
84
|
+
};
|
|
85
|
+
const standaloneButton = !header ? renderInteractiveElement(standaloneOverlayProps) : null;
|
|
63
86
|
const contentElement = (React.createElement("div", { className: styles['inner-card'] },
|
|
64
87
|
iconInHeaderRow ? (React.createElement("div", { className: styles['header-row'] },
|
|
65
88
|
headerSection,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/action-card/internal.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useUniqueId, warnOnce } from '@cloudscape-design/component-toolkit/internal';\n\nimport { getBaseProps } from '../internal/base-component';\nimport InternalStructuredItem from '../internal/components/structured-item';\nimport { fireCancelableEvent } from '../internal/events';\nimport useForwardFocus from '../internal/hooks/forward-focus';\nimport { InternalBaseComponentProps } from '../internal/hooks/use-base-component';\nimport WithNativeAttributes from '../internal/utils/with-native-attributes';\nimport { ActionCardProps } from './interfaces';\n\nimport styles from './styles.css.js';\nimport testStyles from './test-classes/styles.css.js';\n\nexport type InternalActionCardProps = ActionCardProps & InternalBaseComponentProps;\n\nconst InternalActionCard = React.forwardRef(\n (\n {\n header,\n description,\n children,\n onClick,\n ariaLabel,\n ariaDescribedby,\n disabled,\n disableHeaderPaddings,\n disableContentPaddings,\n icon,\n iconVerticalAlignment,\n variant,\n nativeButtonAttributes,\n __internalRootRef,\n ...rest\n }: InternalActionCardProps,\n ref: React.Ref<ActionCardProps.Ref>\n ) => {\n const baseProps = getBaseProps(rest);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const headerId = useUniqueId('action-card-header-');\n const standaloneButtonId = useUniqueId('action-card-button-');\n const descriptionId = useUniqueId('action-card-description-');\n const bodyId = useUniqueId('action-card-body-');\n\n useForwardFocus(ref, buttonRef);\n\n if (!header && !ariaLabel) {\n warnOnce(\n 'ActionCard',\n 'An accessible name is required. Provide either a `header` or an `ariaLabel` prop so the action card has a meaningful label for screen reader users.'\n );\n }\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n return event.preventDefault();\n }\n fireCancelableEvent(onClick, {}, event);\n };\n\n const headerRowEmpty = !header && !description;\n\n const iconWrapper = icon && (\n <div className={clsx(styles.icon, testStyles.icon)} aria-hidden=\"true\">\n {icon}\n </div>\n );\n const iconInHeaderRow = icon && iconVerticalAlignment === 'top' && !!header;\n\n const mergedRootRef = useMergeRefs(rootRef, __internalRootRef);\n\n // Link the description element as the button's accessible description\n // when the button already has a name (via header text or ariaLabel).\n if (!ariaDescribedby && description && (ariaLabel || header)) {\n ariaDescribedby = descriptionId;\n }\n\n const buttonProps = {\n type: 'button' as const,\n className: clsx(\n styles['header-button'],\n testStyles.button,\n disabled && styles.disabled,\n variant && styles[`variant-${variant}`]\n ),\n onClick: handleButtonClick,\n 'aria-describedby': ariaDescribedby,\n 'aria-disabled': disabled || undefined,\n };\n\n const headerSection = !headerRowEmpty ? (\n <div className={clsx(styles.header, disableHeaderPaddings && styles['no-padding'])}>\n <InternalStructuredItem\n content={\n header && (\n <div className={clsx(styles['header-inner'], testStyles.header, disabled && styles.disabled)}>\n <WithNativeAttributes<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>\n {...buttonProps}\n tag=\"button\"\n componentName=\"ActionCard\"\n nativeAttributes={nativeButtonAttributes}\n ref={buttonRef}\n id={headerId}\n >\n {header}\n </WithNativeAttributes>\n </div>\n )\n }\n secondaryContent={\n description && (\n <div\n id={descriptionId}\n className={clsx(\n styles.description,\n testStyles.description,\n disabled && styles.disabled,\n header && styles['has-header']\n )}\n >\n {description}\n </div>\n )\n }\n disablePaddings={disableHeaderPaddings}\n />\n </div>\n ) : null;\n\n // When there's no header, a standalone overlay button is rendered.\n // If ariaLabel is provided, it's used directly. Otherwise, derive the button's\n // accessible name from the first available content: description or children.\n let standaloneButtonLabelledBy: string | undefined;\n if (!ariaLabel) {\n if (description) {\n standaloneButtonLabelledBy = descriptionId;\n } else if (children) {\n standaloneButtonLabelledBy = bodyId;\n }\n }\n\n const standaloneButton = !header ? (\n <WithNativeAttributes<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>\n {...buttonProps}\n tag=\"button\"\n componentName=\"ActionCard\"\n nativeAttributes={nativeButtonAttributes}\n ref={buttonRef}\n id={standaloneButtonId}\n className={clsx(\n styles['overlay-button'],\n testStyles.button,\n disabled && styles.disabled,\n variant && styles[`variant-${variant}`]\n )}\n aria-label={ariaLabel || undefined}\n aria-labelledby={standaloneButtonLabelledBy}\n />\n ) : null;\n\n const contentElement = (\n <div className={styles['inner-card']}>\n {iconInHeaderRow ? (\n <div className={styles['header-row']}>\n {headerSection}\n {iconWrapper}\n </div>\n ) : (\n headerSection\n )}\n {children && (\n <div\n className={clsx(styles.body, testStyles.body, disableContentPaddings && styles['no-padding'])}\n id={bodyId}\n >\n {children}\n </div>\n )}\n </div>\n );\n\n return (\n <div\n {...baseProps}\n ref={mergedRootRef}\n role=\"group\"\n aria-labelledby={header ? headerId : standaloneButtonId}\n className={clsx(\n styles.root,\n styles[`variant-${variant}`],\n disabled && styles.disabled,\n disabled && testStyles.disabled,\n !!icon && styles['has-icon'],\n !!icon && styles['icon-align-end'],\n !!icon && styles[`icon-vertical-align-${iconVerticalAlignment}`],\n baseProps.className\n )}\n aria-disabled={disabled || undefined}\n >\n {standaloneButton}\n {contentElement}\n {!iconInHeaderRow && iconWrapper}\n </div>\n );\n }\n);\n\nexport default InternalActionCard;\n"]}
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/action-card/internal.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useUniqueId, warnOnce } from '@cloudscape-design/component-toolkit/internal';\n\nimport { getBaseProps } from '../internal/base-component';\nimport InternalStructuredItem from '../internal/components/structured-item';\nimport { fireCancelableEvent, isPlainLeftClick } from '../internal/events';\nimport useForwardFocus from '../internal/hooks/forward-focus';\nimport { InternalBaseComponentProps } from '../internal/hooks/use-base-component';\nimport { checkSafeUrl } from '../internal/utils/check-safe-url';\nimport WithNativeAttributes from '../internal/utils/with-native-attributes';\nimport { ActionCardProps } from './interfaces';\n\nimport styles from './styles.css.js';\nimport testStyles from './test-classes/styles.css.js';\n\nexport type InternalActionCardProps = ActionCardProps & InternalBaseComponentProps;\n\nconst InternalActionCard = React.forwardRef(\n (\n {\n header,\n description,\n children,\n onClick,\n onFollow,\n href,\n target,\n rel,\n download,\n ariaLabel,\n ariaDescribedby,\n disabled,\n disableHeaderPaddings,\n disableContentPaddings,\n icon,\n iconVerticalAlignment,\n variant,\n nativeButtonAttributes,\n nativeAnchorAttributes,\n __internalRootRef,\n ...rest\n }: InternalActionCardProps,\n ref: React.Ref<ActionCardProps.Ref>\n ) => {\n const baseProps = getBaseProps(rest);\n const containerRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const headerId = useUniqueId('action-card-header-');\n const standaloneButtonId = useUniqueId('action-card-button-');\n const descriptionId = useUniqueId('action-card-description-');\n const bodyId = useUniqueId('action-card-body-');\n\n useForwardFocus(ref, containerRef);\n\n checkSafeUrl('ActionCard', href);\n const isAnchor = Boolean(href);\n\n if (!header && !ariaLabel) {\n warnOnce(\n 'ActionCard',\n 'An accessible name is required. Provide either a `header` or an `ariaLabel` prop so the action card has a meaningful label for screen reader users.'\n );\n }\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n if (disabled) {\n return event.preventDefault();\n }\n if (isAnchor && isPlainLeftClick(event)) {\n fireCancelableEvent(onFollow, { href, target }, event);\n }\n fireCancelableEvent(onClick, {}, event);\n };\n\n const headerRowEmpty = !header && !description;\n\n const iconWrapper = icon && (\n <div className={clsx(styles.icon, testStyles.icon)} aria-hidden=\"true\">\n {icon}\n </div>\n );\n const iconInHeaderRow = icon && iconVerticalAlignment === 'top' && !!header;\n\n const mergedRootRef = useMergeRefs(rootRef, __internalRootRef);\n\n // Link the description element as the button's accessible description\n // when the button already has a name (via header text or ariaLabel).\n if (!ariaDescribedby && description && (ariaLabel || header)) {\n ariaDescribedby = descriptionId;\n }\n\n // Shared props between <a>-tag and <button>-tag\n const interactiveProps = {\n className: clsx(\n styles['header-button'],\n testStyles.button,\n disabled && styles.disabled,\n variant && styles[`variant-${variant}`]\n ),\n onClick: handleButtonClick,\n 'aria-describedby': ariaDescribedby,\n 'aria-disabled': disabled || undefined,\n };\n\n // <a>-tag specific props\n const anchorProps = {\n href: disabled ? undefined : href,\n role: disabled ? 'link' : undefined,\n tabIndex: disabled ? 0 : undefined,\n target,\n // security recommendation: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#target\n rel: rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined),\n download,\n };\n\n const renderInteractiveElement = (props: Record<string, unknown>, children?: React.ReactNode) =>\n isAnchor ? (\n <WithNativeAttributes<HTMLAnchorElement, React.AnchorHTMLAttributes<HTMLAnchorElement>>\n {...props}\n {...anchorProps}\n tag=\"a\"\n componentName=\"ActionCard\"\n nativeAttributes={nativeAnchorAttributes}\n ref={containerRef as React.Ref<HTMLAnchorElement>}\n >\n {children}\n </WithNativeAttributes>\n ) : (\n <WithNativeAttributes<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>\n {...props}\n type=\"button\"\n tag=\"button\"\n componentName=\"ActionCard\"\n nativeAttributes={nativeButtonAttributes}\n ref={containerRef as React.Ref<HTMLButtonElement>}\n >\n {children}\n </WithNativeAttributes>\n );\n\n const headerSection = !headerRowEmpty ? (\n <div className={clsx(styles.header, disableHeaderPaddings && styles['no-padding'])}>\n <InternalStructuredItem\n content={\n header && (\n <div className={clsx(styles['header-inner'], testStyles.header, disabled && styles.disabled)}>\n {renderInteractiveElement({ ...interactiveProps, id: headerId }, header)}\n </div>\n )\n }\n secondaryContent={\n description && (\n <div\n id={descriptionId}\n className={clsx(\n styles.description,\n testStyles.description,\n disabled && styles.disabled,\n header && styles['has-header']\n )}\n >\n {description}\n </div>\n )\n }\n disablePaddings={disableHeaderPaddings}\n />\n </div>\n ) : null;\n\n // When there's no header, a standalone overlay button is rendered.\n // If ariaLabel is provided, it's used directly. Otherwise, derive the button's\n // accessible name from the first available content: description or children.\n let standaloneButtonLabelledBy: string | undefined;\n if (!ariaLabel) {\n if (description) {\n standaloneButtonLabelledBy = descriptionId;\n } else if (children) {\n standaloneButtonLabelledBy = bodyId;\n }\n }\n\n const standaloneOverlayProps = {\n ...interactiveProps,\n id: standaloneButtonId,\n className: clsx(\n styles['overlay-button'],\n testStyles.button,\n disabled && styles.disabled,\n variant && styles[`variant-${variant}`]\n ),\n 'aria-label': ariaLabel || undefined,\n 'aria-labelledby': standaloneButtonLabelledBy,\n };\n\n const standaloneButton = !header ? renderInteractiveElement(standaloneOverlayProps) : null;\n\n const contentElement = (\n <div className={styles['inner-card']}>\n {iconInHeaderRow ? (\n <div className={styles['header-row']}>\n {headerSection}\n {iconWrapper}\n </div>\n ) : (\n headerSection\n )}\n {children && (\n <div\n className={clsx(styles.body, testStyles.body, disableContentPaddings && styles['no-padding'])}\n id={bodyId}\n >\n {children}\n </div>\n )}\n </div>\n );\n\n return (\n <div\n {...baseProps}\n ref={mergedRootRef}\n role=\"group\"\n aria-labelledby={header ? headerId : standaloneButtonId}\n className={clsx(\n styles.root,\n styles[`variant-${variant}`],\n disabled && styles.disabled,\n disabled && testStyles.disabled,\n !!icon && styles['has-icon'],\n !!icon && styles['icon-align-end'],\n !!icon && styles[`icon-vertical-align-${iconVerticalAlignment}`],\n baseProps.className\n )}\n aria-disabled={disabled || undefined}\n >\n {standaloneButton}\n {contentElement}\n {!iconInHeaderRow && iconWrapper}\n </div>\n );\n }\n);\n\nexport default InternalActionCard;\n"]}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
|
|
2
2
|
import './styles.scoped.css';
|
|
3
3
|
export default {
|
|
4
|
-
"root": "
|
|
5
|
-
"icon": "
|
|
6
|
-
"header-inner": "awsui_header-
|
|
7
|
-
"disabled": "
|
|
8
|
-
"header": "
|
|
9
|
-
"body": "
|
|
10
|
-
"header-row": "awsui_header-
|
|
11
|
-
"description": "
|
|
12
|
-
"has-header": "awsui_has-
|
|
13
|
-
"header-button": "awsui_header-
|
|
14
|
-
"overlay-button": "awsui_overlay-
|
|
15
|
-
"variant-embedded": "awsui_variant-
|
|
16
|
-
"variant-default": "awsui_variant-
|
|
17
|
-
"inner-card": "awsui_inner-
|
|
18
|
-
"no-padding": "awsui_no-
|
|
19
|
-
"icon-vertical-align-center": "awsui_icon-vertical-align-
|
|
20
|
-
"icon-align-end": "awsui_icon-align-
|
|
4
|
+
"root": "awsui_root_16248_11dsh_161",
|
|
5
|
+
"icon": "awsui_icon_16248_11dsh_193",
|
|
6
|
+
"header-inner": "awsui_header-inner_16248_11dsh_209",
|
|
7
|
+
"disabled": "awsui_disabled_16248_11dsh_218",
|
|
8
|
+
"header": "awsui_header_16248_11dsh_209",
|
|
9
|
+
"body": "awsui_body_16248_11dsh_224",
|
|
10
|
+
"header-row": "awsui_header-row_16248_11dsh_228",
|
|
11
|
+
"description": "awsui_description_16248_11dsh_241",
|
|
12
|
+
"has-header": "awsui_has-header_16248_11dsh_247",
|
|
13
|
+
"header-button": "awsui_header-button_16248_11dsh_261",
|
|
14
|
+
"overlay-button": "awsui_overlay-button_16248_11dsh_262",
|
|
15
|
+
"variant-embedded": "awsui_variant-embedded_16248_11dsh_281",
|
|
16
|
+
"variant-default": "awsui_variant-default_16248_11dsh_293",
|
|
17
|
+
"inner-card": "awsui_inner-card_16248_11dsh_394",
|
|
18
|
+
"no-padding": "awsui_no-padding_16248_11dsh_401",
|
|
19
|
+
"icon-vertical-align-center": "awsui_icon-vertical-align-center_16248_11dsh_412",
|
|
20
|
+
"icon-align-end": "awsui_icon-align-end_16248_11dsh_548"
|
|
21
21
|
};
|
|
22
22
|
|