@dnanpm/ui-components 0.8.0 → 0.9.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.
Files changed (75) hide show
  1. package/dist/components/Accordion/Accordion.css +6 -3
  2. package/dist/components/AccordionItem/AccordionItem.css +6 -3
  3. package/dist/components/Breadcrumb/Breadcrumb.css +6 -3
  4. package/dist/components/Button/Button.css +2 -3
  5. package/dist/components/ButtonCard/ButtonCard.css +2 -3
  6. package/dist/components/ContentCard/ContentCard.cjs +96 -0
  7. package/dist/components/ContentCard/ContentCard.cjs.map +1 -0
  8. package/dist/components/ContentCard/ContentCard.css +249 -0
  9. package/dist/components/ContentCard/ContentCard.d.ts +3 -0
  10. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -0
  11. package/dist/components/ContentCard/ContentCard.js +96 -0
  12. package/dist/components/ContentCard/ContentCard.js.map +1 -0
  13. package/dist/components/ContentCard/ContentCard.module.css.cjs +24 -0
  14. package/dist/components/ContentCard/ContentCard.module.css.cjs.map +1 -0
  15. package/dist/components/ContentCard/ContentCard.module.css.js +25 -0
  16. package/dist/components/ContentCard/ContentCard.module.css.js.map +1 -0
  17. package/dist/components/ContentCard/ContentCard.types.d.ts +99 -0
  18. package/dist/components/ContentCard/ContentCard.types.d.ts.map +1 -0
  19. package/dist/components/ContentCard/index.d.ts +3 -0
  20. package/dist/components/ContentCard/index.d.ts.map +1 -0
  21. package/dist/components/Drawer/Drawer.css +2 -3
  22. package/dist/components/Footer/Footer.css +6 -3
  23. package/dist/components/FunctionButton/FunctionButton.css +2 -3
  24. package/dist/components/Hero/Hero.cjs +24 -26
  25. package/dist/components/Hero/Hero.cjs.map +1 -1
  26. package/dist/components/Hero/Hero.css +81 -74
  27. package/dist/components/Hero/Hero.js +24 -26
  28. package/dist/components/Hero/Hero.js.map +1 -1
  29. package/dist/components/Hero/Hero.module.css.cjs +20 -17
  30. package/dist/components/Hero/Hero.module.css.cjs.map +1 -1
  31. package/dist/components/Hero/Hero.module.css.js +20 -17
  32. package/dist/components/Hero/Hero.module.css.js.map +1 -1
  33. package/dist/components/IconButton/IconButton.css +2 -3
  34. package/dist/components/Label/Label.css +2 -3
  35. package/dist/components/MainNavigation/MainNavigation.cjs +407 -96
  36. package/dist/components/MainNavigation/MainNavigation.cjs.map +1 -1
  37. package/dist/components/MainNavigation/MainNavigation.css +255 -151
  38. package/dist/components/MainNavigation/MainNavigation.d.ts +1 -1
  39. package/dist/components/MainNavigation/MainNavigation.d.ts.map +1 -1
  40. package/dist/components/MainNavigation/MainNavigation.js +409 -98
  41. package/dist/components/MainNavigation/MainNavigation.js.map +1 -1
  42. package/dist/components/MainNavigation/MainNavigation.module.css.cjs +78 -68
  43. package/dist/components/MainNavigation/MainNavigation.module.css.cjs.map +1 -1
  44. package/dist/components/MainNavigation/MainNavigation.module.css.js +78 -68
  45. package/dist/components/MainNavigation/MainNavigation.module.css.js.map +1 -1
  46. package/dist/components/MainNavigation/MainNavigation.types.d.ts +64 -17
  47. package/dist/components/MainNavigation/MainNavigation.types.d.ts.map +1 -1
  48. package/dist/components/MainNavigation/MainNavigation.utils.cjs +20 -0
  49. package/dist/components/MainNavigation/MainNavigation.utils.cjs.map +1 -1
  50. package/dist/components/MainNavigation/MainNavigation.utils.d.ts +10 -1
  51. package/dist/components/MainNavigation/MainNavigation.utils.d.ts.map +1 -1
  52. package/dist/components/MainNavigation/MainNavigation.utils.js +20 -0
  53. package/dist/components/MainNavigation/MainNavigation.utils.js.map +1 -1
  54. package/dist/components/MainNavigation/index.d.ts +1 -1
  55. package/dist/components/MainNavigation/index.d.ts.map +1 -1
  56. package/dist/components/Modal/Modal.css +2 -3
  57. package/dist/components/Notification/Notification.css +6 -3
  58. package/dist/components/Pictograph/Pictograph.css +6 -3
  59. package/dist/components/Pictograph/PictographItem.css +6 -3
  60. package/dist/components/Quote/Quote.css +2 -3
  61. package/dist/components/Spinner/Spinner.css +6 -3
  62. package/dist/index.cjs +2 -0
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.ts +3 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/styles/utils/elevation.css +2 -3
  69. package/dist/styles/utils/focus.css +25 -22
  70. package/dist/styles/utils/focus.module.css.cjs +3 -3
  71. package/dist/styles/utils/focus.module.css.js +3 -3
  72. package/dist/styles/utils/overlay.css +2 -3
  73. package/dist/styles/utils/text-decoration.css +2 -3
  74. package/dist/styles.css +17 -7
  75. package/package.json +1 -1
