smarthr-ui 75.3.2 → 75.4.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/esm/components/Disclosure/DisclosureContent.d.ts +12 -0
- package/esm/components/Disclosure/DisclosureContent.js +24 -0
- package/esm/components/Disclosure/DisclosureContent.js.map +1 -0
- package/esm/components/Disclosure/DisclosureTrigger.d.ts +14 -0
- package/esm/components/Disclosure/DisclosureTrigger.js +29 -0
- package/esm/components/Disclosure/DisclosureTrigger.js.map +1 -0
- package/esm/components/Disclosure/index.d.ts +2 -1
- package/esm/components/Disclosure/index.js +2 -1
- package/esm/components/Disclosure/index.js.map +1 -1
- package/esm/components/Disclosure/useDisclosure.d.ts +17 -0
- package/esm/components/Disclosure/useDisclosure.js +41 -0
- package/esm/components/Disclosure/useDisclosure.js.map +1 -0
- package/esm/components/Icon/Icon.d.ts +1 -0
- package/esm/components/Icon/Icon.js +3 -2
- package/esm/components/Icon/Icon.js.map +1 -1
- package/esm/components/Icon/index.js +1 -1
- package/esm/components/RangeSeparator/RangeSeparator.d.ts +3 -1
- package/esm/components/RangeSeparator/RangeSeparator.js +4 -4
- package/esm/components/RangeSeparator/RangeSeparator.js.map +1 -1
- package/esm/components/SideMenu/SideMenuItem.d.ts +2 -1
- package/esm/components/SideMenu/SideMenuItem.js +2 -2
- package/esm/components/SideMenu/SideMenuItem.js.map +1 -1
- package/esm/index.js +3 -2
- package/esm/index.js.map +1 -1
- package/esm/vendor/.pnpm/react-icons@5.5.0_react@19.1.1/vendor/react-icons/fa6/index.js +3 -1
- package/esm/vendor/.pnpm/react-icons@5.5.0_react@19.1.1/vendor/react-icons/fa6/index.js.map +1 -1
- package/lib/components/Disclosure/DisclosureContent.d.ts +12 -0
- package/lib/components/Disclosure/DisclosureContent.js +25 -0
- package/lib/components/Disclosure/DisclosureContent.js.map +1 -0
- package/lib/components/Disclosure/DisclosureTrigger.d.ts +14 -0
- package/lib/components/Disclosure/DisclosureTrigger.js +30 -0
- package/lib/components/Disclosure/DisclosureTrigger.js.map +1 -0
- package/lib/components/Disclosure/index.d.ts +2 -1
- package/lib/components/Disclosure/index.js +4 -3
- package/lib/components/Disclosure/index.js.map +1 -1
- package/lib/components/Disclosure/useDisclosure.d.ts +17 -0
- package/lib/components/Disclosure/useDisclosure.js +42 -0
- package/lib/components/Disclosure/useDisclosure.js.map +1 -0
- package/lib/components/Icon/Icon.d.ts +1 -0
- package/lib/components/Icon/Icon.js +6 -5
- package/lib/components/Icon/Icon.js.map +1 -1
- package/lib/components/RangeSeparator/RangeSeparator.d.ts +3 -1
- package/lib/components/RangeSeparator/RangeSeparator.js +4 -4
- package/lib/components/RangeSeparator/RangeSeparator.js.map +1 -1
- package/lib/components/SideMenu/SideMenuItem.d.ts +2 -1
- package/lib/components/SideMenu/SideMenuItem.js +2 -2
- package/lib/components/SideMenu/SideMenuItem.js.map +1 -1
- package/package.json +2 -1
- package/smarthr-ui.css +0 -6
- package/esm/components/Disclosure/Disclosure.d.ts +0 -22
- package/esm/components/Disclosure/Disclosure.js +0 -73
- package/esm/components/Disclosure/Disclosure.js.map +0 -1
- package/lib/components/Disclosure/Disclosure.d.ts +0 -22
- package/lib/components/Disclosure/Disclosure.js +0 -75
- package/lib/components/Disclosure/Disclosure.js.map +0 -1
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { useState, useCallback, useMemo, cloneElement, useEffect } from 'react';
|
|
4
|
-
import { VisuallyHiddenText } from '../VisuallyHiddenText/VisuallyHiddenText.js';
|
|
5
|
-
|
|
6
|
-
const TRIGGER_EVENT = 'smarthr-ui:disclosure-trigger-dispatch';
|
|
7
|
-
const CONTENT_TOGGLE_EVENT = 'smarthr-ui:disclosure-content-toggle-dispatch';
|
|
8
|
-
const toggleEffectListener = (event_key, callback) => {
|
|
9
|
-
document.addEventListener(event_key, callback);
|
|
10
|
-
return () => {
|
|
11
|
-
document.removeEventListener(event_key, callback);
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
const DisclosureTrigger = ({ targetId, children, onClick, ...rest }) => {
|
|
15
|
-
const [expanded, setExpanded] = useState(false);
|
|
16
|
-
const actualOnClick = useCallback((e) => {
|
|
17
|
-
const toggleExpanded = () => {
|
|
18
|
-
setExpanded((current) => !current);
|
|
19
|
-
};
|
|
20
|
-
if (onClick) {
|
|
21
|
-
return onClick(toggleExpanded, e);
|
|
22
|
-
}
|
|
23
|
-
toggleExpanded();
|
|
24
|
-
}, [onClick]);
|
|
25
|
-
const actualTrigger = useMemo(() => {
|
|
26
|
-
const actualChildren = children instanceof Function ? children({ expanded }) : children;
|
|
27
|
-
return cloneElement(actualChildren, {
|
|
28
|
-
onClick: actualOnClick,
|
|
29
|
-
'aria-expanded': expanded.toString(),
|
|
30
|
-
'aria-controls': targetId,
|
|
31
|
-
...rest,
|
|
32
|
-
});
|
|
33
|
-
}, [expanded, children, actualOnClick, targetId, rest]);
|
|
34
|
-
useEffect(() => toggleEffectListener(CONTENT_TOGGLE_EVENT, (e) => {
|
|
35
|
-
if (targetId === e.detail.id) {
|
|
36
|
-
setExpanded(e.detail.expanded);
|
|
37
|
-
}
|
|
38
|
-
}), [targetId]);
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
// HINT: 基本的にtriggerはcontentより先にレンダリングされる
|
|
41
|
-
// そのため、contentがレンダリングされたあとになることを期待して
|
|
42
|
-
// requestAnimationFrameでイベント発火を遅延させる
|
|
43
|
-
requestAnimationFrame(() => {
|
|
44
|
-
document.dispatchEvent(new CustomEvent(TRIGGER_EVENT, {
|
|
45
|
-
detail: { id: targetId, expanded },
|
|
46
|
-
}));
|
|
47
|
-
});
|
|
48
|
-
}, [expanded, targetId]);
|
|
49
|
-
return actualTrigger;
|
|
50
|
-
};
|
|
51
|
-
const DisclosureContent = ({ id, isOpen, visuallyHidden, children, ...rest }) => {
|
|
52
|
-
const [expanded, setExpanded] = useState(isOpen || false);
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
document.dispatchEvent(new CustomEvent(CONTENT_TOGGLE_EVENT, {
|
|
55
|
-
detail: { id, expanded: isOpen || false },
|
|
56
|
-
}));
|
|
57
|
-
}, [isOpen, id]);
|
|
58
|
-
useEffect(() => toggleEffectListener(TRIGGER_EVENT, (e) => {
|
|
59
|
-
if (id === e.detail.id) {
|
|
60
|
-
setExpanded(e.detail.expanded);
|
|
61
|
-
}
|
|
62
|
-
}), [id]);
|
|
63
|
-
if (expanded) {
|
|
64
|
-
return (jsx("div", { ...rest, id: id, children: children }));
|
|
65
|
-
}
|
|
66
|
-
if (visuallyHidden) {
|
|
67
|
-
return (jsx(VisuallyHiddenText, { ...rest, id: id, as: "div", children: children }));
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export { DisclosureContent, DisclosureTrigger };
|
|
73
|
-
//# sourceMappingURL=Disclosure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Disclosure.js","sources":["../../../src/components/Disclosure/Disclosure.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type MouseEvent,\n type PropsWithChildren,\n type ReactElement,\n cloneElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractContentProps = PropsWithChildren<{\n /** DisclosureTriggerのtargetIdと紐づけるId */\n id: string\n /** 開閉状態。デフォルトは閉じている */\n isOpen?: boolean\n /** 閉じた状態でContentを要素として存在させるか。デフォルトでは要素は存在しない */\n visuallyHidden?: boolean\n}>\ntype ContentProps = AbstractContentProps & Omit<ComponentProps<'div'>, keyof AbstractContentProps>\n\nconst TRIGGER_EVENT = 'smarthr-ui:disclosure-trigger-dispatch'\nconst CONTENT_TOGGLE_EVENT = 'smarthr-ui:disclosure-content-toggle-dispatch'\n\nconst toggleEffectListener = (\n event_key: string,\n callback: (e: Event & { detail: { id: string; expanded: boolean } }) => void,\n) => {\n document.addEventListener(\n event_key,\n callback as Parameters<typeof document.addEventListener>['1'],\n )\n\n return () => {\n document.removeEventListener(\n event_key,\n callback as Parameters<typeof document.removeEventListener>['1'],\n )\n }\n}\n\ntype TriggerChildrenType = Omit<ReactElement, 'onClick' | 'aria-expanded' | 'aria-controls'>\n\nexport const DisclosureTrigger: FC<{\n /** DisclosureContentのidと紐づける文字列 */\n targetId: string\n /** 開閉時のハンドラー */\n onClick?: (open: () => void, e: MouseEvent<HTMLButtonElement>) => void\n children: TriggerChildrenType | ((args: { expanded: boolean }) => TriggerChildrenType)\n}> = ({ targetId, children, onClick, ...rest }) => {\n const [expanded, setExpanded] = useState(false)\n\n const actualOnClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const toggleExpanded = () => {\n setExpanded((current) => !current)\n }\n\n if (onClick) {\n return onClick(toggleExpanded, e)\n }\n\n toggleExpanded()\n },\n [onClick],\n )\n const actualTrigger = useMemo(() => {\n const actualChildren = children instanceof Function ? children({ expanded }) : children\n\n return cloneElement(actualChildren as ReactElement, {\n onClick: actualOnClick,\n 'aria-expanded': expanded.toString(),\n 'aria-controls': targetId,\n ...rest,\n })\n }, [expanded, children, actualOnClick, targetId, rest])\n\n useEffect(\n () =>\n toggleEffectListener(CONTENT_TOGGLE_EVENT, (e) => {\n if (targetId === e.detail.id) {\n setExpanded(e.detail.expanded)\n }\n }),\n [targetId],\n )\n\n useEffect(() => {\n // HINT: 基本的にtriggerはcontentより先にレンダリングされる\n // そのため、contentがレンダリングされたあとになることを期待して\n // requestAnimationFrameでイベント発火を遅延させる\n requestAnimationFrame(() => {\n document.dispatchEvent(\n new CustomEvent(TRIGGER_EVENT, {\n detail: { id: targetId, expanded },\n }),\n )\n })\n }, [expanded, targetId])\n\n return actualTrigger\n}\n\nexport const DisclosureContent: FC<ContentProps> = ({\n id,\n isOpen,\n visuallyHidden,\n children,\n ...rest\n}) => {\n const [expanded, setExpanded] = useState(isOpen || false)\n\n useEffect(() => {\n document.dispatchEvent(\n new CustomEvent(CONTENT_TOGGLE_EVENT, {\n detail: { id, expanded: isOpen || false },\n }),\n )\n }, [isOpen, id])\n\n useEffect(\n () =>\n toggleEffectListener(TRIGGER_EVENT, (e) => {\n if (id === e.detail.id) {\n setExpanded(e.detail.expanded)\n }\n }),\n [id],\n )\n\n if (expanded) {\n return (\n <div {...rest} id={id}>\n {children}\n </div>\n )\n }\n\n if (visuallyHidden) {\n return (\n <VisuallyHiddenText {...rest} id={id} as=\"div\">\n {children}\n </VisuallyHiddenText>\n )\n }\n\n return null\n}\n"],"names":[],"mappings":";;;;;AA2BA;AACA;AAEA;AAIE;AAKA;AACE;AAIF;AACF;AAIO;;AASL;;;AAII;;AAGE;;AAGF;AACF;AAGF;AACE;;AAGE;AACA;AACA;AACA;AACD;AACH;;;AAMQ;;AAEJ;;;;;;AASA;AAEI;AACD;AAEL;AACF;AAEA;AACF;AAEO;AAOL;;AAGE;;AAGG;AAEL;;;AAMQ;;AAEJ;;;;;AAaF;;AAOF;AACF;;"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { type ComponentProps, type FC, type MouseEvent, type PropsWithChildren, type ReactElement } from 'react';
|
|
2
|
-
type AbstractContentProps = PropsWithChildren<{
|
|
3
|
-
/** DisclosureTriggerのtargetIdと紐づけるId */
|
|
4
|
-
id: string;
|
|
5
|
-
/** 開閉状態。デフォルトは閉じている */
|
|
6
|
-
isOpen?: boolean;
|
|
7
|
-
/** 閉じた状態でContentを要素として存在させるか。デフォルトでは要素は存在しない */
|
|
8
|
-
visuallyHidden?: boolean;
|
|
9
|
-
}>;
|
|
10
|
-
type ContentProps = AbstractContentProps & Omit<ComponentProps<'div'>, keyof AbstractContentProps>;
|
|
11
|
-
type TriggerChildrenType = Omit<ReactElement, 'onClick' | 'aria-expanded' | 'aria-controls'>;
|
|
12
|
-
export declare const DisclosureTrigger: FC<{
|
|
13
|
-
/** DisclosureContentのidと紐づける文字列 */
|
|
14
|
-
targetId: string;
|
|
15
|
-
/** 開閉時のハンドラー */
|
|
16
|
-
onClick?: (open: () => void, e: MouseEvent<HTMLButtonElement>) => void;
|
|
17
|
-
children: TriggerChildrenType | ((args: {
|
|
18
|
-
expanded: boolean;
|
|
19
|
-
}) => TriggerChildrenType);
|
|
20
|
-
}>;
|
|
21
|
-
export declare const DisclosureContent: FC<ContentProps>;
|
|
22
|
-
export {};
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
'use client';
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.DisclosureContent = exports.DisclosureTrigger = void 0;
|
|
5
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
-
const react_1 = require("react");
|
|
7
|
-
const VisuallyHiddenText_1 = require("../VisuallyHiddenText");
|
|
8
|
-
const TRIGGER_EVENT = 'smarthr-ui:disclosure-trigger-dispatch';
|
|
9
|
-
const CONTENT_TOGGLE_EVENT = 'smarthr-ui:disclosure-content-toggle-dispatch';
|
|
10
|
-
const toggleEffectListener = (event_key, callback) => {
|
|
11
|
-
document.addEventListener(event_key, callback);
|
|
12
|
-
return () => {
|
|
13
|
-
document.removeEventListener(event_key, callback);
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
const DisclosureTrigger = ({ targetId, children, onClick, ...rest }) => {
|
|
17
|
-
const [expanded, setExpanded] = (0, react_1.useState)(false);
|
|
18
|
-
const actualOnClick = (0, react_1.useCallback)((e) => {
|
|
19
|
-
const toggleExpanded = () => {
|
|
20
|
-
setExpanded((current) => !current);
|
|
21
|
-
};
|
|
22
|
-
if (onClick) {
|
|
23
|
-
return onClick(toggleExpanded, e);
|
|
24
|
-
}
|
|
25
|
-
toggleExpanded();
|
|
26
|
-
}, [onClick]);
|
|
27
|
-
const actualTrigger = (0, react_1.useMemo)(() => {
|
|
28
|
-
const actualChildren = children instanceof Function ? children({ expanded }) : children;
|
|
29
|
-
return (0, react_1.cloneElement)(actualChildren, {
|
|
30
|
-
onClick: actualOnClick,
|
|
31
|
-
'aria-expanded': expanded.toString(),
|
|
32
|
-
'aria-controls': targetId,
|
|
33
|
-
...rest,
|
|
34
|
-
});
|
|
35
|
-
}, [expanded, children, actualOnClick, targetId, rest]);
|
|
36
|
-
(0, react_1.useEffect)(() => toggleEffectListener(CONTENT_TOGGLE_EVENT, (e) => {
|
|
37
|
-
if (targetId === e.detail.id) {
|
|
38
|
-
setExpanded(e.detail.expanded);
|
|
39
|
-
}
|
|
40
|
-
}), [targetId]);
|
|
41
|
-
(0, react_1.useEffect)(() => {
|
|
42
|
-
// HINT: 基本的にtriggerはcontentより先にレンダリングされる
|
|
43
|
-
// そのため、contentがレンダリングされたあとになることを期待して
|
|
44
|
-
// requestAnimationFrameでイベント発火を遅延させる
|
|
45
|
-
requestAnimationFrame(() => {
|
|
46
|
-
document.dispatchEvent(new CustomEvent(TRIGGER_EVENT, {
|
|
47
|
-
detail: { id: targetId, expanded },
|
|
48
|
-
}));
|
|
49
|
-
});
|
|
50
|
-
}, [expanded, targetId]);
|
|
51
|
-
return actualTrigger;
|
|
52
|
-
};
|
|
53
|
-
exports.DisclosureTrigger = DisclosureTrigger;
|
|
54
|
-
const DisclosureContent = ({ id, isOpen, visuallyHidden, children, ...rest }) => {
|
|
55
|
-
const [expanded, setExpanded] = (0, react_1.useState)(isOpen || false);
|
|
56
|
-
(0, react_1.useEffect)(() => {
|
|
57
|
-
document.dispatchEvent(new CustomEvent(CONTENT_TOGGLE_EVENT, {
|
|
58
|
-
detail: { id, expanded: isOpen || false },
|
|
59
|
-
}));
|
|
60
|
-
}, [isOpen, id]);
|
|
61
|
-
(0, react_1.useEffect)(() => toggleEffectListener(TRIGGER_EVENT, (e) => {
|
|
62
|
-
if (id === e.detail.id) {
|
|
63
|
-
setExpanded(e.detail.expanded);
|
|
64
|
-
}
|
|
65
|
-
}), [id]);
|
|
66
|
-
if (expanded) {
|
|
67
|
-
return ((0, jsx_runtime_1.jsx)("div", { ...rest, id: id, children: children }));
|
|
68
|
-
}
|
|
69
|
-
if (visuallyHidden) {
|
|
70
|
-
return ((0, jsx_runtime_1.jsx)(VisuallyHiddenText_1.VisuallyHiddenText, { ...rest, id: id, as: "div", children: children }));
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
};
|
|
74
|
-
exports.DisclosureContent = DisclosureContent;
|
|
75
|
-
//# sourceMappingURL=Disclosure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Disclosure.js","sourceRoot":"","sources":["../../../src/components/Disclosure/Disclosure.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type MouseEvent,\n type PropsWithChildren,\n type ReactElement,\n cloneElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractContentProps = PropsWithChildren<{\n /** DisclosureTriggerのtargetIdと紐づけるId */\n id: string\n /** 開閉状態。デフォルトは閉じている */\n isOpen?: boolean\n /** 閉じた状態でContentを要素として存在させるか。デフォルトでは要素は存在しない */\n visuallyHidden?: boolean\n}>\ntype ContentProps = AbstractContentProps & Omit<ComponentProps<'div'>, keyof AbstractContentProps>\n\nconst TRIGGER_EVENT = 'smarthr-ui:disclosure-trigger-dispatch'\nconst CONTENT_TOGGLE_EVENT = 'smarthr-ui:disclosure-content-toggle-dispatch'\n\nconst toggleEffectListener = (\n event_key: string,\n callback: (e: Event & { detail: { id: string; expanded: boolean } }) => void,\n) => {\n document.addEventListener(\n event_key,\n callback as Parameters<typeof document.addEventListener>['1'],\n )\n\n return () => {\n document.removeEventListener(\n event_key,\n callback as Parameters<typeof document.removeEventListener>['1'],\n )\n }\n}\n\ntype TriggerChildrenType = Omit<ReactElement, 'onClick' | 'aria-expanded' | 'aria-controls'>\n\nexport const DisclosureTrigger: FC<{\n /** DisclosureContentのidと紐づける文字列 */\n targetId: string\n /** 開閉時のハンドラー */\n onClick?: (open: () => void, e: MouseEvent<HTMLButtonElement>) => void\n children: TriggerChildrenType | ((args: { expanded: boolean }) => TriggerChildrenType)\n}> = ({ targetId, children, onClick, ...rest }) => {\n const [expanded, setExpanded] = useState(false)\n\n const actualOnClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const toggleExpanded = () => {\n setExpanded((current) => !current)\n }\n\n if (onClick) {\n return onClick(toggleExpanded, e)\n }\n\n toggleExpanded()\n },\n [onClick],\n )\n const actualTrigger = useMemo(() => {\n const actualChildren = children instanceof Function ? children({ expanded }) : children\n\n return cloneElement(actualChildren as ReactElement, {\n onClick: actualOnClick,\n 'aria-expanded': expanded.toString(),\n 'aria-controls': targetId,\n ...rest,\n })\n }, [expanded, children, actualOnClick, targetId, rest])\n\n useEffect(\n () =>\n toggleEffectListener(CONTENT_TOGGLE_EVENT, (e) => {\n if (targetId === e.detail.id) {\n setExpanded(e.detail.expanded)\n }\n }),\n [targetId],\n )\n\n useEffect(() => {\n // HINT: 基本的にtriggerはcontentより先にレンダリングされる\n // そのため、contentがレンダリングされたあとになることを期待して\n // requestAnimationFrameでイベント発火を遅延させる\n requestAnimationFrame(() => {\n document.dispatchEvent(\n new CustomEvent(TRIGGER_EVENT, {\n detail: { id: targetId, expanded },\n }),\n )\n })\n }, [expanded, targetId])\n\n return actualTrigger\n}\n\nexport const DisclosureContent: FC<ContentProps> = ({\n id,\n isOpen,\n visuallyHidden,\n children,\n ...rest\n}) => {\n const [expanded, setExpanded] = useState(isOpen || false)\n\n useEffect(() => {\n document.dispatchEvent(\n new CustomEvent(CONTENT_TOGGLE_EVENT, {\n detail: { id, expanded: isOpen || false },\n }),\n )\n }, [isOpen, id])\n\n useEffect(\n () =>\n toggleEffectListener(TRIGGER_EVENT, (e) => {\n if (id === e.detail.id) {\n setExpanded(e.detail.expanded)\n }\n }),\n [id],\n )\n\n if (expanded) {\n return (\n <div {...rest} id={id}>\n {children}\n </div>\n )\n }\n\n if (visuallyHidden) {\n return (\n <VisuallyHiddenText {...rest} id={id} as=\"div\">\n {children}\n </VisuallyHiddenText>\n )\n }\n\n return null\n}\n"]}
|