@dbcdk/react-components 0.0.124 → 0.0.126

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/dist/client.cjs CHANGED
@@ -14,6 +14,7 @@ var Tabs = require('./components/tabs/Tabs');
14
14
  var Headline = require('./components/headline/Headline');
15
15
  var CollapsibleHeadline = require('./components/headline/CollapsibleHeadline');
16
16
  var PageLayout = require('./components/page-layout/PageLayout');
17
+ var EnvironmentBanner = require('./components/environment-banner/EnvironmentBanner');
17
18
  var Footer = require('./components/page-layout/components/footer/Footer');
18
19
  var Input = require('./components/forms/input/Input');
19
20
  var SearchBox = require('./components/search-box/SearchBox');
@@ -168,6 +169,12 @@ Object.keys(PageLayout).forEach(function (k) {
168
169
  get: function () { return PageLayout[k]; }
169
170
  });
170
171
  });
172
+ Object.keys(EnvironmentBanner).forEach(function (k) {
173
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
174
+ enumerable: true,
175
+ get: function () { return EnvironmentBanner[k]; }
176
+ });
177
+ });
171
178
  Object.keys(Footer).forEach(function (k) {
172
179
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
173
180
  enumerable: true,
package/dist/client.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from './components/tabs/Tabs';
11
11
  export * from './components/headline/Headline';
12
12
  export * from './components/headline/CollapsibleHeadline';
13
13
  export * from './components/page-layout/PageLayout';
14
+ export * from './components/environment-banner/EnvironmentBanner';
14
15
  export * from './components/page-layout/components/footer/Footer';
15
16
  export * from './components/forms/input/Input';
16
17
  export * from './components/search-box/SearchBox';
package/dist/client.js CHANGED
@@ -12,6 +12,7 @@ export * from './components/tabs/Tabs';
12
12
  export * from './components/headline/Headline';
13
13
  export * from './components/headline/CollapsibleHeadline';
14
14
  export * from './components/page-layout/PageLayout';
15
+ export * from './components/environment-banner/EnvironmentBanner';
15
16
  export * from './components/page-layout/components/footer/Footer';
16
17
  export * from './components/forms/input/Input';
17
18
  export * from './components/search-box/SearchBox';
@@ -107,7 +107,7 @@
107
107
  /* Status variants */
108
108
 
109
109
  .neutral {
110
- --chip-bg: var(--color-bg-toolbar);
110
+ --chip-bg: var(--color-neutral);
111
111
  --chip-fg: var(--color-fg-default);
112
112
  --chip-border: transparent;
113
113
  --chip-outlined-border: var(--color-border-subtle);
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('./EnvironmentBanner.module.css');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
9
+
10
+ const PRESETS = {
11
+ production: { label: "Produktionsmilj\xF8", severity: "success" },
12
+ staging: { label: "Staging-milj\xF8", severity: "warning" },
13
+ test: { label: "Test-milj\xF8", severity: "info" }
14
+ };
15
+ function EnvironmentBanner(props) {
16
+ const { label, severity } = props.environment != null ? PRESETS[props.environment] : { label: props.customLabel, severity: props.customSeverity };
17
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.banner, "data-severity": severity, role: "status", "aria-label": label, children: label });
18
+ }
19
+
20
+ exports.EnvironmentBanner = EnvironmentBanner;
@@ -0,0 +1,14 @@
1
+ import type { JSX } from 'react';
2
+ import type { Severity } from '../../constants/severity.types';
3
+ type Environment = 'production' | 'staging' | 'test';
4
+ export type EnvironmentBannerProps = {
5
+ environment: Environment;
6
+ customLabel?: never;
7
+ customSeverity?: never;
8
+ } | {
9
+ environment?: never;
10
+ customLabel: string;
11
+ customSeverity: Severity;
12
+ };
13
+ export declare function EnvironmentBanner(props: EnvironmentBannerProps): JSX.Element;
14
+ export {};
@@ -0,0 +1,14 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import styles from './EnvironmentBanner.module.css';
3
+
4
+ const PRESETS = {
5
+ production: { label: "Produktionsmilj\xF8", severity: "success" },
6
+ staging: { label: "Staging-milj\xF8", severity: "warning" },
7
+ test: { label: "Test-milj\xF8", severity: "info" }
8
+ };
9
+ function EnvironmentBanner(props) {
10
+ const { label, severity } = props.environment != null ? PRESETS[props.environment] : { label: props.customLabel, severity: props.customSeverity };
11
+ return /* @__PURE__ */ jsx("div", { className: styles.banner, "data-severity": severity, role: "status", "aria-label": label, children: label });
12
+ }
13
+
14
+ export { EnvironmentBanner };
@@ -0,0 +1,49 @@
1
+ .banner {
2
+ --env-banner-bg: var(--color-bg-toolbar);
3
+ --env-banner-fg: var(--color-fg-default);
4
+
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ width: 100%;
9
+ padding-block: var(--spacing-2xs);
10
+ padding-inline: var(--spacing-md);
11
+ background-color: var(--env-banner-bg);
12
+ color: var(--env-banner-fg);
13
+
14
+ font-size: var(--font-size-xs);
15
+ font-weight: var(--font-weight-semibold);
16
+ text-transform: uppercase;
17
+ line-height: var(--line-height-normal);
18
+ user-select: none;
19
+ }
20
+
21
+ .banner[data-severity='success'] {
22
+ --env-banner-bg: var(--color-status-success);
23
+ --env-banner-fg: var(--color-status-success-bg);
24
+ }
25
+
26
+ .banner[data-severity='warning'] {
27
+ --env-banner-bg: var(--color-status-warning);
28
+ --env-banner-fg: var(--color-status-warning-bg);
29
+ }
30
+
31
+ .banner[data-severity='error'] {
32
+ --env-banner-bg: var(--color-status-error);
33
+ --env-banner-fg: var(--color-status-error-bg);
34
+ }
35
+
36
+ .banner[data-severity='info'] {
37
+ --env-banner-bg: var(--color-status-info);
38
+ --env-banner-fg: var(--color-status-info-bg);
39
+ }
40
+
41
+ .banner[data-severity='brand'] {
42
+ --env-banner-bg: var(--color-brand);
43
+ --env-banner-fg: var(--color-fg-on-brand);
44
+ }
45
+
46
+ .banner[data-severity='neutral'] {
47
+ --env-banner-bg: var(--color-neutral);
48
+ --env-banner-fg: var(--color-fg-default);
49
+ }
@@ -39,7 +39,7 @@ function Page({
39
39
  Headline.Headline,
40
40
  {
41
41
  disableMargin: true,
42
- size: 1,
42
+ size: 2,
43
43
  severity,
44
44
  icon: headerIcon,
45
45
  subheader,
@@ -33,7 +33,7 @@ function Page({
33
33
  Headline,
34
34
  {
35
35
  disableMargin: true,
36
- size: 1,
36
+ size: 2,
37
37
  severity,
38
38
  icon: headerIcon,
39
39
  subheader,
@@ -35,6 +35,12 @@ function splitSlots(children) {
35
35
  });
36
36
  return { slots, rest };
37
37
  }
38
+ const PageLayoutBanner = ({
39
+ children
40
+ }) => {
41
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
42
+ };
43
+ PageLayoutBanner.__PAGE_LAYOUT_SLOT__ = "Banner";
38
44
  const PageLayoutSidebar = ({
39
45
  children
40
46
  }) => {
@@ -73,9 +79,11 @@ const PageLayoutBase = ({
73
79
  const rootClass = [
74
80
  styles__default.default.root,
75
81
  orientation === "vertical" ? styles__default.default.vertical : styles__default.default.horizontal,
76
- containScrolling ? styles__default.default.containScrolling : styles__default.default.documentScrolling
82
+ containScrolling ? styles__default.default.containScrolling : styles__default.default.documentScrolling,
83
+ slots.Banner ? styles__default.default.hasBanner : ""
77
84
  ].filter(Boolean).join(" ");
78
85
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: rootClass, children: [
86
+ slots.Banner ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.banner, children: slots.Banner }) : null,
79
87
  slots.Sidebar ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.sidebar, children: slots.Sidebar }) : null,
80
88
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles__default.default.mainColumn, children: [
81
89
  slots.Header ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.header, children: slots.Header }) : null,
@@ -88,6 +96,7 @@ const PageLayoutBase = ({
88
96
  ] });
89
97
  };
90
98
  const PageLayout = Object.assign(PageLayoutBase, {
99
+ Banner: PageLayoutBanner,
91
100
  Sidebar: PageLayoutSidebar,
92
101
  Header: PageLayoutHeader,
93
102
  Content: PageLayoutContent,
@@ -22,10 +22,14 @@ export interface PageLayoutFooterProps {
22
22
  maxWidth?: PageLayoutMaxWidth;
23
23
  children: ReactNode;
24
24
  }
25
+ export interface PageLayoutBannerProps {
26
+ children: ReactNode;
27
+ }
25
28
  export interface PageLayoutSidebarProps {
26
29
  children: ReactNode;
27
30
  }
28
31
  export declare const PageLayout: FC<PageLayoutProps> & {
32
+ Banner: FC<PageLayoutBannerProps>;
29
33
  Sidebar: FC<PageLayoutSidebarProps>;
30
34
  Header: FC<PageLayoutHeaderProps>;
31
35
  Content: FC<PageLayoutContentProps>;
@@ -29,6 +29,12 @@ function splitSlots(children) {
29
29
  });
30
30
  return { slots, rest };
31
31
  }
32
+ const PageLayoutBanner = ({
33
+ children
34
+ }) => {
35
+ return /* @__PURE__ */ jsx(Fragment, { children });
36
+ };
37
+ PageLayoutBanner.__PAGE_LAYOUT_SLOT__ = "Banner";
32
38
  const PageLayoutSidebar = ({
33
39
  children
34
40
  }) => {
@@ -67,9 +73,11 @@ const PageLayoutBase = ({
67
73
  const rootClass = [
68
74
  styles.root,
69
75
  orientation === "vertical" ? styles.vertical : styles.horizontal,
70
- containScrolling ? styles.containScrolling : styles.documentScrolling
76
+ containScrolling ? styles.containScrolling : styles.documentScrolling,
77
+ slots.Banner ? styles.hasBanner : ""
71
78
  ].filter(Boolean).join(" ");
72
79
  return /* @__PURE__ */ jsxs("div", { className: rootClass, children: [
80
+ slots.Banner ? /* @__PURE__ */ jsx("div", { className: styles.banner, children: slots.Banner }) : null,
73
81
  slots.Sidebar ? /* @__PURE__ */ jsx("div", { className: styles.sidebar, children: slots.Sidebar }) : null,
74
82
  /* @__PURE__ */ jsxs("div", { className: styles.mainColumn, children: [
75
83
  slots.Header ? /* @__PURE__ */ jsx("div", { className: styles.header, children: slots.Header }) : null,
@@ -82,6 +90,7 @@ const PageLayoutBase = ({
82
90
  ] });
83
91
  };
84
92
  const PageLayout = Object.assign(PageLayoutBase, {
93
+ Banner: PageLayoutBanner,
85
94
  Sidebar: PageLayoutSidebar,
86
95
  Header: PageLayoutHeader,
87
96
  Content: PageLayoutContent,
@@ -31,6 +31,18 @@
31
31
  grid-template-columns: minmax(0, 1fr);
32
32
  }
33
33
 
34
+ /* Banner: spans both sidebar and main columns */
35
+ .banner {
36
+ grid-column: 1 / -1;
37
+ min-width: 0;
38
+ flex: 0 0 auto;
39
+ }
40
+
41
+ /* In contained mode, allocate banner height then give the rest to sidebar+main */
42
+ .containScrolling.hasBanner {
43
+ grid-template-rows: auto 1fr;
44
+ }
45
+
34
46
  /* Sidebar */
35
47
  .sidebar {
36
48
  min-width: 0;
@@ -132,7 +144,7 @@
132
144
  align-items: center;
133
145
 
134
146
  background: var(--color-bg-surface);
135
- padding: var(--spacing-lg) var(--spacing-xl);
147
+ padding: var(--spacing-xl) var(--spacing-xl);
136
148
  overflow: visible;
137
149
  }
138
150
 
@@ -12,10 +12,10 @@
12
12
  --progress-fill-progress: color-mix(in srgb, var(--color-fg-default) 6%, transparent);
13
13
  --progress-fill-missing: color-mix(in srgb, var(--color-fg-default) 8%, transparent);
14
14
  --progress-fill-neutral: color-mix(in srgb, var(--color-fg-default) 8%, transparent);
15
- --progress-fill-success: color-mix(in srgb, var(--color-status-success) 32%, transparent);
16
- --progress-fill-info: color-mix(in srgb, var(--color-status-info) 32%, transparent);
17
- --progress-fill-warning: color-mix(in srgb, var(--color-status-warning) 32%, transparent);
18
- --progress-fill-error: color-mix(in srgb, var(--color-status-error) 32%, transparent);
15
+ --progress-fill-success: color-mix(in srgb, var(--color-status-success) 95%, transparent);
16
+ --progress-fill-info: color-mix(in srgb, var(--color-status-info) 70%, transparent);
17
+ --progress-fill-warning: color-mix(in srgb, var(--color-status-warning) 70%, transparent);
18
+ --progress-fill-error: color-mix(in srgb, var(--color-status-error) 75%, transparent);
19
19
 
20
20
  position: relative;
21
21
  width: 100%;
@@ -124,8 +124,12 @@ function Tabs({
124
124
  header ? /* @__PURE__ */ jsxRuntime.jsx(
125
125
  "div",
126
126
  {
127
- className: [styles__default.default.headerContainer, disableTopPadding ? styles__default.default.disableTopPadding : ""].filter(Boolean).join(" "),
128
- children: /* @__PURE__ */ jsxRuntime.jsx(Headline.Headline, { disableMargin: true, size: 1, subheader, addition, children: header })
127
+ className: [
128
+ styles__default.default.headerContainer,
129
+ variant === "outlined" ? styles__default.default.headerContainerOutlined : "",
130
+ disableTopPadding ? styles__default.default.disableTopPadding : ""
131
+ ].filter(Boolean).join(" "),
132
+ children: /* @__PURE__ */ jsxRuntime.jsx(Headline.Headline, { disableMargin: true, size: 2, subheader, addition, children: header })
129
133
  }
130
134
  ) : null,
131
135
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${styles__default.default.tabs} ${styles__default.default[variant]} ${panelStyle ? styles__default.default.panelStyle : ""}`, children: [
@@ -118,8 +118,12 @@ function Tabs({
118
118
  header ? /* @__PURE__ */ jsx(
119
119
  "div",
120
120
  {
121
- className: [styles.headerContainer, disableTopPadding ? styles.disableTopPadding : ""].filter(Boolean).join(" "),
122
- children: /* @__PURE__ */ jsx(Headline, { disableMargin: true, size: 1, subheader, addition, children: header })
121
+ className: [
122
+ styles.headerContainer,
123
+ variant === "outlined" ? styles.headerContainerOutlined : "",
124
+ disableTopPadding ? styles.disableTopPadding : ""
125
+ ].filter(Boolean).join(" "),
126
+ children: /* @__PURE__ */ jsx(Headline, { disableMargin: true, size: 2, subheader, addition, children: header })
123
127
  }
124
128
  ) : null,
125
129
  /* @__PURE__ */ jsxs("div", { className: `${styles.tabs} ${styles[variant]} ${panelStyle ? styles.panelStyle : ""}`, children: [
@@ -183,10 +183,19 @@
183
183
  Outlined variant
184
184
  ========================= */
185
185
 
186
- .outlined {
186
+ .tabs.outlined {
187
187
  gap: var(--spacing-lg);
188
188
  }
189
189
 
190
+ .headerContainerOutlined {
191
+ padding-block-start: var(--spacing-sm);
192
+ padding-block-end: var(--spacing-sm);
193
+ }
194
+
195
+ .headerContainerOutlined.disableTopPadding {
196
+ padding-block-start: 0;
197
+ }
198
+
190
199
  .outlined .tab {
191
200
  color: var(--color-fg-muted);
192
201
  border-block-end: 2px solid var(--color-border-default);
package/dist/index.css CHANGED
@@ -18,6 +18,7 @@
18
18
  @import './components/code-block/CodeBlock.module.css';
19
19
  @import './components/copy-button/CopyButton.module.css';
20
20
  @import './components/datetime-picker/DateTimePicker.module.css';
21
+ @import './components/environment-banner/EnvironmentBanner.module.css';
21
22
  @import './components/filter-field/FilterField.module.css';
22
23
  @import './components/filtering/chip-multi-toggle/ChipMultiToggle.module.css';
23
24
  @import './components/forms/checkbox-group/CheckboxGroup.module.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcdk/react-components",
3
- "version": "0.0.124",
3
+ "version": "0.0.126",
4
4
  "description": "Reusable React components for DBC projects",
5
5
  "license": "ISC",
6
6
  "author": "",