Skip to content

Commit 7f488b3

Browse files
authored
Merge d6d63a0 into d2964d3
2 parents d2964d3 + d6d63a0 commit 7f488b3

File tree

12 files changed

+320
-0
lines changed

12 files changed

+320
-0
lines changed

.changeset/metal-pigs-sing.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@navikt/ds-react": minor
3+
"@navikt/ds-css": minor
4+
---
5+
6+
InlineMessage: :tada: New component! Replaces `<Alert inline />` variant as a standalone component.

@navikt/core/css/config/_mappings.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ const StyleMappings = {
144144
dependencies: ["popover.css"],
145145
},
146146
{ component: "Ingress", main: typoCss },
147+
{
148+
component: "InlineMessage",
149+
main: "inline-message.css",
150+
dependencies: [typoCss],
151+
},
147152
{
148153
component: "InternalHeader",
149154
main: "internalheader.css",

@navikt/core/css/darkside/index.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
@import "./expansioncard.darkside.css" layer(aksel.components);
3636
@import "./guide-panel.darkside.css" layer(aksel.components);
3737
@import "./help-text.darkside.css" layer(aksel.components);
38+
@import "./inline-message.darkside.css" layer(aksel.components);
3839
@import "./internalheader.darkside.css" layer(aksel.components);
3940
@import "./link.darkside.css" layer(aksel.components);
4041
@import "./link-panel.darkside.css" layer(aksel.components);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.aksel-inline-message {
2+
display: flex;
3+
gap: var(--ax-space-4);
4+
color: var(--ax-text-default);
5+
}
6+
7+
.aksel-inline-message__icon {
8+
color: var(--ax-text-subtle);
9+
font-size: 1.5rem;
10+
flex: 0 0 auto;
11+
12+
.aksel-inline-message[data-size="small"] & {
13+
font-size: 1.25rem;
14+
}
15+
}

@navikt/core/css/index.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
@import "guide-panel.css";
1515
@import "form/index.css";
1616
@import "help-text.css";
17+
@import "inline-message.css";
1718
@import "internalheader.css";
1819
@import "link.css";
1920
@import "link-anchor.css";
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
.navds-inline-message {
2+
display: flex;
3+
gap: var(--a-spacing-1);
4+
}
5+
6+
.navds-inline-message[data-color="info"] {
7+
color: var(--a-lightblue-900);
8+
9+
& .navds-inline-message__icon {
10+
color: var(--a-icon-info);
11+
}
12+
}
13+
14+
.navds-inline-message[data-color="success"] {
15+
color: var(--a-green-900);
16+
17+
& .navds-inline-message__icon {
18+
color: var(--a-icon-success);
19+
}
20+
}
21+
22+
.navds-inline-message[data-color="danger"] {
23+
color: var(--a-red-900);
24+
25+
& .navds-inline-message__icon {
26+
color: var(--a-icon-danger);
27+
}
28+
}
29+
30+
.navds-inline-message[data-color="warning"] {
31+
color: var(--a-orange-900);
32+
33+
& .navds-inline-message__icon {
34+
color: var(--a-icon-warning);
35+
}
36+
}
37+
38+
.navds-inline-message__icon {
39+
font-size: 1.5rem;
40+
flex: 0 0 auto;
41+
42+
.navds-inline-message[data-size="small"] & {
43+
font-size: 1.25rem;
44+
}
45+
}

@navikt/core/react/package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,16 @@
624624
"default": "./cjs/form/form-progress/index.js"
625625
}
626626
},
627+
"./InlineMessage": {
628+
"import": {
629+
"types": "./esm/inline-message/index.d.ts",
630+
"default": "./esm/inline-message/index.js"
631+
},
632+
"require": {
633+
"types": "./cjs/inline-message/index.d.ts",
634+
"default": "./cjs/inline-message/index.js"
635+
}
636+
},
627637
"./package.json": "./package.json",
628638
"./Theme": {
629639
"import": {

@navikt/core/react/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ export {
163163
type LinkCardIconProps,
164164
type LinkCardImageProps,
165165
} from "./link-card";
166+
export { InlineMessage, type InlineMessageProps } from "./inline-message";
166167

167168
/**
168169
* Theming
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import type { Meta, StoryObj } from "@storybook/react-vite";
2+
import React from "react";
3+
import { VStack } from "../layout/stack";
4+
import { Link } from "../link";
5+
import { renderStoriesForChromatic } from "../util/renderStoriesForChromatic";
6+
import { InlineMessage } from "./index";
7+
8+
const meta: Meta<typeof InlineMessage> = {
9+
title: "ds-react/InlineMessage",
10+
component: InlineMessage,
11+
parameters: {
12+
chromatic: { disable: true },
13+
},
14+
};
15+
16+
export default meta;
17+
18+
type Story = StoryObj<typeof InlineMessage>;
19+
20+
const variants = ["info", "success", "warning", "error"] as const;
21+
22+
export const Default: Story = {
23+
render: (props) => {
24+
return (
25+
<InlineMessage variant={props.variant ?? "warning"}>
26+
{props.children ?? "InlineMessage content"}
27+
</InlineMessage>
28+
);
29+
},
30+
31+
args: {
32+
children: "Id elit esse enim reprehenderit enim nisi veniam nostrud.",
33+
variant: "warning",
34+
},
35+
argTypes: {
36+
variant: {
37+
control: { type: "select" },
38+
options: variants,
39+
},
40+
},
41+
};
42+
43+
export const SizeSmall: Story = {
44+
render: () => {
45+
return (
46+
<InlineMessage variant="warning" size="small">
47+
<DemoContent />
48+
</InlineMessage>
49+
);
50+
},
51+
};
52+
53+
export const Compositions: Story = {
54+
render: () => {
55+
return (
56+
<VStack gap="space-16">
57+
{variants.map((variant) => (
58+
<InlineMessage variant={variant} key={variant}>
59+
<DemoContent />
60+
</InlineMessage>
61+
))}
62+
</VStack>
63+
);
64+
},
65+
};
66+
67+
export const WrappingTitle: Story = {
68+
render: () => {
69+
return (
70+
<InlineMessage variant="warning">
71+
<DemoContent />
72+
</InlineMessage>
73+
);
74+
},
75+
};
76+
77+
export const AsLink: Story = {
78+
render: () => {
79+
return (
80+
<InlineMessage variant="warning" as={Link} href="#">
81+
This is a link inside the InlineMessage
82+
</InlineMessage>
83+
);
84+
},
85+
};
86+
87+
export const Chromatic = renderStoriesForChromatic({
88+
Default,
89+
Compositions,
90+
WrappingTitle,
91+
SizeSmall,
92+
});
93+
94+
export const ChromaticLight = renderStoriesForChromatic({
95+
Default,
96+
Compositions,
97+
WrappingTitle,
98+
SizeSmall,
99+
});
100+
ChromaticLight.globals = { theme: "light", mode: "darkside" };
101+
102+
export const ChromaticDark = renderStoriesForChromatic({
103+
Default,
104+
Compositions,
105+
WrappingTitle,
106+
SizeSmall,
107+
});
108+
ChromaticDark.globals = { theme: "dark", mode: "darkside" };
109+
110+
function DemoContent() {
111+
return (
112+
<span>
113+
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iure unde,
114+
repudiandae, deleniti exercitationem quod aut veniam sint officiis
115+
necessitatibus nulla nostrum voluptatem <Link href="#">Test</Link>{" "}
116+
facilis! Commodi, nobis tempora quibusdam temporibus nulla quam.
117+
</span>
118+
);
119+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React from "react";
2+
import {
3+
CheckmarkCircleFillIcon,
4+
ExclamationmarkTriangleFillIcon,
5+
InformationSquareFillIcon,
6+
XMarkOctagonFillIcon,
7+
} from "@navikt/aksel-icons";
8+
import { useRenameCSS } from "../../theme/Theme";
9+
import { useI18n } from "../../util/i18n/i18n.hooks";
10+
11+
const VARIANT_ICONS = {
12+
info: InformationSquareFillIcon,
13+
success: CheckmarkCircleFillIcon,
14+
warning: ExclamationmarkTriangleFillIcon,
15+
error: XMarkOctagonFillIcon,
16+
} as const;
17+
18+
function InlineMessageIcon({
19+
variant,
20+
}: {
21+
variant: "info" | "success" | "warning" | "error";
22+
}) {
23+
const translate = useI18n("Alert");
24+
const { cn } = useRenameCSS();
25+
26+
if (!(variant in VARIANT_ICONS)) {
27+
return null;
28+
}
29+
30+
const Icon = VARIANT_ICONS[variant];
31+
32+
return (
33+
<Icon
34+
title={translate(variant)}
35+
className={cn("navds-inline-message__icon")}
36+
/>
37+
);
38+
}
39+
40+
export { InlineMessageIcon };

0 commit comments

Comments
 (0)