@inera/ids-react 9.2.2 → 9.3.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.
- package/components/accordion/accordion.js +1 -1
- package/components/alert/alert-base.js +2 -2
- package/components/breadcrumbs/breadcrumbs.js +6 -1
- package/components/button/button.d.ts +1 -0
- package/components/button/button.js +2 -2
- package/components/button/control-button.d.ts +6 -0
- package/components/button/control-button.js +9 -0
- package/components/carousel/carousel.js +1 -1
- package/components/dialog/dialog-base.js +1 -1
- package/components/form/checkbox/checkbox-base.js +2 -3
- package/components/form/checkbox/checkbox-group-base.d.ts +2 -1
- package/components/form/checkbox/checkbox-group-base.js +3 -3
- package/components/form/checkbox/checkbox-group.d.ts +2 -1
- package/components/form/checkbox/checkbox-group.js +2 -2
- package/components/form/checkbox/checkbox.js +3 -4
- package/components/form/datepicker/datepicker.d.ts +3 -1
- package/components/form/datepicker/datepicker.js +142 -110
- package/components/form/form-hooks/useInputValidity.d.ts +1 -1
- package/components/form/form-hooks/useInputValidity.js +28 -12
- package/components/form/form-props/form-props.d.ts +1 -0
- package/components/form/input/input-base.d.ts +4 -2
- package/components/form/input/input-base.js +14 -9
- package/components/form/input/input.d.ts +3 -0
- package/components/form/input/input.js +1 -1
- package/components/form/radio/radio-base.js +1 -2
- package/components/form/radio/radio-group-base.d.ts +2 -1
- package/components/form/radio/radio-group-base.js +3 -3
- package/components/form/radio/radio-group.d.ts +2 -1
- package/components/form/radio/radio-group.js +2 -2
- package/components/form/range/range-base.d.ts +1 -1
- package/components/form/range/range-base.js +2 -2
- package/components/form/select/select-base.d.ts +3 -3
- package/components/form/select/select-base.js +3 -5
- package/components/form/select/select.d.ts +2 -2
- package/components/form/select/select.js +1 -1
- package/components/form/select-multiple/select-multiple-base.d.ts +1 -1
- package/components/form/select-multiple/select-multiple-base.js +2 -2
- package/components/form/textarea/textarea-base.d.ts +1 -1
- package/components/form/textarea/textarea-base.js +3 -5
- package/components/form/textarea/textarea.js +1 -1
- package/components/form/time/time-base.d.ts +1 -1
- package/components/form/time/time-base.js +2 -4
- package/components/form/time/time.js +4 -5
- package/components/header-1177/header-1177-region-picker-base.d.ts +3 -1
- package/components/header-1177/header-1177-region-picker-base.js +8 -3
- package/components/header-1177/header-1177-region-picker-mobile-base.d.ts +3 -1
- package/components/header-1177/header-1177-region-picker-mobile-base.js +8 -3
- package/components/header-1177/header-1177-region-picker-mobile.d.ts +2 -0
- package/components/header-1177/header-1177-region-picker.d.ts +2 -0
- package/components/header-1177-pro/header-1177-pro-region-picker-base.d.ts +3 -1
- package/components/header-1177-pro/header-1177-pro-region-picker-base.js +8 -3
- package/components/header-1177-pro/header-1177-pro-region-picker-mobile-base.d.ts +3 -1
- package/components/header-1177-pro/header-1177-pro-region-picker-mobile-base.js +8 -3
- package/components/header-1177-pro/header-1177-pro-region-picker-mobile.d.ts +3 -1
- package/components/header-1177-pro/header-1177-pro-region-picker-mobile.js +1 -1
- package/components/header-1177-pro/header-1177-pro-region-picker.d.ts +3 -1
- package/components/header-1177-pro/header-1177-pro-region-picker.js +1 -1
- package/components/popover/popover-content.js +1 -1
- package/components/popover/popover.d.ts +2 -1
- package/components/popover/popover.js +28 -14
- package/components/puff-list/puff-list-item-header.d.ts +1 -1
- package/components/puff-list/puff-list-item.d.ts +2 -1
- package/components/puff-list/puff-list-item.js +2 -2
- package/components/side-panel/side-panel-base.js +3 -1
- package/components/stepper/step-base.d.ts +1 -1
- package/components/stepper/step-base.js +1 -1
- package/components/stepper/step.d.ts +1 -1
- package/components/stepper/step.js +2 -11
- package/components/tag/tag.js +8 -2
- package/components/tooltip/tooltip-base.d.ts +1 -3
- package/components/tooltip/tooltip-base.js +14 -10
- package/components/tooltip/tooltip.js +1 -41
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +4 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
|
|
4
|
-
function IDSHeader1177ProRegionPickerBase({ text = "Välj region", expanded, hide = false, children, client = false, onToggleRegion, ...props }) {
|
|
4
|
+
function IDSHeader1177ProRegionPickerBase({ text = "Välj region", ariaLabel = "Välj region", ariaControls, expanded, hide = false, children, client = false, onToggleRegion, ...props }) {
|
|
5
5
|
if (hide)
|
|
6
6
|
return null;
|
|
7
7
|
const toggleHandler = client && onToggleRegion
|
|
@@ -9,11 +9,16 @@ function IDSHeader1177ProRegionPickerBase({ text = "Välj region", expanded, hid
|
|
|
9
9
|
onClick: onToggleRegion
|
|
10
10
|
}
|
|
11
11
|
: {};
|
|
12
|
+
const ariaHandler = ariaControls
|
|
13
|
+
? {
|
|
14
|
+
"aria-controls": ariaControls
|
|
15
|
+
}
|
|
16
|
+
: {};
|
|
12
17
|
return (jsxs("div", { className: clsx("ids-header-1177-pro-region-picker", {
|
|
13
18
|
"ids-header-1177-pro-region-picker--selected-region": !!children
|
|
14
|
-
}), ...props, children: [jsx("div", { className: "ids-header-1177-pro-region-picker__region-icon", children: children }), jsx("div", { className: "ids-header-1177-pro-region-picker__selector", children: jsx("button", { type: "button", ...toggleHandler, className: clsx("ids-header-1177-pro-region-picker__button", {
|
|
19
|
+
}), ...props, children: [jsx("div", { className: "ids-header-1177-pro-region-picker__region-icon", children: children }), jsx("div", { className: "ids-header-1177-pro-region-picker__selector", children: jsx("button", { type: "button", ...toggleHandler, ...ariaHandler, className: clsx("ids-header-1177-pro-region-picker__button", {
|
|
15
20
|
"ids-header-1177-pro-region-picker__button--expanded": expanded
|
|
16
|
-
}), "aria-label":
|
|
21
|
+
}), "aria-expanded": expanded ? "true" : "false", "aria-label": ariaLabel, children: text }) })] }));
|
|
17
22
|
}
|
|
18
23
|
IDSHeader1177ProRegionPickerBase.displayName = "IDSHeader1177ProRegionPickerBase";
|
|
19
24
|
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { HTMLAttributes } from "react";
|
|
2
2
|
export interface IDSHeader1177ProRegionPickerMobileBaseProps extends HTMLAttributes<HTMLElement> {
|
|
3
3
|
text?: string;
|
|
4
|
+
ariaControls?: string;
|
|
5
|
+
ariaLabel?: string;
|
|
4
6
|
expanded?: boolean;
|
|
5
7
|
hide?: boolean;
|
|
6
8
|
client?: boolean;
|
|
7
9
|
unresponsive?: boolean;
|
|
8
10
|
onToggleRegion?: () => void;
|
|
9
11
|
}
|
|
10
|
-
export declare function IDSHeader1177ProRegionPickerMobileBase({ text, expanded, children, hide, client, unresponsive, onToggleRegion, ...props }: IDSHeader1177ProRegionPickerMobileBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function IDSHeader1177ProRegionPickerMobileBase({ text, ariaLabel, ariaControls, expanded, children, hide, client, unresponsive, onToggleRegion, ...props }: IDSHeader1177ProRegionPickerMobileBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
11
13
|
export declare namespace IDSHeader1177ProRegionPickerMobileBase {
|
|
12
14
|
var displayName: string;
|
|
13
15
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
|
|
4
|
-
function IDSHeader1177ProRegionPickerMobileBase({ text = "Välj region", expanded, children, hide = false, client = false, unresponsive = false, onToggleRegion, ...props }) {
|
|
4
|
+
function IDSHeader1177ProRegionPickerMobileBase({ text = "Välj region", ariaLabel = "Välj region", ariaControls, expanded, children, hide = false, client = false, unresponsive = false, onToggleRegion, ...props }) {
|
|
5
5
|
if (hide)
|
|
6
6
|
return null;
|
|
7
7
|
const toggleHandler = client && onToggleRegion
|
|
@@ -9,12 +9,17 @@ function IDSHeader1177ProRegionPickerMobileBase({ text = "Välj region", expande
|
|
|
9
9
|
onClick: onToggleRegion
|
|
10
10
|
}
|
|
11
11
|
: {};
|
|
12
|
+
const ariaHandler = ariaControls
|
|
13
|
+
? {
|
|
14
|
+
"aria-controls": ariaControls
|
|
15
|
+
}
|
|
16
|
+
: {};
|
|
12
17
|
return (jsx("div", { className: clsx("ids-header-1177-pro-region-picker-mobile", {
|
|
13
18
|
"ids-header-1177-pro-region-picker-mobile--selected-region": !!children,
|
|
14
19
|
"ids-header-1177-pro-region-picker-mobile--unresponsive": unresponsive
|
|
15
|
-
}), ...props, children: jsxs("button", { ...toggleHandler, className: clsx("ids-header-1177-pro-region-picker-mobile__button", {
|
|
20
|
+
}), ...props, children: jsxs("button", { ...toggleHandler, ...ariaHandler, className: clsx("ids-header-1177-pro-region-picker-mobile__button", {
|
|
16
21
|
"ids-header-1177-pro-region-picker-mobile__button--expanded": expanded
|
|
17
|
-
}), "aria-label":
|
|
22
|
+
}), "aria-expanded": expanded ? "true" : "false", "aria-label": ariaLabel, children: [jsx("div", { className: "ids-header-1177-pro-region-picker-mobile__region-icon", children: children }), jsx("span", { className: "ids-header-1177-pro-region-picker-mobile__button-text", children: text })] }) }));
|
|
18
23
|
}
|
|
19
24
|
IDSHeader1177ProRegionPickerMobileBase.displayName = "IDSHeader1177ProRegionPickerMobileBase";
|
|
20
25
|
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { HTMLAttributes } from "react";
|
|
2
2
|
export interface IDSHeader1177ProRegionPickerMobileProps extends HTMLAttributes<HTMLElement> {
|
|
3
3
|
text?: string;
|
|
4
|
+
ariaControls?: string;
|
|
5
|
+
ariaLabel?: string;
|
|
4
6
|
expanded?: boolean;
|
|
5
7
|
onToggleRegion?: (isExpanded: boolean) => void;
|
|
6
8
|
}
|
|
7
|
-
export declare function IDSHeader1177ProRegionPickerMobile({
|
|
9
|
+
export declare function IDSHeader1177ProRegionPickerMobile({ expanded, onToggleRegion, children, ...props }: IDSHeader1177ProRegionPickerMobileProps): import("react/jsx-runtime").JSX.Element;
|
|
8
10
|
export declare namespace IDSHeader1177ProRegionPickerMobile {
|
|
9
11
|
var displayName: string;
|
|
10
12
|
}
|
|
@@ -4,7 +4,7 @@ import { useState } from 'react';
|
|
|
4
4
|
import { useHeaderContext } from '../utils/contexts/HeaderContext.js';
|
|
5
5
|
import { IDSHeader1177ProRegionPickerMobileBase } from './header-1177-pro-region-picker-mobile-base.js';
|
|
6
6
|
|
|
7
|
-
function IDSHeader1177ProRegionPickerMobile({
|
|
7
|
+
function IDSHeader1177ProRegionPickerMobile({ expanded = false, onToggleRegion, children, ...props }) {
|
|
8
8
|
const [isExpanded, setIsExpanded] = useState(expanded);
|
|
9
9
|
const headerContext = useHeaderContext();
|
|
10
10
|
if (headerContext?.hideRegionPicker)
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { HTMLAttributes } from "react";
|
|
2
2
|
export interface IDSHeader1177ProRegionPickerProps extends HTMLAttributes<HTMLElement> {
|
|
3
3
|
text?: string;
|
|
4
|
+
ariaControls?: string;
|
|
5
|
+
ariaLabel?: string;
|
|
4
6
|
expanded?: boolean;
|
|
5
7
|
onToggleRegion?: (isExpanded: boolean) => void;
|
|
6
8
|
}
|
|
7
|
-
export declare function IDSHeader1177ProRegionPicker({
|
|
9
|
+
export declare function IDSHeader1177ProRegionPicker({ expanded, onToggleRegion, children, ...props }: IDSHeader1177ProRegionPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
8
10
|
export declare namespace IDSHeader1177ProRegionPicker {
|
|
9
11
|
var displayName: string;
|
|
10
12
|
}
|
|
@@ -4,7 +4,7 @@ import { useState } from 'react';
|
|
|
4
4
|
import { IDSHeader1177ProRegionPickerBase } from './header-1177-pro-region-picker-base.js';
|
|
5
5
|
import { useHeaderContext } from '../utils/contexts/HeaderContext.js';
|
|
6
6
|
|
|
7
|
-
function IDSHeader1177ProRegionPicker({
|
|
7
|
+
function IDSHeader1177ProRegionPicker({ expanded = false, onToggleRegion, children, ...props }) {
|
|
8
8
|
const [isExpanded, setIsExpanded] = useState(expanded);
|
|
9
9
|
const headerContext = useHeaderContext();
|
|
10
10
|
if (headerContext?.hideRegionPicker)
|
|
@@ -9,7 +9,7 @@ function IDSPopoverContent({ position = "bottom", caretPosition = "bottom", srCl
|
|
|
9
9
|
const renderCaret = (pos) => (jsxs("div", { className: `ids-popover-content__caret ids-popover-content__caret--${pos}`, children: [jsx("span", { className: `ids-popover-content__caret-body ids-popover-content__caret--${pos}` }), jsx("span", { className: `ids-popover-content__caret-border ids-popover-content__caret--${pos}` }), jsx("span", { className: `ids-popover-content__caret-shadow ids-popover-content__caret--${pos}` })] }));
|
|
10
10
|
return (jsxs("div", { ref: contentRef, style: style, className: clsx("ids-popover-content", `ids-popover-content--${position}`, {
|
|
11
11
|
"ids-focus-trap": !noFocusTrap
|
|
12
|
-
}), role: "tooltip", id: contentId, "data-position": position, children: [renderCaret(caretPosition), jsx("div", { className: "ids-popover-content__close-btn-wrapper", children: jsx("button", {
|
|
12
|
+
}), role: "tooltip", id: contentId, "data-position": position, children: [renderCaret(caretPosition), jsx("div", { className: "ids-popover-content__close-btn-wrapper", children: jsx("button", { className: "ids-popover-content__close-btn", "aria-label": srCloseText, ...closeHandler, ref: closeButtonRef }) }), jsx("div", { ref: scrollAreaRef, className: "ids-popover-content__content-wrapper", tabIndex: noScrollAreaFocus ? -1 : 0, style: contentScrollAreaStyle, children: jsxs("div", { className: "ids-popover-content__content-wrapper-inner", children: [!!headline && jsx("div", { className: "ids-popover-content__headline", children: headline }), children] }) })] }));
|
|
13
13
|
}
|
|
14
14
|
IDSPopoverContent.displayName = "IDSPopoverContent";
|
|
15
15
|
|
|
@@ -10,12 +10,13 @@ interface IDSPopoverProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
10
10
|
noFocusTrap?: boolean;
|
|
11
11
|
autoFocus?: boolean;
|
|
12
12
|
srCloseText?: string;
|
|
13
|
+
zIndex?: number;
|
|
13
14
|
noScrollAreaFocus?: boolean;
|
|
14
15
|
onVisibilityChange?: (isVisible: boolean) => void;
|
|
15
16
|
headline?: React.ReactNode;
|
|
16
17
|
children?: React.ReactNode;
|
|
17
18
|
}
|
|
18
|
-
export declare function IDSPopover({ position, category, trigger, maxWidth, maxHeight, show, noFocusTrap, autoFocus, noScrollAreaFocus, srCloseText, headline, children, className, onVisibilityChange, ...props }: IDSPopoverProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function IDSPopover({ position, category, trigger, maxWidth, maxHeight, show, noFocusTrap, autoFocus, noScrollAreaFocus, srCloseText, zIndex, headline, children, className, onVisibilityChange, ...props }: IDSPopoverProps): import("react/jsx-runtime").JSX.Element;
|
|
19
20
|
export declare namespace IDSPopover {
|
|
20
21
|
var displayName: string;
|
|
21
22
|
}
|
|
@@ -7,7 +7,7 @@ import { useFocusTrap } from '../utils/hooks/useFocusTrap.js';
|
|
|
7
7
|
import { IDSPopoverContent } from './popover-content.js';
|
|
8
8
|
import { useEsc } from '../utils/hooks/useEsc.js';
|
|
9
9
|
|
|
10
|
-
function IDSPopover({ position = "bottom", category = "", trigger, maxWidth = 260, maxHeight = 260, show = false, noFocusTrap = false, autoFocus = false, noScrollAreaFocus = false, srCloseText = "Stäng", headline, children, className, onVisibilityChange, ...props }) {
|
|
10
|
+
function IDSPopover({ position = "bottom", category = "", trigger, maxWidth = 260, maxHeight = 260, show = false, noFocusTrap = false, autoFocus = false, noScrollAreaFocus = false, srCloseText = "Stäng", zIndex = 9999, headline, children, className, onVisibilityChange, ...props }) {
|
|
11
11
|
const popoverRef = useRef(null);
|
|
12
12
|
const triggerRef = useRef(null);
|
|
13
13
|
const contentRef = useRef(null);
|
|
@@ -34,11 +34,6 @@ function IDSPopover({ position = "bottom", category = "", trigger, maxWidth = 26
|
|
|
34
34
|
setTimeout(() => requestAnimationFrame(() => setReady(true)), 100);
|
|
35
35
|
}
|
|
36
36
|
}, [isExpanded]);
|
|
37
|
-
useLayoutEffect(() => {
|
|
38
|
-
if (!ready)
|
|
39
|
-
return;
|
|
40
|
-
requestAnimationFrame(() => updatePosition());
|
|
41
|
-
}, [ready]);
|
|
42
37
|
const handleVisibilityChange = (visible) => {
|
|
43
38
|
setIsExpanded(visible);
|
|
44
39
|
onVisibilityChange?.(visible);
|
|
@@ -161,16 +156,35 @@ function IDSPopover({ position = "bottom", category = "", trigger, maxWidth = 26
|
|
|
161
156
|
});
|
|
162
157
|
}, [position]);
|
|
163
158
|
useLayoutEffect(() => {
|
|
164
|
-
if (!
|
|
159
|
+
if (!ready)
|
|
165
160
|
return;
|
|
166
|
-
updatePosition();
|
|
167
|
-
|
|
168
|
-
|
|
161
|
+
requestAnimationFrame(() => updatePosition());
|
|
162
|
+
}, [ready, updatePosition]);
|
|
163
|
+
useLayoutEffect(() => {
|
|
164
|
+
if (!isExpanded)
|
|
165
|
+
return;
|
|
166
|
+
const update = () => {
|
|
167
|
+
requestAnimationFrame(updatePosition);
|
|
168
|
+
};
|
|
169
|
+
update();
|
|
170
|
+
const observer = new ResizeObserver(update);
|
|
171
|
+
if (triggerRef.current)
|
|
172
|
+
observer.observe(triggerRef.current);
|
|
173
|
+
if (contentRef.current)
|
|
174
|
+
observer.observe(contentRef.current);
|
|
175
|
+
observer.observe(document.documentElement);
|
|
176
|
+
window.addEventListener("resize", update);
|
|
177
|
+
window.addEventListener("scroll", update, true);
|
|
178
|
+
window.visualViewport?.addEventListener("resize", update);
|
|
179
|
+
window.visualViewport?.addEventListener("scroll", update);
|
|
169
180
|
return () => {
|
|
170
|
-
|
|
171
|
-
window.removeEventListener("
|
|
181
|
+
observer.disconnect();
|
|
182
|
+
window.removeEventListener("resize", update);
|
|
183
|
+
window.removeEventListener("scroll", update, true);
|
|
184
|
+
window.visualViewport?.removeEventListener("resize", update);
|
|
185
|
+
window.visualViewport?.removeEventListener("scroll", update);
|
|
172
186
|
};
|
|
173
|
-
}, [isExpanded,
|
|
187
|
+
}, [isExpanded, updatePosition]);
|
|
174
188
|
return (jsxs("span", { "data-popover-category": category, ref: popoverRef, children: [jsx(IDSPopoverBase, { ...props, client: true, expanded: isExpanded, triggerRef: triggerRef, togglePopover: togglePopover, handleKeyPress: handleKeyPress, trigger: trigger, className: className }), mounted &&
|
|
175
189
|
isExpanded &&
|
|
176
190
|
createPortal(jsx(IDSPopoverContent, { client: true, headline: headline, contentRef: contentRef, scrollAreaRef: scrollAreaRef, noScrollAreaFocus: noScrollAreaFocus, caretPosition: position, srCloseText: srCloseText, closeButtonRef: closeButtonRef, closePopover: closePopover, contentScrollAreaStyle: {
|
|
@@ -181,7 +195,7 @@ function IDSPopover({ position = "bottom", category = "", trigger, maxWidth = 26
|
|
|
181
195
|
position: "absolute",
|
|
182
196
|
top: coords.top,
|
|
183
197
|
left: coords.left,
|
|
184
|
-
zIndex:
|
|
198
|
+
zIndex: zIndex
|
|
185
199
|
}, children: children }), document.body)] }));
|
|
186
200
|
}
|
|
187
201
|
IDSPopover.displayName = "IDSPopover";
|
|
@@ -9,8 +9,9 @@ export interface IDSPuffListItemProps extends React.HTMLAttributes<HTMLElement>
|
|
|
9
9
|
lean?: boolean;
|
|
10
10
|
dateLabel?: ReactNode;
|
|
11
11
|
extra?: ReactNode;
|
|
12
|
+
noListItem?: boolean;
|
|
12
13
|
}
|
|
13
|
-
export declare function IDSPuffListItem({ header, itemLink, date, dateTo, noContent, lean, dateLabel, extra, className, children, ...props }: IDSPuffListItemProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function IDSPuffListItem({ header, itemLink, date, dateTo, noContent, lean, dateLabel, extra, noListItem, className, children, ...props }: IDSPuffListItemProps): import("react/jsx-runtime").JSX.Element;
|
|
14
15
|
export declare namespace IDSPuffListItem {
|
|
15
16
|
var displayName: string;
|
|
16
17
|
}
|
|
@@ -3,8 +3,8 @@ import { isValidElement, cloneElement } from 'react';
|
|
|
3
3
|
import clsx from 'clsx';
|
|
4
4
|
import '@inera/ids-design/components/puff-list/puff-list.css';
|
|
5
5
|
|
|
6
|
-
function IDSPuffListItem({ header, itemLink, date, dateTo, noContent = false, lean = false, dateLabel, extra, className, children, ...props }) {
|
|
7
|
-
const Tag = lean ? "div" : "li";
|
|
6
|
+
function IDSPuffListItem({ header, itemLink, date, dateTo, noContent = false, lean = false, dateLabel, extra, noListItem, className, children, ...props }) {
|
|
7
|
+
const Tag = noListItem || lean ? "div" : "li";
|
|
8
8
|
const content = (jsxs("div", { className: "ids-puff-list-item__inner", children: [dateLabel && jsx("div", { className: "ids-puff-list-item__date-label", children: dateLabel }), jsxs("div", { className: "ids-puff-list-item__content-wrapper", children: [jsxs("div", { className: "ids-puff-list-item__content", children: [!!date && date, !!date && !!dateTo && (jsxs(Fragment, { children: [jsx("span", { className: "ids-puff-list-item__date-spacer", children: "\u2015" }), dateTo] })), jsx("div", { className: "ids-puff-list-item-header", children: header }), !noContent && jsx("div", { className: "ids-puff-list-item__body", children: children })] }), extra && jsx("div", { className: "ids-puff-list-item__extra-content", children: extra })] })] }));
|
|
9
9
|
const wrappedContent = itemLink && isValidElement(itemLink)
|
|
10
10
|
? cloneElement(itemLink, {
|
|
@@ -30,7 +30,9 @@ const IDSSidePanelBase = forwardRef(({ visible = false, left = false, elevated =
|
|
|
30
30
|
return null;
|
|
31
31
|
};
|
|
32
32
|
const renderContent = () => (jsxs("div", { className: "ids-side-panel__content", tabIndex: noScrollAreaFocus ? -1 : 0, children: [jsxs("div", { className: "ids-side-panel__inner", children: [headline, children] }), renderFooter()] }));
|
|
33
|
-
return (jsx("div", { className: classNames, ref: ref, ...props, children: jsxs("div", { className: "ids-side-panel__panel",
|
|
33
|
+
return (jsx("div", { className: classNames, ref: ref, ...props, children: jsxs("div", { className: clsx("ids-side-panel__panel", {
|
|
34
|
+
"ids-side-panel__panel--no-close-button": noCloseButton
|
|
35
|
+
}), children: [!noCloseButton && (jsx("div", { className: "ids-side-panel__actions", children: menu ? (jsx("button", { "aria-label": visible ? srClose : srOpen, className: "ids-side-panel__hamburger", "aria-expanded": visible, ...toggleHandler, ref: hamburgerRef, children: jsx("div", { className: "ids-hamburger", children: jsx("div", { className: "ids-hamburger__lines" }) }) })) : (jsx("button", { "aria-label": srClose, "aria-expanded": visible, className: "ids-side-panel__close-button", ...closeHandler })) })), renderContent()] }) }));
|
|
34
36
|
});
|
|
35
37
|
IDSSidePanelBase.displayName = "IDSSidePanelBase";
|
|
36
38
|
|
|
@@ -12,4 +12,4 @@ export interface IDSStepBaseProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
12
12
|
onToggleStep?: (step: string, expanded: boolean) => void;
|
|
13
13
|
client?: boolean;
|
|
14
14
|
}
|
|
15
|
-
export declare const IDSStepBase: React.ForwardRefExoticComponent<IDSStepBaseProps & React.RefAttributes<
|
|
15
|
+
export declare const IDSStepBase: React.ForwardRefExoticComponent<IDSStepBaseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -23,7 +23,7 @@ const IDSStepBase = forwardRef(({ state = "", headline, label = "", stepNumber =
|
|
|
23
23
|
onKeyDown: handleKeyPress
|
|
24
24
|
}
|
|
25
25
|
: {};
|
|
26
|
-
return (jsxs("div", { className: clsx("ids-step", className), ...props, children: [jsx("
|
|
26
|
+
return (jsxs("div", { className: clsx("ids-step", className), ...props, children: [jsx("button", { ref: ref, type: "button", disabled: disabled, className: clsx("ids-step__button", {
|
|
27
27
|
"ids-step__button--disabled": disabled
|
|
28
28
|
}), "aria-expanded": expanded, ...toggleHandlers, children: jsxs("div", { className: "ids-step__button-inner", children: [jsx("div", { className: "ids-step__indicator-wrapper", children: jsx("div", { "aria-label": srIndicatorText || stepNumber, role: "img", className: `ids-step__indicator ids-step__indicator--${state}`, children: renderStepIndicator() }) }), jsxs("div", { className: "ids-step__button-text", children: [jsxs("div", { className: "ids-step__headline-label", children: [headline && jsx("div", { className: "ids-step__headline", children: headline }), label && jsx("div", { className: "ids-step__subtitle", children: label })] }), jsx("div", { className: clsx("ids-step__chevron", {
|
|
29
29
|
"ids-step__chevron--expanded": expanded
|
|
@@ -12,4 +12,4 @@ export interface IDSStepProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
12
12
|
onExpanded?: () => void;
|
|
13
13
|
onClosed?: () => void;
|
|
14
14
|
}
|
|
15
|
-
export declare const IDSStep: React.ForwardRefExoticComponent<IDSStepProps & React.RefAttributes<
|
|
15
|
+
export declare const IDSStep: React.ForwardRefExoticComponent<IDSStepProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import
|
|
3
|
+
import { forwardRef, useState, useEffect } from 'react';
|
|
4
4
|
import { IDSStepBase } from './step-base.js';
|
|
5
5
|
|
|
6
6
|
const IDSStep = forwardRef(({ state = "", headline, label, stepNumber = "", srIndicatorText = "", expanded = false, disabled = false, onToggleStep, onExpanded, onClosed, className, ...props }, ref) => {
|
|
7
7
|
const [isExpanded, setIsExpanded] = useState(expanded);
|
|
8
|
-
const stepRef = React.useRef(null);
|
|
9
8
|
useEffect(() => {
|
|
10
9
|
setIsExpanded(expanded);
|
|
11
10
|
}, [expanded]);
|
|
12
|
-
// Merge forwarded + local ref
|
|
13
|
-
const mergedRef = (node) => {
|
|
14
|
-
stepRef.current = node;
|
|
15
|
-
if (typeof ref === "function")
|
|
16
|
-
ref(node);
|
|
17
|
-
else if (ref)
|
|
18
|
-
ref.current = node;
|
|
19
|
-
};
|
|
20
11
|
const handleToggleStep = () => {
|
|
21
12
|
if (disabled)
|
|
22
13
|
return;
|
|
@@ -27,7 +18,7 @@ const IDSStep = forwardRef(({ state = "", headline, label, stepNumber = "", srIn
|
|
|
27
18
|
return next;
|
|
28
19
|
});
|
|
29
20
|
};
|
|
30
|
-
return (jsx(IDSStepBase, { client: true, ref:
|
|
21
|
+
return (jsx(IDSStepBase, { client: true, ref: ref, state: state, headline: headline, label: label, stepNumber: stepNumber, srIndicatorText: srIndicatorText, expanded: isExpanded, disabled: disabled, onToggleStep: handleToggleStep, className: className, ...props }));
|
|
31
22
|
});
|
|
32
23
|
IDSStep.displayName = "IDSStep";
|
|
33
24
|
|
package/components/tag/tag.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, memo } from 'react';
|
|
2
|
+
import { forwardRef, isValidElement, cloneElement, memo } from 'react';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
4
|
import '@inera/ids-design/components/tag/tag.css';
|
|
5
5
|
|
|
6
6
|
const IDSTagMemo = forwardRef(({ clickable, closeButton, className, children, ...props }, ref) => {
|
|
7
|
-
|
|
7
|
+
// TODO remove ids-tag__close-btn and let the user supply a IDSControlButton in 10.0
|
|
8
|
+
const closeButtonElement = isValidElement(closeButton)
|
|
9
|
+
? cloneElement(closeButton, {
|
|
10
|
+
className: clsx("ids-tag__close-btn", closeButton.props.className)
|
|
11
|
+
})
|
|
12
|
+
: closeButton;
|
|
13
|
+
return (jsx("span", { ref: ref, ...props, className: clsx("ids-tag", { "ids-tag--clickable": clickable }, className), children: jsxs("div", { className: "ids-tag__content", children: [children, !!closeButton && closeButtonElement] }) }));
|
|
8
14
|
});
|
|
9
15
|
IDSTagMemo.displayName = "IDSTag";
|
|
10
16
|
const IDSTag = memo(IDSTagMemo);
|
|
@@ -7,12 +7,10 @@ export interface IDSTooltipBaseProps extends React.HTMLAttributes<HTMLSpanElemen
|
|
|
7
7
|
translateX?: string;
|
|
8
8
|
translateY?: string;
|
|
9
9
|
trigger: ReactNode;
|
|
10
|
-
triggerIsIcon?: boolean;
|
|
11
10
|
triggerRef?: React.Ref<HTMLSpanElement>;
|
|
12
11
|
tooltipContentRef?: React.Ref<HTMLSpanElement>;
|
|
13
|
-
isHidden?: boolean;
|
|
14
12
|
}
|
|
15
|
-
export declare function IDSTooltipBase({ position, maxWidth, translateX, translateY, trigger,
|
|
13
|
+
export declare function IDSTooltipBase({ position, maxWidth, translateX, translateY, trigger, triggerRef, tooltipContentRef, className, children, ...props }: IDSTooltipBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
16
14
|
export declare namespace IDSTooltipBase {
|
|
17
15
|
var displayName: string;
|
|
18
16
|
}
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useId } from 'react';
|
|
2
|
+
import { useId, isValidElement, cloneElement } from 'react';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
4
|
import '@inera/ids-design/components/tooltip/tooltip.css';
|
|
5
5
|
|
|
6
|
-
function IDSTooltipBase({ position = "top", maxWidth = "20rem", translateX = position === "top" || position === "bottom" ? "-50%" : "0", translateY = position.includes("top") ? "-100%" : "100%", trigger,
|
|
6
|
+
function IDSTooltipBase({ position = "top", maxWidth = "20rem", translateX = position === "top" || position === "bottom" ? "-50%" : "0", translateY = position.includes("top") ? "-100%" : "100%", trigger, triggerRef, tooltipContentRef, className, children, ...props }) {
|
|
7
7
|
const tooltipId = `tooltip-${useId()}`;
|
|
8
|
-
const ariaHandler =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
const ariaHandler = {
|
|
9
|
+
"aria-describedby": tooltipId
|
|
10
|
+
};
|
|
11
|
+
const triggerElement = isValidElement(trigger)
|
|
12
|
+
? (() => {
|
|
13
|
+
const element = trigger;
|
|
14
|
+
return cloneElement(element, {
|
|
15
|
+
"aria-describedby": clsx(element.props["aria-describedby"], tooltipId)
|
|
16
|
+
});
|
|
17
|
+
})()
|
|
18
|
+
: trigger;
|
|
19
|
+
return (jsxs("span", { className: clsx("ids-tooltip", className), ...props, children: [jsx("span", { className: "ids-tooltip__trigger", ...(!isValidElement(trigger) ? ariaHandler : {}), ref: triggerRef, children: triggerElement }), jsx("span", { className: clsx("ids-tooltip__content", `ids-tooltip__content--${position}`), ref: tooltipContentRef, role: "tooltip", id: tooltipId, style: { transform: `translate(${translateX}, ${translateY})`, maxWidth }, children: children })] }));
|
|
16
20
|
}
|
|
17
21
|
IDSTooltipBase.displayName = "IDSTooltipBase";
|
|
18
22
|
|
|
@@ -5,17 +5,9 @@ import { IDSTooltipBase } from './tooltip-base.js';
|
|
|
5
5
|
|
|
6
6
|
function IDSTooltip({ position = "top", maxWidth, trigger, className, ...props }) {
|
|
7
7
|
const [internalMaxWidth, setInternalMaxWidth] = useState(maxWidth);
|
|
8
|
-
const [triggerIsIcon, setTriggerIsIcon] = useState(false);
|
|
9
|
-
const [isVisible, setIsVisible] = useState(false);
|
|
10
8
|
const tooltipContentRef = useRef(null);
|
|
11
9
|
const triggerRef = useRef(null);
|
|
12
10
|
const hasUpdatedMaxWidthRef = useRef(false);
|
|
13
|
-
const getFirstFocusableContent = () => {
|
|
14
|
-
const wrapper = triggerRef.current?.parentElement;
|
|
15
|
-
if (!wrapper)
|
|
16
|
-
return null;
|
|
17
|
-
return wrapper.querySelector('ids-button button, button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
|
18
|
-
};
|
|
19
11
|
const handleXOverflow = () => {
|
|
20
12
|
const tooltipContent = tooltipContentRef.current;
|
|
21
13
|
const trigger = triggerRef.current;
|
|
@@ -56,15 +48,6 @@ function IDSTooltip({ position = "top", maxWidth, trigger, className, ...props }
|
|
|
56
48
|
document.activeElement?.blur();
|
|
57
49
|
}
|
|
58
50
|
};
|
|
59
|
-
useEffect(() => {
|
|
60
|
-
const tooltipContent = tooltipContentRef.current;
|
|
61
|
-
if (!tooltipContent)
|
|
62
|
-
return;
|
|
63
|
-
const focusable = getFirstFocusableContent();
|
|
64
|
-
if (focusable) {
|
|
65
|
-
setTriggerIsIcon(!!triggerRef.current?.querySelector('[class^="ids-icon-"]'));
|
|
66
|
-
}
|
|
67
|
-
}, []);
|
|
68
51
|
useEffect(() => {
|
|
69
52
|
const tooltipContent = tooltipContentRef.current;
|
|
70
53
|
if (!tooltipContent)
|
|
@@ -94,30 +77,7 @@ function IDSTooltip({ position = "top", maxWidth, trigger, className, ...props }
|
|
|
94
77
|
triggerWrapper.removeEventListener("focusin", handleXOverflow);
|
|
95
78
|
};
|
|
96
79
|
}, [triggerRef]);
|
|
97
|
-
|
|
98
|
-
const tooltip = tooltipContentRef.current;
|
|
99
|
-
if (!tooltip)
|
|
100
|
-
return false;
|
|
101
|
-
const style = getComputedStyle(tooltip);
|
|
102
|
-
return style.visibility !== "hidden" && style.display !== "none" && style.opacity !== "0";
|
|
103
|
-
};
|
|
104
|
-
useEffect(() => {
|
|
105
|
-
const triggerEl = triggerRef.current;
|
|
106
|
-
if (!triggerEl)
|
|
107
|
-
return;
|
|
108
|
-
const updateVisibility = () => setIsVisible(isTooltipVisible());
|
|
109
|
-
triggerEl.addEventListener("mouseenter", updateVisibility);
|
|
110
|
-
triggerEl.addEventListener("mouseleave", updateVisibility);
|
|
111
|
-
triggerEl.addEventListener("focusin", updateVisibility); // <-- replaces focus
|
|
112
|
-
triggerEl.addEventListener("focusout", updateVisibility); // <-- replaces blur
|
|
113
|
-
return () => {
|
|
114
|
-
triggerEl.removeEventListener("mouseenter", updateVisibility);
|
|
115
|
-
triggerEl.removeEventListener("mouseleave", updateVisibility);
|
|
116
|
-
triggerEl.removeEventListener("focusin", updateVisibility);
|
|
117
|
-
triggerEl.removeEventListener("focusout", updateVisibility);
|
|
118
|
-
};
|
|
119
|
-
}, [triggerRef.current]);
|
|
120
|
-
return (jsx(IDSTooltipBase, { ...props, position: position, maxWidth: internalMaxWidth, trigger: trigger, triggerIsIcon: triggerIsIcon, className: className, triggerRef: triggerRef, isHidden: !isVisible, tooltipContentRef: tooltipContentRef }));
|
|
80
|
+
return (jsx(IDSTooltipBase, { ...props, position: position, maxWidth: internalMaxWidth, trigger: trigger, className: className, triggerRef: triggerRef, tooltipContentRef: tooltipContentRef }));
|
|
121
81
|
}
|
|
122
82
|
IDSTooltip.displayName = "IDSTooltip";
|
|
123
83
|
|
package/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export * from "./components/form/toggle/toggle";
|
|
|
27
27
|
export * from "./components/form/darkmode-toggle/darkmode-toggle";
|
|
28
28
|
export * from "./components/form/spinner/spinner";
|
|
29
29
|
export * from "./components/button/button";
|
|
30
|
+
export * from "./components/button/control-button";
|
|
30
31
|
export * from "./components/button/button-group";
|
|
31
32
|
export * from "./components/grid/container";
|
|
32
33
|
export * from "./components/grid/row";
|
package/index.js
CHANGED
|
@@ -27,6 +27,7 @@ export { IDSToggle } from './components/form/toggle/toggle.js';
|
|
|
27
27
|
export { IDSDarkmodeToggle } from './components/form/darkmode-toggle/darkmode-toggle.js';
|
|
28
28
|
export { IDSSpinner } from './components/form/spinner/spinner.js';
|
|
29
29
|
export { IDSButton } from './components/button/button.js';
|
|
30
|
+
export { IDSControlButton } from './components/button/control-button.js';
|
|
30
31
|
export { IDSButtonGroup } from './components/button/button-group.js';
|
|
31
32
|
export { IDSContainer } from './components/grid/container.js';
|
|
32
33
|
export { IDSRow } from './components/grid/row.js';
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inera/ids-react",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"react": "*",
|
|
7
|
-
"react-day-picker": "^9.11.3"
|
|
7
|
+
"react-day-picker": "^9.11.3",
|
|
8
|
+
"react-dom": "*"
|
|
8
9
|
},
|
|
9
10
|
"dependencies": {
|
|
10
|
-
"@inera/ids-design": "9.
|
|
11
|
+
"@inera/ids-design": "9.3.x",
|
|
11
12
|
"clsx": "*"
|
|
12
13
|
},
|
|
13
14
|
"types": "index.d.ts",
|