smarthr-ui 99.4.0 → 99.5.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/lib/components/AppHeader/components/mobile/MenuDialog.cjs +26 -15
- package/lib/components/AppHeader/components/mobile/MenuDialog.cjs.map +1 -1
- package/lib/components/AppHeader/components/mobile/MenuDialog.js +27 -16
- package/lib/components/AppHeader/components/mobile/MenuDialog.js.map +1 -1
- package/lib/components/Calendar/YearPicker.cjs +13 -14
- package/lib/components/Calendar/YearPicker.cjs.map +1 -1
- package/lib/components/Calendar/YearPicker.js +14 -15
- package/lib/components/Calendar/YearPicker.js.map +1 -1
- package/lib/components/Checkbox/Checkbox.cjs +3 -2
- package/lib/components/Checkbox/Checkbox.cjs.map +1 -1
- package/lib/components/Checkbox/Checkbox.js +4 -3
- package/lib/components/Checkbox/Checkbox.js.map +1 -1
- package/lib/components/DatePicker/DatePicker.cjs +59 -51
- package/lib/components/DatePicker/DatePicker.cjs.map +1 -1
- package/lib/components/DatePicker/DatePicker.js +60 -52
- package/lib/components/DatePicker/DatePicker.js.map +1 -1
- package/lib/components/Disclosure/DisclosureContent.cjs +1 -1
- package/lib/components/Disclosure/DisclosureContent.cjs.map +1 -1
- package/lib/components/Disclosure/DisclosureContent.js +1 -1
- package/lib/components/Disclosure/DisclosureContent.js.map +1 -1
- package/lib/components/Disclosure/DisclosureTrigger.cjs +8 -8
- package/lib/components/Disclosure/DisclosureTrigger.cjs.map +1 -1
- package/lib/components/Disclosure/DisclosureTrigger.js +9 -9
- package/lib/components/Disclosure/DisclosureTrigger.js.map +1 -1
- package/lib/components/DropZone/DropZone.cjs +32 -27
- package/lib/components/DropZone/DropZone.cjs.map +1 -1
- package/lib/components/DropZone/DropZone.js +33 -28
- package/lib/components/DropZone/DropZone.js.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs +17 -17
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js +18 -18
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.cjs +16 -30
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.cjs.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.js +17 -31
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.js.map +1 -1
- package/lib/components/Dropdown/SortDropdown/SortDropdown.cjs +3 -3
- package/lib/components/Dropdown/SortDropdown/SortDropdown.cjs.map +1 -1
- package/lib/components/Dropdown/SortDropdown/SortDropdown.js +2 -2
- package/lib/components/Dropdown/SortDropdown/SortDropdown.js.map +1 -1
- package/lib/components/FileViewer/ImageViewer.cjs +21 -19
- package/lib/components/FileViewer/ImageViewer.cjs.map +1 -1
- package/lib/components/FileViewer/ImageViewer.js +22 -20
- package/lib/components/FileViewer/ImageViewer.js.map +1 -1
- package/lib/components/FormGroup/Fieldset.cjs +160 -0
- package/lib/components/FormGroup/Fieldset.cjs.map +1 -0
- package/lib/components/FormGroup/Fieldset.d.ts +9 -0
- package/lib/components/FormGroup/Fieldset.js +158 -0
- package/lib/components/FormGroup/Fieldset.js.map +1 -0
- package/lib/components/FormGroup/FormControl.cjs +119 -0
- package/lib/components/FormGroup/FormControl.cjs.map +1 -0
- package/lib/components/FormGroup/FormControl.d.ts +7 -0
- package/lib/components/FormGroup/FormControl.js +117 -0
- package/lib/components/FormGroup/FormControl.js.map +1 -0
- package/lib/components/FormGroup/FormGroup.cjs +28 -0
- package/lib/components/FormGroup/FormGroup.cjs.map +1 -0
- package/lib/components/FormGroup/FormGroup.d.ts +26 -0
- package/lib/components/FormGroup/FormGroup.js +24 -0
- package/lib/components/FormGroup/FormGroup.js.map +1 -0
- package/lib/components/FormGroup/constants.cjs +8 -0
- package/lib/components/FormGroup/constants.cjs.map +1 -0
- package/lib/components/FormGroup/constants.d.ts +2 -0
- package/lib/components/FormGroup/constants.js +5 -0
- package/lib/components/FormGroup/constants.js.map +1 -0
- package/lib/components/FormGroup/index.cjs +10 -0
- package/lib/components/{Fieldset → FormGroup}/index.cjs.map +1 -1
- package/lib/components/FormGroup/index.d.ts +2 -0
- package/lib/components/{Fieldset → FormGroup}/index.js +1 -0
- package/lib/components/{Fieldset → FormGroup}/index.js.map +1 -1
- package/lib/components/FormGroup/style.cjs +22 -0
- package/lib/components/FormGroup/style.cjs.map +1 -0
- package/lib/components/FormGroup/style.d.ts +45 -0
- package/lib/components/FormGroup/style.js +20 -0
- package/lib/components/FormGroup/style.js.map +1 -0
- package/lib/components/FormGroup/type.cjs +3 -0
- package/lib/components/FormGroup/type.cjs.map +1 -0
- package/lib/components/{FormControl/FormControl.d.ts → FormGroup/type.d.ts} +17 -14
- package/lib/components/FormGroup/type.js +2 -0
- package/lib/components/FormGroup/type.js.map +1 -0
- package/lib/components/FormGroup/useAutoBindErrorInput.cjs +30 -0
- package/lib/components/FormGroup/useAutoBindErrorInput.cjs.map +1 -0
- package/lib/components/FormGroup/useAutoBindErrorInput.d.ts +11 -0
- package/lib/components/FormGroup/useAutoBindErrorInput.js +28 -0
- package/lib/components/FormGroup/useAutoBindErrorInput.js.map +1 -0
- package/lib/components/FormGroup/useDescribedByIds.cjs +77 -0
- package/lib/components/FormGroup/useDescribedByIds.cjs.map +1 -0
- package/lib/components/FormGroup/useDescribedByIds.d.ts +17 -0
- package/lib/components/FormGroup/useDescribedByIds.js +75 -0
- package/lib/components/FormGroup/useDescribedByIds.js.map +1 -0
- package/lib/components/Heading/PageHeading/PageHeading.cjs +25 -33
- package/lib/components/Heading/PageHeading/PageHeading.cjs.map +1 -1
- package/lib/components/Heading/PageHeading/PageHeading.js +26 -34
- package/lib/components/Heading/PageHeading/PageHeading.js.map +1 -1
- package/lib/components/Icon/FaIcon.cjs +4 -0
- package/lib/components/Icon/FaIcon.cjs.map +1 -1
- package/lib/components/Icon/FaIcon.d.ts +2 -0
- package/lib/components/Icon/FaIcon.js +4 -2
- package/lib/components/Icon/FaIcon.js.map +1 -1
- package/lib/components/Icon/index.cjs +2 -0
- package/lib/components/Icon/index.cjs.map +1 -1
- package/lib/components/Icon/index.js +1 -1
- package/lib/components/InputFile/FilePreviewDialog.cjs +1 -1
- package/lib/components/InputFile/FilePreviewDialog.cjs.map +1 -1
- package/lib/components/InputFile/FilePreviewDialog.js +1 -1
- package/lib/components/InputFile/FilePreviewDialog.js.map +1 -1
- package/lib/components/InputFile/InputFileMultiplyAppendable.cjs +10 -13
- package/lib/components/InputFile/InputFileMultiplyAppendable.cjs.map +1 -1
- package/lib/components/InputFile/InputFileMultiplyAppendable.js +11 -14
- package/lib/components/InputFile/InputFileMultiplyAppendable.js.map +1 -1
- package/lib/components/Scroller/Scroller.cjs +19 -32
- package/lib/components/Scroller/Scroller.cjs.map +1 -1
- package/lib/components/Scroller/Scroller.js +20 -33
- package/lib/components/Scroller/Scroller.js.map +1 -1
- package/lib/components/SegmentedControl/SegmentedControl.cjs +53 -55
- package/lib/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
- package/lib/components/SegmentedControl/SegmentedControl.js +54 -56
- package/lib/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/lib/components/Table/TableScroller.cjs +4 -12
- package/lib/components/Table/TableScroller.cjs.map +1 -1
- package/lib/components/Table/TableScroller.js +4 -12
- package/lib/components/Table/TableScroller.js.map +1 -1
- package/lib/components/Textarea/Textarea.cjs +5 -6
- package/lib/components/Textarea/Textarea.cjs.map +1 -1
- package/lib/components/Textarea/Textarea.js +6 -7
- package/lib/components/Textarea/Textarea.js.map +1 -1
- package/lib/hooks/useCallbackRefCleanupForReact18.cjs +61 -0
- package/lib/hooks/useCallbackRefCleanupForReact18.cjs.map +1 -0
- package/lib/hooks/useCallbackRefCleanupForReact18.d.ts +39 -0
- package/lib/hooks/useCallbackRefCleanupForReact18.js +59 -0
- package/lib/hooks/useCallbackRefCleanupForReact18.js.map +1 -0
- package/lib/index.cjs +6 -4
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.js +3 -3
- package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.cjs +6 -0
- package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.cjs.map +1 -1
- package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.js +5 -1
- package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.js.map +1 -1
- package/metadata.json +1 -1
- package/package.json +2 -2
- package/lib/components/Fieldset/Fieldset.cjs +0 -9
- package/lib/components/Fieldset/Fieldset.cjs.map +0 -1
- package/lib/components/Fieldset/Fieldset.d.ts +0 -7
- package/lib/components/Fieldset/Fieldset.js +0 -7
- package/lib/components/Fieldset/Fieldset.js.map +0 -1
- package/lib/components/Fieldset/index.cjs +0 -8
- package/lib/components/Fieldset/index.d.ts +0 -1
- package/lib/components/FormControl/FormControl.cjs +0 -273
- package/lib/components/FormControl/FormControl.cjs.map +0 -1
- package/lib/components/FormControl/FormControl.js +0 -270
- package/lib/components/FormControl/FormControl.js.map +0 -1
- package/lib/components/FormControl/index.cjs +0 -9
- package/lib/components/FormControl/index.cjs.map +0 -1
- package/lib/components/FormControl/index.d.ts +0 -1
- package/lib/components/FormControl/index.js +0 -2
- package/lib/components/FormControl/index.js.map +0 -1
|
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var index = require('./../../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.46_@swc_helper_93b9c5ee15e3d3d2221e194197be3b5c/vendor/tailwind-variants/dist/index.cjs');
|
|
6
6
|
var hooks_useLatest = require('../../../../hooks/useLatest.cjs');
|
|
7
|
+
var hooks_useMergeRefs = require('../../../../hooks/useMergeRefs.cjs');
|
|
7
8
|
require('../../../../intl/IntlProvider.cjs');
|
|
8
9
|
var intl_useIntl = require('../../../../intl/useIntl.cjs');
|
|
9
10
|
require('react-intl');
|
|
@@ -92,21 +93,31 @@ const Content = ({ domRef, children, setIsOpen, tenantSelector }) => {
|
|
|
92
93
|
setIsReleaseNoteSelected,
|
|
93
94
|
setSelectedNavigationGroup,
|
|
94
95
|
});
|
|
95
|
-
const functions = React.useMemo(() =>
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
96
|
+
const functions = React.useMemo(() => {
|
|
97
|
+
const clearAppLauncher = () => latest.setIsAppLauncherSelected(false);
|
|
98
|
+
const clearReleaseNote = () => latest.setIsReleaseNoteSelected(false);
|
|
99
|
+
const clearNavigationGroup = () => latest.setSelectedNavigationGroup(null);
|
|
100
|
+
return {
|
|
101
|
+
// HINT: Contentをanimationで非表示にしたい
|
|
102
|
+
// アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、
|
|
103
|
+
// unmount時に操作内容のclearを行う
|
|
104
|
+
// HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している
|
|
105
|
+
// もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する
|
|
106
|
+
callbackRef: () => () => {
|
|
107
|
+
clearReleaseNote();
|
|
108
|
+
clearAppLauncher();
|
|
109
|
+
clearNavigationGroup();
|
|
110
|
+
},
|
|
111
|
+
clearAppLauncher,
|
|
112
|
+
clearReleaseNote,
|
|
113
|
+
clearNavigationGroup,
|
|
114
|
+
handleDialogClose: () => latest.setIsOpen(false),
|
|
115
|
+
};
|
|
116
|
+
}, [latest]);
|
|
117
|
+
// HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している
|
|
118
|
+
// もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する
|
|
119
|
+
const mergedRef = hooks_useMergeRefs.useMergeRefs(functions.callbackRef, domRef);
|
|
120
|
+
return (jsxRuntime.jsxs(components_SectioningContent_SectioningContent.Section, { ref: mergedRef, role: "dialog", "aria-modal": "true", className: CLASS_NAMES.wrapper, children: [jsxRuntime.jsx("div", { className: CLASS_NAMES.header, children: jsxRuntime.jsxs(components_Layout_Cluster_Cluster.Cluster, { justify: "space-between", align: "center", children: [isAppLauncherSelected ? (jsxRuntime.jsx(components_AppHeader_components_mobile_MenuSubHeading.MenuSubHeading, { title: translated.launcherListText, handleClickBack: functions.clearAppLauncher })) : isReleaseNoteSelected ? (
|
|
110
121
|
// eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content
|
|
111
122
|
jsxRuntime.jsx(components_AppHeader_components_mobile_MenuSubHeading.MenuSubHeading, { title: translated.latestReleaseNotes, handleClickBack: functions.clearReleaseNote })) : selectedNavigationGroup ? (
|
|
112
123
|
// eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuDialog.cjs","sources":["../../../../../src/components/AppHeader/components/mobile/MenuDialog.tsx"],"sourcesContent":["import {\n type Dispatch,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../../../hooks/useLatest'\nimport { Localizer, useLocalize } from '../../../../intl'\nimport { Button } from '../../../Button'\nimport { FocusTrap } from '../../../Dialog'\nimport { FaXmarkIcon } from '../../../Icon'\nimport { Cluster } from '../../../Layout'\nimport { Scroller } from '../../../Scroller'\nimport { Section } from '../../../SectioningContent'\n\nimport { AppLauncher } from './AppLauncher'\nimport { AppLauncherContext } from './AppLauncherContext'\nimport { MenuSubHeading } from './MenuSubHeading'\nimport { Navigation } from './Navigation'\nimport { NavigationContext } from './NavigationContext'\nimport { ReleaseNote } from './ReleaseNote'\nimport { ReleaseNoteContext } from './ReleaseNoteContext'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: [\n 'shr-fixed shr-left-0 shr-top-0 shr-flex shr-h-full shr-w-full shr-flex-col shr-bg-white',\n 'shr-translate-opacity shr-opacity-0 shr-duration-150',\n '[&&.shr-sp-menu-enter-active]:shr-opacity-100',\n '[&&.shr-sp-menu-enter-done]:shr-opacity-100',\n '[&&.shr-sp-menu-exit-active]:shr-opacity-0',\n '[&&.shr-sp-menu-exit-done]:shr-opacity-0',\n ],\n header: 'shr-border-b-shorthand shr-sticky shr-top-0 shr-px-0.75 shr-py-0.5',\n content: 'shr-p-1',\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { wrapper, header, content } = classNameGenerator()\n\n return {\n wrapper: wrapper(),\n header: header(),\n content: content(),\n }\n})()\n\ntype Props = PropsWithChildren<{\n isOpen: boolean\n setIsOpen: Dispatch<boolean>\n tenantSelector: ReactNode\n}>\n\nexport const MenuDialog: FC<Props> = ({ isOpen, ...rest }) => {\n const domRef = useRef<HTMLSelectElement>(null)\n\n return (\n <CSSTransition\n classNames=\"shr-sp-menu\"\n in={isOpen}\n timeout={300}\n unmountOnExit\n nodeRef={domRef}\n >\n <div className=\"shr-fixed shr-z-overlap-base\">\n <FocusTrap>\n <Content {...rest} domRef={domRef} />\n </FocusTrap>\n </div>\n </CSSTransition>\n )\n}\n\nexport const Content: FC<\n Omit<Props, 'isOpen'> & {\n domRef: RefObject<HTMLSelectElement>\n }\n> = ({ domRef, children, setIsOpen, tenantSelector }) => {\n const { selectedNavigationGroup, setSelectedNavigationGroup } = useContext(NavigationContext)\n const { isReleaseNoteSelected, setIsReleaseNoteSelected } = useContext(ReleaseNoteContext)\n const { features, isAppLauncherSelected, setIsAppLauncherSelected } =\n useContext(AppLauncherContext)\n\n const translated = useLocalize({\n launcherListText: {\n id: 'smarthr-ui/AppHeader/Launcher/listText',\n defaultText: 'アプリ一覧',\n },\n latestReleaseNotes: {\n id: 'smarthr-ui/AppHeader/MobileHeader/latestReleaseNotes',\n defaultText: '最新のリリースノート',\n },\n })\n\n const latest = useLatest({\n setIsOpen,\n setIsAppLauncherSelected,\n setIsReleaseNoteSelected,\n setSelectedNavigationGroup,\n })\n\n const functions = useMemo(\n () => ({\n handleDialogClose: () => latest.setIsOpen(false),\n clearAppLauncher: () => latest.setIsAppLauncherSelected(false),\n clearReleaseNote: () => latest.setIsReleaseNoteSelected(false),\n clearNavigationGroup: () => latest.setSelectedNavigationGroup(null),\n }),\n [latest],\n )\n\n // HINT: Contentをanimationで非表示にしたい\n // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、\n // unmount時に操作内容のclearを行う\n useEffect(\n () => () => {\n functions.clearReleaseNote()\n functions.clearAppLauncher()\n functions.clearNavigationGroup()\n },\n [functions],\n )\n\n return (\n <Section role=\"dialog\" aria-modal=\"true\" className={CLASS_NAMES.wrapper} ref={domRef}>\n <div className={CLASS_NAMES.header}>\n <Cluster justify=\"space-between\" align=\"center\">\n {isAppLauncherSelected ? (\n <MenuSubHeading\n title={translated.launcherListText}\n handleClickBack={functions.clearAppLauncher}\n />\n ) : isReleaseNoteSelected ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={translated.latestReleaseNotes}\n handleClickBack={functions.clearReleaseNote}\n />\n ) : selectedNavigationGroup ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={selectedNavigationGroup.children}\n handleClickBack={functions.clearNavigationGroup}\n />\n ) : (\n <div>{tenantSelector}</div>\n )}\n\n <Button variant=\"secondary\" size=\"S\" onClick={functions.handleDialogClose}>\n <FaXmarkIcon\n alt={\n <Localizer\n id=\"smarthr-ui/AppHeader/MobileHeader/closeMenu\"\n defaultText=\"メニューを閉じる\"\n />\n }\n />\n </Button>\n </Cluster>\n </div>\n\n {isAppLauncherSelected && features && features.length > 0 ? (\n <AppLauncher features={features} />\n ) : (\n <Scroller direction=\"vertical\" className={CLASS_NAMES.content}>\n {isReleaseNoteSelected ? (\n <ReleaseNote />\n ) : selectedNavigationGroup ? (\n <Navigation\n navigations={selectedNavigationGroup.childNavigations}\n handleClickNavigation={functions.handleDialogClose}\n />\n ) : (\n children\n )}\n </Scroller>\n )}\n </Section>\n )\n}\n"],"names":["tv","useRef","_jsx","FocusTrap","useContext","NavigationContext","ReleaseNoteContext","AppLauncherContext","useLocalize","useLatest","useMemo","useEffect","_jsxs","Section","Cluster","MenuSubHeading","Button","FaXmarkIcon","Localizer","AppLauncher","Scroller","ReleaseNote","Navigation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MenuDialog.cjs","sources":["../../../../../src/components/AppHeader/components/mobile/MenuDialog.tsx"],"sourcesContent":["import {\n type Dispatch,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n useContext,\n useMemo,\n useRef,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../../../hooks/useLatest'\nimport { useMergeRefs } from '../../../../hooks/useMergeRefs'\nimport { Localizer, useLocalize } from '../../../../intl'\nimport { Button } from '../../../Button'\nimport { FocusTrap } from '../../../Dialog'\nimport { FaXmarkIcon } from '../../../Icon'\nimport { Cluster } from '../../../Layout'\nimport { Scroller } from '../../../Scroller'\nimport { Section } from '../../../SectioningContent'\n\nimport { AppLauncher } from './AppLauncher'\nimport { AppLauncherContext } from './AppLauncherContext'\nimport { MenuSubHeading } from './MenuSubHeading'\nimport { Navigation } from './Navigation'\nimport { NavigationContext } from './NavigationContext'\nimport { ReleaseNote } from './ReleaseNote'\nimport { ReleaseNoteContext } from './ReleaseNoteContext'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: [\n 'shr-fixed shr-left-0 shr-top-0 shr-flex shr-h-full shr-w-full shr-flex-col shr-bg-white',\n 'shr-translate-opacity shr-opacity-0 shr-duration-150',\n '[&&.shr-sp-menu-enter-active]:shr-opacity-100',\n '[&&.shr-sp-menu-enter-done]:shr-opacity-100',\n '[&&.shr-sp-menu-exit-active]:shr-opacity-0',\n '[&&.shr-sp-menu-exit-done]:shr-opacity-0',\n ],\n header: 'shr-border-b-shorthand shr-sticky shr-top-0 shr-px-0.75 shr-py-0.5',\n content: 'shr-p-1',\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { wrapper, header, content } = classNameGenerator()\n\n return {\n wrapper: wrapper(),\n header: header(),\n content: content(),\n }\n})()\n\ntype Props = PropsWithChildren<{\n isOpen: boolean\n setIsOpen: Dispatch<boolean>\n tenantSelector: ReactNode\n}>\n\nexport const MenuDialog: FC<Props> = ({ isOpen, ...rest }) => {\n const domRef = useRef<HTMLSelectElement>(null)\n\n return (\n <CSSTransition\n classNames=\"shr-sp-menu\"\n in={isOpen}\n timeout={300}\n unmountOnExit\n nodeRef={domRef}\n >\n <div className=\"shr-fixed shr-z-overlap-base\">\n <FocusTrap>\n <Content {...rest} domRef={domRef} />\n </FocusTrap>\n </div>\n </CSSTransition>\n )\n}\n\nexport const Content: FC<\n Omit<Props, 'isOpen'> & {\n domRef: RefObject<HTMLSelectElement>\n }\n> = ({ domRef, children, setIsOpen, tenantSelector }) => {\n const { selectedNavigationGroup, setSelectedNavigationGroup } = useContext(NavigationContext)\n const { isReleaseNoteSelected, setIsReleaseNoteSelected } = useContext(ReleaseNoteContext)\n const { features, isAppLauncherSelected, setIsAppLauncherSelected } =\n useContext(AppLauncherContext)\n\n const translated = useLocalize({\n launcherListText: {\n id: 'smarthr-ui/AppHeader/Launcher/listText',\n defaultText: 'アプリ一覧',\n },\n latestReleaseNotes: {\n id: 'smarthr-ui/AppHeader/MobileHeader/latestReleaseNotes',\n defaultText: '最新のリリースノート',\n },\n })\n\n const latest = useLatest({\n setIsOpen,\n setIsAppLauncherSelected,\n setIsReleaseNoteSelected,\n setSelectedNavigationGroup,\n })\n\n const functions = useMemo(() => {\n const clearAppLauncher = () => latest.setIsAppLauncherSelected(false)\n const clearReleaseNote = () => latest.setIsReleaseNoteSelected(false)\n const clearNavigationGroup = () => latest.setSelectedNavigationGroup(null)\n\n return {\n // HINT: Contentをanimationで非表示にしたい\n // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、\n // unmount時に操作内容のclearを行う\n // HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している\n // もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する\n callbackRef: () => () => {\n clearReleaseNote()\n clearAppLauncher()\n clearNavigationGroup()\n },\n clearAppLauncher,\n clearReleaseNote,\n clearNavigationGroup,\n handleDialogClose: () => latest.setIsOpen(false),\n }\n }, [latest])\n\n // HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している\n // もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する\n const mergedRef = useMergeRefs(functions.callbackRef, domRef)\n\n return (\n <Section ref={mergedRef} role=\"dialog\" aria-modal=\"true\" className={CLASS_NAMES.wrapper}>\n <div className={CLASS_NAMES.header}>\n <Cluster justify=\"space-between\" align=\"center\">\n {isAppLauncherSelected ? (\n <MenuSubHeading\n title={translated.launcherListText}\n handleClickBack={functions.clearAppLauncher}\n />\n ) : isReleaseNoteSelected ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={translated.latestReleaseNotes}\n handleClickBack={functions.clearReleaseNote}\n />\n ) : selectedNavigationGroup ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={selectedNavigationGroup.children}\n handleClickBack={functions.clearNavigationGroup}\n />\n ) : (\n <div>{tenantSelector}</div>\n )}\n\n <Button variant=\"secondary\" size=\"S\" onClick={functions.handleDialogClose}>\n <FaXmarkIcon\n alt={\n <Localizer\n id=\"smarthr-ui/AppHeader/MobileHeader/closeMenu\"\n defaultText=\"メニューを閉じる\"\n />\n }\n />\n </Button>\n </Cluster>\n </div>\n\n {isAppLauncherSelected && features && features.length > 0 ? (\n <AppLauncher features={features} />\n ) : (\n <Scroller direction=\"vertical\" className={CLASS_NAMES.content}>\n {isReleaseNoteSelected ? (\n <ReleaseNote />\n ) : selectedNavigationGroup ? (\n <Navigation\n navigations={selectedNavigationGroup.childNavigations}\n handleClickNavigation={functions.handleDialogClose}\n />\n ) : (\n children\n )}\n </Scroller>\n )}\n </Section>\n )\n}\n"],"names":["tv","useRef","_jsx","FocusTrap","useContext","NavigationContext","ReleaseNoteContext","AppLauncherContext","useLocalize","useLatest","useMemo","useMergeRefs","_jsxs","Section","Cluster","MenuSubHeading","Button","FaXmarkIcon","Localizer","AppLauncher","Scroller","ReleaseNote","Navigation"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useContext, useMemo,
|
|
2
|
+
import { useContext, useMemo, useRef } from 'react';
|
|
3
3
|
import { tv as ce } from './../../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.46_@swc_helper_93b9c5ee15e3d3d2221e194197be3b5c/vendor/tailwind-variants/dist/index.js';
|
|
4
4
|
import { useLatest } from '../../../../hooks/useLatest.js';
|
|
5
|
+
import { useMergeRefs } from '../../../../hooks/useMergeRefs.js';
|
|
5
6
|
import '../../../../intl/IntlProvider.js';
|
|
6
7
|
import { useLocalize } from '../../../../intl/useIntl.js';
|
|
7
8
|
import 'react-intl';
|
|
@@ -90,21 +91,31 @@ const Content = ({ domRef, children, setIsOpen, tenantSelector }) => {
|
|
|
90
91
|
setIsReleaseNoteSelected,
|
|
91
92
|
setSelectedNavigationGroup,
|
|
92
93
|
});
|
|
93
|
-
const functions = useMemo(() =>
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
94
|
+
const functions = useMemo(() => {
|
|
95
|
+
const clearAppLauncher = () => latest.setIsAppLauncherSelected(false);
|
|
96
|
+
const clearReleaseNote = () => latest.setIsReleaseNoteSelected(false);
|
|
97
|
+
const clearNavigationGroup = () => latest.setSelectedNavigationGroup(null);
|
|
98
|
+
return {
|
|
99
|
+
// HINT: Contentをanimationで非表示にしたい
|
|
100
|
+
// アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、
|
|
101
|
+
// unmount時に操作内容のclearを行う
|
|
102
|
+
// HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している
|
|
103
|
+
// もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する
|
|
104
|
+
callbackRef: () => () => {
|
|
105
|
+
clearReleaseNote();
|
|
106
|
+
clearAppLauncher();
|
|
107
|
+
clearNavigationGroup();
|
|
108
|
+
},
|
|
109
|
+
clearAppLauncher,
|
|
110
|
+
clearReleaseNote,
|
|
111
|
+
clearNavigationGroup,
|
|
112
|
+
handleDialogClose: () => latest.setIsOpen(false),
|
|
113
|
+
};
|
|
114
|
+
}, [latest]);
|
|
115
|
+
// HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している
|
|
116
|
+
// もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する
|
|
117
|
+
const mergedRef = useMergeRefs(functions.callbackRef, domRef);
|
|
118
|
+
return (jsxs(Section, { ref: mergedRef, role: "dialog", "aria-modal": "true", className: CLASS_NAMES.wrapper, children: [jsx("div", { className: CLASS_NAMES.header, children: jsxs(Cluster, { justify: "space-between", align: "center", children: [isAppLauncherSelected ? (jsx(MenuSubHeading, { title: translated.launcherListText, handleClickBack: functions.clearAppLauncher })) : isReleaseNoteSelected ? (
|
|
108
119
|
// eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content
|
|
109
120
|
jsx(MenuSubHeading, { title: translated.latestReleaseNotes, handleClickBack: functions.clearReleaseNote })) : selectedNavigationGroup ? (
|
|
110
121
|
// eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuDialog.js","sources":["../../../../../src/components/AppHeader/components/mobile/MenuDialog.tsx"],"sourcesContent":["import {\n type Dispatch,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../../../hooks/useLatest'\nimport { Localizer, useLocalize } from '../../../../intl'\nimport { Button } from '../../../Button'\nimport { FocusTrap } from '../../../Dialog'\nimport { FaXmarkIcon } from '../../../Icon'\nimport { Cluster } from '../../../Layout'\nimport { Scroller } from '../../../Scroller'\nimport { Section } from '../../../SectioningContent'\n\nimport { AppLauncher } from './AppLauncher'\nimport { AppLauncherContext } from './AppLauncherContext'\nimport { MenuSubHeading } from './MenuSubHeading'\nimport { Navigation } from './Navigation'\nimport { NavigationContext } from './NavigationContext'\nimport { ReleaseNote } from './ReleaseNote'\nimport { ReleaseNoteContext } from './ReleaseNoteContext'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: [\n 'shr-fixed shr-left-0 shr-top-0 shr-flex shr-h-full shr-w-full shr-flex-col shr-bg-white',\n 'shr-translate-opacity shr-opacity-0 shr-duration-150',\n '[&&.shr-sp-menu-enter-active]:shr-opacity-100',\n '[&&.shr-sp-menu-enter-done]:shr-opacity-100',\n '[&&.shr-sp-menu-exit-active]:shr-opacity-0',\n '[&&.shr-sp-menu-exit-done]:shr-opacity-0',\n ],\n header: 'shr-border-b-shorthand shr-sticky shr-top-0 shr-px-0.75 shr-py-0.5',\n content: 'shr-p-1',\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { wrapper, header, content } = classNameGenerator()\n\n return {\n wrapper: wrapper(),\n header: header(),\n content: content(),\n }\n})()\n\ntype Props = PropsWithChildren<{\n isOpen: boolean\n setIsOpen: Dispatch<boolean>\n tenantSelector: ReactNode\n}>\n\nexport const MenuDialog: FC<Props> = ({ isOpen, ...rest }) => {\n const domRef = useRef<HTMLSelectElement>(null)\n\n return (\n <CSSTransition\n classNames=\"shr-sp-menu\"\n in={isOpen}\n timeout={300}\n unmountOnExit\n nodeRef={domRef}\n >\n <div className=\"shr-fixed shr-z-overlap-base\">\n <FocusTrap>\n <Content {...rest} domRef={domRef} />\n </FocusTrap>\n </div>\n </CSSTransition>\n )\n}\n\nexport const Content: FC<\n Omit<Props, 'isOpen'> & {\n domRef: RefObject<HTMLSelectElement>\n }\n> = ({ domRef, children, setIsOpen, tenantSelector }) => {\n const { selectedNavigationGroup, setSelectedNavigationGroup } = useContext(NavigationContext)\n const { isReleaseNoteSelected, setIsReleaseNoteSelected } = useContext(ReleaseNoteContext)\n const { features, isAppLauncherSelected, setIsAppLauncherSelected } =\n useContext(AppLauncherContext)\n\n const translated = useLocalize({\n launcherListText: {\n id: 'smarthr-ui/AppHeader/Launcher/listText',\n defaultText: 'アプリ一覧',\n },\n latestReleaseNotes: {\n id: 'smarthr-ui/AppHeader/MobileHeader/latestReleaseNotes',\n defaultText: '最新のリリースノート',\n },\n })\n\n const latest = useLatest({\n setIsOpen,\n setIsAppLauncherSelected,\n setIsReleaseNoteSelected,\n setSelectedNavigationGroup,\n })\n\n const functions = useMemo(\n () => ({\n handleDialogClose: () => latest.setIsOpen(false),\n clearAppLauncher: () => latest.setIsAppLauncherSelected(false),\n clearReleaseNote: () => latest.setIsReleaseNoteSelected(false),\n clearNavigationGroup: () => latest.setSelectedNavigationGroup(null),\n }),\n [latest],\n )\n\n // HINT: Contentをanimationで非表示にしたい\n // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、\n // unmount時に操作内容のclearを行う\n useEffect(\n () => () => {\n functions.clearReleaseNote()\n functions.clearAppLauncher()\n functions.clearNavigationGroup()\n },\n [functions],\n )\n\n return (\n <Section role=\"dialog\" aria-modal=\"true\" className={CLASS_NAMES.wrapper} ref={domRef}>\n <div className={CLASS_NAMES.header}>\n <Cluster justify=\"space-between\" align=\"center\">\n {isAppLauncherSelected ? (\n <MenuSubHeading\n title={translated.launcherListText}\n handleClickBack={functions.clearAppLauncher}\n />\n ) : isReleaseNoteSelected ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={translated.latestReleaseNotes}\n handleClickBack={functions.clearReleaseNote}\n />\n ) : selectedNavigationGroup ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={selectedNavigationGroup.children}\n handleClickBack={functions.clearNavigationGroup}\n />\n ) : (\n <div>{tenantSelector}</div>\n )}\n\n <Button variant=\"secondary\" size=\"S\" onClick={functions.handleDialogClose}>\n <FaXmarkIcon\n alt={\n <Localizer\n id=\"smarthr-ui/AppHeader/MobileHeader/closeMenu\"\n defaultText=\"メニューを閉じる\"\n />\n }\n />\n </Button>\n </Cluster>\n </div>\n\n {isAppLauncherSelected && features && features.length > 0 ? (\n <AppLauncher features={features} />\n ) : (\n <Scroller direction=\"vertical\" className={CLASS_NAMES.content}>\n {isReleaseNoteSelected ? (\n <ReleaseNote />\n ) : selectedNavigationGroup ? (\n <Navigation\n navigations={selectedNavigationGroup.childNavigations}\n handleClickNavigation={functions.handleDialogClose}\n />\n ) : (\n children\n )}\n </Scroller>\n )}\n </Section>\n )\n}\n"],"names":["tv","_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MenuDialog.js","sources":["../../../../../src/components/AppHeader/components/mobile/MenuDialog.tsx"],"sourcesContent":["import {\n type Dispatch,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n useContext,\n useMemo,\n useRef,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../../../hooks/useLatest'\nimport { useMergeRefs } from '../../../../hooks/useMergeRefs'\nimport { Localizer, useLocalize } from '../../../../intl'\nimport { Button } from '../../../Button'\nimport { FocusTrap } from '../../../Dialog'\nimport { FaXmarkIcon } from '../../../Icon'\nimport { Cluster } from '../../../Layout'\nimport { Scroller } from '../../../Scroller'\nimport { Section } from '../../../SectioningContent'\n\nimport { AppLauncher } from './AppLauncher'\nimport { AppLauncherContext } from './AppLauncherContext'\nimport { MenuSubHeading } from './MenuSubHeading'\nimport { Navigation } from './Navigation'\nimport { NavigationContext } from './NavigationContext'\nimport { ReleaseNote } from './ReleaseNote'\nimport { ReleaseNoteContext } from './ReleaseNoteContext'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: [\n 'shr-fixed shr-left-0 shr-top-0 shr-flex shr-h-full shr-w-full shr-flex-col shr-bg-white',\n 'shr-translate-opacity shr-opacity-0 shr-duration-150',\n '[&&.shr-sp-menu-enter-active]:shr-opacity-100',\n '[&&.shr-sp-menu-enter-done]:shr-opacity-100',\n '[&&.shr-sp-menu-exit-active]:shr-opacity-0',\n '[&&.shr-sp-menu-exit-done]:shr-opacity-0',\n ],\n header: 'shr-border-b-shorthand shr-sticky shr-top-0 shr-px-0.75 shr-py-0.5',\n content: 'shr-p-1',\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { wrapper, header, content } = classNameGenerator()\n\n return {\n wrapper: wrapper(),\n header: header(),\n content: content(),\n }\n})()\n\ntype Props = PropsWithChildren<{\n isOpen: boolean\n setIsOpen: Dispatch<boolean>\n tenantSelector: ReactNode\n}>\n\nexport const MenuDialog: FC<Props> = ({ isOpen, ...rest }) => {\n const domRef = useRef<HTMLSelectElement>(null)\n\n return (\n <CSSTransition\n classNames=\"shr-sp-menu\"\n in={isOpen}\n timeout={300}\n unmountOnExit\n nodeRef={domRef}\n >\n <div className=\"shr-fixed shr-z-overlap-base\">\n <FocusTrap>\n <Content {...rest} domRef={domRef} />\n </FocusTrap>\n </div>\n </CSSTransition>\n )\n}\n\nexport const Content: FC<\n Omit<Props, 'isOpen'> & {\n domRef: RefObject<HTMLSelectElement>\n }\n> = ({ domRef, children, setIsOpen, tenantSelector }) => {\n const { selectedNavigationGroup, setSelectedNavigationGroup } = useContext(NavigationContext)\n const { isReleaseNoteSelected, setIsReleaseNoteSelected } = useContext(ReleaseNoteContext)\n const { features, isAppLauncherSelected, setIsAppLauncherSelected } =\n useContext(AppLauncherContext)\n\n const translated = useLocalize({\n launcherListText: {\n id: 'smarthr-ui/AppHeader/Launcher/listText',\n defaultText: 'アプリ一覧',\n },\n latestReleaseNotes: {\n id: 'smarthr-ui/AppHeader/MobileHeader/latestReleaseNotes',\n defaultText: '最新のリリースノート',\n },\n })\n\n const latest = useLatest({\n setIsOpen,\n setIsAppLauncherSelected,\n setIsReleaseNoteSelected,\n setSelectedNavigationGroup,\n })\n\n const functions = useMemo(() => {\n const clearAppLauncher = () => latest.setIsAppLauncherSelected(false)\n const clearReleaseNote = () => latest.setIsReleaseNoteSelected(false)\n const clearNavigationGroup = () => latest.setSelectedNavigationGroup(null)\n\n return {\n // HINT: Contentをanimationで非表示にしたい\n // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、\n // unmount時に操作内容のclearを行う\n // HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している\n // もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する\n callbackRef: () => () => {\n clearReleaseNote()\n clearAppLauncher()\n clearNavigationGroup()\n },\n clearAppLauncher,\n clearReleaseNote,\n clearNavigationGroup,\n handleDialogClose: () => latest.setIsOpen(false),\n }\n }, [latest])\n\n // HINT: useMergeRefsはv18でもcallbackRefのcleanup関数に対応している\n // もしuseMergeRefsをなくす場合、react v18対応が不要になっているかどうか確認する\n const mergedRef = useMergeRefs(functions.callbackRef, domRef)\n\n return (\n <Section ref={mergedRef} role=\"dialog\" aria-modal=\"true\" className={CLASS_NAMES.wrapper}>\n <div className={CLASS_NAMES.header}>\n <Cluster justify=\"space-between\" align=\"center\">\n {isAppLauncherSelected ? (\n <MenuSubHeading\n title={translated.launcherListText}\n handleClickBack={functions.clearAppLauncher}\n />\n ) : isReleaseNoteSelected ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={translated.latestReleaseNotes}\n handleClickBack={functions.clearReleaseNote}\n />\n ) : selectedNavigationGroup ? (\n // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content\n <MenuSubHeading\n title={selectedNavigationGroup.children}\n handleClickBack={functions.clearNavigationGroup}\n />\n ) : (\n <div>{tenantSelector}</div>\n )}\n\n <Button variant=\"secondary\" size=\"S\" onClick={functions.handleDialogClose}>\n <FaXmarkIcon\n alt={\n <Localizer\n id=\"smarthr-ui/AppHeader/MobileHeader/closeMenu\"\n defaultText=\"メニューを閉じる\"\n />\n }\n />\n </Button>\n </Cluster>\n </div>\n\n {isAppLauncherSelected && features && features.length > 0 ? (\n <AppLauncher features={features} />\n ) : (\n <Scroller direction=\"vertical\" className={CLASS_NAMES.content}>\n {isReleaseNoteSelected ? (\n <ReleaseNote />\n ) : selectedNavigationGroup ? (\n <Navigation\n navigations={selectedNavigationGroup.childNavigations}\n handleClickNavigation={functions.handleDialogClose}\n />\n ) : (\n children\n )}\n </Scroller>\n )}\n </Section>\n )\n}\n"],"names":["tv","_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -35,10 +35,17 @@ const CLASS_NAMES = (() => {
|
|
|
35
35
|
yearWrapper: yearWrapper(),
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
|
+
const FOCUS_CALLBACK_REF = (node) => {
|
|
39
|
+
if (node) {
|
|
40
|
+
// HINT: 現在の年に一度focusを当てることでtab移動をしやすくする
|
|
41
|
+
// focusを当てたままでは違和感があるため、blurで解除している
|
|
42
|
+
node.focus();
|
|
43
|
+
node.blur();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
38
46
|
const YearPicker = ({ isDisplayed, ...rest }) => isDisplayed ? jsxRuntime.jsx(ActualYearPicker, { ...rest }) : null;
|
|
39
47
|
const ActualYearPicker = ({ selectedYear, fromYear, toYear, handleSelectYear, id, ...rest }) => {
|
|
40
|
-
const
|
|
41
|
-
const thisYear = React.useMemo(() => new Date().getFullYear(), []);
|
|
48
|
+
const [thisYear] = React.useState(() => new Date().getFullYear());
|
|
42
49
|
const yearArray = React.useMemo(() => {
|
|
43
50
|
const length = Math.max(Math.min(toYear, 9999) - fromYear + 1, 0);
|
|
44
51
|
const result = [];
|
|
@@ -47,25 +54,17 @@ const ActualYearPicker = ({ selectedYear, fromYear, toYear, handleSelectYear, id
|
|
|
47
54
|
}
|
|
48
55
|
return result;
|
|
49
56
|
}, [toYear, fromYear]);
|
|
50
|
-
|
|
51
|
-
if (focusingRef.current) {
|
|
52
|
-
// HINT: 現在の年に一度focusを当てることでtab移動をしやすくする
|
|
53
|
-
// focusを当てたままでは違和感があるため、blurで解除している
|
|
54
|
-
focusingRef.current.focus();
|
|
55
|
-
focusingRef.current.blur();
|
|
56
|
-
}
|
|
57
|
-
}, []);
|
|
58
|
-
return (jsxRuntime.jsx("div", { ...rest, id: id, className: CLASS_NAMES.overlay, children: jsxRuntime.jsx(components_Scroller_Scroller.Scroller, { className: CLASS_NAMES.container, children: yearArray.map((year) => (jsxRuntime.jsx(YearButton, { year: year, thisYear: thisYear, selected: selectedYear === year, focusingRef: focusingRef, className: CLASS_NAMES.yearButton, childrenStyle: CLASS_NAMES.yearWrapper, handleClick: handleSelectYear }, year))) }) }));
|
|
57
|
+
return (jsxRuntime.jsx("div", { ...rest, id: id, className: CLASS_NAMES.overlay, children: jsxRuntime.jsx(components_Scroller_Scroller.Scroller, { className: CLASS_NAMES.container, children: yearArray.map((year) => (jsxRuntime.jsx(YearButton, { year: year, thisYear: thisYear, selected: selectedYear === year, handleClick: handleSelectYear }, year))) }) }));
|
|
59
58
|
};
|
|
60
|
-
const YearButton = React.memo(({ year, thisYear, selected,
|
|
59
|
+
const YearButton = React.memo(({ year, thisYear, selected, handleClick }) => {
|
|
61
60
|
const { localize } = intl_useIntl.useIntl();
|
|
62
61
|
const isThisYear = thisYear === year;
|
|
63
|
-
return (jsxRuntime.jsx(components_Button_UnstyledButton.UnstyledButton, { ref: isThisYear ?
|
|
62
|
+
return (jsxRuntime.jsx(components_Button_UnstyledButton.UnstyledButton, { ref: isThisYear ? FOCUS_CALLBACK_REF : null, value: year, "aria-pressed": selected, onClick: handleClick, className: CLASS_NAMES.yearButton, "data-this-year": isThisYear, "aria-label": isThisYear
|
|
64
63
|
? localize({
|
|
65
64
|
id: 'smarthr-ui/Calendar/currentYear',
|
|
66
65
|
defaultText: '現在の年',
|
|
67
66
|
})
|
|
68
|
-
: undefined, children: jsxRuntime.jsx("span", { className:
|
|
67
|
+
: undefined, children: jsxRuntime.jsx("span", { className: CLASS_NAMES.yearWrapper, children: year }) }));
|
|
69
68
|
});
|
|
70
69
|
|
|
71
70
|
exports.YearPicker = YearPicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YearPicker.cjs","sources":["../../../src/components/Calendar/YearPicker.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"YearPicker.cjs","sources":["../../../src/components/Calendar/YearPicker.tsx"],"sourcesContent":["import { type ComponentProps, type FC, type MouseEvent, memo, useMemo, useState } from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useIntl } from '../../intl'\nimport { UnstyledButton } from '../Button'\nimport { Scroller } from '../Scroller'\n\ntype BaseProps = {\n /** 選択された年 */\n selectedYear?: number\n /** 選択可能な開始年 */\n fromYear: number\n /** 選択可能な終了年 */\n toYear: number\n /** トリガのセレクトイベントを処理するハンドラ */\n handleSelectYear: (e: MouseEvent<HTMLButtonElement>) => void\n /** 表示フラグ */\n isDisplayed: boolean\n /** HTMLのid属性 */\n id: string\n}\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\ntype ActualProps = Omit<Props, 'isDisplayed'>\n\nconst classNameGenerator = tv({\n slots: {\n overlay: 'smarthr-ui-YearPicker shr-absolute shr-inset-0 shr-bg-white',\n container:\n 'shr-box-border shr-flex shr-h-full shr-w-full shr-flex-wrap shr-items-start shr-px-0.25 shr-py-0.5',\n yearButton:\n 'smarthr-ui-YearPicker-selectYear shr-group shr-flex shr-w-1/4 shr-items-center shr-justify-center shr-px-0 shr-py-0.5 shr-leading-none',\n yearWrapper: [\n 'shr-box-border shr-inline-block shr-rounded-full shr-px-0.75 shr-py-0.5 shr-text-base shr-leading-none group-hover:shr-bg-base-grey group-hover:shr-text-black',\n '[[data-this-year=\"true\"]>&]:shr-border-shorthand',\n '[[aria-pressed=\"true\"]>&]:shr-bg-main [[aria-pressed=\"true\"]>&]:shr-text-white',\n ],\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { overlay, container, yearButton, yearWrapper } = classNameGenerator()\n\n return {\n overlay: overlay(),\n container: container(),\n yearButton: yearButton(),\n yearWrapper: yearWrapper(),\n }\n})()\n\nconst FOCUS_CALLBACK_REF = (node: HTMLButtonElement | null) => {\n if (node) {\n // HINT: 現在の年に一度focusを当てることでtab移動をしやすくする\n // focusを当てたままでは違和感があるため、blurで解除している\n node.focus()\n node.blur()\n }\n}\n\nexport const YearPicker: FC<Props> = ({ isDisplayed, ...rest }) =>\n isDisplayed ? <ActualYearPicker {...rest} /> : null\n\nconst ActualYearPicker: FC<ActualProps> = ({\n selectedYear,\n fromYear,\n toYear,\n handleSelectYear,\n id,\n ...rest\n}) => {\n const [thisYear] = useState(() => new Date().getFullYear())\n const yearArray = useMemo(() => {\n const length = Math.max(Math.min(toYear, 9999) - fromYear + 1, 0)\n const result: number[] = []\n\n for (let i = 0; i < length; i++) {\n result[i] = fromYear + i\n }\n\n return result\n }, [toYear, fromYear])\n\n return (\n <div {...rest} id={id} className={CLASS_NAMES.overlay}>\n <Scroller className={CLASS_NAMES.container}>\n {yearArray.map((year) => (\n <YearButton\n key={year}\n year={year}\n thisYear={thisYear}\n selected={selectedYear === year}\n handleClick={handleSelectYear}\n />\n ))}\n </Scroller>\n </div>\n )\n}\n\nconst YearButton = memo<{\n year: number\n thisYear: number\n selected: boolean\n handleClick: (e: MouseEvent<HTMLButtonElement>) => void\n}>(({ year, thisYear, selected, handleClick }) => {\n const { localize } = useIntl()\n const isThisYear = thisYear === year\n\n return (\n <UnstyledButton\n ref={isThisYear ? FOCUS_CALLBACK_REF : null}\n value={year}\n aria-pressed={selected}\n onClick={handleClick}\n className={CLASS_NAMES.yearButton}\n data-this-year={isThisYear}\n aria-label={\n isThisYear\n ? localize({\n id: 'smarthr-ui/Calendar/currentYear',\n defaultText: '現在の年',\n })\n : undefined\n }\n >\n <span className={CLASS_NAMES.yearWrapper}>{year}</span>\n </UnstyledButton>\n )\n})\n"],"names":["tv","_jsx","useState","useMemo","Scroller","memo","useIntl","UnstyledButton"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { memo,
|
|
2
|
+
import { memo, useState, useMemo } from 'react';
|
|
3
3
|
import { tv as ce } from './../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.46_@swc_helper_93b9c5ee15e3d3d2221e194197be3b5c/vendor/tailwind-variants/dist/index.js';
|
|
4
4
|
import '../../intl/IntlProvider.js';
|
|
5
5
|
import { useIntl } from '../../intl/useIntl.js';
|
|
@@ -33,10 +33,17 @@ const CLASS_NAMES = (() => {
|
|
|
33
33
|
yearWrapper: yearWrapper(),
|
|
34
34
|
};
|
|
35
35
|
})();
|
|
36
|
+
const FOCUS_CALLBACK_REF = (node) => {
|
|
37
|
+
if (node) {
|
|
38
|
+
// HINT: 現在の年に一度focusを当てることでtab移動をしやすくする
|
|
39
|
+
// focusを当てたままでは違和感があるため、blurで解除している
|
|
40
|
+
node.focus();
|
|
41
|
+
node.blur();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
36
44
|
const YearPicker = ({ isDisplayed, ...rest }) => isDisplayed ? jsx(ActualYearPicker, { ...rest }) : null;
|
|
37
45
|
const ActualYearPicker = ({ selectedYear, fromYear, toYear, handleSelectYear, id, ...rest }) => {
|
|
38
|
-
const
|
|
39
|
-
const thisYear = useMemo(() => new Date().getFullYear(), []);
|
|
46
|
+
const [thisYear] = useState(() => new Date().getFullYear());
|
|
40
47
|
const yearArray = useMemo(() => {
|
|
41
48
|
const length = Math.max(Math.min(toYear, 9999) - fromYear + 1, 0);
|
|
42
49
|
const result = [];
|
|
@@ -45,25 +52,17 @@ const ActualYearPicker = ({ selectedYear, fromYear, toYear, handleSelectYear, id
|
|
|
45
52
|
}
|
|
46
53
|
return result;
|
|
47
54
|
}, [toYear, fromYear]);
|
|
48
|
-
|
|
49
|
-
if (focusingRef.current) {
|
|
50
|
-
// HINT: 現在の年に一度focusを当てることでtab移動をしやすくする
|
|
51
|
-
// focusを当てたままでは違和感があるため、blurで解除している
|
|
52
|
-
focusingRef.current.focus();
|
|
53
|
-
focusingRef.current.blur();
|
|
54
|
-
}
|
|
55
|
-
}, []);
|
|
56
|
-
return (jsx("div", { ...rest, id: id, className: CLASS_NAMES.overlay, children: jsx(Scroller, { className: CLASS_NAMES.container, children: yearArray.map((year) => (jsx(YearButton, { year: year, thisYear: thisYear, selected: selectedYear === year, focusingRef: focusingRef, className: CLASS_NAMES.yearButton, childrenStyle: CLASS_NAMES.yearWrapper, handleClick: handleSelectYear }, year))) }) }));
|
|
55
|
+
return (jsx("div", { ...rest, id: id, className: CLASS_NAMES.overlay, children: jsx(Scroller, { className: CLASS_NAMES.container, children: yearArray.map((year) => (jsx(YearButton, { year: year, thisYear: thisYear, selected: selectedYear === year, handleClick: handleSelectYear }, year))) }) }));
|
|
57
56
|
};
|
|
58
|
-
const YearButton = memo(({ year, thisYear, selected,
|
|
57
|
+
const YearButton = memo(({ year, thisYear, selected, handleClick }) => {
|
|
59
58
|
const { localize } = useIntl();
|
|
60
59
|
const isThisYear = thisYear === year;
|
|
61
|
-
return (jsx(UnstyledButton, { ref: isThisYear ?
|
|
60
|
+
return (jsx(UnstyledButton, { ref: isThisYear ? FOCUS_CALLBACK_REF : null, value: year, "aria-pressed": selected, onClick: handleClick, className: CLASS_NAMES.yearButton, "data-this-year": isThisYear, "aria-label": isThisYear
|
|
62
61
|
? localize({
|
|
63
62
|
id: 'smarthr-ui/Calendar/currentYear',
|
|
64
63
|
defaultText: '現在の年',
|
|
65
64
|
})
|
|
66
|
-
: undefined, children: jsx("span", { className:
|
|
65
|
+
: undefined, children: jsx("span", { className: CLASS_NAMES.yearWrapper, children: year }) }));
|
|
67
66
|
});
|
|
68
67
|
|
|
69
68
|
export { YearPicker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YearPicker.js","sources":["../../../src/components/Calendar/YearPicker.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"YearPicker.js","sources":["../../../src/components/Calendar/YearPicker.tsx"],"sourcesContent":["import { type ComponentProps, type FC, type MouseEvent, memo, useMemo, useState } from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useIntl } from '../../intl'\nimport { UnstyledButton } from '../Button'\nimport { Scroller } from '../Scroller'\n\ntype BaseProps = {\n /** 選択された年 */\n selectedYear?: number\n /** 選択可能な開始年 */\n fromYear: number\n /** 選択可能な終了年 */\n toYear: number\n /** トリガのセレクトイベントを処理するハンドラ */\n handleSelectYear: (e: MouseEvent<HTMLButtonElement>) => void\n /** 表示フラグ */\n isDisplayed: boolean\n /** HTMLのid属性 */\n id: string\n}\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\ntype ActualProps = Omit<Props, 'isDisplayed'>\n\nconst classNameGenerator = tv({\n slots: {\n overlay: 'smarthr-ui-YearPicker shr-absolute shr-inset-0 shr-bg-white',\n container:\n 'shr-box-border shr-flex shr-h-full shr-w-full shr-flex-wrap shr-items-start shr-px-0.25 shr-py-0.5',\n yearButton:\n 'smarthr-ui-YearPicker-selectYear shr-group shr-flex shr-w-1/4 shr-items-center shr-justify-center shr-px-0 shr-py-0.5 shr-leading-none',\n yearWrapper: [\n 'shr-box-border shr-inline-block shr-rounded-full shr-px-0.75 shr-py-0.5 shr-text-base shr-leading-none group-hover:shr-bg-base-grey group-hover:shr-text-black',\n '[[data-this-year=\"true\"]>&]:shr-border-shorthand',\n '[[aria-pressed=\"true\"]>&]:shr-bg-main [[aria-pressed=\"true\"]>&]:shr-text-white',\n ],\n },\n})\n\nconst CLASS_NAMES = (() => {\n const { overlay, container, yearButton, yearWrapper } = classNameGenerator()\n\n return {\n overlay: overlay(),\n container: container(),\n yearButton: yearButton(),\n yearWrapper: yearWrapper(),\n }\n})()\n\nconst FOCUS_CALLBACK_REF = (node: HTMLButtonElement | null) => {\n if (node) {\n // HINT: 現在の年に一度focusを当てることでtab移動をしやすくする\n // focusを当てたままでは違和感があるため、blurで解除している\n node.focus()\n node.blur()\n }\n}\n\nexport const YearPicker: FC<Props> = ({ isDisplayed, ...rest }) =>\n isDisplayed ? <ActualYearPicker {...rest} /> : null\n\nconst ActualYearPicker: FC<ActualProps> = ({\n selectedYear,\n fromYear,\n toYear,\n handleSelectYear,\n id,\n ...rest\n}) => {\n const [thisYear] = useState(() => new Date().getFullYear())\n const yearArray = useMemo(() => {\n const length = Math.max(Math.min(toYear, 9999) - fromYear + 1, 0)\n const result: number[] = []\n\n for (let i = 0; i < length; i++) {\n result[i] = fromYear + i\n }\n\n return result\n }, [toYear, fromYear])\n\n return (\n <div {...rest} id={id} className={CLASS_NAMES.overlay}>\n <Scroller className={CLASS_NAMES.container}>\n {yearArray.map((year) => (\n <YearButton\n key={year}\n year={year}\n thisYear={thisYear}\n selected={selectedYear === year}\n handleClick={handleSelectYear}\n />\n ))}\n </Scroller>\n </div>\n )\n}\n\nconst YearButton = memo<{\n year: number\n thisYear: number\n selected: boolean\n handleClick: (e: MouseEvent<HTMLButtonElement>) => void\n}>(({ year, thisYear, selected, handleClick }) => {\n const { localize } = useIntl()\n const isThisYear = thisYear === year\n\n return (\n <UnstyledButton\n ref={isThisYear ? FOCUS_CALLBACK_REF : null}\n value={year}\n aria-pressed={selected}\n onClick={handleClick}\n className={CLASS_NAMES.yearButton}\n data-this-year={isThisYear}\n aria-label={\n isThisYear\n ? localize({\n id: 'smarthr-ui/Calendar/currentYear',\n defaultText: '現在の年',\n })\n : undefined\n }\n >\n <span className={CLASS_NAMES.yearWrapper}>{year}</span>\n </UnstyledButton>\n )\n})\n"],"names":["tv","_jsx"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var index = require('./../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.46_@swc_helper_93b9c5ee15e3d3d2221e194197be3b5c/vendor/tailwind-variants/dist/index.cjs');
|
|
7
|
+
var hooks_useMergeRefs = require('../../hooks/useMergeRefs.cjs');
|
|
7
8
|
var components_Icon_FaIcon = require('../Icon/FaIcon.cjs');
|
|
8
9
|
require('../Icon/generateIcon.cjs');
|
|
9
10
|
require('../Icon/OpenInNewTabIcon.cjs');
|
|
@@ -61,13 +62,13 @@ const Checkbox = React.forwardRef(({ checked, mixed, error, className, children,
|
|
|
61
62
|
const inputRef = React.useRef(null);
|
|
62
63
|
const defaultId = React.useId();
|
|
63
64
|
const checkBoxId = id || defaultId;
|
|
64
|
-
|
|
65
|
+
const mergedRef = hooks_useMergeRefs.useMergeRefs(inputRef, ref);
|
|
65
66
|
React.useEffect(() => {
|
|
66
67
|
if (inputRef.current) {
|
|
67
68
|
inputRef.current.indeterminate = !!(checked && mixed);
|
|
68
69
|
}
|
|
69
70
|
}, [checked, mixed]);
|
|
70
|
-
return (jsxRuntime.jsxs("span", { "data-disabled": disabled, className: classNames.wrapper, children: [jsxRuntime.jsxs("span", { className: classNames.innerWrapper, children: [jsxRuntime.jsx("input", { ...rest, ref:
|
|
71
|
+
return (jsxRuntime.jsxs("span", { "data-disabled": disabled, className: classNames.wrapper, children: [jsxRuntime.jsxs("span", { className: classNames.innerWrapper, children: [jsxRuntime.jsx("input", { ...rest, ref: mergedRef, type: "checkbox", id: checkBoxId, checked: checked, disabled: disabled, "aria-invalid": error || undefined, className: classNames.input, "data-smarthr-ui-input": "true" }), jsxRuntime.jsx(AriaHiddenBox, { className: classNames.box }), jsxRuntime.jsx(CheckIconArea, { mixed: mixed, classNames: classNames })] }), children && (jsxRuntime.jsx("label", { htmlFor: checkBoxId, className: classNames.label, children: children }))] }));
|
|
71
72
|
});
|
|
72
73
|
const AriaHiddenBox = React.memo(({ className }) => (jsxRuntime.jsx("span", { className: className, "aria-hidden": "true" })));
|
|
73
74
|
const CheckIconArea = React.memo(({ mixed, classNames }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.cjs","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithRef,\n type PropsWithChildren,\n forwardRef,\n memo,\n useEffect,\n useId,\n
|
|
1
|
+
{"version":3,"file":"Checkbox.cjs","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithRef,\n type PropsWithChildren,\n forwardRef,\n memo,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useMergeRefs } from '../../hooks/useMergeRefs'\nimport { FaCheckIcon, FaMinusIcon } from '../Icon'\n\nexport type Props = PropsWithChildren<\n ComponentPropsWithRef<'input'> & {\n /** `true` のとき、チェック状態を `mixed` にする */\n mixed?: boolean\n /** チェックボックスにエラーがあるかどうか */\n error?: boolean\n }\n>\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Checkbox shr-inline-flex shr-items-baseline',\n box: [\n 'shr-border-shorthand shr-pointer-events-none shr-absolute shr-box-border shr-h-full shr-w-full shr-rounded-s shr-bg-white',\n 'contrast-more:shr-border-high-contrast',\n /* 強制カラーモードのときは、ブラウザ標準のUIを表示する */\n 'forced-colors:shr-hidden',\n 'peer-checked:shr-border-main peer-checked:shr-bg-main contrast-more:peer-checked:shr-border-high-contrast',\n 'peer-indeterminate:shr-border-main peer-indeterminate:shr-bg-main contrast-more:peer-indeterminate:shr-border-high-contrast',\n 'peer-disabled:shr-border-disabled peer-disabled:shr-bg-white-darken',\n 'peer-disabled:peer-checked:shr-border-default peer-disabled:peer-checked:shr-bg-border',\n 'peer-disabled:peer-indeterminate:shr-border-default peer-disabled:peer-indeterminate:shr-bg-border',\n 'peer-focus-visible:shr-focus-indicator--outer',\n 'peer-hover:shr-shadow-input-hover',\n 'shr-border-default',\n 'peer-[[aria-invalid]]:shr-border-danger',\n ],\n input: [\n 'smarthr-ui-Checkbox-checkbox shr-peer shr-absolute shr-left-0 shr-top-0 shr-m-0 shr-h-full shr-w-full shr-cursor-pointer shr-opacity-0 disabled:shr-pointer-events-none',\n /* 強制カラーモードのときは、ブラウザ標準のUIを表示する */\n 'forced-colors:shr-static forced-colors:shr-opacity-100',\n ],\n icon: 'shr-fill-current',\n iconWrap: [\n 'shr-pointer-events-none shr-absolute shr-left-1/2 shr-top-1/2 shr-inline-block shr-h-[theme(fontSize.2xs)] shr-w-[theme(fontSize.2xs)] -shr-translate-x-1/2 -shr-translate-y-1/2 shr-text-2xs',\n 'shr-text-transparent peer-checked:shr-text-white peer-indeterminate:shr-text-white',\n 'peer-disabled:peer-checked:shr-text-white-darken peer-disabled:peer-indeterminate:shr-text-white-darken',\n 'forced-colors:shr-hidden',\n ],\n innerWrapper:\n 'shr-relative shr-box-border shr-inline-block shr-h-[theme(fontSize.base)] shr-w-[theme(fontSize.base)] shr-shrink-0 shr-translate-y-[0.125em] shr-leading-none',\n label: [\n 'smarthr-ui-Checkbox-label shr-ms-0.5 shr-cursor-pointer shr-text-base shr-leading-tight',\n '[[data-disabled=true]>&]:shr-pointer-events-none [[data-disabled=true]>&]:shr-cursor-not-allowed [[data-disabled=true]>&]:shr-text-disabled',\n ],\n },\n})\n\nexport const Checkbox = forwardRef<HTMLInputElement, Props>(\n ({ checked, mixed, error, className, children, disabled, id, ...rest }, ref) => {\n const classNames = useMemo(() => {\n const { wrapper, innerWrapper, box, input, iconWrap, icon, label } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n innerWrapper: innerWrapper(),\n box: box(),\n input: input(),\n iconWrap: iconWrap(),\n icon: icon(),\n label: label(),\n }\n }, [className])\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n const defaultId = useId()\n const checkBoxId = id || defaultId\n\n const mergedRef = useMergeRefs(inputRef, ref)\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = !!(checked && mixed)\n }\n }, [checked, mixed])\n\n return (\n <span data-disabled={disabled} className={classNames.wrapper}>\n <span className={classNames.innerWrapper}>\n <input\n {...rest}\n ref={mergedRef}\n type=\"checkbox\"\n id={checkBoxId}\n checked={checked}\n disabled={disabled}\n aria-invalid={error || undefined}\n className={classNames.input}\n data-smarthr-ui-input=\"true\"\n />\n <AriaHiddenBox className={classNames.box} />\n <CheckIconArea mixed={mixed} classNames={classNames} />\n </span>\n\n {children && (\n <label htmlFor={checkBoxId} className={classNames.label}>\n {children}\n </label>\n )}\n </span>\n )\n },\n)\n\nconst AriaHiddenBox = memo<{ className: string }>(({ className }) => (\n <span className={className} aria-hidden=\"true\" />\n))\n\nconst CheckIconArea = memo<\n Pick<Props, 'mixed'> & { classNames: { iconWrap: string; icon: string } }\n>(({ mixed, classNames }) => {\n const Icon = mixed ? FaMinusIcon : FaCheckIcon\n\n return (\n <span className={classNames.iconWrap}>\n <Icon className={classNames.icon} />\n </span>\n )\n})\n"],"names":[],"mappings":";;;;;;;;;;;AA0BA;AACE;AACE;AACA;;;;;;;;;;;;;;AAcC;AACD;;;;AAIC;AACD;AACA;;;;;AAKC;AACD;AAEA;;;AAGC;AACF;AACF;AAEM;AAEH;AACE;;AAGE;;;;;;;;AAQJ;AAEA;AAEA;AACA;;;AAKE;AACE;;AAEJ;;AA2BF;AAGF;AAIA;;AAKE;AAKF;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { forwardRef, useMemo, useRef, useId,
|
|
3
|
+
import { forwardRef, useMemo, useRef, useId, useEffect, memo } from 'react';
|
|
4
4
|
import { tv as ce } from './../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.46_@swc_helper_93b9c5ee15e3d3d2221e194197be3b5c/vendor/tailwind-variants/dist/index.js';
|
|
5
|
+
import { useMergeRefs } from '../../hooks/useMergeRefs.js';
|
|
5
6
|
import { FaMinusIcon, FaCheckIcon } from '../Icon/FaIcon.js';
|
|
6
7
|
import '../Icon/generateIcon.js';
|
|
7
8
|
import '../Icon/OpenInNewTabIcon.js';
|
|
@@ -59,13 +60,13 @@ const Checkbox = forwardRef(({ checked, mixed, error, className, children, disab
|
|
|
59
60
|
const inputRef = useRef(null);
|
|
60
61
|
const defaultId = useId();
|
|
61
62
|
const checkBoxId = id || defaultId;
|
|
62
|
-
|
|
63
|
+
const mergedRef = useMergeRefs(inputRef, ref);
|
|
63
64
|
useEffect(() => {
|
|
64
65
|
if (inputRef.current) {
|
|
65
66
|
inputRef.current.indeterminate = !!(checked && mixed);
|
|
66
67
|
}
|
|
67
68
|
}, [checked, mixed]);
|
|
68
|
-
return (jsxs("span", { "data-disabled": disabled, className: classNames.wrapper, children: [jsxs("span", { className: classNames.innerWrapper, children: [jsx("input", { ...rest, ref:
|
|
69
|
+
return (jsxs("span", { "data-disabled": disabled, className: classNames.wrapper, children: [jsxs("span", { className: classNames.innerWrapper, children: [jsx("input", { ...rest, ref: mergedRef, type: "checkbox", id: checkBoxId, checked: checked, disabled: disabled, "aria-invalid": error || undefined, className: classNames.input, "data-smarthr-ui-input": "true" }), jsx(AriaHiddenBox, { className: classNames.box }), jsx(CheckIconArea, { mixed: mixed, classNames: classNames })] }), children && (jsx("label", { htmlFor: checkBoxId, className: classNames.label, children: children }))] }));
|
|
69
70
|
});
|
|
70
71
|
const AriaHiddenBox = memo(({ className }) => (jsx("span", { className: className, "aria-hidden": "true" })));
|
|
71
72
|
const CheckIconArea = memo(({ mixed, classNames }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithRef,\n type PropsWithChildren,\n forwardRef,\n memo,\n useEffect,\n useId,\n
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithRef,\n type PropsWithChildren,\n forwardRef,\n memo,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useMergeRefs } from '../../hooks/useMergeRefs'\nimport { FaCheckIcon, FaMinusIcon } from '../Icon'\n\nexport type Props = PropsWithChildren<\n ComponentPropsWithRef<'input'> & {\n /** `true` のとき、チェック状態を `mixed` にする */\n mixed?: boolean\n /** チェックボックスにエラーがあるかどうか */\n error?: boolean\n }\n>\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Checkbox shr-inline-flex shr-items-baseline',\n box: [\n 'shr-border-shorthand shr-pointer-events-none shr-absolute shr-box-border shr-h-full shr-w-full shr-rounded-s shr-bg-white',\n 'contrast-more:shr-border-high-contrast',\n /* 強制カラーモードのときは、ブラウザ標準のUIを表示する */\n 'forced-colors:shr-hidden',\n 'peer-checked:shr-border-main peer-checked:shr-bg-main contrast-more:peer-checked:shr-border-high-contrast',\n 'peer-indeterminate:shr-border-main peer-indeterminate:shr-bg-main contrast-more:peer-indeterminate:shr-border-high-contrast',\n 'peer-disabled:shr-border-disabled peer-disabled:shr-bg-white-darken',\n 'peer-disabled:peer-checked:shr-border-default peer-disabled:peer-checked:shr-bg-border',\n 'peer-disabled:peer-indeterminate:shr-border-default peer-disabled:peer-indeterminate:shr-bg-border',\n 'peer-focus-visible:shr-focus-indicator--outer',\n 'peer-hover:shr-shadow-input-hover',\n 'shr-border-default',\n 'peer-[[aria-invalid]]:shr-border-danger',\n ],\n input: [\n 'smarthr-ui-Checkbox-checkbox shr-peer shr-absolute shr-left-0 shr-top-0 shr-m-0 shr-h-full shr-w-full shr-cursor-pointer shr-opacity-0 disabled:shr-pointer-events-none',\n /* 強制カラーモードのときは、ブラウザ標準のUIを表示する */\n 'forced-colors:shr-static forced-colors:shr-opacity-100',\n ],\n icon: 'shr-fill-current',\n iconWrap: [\n 'shr-pointer-events-none shr-absolute shr-left-1/2 shr-top-1/2 shr-inline-block shr-h-[theme(fontSize.2xs)] shr-w-[theme(fontSize.2xs)] -shr-translate-x-1/2 -shr-translate-y-1/2 shr-text-2xs',\n 'shr-text-transparent peer-checked:shr-text-white peer-indeterminate:shr-text-white',\n 'peer-disabled:peer-checked:shr-text-white-darken peer-disabled:peer-indeterminate:shr-text-white-darken',\n 'forced-colors:shr-hidden',\n ],\n innerWrapper:\n 'shr-relative shr-box-border shr-inline-block shr-h-[theme(fontSize.base)] shr-w-[theme(fontSize.base)] shr-shrink-0 shr-translate-y-[0.125em] shr-leading-none',\n label: [\n 'smarthr-ui-Checkbox-label shr-ms-0.5 shr-cursor-pointer shr-text-base shr-leading-tight',\n '[[data-disabled=true]>&]:shr-pointer-events-none [[data-disabled=true]>&]:shr-cursor-not-allowed [[data-disabled=true]>&]:shr-text-disabled',\n ],\n },\n})\n\nexport const Checkbox = forwardRef<HTMLInputElement, Props>(\n ({ checked, mixed, error, className, children, disabled, id, ...rest }, ref) => {\n const classNames = useMemo(() => {\n const { wrapper, innerWrapper, box, input, iconWrap, icon, label } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n innerWrapper: innerWrapper(),\n box: box(),\n input: input(),\n iconWrap: iconWrap(),\n icon: icon(),\n label: label(),\n }\n }, [className])\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n const defaultId = useId()\n const checkBoxId = id || defaultId\n\n const mergedRef = useMergeRefs(inputRef, ref)\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = !!(checked && mixed)\n }\n }, [checked, mixed])\n\n return (\n <span data-disabled={disabled} className={classNames.wrapper}>\n <span className={classNames.innerWrapper}>\n <input\n {...rest}\n ref={mergedRef}\n type=\"checkbox\"\n id={checkBoxId}\n checked={checked}\n disabled={disabled}\n aria-invalid={error || undefined}\n className={classNames.input}\n data-smarthr-ui-input=\"true\"\n />\n <AriaHiddenBox className={classNames.box} />\n <CheckIconArea mixed={mixed} classNames={classNames} />\n </span>\n\n {children && (\n <label htmlFor={checkBoxId} className={classNames.label}>\n {children}\n </label>\n )}\n </span>\n )\n },\n)\n\nconst AriaHiddenBox = memo<{ className: string }>(({ className }) => (\n <span className={className} aria-hidden=\"true\" />\n))\n\nconst CheckIconArea = memo<\n Pick<Props, 'mixed'> & { classNames: { iconWrap: string; icon: string } }\n>(({ mixed, classNames }) => {\n const Icon = mixed ? FaMinusIcon : FaCheckIcon\n\n return (\n <span className={classNames.iconWrap}>\n <Icon className={classNames.icon} />\n </span>\n )\n})\n"],"names":[],"mappings":";;;;;;;;;AA0BA;AACE;AACE;AACA;;;;;;;;;;;;;;AAcC;AACD;;;;AAIC;AACD;AACA;;;;;AAKC;AACD;AAEA;;;AAGC;AACF;AACF;AAEM;AAEH;AACE;;AAGE;;;;;;;;AAQJ;AAEA;AAEA;AACA;;;AAKE;AACE;;AAEJ;;AA2BF;AAGF;AAIA;;AAKE;AAKF;;"}
|