smarthr-ui 97.0.0 → 98.1.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/common/AppLauncherFeatures.cjs +1 -1
- package/lib/components/AppHeader/components/common/AppLauncherFeatures.js +1 -1
- package/lib/components/AppHeader/components/common/AppLauncherSortDropdown.cjs +1 -1
- package/lib/components/AppHeader/components/common/AppLauncherSortDropdown.js +1 -1
- package/lib/components/AppHeader/components/desktop/AppLauncher.cjs +5 -5
- package/lib/components/AppHeader/components/desktop/AppLauncher.cjs.map +1 -1
- package/lib/components/AppHeader/components/desktop/AppLauncher.js +5 -5
- package/lib/components/AppHeader/components/desktop/AppLauncher.js.map +1 -1
- package/lib/components/AppHeader/components/desktop/DesktopHeader.cjs +1 -1
- package/lib/components/AppHeader/components/desktop/DesktopHeader.js +1 -1
- package/lib/components/AppHeader/components/desktop/ReleaseNotesDropdown.cjs +1 -1
- package/lib/components/AppHeader/components/desktop/ReleaseNotesDropdown.js +1 -1
- package/lib/components/AppHeader/components/desktop/UserInfo.cjs +1 -1
- package/lib/components/AppHeader/components/desktop/UserInfo.js +1 -1
- package/lib/components/AppHeader/components/mobile/AppLauncher.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/AppLauncher.js +1 -1
- package/lib/components/AppHeader/components/mobile/AppLauncherFilterDropdown.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/AppLauncherFilterDropdown.js +1 -1
- package/lib/components/AppHeader/components/mobile/Help.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/Help.js +1 -1
- package/lib/components/AppHeader/components/mobile/LanguageSelector.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/LanguageSelector.js +1 -1
- package/lib/components/AppHeader/components/mobile/Menu.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/Menu.js +1 -1
- package/lib/components/AppHeader/components/mobile/MenuAccordion.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/MenuAccordion.js +1 -1
- package/lib/components/AppHeader/components/mobile/MenuDialog.cjs +2 -2
- package/lib/components/AppHeader/components/mobile/MenuDialog.js +2 -2
- package/lib/components/AppHeader/components/mobile/MenuSubHeading.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/MenuSubHeading.js +1 -1
- package/lib/components/AppHeader/components/mobile/ReleaseNote.cjs +1 -1
- package/lib/components/AppHeader/components/mobile/ReleaseNote.js +1 -1
- package/lib/components/AppHeader/components/mobile/UserInfo.cjs +2 -2
- package/lib/components/AppHeader/components/mobile/UserInfo.js +2 -2
- package/lib/components/Browser/Browser.cjs +11 -7
- package/lib/components/Browser/Browser.cjs.map +1 -1
- package/lib/components/Browser/Browser.js +12 -8
- package/lib/components/Browser/Browser.js.map +1 -1
- package/lib/components/Calendar/Calendar.cjs +1 -1
- package/lib/components/Calendar/Calendar.js +1 -1
- package/lib/components/Calendar/CalendarTable.cjs +1 -1
- package/lib/components/Calendar/CalendarTable.js +1 -1
- package/lib/components/Calendar/YearPicker.cjs +1 -1
- package/lib/components/Calendar/YearPicker.js +1 -1
- package/lib/components/Combobox/ItemButton.cjs +27 -26
- package/lib/components/Combobox/ItemButton.cjs.map +1 -1
- package/lib/components/Combobox/ItemButton.js +28 -27
- package/lib/components/Combobox/ItemButton.js.map +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiCombobox.cjs +122 -134
- package/lib/components/Combobox/MultiCombobox/MultiCombobox.cjs.map +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiCombobox.js +123 -135
- package/lib/components/Combobox/MultiCombobox/MultiCombobox.js.map +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.cjs +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.js +1 -1
- package/lib/components/Combobox/SingleCombobox/SingleCombobox.cjs +79 -46
- package/lib/components/Combobox/SingleCombobox/SingleCombobox.cjs.map +1 -1
- package/lib/components/Combobox/SingleCombobox/SingleCombobox.js +81 -48
- package/lib/components/Combobox/SingleCombobox/SingleCombobox.js.map +1 -1
- package/lib/components/Combobox/useListbox.cjs +1 -1
- package/lib/components/Combobox/useListbox.js +1 -1
- package/lib/components/Combobox/useOptions.cjs +3 -1
- package/lib/components/Combobox/useOptions.cjs.map +1 -1
- package/lib/components/Combobox/useOptions.js +4 -2
- package/lib/components/Combobox/useOptions.js.map +1 -1
- package/lib/components/Dialog/ControlledActionDialog/ActionDialogContentInner.cjs +3 -3
- package/lib/components/Dialog/ControlledActionDialog/ActionDialogContentInner.cjs.map +1 -1
- package/lib/components/Dialog/ControlledActionDialog/ActionDialogContentInner.js +3 -3
- package/lib/components/Dialog/ControlledActionDialog/ActionDialogContentInner.js.map +1 -1
- package/lib/components/Dialog/ControlledFormDialog/FormDialogContentInner.cjs +3 -3
- package/lib/components/Dialog/ControlledFormDialog/FormDialogContentInner.cjs.map +1 -1
- package/lib/components/Dialog/ControlledFormDialog/FormDialogContentInner.js +3 -3
- package/lib/components/Dialog/ControlledFormDialog/FormDialogContentInner.js.map +1 -1
- package/lib/components/Dialog/ControlledMessageDialog/MessageDialogContentInner.cjs +1 -1
- package/lib/components/Dialog/ControlledMessageDialog/MessageDialogContentInner.js +1 -1
- package/lib/components/Dialog/ControlledStepFormDialog/ControlledStepFormDialog.cjs +1 -1
- package/lib/components/Dialog/ControlledStepFormDialog/ControlledStepFormDialog.js +1 -1
- package/lib/components/Dialog/ControlledStepFormDialog/StepFormDialogContentInner.cjs +2 -2
- package/lib/components/Dialog/ControlledStepFormDialog/StepFormDialogContentInner.cjs.map +1 -1
- package/lib/components/Dialog/ControlledStepFormDialog/StepFormDialogContentInner.js +2 -2
- package/lib/components/Dialog/ControlledStepFormDialog/StepFormDialogContentInner.js.map +1 -1
- package/lib/components/Dialog/DialogContentResponseStatusMessage.cjs +3 -8
- package/lib/components/Dialog/DialogContentResponseStatusMessage.cjs.map +1 -1
- package/lib/components/Dialog/DialogContentResponseStatusMessage.d.ts +1 -1
- package/lib/components/Dialog/DialogContentResponseStatusMessage.js +3 -8
- package/lib/components/Dialog/DialogContentResponseStatusMessage.js.map +1 -1
- package/lib/components/Dialog/FocusTrap.cjs +4 -1
- package/lib/components/Dialog/FocusTrap.cjs.map +1 -1
- package/lib/components/Dialog/FocusTrap.js +4 -1
- package/lib/components/Dialog/FocusTrap.js.map +1 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.cjs +1 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.js +1 -1
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.cjs +9 -3
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.cjs.map +1 -1
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.js +9 -3
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.js.map +1 -1
- package/lib/components/Disclosure/DisclosureTrigger.cjs +8 -4
- package/lib/components/Disclosure/DisclosureTrigger.cjs.map +1 -1
- package/lib/components/Disclosure/DisclosureTrigger.js +8 -4
- package/lib/components/Disclosure/DisclosureTrigger.js.map +1 -1
- package/lib/components/DropZone/DropZone.cjs +1 -1
- package/lib/components/DropZone/DropZone.js +1 -1
- package/lib/components/Dropdown/Dropdown.cjs +36 -34
- package/lib/components/Dropdown/Dropdown.cjs.map +1 -1
- package/lib/components/Dropdown/Dropdown.js +37 -35
- package/lib/components/Dropdown/Dropdown.js.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js +1 -1
- package/lib/components/Dropdown/FilterDropdown/FilterDropdown.cjs +3 -5
- package/lib/components/Dropdown/FilterDropdown/FilterDropdown.cjs.map +1 -1
- package/lib/components/Dropdown/FilterDropdown/FilterDropdown.d.ts +1 -1
- package/lib/components/Dropdown/FilterDropdown/FilterDropdown.js +3 -5
- package/lib/components/Dropdown/FilterDropdown/FilterDropdown.js.map +1 -1
- package/lib/components/Dropdown/SortDropdown/useSortDropdown.cjs +1 -1
- package/lib/components/Dropdown/SortDropdown/useSortDropdown.js +1 -1
- package/lib/components/ErrorScreen/AuthErrorScreen.cjs +1 -1
- package/lib/components/ErrorScreen/AuthErrorScreen.js +1 -1
- package/lib/components/ErrorScreen/ForbiddenErrorScreen.cjs +1 -1
- package/lib/components/ErrorScreen/ForbiddenErrorScreen.js +1 -1
- package/lib/components/ErrorScreen/NotFoundErrorScreen.cjs +1 -1
- package/lib/components/ErrorScreen/NotFoundErrorScreen.js +1 -1
- package/lib/components/ErrorScreen/UnauthorizedErrorScreen.cjs +1 -1
- package/lib/components/ErrorScreen/UnauthorizedErrorScreen.js +1 -1
- package/lib/components/FileViewer/FileViewer.cjs +35 -2
- package/lib/components/FileViewer/FileViewer.cjs.map +1 -1
- package/lib/components/FileViewer/FileViewer.js +37 -4
- package/lib/components/FileViewer/FileViewer.js.map +1 -1
- package/lib/components/FileViewer/PDFViewer.cjs +59 -2
- package/lib/components/FileViewer/PDFViewer.cjs.map +1 -1
- package/lib/components/FileViewer/PDFViewer.d.ts +6 -1
- package/lib/components/FileViewer/PDFViewer.js +60 -3
- package/lib/components/FileViewer/PDFViewer.js.map +1 -1
- package/lib/components/FileViewer/SearchController.cjs +105 -0
- package/lib/components/FileViewer/SearchController.cjs.map +1 -0
- package/lib/components/FileViewer/SearchController.d.ts +7 -0
- package/lib/components/FileViewer/SearchController.js +103 -0
- package/lib/components/FileViewer/SearchController.js.map +1 -0
- package/lib/components/FileViewer/buildCustomTextRenderer.cjs +55 -0
- package/lib/components/FileViewer/buildCustomTextRenderer.cjs.map +1 -0
- package/lib/components/FileViewer/buildCustomTextRenderer.d.ts +9 -0
- package/lib/components/FileViewer/buildCustomTextRenderer.js +50 -0
- package/lib/components/FileViewer/buildCustomTextRenderer.js.map +1 -0
- package/lib/components/FileViewer/types.d.ts +7 -0
- package/lib/components/FileViewer/usePDFSearch.cjs +148 -0
- package/lib/components/FileViewer/usePDFSearch.cjs.map +1 -0
- package/lib/components/FileViewer/usePDFSearch.d.ts +19 -0
- package/lib/components/FileViewer/usePDFSearch.js +143 -0
- package/lib/components/FileViewer/usePDFSearch.js.map +1 -0
- package/lib/components/FormControl/FormControl.cjs +2 -22
- package/lib/components/FormControl/FormControl.cjs.map +1 -1
- package/lib/components/FormControl/FormControl.js +2 -22
- package/lib/components/FormControl/FormControl.js.map +1 -1
- package/lib/components/Header/AppLauncher/AppLauncher.cjs +1 -1
- package/lib/components/Header/AppLauncher/AppLauncher.js +1 -1
- package/lib/components/Header/LanguageSwitcher/LanguageSwitcher.cjs +1 -1
- package/lib/components/Header/LanguageSwitcher/LanguageSwitcher.js +1 -1
- package/lib/components/Icon/FaIcon.js +1 -1
- package/lib/components/Icon/OpenInNewTabIcon.cjs +1 -1
- package/lib/components/Icon/OpenInNewTabIcon.js +1 -1
- package/lib/components/InformationPanel/InformationPanel.cjs +1 -1
- package/lib/components/InformationPanel/InformationPanel.js +1 -1
- package/lib/components/Input/SearchInput/SearchInputIcon.cjs +1 -1
- package/lib/components/Input/SearchInput/SearchInputIcon.js +1 -1
- package/lib/components/InputFile/InputFileMultiplyAppendable.cjs +1 -1
- package/lib/components/InputFile/InputFileMultiplyAppendable.js +1 -1
- package/lib/components/InputFile/InputFileNative.cjs +1 -1
- package/lib/components/InputFile/InputFileNative.js +1 -1
- package/lib/components/Layout/Cluster/Cluster.cjs +0 -1
- package/lib/components/Layout/Cluster/Cluster.cjs.map +1 -1
- package/lib/components/Layout/Cluster/Cluster.js +0 -1
- package/lib/components/Layout/Cluster/Cluster.js.map +1 -1
- package/lib/components/Layout/Container/Container.cjs +1 -5
- package/lib/components/Layout/Container/Container.cjs.map +1 -1
- package/lib/components/Layout/Container/Container.js +1 -5
- package/lib/components/Layout/Container/Container.js.map +1 -1
- package/lib/components/Layout/Stack/Stack.cjs +22 -22
- package/lib/components/Layout/Stack/Stack.cjs.map +1 -1
- package/lib/components/Layout/Stack/Stack.js +22 -22
- package/lib/components/Layout/Stack/Stack.js.map +1 -1
- package/lib/components/Loader/LoaderSpinner.cjs +1 -1
- package/lib/components/Loader/LoaderSpinner.js +1 -1
- package/lib/components/Pagination/Pagination.cjs +1 -1
- package/lib/components/Pagination/Pagination.js +1 -1
- package/lib/components/Pagination/PaginationItemButton.cjs +1 -1
- package/lib/components/Pagination/PaginationItemButton.js +1 -1
- package/lib/components/SideNav/SideNav.cjs +3 -22
- package/lib/components/SideNav/SideNav.cjs.map +1 -1
- package/lib/components/SideNav/SideNav.d.ts +2 -9
- package/lib/components/SideNav/SideNav.js +4 -23
- package/lib/components/SideNav/SideNav.js.map +1 -1
- package/lib/components/SideNav/SideNavContext.cjs +11 -0
- package/lib/components/SideNav/SideNavContext.cjs.map +1 -0
- package/lib/components/SideNav/SideNavContext.d.ts +7 -0
- package/lib/components/SideNav/SideNavContext.js +8 -0
- package/lib/components/SideNav/SideNavContext.js.map +1 -0
- package/lib/components/SideNav/SideNavItemButton.cjs +12 -7
- package/lib/components/SideNav/SideNavItemButton.cjs.map +1 -1
- package/lib/components/SideNav/SideNavItemButton.d.ts +5 -11
- package/lib/components/SideNav/SideNavItemButton.js +12 -7
- package/lib/components/SideNav/SideNavItemButton.js.map +1 -1
- package/lib/components/Table/Th.cjs +2 -2
- package/lib/components/Table/Th.cjs.map +1 -1
- package/lib/components/Table/Th.d.ts +0 -2
- package/lib/components/Table/Th.js +2 -2
- package/lib/components/Table/Th.js.map +1 -1
- package/lib/components/Table/ThCheckbox.cjs +1 -1
- package/lib/components/Table/ThCheckbox.js +1 -1
- package/lib/components/Table/ThSortButton.cjs +5 -6
- package/lib/components/Table/ThSortButton.cjs.map +1 -1
- package/lib/components/Table/ThSortButton.d.ts +1 -6
- package/lib/components/Table/ThSortButton.js +5 -6
- package/lib/components/Table/ThSortButton.js.map +1 -1
- package/lib/components/WarekiPicker/WarekiPicker.cjs +1 -1
- package/lib/components/WarekiPicker/WarekiPicker.js +1 -1
- package/lib/hooks/useLatest.cjs +33 -0
- package/lib/hooks/useLatest.cjs.map +1 -0
- package/lib/hooks/useLatest.d.ts +19 -0
- package/lib/hooks/useLatest.js +31 -0
- package/lib/hooks/useLatest.js.map +1 -0
- package/lib/index.cjs +1 -6
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -4
- package/lib/index.js.map +1 -1
- package/lib/intl/Localizer.cjs +5 -1
- package/lib/intl/Localizer.cjs.map +1 -1
- package/lib/intl/Localizer.d.ts +1 -1
- package/lib/intl/Localizer.js +5 -1
- package/lib/intl/Localizer.js.map +1 -1
- package/lib/intl/locales/en_us.json.cjs +3 -0
- package/lib/intl/locales/en_us.json.cjs.map +1 -1
- package/lib/intl/locales/en_us.json.js +3 -0
- package/lib/intl/locales/en_us.json.js.map +1 -1
- package/lib/intl/locales/id_id.json.cjs +3 -0
- package/lib/intl/locales/id_id.json.cjs.map +1 -1
- package/lib/intl/locales/id_id.json.js +3 -0
- package/lib/intl/locales/id_id.json.js.map +1 -1
- package/lib/intl/locales/index.d.ts +27 -0
- package/lib/intl/locales/ja.cjs +3 -0
- package/lib/intl/locales/ja.cjs.map +1 -1
- package/lib/intl/locales/ja.d.ts +3 -0
- package/lib/intl/locales/ja.js +3 -0
- package/lib/intl/locales/ja.js.map +1 -1
- package/lib/intl/locales/ja.json.cjs +3 -0
- package/lib/intl/locales/ja.json.cjs.map +1 -1
- package/lib/intl/locales/ja.json.js +3 -0
- package/lib/intl/locales/ja.json.js.map +1 -1
- package/lib/intl/locales/ja_easy.json.cjs +3 -0
- package/lib/intl/locales/ja_easy.json.cjs.map +1 -1
- package/lib/intl/locales/ja_easy.json.js +3 -0
- package/lib/intl/locales/ja_easy.json.js.map +1 -1
- package/lib/intl/locales/ko_kr.json.cjs +3 -0
- package/lib/intl/locales/ko_kr.json.cjs.map +1 -1
- package/lib/intl/locales/ko_kr.json.js +3 -0
- package/lib/intl/locales/ko_kr.json.js.map +1 -1
- package/lib/intl/locales/pt_br.json.cjs +3 -0
- package/lib/intl/locales/pt_br.json.cjs.map +1 -1
- package/lib/intl/locales/pt_br.json.js +3 -0
- package/lib/intl/locales/pt_br.json.js.map +1 -1
- package/lib/intl/locales/vi_vn.json.cjs +3 -0
- package/lib/intl/locales/vi_vn.json.cjs.map +1 -1
- package/lib/intl/locales/vi_vn.json.js +3 -0
- package/lib/intl/locales/vi_vn.json.js.map +1 -1
- package/lib/intl/locales/zh_hans_cn.json.cjs +3 -0
- package/lib/intl/locales/zh_hans_cn.json.cjs.map +1 -1
- package/lib/intl/locales/zh_hans_cn.json.js +3 -0
- package/lib/intl/locales/zh_hans_cn.json.js.map +1 -1
- package/lib/intl/locales/zh_hant_tw.json.cjs +3 -0
- package/lib/intl/locales/zh_hant_tw.json.cjs.map +1 -1
- package/lib/intl/locales/zh_hant_tw.json.js +3 -0
- package/lib/intl/locales/zh_hant_tw.json.js.map +1 -1
- package/metadata.json +1 -1
- package/package.json +1 -1
- package/smarthr-ui.css +35 -98
- package/lib/hooks/useDecorators.cjs +0 -18
- package/lib/hooks/useDecorators.cjs.map +0 -1
- package/lib/hooks/useDecorators.d.ts +0 -6
- package/lib/hooks/useDecorators.js +0 -16
- package/lib/hooks/useDecorators.js.map +0 -1
- package/lib/hooks/useDevice/DeviceProvider.cjs +0 -37
- package/lib/hooks/useDevice/DeviceProvider.cjs.map +0 -1
- package/lib/hooks/useDevice/DeviceProvider.d.ts +0 -4
- package/lib/hooks/useDevice/DeviceProvider.js +0 -35
- package/lib/hooks/useDevice/DeviceProvider.js.map +0 -1
- package/lib/hooks/useDevice/index.cjs +0 -10
- package/lib/hooks/useDevice/index.cjs.map +0 -1
- package/lib/hooks/useDevice/index.d.ts +0 -2
- package/lib/hooks/useDevice/index.js +0 -3
- package/lib/hooks/useDevice/index.js.map +0 -1
- package/lib/hooks/useDevice/useDevice.cjs +0 -11
- package/lib/hooks/useDevice/useDevice.cjs.map +0 -1
- package/lib/hooks/useDevice/useDevice.d.ts +0 -4
- package/lib/hooks/useDevice/useDevice.js +0 -8
- package/lib/hooks/useDevice/useDevice.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { createContext, createRef, useState, useContext, useRef, useId,
|
|
3
|
+
import { createContext, createRef, useState, useContext, useRef, useId, useMemo, useCallback, useEffect } from 'react';
|
|
4
4
|
import { usePortal } from '../../hooks/usePortal.js';
|
|
5
5
|
import { getFirstTabbable, isEventFromChild } from './dropdownHelper.js';
|
|
6
6
|
|
|
@@ -26,45 +26,27 @@ const Dropdown = ({ onOpen, onClose, children }) => {
|
|
|
26
26
|
const { createPortal, portalRoot, isPortalRootMounted, isChildPortal, PortalParentProvider } = usePortal();
|
|
27
27
|
const triggerElementRef = useRef(null);
|
|
28
28
|
const contentId = useId();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}, [isChildPortal, portalRoot]);
|
|
29
|
+
const unstableRef = useRef({
|
|
30
|
+
active,
|
|
31
|
+
isPortalRootMounted,
|
|
32
|
+
onOpen,
|
|
33
|
+
onClose,
|
|
34
|
+
createPortal,
|
|
35
|
+
});
|
|
36
|
+
unstableRef.current = {
|
|
37
|
+
active,
|
|
38
|
+
isPortalRootMounted,
|
|
39
|
+
onOpen,
|
|
40
|
+
onClose,
|
|
41
|
+
createPortal,
|
|
42
|
+
};
|
|
44
43
|
// This is the root container of a dropdown content located in outside the DOM tree
|
|
45
44
|
const DropdownContentRoot = useMemo(() => {
|
|
46
|
-
const result = (props) => active ? createPortal(props.children) : null;
|
|
45
|
+
const result = (props) => unstableRef.current.active ? unstableRef.current.createPortal(props.children) : null;
|
|
47
46
|
// set the displayName explicit for DevTools
|
|
48
47
|
result.displayName = 'DropdownContentRoot';
|
|
49
48
|
return result;
|
|
50
|
-
}, [
|
|
51
|
-
const togglerRef = useRef({
|
|
52
|
-
isPortalRootMounted,
|
|
53
|
-
onOpen,
|
|
54
|
-
onClose,
|
|
55
|
-
});
|
|
56
|
-
useEffect(() => {
|
|
57
|
-
togglerRef.current = {
|
|
58
|
-
isPortalRootMounted,
|
|
59
|
-
onOpen,
|
|
60
|
-
onClose,
|
|
61
|
-
};
|
|
62
|
-
}, [isPortalRootMounted, onOpen, onClose]);
|
|
63
|
-
useEffect(() => {
|
|
64
|
-
if (togglerRef.current.isPortalRootMounted()) {
|
|
65
|
-
togglerRef.current[active ? 'onOpen' : 'onClose']?.();
|
|
66
|
-
}
|
|
67
|
-
}, [active]);
|
|
49
|
+
}, []);
|
|
68
50
|
const memoizedOnClickTrigger = useCallback((rect) => {
|
|
69
51
|
setActive((current) => {
|
|
70
52
|
const newActive = !current;
|
|
@@ -79,6 +61,26 @@ const Dropdown = ({ onOpen, onClose, children }) => {
|
|
|
79
61
|
// return focus to the Trigger
|
|
80
62
|
getFirstTabbable(triggerElementRef)?.focus();
|
|
81
63
|
}, []);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (portalRoot) {
|
|
66
|
+
portalRoot.setAttribute('id', contentId);
|
|
67
|
+
}
|
|
68
|
+
const onClickBody = (e) => {
|
|
69
|
+
// ignore events from events within DropdownTrigger and DropdownContent
|
|
70
|
+
if (!isEventFromChild(e, triggerElementRef.current) && !isChildPortal(e.target)) {
|
|
71
|
+
setActive(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
document.body.addEventListener('click', onClickBody, false);
|
|
75
|
+
return () => {
|
|
76
|
+
document.body.removeEventListener('click', onClickBody, false);
|
|
77
|
+
};
|
|
78
|
+
}, [isChildPortal, portalRoot, contentId]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (unstableRef.current.isPortalRootMounted()) {
|
|
81
|
+
unstableRef.current[active ? 'onOpen' : 'onClose']?.();
|
|
82
|
+
}
|
|
83
|
+
}, [active]);
|
|
82
84
|
return (jsx(PortalParentProvider, { children: jsx(DropdownContext.Provider, { value: {
|
|
83
85
|
active,
|
|
84
86
|
triggerRect,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n type ReactNode,\n createContext,\n createRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { usePortal } from '../../hooks/usePortal'\n\nimport { type Rect, getFirstTabbable, isEventFromChild } from './dropdownHelper'\n\ntype Props = PropsWithChildren<{\n onOpen?: () => void\n onClose?: () => void\n}>\n\ntype DropdownContextType = {\n active: boolean\n triggerRect: Rect\n triggerElementRef: MutableRefObject<HTMLDivElement | null>\n rootTriggerRef: MutableRefObject<HTMLDivElement | null> | null\n memoizedOnClickTrigger: (rect: Rect) => void\n onClickCloser: () => void\n DropdownContentRoot: FC<{ children: ReactNode }>\n contentId: string\n}\n\nconst initialRect = { top: 0, right: 0, bottom: 0, left: 0 }\n\nexport const DropdownContext = createContext<DropdownContextType>({\n active: false,\n triggerRect: initialRect,\n triggerElementRef: createRef(),\n rootTriggerRef: null,\n memoizedOnClickTrigger: () => {\n /* noop */\n },\n onClickCloser: () => {\n /* noop */\n },\n DropdownContentRoot: () => null,\n contentId: '',\n})\n\nexport const Dropdown: FC<Props> = ({ onOpen, onClose, children }) => {\n const [active, setActive] = useState(false)\n const [triggerRect, setTriggerRect] = useState<Rect>(initialRect)\n\n const { rootTriggerRef } = useContext(DropdownContext)\n const { createPortal, portalRoot, isPortalRootMounted, isChildPortal, PortalParentProvider } =\n usePortal()\n\n const triggerElementRef = useRef<HTMLDivElement>(null)\n const contentId = useId()\n\n
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n type ReactNode,\n createContext,\n createRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { usePortal } from '../../hooks/usePortal'\n\nimport { type Rect, getFirstTabbable, isEventFromChild } from './dropdownHelper'\n\ntype Props = PropsWithChildren<{\n onOpen?: () => void\n onClose?: () => void\n}>\n\ntype DropdownContextType = {\n active: boolean\n triggerRect: Rect\n triggerElementRef: MutableRefObject<HTMLDivElement | null>\n rootTriggerRef: MutableRefObject<HTMLDivElement | null> | null\n memoizedOnClickTrigger: (rect: Rect) => void\n onClickCloser: () => void\n DropdownContentRoot: FC<{ children: ReactNode }>\n contentId: string\n}\n\nconst initialRect = { top: 0, right: 0, bottom: 0, left: 0 }\n\nexport const DropdownContext = createContext<DropdownContextType>({\n active: false,\n triggerRect: initialRect,\n triggerElementRef: createRef(),\n rootTriggerRef: null,\n memoizedOnClickTrigger: () => {\n /* noop */\n },\n onClickCloser: () => {\n /* noop */\n },\n DropdownContentRoot: () => null,\n contentId: '',\n})\n\nexport const Dropdown: FC<Props> = ({ onOpen, onClose, children }) => {\n const [active, setActive] = useState(false)\n const [triggerRect, setTriggerRect] = useState<Rect>(initialRect)\n\n const { rootTriggerRef } = useContext(DropdownContext)\n const { createPortal, portalRoot, isPortalRootMounted, isChildPortal, PortalParentProvider } =\n usePortal()\n\n const triggerElementRef = useRef<HTMLDivElement>(null)\n const contentId = useId()\n\n const unstableRef = useRef({\n active,\n isPortalRootMounted,\n onOpen,\n onClose,\n createPortal,\n })\n unstableRef.current = {\n active,\n isPortalRootMounted,\n onOpen,\n onClose,\n createPortal,\n }\n\n // This is the root container of a dropdown content located in outside the DOM tree\n const DropdownContentRoot = useMemo<FC<{ children: ReactNode }>>(() => {\n const result: FC<{ children: ReactNode }> = (props) =>\n unstableRef.current.active ? unstableRef.current.createPortal(props.children) : null\n\n // set the displayName explicit for DevTools\n result.displayName = 'DropdownContentRoot'\n\n return result\n }, [])\n\n const memoizedOnClickTrigger = useCallback((rect: Rect) => {\n setActive((current) => {\n const newActive = !current\n\n if (newActive) {\n setTriggerRect(rect)\n }\n\n return newActive\n })\n }, [])\n\n const onClickCloser = useCallback(() => {\n setActive(false)\n\n // return focus to the Trigger\n getFirstTabbable(triggerElementRef)?.focus()\n }, [])\n\n useEffect(() => {\n if (portalRoot) {\n portalRoot.setAttribute('id', contentId)\n }\n\n const onClickBody = (e: any) => {\n // ignore events from events within DropdownTrigger and DropdownContent\n if (!isEventFromChild(e, triggerElementRef.current) && !isChildPortal(e.target)) {\n setActive(false)\n }\n }\n\n document.body.addEventListener('click', onClickBody, false)\n\n return () => {\n document.body.removeEventListener('click', onClickBody, false)\n }\n }, [isChildPortal, portalRoot, contentId])\n\n useEffect(() => {\n if (unstableRef.current.isPortalRootMounted()) {\n unstableRef.current[active ? 'onOpen' : 'onClose']?.()\n }\n }, [active])\n\n return (\n <PortalParentProvider>\n <DropdownContext.Provider\n value={{\n active,\n triggerRect,\n triggerElementRef,\n rootTriggerRef: rootTriggerRef || triggerElementRef || null,\n memoizedOnClickTrigger,\n onClickCloser,\n DropdownContentRoot,\n contentId,\n }}\n >\n {children}\n </DropdownContext.Provider>\n </PortalParentProvider>\n )\n}\n"],"names":[],"mappings":";;;;;;AAsCA;AAEO;AACL;AACA;;AAEA;;;;;;;AAOA;AACA;AACD;AAEM;;;;AAKL;AAGA;AACA;;;;;;;AAQC;;;;;;;;;AAUD;AACE;;AAIA;AAEA;;AAGF;AACE;AACE;;;;AAMA;AACF;;AAGF;;;AAIE;;;;AAKE;;AAGF;;AAEE;;;AAGF;;AAIA;;AAEA;;;AAIA;AACE;;AAEJ;;;;;AASQ;;;;;AAKD;AAMT;;"}
|
|
@@ -7,7 +7,7 @@ var index = require('./../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss
|
|
|
7
7
|
var hooks_useObjectAttributes = require('../../../hooks/useObjectAttributes.cjs');
|
|
8
8
|
require('../../../intl/IntlProvider.cjs');
|
|
9
9
|
var intl_useIntl = require('../../../intl/useIntl.cjs');
|
|
10
|
-
require('
|
|
10
|
+
require('../../../intl/Localizer.cjs');
|
|
11
11
|
require('../../../_virtual/dayjs.min.cjs');
|
|
12
12
|
require('../../../intl/TimeFormatter.cjs');
|
|
13
13
|
var components_Button_Button = require('../../Button/Button.cjs');
|
|
@@ -5,7 +5,7 @@ import { tv as ce } from './../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwi
|
|
|
5
5
|
import { useObjectAttributes } from '../../../hooks/useObjectAttributes.js';
|
|
6
6
|
import '../../../intl/IntlProvider.js';
|
|
7
7
|
import { useIntl } from '../../../intl/useIntl.js';
|
|
8
|
-
import '
|
|
8
|
+
import '../../../intl/Localizer.js';
|
|
9
9
|
import '../../../_virtual/dayjs.min.js';
|
|
10
10
|
import '../../../intl/TimeFormatter.js';
|
|
11
11
|
import { Button } from '../../Button/Button.js';
|
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var React = require('react');
|
|
6
|
-
var index$1 = require('../../../_virtual/index3.cjs');
|
|
7
6
|
var index = require('./../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.cjs');
|
|
8
7
|
var hooks_useResponseStatus = require('../../../hooks/useResponseStatus.cjs');
|
|
9
8
|
require('../../../intl/IntlProvider.cjs');
|
|
10
9
|
var intl_useIntl = require('../../../intl/useIntl.cjs');
|
|
11
|
-
require('
|
|
10
|
+
require('../../../intl/Localizer.cjs');
|
|
12
11
|
require('../../../_virtual/dayjs.min.cjs');
|
|
13
12
|
require('../../../intl/TimeFormatter.cjs');
|
|
14
13
|
var components_Button_Button = require('../../Button/Button.cjs');
|
|
@@ -94,7 +93,6 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
94
93
|
defaultText: '絞り込み条件を解除',
|
|
95
94
|
}),
|
|
96
95
|
}), [filtered, trigger.text, applyText, cancelText, resetText, localize]);
|
|
97
|
-
const filteredIconAlt = React.useMemo(() => index$1(decorated.filteredIconAlt), [decorated.filteredIconAlt]);
|
|
98
96
|
const calcedResponseStatus = hooks_useResponseStatus.useResponseStatus(responseStatus);
|
|
99
97
|
const classNamesMapper = React.useMemo(() => {
|
|
100
98
|
const { iconWrapper, filteredIcon, inner, actionArea, resetButtonArea, rightButtonArea, message, } = classNameGenerator();
|
|
@@ -121,7 +119,7 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
121
119
|
const { buttonSuffix, buttonContent } = React.useMemo(() => {
|
|
122
120
|
const FilterIcon = (jsxRuntime.jsxs("span", { className: classNames.iconWrapper, children: [jsxRuntime.jsx(components_Icon_FaIcon.FaFilterIcon, { alt: trigger.onlyIcon ? decorated.trigger : undefined }), filtered && (
|
|
123
121
|
// HINT: altに揃えたいが、styleが複雑になってしまうためaria-labelを利用している
|
|
124
|
-
jsxRuntime.jsx(components_Icon_FaIcon.FaCircleCheckIcon, { "aria-label": filteredIconAlt, className: classNames.filteredIcon }))] }));
|
|
122
|
+
jsxRuntime.jsx(components_Icon_FaIcon.FaCircleCheckIcon, { "aria-label": decorated.filteredIconAlt, className: classNames.filteredIcon }))] }));
|
|
125
123
|
if (trigger.onlyIcon) {
|
|
126
124
|
return {
|
|
127
125
|
buttonSuffix: undefined,
|
|
@@ -132,7 +130,7 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
132
130
|
buttonSuffix: FilterIcon,
|
|
133
131
|
buttonContent: decorated.trigger,
|
|
134
132
|
};
|
|
135
|
-
}, [filtered, decorated.trigger, trigger.onlyIcon,
|
|
133
|
+
}, [filtered, decorated.trigger, decorated.filteredIconAlt, trigger.onlyIcon, classNames]);
|
|
136
134
|
return (jsxRuntime.jsxs(components_Dropdown_Dropdown.Dropdown, { onOpen: onOpen, onClose: onClose, children: [jsxRuntime.jsx(components_Dropdown_DropdownTrigger.DropdownTrigger, { tooltip: { show: trigger.onlyIcon, message: decorated.trigger }, children: jsxRuntime.jsx(components_Button_Button.Button, { ...rest, suffix: buttonSuffix, size: trigger.size, children: buttonContent }) }), jsxRuntime.jsx(components_Dropdown_DropdownContent.DropdownContent, { controllable: true, children: jsxRuntime.jsxs("form", { onSubmit: ON_SUBMIT, children: [jsxRuntime.jsx("div", { className: classNames.inner, children: children }), jsxRuntime.jsxs(components_Layout_Stack_Stack.Stack, { gap: 0.5, className: classNames.actionArea, children: [jsxRuntime.jsxs(components_Layout_Cluster_Cluster.Cluster, { gap: 1, align: "center", justify: "space-between", children: [onReset && (jsxRuntime.jsx("div", { className: classNames.resetButtonArea, children: jsxRuntime.jsx(components_Button_Button.Button, { variant: "text", size: "S", prefix: jsxRuntime.jsx(components_Icon_FaIcon.FaRotateLeftIcon, {}), onClick: onReset, disabled: calcedResponseStatus.isProcessing, children: decorated.resetText }) })), jsxRuntime.jsxs(components_Layout_Cluster_Cluster.Cluster, { gap: CONTROL_CLUSTER_GAP, justify: "flex-end", className: classNames.rightButtonArea, children: [jsxRuntime.jsx(components_Dropdown_DropdownCloser.DropdownCloser, { children: jsxRuntime.jsx(components_Button_Button.Button, { onClick: onCancel, disabled: calcedResponseStatus.isProcessing, children: decorated.cancelText }) }), jsxRuntime.jsx(components_Dropdown_DropdownCloser.DropdownCloser, { children: jsxRuntime.jsx(components_Button_Button.Button, { variant: "primary", onClick: onApply, loading: calcedResponseStatus.isProcessing, children: decorated.applyText }) })] })] }), calcedResponseStatus.message && (jsxRuntime.jsx("div", { className: classNames.message, children: jsxRuntime.jsx(components_ResponseMessage_ResponseMessage.ResponseMessage, { status: calcedResponseStatus.status, role: "alert", children: calcedResponseStatus.message }) }))] })] }) })] }));
|
|
137
135
|
};
|
|
138
136
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterDropdown.cjs","sources":["../../../../src/components/Dropdown/FilterDropdown/FilterDropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type MouseEventHandler,\n type ReactNode,\n isValidElement,\n useMemo,\n} from 'react'\nimport
|
|
1
|
+
{"version":3,"file":"FilterDropdown.cjs","sources":["../../../../src/components/Dropdown/FilterDropdown/FilterDropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type MouseEventHandler,\n type ReactNode,\n isValidElement,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { type ResponseStatus, useResponseStatus } from '../../../hooks/useResponseStatus'\nimport { useIntl } from '../../../intl'\nimport { Button, type AbstractProps as ButtonProps } from '../../Button'\nimport { FaCircleCheckIcon, FaFilterIcon, FaRotateLeftIcon } from '../../Icon'\nimport { Cluster, Stack } from '../../Layout'\nimport { ResponseMessage } from '../../ResponseMessage'\nimport { Dropdown } from '../Dropdown'\nimport { DropdownCloser } from '../DropdownCloser'\nimport { DropdownContent } from '../DropdownContent'\nimport { DropdownTrigger } from '../DropdownTrigger'\n\ntype ObjectTriggerType = {\n text?: ReactNode\n /** 引き金となるボタンの大きさ */\n size?: ButtonProps['size']\n /** 引き金となるボタンをアイコンのみとするかどうか */\n onlyIcon?: boolean\n}\ntype AbstractProps = {\n /** 引き金となるボタン */\n trigger?: ReactNode | ObjectTriggerType\n applyText?: ReactNode\n cancelText?: ReactNode\n resetText?: ReactNode\n children: ReactNode\n filtered?:\n | boolean\n | {\n iconAlt?: string\n }\n responseStatus?: ResponseStatus\n onApply: MouseEventHandler<HTMLButtonElement>\n onCancel?: MouseEventHandler<HTMLButtonElement>\n onReset?: MouseEventHandler<HTMLButtonElement>\n onOpen?: () => void\n onClose?: () => void\n}\ntype Props = AbstractProps & Omit<ComponentProps<'button'>, keyof AbstractProps>\n\nconst CONTROL_CLUSTER_GAP: ComponentProps<typeof Cluster>['gap'] = { column: 1, row: 0.5 }\nconst ON_SUBMIT = (e: FormEvent) => {\n e.preventDefault()\n}\n\nconst classNameGenerator = tv({\n slots: {\n iconWrapper: ['smarthr-ui-Icon-extended', 'shr-relative shr-leading-none'],\n filteredIcon: 'shr-absolute shr-bottom-[2px] shr-right-[-4px] shr-h-[0.5em] shr-w-[0.5em]',\n inner: 'shr-p-1.5',\n actionArea: 'shr-border-t-shorthand shr-sticky shr-bottom-0 shr-bg-white shr-px-1.5 shr-py-1',\n resetButtonArea: '-shr-ms-0.5',\n rightButtonArea: 'shr-ms-auto',\n message: 'shr-text-right',\n },\n variants: {\n filtered: {\n true: {\n iconWrapper: 'shr-text-main',\n },\n },\n triggerSize: {\n M: {},\n S: {\n iconWrapper: '-shr-translate-x-0.25',\n },\n },\n },\n})\n\nexport const FilterDropdown: FC<Props> = ({\n trigger: orgTrigger,\n applyText,\n cancelText,\n resetText,\n children,\n filtered,\n responseStatus,\n onApply,\n onCancel,\n onReset,\n onOpen,\n onClose,\n ...rest\n}) => {\n // HINT: ReactNodeとObjectのどちらかを判定\n // typeofはnullの場合もobject判定されてしまうため念の為falsyで判定\n // ReactNodeの一部であるReactElementもobjectとして判定されてしまうためisValidElementで判定\n const trigger: ObjectTriggerType =\n !orgTrigger || typeof orgTrigger !== 'object' || isValidElement(orgTrigger)\n ? {\n text: orgTrigger as ReactNode,\n }\n : (orgTrigger as ObjectTriggerType)\n const { localize } = useIntl()\n\n const decorated = useMemo(\n () => ({\n filteredIconAlt:\n (typeof filtered === 'object' && filtered.iconAlt) ||\n localize({\n id: 'smarthr-ui/FilterDropdown/status',\n defaultText: '適用中',\n }),\n trigger:\n trigger.text ||\n localize({\n id: 'smarthr-ui/FilterDropdown/triggerText',\n defaultText: '絞り込み',\n }),\n applyText:\n applyText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/applyText',\n defaultText: '適用',\n }),\n cancelText:\n cancelText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/cancelText',\n defaultText: 'キャンセル',\n }),\n resetText:\n resetText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/resetText',\n defaultText: '絞り込み条件を解除',\n }),\n }),\n [filtered, trigger.text, applyText, cancelText, resetText, localize],\n )\n\n const calcedResponseStatus = useResponseStatus(responseStatus)\n\n const classNamesMapper = useMemo(() => {\n const {\n iconWrapper,\n filteredIcon,\n inner,\n actionArea,\n resetButtonArea,\n rightButtonArea,\n message,\n } = classNameGenerator()\n\n const commonStyles = {\n filteredIcon: filteredIcon(),\n inner: inner(),\n actionArea: actionArea(),\n resetButtonArea: resetButtonArea(),\n rightButtonArea: rightButtonArea(),\n message: message(),\n }\n\n return {\n filtered: {\n ...commonStyles,\n iconWrapper: iconWrapper({ filtered: true, triggerSize: trigger.size }),\n },\n unfiltered: {\n ...commonStyles,\n iconWrapper: iconWrapper({ filtered: false, triggerSize: trigger.size }),\n },\n }\n }, [trigger.size])\n\n const classNames = classNamesMapper[filtered ? 'filtered' : 'unfiltered']\n\n const { buttonSuffix, buttonContent } = useMemo(() => {\n const FilterIcon = (\n <span className={classNames.iconWrapper}>\n <FaFilterIcon alt={trigger.onlyIcon ? decorated.trigger : undefined} />\n\n {filtered && (\n // HINT: altに揃えたいが、styleが複雑になってしまうためaria-labelを利用している\n <FaCircleCheckIcon\n aria-label={decorated.filteredIconAlt}\n className={classNames.filteredIcon}\n />\n )}\n </span>\n )\n\n if (trigger.onlyIcon) {\n return {\n buttonSuffix: undefined,\n buttonContent: FilterIcon,\n }\n }\n\n return {\n buttonSuffix: FilterIcon,\n buttonContent: decorated.trigger,\n }\n }, [filtered, decorated.trigger, decorated.filteredIconAlt, trigger.onlyIcon, classNames])\n\n return (\n <Dropdown onOpen={onOpen} onClose={onClose}>\n <DropdownTrigger tooltip={{ show: trigger.onlyIcon, message: decorated.trigger }}>\n <Button {...rest} suffix={buttonSuffix} size={trigger.size}>\n {buttonContent}\n </Button>\n </DropdownTrigger>\n <DropdownContent controllable>\n <form onSubmit={ON_SUBMIT}>\n <div className={classNames.inner}>{children}</div>\n <Stack gap={0.5} className={classNames.actionArea}>\n <Cluster gap={1} align=\"center\" justify=\"space-between\">\n {onReset && (\n <div className={classNames.resetButtonArea}>\n <Button\n variant=\"text\"\n size=\"S\"\n prefix={<FaRotateLeftIcon />}\n onClick={onReset}\n disabled={calcedResponseStatus.isProcessing}\n >\n {decorated.resetText}\n </Button>\n </div>\n )}\n\n <Cluster\n gap={CONTROL_CLUSTER_GAP}\n justify=\"flex-end\"\n className={classNames.rightButtonArea}\n >\n <DropdownCloser>\n <Button onClick={onCancel} disabled={calcedResponseStatus.isProcessing}>\n {decorated.cancelText}\n </Button>\n </DropdownCloser>\n <DropdownCloser>\n <Button\n variant=\"primary\"\n onClick={onApply}\n loading={calcedResponseStatus.isProcessing}\n >\n {decorated.applyText}\n </Button>\n </DropdownCloser>\n </Cluster>\n </Cluster>\n {calcedResponseStatus.message && (\n <div className={classNames.message}>\n <ResponseMessage status={calcedResponseStatus.status} role=\"alert\">\n {calcedResponseStatus.message}\n </ResponseMessage>\n </div>\n )}\n </Stack>\n </form>\n </DropdownContent>\n </Dropdown>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA;AACA;;AAEA;AAEA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACD;AACF;AACD;AACE;AACA;AACE;AACD;AACF;AACF;AACF;AAEM;;;;AAkBL;AAEI;AACI;AACD;;AAEP;AAEA;;AAIM;AACE;AACA;;;AAIF;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEL;AAIH;AAEA;AACE;AAUA;;;;;;;;;AAUE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;;AAEL;AAEA;;AAGE;;AAMM;AAQN;;AAEI;AACA;;;;AAKF;;;AAGJ;;AA6DF;;"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { isValidElement, useMemo } from 'react';
|
|
4
|
-
import innerText from '../../../_virtual/index3.js';
|
|
5
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.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.js';
|
|
6
5
|
import { useResponseStatus } from '../../../hooks/useResponseStatus.js';
|
|
7
6
|
import '../../../intl/IntlProvider.js';
|
|
8
7
|
import { useIntl } from '../../../intl/useIntl.js';
|
|
9
|
-
import '
|
|
8
|
+
import '../../../intl/Localizer.js';
|
|
10
9
|
import '../../../_virtual/dayjs.min.js';
|
|
11
10
|
import '../../../intl/TimeFormatter.js';
|
|
12
11
|
import { Button } from '../../Button/Button.js';
|
|
@@ -92,7 +91,6 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
92
91
|
defaultText: '絞り込み条件を解除',
|
|
93
92
|
}),
|
|
94
93
|
}), [filtered, trigger.text, applyText, cancelText, resetText, localize]);
|
|
95
|
-
const filteredIconAlt = useMemo(() => innerText(decorated.filteredIconAlt), [decorated.filteredIconAlt]);
|
|
96
94
|
const calcedResponseStatus = useResponseStatus(responseStatus);
|
|
97
95
|
const classNamesMapper = useMemo(() => {
|
|
98
96
|
const { iconWrapper, filteredIcon, inner, actionArea, resetButtonArea, rightButtonArea, message, } = classNameGenerator();
|
|
@@ -119,7 +117,7 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
119
117
|
const { buttonSuffix, buttonContent } = useMemo(() => {
|
|
120
118
|
const FilterIcon = (jsxs("span", { className: classNames.iconWrapper, children: [jsx(FaFilterIcon, { alt: trigger.onlyIcon ? decorated.trigger : undefined }), filtered && (
|
|
121
119
|
// HINT: altに揃えたいが、styleが複雑になってしまうためaria-labelを利用している
|
|
122
|
-
jsx(FaCircleCheckIcon, { "aria-label": filteredIconAlt, className: classNames.filteredIcon }))] }));
|
|
120
|
+
jsx(FaCircleCheckIcon, { "aria-label": decorated.filteredIconAlt, className: classNames.filteredIcon }))] }));
|
|
123
121
|
if (trigger.onlyIcon) {
|
|
124
122
|
return {
|
|
125
123
|
buttonSuffix: undefined,
|
|
@@ -130,7 +128,7 @@ const FilterDropdown = ({ trigger: orgTrigger, applyText, cancelText, resetText,
|
|
|
130
128
|
buttonSuffix: FilterIcon,
|
|
131
129
|
buttonContent: decorated.trigger,
|
|
132
130
|
};
|
|
133
|
-
}, [filtered, decorated.trigger, trigger.onlyIcon,
|
|
131
|
+
}, [filtered, decorated.trigger, decorated.filteredIconAlt, trigger.onlyIcon, classNames]);
|
|
134
132
|
return (jsxs(Dropdown, { onOpen: onOpen, onClose: onClose, children: [jsx(DropdownTrigger, { tooltip: { show: trigger.onlyIcon, message: decorated.trigger }, children: jsx(Button, { ...rest, suffix: buttonSuffix, size: trigger.size, children: buttonContent }) }), jsx(DropdownContent, { controllable: true, children: jsxs("form", { onSubmit: ON_SUBMIT, children: [jsx("div", { className: classNames.inner, children: children }), jsxs(Stack, { gap: 0.5, className: classNames.actionArea, children: [jsxs(Cluster, { gap: 1, align: "center", justify: "space-between", children: [onReset && (jsx("div", { className: classNames.resetButtonArea, children: jsx(Button, { variant: "text", size: "S", prefix: jsx(FaRotateLeftIcon, {}), onClick: onReset, disabled: calcedResponseStatus.isProcessing, children: decorated.resetText }) })), jsxs(Cluster, { gap: CONTROL_CLUSTER_GAP, justify: "flex-end", className: classNames.rightButtonArea, children: [jsx(DropdownCloser, { children: jsx(Button, { onClick: onCancel, disabled: calcedResponseStatus.isProcessing, children: decorated.cancelText }) }), jsx(DropdownCloser, { children: jsx(Button, { variant: "primary", onClick: onApply, loading: calcedResponseStatus.isProcessing, children: decorated.applyText }) })] })] }), calcedResponseStatus.message && (jsx("div", { className: classNames.message, children: jsx(ResponseMessage, { status: calcedResponseStatus.status, role: "alert", children: calcedResponseStatus.message }) }))] })] }) })] }));
|
|
135
133
|
};
|
|
136
134
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterDropdown.js","sources":["../../../../src/components/Dropdown/FilterDropdown/FilterDropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type MouseEventHandler,\n type ReactNode,\n isValidElement,\n useMemo,\n} from 'react'\nimport
|
|
1
|
+
{"version":3,"file":"FilterDropdown.js","sources":["../../../../src/components/Dropdown/FilterDropdown/FilterDropdown.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentProps,\n type FC,\n type FormEvent,\n type MouseEventHandler,\n type ReactNode,\n isValidElement,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { type ResponseStatus, useResponseStatus } from '../../../hooks/useResponseStatus'\nimport { useIntl } from '../../../intl'\nimport { Button, type AbstractProps as ButtonProps } from '../../Button'\nimport { FaCircleCheckIcon, FaFilterIcon, FaRotateLeftIcon } from '../../Icon'\nimport { Cluster, Stack } from '../../Layout'\nimport { ResponseMessage } from '../../ResponseMessage'\nimport { Dropdown } from '../Dropdown'\nimport { DropdownCloser } from '../DropdownCloser'\nimport { DropdownContent } from '../DropdownContent'\nimport { DropdownTrigger } from '../DropdownTrigger'\n\ntype ObjectTriggerType = {\n text?: ReactNode\n /** 引き金となるボタンの大きさ */\n size?: ButtonProps['size']\n /** 引き金となるボタンをアイコンのみとするかどうか */\n onlyIcon?: boolean\n}\ntype AbstractProps = {\n /** 引き金となるボタン */\n trigger?: ReactNode | ObjectTriggerType\n applyText?: ReactNode\n cancelText?: ReactNode\n resetText?: ReactNode\n children: ReactNode\n filtered?:\n | boolean\n | {\n iconAlt?: string\n }\n responseStatus?: ResponseStatus\n onApply: MouseEventHandler<HTMLButtonElement>\n onCancel?: MouseEventHandler<HTMLButtonElement>\n onReset?: MouseEventHandler<HTMLButtonElement>\n onOpen?: () => void\n onClose?: () => void\n}\ntype Props = AbstractProps & Omit<ComponentProps<'button'>, keyof AbstractProps>\n\nconst CONTROL_CLUSTER_GAP: ComponentProps<typeof Cluster>['gap'] = { column: 1, row: 0.5 }\nconst ON_SUBMIT = (e: FormEvent) => {\n e.preventDefault()\n}\n\nconst classNameGenerator = tv({\n slots: {\n iconWrapper: ['smarthr-ui-Icon-extended', 'shr-relative shr-leading-none'],\n filteredIcon: 'shr-absolute shr-bottom-[2px] shr-right-[-4px] shr-h-[0.5em] shr-w-[0.5em]',\n inner: 'shr-p-1.5',\n actionArea: 'shr-border-t-shorthand shr-sticky shr-bottom-0 shr-bg-white shr-px-1.5 shr-py-1',\n resetButtonArea: '-shr-ms-0.5',\n rightButtonArea: 'shr-ms-auto',\n message: 'shr-text-right',\n },\n variants: {\n filtered: {\n true: {\n iconWrapper: 'shr-text-main',\n },\n },\n triggerSize: {\n M: {},\n S: {\n iconWrapper: '-shr-translate-x-0.25',\n },\n },\n },\n})\n\nexport const FilterDropdown: FC<Props> = ({\n trigger: orgTrigger,\n applyText,\n cancelText,\n resetText,\n children,\n filtered,\n responseStatus,\n onApply,\n onCancel,\n onReset,\n onOpen,\n onClose,\n ...rest\n}) => {\n // HINT: ReactNodeとObjectのどちらかを判定\n // typeofはnullの場合もobject判定されてしまうため念の為falsyで判定\n // ReactNodeの一部であるReactElementもobjectとして判定されてしまうためisValidElementで判定\n const trigger: ObjectTriggerType =\n !orgTrigger || typeof orgTrigger !== 'object' || isValidElement(orgTrigger)\n ? {\n text: orgTrigger as ReactNode,\n }\n : (orgTrigger as ObjectTriggerType)\n const { localize } = useIntl()\n\n const decorated = useMemo(\n () => ({\n filteredIconAlt:\n (typeof filtered === 'object' && filtered.iconAlt) ||\n localize({\n id: 'smarthr-ui/FilterDropdown/status',\n defaultText: '適用中',\n }),\n trigger:\n trigger.text ||\n localize({\n id: 'smarthr-ui/FilterDropdown/triggerText',\n defaultText: '絞り込み',\n }),\n applyText:\n applyText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/applyText',\n defaultText: '適用',\n }),\n cancelText:\n cancelText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/cancelText',\n defaultText: 'キャンセル',\n }),\n resetText:\n resetText ||\n localize({\n id: 'smarthr-ui/FilterDropdown/resetText',\n defaultText: '絞り込み条件を解除',\n }),\n }),\n [filtered, trigger.text, applyText, cancelText, resetText, localize],\n )\n\n const calcedResponseStatus = useResponseStatus(responseStatus)\n\n const classNamesMapper = useMemo(() => {\n const {\n iconWrapper,\n filteredIcon,\n inner,\n actionArea,\n resetButtonArea,\n rightButtonArea,\n message,\n } = classNameGenerator()\n\n const commonStyles = {\n filteredIcon: filteredIcon(),\n inner: inner(),\n actionArea: actionArea(),\n resetButtonArea: resetButtonArea(),\n rightButtonArea: rightButtonArea(),\n message: message(),\n }\n\n return {\n filtered: {\n ...commonStyles,\n iconWrapper: iconWrapper({ filtered: true, triggerSize: trigger.size }),\n },\n unfiltered: {\n ...commonStyles,\n iconWrapper: iconWrapper({ filtered: false, triggerSize: trigger.size }),\n },\n }\n }, [trigger.size])\n\n const classNames = classNamesMapper[filtered ? 'filtered' : 'unfiltered']\n\n const { buttonSuffix, buttonContent } = useMemo(() => {\n const FilterIcon = (\n <span className={classNames.iconWrapper}>\n <FaFilterIcon alt={trigger.onlyIcon ? decorated.trigger : undefined} />\n\n {filtered && (\n // HINT: altに揃えたいが、styleが複雑になってしまうためaria-labelを利用している\n <FaCircleCheckIcon\n aria-label={decorated.filteredIconAlt}\n className={classNames.filteredIcon}\n />\n )}\n </span>\n )\n\n if (trigger.onlyIcon) {\n return {\n buttonSuffix: undefined,\n buttonContent: FilterIcon,\n }\n }\n\n return {\n buttonSuffix: FilterIcon,\n buttonContent: decorated.trigger,\n }\n }, [filtered, decorated.trigger, decorated.filteredIconAlt, trigger.onlyIcon, classNames])\n\n return (\n <Dropdown onOpen={onOpen} onClose={onClose}>\n <DropdownTrigger tooltip={{ show: trigger.onlyIcon, message: decorated.trigger }}>\n <Button {...rest} suffix={buttonSuffix} size={trigger.size}>\n {buttonContent}\n </Button>\n </DropdownTrigger>\n <DropdownContent controllable>\n <form onSubmit={ON_SUBMIT}>\n <div className={classNames.inner}>{children}</div>\n <Stack gap={0.5} className={classNames.actionArea}>\n <Cluster gap={1} align=\"center\" justify=\"space-between\">\n {onReset && (\n <div className={classNames.resetButtonArea}>\n <Button\n variant=\"text\"\n size=\"S\"\n prefix={<FaRotateLeftIcon />}\n onClick={onReset}\n disabled={calcedResponseStatus.isProcessing}\n >\n {decorated.resetText}\n </Button>\n </div>\n )}\n\n <Cluster\n gap={CONTROL_CLUSTER_GAP}\n justify=\"flex-end\"\n className={classNames.rightButtonArea}\n >\n <DropdownCloser>\n <Button onClick={onCancel} disabled={calcedResponseStatus.isProcessing}>\n {decorated.cancelText}\n </Button>\n </DropdownCloser>\n <DropdownCloser>\n <Button\n variant=\"primary\"\n onClick={onApply}\n loading={calcedResponseStatus.isProcessing}\n >\n {decorated.applyText}\n </Button>\n </DropdownCloser>\n </Cluster>\n </Cluster>\n {calcedResponseStatus.message && (\n <div className={classNames.message}>\n <ResponseMessage status={calcedResponseStatus.status} role=\"alert\">\n {calcedResponseStatus.message}\n </ResponseMessage>\n </div>\n )}\n </Stack>\n </form>\n </DropdownContent>\n </Dropdown>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA;AACA;;AAEA;AAEA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACD;AACF;AACD;AACE;AACA;AACE;AACD;AACF;AACF;AACF;AAEM;;;;AAkBL;AAEI;AACI;AACD;;AAEP;AAEA;;AAIM;AACE;AACA;;;AAIF;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEJ;AAEE;AACE;AACA;;AAEL;AAIH;AAEA;AACE;AAUA;;;;;;;;;AAUE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;;AAEL;AAEA;;AAGE;;AAMM;AAQN;;AAEI;AACA;;;;AAKF;;;AAGJ;;AA6DF;;"}
|
|
@@ -4,8 +4,8 @@ var React = require('react');
|
|
|
4
4
|
var index = require('./../../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.cjs');
|
|
5
5
|
require('../../../intl/IntlProvider.cjs');
|
|
6
6
|
var intl_useIntl = require('../../../intl/useIntl.cjs');
|
|
7
|
+
require('../../../intl/Localizer.cjs');
|
|
7
8
|
require('react/jsx-runtime');
|
|
8
|
-
require('react-intl');
|
|
9
9
|
require('../../../_virtual/dayjs.min.cjs');
|
|
10
10
|
require('../../../intl/TimeFormatter.cjs');
|
|
11
11
|
var components_Icon_FaIcon = require('../../Icon/FaIcon.cjs');
|
|
@@ -2,8 +2,8 @@ import { useMemo, useState, useEffect, useCallback } from 'react';
|
|
|
2
2
|
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.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.js';
|
|
3
3
|
import '../../../intl/IntlProvider.js';
|
|
4
4
|
import { useIntl } from '../../../intl/useIntl.js';
|
|
5
|
+
import '../../../intl/Localizer.js';
|
|
5
6
|
import 'react/jsx-runtime';
|
|
6
|
-
import 'react-intl';
|
|
7
7
|
import '../../../_virtual/dayjs.min.js';
|
|
8
8
|
import '../../../intl/TimeFormatter.js';
|
|
9
9
|
import { FaArrowUpWideShortIcon, FaArrowDownWideShortIcon } from '../../Icon/FaIcon.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
require('../../intl/IntlProvider.cjs');
|
|
6
6
|
var intl_useIntl = require('../../intl/useIntl.cjs');
|
|
7
|
-
require('
|
|
7
|
+
require('../../intl/Localizer.cjs');
|
|
8
8
|
require('../../_virtual/dayjs.min.cjs');
|
|
9
9
|
require('../../intl/TimeFormatter.cjs');
|
|
10
10
|
var components_ErrorScreen_ErrorScreen = require('./ErrorScreen.cjs');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import '../../intl/IntlProvider.js';
|
|
4
4
|
import { useIntl } from '../../intl/useIntl.js';
|
|
5
|
-
import '
|
|
5
|
+
import '../../intl/Localizer.js';
|
|
6
6
|
import '../../_virtual/dayjs.min.js';
|
|
7
7
|
import '../../intl/TimeFormatter.js';
|
|
8
8
|
import { ErrorScreen } from './ErrorScreen.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
require('../../intl/IntlProvider.cjs');
|
|
6
6
|
var intl_useIntl = require('../../intl/useIntl.cjs');
|
|
7
|
-
require('
|
|
7
|
+
require('../../intl/Localizer.cjs');
|
|
8
8
|
require('../../_virtual/dayjs.min.cjs');
|
|
9
9
|
require('../../intl/TimeFormatter.cjs');
|
|
10
10
|
var components_ErrorScreen_ErrorScreen = require('./ErrorScreen.cjs');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import '../../intl/IntlProvider.js';
|
|
4
4
|
import { useIntl } from '../../intl/useIntl.js';
|
|
5
|
-
import '
|
|
5
|
+
import '../../intl/Localizer.js';
|
|
6
6
|
import '../../_virtual/dayjs.min.js';
|
|
7
7
|
import '../../intl/TimeFormatter.js';
|
|
8
8
|
import { ErrorScreen } from './ErrorScreen.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
require('../../intl/IntlProvider.cjs');
|
|
6
6
|
var intl_useIntl = require('../../intl/useIntl.cjs');
|
|
7
|
-
require('
|
|
7
|
+
require('../../intl/Localizer.cjs');
|
|
8
8
|
require('../../_virtual/dayjs.min.cjs');
|
|
9
9
|
require('../../intl/TimeFormatter.cjs');
|
|
10
10
|
var components_ErrorScreen_ErrorScreen = require('./ErrorScreen.cjs');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import '../../intl/IntlProvider.js';
|
|
4
4
|
import { useIntl } from '../../intl/useIntl.js';
|
|
5
|
-
import '
|
|
5
|
+
import '../../intl/Localizer.js';
|
|
6
6
|
import '../../_virtual/dayjs.min.js';
|
|
7
7
|
import '../../intl/TimeFormatter.js';
|
|
8
8
|
import { ErrorScreen } from './ErrorScreen.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
require('../../intl/IntlProvider.cjs');
|
|
6
6
|
var intl_useIntl = require('../../intl/useIntl.cjs');
|
|
7
|
-
require('
|
|
7
|
+
require('../../intl/Localizer.cjs');
|
|
8
8
|
require('../../_virtual/dayjs.min.cjs');
|
|
9
9
|
require('../../intl/TimeFormatter.cjs');
|
|
10
10
|
var components_Button_Button = require('../Button/Button.cjs');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import '../../intl/IntlProvider.js';
|
|
4
4
|
import { useIntl } from '../../intl/useIntl.js';
|
|
5
|
-
import '
|
|
5
|
+
import '../../intl/Localizer.js';
|
|
6
6
|
import '../../_virtual/dayjs.min.js';
|
|
7
7
|
import '../../intl/TimeFormatter.js';
|
|
8
8
|
import { Button } from '../Button/Button.js';
|
|
@@ -4,6 +4,19 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var decimal = require('./../../vendor/.pnpm/decimal.js@10.6.0/vendor/decimal.js/decimal.cjs');
|
|
6
6
|
var React = require('react');
|
|
7
|
+
var index = require('./../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.cjs');
|
|
8
|
+
var hooks_useEnvironment_useEnvironment = require('../../hooks/useEnvironment/useEnvironment.cjs');
|
|
9
|
+
require('../../themes/createSpacing.cjs');
|
|
10
|
+
require('../../_virtual/index.cjs');
|
|
11
|
+
require('../../_virtual/index2.cjs');
|
|
12
|
+
require('../../themes/createColor.cjs');
|
|
13
|
+
require('../../themes/createTextColor.cjs');
|
|
14
|
+
require('styled-components');
|
|
15
|
+
require('../../themes/createShadow/defaultShadow.cjs');
|
|
16
|
+
require('../../themes/createWidth.cjs');
|
|
17
|
+
require('../../themes/createBackgroundColor.cjs');
|
|
18
|
+
require('../../themes/createBorder.cjs');
|
|
19
|
+
require('../../hooks/useTheme.cjs');
|
|
7
20
|
require('../../intl/IntlProvider.cjs');
|
|
8
21
|
require('react-intl');
|
|
9
22
|
var intl_Localizer = require('../../intl/Localizer.cjs');
|
|
@@ -34,6 +47,8 @@ var components_Scroller_Scroller = require('../Scroller/Scroller.cjs');
|
|
|
34
47
|
var components_VisuallyHiddenText_VisuallyHiddenText = require('../VisuallyHiddenText/VisuallyHiddenText.cjs');
|
|
35
48
|
var components_FileViewer_ImageViewer = require('./ImageViewer.cjs');
|
|
36
49
|
var components_FileViewer_PDFViewer = require('./PDFViewer.cjs');
|
|
50
|
+
var components_FileViewer_SearchController = require('./SearchController.cjs');
|
|
51
|
+
var components_FileViewer_usePDFSearch = require('./usePDFSearch.cjs');
|
|
37
52
|
|
|
38
53
|
const defaultScaleStep = new decimal.Decimal(0.2);
|
|
39
54
|
const defaultScaleSteps = [0.2, 0.6, 1, 1.6, 2, 3];
|
|
@@ -43,6 +58,8 @@ const FileViewer = ({ file, scaleStep, scaleSteps, width: fixedWidth, onPassword
|
|
|
43
58
|
const [loaded, setLoaded] = React.useState(false);
|
|
44
59
|
const [rotation, setRotation] = React.useState(undefined);
|
|
45
60
|
const [width, setWidth] = React.useState(fixedWidth ?? 0);
|
|
61
|
+
const isPDF = file.contentType === 'application/pdf';
|
|
62
|
+
const search = components_FileViewer_usePDFSearch.usePDFSearch(file.url);
|
|
46
63
|
const internalScaleStep = React.useMemo(() => (scaleStep ? new decimal.Decimal(scaleStep) : defaultScaleStep), [scaleStep]);
|
|
47
64
|
const scaleUp = React.useCallback(() => {
|
|
48
65
|
setScale((currentScale) => new decimal.Decimal(currentScale).add(internalScaleStep).toNumber());
|
|
@@ -74,9 +91,25 @@ const FileViewer = ({ file, scaleStep, scaleSteps, width: fixedWidth, onPassword
|
|
|
74
91
|
resizeObserver.disconnect();
|
|
75
92
|
};
|
|
76
93
|
}, [fixedWidth]);
|
|
77
|
-
return (jsxRuntime.jsxs(components_Scroller_Scroller.Scroller, { direction: "both", className: "shr-flex shr-h-full shr-w-full shr-flex-col shr-gap-2 shr-bg-scrim shr-bg-[radial-gradient(theme(textColor.black)_1px,_transparent_0)] shr-bg-[length:16px_16px]", ref: ref, children: [jsxRuntime.jsx("div", { className: "shr-sticky shr-start-0 shr-top-0 shr-z-[1] shr-flex shr-w-full shr-flex-shrink-0 shr-gap-0.5", children: jsxRuntime.jsx(Controller, { scale: scale, setScale: setScale, scaleSteps: scaleSteps || defaultScaleSteps, onClickScaleUpButton: scaleUp, onClickScaleDownButton: scaleDown, onClickRotateButton: rotate }) }), jsxRuntime.jsxs("div", { className: "shr-z-[0] shr-mx-auto shr-my-0 shr-box-border shr-flex shr-w-fit shr-flex-shrink-0 shr-grow shr-items-center shr-justify-center shr-px-2 shr-pb-2", children: [!loaded && (jsxRuntime.jsx("div", { className: "shr-pointer-events-none shr-fixed shr-inset-0 shr-flex shr-h-full shr-w-full shr-items-center shr-justify-center", children: jsxRuntime.jsx(components_Loader_Loader.Loader, { type: "light", size: "M" }) })), jsxRuntime.jsx("div", { className: !loaded ? 'shr-invisible' : '', children:
|
|
94
|
+
return (jsxRuntime.jsxs(components_Scroller_Scroller.Scroller, { direction: "both", className: "shr-flex shr-h-full shr-w-full shr-flex-col shr-gap-2 shr-bg-scrim shr-bg-[radial-gradient(theme(textColor.black)_1px,_transparent_0)] shr-bg-[length:16px_16px]", ref: ref, children: [jsxRuntime.jsx("div", { className: "shr-sticky shr-start-0 shr-top-0 shr-z-[1] shr-flex shr-w-full shr-flex-shrink-0 shr-gap-0.5", children: jsxRuntime.jsx(Controller, { scale: scale, setScale: setScale, scaleSteps: scaleSteps || defaultScaleSteps, onClickScaleUpButton: scaleUp, onClickScaleDownButton: scaleDown, onClickRotateButton: rotate, searchController: isPDF ? jsxRuntime.jsx(components_FileViewer_SearchController.SearchController, { search: search }) : undefined }) }), jsxRuntime.jsxs("div", { className: "shr-z-[0] shr-mx-auto shr-my-0 shr-box-border shr-flex shr-w-fit shr-flex-shrink-0 shr-grow shr-items-center shr-justify-center shr-px-2 shr-pb-2", children: [!loaded && (jsxRuntime.jsx("div", { className: "shr-pointer-events-none shr-fixed shr-inset-0 shr-flex shr-h-full shr-w-full shr-items-center shr-justify-center", children: jsxRuntime.jsx(components_Loader_Loader.Loader, { type: "light", size: "M" }) })), jsxRuntime.jsx("div", { className: !loaded ? 'shr-invisible' : '', children: isPDF ? (jsxRuntime.jsx(components_FileViewer_PDFViewer.PDFViewer, { scale: scale, rotation: rotation, file: file, width: width, onLoad: handleLoaded, onPDFLoaded: handlePDFLoaded, onPassword: onPassword, onLoadError: onLoadError, search: search })) : file.contentType.startsWith('image/') ? (jsxRuntime.jsx(components_FileViewer_ImageViewer.ImageViewer, { scale: scale, rotation: rotation, file: file, width: width, onLoad: handleLoaded, onLoadError: onLoadError })) : (jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/FileViewer/unsupportedFileText", defaultText: "\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u5F62\u5F0F\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u3059\u3002" })) })] })] }));
|
|
78
95
|
};
|
|
79
|
-
const
|
|
96
|
+
const controllerClassNameGenerator = index.tv({
|
|
97
|
+
base: 'shr-sticky shr-grid shr-w-full shr-items-center shr-bg-scrim shr-py-0.5 shr-shadow-layer-1',
|
|
98
|
+
variants: {
|
|
99
|
+
mobile: {
|
|
100
|
+
true: 'shr-gap-0.5 shr-px-1',
|
|
101
|
+
false: 'shr-grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] shr-gap-1.5 shr-px-2',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const Controller = React.memo(({ scale, setScale, scaleSteps, onClickScaleUpButton, onClickScaleDownButton, onClickRotateButton, searchController, }) => {
|
|
106
|
+
const { mobile } = hooks_useEnvironment_useEnvironment.useEnvironment();
|
|
107
|
+
const className = React.useMemo(() => controllerClassNameGenerator({ mobile }), [mobile]);
|
|
108
|
+
const onClickScaleStep = React.useCallback((e) => setScale(Number(e.currentTarget.value)), [setScale]);
|
|
109
|
+
return (jsxRuntime.jsxs("div", { className: className, children: [!mobile && jsxRuntime.jsx("div", { role: "presentation", "aria-hidden": "true" }), jsxRuntime.jsxs(components_Layout_Cluster_Cluster.Cluster, { gap: 0.5, className: "shr-justify-self-center", children: [jsxRuntime.jsxs("div", { className: "shr-border-shorthand shr-flex shr-divide-x shr-divide-solid shr-overflow-hidden shr-rounded-m", children: [jsxRuntime.jsx(components_Button_Button.Button, { onClick: onClickScaleDownButton, disabled: scale <= scaleSteps[0], className: "shr-rounded-r-none shr-border-none", children: jsxRuntime.jsx(components_Icon_FaIcon.FaMagnifyingGlassMinusIcon, { alt: jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/FileViewer/scaleDownAlt", defaultText: "\u7E2E\u5C0F" }) }) }), jsxRuntime.jsx(components_Dropdown_DropdownMenuButton_DropdownMenuButton.DropdownMenuButton, { trigger: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(components_VisuallyHiddenText_VisuallyHiddenText.VisuallyHiddenText, { children: jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/FileViewer/scaleRateLabel", defaultText: "\u62E1\u5927\u7387" }) }), `${(scale * 100).toFixed(0)}%`] }), className: "shr-border-y-0 shr-border-[theme(borderColor.default)] [&_.smarthr-ui-Button]:shr-rounded-none [&_.smarthr-ui-Button]:shr-border-[transparent]", children: scaleSteps.map((step) => (jsxRuntime.jsx(components_Button_Button.Button, { value: step, onClick: onClickScaleStep, className: "shr-rounded-none shr-border-0", children: `${(step * 100).toFixed(0)}%` }, step.toString()))) }), jsxRuntime.jsx(components_Button_Button.Button, { onClick: onClickScaleUpButton, className: "shr-rounded-l-none shr-border-0", children: jsxRuntime.jsx(components_Icon_FaIcon.FaMagnifyingGlassPlusIcon, { alt: jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/FileViewer/scaleUpAlt", defaultText: "\u62E1\u5927" }) }) })] }), jsxRuntime.jsx(components_Button_Button.Button, { onClick: onClickRotateButton, className: "shr-p-0.75", children: jsxRuntime.jsx(components_Icon_FaIcon.FaArrowRotateLeftIcon, { alt: jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/FileViewer/rotateAlt", defaultText: "\u5DE6\u56DE\u8EE2" }) }) })] }), searchController ? (jsxRuntime.jsx("div", { className: "shr-min-w-0 shr-justify-self-stretch", children: searchController })) : (
|
|
110
|
+
/* PC 表示時のときに中央の操作ボタンたちを中央へ寄せるための空のスペーサー */
|
|
111
|
+
!mobile && jsxRuntime.jsx("div", { role: "presentation", "aria-hidden": "true" }))] }));
|
|
112
|
+
});
|
|
80
113
|
|
|
81
114
|
exports.FileViewer = FileViewer;
|
|
82
115
|
//# sourceMappingURL=FileViewer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileViewer.cjs","sources":["../../../src/components/FileViewer/FileViewer.tsx"],"sourcesContent":["'use client'\n\nimport Decimal from 'decimal.js'\nimport {\n type ComponentProps,\n type FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { Localizer } from '../../intl'\nimport { Button } from '../Button'\nimport { DropdownMenuButton } from '../Dropdown'\nimport {\n FaArrowRotateLeftIcon,\n FaMagnifyingGlassMinusIcon,\n FaMagnifyingGlassPlusIcon,\n} from '../Icon'\nimport { Cluster } from '../Layout'\nimport { Loader } from '../Loader'\nimport { Scroller } from '../Scroller'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\nimport { ImageViewer } from './ImageViewer'\nimport { PDFViewer } from './PDFViewer'\n\nimport type { FileForViewer } from './types'\n\nconst defaultScaleStep = new Decimal(0.2)\nconst defaultScaleSteps = [0.2, 0.6, 1, 1.6, 2, 3]\n\ntype Props = {\n file: FileForViewer\n width?: number\n\n /*\n * 拡大縮小率のステップを、100%を1とした配列で指定します。\n * */\n scaleSteps?: number[]\n\n scaleStep?: number\n onPassword?: ComponentProps<typeof PDFViewer>['onPassword']\n onLoadError?: () => void\n}\n\nexport const FileViewer: FC<Props> = ({\n file,\n scaleStep,\n scaleSteps,\n width: fixedWidth,\n onPassword,\n onLoadError,\n}) => {\n const ref = useRef<HTMLDivElement>(null)\n const [scale, setScale] = useState(1)\n const [loaded, setLoaded] = useState(false)\n const [rotation, setRotation] = useState<number | undefined>(undefined)\n const [width, setWidth] = useState(fixedWidth ?? 0)\n\n const internalScaleStep = useMemo(\n () => (scaleStep ? new Decimal(scaleStep) : defaultScaleStep),\n [scaleStep],\n )\n\n const scaleUp = useCallback(() => {\n setScale((currentScale) => new Decimal(currentScale).add(internalScaleStep).toNumber())\n }, [internalScaleStep])\n\n const scaleDown = useCallback(() => {\n setScale((currentScale) => new Decimal(currentScale).sub(internalScaleStep).toNumber())\n }, [internalScaleStep])\n\n const rotate = useCallback(() => {\n // HINT: react-pdf側のAnnotationLayer.cssではマイナスの回転に対応しておらず、また0, 90, 180, 270度のみ対応しているため、-90度の場合は+270度として扱う\n const currentRotation = rotation ?? 0\n const newRotation = currentRotation === 0 ? 270 : currentRotation - 90\n setRotation(newRotation)\n }, [rotation])\n\n const handleLoaded = useCallback(() => {\n setLoaded(true)\n }, [])\n\n const handlePDFLoaded = useCallback((defaultRotation: number) => {\n setRotation(defaultRotation)\n }, [])\n\n useEffect(() => {\n if (!ref.current || fixedWidth !== undefined) {\n return\n }\n\n const resizeObserver = new ResizeObserver(() => {\n setWidth((ref.current?.clientWidth ?? 0) - 64)\n })\n\n resizeObserver.observe(ref.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }, [fixedWidth])\n\n return (\n <Scroller\n direction=\"both\"\n className=\"shr-flex shr-h-full shr-w-full shr-flex-col shr-gap-2 shr-bg-scrim shr-bg-[radial-gradient(theme(textColor.black)_1px,_transparent_0)] shr-bg-[length:16px_16px]\"\n ref={ref}\n >\n <div className=\"shr-sticky shr-start-0 shr-top-0 shr-z-[1] shr-flex shr-w-full shr-flex-shrink-0 shr-gap-0.5\">\n <Controller\n scale={scale}\n setScale={setScale}\n scaleSteps={scaleSteps || defaultScaleSteps}\n onClickScaleUpButton={scaleUp}\n onClickScaleDownButton={scaleDown}\n onClickRotateButton={rotate}\n />\n </div>\n <div className=\"shr-z-[0] shr-mx-auto shr-my-0 shr-box-border shr-flex shr-w-fit shr-flex-shrink-0 shr-grow shr-items-center shr-justify-center shr-px-2 shr-pb-2\">\n {!loaded && (\n <div className=\"shr-pointer-events-none shr-fixed shr-inset-0 shr-flex shr-h-full shr-w-full shr-items-center shr-justify-center\">\n <Loader type=\"light\" size=\"M\" />\n </div>\n )}\n <div className={!loaded ? 'shr-invisible' : ''}>\n {
|
|
1
|
+
{"version":3,"file":"FileViewer.cjs","sources":["../../../src/components/FileViewer/FileViewer.tsx"],"sourcesContent":["'use client'\n\nimport Decimal from 'decimal.js'\nimport {\n type ComponentProps,\n type FC,\n type MouseEvent,\n type ReactNode,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useEnvironment } from '../../hooks/useEnvironment'\nimport { Localizer } from '../../intl'\nimport { Button } from '../Button'\nimport { DropdownMenuButton } from '../Dropdown'\nimport {\n FaArrowRotateLeftIcon,\n FaMagnifyingGlassMinusIcon,\n FaMagnifyingGlassPlusIcon,\n} from '../Icon'\nimport { Cluster } from '../Layout'\nimport { Loader } from '../Loader'\nimport { Scroller } from '../Scroller'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\nimport { ImageViewer } from './ImageViewer'\nimport { PDFViewer } from './PDFViewer'\nimport { SearchController } from './SearchController'\nimport { usePDFSearch } from './usePDFSearch'\n\nimport type { FileForViewer } from './types'\n\nconst defaultScaleStep = new Decimal(0.2)\nconst defaultScaleSteps = [0.2, 0.6, 1, 1.6, 2, 3]\n\ntype Props = {\n file: FileForViewer\n width?: number\n\n /*\n * 拡大縮小率のステップを、100%を1とした配列で指定します。\n * */\n scaleSteps?: number[]\n\n scaleStep?: number\n onPassword?: ComponentProps<typeof PDFViewer>['onPassword']\n onLoadError?: () => void\n}\n\nexport const FileViewer: FC<Props> = ({\n file,\n scaleStep,\n scaleSteps,\n width: fixedWidth,\n onPassword,\n onLoadError,\n}) => {\n const ref = useRef<HTMLDivElement>(null)\n const [scale, setScale] = useState(1)\n const [loaded, setLoaded] = useState(false)\n const [rotation, setRotation] = useState<number | undefined>(undefined)\n const [width, setWidth] = useState(fixedWidth ?? 0)\n const isPDF = file.contentType === 'application/pdf'\n\n const search = usePDFSearch(file.url)\n\n const internalScaleStep = useMemo(\n () => (scaleStep ? new Decimal(scaleStep) : defaultScaleStep),\n [scaleStep],\n )\n\n const scaleUp = useCallback(() => {\n setScale((currentScale) => new Decimal(currentScale).add(internalScaleStep).toNumber())\n }, [internalScaleStep])\n\n const scaleDown = useCallback(() => {\n setScale((currentScale) => new Decimal(currentScale).sub(internalScaleStep).toNumber())\n }, [internalScaleStep])\n\n const rotate = useCallback(() => {\n // HINT: react-pdf側のAnnotationLayer.cssではマイナスの回転に対応しておらず、また0, 90, 180, 270度のみ対応しているため、-90度の場合は+270度として扱う\n const currentRotation = rotation ?? 0\n const newRotation = currentRotation === 0 ? 270 : currentRotation - 90\n setRotation(newRotation)\n }, [rotation])\n\n const handleLoaded = useCallback(() => {\n setLoaded(true)\n }, [])\n\n const handlePDFLoaded = useCallback((defaultRotation: number) => {\n setRotation(defaultRotation)\n }, [])\n\n useEffect(() => {\n if (!ref.current || fixedWidth !== undefined) {\n return\n }\n\n const resizeObserver = new ResizeObserver(() => {\n setWidth((ref.current?.clientWidth ?? 0) - 64)\n })\n\n resizeObserver.observe(ref.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }, [fixedWidth])\n\n return (\n <Scroller\n direction=\"both\"\n className=\"shr-flex shr-h-full shr-w-full shr-flex-col shr-gap-2 shr-bg-scrim shr-bg-[radial-gradient(theme(textColor.black)_1px,_transparent_0)] shr-bg-[length:16px_16px]\"\n ref={ref}\n >\n <div className=\"shr-sticky shr-start-0 shr-top-0 shr-z-[1] shr-flex shr-w-full shr-flex-shrink-0 shr-gap-0.5\">\n <Controller\n scale={scale}\n setScale={setScale}\n scaleSteps={scaleSteps || defaultScaleSteps}\n onClickScaleUpButton={scaleUp}\n onClickScaleDownButton={scaleDown}\n onClickRotateButton={rotate}\n searchController={isPDF ? <SearchController search={search} /> : undefined}\n />\n </div>\n <div className=\"shr-z-[0] shr-mx-auto shr-my-0 shr-box-border shr-flex shr-w-fit shr-flex-shrink-0 shr-grow shr-items-center shr-justify-center shr-px-2 shr-pb-2\">\n {!loaded && (\n <div className=\"shr-pointer-events-none shr-fixed shr-inset-0 shr-flex shr-h-full shr-w-full shr-items-center shr-justify-center\">\n <Loader type=\"light\" size=\"M\" />\n </div>\n )}\n <div className={!loaded ? 'shr-invisible' : ''}>\n {isPDF ? (\n <PDFViewer\n scale={scale}\n rotation={rotation}\n file={file}\n width={width}\n onLoad={handleLoaded}\n onPDFLoaded={handlePDFLoaded}\n onPassword={onPassword}\n onLoadError={onLoadError}\n search={search}\n />\n ) : file.contentType.startsWith('image/') ? (\n <ImageViewer\n scale={scale}\n rotation={rotation}\n file={file}\n width={width}\n onLoad={handleLoaded}\n onLoadError={onLoadError}\n />\n ) : (\n <Localizer\n id=\"smarthr-ui/FileViewer/unsupportedFileText\"\n defaultText=\"サポートされていない形式のファイルです。\"\n />\n )}\n </div>\n </div>\n </Scroller>\n )\n}\n\ntype ControllerProps = {\n scale: number\n setScale: (scale: number) => void\n scaleSteps: number[]\n onClickScaleUpButton: () => void\n onClickScaleDownButton: () => void\n onClickRotateButton: () => void\n searchController?: ReactNode\n}\n\nconst controllerClassNameGenerator = tv({\n base: 'shr-sticky shr-grid shr-w-full shr-items-center shr-bg-scrim shr-py-0.5 shr-shadow-layer-1',\n variants: {\n mobile: {\n true: 'shr-gap-0.5 shr-px-1',\n false: 'shr-grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] shr-gap-1.5 shr-px-2',\n },\n },\n})\n\nconst Controller: FC<ControllerProps> = memo(\n ({\n scale,\n setScale,\n scaleSteps,\n onClickScaleUpButton,\n onClickScaleDownButton,\n onClickRotateButton,\n searchController,\n }) => {\n const { mobile } = useEnvironment()\n const className = useMemo(() => controllerClassNameGenerator({ mobile }), [mobile])\n\n const onClickScaleStep = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => setScale(Number(e.currentTarget.value)),\n [setScale],\n )\n\n return (\n <div className={className}>\n {/* PC 表示時のときに中央の操作ボタンたちを中央へ寄せるための空のスペーサー */}\n {!mobile && <div role=\"presentation\" aria-hidden=\"true\" />}\n <Cluster gap={0.5} className=\"shr-justify-self-center\">\n <div className=\"shr-border-shorthand shr-flex shr-divide-x shr-divide-solid shr-overflow-hidden shr-rounded-m\">\n <Button\n onClick={onClickScaleDownButton}\n disabled={scale <= scaleSteps[0]}\n className=\"shr-rounded-r-none shr-border-none\"\n >\n <FaMagnifyingGlassMinusIcon\n alt={<Localizer id=\"smarthr-ui/FileViewer/scaleDownAlt\" defaultText=\"縮小\" />}\n />\n </Button>\n <DropdownMenuButton\n trigger={\n <>\n <VisuallyHiddenText>\n <Localizer id=\"smarthr-ui/FileViewer/scaleRateLabel\" defaultText=\"拡大率\" />\n </VisuallyHiddenText>\n {`${(scale * 100).toFixed(0)}%`}\n </>\n }\n className=\"shr-border-y-0 shr-border-[theme(borderColor.default)] [&_.smarthr-ui-Button]:shr-rounded-none [&_.smarthr-ui-Button]:shr-border-[transparent]\"\n >\n {scaleSteps.map((step) => (\n <Button\n key={step.toString()}\n value={step}\n onClick={onClickScaleStep}\n className=\"shr-rounded-none shr-border-0\"\n >\n {`${(step * 100).toFixed(0)}%`}\n </Button>\n ))}\n </DropdownMenuButton>\n <Button onClick={onClickScaleUpButton} className=\"shr-rounded-l-none shr-border-0\">\n <FaMagnifyingGlassPlusIcon\n alt={<Localizer id=\"smarthr-ui/FileViewer/scaleUpAlt\" defaultText=\"拡大\" />}\n />\n </Button>\n </div>\n <Button onClick={onClickRotateButton} className=\"shr-p-0.75\">\n <FaArrowRotateLeftIcon\n alt={<Localizer id=\"smarthr-ui/FileViewer/rotateAlt\" defaultText=\"左回転\" />}\n />\n </Button>\n </Cluster>\n {searchController ? (\n <div className=\"shr-min-w-0 shr-justify-self-stretch\">{searchController}</div>\n ) : (\n /* PC 表示時のときに中央の操作ボタンたちを中央へ寄せるための空のスペーサー */\n !mobile && <div role=\"presentation\" aria-hidden=\"true\" />\n )}\n </div>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA;AACA;;AAwBE;;;;AAIA;AACA;;;AASA;;AAEA;AAEA;;AAEA;AAEA;;AAEE;AACA;;AAEF;AAEA;;;AAIA;;;;;;;AASE;AACE;AACF;AAEA;AAEA;;AAEA;AACF;;AAyDF;AAYA;AACE;AACA;AACE;AACE;AACA;AACD;AACF;AACF;AAED;AAUI;AACA;;;;AA4DM;AAIR;;"}
|