@vodafone_de/brix-components 7.0.9 → 7.0.11

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.
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { B as ButtonAsLink, g as getButtonIcon } from "../../index-hMlQuoyx.js";
3
+ import { B as ButtonAsLink, g as getButtonIcon } from "../../index-hNV7tcRV.js";
4
4
  import { r as renderInlineRichTextFromOpenText } from "../../renderInlineRichTextFromOpenText-RvOG3QbI.js";
5
5
  import { B as ButtonStyled } from "../../styled-C4eI47I1.js";
6
6
  const buttonFullWidth = "full";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import "react/jsx-runtime";
3
- import { B } from "../../index-hMlQuoyx.js";
3
+ import { B } from "../../index-hNV7tcRV.js";
4
4
  import "../../hooks/useLinkComponent/index.js";
5
5
  import "../../filterProps-CBnuV0LI.js";
6
6
  import "../../renderInlineRichTextFromOpenText-RvOG3QbI.js";
@@ -648,6 +648,7 @@ const IconLoader = ({
648
648
  ...props
649
649
  }) => {
650
650
  const MappedIcon = mapNameToInlineIcons[name];
651
+ if (!MappedIcon) return null;
651
652
  return /* @__PURE__ */ jsx(MappedIcon, { ...props, className });
652
653
  };
653
654
  export {
@@ -45,9 +45,7 @@ const InlineLinkStyled = styled.span.withConfig({
45
45
  }
46
46
  });
47
47
  const InlineLink = (props) => {
48
- const {
49
- LinkComponent
50
- } = useLinkComponent();
48
+ const LinkComponent = useLinkComponent();
51
49
  return /* @__PURE__ */ jsx(InlineLinkStyled, { ...props, children: /* @__PURE__ */ jsx(LinkComponent, { ...filterPropsForUnstyledComponent(props), children: props.children }) });
52
50
  };