@@ -1,4 +1,8 @@
1
- @layer dds-components {/**
1
+ @layer dds-base, dds-components;
2
+
3
+ @layer dds-components { @layer fallback, components; }
4
+
5
+ @layer dds-components.components{/**
2
6
  * Accordion Component Styles
3
7
  *
4
8
  * Layout wrapper that spaces AccordionItem children evenly.
@@ -15,5 +19,4 @@
15
19
 
16
20
  ._accordion--panel_18qm2_16 {
17
21
  gap: 0;
18
- }
19
- }
22
+ } }
@@ -1,4 +1,8 @@
1
- @layer dds-components {/**
1
+ @layer dds-base, dds-components;
2
+
3
+ @layer dds-components { @layer fallback, components; }
4
+
5
+ @layer dds-components.components{/**
2
6
  * AccordionItem Component Styles
3
7
  *
4
8
  * Uses native <details> element for expand/collapse behavior.
@@ -124,5 +128,4 @@
124
128
  /* calc-size() function allows transition to height: auto; */
125
129
  block-size: calc-size(auto, size);
126
130
  }
127
- }
128
- }
131
+ } }
@@ -1,4 +1,8 @@
1
- @layer dds-components {/**
1
+ @layer dds-base, dds-components;
2
+
3
+ @layer dds-components { @layer fallback, components; }
4
+
5
+ @layer dds-components.components{/**
2
6
  * Breadcrumb Component Styles
3
7
  *
4
8
  * Design tokens are consumed via CSS custom properties (variables).
@@ -68,5 +72,4 @@
68
72
  ._breadcrumb__item_1c8nk_26:not(:nth-last-child(-n + 2)) {
69
73
  display: none;
70
74
  }
71
- }
72
- }
75
+ } }
@@ -1,4 +1,4 @@
1
- @layer dds-components {._button_1utks_1 {
1
+ @layer dds-base, dds-components;@layer dds-components { @layer fallback, components; }@layer dds-components.components{._button_1utks_1 {
2
2
  display: inline-flex;
3
3
  align-items: center;
4
4
  justify-content: center;
@@ -186,5 +186,4 @@
186
186
 
187
187
  ._button__spinner_1utks_187 {
188
188
  flex: 0 0 auto;
189
- }
190
- }
189
+ } }
@@ -1,4 +1,4 @@
1
- @layer dds-components {._button-card_14hpp_1 {
1
+ @layer dds-base, dds-components;@layer dds-components { @layer fallback, components; }@layer dds-components.components{._button-card_14hpp_1 {
2
2
  --_button-card-padding: var(--spacing-space-16);
3
3
  --_button-card-gap: var(--spacing-space-16);
4
4
  --_button-card-content-gap: var(--spacing-space-16);
@@ -163,5 +163,4 @@
163
163
  white-space: nowrap;
164
164
  border: 0;
165
165
  clip: rect(0, 0, 0, 0);
166
- }
167
- }
166
+ } }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const elevation_module = require("../../styles/utils/elevation.module.css.cjs");
6
+ const ContentCard_module = require("./ContentCard.module.css.cjs");
7
+ const cn = require("../../utils/cn/cn.cjs");
8
+ const logoBackgroundToken = {
9
+ white: "var(--color-semantic-surface-base)",
10
+ "sand-soft": "var(--color-semantic-surface-neutral-soft)",
11
+ "sand-mid": "var(--color-semantic-surface-neutral-mid)",
12
+ "sand-strong": "var(--color-semantic-surface-neutral-strong)",
13
+ "pink-soft": "var(--color-semantic-surface-primary-soft)",
14
+ "pink-mid": "var(--color-semantic-surface-primary-mid)",
15
+ "pink-strong": "var(--color-semantic-surface-primary-strong)",
16
+ "plum-soft": "var(--color-semantic-surface-secondary-soft)",
17
+ "plum-mid": "var(--color-semantic-surface-secondary-mid)",
18
+ "plum-strong": "var(--color-semantic-surface-secondary-strong)"
19
+ };
20
+ const isRenderable = (node) => node != null && typeof node !== "boolean";
21
+ const ContentCard = ({
22
+ media,
23
+ mediaKind = "image",
24
+ mediaBackground,
25
+ mediaWidth = "1/3",
26
+ mediaPosition = "start",
27
+ titlePrefix,
28
+ title,
29
+ headingLevel = "h3",
30
+ body,
31
+ actions,
32
+ appearance = "plain",
33
+ as = "article",
34
+ className,
35
+ ref,
36
+ ...props
37
+ }) => {
38
+ const titleId = react.useId();
39
+ const HeadingLevel = headingLevel;
40
+ const Root = as;
41
+ const hasMedia = isRenderable(media);
42
+ const ariaLabel = props["aria-label"];
43
+ const ariaLabelledBy = props["aria-labelledby"] ?? (ariaLabel || as === "div" ? void 0 : titleId);
44
+ return /* @__PURE__ */ jsxRuntime.jsx(
45
+ Root,
46
+ {
47
+ ref,
48
+ ...props,
49
+ className: cn.cn(
50
+ ContentCard_module["content-card"],
51
+ hasMedia && mediaWidth === "1/2" && ContentCard_module["content-card--media-half"],
52
+ hasMedia && mediaPosition === "end" && ContentCard_module["content-card--media-end"],
53
+ appearance === "border" && ContentCard_module["content-card--border"],
54
+ appearance === "elevated" && ContentCard_module["content-card--elevated"],
55
+ appearance === "elevated" && elevation_module.default.elevationLow,
56
+ className
57
+ ),
58
+ "aria-label": ariaLabel,
59
+ "aria-labelledby": ariaLabelledBy,
60
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ContentCard_module["content-card__layout"], children: [
61
+ hasMedia && /* @__PURE__ */ jsxRuntime.jsx(
62
+ "div",
63
+ {
64
+ className: cn.cn(
65
+ ContentCard_module["content-card__media"],
66
+ mediaKind === "logo" ? ContentCard_module["content-card__media--logo"] : ContentCard_module["content-card__media--image"]
67
+ ),
68
+ style: mediaKind === "logo" && mediaBackground != null ? {
69
+ "--_cc-logo-bg": logoBackgroundToken[mediaBackground]
70
+ } : void 0,
71
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: ContentCard_module["content-card__media-inner"], children: media })
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ContentCard_module["content-card__content"], children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ContentCard_module["content-card__content-inner"], children: [
75
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ContentCard_module["content-card__body-region"], children: [
76
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ContentCard_module["content-card__header"], children: [
77
+ isRenderable(titlePrefix) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ContentCard_module["content-card__prefix"], children: titlePrefix }),
78
+ /* @__PURE__ */ jsxRuntime.jsx(
79
+ HeadingLevel,
80
+ {
81
+ id: titleId,
82
+ className: ContentCard_module["content-card__title"],
83
+ children: title
84
+ }
85
+ )
86
+ ] }),
87
+ isRenderable(body) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn(ContentCard_module["content-card__body"], "dds-prose"), children: body })
88
+ ] }),
89
+ isRenderable(actions) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ContentCard_module["content-card__actions"], children: actions })
90
+ ] }) })
91
+ ] })
92
+ }
93
+ );
94
+ };
95
+ exports.ContentCard = ContentCard;
96
+ //# sourceMappingURL=ContentCard.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCard.cjs","sources":["../../../src/components/ContentCard/ContentCard.tsx"],"sourcesContent":["import { useId } from 'react';\nimport type { CSSProperties, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport elevationStyles from '../../styles/utils/elevation.module.css';\nimport styles from './ContentCard.module.css';\nimport type { ContentCardLogoBackground, ContentCardProps } from './ContentCard.types';\n\nconst logoBackgroundToken: Record<ContentCardLogoBackground, string> = {\n white: 'var(--color-semantic-surface-base)',\n 'sand-soft': 'var(--color-semantic-surface-neutral-soft)',\n 'sand-mid': 'var(--color-semantic-surface-neutral-mid)',\n 'sand-strong': 'var(--color-semantic-surface-neutral-strong)',\n 'pink-soft': 'var(--color-semantic-surface-primary-soft)',\n 'pink-mid': 'var(--color-semantic-surface-primary-mid)',\n 'pink-strong': 'var(--color-semantic-surface-primary-strong)',\n 'plum-soft': 'var(--color-semantic-surface-secondary-soft)',\n 'plum-mid': 'var(--color-semantic-surface-secondary-mid)',\n 'plum-strong': 'var(--color-semantic-surface-secondary-strong)',\n};\n\n// A boolean ReactNode (e.g. from `condition && <X />`) renders nothing, so treat it as absent.\nconst isRenderable = (node: ReactNode): boolean => node != null && typeof node !== 'boolean';\n\nexport const ContentCard = ({\n media,\n mediaKind = 'image',\n mediaBackground,\n mediaWidth = '1/3',\n mediaPosition = 'start',\n titlePrefix,\n title,\n headingLevel = 'h3',\n body,\n actions,\n appearance = 'plain',\n as = 'article',\n className,\n ref,\n ...props\n}: ContentCardProps) => {\n const titleId = useId();\n const HeadingLevel = headingLevel;\n // Cast to ElementType so the constrained union of tags renders without ref/props conflicts.\n const Root = as as ElementType;\n const hasMedia = isRenderable(media);\n const ariaLabel = props['aria-label'];\n // Keep an explicit aria-labelledby; only the generated title fallback is suppressed for a\n // bare div or when an aria-label is provided.\n const ariaLabelledBy =\n props['aria-labelledby'] ?? (ariaLabel || as === 'div' ? undefined : titleId);\n\n return (\n <Root\n ref={ref}\n {...props}\n className={cn(\n styles['content-card'],\n hasMedia && mediaWidth === '1/2' && styles['content-card--media-half'],\n hasMedia && mediaPosition === 'end' && styles['content-card--media-end'],\n appearance === 'border' && styles['content-card--border'],\n appearance === 'elevated' && styles['content-card--elevated'],\n appearance === 'elevated' && elevationStyles.elevationLow,\n className,\n )}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <div className={styles['content-card__layout']}>\n {hasMedia && (\n <div\n className={cn(\n styles['content-card__media'],\n mediaKind === 'logo'\n ? styles['content-card__media--logo']\n : styles['content-card__media--image'],\n )}\n style={\n mediaKind === 'logo' && mediaBackground != null\n ? ({\n '--_cc-logo-bg': logoBackgroundToken[mediaBackground],\n } as CSSProperties)\n : undefined\n }\n >\n <div className={styles['content-card__media-inner']}>{media}</div>\n </div>\n )}\n\n <div className={styles['content-card__content']}>\n <div className={styles['content-card__content-inner']}>\n <div className={styles['content-card__body-region']}>\n <div className={styles['content-card__header']}>\n {isRenderable(titlePrefix) && (\n <div className={styles['content-card__prefix']}>\n {titlePrefix}\n </div>\n )}\n <HeadingLevel\n id={titleId}\n className={styles['content-card__title']}\n >\n {title}\n </HeadingLevel>\n </div>\n {isRenderable(body) && (\n <div className={cn(styles['content-card__body'], 'dds-prose')}>\n {body}\n </div>\n )}\n </div>\n {isRenderable(actions) && (\n <div className={styles['content-card__actions']}>{actions}</div>\n )}\n </div>\n </div>\n </div>\n </Root>\n );\n};\n"],"names":["useId","jsx","cn","styles","elevationStyles","jsxs"],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ @layer dds-base, dds-components;
2
+
3
+ @layer dds-components { @layer fallback, components; }
4
+
5
+ @layer dds-components.components{/*
6
+ * Content Card
7
+ *
8
+ * Container-driven layout: horizontal when the card is >= 40rem wide, vertical below.
9
+ * Title size responds to the CONTENT AREA width (its own container). Content padding
10
+ * responds to both the content-area width and the layout mode. Body size and inner
11
+ * gaps stay constant across sizes.
12
+ */
13
+
14
+ ._content-card_1pa46_10 {
15
+ display: flex;
16
+ flex-direction: column;
17
+ width: 100%;
18
+ min-width: 0;
19
+ /* Reset the base list-item margin when the root renders as <li>. */
20
+ margin: 0;
21
+ background-color: var(--color-semantic-surface-base);
22
+ border-radius: var(--radius-semantic-md);
23
+ /* Clips media corners to the card radius; the card's own box-shadow is not clipped. */
24
+ overflow: clip;
25
+ container-name: content-card;
26
+ container-type: inline-size;
27
+ }
28
+
29
+ ._content-card--border_1pa46_25 {
30
+ border: var(--borderwidth-semantic-xs) solid var(--color-semantic-border-neutral-base);
31
+ }
32
+
33
+ /* Layout wrapper: a descendant of the container so its direction can respond to card width. */
34
+ ._content-card__layout_1pa46_30 {
35
+ display: flex;
36
+ flex: 1;
37
+ flex-direction: column;
38
+ width: 100%;
39
+ }
40
+
41
+ /* ─── Media ─── */
42
+
43
+ ._content-card__media_1pa46_39 {
44
+ position: relative;
45
+ width: 100%;
46
+ }
47
+
48
+ ._content-card__media--image_1pa46_44 {
49
+ aspect-ratio: 21 / 9;
50
+ }
51
+
52
+ ._content-card__media--logo_1pa46_48 {
53
+ aspect-ratio: 21 / 9;
54
+ background-color: var(--_cc-logo-bg, var(--color-semantic-surface-neutral-mid));
55
+ }
56
+
57
+ /* Absolute inner fills the media box so content can't stretch the aspect ratio. */
58
+ ._content-card__media-inner_1pa46_54 {
59
+ position: absolute;
60
+ inset: 0;
61
+
62
+ /* Descendant selector also reaches an <img> nested inside a <picture>. */
63
+ & :where(img, picture, video, svg, canvas) {
64
+ display: block;
65
+ width: 100%;
66
+ height: 100%;
67
+ object-fit: cover;
68
+ }
69
+ }
70
+
71
+ /* Logo sits in a centered 4:3 box and is contained within it. */
72
+ ._content-card__media--logo_1pa46_48 ._content-card__media-inner_1pa46_54 {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ padding: var(--spacing-space-24);
77
+
78
+ & :where(img, picture, video, svg, canvas) {
79
+ width: auto;
80
+ height: 100%;
81
+ max-width: 100%;
82
+ aspect-ratio: 4 / 3;
83
+ object-fit: contain;
84
+ }
85
+ }
86
+
87
+ /* ─── Content ─── */
88
+
89
+ ._content-card__content_1pa46_85 {
90
+ display: flex;
91
+ flex: 1 1 auto;
92
+ flex-direction: column;
93
+ min-width: 0;
94
+ container-name: content-card-content;
95
+ container-type: inline-size;
96
+ }
97
+
98
+ /* Padded stack: a descendant of the content container so padding can respond to content width. */
99
+ ._content-card__content-inner_1pa46_95 {
100
+ display: flex;
101
+ flex: 1;
102
+ flex-direction: column;
103
+ gap: var(--spacing-space-24);
104
+ /* Vertical layout, small content width. */
105
+ padding: var(--spacing-space-20) var(--spacing-space-20) var(--spacing-space-32);
106
+ }
107
+
108
+ ._content-card__body-region_1pa46_104 {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: var(--spacing-space-20);
112
+ }
113
+
114
+ ._content-card__header_1pa46_110 {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--spacing-space-4);
118
+ }
119
+
120
+ ._content-card__prefix_1pa46_116 {
121
+ align-self: flex-start;
122
+ }
123
+
124
+ ._content-card__title_1pa46_120 {
125
+ margin: 0;
126
+ color: var(--color-semantic-foreground-default);
127
+ font: var(--typography-heading-sm);
128
+ text-wrap: balance;
129
+ overflow-wrap: break-word;
130
+ hyphens: auto;
131
+ /* Only hyphenate words of >= 12 chars (min 6 before / 3 after the break). */
132
+ hyphenate-limit-chars: 12 6 3;
133
+ }
134
+
135
+ ._content-card__body_1pa46_104 {
136
+ margin: 0;
137
+ color: var(--color-semantic-foreground-default);
138
+ font: var(--typography-body-md);
139
+ text-wrap: pretty;
140
+ overflow-wrap: break-word;
141
+ hyphens: auto;
142
+ /* Only hyphenate words of >= 12 chars (min 6 before / 3 after the break). */
143
+ hyphenate-limit-chars: 12 6 3;
144
+ }
145
+
146
+ ._content-card__body_1pa46_104 p {
147
+ margin: 0;
148
+ }
149
+
150
+ ._content-card__body_1pa46_104 p + p {
151
+ margin-top: var(--spacing-space-12);
152
+ }
153
+
154
+ ._content-card__actions_1pa46_150 {
155
+ display: flex;
156
+ flex-direction: row;
157
+ flex-wrap: wrap;
158
+ align-items: flex-start;
159
+ gap: var(--spacing-space-8);
160
+ /* Vertical mode only: keeps actions at the bottom when the card is taller than its content
161
+ (e.g. equal-height grid). Reset in the horizontal layout below. */
162
+ margin-top: auto;
163
+ }
164
+
165
+ /* ─── Content-area size steps (vertical paddings; based on content width) ─── */
166
+
167
+ @container content-card-content (min-width: 24rem) {
168
+ ._content-card__content-inner_1pa46_95 {
169
+ padding: var(--spacing-space-24) var(--spacing-space-40) var(--spacing-space-40);
170
+ }
171
+
172
+ ._content-card__title_1pa46_120 {
173
+ font: var(--typography-heading-md);
174
+ }
175
+ }
176
+
177
+ @container content-card-content (min-width: 36rem) {
178
+ ._content-card__content-inner_1pa46_95 {
179
+ padding: var(--spacing-space-32) var(--spacing-space-64) var(--spacing-space-48);
180
+ }
181
+ }
182
+
183
+ /* ─── Horizontal layout (card wide enough) ─── */
184
+
185
+ @container content-card (min-width: 40rem) {
186
+ ._content-card__layout_1pa46_30 {
187
+ flex-direction: row;
188
+ }
189
+
190
+ ._content-card--media-end_1pa46_186 ._content-card__layout_1pa46_30 {
191
+ flex-direction: row-reverse;
192
+ }
193
+
194
+ ._content-card__media_1pa46_39 {
195
+ align-self: stretch;
196
+ /* Non-shrinking basis so mediaWidth is honoured even next to long content. */
197
+ flex: 0 0 33.3333%;
198
+ aspect-ratio: auto;
199
+ }
200
+
201
+ ._content-card--media-half_1pa46_197 ._content-card__media_1pa46_39 {
202
+ flex-basis: 50%;
203
+ }
204
+
205
+ /* Content is vertically centered against the media in the horizontal layout. */
206
+ ._content-card__content_1pa46_85 {
207
+ align-self: center;
208
+ }
209
+
210
+ ._content-card__actions_1pa46_150 {
211
+ margin-top: 0;
212
+ }
213
+
214
+ /* Minimum media height follows a 4:3 shape of its own width. */
215
+ ._content-card__media--image_1pa46_44::before {
216
+ content: '';
217
+ display: block;
218
+ padding-top: 75%;
219
+ }
220
+
221
+ /* Horizontal paddings override the vertical ones, still stepping by content width. */
222
+ ._content-card__content-inner_1pa46_95 {
223
+ padding: var(--spacing-space-32) var(--spacing-space-20);
224
+ }
225
+
226
+ @container content-card-content (min-width: 24rem) {
227
+ ._content-card__content-inner_1pa46_95 {
228
+ padding: var(--spacing-space-40);
229
+ }
230
+ }
231
+
232
+ @container content-card-content (min-width: 36rem) {
233
+ ._content-card__content-inner_1pa46_95 {
234
+ padding: var(--spacing-space-48) var(--spacing-space-64);
235
+ }
236
+ }
237
+ }
238
+
239
+ /* ─── Forced colors ─── */
240
+
241
+ @media (forced-colors: active) {
242
+ ._content-card_1pa46_10 {
243
+ border: var(--borderwidth-semantic-xs) solid CanvasText;
244
+ }
245
+
246
+ ._content-card--elevated_1pa46_242 {
247
+ box-shadow: none;
248
+ }
249
+ } }
@@ -0,0 +1,3 @@
1
+ import { ContentCardProps } from './ContentCard.types';
2
+ export declare const ContentCard: ({ media, mediaKind, mediaBackground, mediaWidth, mediaPosition, titlePrefix, title, headingLevel, body, actions, appearance, as, className, ref, ...props }: ContentCardProps) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=ContentCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCard.d.ts","sourceRoot":"","sources":["../../../src/components/ContentCard/ContentCard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkBvF,eAAO,MAAM,WAAW,GAAI,6JAgBzB,gBAAgB,4CA+ElB,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import elevationStyles from "../../styles/utils/elevation.module.css.js";
4
+ import styles from "./ContentCard.module.css.js";
5
+ import { cn } from "../../utils/cn/cn.js";
6
+ const logoBackgroundToken = {
7
+ white: "var(--color-semantic-surface-base)",
8
+ "sand-soft": "var(--color-semantic-surface-neutral-soft)",
9
+ "sand-mid": "var(--color-semantic-surface-neutral-mid)",
10
+ "sand-strong": "var(--color-semantic-surface-neutral-strong)",
11
+ "pink-soft": "var(--color-semantic-surface-primary-soft)",
12
+ "pink-mid": "var(--color-semantic-surface-primary-mid)",
13
+ "pink-strong": "var(--color-semantic-surface-primary-strong)",
14
+ "plum-soft": "var(--color-semantic-surface-secondary-soft)",
15
+ "plum-mid": "var(--color-semantic-surface-secondary-mid)",
16
+ "plum-strong": "var(--color-semantic-surface-secondary-strong)"
17
+ };
18
+ const isRenderable = (node) => node != null && typeof node !== "boolean";
19
+ const ContentCard = ({
20
+ media,
21
+ mediaKind = "image",
22
+ mediaBackground,
23
+ mediaWidth = "1/3",
24
+ mediaPosition = "start",
25
+ titlePrefix,
26
+ title,
27
+ headingLevel = "h3",
28
+ body,
29
+ actions,
30
+ appearance = "plain",
31
+ as = "article",
32
+ className,
33
+ ref,
34
+ ...props
35
+ }) => {
36
+ const titleId = useId();
37
+ const HeadingLevel = headingLevel;
38
+ const Root = as;
39
+ const hasMedia = isRenderable(media);
40
+ const ariaLabel = props["aria-label"];
41
+ const ariaLabelledBy = props["aria-labelledby"] ?? (ariaLabel || as === "div" ? void 0 : titleId);
42
+ return /* @__PURE__ */ jsx(
43
+ Root,
44
+ {
45
+ ref,
46
+ ...props,
47
+ className: cn(
48
+ styles["content-card"],
49
+ hasMedia && mediaWidth === "1/2" && styles["content-card--media-half"],
50
+ hasMedia && mediaPosition === "end" && styles["content-card--media-end"],
51
+ appearance === "border" && styles["content-card--border"],
52
+ appearance === "elevated" && styles["content-card--elevated"],
53
+ appearance === "elevated" && elevationStyles.elevationLow,
54
+ className
55
+ ),
56
+ "aria-label": ariaLabel,
57
+ "aria-labelledby": ariaLabelledBy,
58
+ children: /* @__PURE__ */ jsxs("div", { className: styles["content-card__layout"], children: [
59
+ hasMedia && /* @__PURE__ */ jsx(
60
+ "div",
61
+ {
62
+ className: cn(
63
+ styles["content-card__media"],
64
+ mediaKind === "logo" ? styles["content-card__media--logo"] : styles["content-card__media--image"]
65
+ ),
66
+ style: mediaKind === "logo" && mediaBackground != null ? {
67
+ "--_cc-logo-bg": logoBackgroundToken[mediaBackground]
68
+ } : void 0,
69
+ children: /* @__PURE__ */ jsx("div", { className: styles["content-card__media-inner"], children: media })
70
+ }
71
+ ),
72
+ /* @__PURE__ */ jsx("div", { className: styles["content-card__content"], children: /* @__PURE__ */ jsxs("div", { className: styles["content-card__content-inner"], children: [
73
+ /* @__PURE__ */ jsxs("div", { className: styles["content-card__body-region"], children: [
74
+ /* @__PURE__ */ jsxs("div", { className: styles["content-card__header"], children: [
75
+ isRenderable(titlePrefix) && /* @__PURE__ */ jsx("div", { className: styles["content-card__prefix"], children: titlePrefix }),
76
+ /* @__PURE__ */ jsx(
77
+ HeadingLevel,
78
+ {
79
+ id: titleId,
80
+ className: styles["content-card__title"],
81
+ children: title
82
+ }
83
+ )
84
+ ] }),
85
+ isRenderable(body) && /* @__PURE__ */ jsx("div", { className: cn(styles["content-card__body"], "dds-prose"), children: body })
86
+ ] }),
87
+ isRenderable(actions) && /* @__PURE__ */ jsx("div", { className: styles["content-card__actions"], children: actions })
88
+ ] }) })
89
+ ] })
90
+ }
91
+ );
92
+ };
93
+ export {
94
+ ContentCard
95
+ };
96
+ //# sourceMappingURL=ContentCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCard.js","sources":["../../../src/components/ContentCard/ContentCard.tsx"],"sourcesContent":["import { useId } from 'react';\nimport type { CSSProperties, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport elevationStyles from '../../styles/utils/elevation.module.css';\nimport styles from './ContentCard.module.css';\nimport type { ContentCardLogoBackground, ContentCardProps } from './ContentCard.types';\n\nconst logoBackgroundToken: Record<ContentCardLogoBackground, string> = {\n white: 'var(--color-semantic-surface-base)',\n 'sand-soft': 'var(--color-semantic-surface-neutral-soft)',\n 'sand-mid': 'var(--color-semantic-surface-neutral-mid)',\n 'sand-strong': 'var(--color-semantic-surface-neutral-strong)',\n 'pink-soft': 'var(--color-semantic-surface-primary-soft)',\n 'pink-mid': 'var(--color-semantic-surface-primary-mid)',\n 'pink-strong': 'var(--color-semantic-surface-primary-strong)',\n 'plum-soft': 'var(--color-semantic-surface-secondary-soft)',\n 'plum-mid': 'var(--color-semantic-surface-secondary-mid)',\n 'plum-strong': 'var(--color-semantic-surface-secondary-strong)',\n};\n\n// A boolean ReactNode (e.g. from `condition && <X />`) renders nothing, so treat it as absent.\nconst isRenderable = (node: ReactNode): boolean => node != null && typeof node !== 'boolean';\n\nexport const ContentCard = ({\n media,\n mediaKind = 'image',\n mediaBackground,\n mediaWidth = '1/3',\n mediaPosition = 'start',\n titlePrefix,\n title,\n headingLevel = 'h3',\n body,\n actions,\n appearance = 'plain',\n as = 'article',\n className,\n ref,\n ...props\n}: ContentCardProps) => {\n const titleId = useId();\n const HeadingLevel = headingLevel;\n // Cast to ElementType so the constrained union of tags renders without ref/props conflicts.\n const Root = as as ElementType;\n const hasMedia = isRenderable(media);\n const ariaLabel = props['aria-label'];\n // Keep an explicit aria-labelledby; only the generated title fallback is suppressed for a\n // bare div or when an aria-label is provided.\n const ariaLabelledBy =\n props['aria-labelledby'] ?? (ariaLabel || as === 'div' ? undefined : titleId);\n\n return (\n <Root\n ref={ref}\n {...props}\n className={cn(\n styles['content-card'],\n hasMedia && mediaWidth === '1/2' && styles['content-card--media-half'],\n hasMedia && mediaPosition === 'end' && styles['content-card--media-end'],\n appearance === 'border' && styles['content-card--border'],\n appearance === 'elevated' && styles['content-card--elevated'],\n appearance === 'elevated' && elevationStyles.elevationLow,\n className,\n )}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <div className={styles['content-card__layout']}>\n {hasMedia && (\n <div\n className={cn(\n styles['content-card__media'],\n mediaKind === 'logo'\n ? styles['content-card__media--logo']\n : styles['content-card__media--image'],\n )}\n style={\n mediaKind === 'logo' && mediaBackground != null\n ? ({\n '--_cc-logo-bg': logoBackgroundToken[mediaBackground],\n } as CSSProperties)\n : undefined\n }\n >\n <div className={styles['content-card__media-inner']}>{media}</div>\n </div>\n )}\n\n <div className={styles['content-card__content']}>\n <div className={styles['content-card__content-inner']}>\n <div className={styles['content-card__body-region']}>\n <div className={styles['content-card__header']}>\n {isRenderable(titlePrefix) && (\n <div className={styles['content-card__prefix']}>\n {titlePrefix}\n </div>\n )}\n <HeadingLevel\n id={titleId}\n className={styles['content-card__title']}\n >\n {title}\n </HeadingLevel>\n </div>\n {isRenderable(body) && (\n <div className={cn(styles['content-card__body'], 'dds-prose')}>\n {body}\n </div>\n )}\n </div>\n {isRenderable(actions) && (\n <div className={styles['content-card__actions']}>{actions}</div>\n )}\n </div>\n </div>\n </div>\n </Root>\n );\n};\n"],"names":[],"mappings":";;;;;AAOA,MAAM,sBAAiE;AAAA,EACnE,OAAO;AAAA,EACP,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AACnB;AAGA,MAAM,eAAe,CAAC,SAA6B,QAAQ,QAAQ,OAAO,SAAS;AAE5E,MAAM,cAAc,CAAC;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,QAAM,UAAU,MAAA;AAChB,QAAM,eAAe;AAErB,QAAM,OAAO;AACb,QAAM,WAAW,aAAa,KAAK;AACnC,QAAM,YAAY,MAAM,YAAY;AAGpC,QAAM,iBACF,MAAM,iBAAiB,MAAM,aAAa,OAAO,QAAQ,SAAY;AAEzE,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACC,GAAG;AAAA,MACJ,WAAW;AAAA,QACP,OAAO,cAAc;AAAA,QACrB,YAAY,eAAe,SAAS,OAAO,0BAA0B;AAAA,QACrE,YAAY,kBAAkB,SAAS,OAAO,yBAAyB;AAAA,QACvE,eAAe,YAAY,OAAO,sBAAsB;AAAA,QACxD,eAAe,cAAc,OAAO,wBAAwB;AAAA,QAC5D,eAAe,cAAc,gBAAgB;AAAA,QAC7C;AAAA,MAAA;AAAA,MAEJ,cAAY;AAAA,MACZ,mBAAiB;AAAA,MAEjB,UAAA,qBAAC,OAAA,EAAI,WAAW,OAAO,sBAAsB,GACxC,UAAA;AAAA,QAAA,YACG;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW;AAAA,cACP,OAAO,qBAAqB;AAAA,cAC5B,cAAc,SACR,OAAO,2BAA2B,IAClC,OAAO,4BAA4B;AAAA,YAAA;AAAA,YAE7C,OACI,cAAc,UAAU,mBAAmB,OACpC;AAAA,cACG,iBAAiB,oBAAoB,eAAe;AAAA,YAAA,IAExD;AAAA,YAGV,8BAAC,OAAA,EAAI,WAAW,OAAO,2BAA2B,GAAI,UAAA,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAIpE,oBAAC,OAAA,EAAI,WAAW,OAAO,uBAAuB,GAC1C,UAAA,qBAAC,OAAA,EAAI,WAAW,OAAO,6BAA6B,GAChD,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAW,OAAO,2BAA2B,GAC9C,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAW,OAAO,sBAAsB,GACxC,UAAA;AAAA,cAAA,aAAa,WAAW,KACrB,oBAAC,OAAA,EAAI,WAAW,OAAO,sBAAsB,GACxC,UAAA,YAAA,CACL;AAAA,cAEJ;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,IAAI;AAAA,kBACJ,WAAW,OAAO,qBAAqB;AAAA,kBAEtC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL,GACJ;AAAA,YACC,aAAa,IAAI,KACd,oBAAC,OAAA,EAAI,WAAW,GAAG,OAAO,oBAAoB,GAAG,WAAW,GACvD,UAAA,KAAA,CACL;AAAA,UAAA,GAER;AAAA,UACC,aAAa,OAAO,KACjB,oBAAC,SAAI,WAAW,OAAO,uBAAuB,GAAI,UAAA,QAAA,CAAQ;AAAA,QAAA,EAAA,CAElE,EAAA,CACJ;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA;AAAA,EAAA;AAGZ;"}
@@ -0,0 +1,24 @@
1
+ require('./ContentCard.css');
2
+ "use strict";
3
+ const styles = {
4
+ "content-card": "_content-card_1pa46_10",
5
+ "content-card--border": "_content-card--border_1pa46_25",
6
+ "content-card__layout": "_content-card__layout_1pa46_30",
7
+ "content-card__media": "_content-card__media_1pa46_39",
8
+ "content-card__media--image": "_content-card__media--image_1pa46_44",
9
+ "content-card__media--logo": "_content-card__media--logo_1pa46_48",
10
+ "content-card__media-inner": "_content-card__media-inner_1pa46_54",
11
+ "content-card__content": "_content-card__content_1pa46_85",
12
+ "content-card__content-inner": "_content-card__content-inner_1pa46_95",
13
+ "content-card__body-region": "_content-card__body-region_1pa46_104",
14
+ "content-card__header": "_content-card__header_1pa46_110",
15
+ "content-card__prefix": "_content-card__prefix_1pa46_116",
16
+ "content-card__title": "_content-card__title_1pa46_120",
17
+ "content-card__body": "_content-card__body_1pa46_104",
18
+ "content-card__actions": "_content-card__actions_1pa46_150",
19
+ "content-card--media-end": "_content-card--media-end_1pa46_186",
20
+ "content-card--media-half": "_content-card--media-half_1pa46_197",
21
+ "content-card--elevated": "_content-card--elevated_1pa46_242"
22
+ };
23
+ module.exports = styles;
24
+ //# sourceMappingURL=ContentCard.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCard.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,25 @@
1
+ import './ContentCard.css';
2
+ const styles = {
3
+ "content-card": "_content-card_1pa46_10",
4
+ "content-card--border": "_content-card--border_1pa46_25",
5
+ "content-card__layout": "_content-card__layout_1pa46_30",
6
+ "content-card__media": "_content-card__media_1pa46_39",
7
+ "content-card__media--image": "_content-card__media--image_1pa46_44",
8
+ "content-card__media--logo": "_content-card__media--logo_1pa46_48",
9
+ "content-card__media-inner": "_content-card__media-inner_1pa46_54",
10
+ "content-card__content": "_content-card__content_1pa46_85",
11
+ "content-card__content-inner": "_content-card__content-inner_1pa46_95",
12
+ "content-card__body-region": "_content-card__body-region_1pa46_104",
13
+ "content-card__header": "_content-card__header_1pa46_110",
14
+ "content-card__prefix": "_content-card__prefix_1pa46_116",
15
+ "content-card__title": "_content-card__title_1pa46_120",
16
+ "content-card__body": "_content-card__body_1pa46_104",
17
+ "content-card__actions": "_content-card__actions_1pa46_150",
18
+ "content-card--media-end": "_content-card--media-end_1pa46_186",
19
+ "content-card--media-half": "_content-card--media-half_1pa46_197",
20
+ "content-card--elevated": "_content-card--elevated_1pa46_242"
21
+ };
22
+ export {
23
+ styles as default
24
+ };
25
+ //# sourceMappingURL=ContentCard.module.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentCard.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}