@arbor-education/design-system.components 0.13.1 → 0.14.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 (94) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/components/articleCard/ArticleCard.d.ts +30 -0
  3. package/dist/components/articleCard/ArticleCard.d.ts.map +1 -0
  4. package/dist/components/articleCard/ArticleCard.js +24 -0
  5. package/dist/components/articleCard/ArticleCard.js.map +1 -0
  6. package/dist/components/articleCard/ArticleCard.stories.d.ts +18 -0
  7. package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -0
  8. package/dist/components/articleCard/ArticleCard.stories.js +112 -0
  9. package/dist/components/articleCard/ArticleCard.stories.js.map +1 -0
  10. package/dist/components/articleCard/ArticleCard.test.d.ts +2 -0
  11. package/dist/components/articleCard/ArticleCard.test.d.ts.map +1 -0
  12. package/dist/components/articleCard/ArticleCard.test.js +49 -0
  13. package/dist/components/articleCard/ArticleCard.test.js.map +1 -0
  14. package/dist/components/card/Card.d.ts +41 -12
  15. package/dist/components/card/Card.d.ts.map +1 -1
  16. package/dist/components/card/Card.js +46 -17
  17. package/dist/components/card/Card.js.map +1 -1
  18. package/dist/components/card/Card.stories.d.ts +9 -84
  19. package/dist/components/card/Card.stories.d.ts.map +1 -1
  20. package/dist/components/card/Card.stories.js +15 -73
  21. package/dist/components/card/Card.stories.js.map +1 -1
  22. package/dist/components/card/Card.test.js +50 -152
  23. package/dist/components/card/Card.test.js.map +1 -1
  24. package/dist/components/formField/inputs/time/TimeInput.d.ts +1 -1
  25. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +1 -1
  26. package/dist/components/icoText/IcoText.d.ts +37 -0
  27. package/dist/components/icoText/IcoText.d.ts.map +1 -0
  28. package/dist/components/icoText/IcoText.js +29 -0
  29. package/dist/components/icoText/IcoText.js.map +1 -0
  30. package/dist/components/icoText/IcoText.stories.d.ts +34 -0
  31. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -0
  32. package/dist/components/icoText/IcoText.stories.js +24 -0
  33. package/dist/components/icoText/IcoText.stories.js.map +1 -0
  34. package/dist/components/icoText/IcoText.test.d.ts +2 -0
  35. package/dist/components/icoText/IcoText.test.d.ts.map +1 -0
  36. package/dist/components/icoText/IcoText.test.js +27 -0
  37. package/dist/components/icoText/IcoText.test.js.map +1 -0
  38. package/dist/components/kpiCard/KPICard.d.ts +13 -0
  39. package/dist/components/kpiCard/KPICard.d.ts.map +1 -0
  40. package/dist/components/kpiCard/KPICard.js +8 -0
  41. package/dist/components/kpiCard/KPICard.js.map +1 -0
  42. package/dist/components/kpiCard/KPICard.stories.d.ts +9 -0
  43. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -0
  44. package/dist/components/kpiCard/KPICard.stories.js +18 -0
  45. package/dist/components/kpiCard/KPICard.stories.js.map +1 -0
  46. package/dist/components/kpiCard/KPICard.test.d.ts +2 -0
  47. package/dist/components/kpiCard/KPICard.test.d.ts.map +1 -0
  48. package/dist/components/kpiCard/KPICard.test.js +37 -0
  49. package/dist/components/kpiCard/KPICard.test.js.map +1 -0
  50. package/dist/components/kvpList/KVPList.d.ts +34 -0
  51. package/dist/components/kvpList/KVPList.d.ts.map +1 -0
  52. package/dist/components/kvpList/KVPList.js +20 -0
  53. package/dist/components/kvpList/KVPList.js.map +1 -0
  54. package/dist/components/kvpList/KVPList.stories.d.ts +27 -0
  55. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -0
  56. package/dist/components/kvpList/KVPList.stories.js +18 -0
  57. package/dist/components/kvpList/KVPList.stories.js.map +1 -0
  58. package/dist/components/kvpList/KVPList.test.d.ts +2 -0
  59. package/dist/components/kvpList/KVPList.test.d.ts.map +1 -0
  60. package/dist/components/kvpList/KVPList.test.js +29 -0
  61. package/dist/components/kvpList/KVPList.test.js.map +1 -0
  62. package/dist/components/singleUser/SingleUser.d.ts +1 -1
  63. package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
  64. package/dist/index.css +186 -22
  65. package/dist/index.css.map +1 -1
  66. package/dist/index.d.ts +13 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +12 -3
  69. package/dist/index.js.map +1 -1
  70. package/package.json +1 -1
  71. package/src/components/articleCard/ArticleCard.stories.tsx +132 -0
  72. package/src/components/articleCard/ArticleCard.test.tsx +121 -0
  73. package/src/components/articleCard/ArticleCard.tsx +100 -0
  74. package/src/components/articleCard/articleCard.scss +39 -0
  75. package/src/components/card/Card.stories.tsx +35 -79
  76. package/src/components/card/Card.test.tsx +72 -190
  77. package/src/components/card/Card.tsx +117 -58
  78. package/src/components/card/card.scss +18 -31
  79. package/src/components/icoText/IcoText.stories.tsx +47 -0
  80. package/src/components/icoText/IcoText.test.tsx +41 -0
  81. package/src/components/icoText/IcoText.tsx +93 -0
  82. package/src/components/icoText/icoText.scss +34 -0
  83. package/src/components/kpiCard/KPICard.stories.tsx +47 -0
  84. package/src/components/kpiCard/KPICard.test.tsx +60 -0
  85. package/src/components/kpiCard/KPICard.tsx +45 -0
  86. package/src/components/kpiCard/kpiCard.scss +35 -0
  87. package/src/components/kvpList/KVPList.stories.tsx +51 -0
  88. package/src/components/kvpList/KVPList.test.tsx +66 -0
  89. package/src/components/kvpList/KVPList.tsx +109 -0
  90. package/src/components/kvpList/kvpList.scss +64 -0
  91. package/src/index.scss +4 -0
  92. package/src/index.ts +13 -4
  93. package/src/tokens.scss +6 -0
  94. package/tokens/json/Arbor.json +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KPICard.js","sourceRoot":"","sources":["../../../src/components/kpiCard/KPICard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAarE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAqB,EAAE;IAChE,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,KAAK,EACL,YAAY,GAAG,KAAK,EACpB,QAAQ,GAAG,KAAK,GACjB,GAAG,KAAK,CAAC;IAEV,MAAM,OAAO,GAAG,CACd,eAAK,SAAS,EAAC,aAAa,aAC1B,YAAG,SAAS,EAAC,oBAAoB,YAAE,KAAK,GAAK,EAC7C,aAAG,SAAS,EAAC,oBAAoB,aAC9B,KAAK,EACL,YAAY,IAAI,eAAM,SAAS,EAAC,qBAAqB,kBAAS,IAC7D,EACH,QAAQ,IACL,CACP,CAAC;IAEF,OAAO,CACL,KAAC,IAAI,OACC,uBAAuB,CAAC,KAAK,CAAC,EAClC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAC,OAAO,YAEd,OAAO,GACH,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ declare const meta: {
3
+ title: string;
4
+ component: (props: import("./KPICard").KPICardProps) => React.JSX.Element;
5
+ };
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const Default: Story;
8
+ export default meta;
9
+ //# sourceMappingURL=KPICard.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KPICard.stories.d.ts","sourceRoot":"","sources":["../../../src/components/kpiCard/KPICard.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,QAAA,MAAM,IAAI;;;CAGsB,CAAC;AAEjC,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgCrB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { KVPList } from '../kvpList/KVPList';
3
+ import { Progress } from '../progress/Progress';
4
+ import { KPICard } from './KPICard';
5
+ const meta = {
6
+ title: 'Components/Card/KPICard',
7
+ component: KPICard,
8
+ };
9
+ export const Default = {
10
+ args: {
11
+ label: 'KPI label text',
12
+ value: 'XX.X',
13
+ isPercentage: true,
14
+ },
15
+ render: args => (_jsxs(KPICard, { ...args, children: [_jsx(KVPList, { "aria-label": "Summary values", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Bar label text" }), _jsx(KVPList.Definition, { prominence: "strong", children: "XX.X" })] }) }), _jsxs(KVPList, { "aria-label": "Progress values", children: [_jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Bar label text" }), _jsx(KVPList.Definition, { prominence: "neutral", children: "X" }), _jsx(KVPList.Definition, { "aria-hidden": "true", isRow: true, children: _jsx(Progress, { "aria-label": "Progress bar first", max: 100, value: 95 }) })] }), _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Bar label text" }), _jsx(KVPList.Definition, { prominence: "neutral", children: "X" }), _jsx(KVPList.Definition, { "aria-hidden": "true", isRow: true, children: _jsx(Progress, { "aria-label": "Progress bar second", max: 100, value: 95 }) })] })] })] })),
16
+ };
17
+ export default meta;
18
+ //# sourceMappingURL=KPICard.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KPICard.stories.js","sourceRoot":"","sources":["../../../src/components/kpiCard/KPICard.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,OAAO;CACY,CAAC;AAIjC,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;KACnB;IACD,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CACd,MAAC,OAAO,OAAK,IAAI,aACf,KAAC,OAAO,kBAAY,gBAAgB,YAClC,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,iCAA8B,EAC3C,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,QAAQ,qBAA0B,IACrD,GACN,EACV,MAAC,OAAO,kBAAY,iBAAiB,aACnC,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,iCAA8B,EAC3C,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,SAAS,kBAAuB,EAC/D,KAAC,OAAO,CAAC,UAAU,mBAAa,MAAM,EAAC,KAAK,kBAC1C,KAAC,QAAQ,kBAAY,oBAAoB,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAI,GAC9C,IACT,EACd,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,iCAA8B,EAC3C,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,SAAS,kBAAuB,EAC/D,KAAC,OAAO,CAAC,UAAU,mBAAa,MAAM,EAAC,KAAK,kBAC1C,KAAC,QAAQ,kBAAY,qBAAqB,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAI,GAC/C,IACT,IACN,IACF,CACX;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=KPICard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KPICard.test.d.ts","sourceRoot":"","sources":["../../../src/components/kpiCard/KPICard.test.tsx"],"names":[],"mappings":"AACA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/vitest';
4
+ import { describe, expect, test, vi } from 'vitest';
5
+ import { KPICard } from './KPICard';
6
+ import { KVPList } from '../kvpList/KVPList';
7
+ describe('KPICard', () => {
8
+ test('renders header content and kvp rows', () => {
9
+ render(_jsx(KPICard, { isPercentage: true, label: "Attendance", value: "95.4", children: _jsx(KVPList, { "aria-label": "Breakdown", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Summary" }), _jsx(KVPList.Definition, { prominence: "strong", children: "95.4" })] }) }) }));
10
+ expect(screen.getByText('Attendance')).toBeInTheDocument();
11
+ expect(screen.getAllByText('95.4')).toHaveLength(2);
12
+ expect(screen.getByText('%')).toBeInTheDocument();
13
+ });
14
+ test('does not render a percentage suffix when isPercentage is false', () => {
15
+ render(_jsx(KPICard, { label: "Attendance", value: "95.4" }));
16
+ expect(screen.queryByText('%')).not.toBeInTheDocument();
17
+ });
18
+ test('uses the shared card shell for click interaction', () => {
19
+ const handleClick = vi.fn();
20
+ render(_jsx(KPICard, { "aria-label": "Attendance KPI card", label: "Attendance", onClick: handleClick, value: "95.4" }));
21
+ fireEvent.click(screen.getByRole('button', { name: 'Attendance KPI card' }));
22
+ expect(handleClick).toHaveBeenCalledTimes(1);
23
+ });
24
+ test('supports keyboard activation through the shared card shell', () => {
25
+ const handleClick = vi.fn();
26
+ render(_jsx(KPICard, { "aria-label": "Attendance KPI card", label: "Attendance", onClick: handleClick, value: "95.4" }));
27
+ fireEvent.keyDown(screen.getByRole('button', { name: 'Attendance KPI card' }), { key: 'Enter' });
28
+ expect(handleClick).toHaveBeenCalledTimes(1);
29
+ });
30
+ test('does not invoke click handlers when disabled', () => {
31
+ const handleClick = vi.fn();
32
+ render(_jsx(KPICard, { "aria-label": "Attendance KPI card", disabled: true, label: "Attendance", onClick: handleClick, value: "95.4" }));
33
+ fireEvent.click(screen.getByRole('button', { name: 'Attendance KPI card' }));
34
+ expect(handleClick).not.toHaveBeenCalled();
35
+ });
36
+ });
37
+ //# sourceMappingURL=KPICard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KPICard.test.js","sourceRoot":"","sources":["../../../src/components/kpiCard/KPICard.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type KVPListProps = React.HTMLAttributes<HTMLDivElement> & {
2
+ children?: React.ReactNode;
3
+ };
4
+ export type KVPListRowProps = React.HTMLAttributes<HTMLDListElement> & {
5
+ children?: React.ReactNode;
6
+ orientation?: 'horizontal' | 'vertical';
7
+ };
8
+ export type KVPListTermProps = React.HTMLAttributes<HTMLElement> & {
9
+ children?: React.ReactNode;
10
+ };
11
+ export type KVPListDefinitionProps = React.HTMLAttributes<HTMLElement> & {
12
+ children?: React.ReactNode;
13
+ isRow?: boolean;
14
+ isPercentage?: boolean;
15
+ prominence?: 'neutral' | 'strong';
16
+ };
17
+ export declare const KVPList: {
18
+ ({ children, className, role, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...rest }: KVPListProps): React.JSX.Element;
19
+ displayName: string;
20
+ } & {
21
+ Row: {
22
+ ({ children, className, orientation, ...rest }: KVPListRowProps): React.JSX.Element;
23
+ displayName: string;
24
+ };
25
+ Term: {
26
+ ({ children, className, ...rest }: KVPListTermProps): React.JSX.Element;
27
+ displayName: string;
28
+ };
29
+ Definition: {
30
+ ({ children, className, isRow, isPercentage, prominence, ...rest }: KVPListDefinitionProps): React.JSX.Element;
31
+ displayName: string;
32
+ };
33
+ };
34
+ //# sourceMappingURL=KVPList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.d.ts","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAChE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,GAAG;IACrE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG;IACjE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG;IACvE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CACnC,CAAC;AAoFF,eAAO,MAAM,OAAO;yGA3EjB,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;;;wDAiBhC,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;;;2CAiBnC,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;;;4EAapC,sBAAsB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;;CAgC3C,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ const KVPListRoot = ({ children, className, role, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rest }) => (_jsx("div", { className: classNames('ds-kvp-list', className), role: role ?? (ariaLabel || ariaLabelledBy ? 'group' : undefined), "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...rest, children: children }));
4
+ const KVPListRow = ({ children, className, orientation = 'vertical', ...rest }) => (_jsx("dl", { className: classNames('ds-kvp-list__row', `ds-kvp-list__row--${orientation}`, className), ...rest, children: children }));
5
+ const KVPListTerm = ({ children, className, ...rest }) => (_jsx("dt", { className: classNames('ds-kvp-list__term', className), ...rest, children: children }));
6
+ const KVPListDefinition = ({ children, className, isRow = false, isPercentage = false, prominence = 'neutral', ...rest }) => (_jsxs("dd", { className: classNames('ds-kvp-list__description', `ds-kvp-list__description--${prominence}`, {
7
+ 'ds-kvp-list__description--row': isRow,
8
+ }, className), ...rest, children: [children, isPercentage
9
+ ? (_jsx("span", { className: "ds-kvp-list__suffix", children: "%" }))
10
+ : null] }));
11
+ KVPListRoot.displayName = 'KVPList';
12
+ KVPListRow.displayName = 'KVPList.Row';
13
+ KVPListTerm.displayName = 'KVPList.Term';
14
+ KVPListDefinition.displayName = 'KVPList.Definition';
15
+ export const KVPList = Object.assign(KVPListRoot, {
16
+ Row: KVPListRow,
17
+ Term: KVPListTerm,
18
+ Definition: KVPListDefinition,
19
+ });
20
+ //# sourceMappingURL=KVPList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.js","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAsBpC,MAAM,WAAW,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,IAAI,EACM,EAAqB,EAAE,CAAC,CACrC,cACE,SAAS,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,EAC/C,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,gBACrD,SAAS,qBACJ,cAAc,KAC3B,IAAI,YAEP,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,GAAG,UAAU,EACxB,GAAG,IAAI,EACS,EAAqB,EAAE,CAAC,CACxC,aACE,SAAS,EAAE,UAAU,CACnB,kBAAkB,EAClB,qBAAqB,WAAW,EAAE,EAClC,SAAS,CACV,KACG,IAAI,YAEP,QAAQ,GACN,CACN,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACU,EAAqB,EAAE,CAAC,CACzC,aAAI,SAAS,EAAE,UAAU,CAAC,mBAAmB,EAAE,SAAS,CAAC,KAAM,IAAI,YAChE,QAAQ,GACN,CACN,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,EACzB,QAAQ,EACR,SAAS,EACT,KAAK,GAAG,KAAK,EACb,YAAY,GAAG,KAAK,EACpB,UAAU,GAAG,SAAS,EACtB,GAAG,IAAI,EACgB,EAAqB,EAAE,CAAC,CAC/C,cACE,SAAS,EAAE,UAAU,CACnB,0BAA0B,EAC1B,6BAA6B,UAAU,EAAE,EACzC;QACE,+BAA+B,EAAE,KAAK;KACvC,EACD,SAAS,CACV,KACG,IAAI,aAEP,QAAQ,EACR,YAAY;YACX,CAAC,CAAC,CACE,eAAM,SAAS,EAAC,qBAAqB,kBAE9B,CACR;YACH,CAAC,CAAC,IAAI,IACL,CACN,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC;AACpC,UAAU,CAAC,WAAW,GAAG,aAAa,CAAC;AACvC,WAAW,CAAC,WAAW,GAAG,cAAc,CAAC;AACzC,iBAAiB,CAAC,WAAW,GAAG,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,iBAAiB;CAC9B,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ declare const meta: {
3
+ title: string;
4
+ component: {
5
+ ({ children, className, role, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...rest }: import("./KVPList").KVPListProps): React.JSX.Element;
6
+ displayName: string;
7
+ } & {
8
+ Row: {
9
+ ({ children, className, orientation, ...rest }: import("./KVPList").KVPListRowProps): React.JSX.Element;
10
+ displayName: string;
11
+ };
12
+ Term: {
13
+ ({ children, className, ...rest }: import("./KVPList").KVPListTermProps): React.JSX.Element;
14
+ displayName: string;
15
+ };
16
+ Definition: {
17
+ ({ children, className, isRow, isPercentage, prominence, ...rest }: import("./KVPList").KVPListDefinitionProps): React.JSX.Element;
18
+ displayName: string;
19
+ };
20
+ };
21
+ };
22
+ type Story = StoryObj<typeof meta>;
23
+ export declare const Summary: Story;
24
+ export declare const WithProgressAndPercentage: Story;
25
+ export declare const WithProgressNoPercentage: Story;
26
+ export default meta;
27
+ //# sourceMappingURL=KVPList.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.stories.d.ts","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAI5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;CAGsB,CAAC;AAEjC,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAYvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAYtC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Progress } from '../progress/Progress';
3
+ import { KVPList } from './KVPList';
4
+ const meta = {
5
+ title: 'Components/KVPList',
6
+ component: KVPList,
7
+ };
8
+ export const Summary = {
9
+ render: args => (_jsx(KVPList, { ...args, "aria-label": "Attendance metrics", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Attendance" }), _jsx(KVPList.Definition, { isPercentage: true, prominence: "strong", children: "95" })] }) })),
10
+ };
11
+ export const WithProgressAndPercentage = {
12
+ render: args => (_jsx(KVPList, { ...args, "aria-label": "Attendance breakdown", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Bar label text" }), _jsx(KVPList.Definition, { isPercentage: true, prominence: "neutral", children: "95" }), _jsx(KVPList.Definition, { "aria-hidden": "true", isRow: true, children: _jsx(Progress, { "aria-label": "Attendance progress", max: 100, value: 95 }) })] }) })),
13
+ };
14
+ export const WithProgressNoPercentage = {
15
+ render: args => (_jsx(KVPList, { ...args, "aria-label": "Attendance breakdown without percentage", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Bar label text" }), _jsx(KVPList.Definition, { prominence: "neutral", children: "X" }), _jsx(KVPList.Definition, { "aria-hidden": "true", isRow: true, children: _jsx(Progress, { "aria-label": "Attendance progress second", max: 100, value: 95 }) })] }) })),
16
+ };
17
+ export default meta;
18
+ //# sourceMappingURL=KVPList.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.stories.js","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,oBAAoB;IAC3B,SAAS,EAAE,OAAO;CACY,CAAC;AAIjC,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CACd,KAAC,OAAO,OAAK,IAAI,gBAAa,oBAAoB,YAChD,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,6BAA0B,EACvC,KAAC,OAAO,CAAC,UAAU,IAAC,YAAY,QAAC,UAAU,EAAC,QAAQ,mBAAwB,IAChE,GACN,CACX;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAU;IAC9C,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CACd,KAAC,OAAO,OAAK,IAAI,gBAAa,sBAAsB,YAClD,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,iCAA8B,EAC3C,KAAC,OAAO,CAAC,UAAU,IAAC,YAAY,QAAC,UAAU,EAAC,SAAS,mBAAwB,EAC7E,KAAC,OAAO,CAAC,UAAU,mBAAa,MAAM,EAAC,KAAK,kBAC1C,KAAC,QAAQ,kBAAY,qBAAqB,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAI,GAC/C,IACT,GACN,CACX;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAU;IAC7C,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CACd,KAAC,OAAO,OAAK,IAAI,gBAAa,yCAAyC,YACrE,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,iCAA8B,EAC3C,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,SAAS,kBAAuB,EAC/D,KAAC,OAAO,CAAC,UAAU,mBAAa,MAAM,EAAC,KAAK,kBAC1C,KAAC,QAAQ,kBAAY,4BAA4B,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAI,GACtD,IACT,GACN,CACX;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=KVPList.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.test.d.ts","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.test.tsx"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import '@testing-library/jest-dom/vitest';
3
+ import { render, screen } from '@testing-library/react';
4
+ import { describe, expect, test } from 'vitest';
5
+ import { KVPList } from './KVPList';
6
+ describe('KVPList', () => {
7
+ test('renders term and definition semantics', () => {
8
+ render(_jsx(KVPList, { "aria-label": "Attendance metrics", children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Attendance" }), _jsx(KVPList.Definition, { prominence: "strong", children: "95" })] }) }));
9
+ expect(screen.getByText('Attendance').tagName).toBe('DT');
10
+ expect(screen.getByText('95').tagName).toBe('DD');
11
+ expect(screen.getByRole('group', { name: 'Attendance metrics' })).toBeInTheDocument();
12
+ });
13
+ test('renders a typed percentage suffix', () => {
14
+ render(_jsx(KVPList, { children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Attendance" }), _jsx(KVPList.Definition, { isPercentage: true, prominence: "neutral", children: "95" })] }) }));
15
+ const percentageDefinition = screen.getByText('95').closest('dd');
16
+ expect(screen.getByText('%')).toBeInTheDocument();
17
+ expect(percentageDefinition).toHaveTextContent('95%');
18
+ });
19
+ test('supports horizontal rows and row-spanning definitions', () => {
20
+ const { container } = render(_jsx(KVPList, { children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Progress" }), _jsx(KVPList.Definition, { isRow: true, children: "Full width content" })] }) }));
21
+ expect(container.querySelector('.ds-kvp-list__row--horizontal')).toBeInTheDocument();
22
+ expect(container.querySelector('.ds-kvp-list__description--row')).toBeInTheDocument();
23
+ });
24
+ test('does not add group semantics when no accessible label is provided', () => {
25
+ render(_jsx(KVPList, { children: _jsxs(KVPList.Row, { orientation: "horizontal", children: [_jsx(KVPList.Term, { children: "Attendance" }), _jsx(KVPList.Definition, { prominence: "strong", children: "95" })] }) }));
26
+ expect(screen.queryByRole('group')).not.toBeInTheDocument();
27
+ });
28
+ });
29
+ //# sourceMappingURL=KVPList.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVPList.test.js","sourceRoot":"","sources":["../../../src/components/kvpList/KVPList.test.tsx"],"names":[],"mappings":";AAAA,OAAO,kCAAkC,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CACJ,KAAC,OAAO,kBAAY,oBAAoB,YACtC,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,6BAA0B,EACvC,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,QAAQ,mBAAwB,IACnD,GACN,CACX,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,CACJ,KAAC,OAAO,cACN,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,6BAA0B,EACvC,KAAC,OAAO,CAAC,UAAU,IAAC,YAAY,QAAC,UAAU,EAAC,SAAS,mBAEhC,IACT,GACN,CACX,CAAC;QAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAClD,MAAM,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,OAAO,cACN,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,2BAAwB,EACrC,KAAC,OAAO,CAAC,UAAU,IAAC,KAAK,yCAAwC,IACrD,GACN,CACX,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACrF,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC7E,MAAM,CACJ,KAAC,OAAO,cACN,MAAC,OAAO,CAAC,GAAG,IAAC,WAAW,EAAC,YAAY,aACnC,KAAC,OAAO,CAAC,IAAI,6BAA0B,EACvC,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAC,QAAQ,mBAAwB,IACnD,GACN,CACX,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -11,7 +11,7 @@ export declare const SingleUser: React.ForwardRefExoticComponent<{
11
11
  className?: string;
12
12
  avatarClassName?: string;
13
13
  size?: AvatarSize;
14
- } & Omit<AvatarProps, "size" | "alt" | "className"> & React.RefAttributes<HTMLSpanElement>>;
14
+ } & Omit<AvatarProps, "size" | "className" | "alt"> & React.RefAttributes<HTMLSpanElement>>;
15
15
  export declare namespace SingleUser {
16
16
  type Props = SingleUserProps;
17
17
  }
@@ -25,7 +25,7 @@ declare const meta: {
25
25
  autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
26
26
  autoFocus?: boolean | undefined | undefined;
27
27
  className?: string | undefined | undefined;
28
- contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
28
+ contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
29
29
  contextMenu?: string | undefined | undefined;
30
30
  dir?: string | undefined | undefined;
31
31
  draggable?: (boolean | "true" | "false") | undefined;
@@ -310,7 +310,7 @@ declare const meta: {
310
310
  autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
311
311
  autoFocus?: boolean | undefined | undefined;
312
312
  className?: string | undefined | undefined;
313
- contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
313
+ contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
314
314
  contextMenu?: string | undefined | undefined;
315
315
  dir?: string | undefined | undefined;
316
316
  draggable?: (boolean | "true" | "false") | undefined;
package/dist/index.css CHANGED
@@ -630,6 +630,12 @@
630
630
  --kpi-spacing-vertical: var(--spacing-large);
631
631
  --kpi-color-benchmark-text: var(--color-grey-500);
632
632
  --kpi-color-benchmark-text-bg: var(--color-grey-100);
633
+ --kvp-list-color-text-subtle: var(--color-grey-800);
634
+ --kvp-list-color-text-strong: var(--color-mono-black);
635
+ --ico-text-spacing-gap-horizontal: var(--spacing-large);
636
+ --ico-text-spacing-gap-vertical: var(--spacing-medium);
637
+ --kpi-card-color-text-label: var(--color-grey-800);
638
+ --kpi-card-color-text-value: var(--color-mono-black);
633
639
  --tag-radius: var(--border-radius-round);
634
640
  --tag-neutral-color-text: var(--color-grey-900);
635
641
  --tag-neutral-color-background: var(--color-grey-050);
@@ -2039,6 +2045,41 @@
2039
2045
  vertical-align: middle;
2040
2046
  }
2041
2047
 
2048
+ .ds-ico-text {
2049
+ display: flex;
2050
+ align-items: flex-start;
2051
+ gap: var(--ico-text-spacing-gap-horizontal);
2052
+ width: 100%;
2053
+ }
2054
+
2055
+ .ds-ico-text__icon {
2056
+ flex-shrink: 0;
2057
+ }
2058
+
2059
+ .ds-ico-text__content {
2060
+ display: flex;
2061
+ flex: 1 1 auto;
2062
+ min-width: 0;
2063
+ flex-direction: column;
2064
+ gap: var(--ico-text-spacing-gap-vertical);
2065
+ }
2066
+
2067
+ .ds-ico-text__heading {
2068
+ margin: 0;
2069
+ font-family: var(--type-headings-h4-family);
2070
+ font-size: var(--type-headings-h4-size);
2071
+ font-weight: var(--type-headings-h4-weight);
2072
+ line-height: var(--type-headings-h4-line-height);
2073
+ }
2074
+
2075
+ .ds-ico-text__paragraph {
2076
+ margin: 0;
2077
+ font-family: var(--type-body-p-family);
2078
+ font-size: var(--type-body-p-size);
2079
+ font-weight: var(--type-body-p-weight);
2080
+ line-height: var(--type-body-line-height);
2081
+ }
2082
+
2042
2083
  .ds-heading {
2043
2084
  padding: var(--page-heading-spacing-gap);
2044
2085
  color: var(--page-heading-color-text);
@@ -2084,9 +2125,17 @@ h4.ds-heading, h4.ds-heading .ds-heading__inner-container, h4 .ds-editable-text_
2084
2125
  line-height: var(--type-headings-h4-line-height);
2085
2126
  }
2086
2127
 
2128
+ .ds-card__icon-click {
2129
+ flex-shrink: 0;
2130
+ }
2131
+ .ds-card__icon-click.ds-icon-arrow-right {
2132
+ display: none;
2133
+ }
2134
+
2087
2135
  .ds-card__container {
2088
2136
  display: flex;
2089
2137
  width: 100%;
2138
+ margin: 0;
2090
2139
  padding: var(--card-spacing-vertical) var(--card-spacing-horizontal);
2091
2140
  flex-direction: column;
2092
2141
  align-items: flex-start;
@@ -2098,16 +2147,10 @@ h4.ds-heading, h4.ds-heading .ds-heading__inner-container, h4 .ds-editable-text_
2098
2147
  line-height: var(--line-height-default);
2099
2148
  box-sizing: border-box;
2100
2149
  }
2101
- .ds-card__container .ds-card__icon-click {
2102
- flex-shrink: 0;
2103
- }
2104
- .ds-card__container .ds-card__icon-click.ds-icon-arrow-right {
2105
- display: none;
2106
- }
2107
2150
  .ds-card__container:hover:not(.ds-card__container--disabled) {
2108
2151
  border: var(--border-weight) solid var(--card-hover-color-border);
2109
2152
  background: var(--card-hover-color-background);
2110
- box-shadow: 0 4px 12px 0 rgba(32, 32, 32, 0.08);
2153
+ box-shadow: var(--shadow-small);
2111
2154
  }
2112
2155
  .ds-card__container:hover:not(.ds-card__container--disabled) .ds-card__icon-click.ds-icon-chevron-right {
2113
2156
  display: none;
@@ -2123,6 +2166,9 @@ h4.ds-heading, h4.ds-heading .ds-heading__inner-container, h4 .ds-editable-text_
2123
2166
  .ds-card__container--clickable {
2124
2167
  cursor: pointer;
2125
2168
  }
2169
+ .ds-card__container--dense {
2170
+ padding: var(--spacing-small);
2171
+ }
2126
2172
 
2127
2173
  .ds-card__content {
2128
2174
  display: flex;
@@ -2131,24 +2177,45 @@ h4.ds-heading, h4.ds-heading .ds-heading__inner-container, h4 .ds-editable-text_
2131
2177
  gap: var(--card-spacing-gap-horizontal);
2132
2178
  width: 100%;
2133
2179
  }
2134
- .ds-card__content .ds-card__icon-left {
2135
- flex-shrink: 0;
2180
+
2181
+ .ds-card__body {
2182
+ flex: 1 1 auto;
2183
+ min-width: 0;
2136
2184
  }
2137
- .ds-card__content .ds-card__text {
2138
- display: flex;
2139
- flex-direction: column;
2140
- justify-content: space-between;
2141
- gap: var(--card-spacing-gap-vertical);
2142
- flex-grow: 1;
2185
+
2186
+ .ds-card__container--article-link {
2187
+ position: relative;
2143
2188
  }
2144
- .ds-card__content .ds-card__text .ds-card__title {
2145
- margin: 0;
2146
- font-family: var(--type-headings-h4-family);
2147
- font-size: var(--type-headings-h4-size);
2148
- font-weight: var(--type-headings-h4-weight);
2189
+ .ds-card__container--article-link:not(.ds-card__container--disabled) {
2190
+ cursor: pointer;
2149
2191
  }
2150
- .ds-card__content .ds-card__text .ds-card__paragraph {
2151
- margin: 0;
2192
+ .ds-card__container--article-link:focus-within:not(.ds-card__container--disabled) {
2193
+ border: var(--border-weight) solid var(--card-focus-color-border);
2194
+ background: var(--card-focus-color-background);
2195
+ outline: var(--focus-border) solid var(--card-focus-focus);
2196
+ }
2197
+
2198
+ .ds-article-card {
2199
+ width: 100%;
2200
+ }
2201
+
2202
+ .ds-article-card__primary-link {
2203
+ color: inherit;
2204
+ text-decoration: none;
2205
+ }
2206
+ .ds-article-card__primary-link::after {
2207
+ content: "";
2208
+ position: absolute;
2209
+ inset: 0;
2210
+ z-index: 1;
2211
+ }
2212
+ .ds-article-card__primary-link:hover, .ds-article-card__primary-link:focus-visible {
2213
+ text-decoration: underline;
2214
+ }
2215
+
2216
+ .ds-article-card a:not(.ds-article-card__primary-link) {
2217
+ position: relative;
2218
+ z-index: 2;
2152
2219
  }
2153
2220
 
2154
2221
  .ds-dropdown__content {
@@ -3462,6 +3529,103 @@ h4.ds-heading, h4.ds-heading .ds-heading__inner-container, h4 .ds-editable-text_
3462
3529
  border-radius: var(--border-radius-large);
3463
3530
  }
3464
3531
 
3532
+ .ds-kpi-card {
3533
+ display: grid;
3534
+ width: 100%;
3535
+ grid-template-columns: minmax(0, 1fr) auto;
3536
+ gap: var(--spacing-medium) var(--spacing-small);
3537
+ }
3538
+ .ds-kpi-card > :not(.ds-kpi-card__label, .ds-kpi-card__value) {
3539
+ grid-column: 1/-1;
3540
+ }
3541
+
3542
+ .ds-kpi-card__label {
3543
+ align-self: end;
3544
+ margin: 0;
3545
+ color: var(--kpi-card-color-text-label);
3546
+ font-family: var(--type-body-p-family);
3547
+ font-size: var(--type-body-p-size);
3548
+ font-weight: var(--type-body-p-weight);
3549
+ line-height: var(--type-body-line-height);
3550
+ }
3551
+
3552
+ .ds-kpi-card__value {
3553
+ justify-self: end;
3554
+ margin: 0;
3555
+ color: var(--kpi-card-color-text-value);
3556
+ font-family: var(--type-headings-h2-family);
3557
+ font-size: var(--type-headings-h2-size);
3558
+ font-weight: var(--type-headings-h2-weight);
3559
+ line-height: var(--type-headings-h2-line-height);
3560
+ }
3561
+
3562
+ .ds-kpi-card__suffix {
3563
+ margin-left: var(--spacing-xsmall);
3564
+ font: inherit;
3565
+ }
3566
+
3567
+ .ds-kvp-list {
3568
+ display: flex;
3569
+ width: 100%;
3570
+ flex-direction: column;
3571
+ gap: var(--spacing-medium);
3572
+ box-sizing: border-box;
3573
+ }
3574
+
3575
+ .ds-kvp-list__term,
3576
+ .ds-kvp-list__description {
3577
+ margin: 0;
3578
+ flex: 1;
3579
+ }
3580
+
3581
+ .ds-kvp-list__term,
3582
+ .ds-kvp-list__description--neutral {
3583
+ color: var(--kvp-list-color-text-subtle);
3584
+ font-family: var(--type-body-p-family);
3585
+ font-size: var(--type-body-p-size);
3586
+ font-weight: var(--type-body-p-weight);
3587
+ line-height: var(--type-body-line-height);
3588
+ }
3589
+
3590
+ .ds-kvp-list__description--strong {
3591
+ color: var(--kvp-list-color-text-strong);
3592
+ font-family: var(--type-headings-h2-family);
3593
+ font-size: var(--type-headings-h2-size);
3594
+ font-weight: var(--type-headings-h2-weight);
3595
+ line-height: var(--type-headings-h2-line-height);
3596
+ }
3597
+
3598
+ .ds-kvp-list__description--row {
3599
+ flex-basis: 100%;
3600
+ width: 100%;
3601
+ }
3602
+
3603
+ .ds-kvp-list__suffix {
3604
+ margin-left: var(--spacing-xsmall);
3605
+ font: inherit;
3606
+ }
3607
+
3608
+ .ds-kvp-list__description {
3609
+ text-align: right;
3610
+ }
3611
+
3612
+ .ds-kvp-list__row {
3613
+ display: flex;
3614
+ width: 100%;
3615
+ margin: 0;
3616
+ gap: var(--spacing-small);
3617
+ }
3618
+ .ds-kvp-list__row--vertical {
3619
+ flex-direction: column;
3620
+ }
3621
+ .ds-kvp-list__row--horizontal {
3622
+ flex-wrap: wrap;
3623
+ align-items: center;
3624
+ }
3625
+ .ds-kvp-list__row--horizontal .ds-kvp-list__description:not(.ds-kvp-list__description--row) {
3626
+ flex: 0 0 auto;
3627
+ }
3628
+
3465
3629
  .ds-toast__viewport {
3466
3630
  margin: 0;
3467
3631
  padding: 0;