53
51
  export {
@@ -11,9 +11,7 @@ const Link = (props) => {
11
11
  if (isLinkAsButtonProp(props)) {
12
12
  return /* @__PURE__ */ jsx(LinkAsButton, { ...props, children: props.children });
13
13
  }
14
- const {
15
- LinkComponent
16
- } = useLinkComponent();
14
+ const LinkComponent = useLinkComponent();
17
15
  return /* @__PURE__ */ jsx(LinkStyled, { ...props, children: /* @__PURE__ */ jsxs(LinkComponent, { ...filterPropsForUnstyledComponent(props), children: [
18
16
  renderInlineRichTextFromOpenText(props.children),
19
17
  getLinkIcon(props.icon)
@@ -327,9 +327,7 @@ const LinkListItem = (props) => {
327
327
  if (isLinkListItemAsButtonProp(props)) {
328
328
  return /* @__PURE__ */ jsx(LinkListItemButtonStyled, { ...props, children: Item });
329
329
  }
330
- const {
331
- LinkComponent
332
- } = useLinkComponent();
330
+ const LinkComponent = useLinkComponent();
333
331
  return /* @__PURE__ */ jsx(LinkListItemAnchorStyled, { elevation, orientation, children: /* @__PURE__ */ jsx(LinkComponent, { ...filterPropsForUnstyledComponent(props), children: Item }) });
334
332
  };
335
333
  export {
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { TabGroupProps } from './props';
3
+ declare const TabGroup: FC<TabGroupProps>;
4
+ export default TabGroup;
5
+ export * from './props';
6
+ export * from './styled';
@@ -0,0 +1,314 @@
1
+ "use client";
2
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
3
+ import { useState, useRef, useEffect } from "react";
4
+ import IconLoader from "../IconLoader/index.js";
5
+ import { b as iconSizeSm } from "../../styled-DPHfwWsx.js";
6
+ import styled from "styled-components";
7
+ import Container from "../Container/index.js";
8
+ import Flex from "../Flex/index.js";
9
+ import forcedColors from "../../foundations/media-query/forcedColors/index.js";
10
+ import { getBorderColor } from "../../foundations/token/getBorderColor/index.js";
11
+ import { getBorderRadius } from "../../foundations/token/getBorderRadius/index.js";
12
+ import { getBorderWidth } from "../../foundations/token/getBorderWidth/index.js";
13
+ import { getFontWeight } from "../../foundations/token/getFontWeight/index.js";
14
+ import { getHoverColor } from "../../foundations/token/getHoverColor/index.js";
15
+ import { getObjectColor } from "../../foundations/token/getObjectColor/index.js";
16
+ import { getSpacing } from "../../foundations/token/getSpacing/index.js";
17
+ import { c as colorBackgroundNeutral } from "../../BackgroundColor-e0N9tdDR.js";
18
+ import { j as colorBorderSubtle, c as colorBorderFocus } from "../../BorderColor-BummoQ1-.js";
19
+ import { d as borderRadiusSm } from "../../BorderRadius-ClUShVLu.js";
20
+ import { a as borderWidthFocus } from "../../BorderWidth-DfOlyKK7.js";
21
+ import { f as fontWeightBold } from "../../FontWeight-DEBGHbtO.js";
22
+ import { c as colorObjectBrand } from "../../ObjectColor-BZDBuV8H.js";
23
+ import { c as spacingSm, a as spacingXs, e as spacing2Xs } from "../../Spacing-D0HQH9YJ.js";
24
+ import { a as filterProps } from "../../filterProps-CBnuV0LI.js";
25
+ import { d as flexJustifyCenter } from "../../styled-CPUu8mvT.js";
26
+ const tabOrientationHorizontal = "horizontal";
27
+ const tabOrientationVertical = "vertical";
28
+ const tabGroupWidthFull = "full";
29
+ const tabGroupWidthAuto = "auto";
30
+ const TabGroupTabsScrollableContainerStyled = styled.div.withConfig({
31
+ shouldForwardProp: filterProps(),
32
+ displayName: "TabGroupTabsScrollableContainerStyled",
33
+ componentId: "sc-qawwg-0"
34
+ })(({
35
+ width
36
+ }) => ({
37
+ width: width || "100%",
38
+ position: "relative",
39
+ ...width === "auto" && {
40
+ overflowX: "auto",
41
+ /* Firefox */
42
+ scrollbarWidth: "none",
43
+ /* IE and Edge */
44
+ msOverflowStyle: "none",
45
+ /* Webkit (Chrome, Safari, Opera) */
46
+ "::-webkit-scrollbar": {
47
+ display: "none"
48
+ }
49
+ }
50
+ }));
51
+ const TabGroupTabsStyled = styled(Flex).withConfig({
52
+ displayName: "TabGroupTabsStyled",
53
+ componentId: "sc-qawwg-1"
54
+ })({
55
+ display: "flex",
56
+ gap: 0,
57
+ width: "fit-content",
58
+ borderBottom: `${getBorderWidth("Divider")} solid ${getBorderColor(colorBorderSubtle)}`,
59
+ ...forcedColors({
60
+ borderBottom: `${getBorderWidth("Divider")} solid CanvasText`
61
+ })
62
+ });
63
+ const TabStyled = styled.button.withConfig({
64
+ shouldForwardProp: filterProps(["tabOrientation", "width"]),
65
+ displayName: "TabStyled",
66
+ componentId: "sc-qawwg-2"
67
+ })({
68
+ background: "none",
69
+ border: "none",
70
+ color: "inherit",
71
+ cursor: "pointer",
72
+ display: "flex",
73
+ alignItems: "center",
74
+ whiteSpace: "nowrap",
75
+ padding: getSpacing(spacingSm),
76
+ borderRadius: getBorderRadius(borderRadiusSm),
77
+ justifyContent: flexJustifyCenter,
78
+ "&:focus-visible": {
79
+ outline: "none",
80
+ boxShadow: `inset 0px 0px 0px 4px ${getBorderColor(colorBorderFocus)} `,
81
+ borderRadius: `${getBorderRadius(borderRadiusSm)} ${getBorderRadius(borderRadiusSm)} 0 0`,
82
+ ...forcedColors({
83
+ outline: `${getBorderWidth(borderWidthFocus)} solid ${getBorderColor(colorBorderFocus)}`,
84
+ outlineOffset: "-6px",
85
+ borderRadius: `${getBorderRadius(borderRadiusSm)} ${getBorderRadius(borderRadiusSm)} 0 0`
86
+ })
87
+ },
88
+ "&:hover": {
89
+ background: getHoverColor(colorBackgroundNeutral),
90
+ ...forcedColors({
91
+ background: "transparent"
92
+ })
93
+ }
94
+ }, ({
95
+ tabOrientation
96
+ }) => ({
97
+ flexDirection: tabOrientation === tabOrientationVertical ? "column" : "row",
98
+ gap: tabOrientation === tabOrientationVertical ? getSpacing(spacingXs) : getSpacing(spacing2Xs)
99
+ }), ({
100
+ width
101
+ }) => ({
102
+ ...width === "full" && {
103
+ flex: 1
104
+ }
105
+ }));
106
+ const TabLabelStyled = styled.span.withConfig({
107
+ displayName: "TabLabelStyled",
108
+ componentId: "sc-qawwg-3"
109
+ })({
110
+ '[aria-selected="true"] &': {
111
+ fontWeight: getFontWeight(fontWeightBold)
112
+ }
113
+ });
114
+ const TabGroupIndicatorStyled = styled.div.withConfig({
115
+ displayName: "TabGroupIndicatorStyled",
116
+ componentId: "sc-qawwg-4"
117
+ })({
118
+ position: "absolute",
119
+ bottom: "1px",
120
+ width: "50px",
121
+ height: "4px",
122
+ borderRadius: `${getBorderRadius(borderRadiusSm)} ${getBorderRadius(borderRadiusSm)} 0 0`,
123
+ background: getObjectColor(colorObjectBrand),
124
+ transition: "all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms",
125
+ ...forcedColors({
126
+ background: "SelectedItem"
127
+ })
128
+ });
129
+ const PanelStyled = styled(Container).withConfig({
130
+ displayName: "PanelStyled",
131
+ componentId: "sc-qawwg-5"
132
+ })({
133
+ "&:focus-visible": {
134
+ outline: `4px solid ${getBorderColor(colorBorderFocus)}`,
135
+ borderRadius: `${getBorderRadius(borderRadiusSm)} ${getBorderRadius(borderRadiusSm)} 0 0`,
136
+ ...forcedColors({
137
+ outline: "4px solid CanvasText"
138
+ })
139
+ }
140
+ });
141
+ const TabGroup = ({
142
+ tabs,
143
+ tabOrientation = tabOrientationHorizontal,
144
+ value,
145
+ width = tabGroupWidthFull,
146
+ "aria-label": ariaLabel,
147
+ onTabChange
148
+ }) => {
149
+ if (!(tabs == null ? void 0 : tabs.length)) return null;
150
+ const getValueFromUrl = () => {
151
+ if (typeof window === "undefined") return null;
152
+ const hash = window.location.hash;
153
+ if (!hash.startsWith("#tab-")) return null;
154
+ const tabValueFromHash = hash.replace("#tab-", "");
155
+ return tabs.some((tab) => tab.value === tabValueFromHash) ? tabValueFromHash : null;
156
+ };
157
+ const [activeTab, setActiveTab] = useState(() => {
158
+ return value || tabs[0].value || "";
159
+ });
160
+ const [indicatorStyle, setIndicatorStyle] = useState({
161
+ left: 0,
162
+ width: 0
163
+ });
164
+ const tabRefs = useRef({});
165
+ const tabsContainerRef = useRef(null);
166
+ useEffect(() => {
167
+ const handleHashChange = () => {
168
+ const valueFromUrl = getValueFromUrl();
169
+ if (valueFromUrl) {
170
+ setActiveTab(valueFromUrl);
171
+ onTabChange == null ? void 0 : onTabChange(valueFromUrl);
172
+ }
173
+ };
174
+ window.addEventListener("hashchange", handleHashChange);
175
+ handleHashChange();
176
+ return () => window.removeEventListener("hashchange", handleHashChange);
177
+ }, [tabs]);
178
+ useEffect(() => {
179
+ const valueFromUrl = getValueFromUrl();
180
+ if (value !== void 0 && value !== activeTab && !valueFromUrl) {
181
+ setActiveTab(value);
182
+ }
183
+ }, [value]);
184
+ useEffect(() => {
185
+ const valueFromUrl = getValueFromUrl();
186
+ if (valueFromUrl) {
187
+ setActiveTab(valueFromUrl);
188
+ onTabChange == null ? void 0 : onTabChange(valueFromUrl);
189
+ }
190
+ }, []);
191
+ useEffect(() => {
192
+ const activeEl = tabRefs.current[activeTab];
193
+ if (!activeEl) return;
194
+ const updateIndicator = () => {
195
+ setIndicatorStyle({
196
+ left: activeEl.offsetLeft,
197
+ width: activeEl.offsetWidth
198
+ });
199
+ };
200
+ const resizeObserver = new ResizeObserver(() => {
201
+ updateIndicator();
202
+ });
203
+ resizeObserver.observe(activeEl);
204
+ requestAnimationFrame(() => {
205
+ updateIndicator();
206
+ });
207
+ window.addEventListener("resize", updateIndicator);
208
+ return () => {
209
+ resizeObserver.disconnect();
210
+ window.removeEventListener("resize", updateIndicator);
211
+ };
212
+ }, [activeTab, tabs]);
213
+ useEffect(() => {
214
+ if (width !== "auto") return;
215
+ const activeEl = tabRefs.current[activeTab];
216
+ if (activeEl) {
217
+ requestAnimationFrame(() => {
218
+ scrollTabIntoView(activeEl);
219
+ });
220
+ }
221
+ }, [activeTab, width]);
222
+ const scrollTabIntoView = (tabEl) => {
223
+ if (width !== "auto") return;
224
+ const containerEl = tabsContainerRef.current;
225
+ if (!containerEl) return;
226
+ const tabLeft = tabEl.offsetLeft;
227
+ const tabRight = tabLeft + tabEl.offsetWidth;
228
+ const containerScrollLeft = containerEl.scrollLeft;
229
+ const containerWidth = containerEl.offsetWidth;
230
+ if (tabLeft < containerScrollLeft) {
231
+ containerEl.scrollTo({
232
+ left: tabLeft,
233
+ behavior: "smooth"
234
+ });
235
+ } else if (tabRight > containerScrollLeft + containerWidth) {
236
+ containerEl.scrollTo({
237
+ left: tabRight - containerWidth,
238
+ behavior: "smooth"
239
+ });
240
+ }
241
+ };
242
+ const clearHash = () => {
243
+ if (typeof window === "undefined") return;
244
+ const currentHash = window.location.hash.replace("#", "");
245
+ if (currentHash.startsWith("tab-")) {
246
+ history.replaceState(null, "", window.location.pathname + window.location.search);
247
+ }
248
+ };
249
+ const handleTabClick = (newValue) => {
250
+ if (newValue !== activeTab) {
251
+ setActiveTab(newValue);
252
+ onTabChange == null ? void 0 : onTabChange(newValue);
253
+ }
254
+ clearHash();
255
+ const tabEl = tabRefs.current[newValue];
256
+ if (tabEl) scrollTabIntoView(tabEl);
257
+ };
258
+ const handleKeyDown = (e, index) => {
259
+ const lastIndex = tabs.length - 1;
260
+ if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
261
+ const isRight = e.key === "ArrowRight";
262
+ const newIndex = isRight ? index === lastIndex ? 0 : index + 1 : index === 0 ? lastIndex : index - 1;
263
+ const newTabValue = tabs[newIndex].value;
264
+ e.preventDefault();
265
+ const newTabEl = tabRefs.current[newTabValue];
266
+ if (newTabEl) {
267
+ newTabEl.focus();
268
+ scrollTabIntoView(newTabEl);
269
+ }
270
+ }
271
+ if (e.key === "Enter" || e.key === " ") {
272
+ e.preventDefault();
273
+ const newTabValue = tabs[index].value;
274
+ setActiveTab(newTabValue);
275
+ onTabChange == null ? void 0 : onTabChange(newTabValue);
276
+ clearHash();
277
+ }
278
+ };
279
+ const getTabs = tabs.map((tab, tabIndex) => {
280
+ const tabValue = tab.value;
281
+ const isActive = tabValue === activeTab;
282
+ return /* @__PURE__ */ jsxs(TabStyled, { tabOrientation, width, type: "button", ref: (el) => {
283
+ tabRefs.current[tabValue] = el;
284
+ }, onClick: () => handleTabClick(tabValue), "aria-selected": isActive, tabIndex: isActive ? 0 : -1, role: "tab", id: `tab-${tabValue}`, "aria-controls": `tabpanel-${tabValue}`, onKeyDown: (e) => handleKeyDown(e, tabIndex), children: [
285
+ tab.icon ? /* @__PURE__ */ jsx(IconLoader, { name: tab.icon, size: iconSizeSm }) : null,
286
+ /* @__PURE__ */ jsx(TabLabelStyled, { children: tab.label })
287
+ ] }, `tab-${tabIndex}`);
288
+ });
289
+ const getPanels = tabs.map((tab, tabIndex) => {
290
+ const tabValue = tab.value;
291
+ const isActive = tabValue === activeTab;
292
+ return /* @__PURE__ */ jsx(PanelStyled, { role: "tabpanel", id: `tabpanel-${tabValue}`, "aria-labelledby": `tab-${tabValue}`, hidden: !isActive, tabIndex: 0, children: tab.panelContent }, `tabpanel-${tabIndex}`);
293
+ });
294
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
295
+ /* @__PURE__ */ jsxs(TabGroupTabsScrollableContainerStyled, { width, ref: tabsContainerRef, children: [
296
+ /* @__PURE__ */ jsx(TabGroupTabsStyled, { "aria-label": ariaLabel, role: "tablist", children: getTabs }),
297
+ /* @__PURE__ */ jsx(TabGroupIndicatorStyled, { style: indicatorStyle })
298
+ ] }),
299
+ getPanels
300
+ ] });
301
+ };
302
+ export {
303
+ PanelStyled,
304
+ TabGroupIndicatorStyled,
305
+ TabGroupTabsScrollableContainerStyled,
306
+ TabGroupTabsStyled,
307
+ TabLabelStyled,
308
+ TabStyled,
309
+ TabGroup as default,
310
+ tabGroupWidthAuto,
311
+ tabGroupWidthFull,
312
+ tabOrientationHorizontal,
313
+ tabOrientationVertical
314
+ };
@@ -0,0 +1,53 @@
1
+ import { IconName } from '@vfde-react/inline-icon-library/IconName';
2
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
3
+ import { PatternProps } from '../../foundations/PatternProps';
4
+ export declare const tabOrientationHorizontal = "horizontal";
5
+ export declare const tabOrientationVertical = "vertical";
6
+ export declare const tabGroupWidthFull = "full";
7
+ export declare const tabGroupWidthAuto = "auto";
8
+ export type TabOrientation = typeof tabOrientationHorizontal | typeof tabOrientationVertical;
9
+ export type TabGroupWidth = typeof tabGroupWidthFull | typeof tabGroupWidthAuto;
10
+ export interface TabProps extends ButtonHTMLAttributes<HTMLInputElement> {
11
+ /**
12
+ * Specify a system icon to be displayed to the left of the label.
13
+ */
14
+ icon?: IconName;
15
+ /**
16
+ * Label for the tab
17
+ */
18
+ label: string;
19
+ /**
20
+ * Unique tab value
21
+ */
22
+ value?: string;
23
+ /**
24
+ * Content of the tab
25
+ */
26
+ panelContent: ReactNode;
27
+ }
28
+ export interface TabGroupProps extends PatternProps, HTMLAttributes<HTMLDivElement> {
29
+ /**
30
+ * Pin component's name from string to the concrete name
31
+ */
32
+ component?: 'TabGroup';
33
+ /**
34
+ * List of tabs
35
+ */
36
+ tabs: TabProps[];
37
+ /**
38
+ * TabGroup tabs orientation, can be horizontal or vertical
39
+ */
40
+ tabOrientation?: TabOrientation;
41
+ /**
42
+ * TabGroup width, when it's Auto, the TabGroup is scrollable horizontally
43
+ */
44
+ width?: TabGroupWidth;
45
+ /**
46
+ * Controlled value of the selected tab
47
+ */
48
+ value: string;
49
+ /**
50
+ * Callback when a tab is selected
51
+ */
52
+ onTabChange?: (value: string) => void;
53
+ }
@@ -0,0 +1,7 @@
1
+ import { TabGroupProps } from './props';
2
+ export declare const TabGroupTabsScrollableContainerStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components/dist/types').Substitute<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<TabGroupProps, "width">>> & string;
3
+ export declare const TabGroupTabsStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components').FastOmit<import('../Flex').FlexProps, never>> & string & Omit<import('react').FC<import('../Flex').FlexProps>, keyof import('react').Component<any, {}, any>>;
4
+ export declare const TabStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components/dist/types').Substitute<import('react').DetailedHTMLProps<import('react').ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, Pick<TabGroupProps, "width" | "tabOrientation">>> & string;
5
+ export declare const TabLabelStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components').FastOmit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, never>> & string;
6
+ export declare const TabGroupIndicatorStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components').FastOmit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
7
+ export declare const PanelStyled: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components').FastOmit<import('../Container').ContainerProps, never>> & string & Omit<import('react').FC<import('../Container').ContainerProps>, keyof import('react').Component<any, {}, any>>;
@@ -1,11 +1,21 @@
1
- import { ComponentType } from 'react';
2
- import { ButtonAsLinkProps } from '../../components/ButtonAsLink';
3
- import { InlineLinkProps } from '../../components/InlineLink';
4
- import { LinkProps } from '../../components/Link';
5
- import { LinkListItemProps } from '../../components/LinkListItem';
6
- export type LinkComponentProps = LinkListItemProps | LinkProps | ButtonAsLinkProps | InlineLinkProps;
7
- export type LinkContextType = {
8
- LinkComponent: ComponentType<LinkComponentProps>;
9
- };
1
+ import { AnchorHTMLAttributes, ComponentType } from 'react';
2
+ /**
3
+ * Props of the link component.
4
+ */
5
+ export type LinkComponentProps = AnchorHTMLAttributes<HTMLAnchorElement>;
6
+ /**
7
+ * Type of the context.
8
+ */
9
+ export type LinkContextType = ComponentType<LinkComponentProps>;
10
+ /**
11
+ * Default link component using `<a>`.
12
+ */
13
+ export declare const DefaultLinkComponent: LinkContextType;
14
+ /**
15
+ * Context for providing a custom link component.
16
+ */
10
17
  export declare const LinkContext: import('react').Context<LinkContextType>;
18
+ /**
19
+ * Hook to access the current link component from context.
20
+ */
11
21
  export declare const useLinkComponent: () => LinkContextType;
@@ -1,11 +1,10 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { createContext, useContext } from "react";
3
- const defaultContext = {
4
- LinkComponent: (props) => /* @__PURE__ */ jsx("a", { ...props })
5
- };
6
- const LinkContext = createContext(defaultContext);
3
+ const DefaultLinkComponent = (props) => /* @__PURE__ */ jsx("a", { ...props });
4
+ const LinkContext = createContext(DefaultLinkComponent);
7
5
  const useLinkComponent = () => useContext(LinkContext);
8
6
  export {
7
+ DefaultLinkComponent,
9
8
  LinkContext,
10
9
  useLinkComponent
11
10
  };
@@ -69,9 +69,7 @@ const ButtonAsLinkStyled = styled.span.withConfig({
69
69
  bottomSpacing
70
70
  }));
71
71
  const ButtonAsLink = (props) => {
72
- const {
73
- LinkComponent
74
- } = useLinkComponent();
72
+ const LinkComponent = useLinkComponent();
75
73
  return /* @__PURE__ */ jsx(ButtonAsLinkStyled, { ...props, children: /* @__PURE__ */ jsxs(LinkComponent, { ...filterPropsForUnstyledComponent(props), children: [
76
74
  renderInlineRichTextFromOpenText(props.children),
77
75
  getButtonIcon(props == null ? void 0 : props.icon)
package/dist/index.d.ts CHANGED
@@ -10,6 +10,8 @@ export * from './components/TextList';
10
10
  export { default as TextList } from './components/TextList';
11
11
  export * from './components/TabularPrice';
12
12
  export { default as TabularPrice } from './components/TabularPrice';
13
+ export * from './components/TabGroup';
14
+ export { default as TabGroup } from './components/TabGroup';
13
15
  export * from './components/Switch';
14
16
  export { default as Switch } from './components/Switch';
15
17
  export * from './components/SuggestInput';
package/dist/index.js CHANGED
@@ -4,76 +4,77 @@ import { default as default4 } from "./components/TimeInput/index.js";
4
4
  import { default as default5 } from "./components/Textarea/index.js";
5
5
  import { R, T, a } from "./index-9io8adeQ.js";
6
6
  import { P, T as T2, c, g, f, p, a as a2, e, d, b } from "./index-TImInHXt.js";
7
- import { default as default6 } from "./components/Switch/index.js";
8
- import { default as default7 } from "./components/SuggestInput/index.js";
9
- import { default as default8 } from "./components/Stepper/index.js";
10
- import { default as default9 } from "./components/SelectInput/index.js";
11
- import { default as default10 } from "./components/SearchInput/index.js";
7
+ import { PanelStyled, default as default6, TabGroupIndicatorStyled, TabGroupTabsScrollableContainerStyled, TabGroupTabsStyled, TabLabelStyled, TabStyled, tabGroupWidthAuto, tabGroupWidthFull, tabOrientationHorizontal, tabOrientationVertical } from "./components/TabGroup/index.js";
8
+ import { default as default7 } from "./components/Switch/index.js";
9
+ import { default as default8 } from "./components/SuggestInput/index.js";
10
+ import { default as default9 } from "./components/Stepper/index.js";
11
+ import { default as default10 } from "./components/SelectInput/index.js";
12
+ import { default as default11 } from "./components/SearchInput/index.js";
12
13
  import { S } from "./index-GwyCjtti.js";
13
- import { default as default11 } from "./components/ResponsiveImage/index.js";
14
- import { HiddenRadioStyled, default as default12, StarLabelStyled, StarsWrapperStyled } from "./components/Rating/index.js";
15
- import { default as default13 } from "./components/RadioGroup/index.js";
16
- import { default as default14 } from "./components/ProductCard/index.js";
17
- import { default as default15 } from "./components/PickerGroup/index.js";
18
- import { default as default16, overlayAppearancePrimary, overlayAppearanceSecondary } from "./components/Overlay/index.js";
19
- import { default as default17, notificationStatusError, notificationStatusInfo, notificationStatusSuccess, notificationStatusWarning } from "./components/Notification/index.js";
20
- import { default as default18, mediaTextPositionLeft, mediaTextPositionRight, mediaTextPositionTop } from "./components/MediaText/index.js";
21
- import { default as default19 } from "./components/LoadingSpinner/index.js";
22
- import { default as default20, linkListItemVariantHorizontal, linkListItemVariantVertical } from "./components/LinkListItem/index.js";
23
- import { default as default21, linkListVariantColumn, linkListVariantRow } from "./components/LinkList/index.js";
14
+ import { default as default12 } from "./components/ResponsiveImage/index.js";
15
+ import { HiddenRadioStyled, default as default13, StarLabelStyled, StarsWrapperStyled } from "./components/Rating/index.js";
16
+ import { default as default14 } from "./components/RadioGroup/index.js";
17
+ import { default as default15 } from "./components/ProductCard/index.js";
18
+ import { default as default16 } from "./components/PickerGroup/index.js";
19
+ import { default as default17, overlayAppearancePrimary, overlayAppearanceSecondary } from "./components/Overlay/index.js";
20
+ import { default as default18, notificationStatusError, notificationStatusInfo, notificationStatusSuccess, notificationStatusWarning } from "./components/Notification/index.js";
21
+ import { default as default19, mediaTextPositionLeft, mediaTextPositionRight, mediaTextPositionTop } from "./components/MediaText/index.js";
22
+ import { default as default20 } from "./components/LoadingSpinner/index.js";
23
+ import { default as default21, linkListItemVariantHorizontal, linkListItemVariantVertical } from "./components/LinkListItem/index.js";
24
+ import { default as default22, linkListVariantColumn, linkListVariantRow } from "./components/LinkList/index.js";
24
25
  import { L } from "./index-Cqh8IRpl.js";
25
- import { default as default22 } from "./components/Link/index.js";
26
- import { default as default23 } from "./components/Legend/index.js";
27
- import { default as default24 } from "./components/Label/index.js";
28
- import { default as default25 } from "./components/Input/index.js";
29
- import { default as default26 } from "./components/InlineLink/index.js";
30
- import { default as default27 } from "./components/InlineIcon/index.js";
31
- import { default as default28, imageHeaderPositionLeft, imageHeaderPositionRight, imageHeaderVariantFull, imageHeaderVariantSplit } from "./components/ImageHeader/index.js";
32
- import { default as default29, aspectRatio16_9, aspectRatio1_1, aspectRatio21_9, aspectRatio32_9, aspectRatio3_4, aspectRatio48_9, horizontalAlignmentCenter, horizontalAlignmentLeft, horizontalAlignmentRight, objectFitContain, objectFitCover, objectFitNone, objectPositionCenter, objectPositionLeftBottom, objectPositionLeftCenter, objectPositionLeftTop, objectPositionRightBottom, objectPositionRightCenter, objectPositionRightTop } from "./components/Image/index.js";
33
- import { default as default30 } from "./components/IconSnippetList/index.js";
34
- import { default as default31, iconSnippetAlignCenter, iconSnippetAlignTop, iconSnippetPositionCenter, iconSnippetPositionLeft, iconSnippetSize3Xl, iconSnippetSizeLarge, iconSnippetSizeSmall } from "./components/IconSnippet/index.js";
35
- import { default as default32 } from "./components/IconLoader/index.js";
36
- import { default as default33, iconButtonShapeCircle, iconButtonShapeSquare } from "./components/IconButton/index.js";
37
- import { default as default34, iconSize6xl, iconSize7xl, iconSize8xl, iconSize9xl } from "./components/Icon/index.js";
38
- import { default as default35 } from "./components/HifiIcon/index.js";
39
- import { default as default36, headingAlignCenter, headingAlignLeft } from "./components/Heading/index.js";
40
- import { default as default37 } from "./components/GridItem/index.js";
41
- import { default as default38 } from "./components/Grid/index.js";
42
- import { default as default39 } from "./components/GoogleMap/index.js";
43
- import { default as default40, inputStatusIcons } from "./components/FormHelperStatusIcon/index.js";
44
- import { default as default41 } from "./components/FormHelperMessage/index.js";
45
- import { default as default42 } from "./components/FormHelperLabel/index.js";
46
- import { default as default43 } from "./components/FormElement/index.js";
47
- import { default as default44 } from "./components/Form/index.js";
48
- import { default as default45 } from "./components/FootnoteLink/index.js";
49
- import { default as default46 } from "./components/FootnoteContent/index.js";
50
- import { default as default47, flexItemAutoGrow, flexItemFullGrow } from "./components/FlexItem/index.js";
51
- import { default as default48 } from "./components/Flex/index.js";
52
- import { default as default49 } from "./components/FilterGroup/index.js";
53
- import { default as default50 } from "./components/Fieldset/index.js";
54
- import { default as default51 } from "./components/Divider/index.js";
55
- import { default as default52 } from "./components/DiscoveryCardGroup/index.js";
56
- import { default as default53, discoveryCardOrientationHorizontal, discoveryCardOrientationVertical } from "./components/DiscoveryCard/index.js";
57
- import { default as default54 } from "./components/Dialog/index.js";
58
- import { default as default55 } from "./components/DemoBox/index.js";
59
- import { default as default56 } from "./components/DateInput/index.js";
60
- import { default as default57, ContainerAppearanceColor } from "./components/Container/index.js";
61
- import { default as default58 } from "./components/ConsentMessage/index.js";
62
- import { default as default59 } from "./components/ColorSwatchGroup/index.js";
63
- import { default as default60, colorSwatchSizeMedium, colorSwatchSizeSmall } from "./components/ColorSwatch/index.js";
64
- import { default as default61 } from "./components/Collapsible/index.js";
65
- import { default as default62 } from "./components/CheckboxGroup/index.js";
66
- import { default as default63 } from "./components/Checkbox/index.js";
67
- import { default as default64 } from "./components/Carousel/index.js";
68
- import { default as default65 } from "./components/Card/index.js";
69
- import { default as default66 } from "./components/ButtonGroup/index.js";
70
- import { B } from "./index-hMlQuoyx.js";
71
- import { default as default67, buttonAutoWidth, buttonFullWidth } from "./components/Button/index.js";
72
- import { default as default68 } from "./components/BottomBar/index.js";
73
- import { default as default69, bodyAlignCenter, bodyAlignLeft, bodyAlignRight } from "./components/Body/index.js";
26
+ import { default as default23 } from "./components/Link/index.js";
27
+ import { default as default24 } from "./components/Legend/index.js";
28
+ import { default as default25 } from "./components/Label/index.js";
29
+ import { default as default26 } from "./components/Input/index.js";
30
+ import { default as default27 } from "./components/InlineLink/index.js";
31
+ import { default as default28 } from "./components/InlineIcon/index.js";
32
+ import { default as default29, imageHeaderPositionLeft, imageHeaderPositionRight, imageHeaderVariantFull, imageHeaderVariantSplit } from "./components/ImageHeader/index.js";
33
+ import { default as default30, aspectRatio16_9, aspectRatio1_1, aspectRatio21_9, aspectRatio32_9, aspectRatio3_4, aspectRatio48_9, horizontalAlignmentCenter, horizontalAlignmentLeft, horizontalAlignmentRight, objectFitContain, objectFitCover, objectFitNone, objectPositionCenter, objectPositionLeftBottom, objectPositionLeftCenter, objectPositionLeftTop, objectPositionRightBottom, objectPositionRightCenter, objectPositionRightTop } from "./components/Image/index.js";
34
+ import { default as default31 } from "./components/IconSnippetList/index.js";
35
+ import { default as default32, iconSnippetAlignCenter, iconSnippetAlignTop, iconSnippetPositionCenter, iconSnippetPositionLeft, iconSnippetSize3Xl, iconSnippetSizeLarge, iconSnippetSizeSmall } from "./components/IconSnippet/index.js";
36
+ import { default as default33 } from "./components/IconLoader/index.js";
37
+ import { default as default34, iconButtonShapeCircle, iconButtonShapeSquare } from "./components/IconButton/index.js";
38
+ import { default as default35, iconSize6xl, iconSize7xl, iconSize8xl, iconSize9xl } from "./components/Icon/index.js";
39
+ import { default as default36 } from "./components/HifiIcon/index.js";
40
+ import { default as default37, headingAlignCenter, headingAlignLeft } from "./components/Heading/index.js";
41
+ import { default as default38 } from "./components/GridItem/index.js";
42
+ import { default as default39 } from "./components/Grid/index.js";
43
+ import { default as default40 } from "./components/GoogleMap/index.js";
44
+ import { default as default41, inputStatusIcons } from "./components/FormHelperStatusIcon/index.js";
45
+ import { default as default42 } from "./components/FormHelperMessage/index.js";
46
+ import { default as default43 } from "./components/FormHelperLabel/index.js";
47
+ import { default as default44 } from "./components/FormElement/index.js";
48
+ import { default as default45 } from "./components/Form/index.js";
49
+ import { default as default46 } from "./components/FootnoteLink/index.js";
50
+ import { default as default47 } from "./components/FootnoteContent/index.js";
51
+ import { default as default48, flexItemAutoGrow, flexItemFullGrow } from "./components/FlexItem/index.js";
52
+ import { default as default49 } from "./components/Flex/index.js";
53
+ import { default as default50 } from "./components/FilterGroup/index.js";
54
+ import { default as default51 } from "./components/Fieldset/index.js";
55
+ import { default as default52 } from "./components/Divider/index.js";
56
+ import { default as default53 } from "./components/DiscoveryCardGroup/index.js";
57
+ import { default as default54, discoveryCardOrientationHorizontal, discoveryCardOrientationVertical } from "./components/DiscoveryCard/index.js";
58
+ import { default as default55 } from "./components/Dialog/index.js";
59
+ import { default as default56 } from "./components/DemoBox/index.js";
60
+ import { default as default57 } from "./components/DateInput/index.js";
61
+ import { default as default58, ContainerAppearanceColor } from "./components/Container/index.js";
62
+ import { default as default59 } from "./components/ConsentMessage/index.js";
63
+ import { default as default60 } from "./components/ColorSwatchGroup/index.js";
64
+ import { default as default61, colorSwatchSizeMedium, colorSwatchSizeSmall } from "./components/ColorSwatch/index.js";
65
+ import { default as default62 } from "./components/Collapsible/index.js";
66
+ import { default as default63 } from "./components/CheckboxGroup/index.js";
67
+ import { default as default64 } from "./components/Checkbox/index.js";
68
+ import { default as default65 } from "./components/Carousel/index.js";
69
+ import { default as default66 } from "./components/Card/index.js";
70
+ import { default as default67 } from "./components/ButtonGroup/index.js";
71
+ import { B } from "./index-hNV7tcRV.js";
72
+ import { default as default68, buttonAutoWidth, buttonFullWidth } from "./components/Button/index.js";
73
+ import { default as default69 } from "./components/BottomBar/index.js";
74
+ import { default as default70, bodyAlignCenter, bodyAlignLeft, bodyAlignRight } from "./components/Body/index.js";
74
75
  import { B as B2, a as a3 } from "./index-BdPmdY9v.js";
75
- import { default as default70 } from "./components/AccordionGroup/index.js";
76
- import { default as default71, accordionToggleCollapsed, accordionToggleCollapsing, accordionToggleExpanded } from "./components/Accordion/index.js";
76
+ import { default as default71 } from "./components/AccordionGroup/index.js";
77
+ import { default as default72, accordionToggleCollapsed, accordionToggleCollapsing, accordionToggleExpanded } from "./components/Accordion/index.js";
77
78
  import { getTextDecoration } from "./foundations/token/getTextDecoration/index.js";
78
79
  import { getTextColor } from "./foundations/token/getTextColor/index.js";
79
80
  import { getSpacing } from "./foundations/token/getSpacing/index.js";
@@ -98,7 +99,7 @@ import { u } from "./index-Cs0Hw0dj.js";
98
99
  import { checkThirdPartyConsentStorage, consentStorageFeature, consentStorageItemName, consentStorageKey, useThirdPartyConsent } from "./hooks/useThirdPartyConsent/index.js";
99
100
  import { useReducedMotion } from "./hooks/useReducedMotion/index.js";
100
101
  import { useMediaQuery } from "./hooks/useMediaQuery/index.js";
101
- import { LinkContext, useLinkComponent } from "./hooks/useLinkComponent/index.js";
102
+ import { DefaultLinkComponent, LinkContext, useLinkComponent } from "./hooks/useLinkComponent/index.js";
102
103
  import { useForcedColors } from "./hooks/useForcedColors/index.js";
103
104
  import { useFocusWithin } from "./hooks/useFocusWithin/index.js";
104
105
  import { a as a4, i } from "./props-DDpgcryb.js";
@@ -106,88 +107,96 @@ import { I, m as m2, f as f2, i as i2, g as g2, h, j, d as d2, c as c2, b as b2,
106
107
  import { e as e3, d as d3, c as c3, b as b3, f as f3, a as a6 } from "./styled-CPUu8mvT.js";
107
108
  import { C } from "./styled-DINwm57V.js";
108
109
  export {
109
- default71 as Accordion,
110
- default70 as AccordionGroup,
110
+ default72 as Accordion,
111
+ default71 as AccordionGroup,
111
112
  B2 as Badge,
112
113
  a3 as BadgeAppearanceColor,
113
- default69 as Body,
114
- default68 as BottomBar,
115
- default67 as Button,
114
+ default70 as Body,
115
+ default69 as BottomBar,
116
+ default68 as Button,
116
117
  B as ButtonAsLink,
117
- default66 as ButtonGroup,
118
- default65 as Card,
118
+ default67 as ButtonGroup,
119
+ default66 as Card,
119
120
  C as CardAppearanceColor,
120
- default64 as Carousel,
121
- default63 as Checkbox,
122
- default62 as CheckboxGroup,
123
- default61 as Collapsible,
124
- default60 as ColorSwatch,
125
- default59 as ColorSwatchGroup,
126
- default58 as ConsentMessage,
127
- default57 as Container,
121
+ default65 as Carousel,
122
+ default64 as Checkbox,
123
+ default63 as CheckboxGroup,
124
+ default62 as Collapsible,
125
+ default61 as ColorSwatch,
126
+ default60 as ColorSwatchGroup,
127
+ default59 as ConsentMessage,
128
+ default58 as Container,
128
129
  ContainerAppearanceColor,
129
- default56 as DateInput,
130
- default55 as DemoBox,
131
- default54 as Dialog,
132
- default53 as DiscoveryCard,
133
- default52 as DiscoveryCardGroup,
134
- default51 as Divider,
135
- default50 as Fieldset,
136
- default49 as FilterGroup,
137
- default48 as Flex,
138
- default47 as FlexItem,
139
- default46 as FootnoteContent,
140
- default45 as FootnoteLink,
141
- default44 as Form,
142
- default43 as FormElement,
143
- default42 as FormHelperLabel,
144
- default41 as FormHelperMessage,
145
- default40 as FormHelperStatusIcon,
130
+ default57 as DateInput,
131
+ DefaultLinkComponent,
132
+ default56 as DemoBox,
133
+ default55 as Dialog,
134
+ default54 as DiscoveryCard,
135
+ default53 as DiscoveryCardGroup,
136
+ default52 as Divider,
137
+ default51 as Fieldset,
138
+ default50 as FilterGroup,
139
+ default49 as Flex,
140
+ default48 as FlexItem,
141
+ default47 as FootnoteContent,
142
+ default46 as FootnoteLink,
143
+ default45 as Form,
144
+ default44 as FormElement,
145
+ default43 as FormHelperLabel,
146
+ default42 as FormHelperMessage,
147
+ default41 as FormHelperStatusIcon,
146
148
  GlobalStyle,
147
- default39 as GoogleMap,
148
- default38 as Grid,
149
- default37 as GridItem,
150
- default36 as Heading,
149
+ default40 as GoogleMap,
150
+ default39 as Grid,
151
+ default38 as GridItem,
152
+ default37 as Heading,
151
153
  HiddenRadioStyled,
152
- default35 as HifiIcon,
153
- default34 as Icon,
154
- default33 as IconButton,
155
- default32 as IconLoader,
156
- default31 as IconSnippet,
157
- default30 as IconSnippetList,
154
+ default36 as HifiIcon,
155
+ default35 as Icon,
156
+ default34 as IconButton,
157
+ default33 as IconLoader,
158
+ default32 as IconSnippet,
159
+ default31 as IconSnippetList,
158
160
  I as IconWithAccent,
159
- default29 as Image,
160
- default28 as ImageHeader,
161
- default27 as InlineIcon,
161
+ default30 as Image,
162
+ default29 as ImageHeader,
163
+ default28 as InlineIcon,
162
164
  m2 as InlineIconStyled,
163
- default26 as InlineLink,
164
- default25 as Input,
165
- default24 as Label,
166
- default23 as Legend,
167
- default22 as Link,
165
+ default27 as InlineLink,
166
+ default26 as Input,
167
+ default25 as Label,
168
+ default24 as Legend,
169
+ default23 as Link,
168
170
  L as LinkAsButton,
169
171
  LinkContext,
170
- default21 as LinkList,
171
- default20 as LinkListItem,
172
- default19 as LoadingSpinner,
173
- default18 as MediaText,
174
- default17 as Notification,
175
- default16 as Overlay,
176
- default15 as PickerGroup,
172
+ default22 as LinkList,
173
+ default21 as LinkListItem,
174
+ default20 as LoadingSpinner,
175
+ default19 as MediaText,
176
+ default18 as Notification,
177
+ default17 as Overlay,
178
+ PanelStyled,
179
+ default16 as PickerGroup,
177
180
  P as Price,
178
- default14 as ProductCard,
179
- default13 as RadioGroup,
180
- default12 as Rating,
181
- default11 as ResponsiveImage,
181
+ default15 as ProductCard,
182
+ default14 as RadioGroup,
183
+ default13 as Rating,
184
+ default12 as ResponsiveImage,
182
185
  R as RichText,
183
186
  S as ScreenreaderOnly,
184
- default10 as SearchInput,
185
- default9 as SelectInput,
187
+ default11 as SearchInput,
188
+ default10 as SelectInput,
186
189
  StarLabelStyled,
187
190
  StarsWrapperStyled,
188
- default8 as Stepper,
189
- default7 as SuggestInput,
190
- default6 as Switch,
191
+ default9 as Stepper,
192
+ default8 as SuggestInput,
193
+ default7 as Switch,
194
+ default6 as TabGroup,
195
+ TabGroupIndicatorStyled,
196
+ TabGroupTabsScrollableContainerStyled,
197
+ TabGroupTabsStyled,
198
+ TabLabelStyled,
199
+ TabStyled,
191
200
  T2 as TabularPrice,
192
201
  T as TextList,
193
202
  a as TextListItem,
@@ -316,6 +325,10 @@ export {
316
325
  d as priceSizeMd,
317
326
  b as priceSizeSm,
318
327
  reducedMotionQuery,
328
+ tabGroupWidthAuto,
329
+ tabGroupWidthFull,
330
+ tabOrientationHorizontal,
331
+ tabOrientationVertical,
319
332
  useFocusWithin,
320
333
  useForcedColors,
321
334
  useLinkComponent,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vodafone_de/brix-components",
3
3
  "description": "Brix is the digital design system for vodafone.de",
4
- "version": "7.0.9",
4
+ "version": "7.0.11",
5
5
  "exports": {
6
6
  "./package.json": "./package.json",
7
7
  ".": {