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.
Files changed (156) hide show
  1. package/lib/components/AppHeader/components/mobile/MenuDialog.cjs +26 -15
  2. package/lib/components/AppHeader/components/mobile/MenuDialog.cjs.map +1 -1
  3. package/lib/components/AppHeader/components/mobile/MenuDialog.js +27 -16
  4. package/lib/components/AppHeader/components/mobile/MenuDialog.js.map +1 -1
  5. package/lib/components/Calendar/YearPicker.cjs +13 -14
  6. package/lib/components/Calendar/YearPicker.cjs.map +1 -1
  7. package/lib/components/Calendar/YearPicker.js +14 -15
  8. package/lib/components/Calendar/YearPicker.js.map +1 -1
  9. package/lib/components/Checkbox/Checkbox.cjs +3 -2
  10. package/lib/components/Checkbox/Checkbox.cjs.map +1 -1
  11. package/lib/components/Checkbox/Checkbox.js +4 -3
  12. package/lib/components/Checkbox/Checkbox.js.map +1 -1
  13. package/lib/components/DatePicker/DatePicker.cjs +59 -51
  14. package/lib/components/DatePicker/DatePicker.cjs.map +1 -1
  15. package/lib/components/DatePicker/DatePicker.js +60 -52
  16. package/lib/components/DatePicker/DatePicker.js.map +1 -1
  17. package/lib/components/Disclosure/DisclosureContent.cjs +1 -1
  18. package/lib/components/Disclosure/DisclosureContent.cjs.map +1 -1
  19. package/lib/components/Disclosure/DisclosureContent.js +1 -1
  20. package/lib/components/Disclosure/DisclosureContent.js.map +1 -1
  21. package/lib/components/Disclosure/DisclosureTrigger.cjs +8 -8
  22. package/lib/components/Disclosure/DisclosureTrigger.cjs.map +1 -1
  23. package/lib/components/Disclosure/DisclosureTrigger.js +9 -9
  24. package/lib/components/Disclosure/DisclosureTrigger.js.map +1 -1
  25. package/lib/components/DropZone/DropZone.cjs +32 -27
  26. package/lib/components/DropZone/DropZone.cjs.map +1 -1
  27. package/lib/components/DropZone/DropZone.js +33 -28
  28. package/lib/components/DropZone/DropZone.js.map +1 -1
  29. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs +17 -17
  30. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs.map +1 -1
  31. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js +18 -18
  32. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js.map +1 -1
  33. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.cjs +16 -30
  34. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.cjs.map +1 -1
  35. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.js +17 -31
  36. package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.js.map +1 -1
  37. package/lib/components/Dropdown/SortDropdown/SortDropdown.cjs +3 -3
  38. package/lib/components/Dropdown/SortDropdown/SortDropdown.cjs.map +1 -1
  39. package/lib/components/Dropdown/SortDropdown/SortDropdown.js +2 -2
  40. package/lib/components/Dropdown/SortDropdown/SortDropdown.js.map +1 -1
  41. package/lib/components/FileViewer/ImageViewer.cjs +21 -19
  42. package/lib/components/FileViewer/ImageViewer.cjs.map +1 -1
  43. package/lib/components/FileViewer/ImageViewer.js +22 -20
  44. package/lib/components/FileViewer/ImageViewer.js.map +1 -1
  45. package/lib/components/FormGroup/Fieldset.cjs +160 -0
  46. package/lib/components/FormGroup/Fieldset.cjs.map +1 -0
  47. package/lib/components/FormGroup/Fieldset.d.ts +9 -0
  48. package/lib/components/FormGroup/Fieldset.js +158 -0
  49. package/lib/components/FormGroup/Fieldset.js.map +1 -0
  50. package/lib/components/FormGroup/FormControl.cjs +119 -0
  51. package/lib/components/FormGroup/FormControl.cjs.map +1 -0
  52. package/lib/components/FormGroup/FormControl.d.ts +7 -0
  53. package/lib/components/FormGroup/FormControl.js +117 -0
  54. package/lib/components/FormGroup/FormControl.js.map +1 -0
  55. package/lib/components/FormGroup/FormGroup.cjs +28 -0
  56. package/lib/components/FormGroup/FormGroup.cjs.map +1 -0
  57. package/lib/components/FormGroup/FormGroup.d.ts +26 -0
  58. package/lib/components/FormGroup/FormGroup.js +24 -0
  59. package/lib/components/FormGroup/FormGroup.js.map +1 -0
  60. package/lib/components/FormGroup/constants.cjs +8 -0
  61. package/lib/components/FormGroup/constants.cjs.map +1 -0
  62. package/lib/components/FormGroup/constants.d.ts +2 -0
  63. package/lib/components/FormGroup/constants.js +5 -0
  64. package/lib/components/FormGroup/constants.js.map +1 -0
  65. package/lib/components/FormGroup/index.cjs +10 -0
  66. package/lib/components/{Fieldset → FormGroup}/index.cjs.map +1 -1
  67. package/lib/components/FormGroup/index.d.ts +2 -0
  68. package/lib/components/{Fieldset → FormGroup}/index.js +1 -0
  69. package/lib/components/{Fieldset → FormGroup}/index.js.map +1 -1
  70. package/lib/components/FormGroup/style.cjs +22 -0
  71. package/lib/components/FormGroup/style.cjs.map +1 -0
  72. package/lib/components/FormGroup/style.d.ts +45 -0
  73. package/lib/components/FormGroup/style.js +20 -0
  74. package/lib/components/FormGroup/style.js.map +1 -0
  75. package/lib/components/FormGroup/type.cjs +3 -0
  76. package/lib/components/FormGroup/type.cjs.map +1 -0
  77. package/lib/components/{FormControl/FormControl.d.ts → FormGroup/type.d.ts} +17 -14
  78. package/lib/components/FormGroup/type.js +2 -0
  79. package/lib/components/FormGroup/type.js.map +1 -0
  80. package/lib/components/FormGroup/useAutoBindErrorInput.cjs +30 -0
  81. package/lib/components/FormGroup/useAutoBindErrorInput.cjs.map +1 -0
  82. package/lib/components/FormGroup/useAutoBindErrorInput.d.ts +11 -0
  83. package/lib/components/FormGroup/useAutoBindErrorInput.js +28 -0
  84. package/lib/components/FormGroup/useAutoBindErrorInput.js.map +1 -0
  85. package/lib/components/FormGroup/useDescribedByIds.cjs +77 -0
  86. package/lib/components/FormGroup/useDescribedByIds.cjs.map +1 -0
  87. package/lib/components/FormGroup/useDescribedByIds.d.ts +17 -0
  88. package/lib/components/FormGroup/useDescribedByIds.js +75 -0
  89. package/lib/components/FormGroup/useDescribedByIds.js.map +1 -0
  90. package/lib/components/Heading/PageHeading/PageHeading.cjs +25 -33
  91. package/lib/components/Heading/PageHeading/PageHeading.cjs.map +1 -1
  92. package/lib/components/Heading/PageHeading/PageHeading.js +26 -34
  93. package/lib/components/Heading/PageHeading/PageHeading.js.map +1 -1
  94. package/lib/components/Icon/FaIcon.cjs +4 -0
  95. package/lib/components/Icon/FaIcon.cjs.map +1 -1
  96. package/lib/components/Icon/FaIcon.d.ts +2 -0
  97. package/lib/components/Icon/FaIcon.js +4 -2
  98. package/lib/components/Icon/FaIcon.js.map +1 -1
  99. package/lib/components/Icon/index.cjs +2 -0
  100. package/lib/components/Icon/index.cjs.map +1 -1
  101. package/lib/components/Icon/index.js +1 -1
  102. package/lib/components/InputFile/FilePreviewDialog.cjs +1 -1
  103. package/lib/components/InputFile/FilePreviewDialog.cjs.map +1 -1
  104. package/lib/components/InputFile/FilePreviewDialog.js +1 -1
  105. package/lib/components/InputFile/FilePreviewDialog.js.map +1 -1
  106. package/lib/components/InputFile/InputFileMultiplyAppendable.cjs +10 -13
  107. package/lib/components/InputFile/InputFileMultiplyAppendable.cjs.map +1 -1
  108. package/lib/components/InputFile/InputFileMultiplyAppendable.js +11 -14
  109. package/lib/components/InputFile/InputFileMultiplyAppendable.js.map +1 -1
  110. package/lib/components/Scroller/Scroller.cjs +19 -32
  111. package/lib/components/Scroller/Scroller.cjs.map +1 -1
  112. package/lib/components/Scroller/Scroller.js +20 -33
  113. package/lib/components/Scroller/Scroller.js.map +1 -1
  114. package/lib/components/SegmentedControl/SegmentedControl.cjs +53 -55
  115. package/lib/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  116. package/lib/components/SegmentedControl/SegmentedControl.js +54 -56
  117. package/lib/components/SegmentedControl/SegmentedControl.js.map +1 -1
  118. package/lib/components/Table/TableScroller.cjs +4 -12
  119. package/lib/components/Table/TableScroller.cjs.map +1 -1
  120. package/lib/components/Table/TableScroller.js +4 -12
  121. package/lib/components/Table/TableScroller.js.map +1 -1
  122. package/lib/components/Textarea/Textarea.cjs +5 -6
  123. package/lib/components/Textarea/Textarea.cjs.map +1 -1
  124. package/lib/components/Textarea/Textarea.js +6 -7
  125. package/lib/components/Textarea/Textarea.js.map +1 -1
  126. package/lib/hooks/useCallbackRefCleanupForReact18.cjs +61 -0
  127. package/lib/hooks/useCallbackRefCleanupForReact18.cjs.map +1 -0
  128. package/lib/hooks/useCallbackRefCleanupForReact18.d.ts +39 -0
  129. package/lib/hooks/useCallbackRefCleanupForReact18.js +59 -0
  130. package/lib/hooks/useCallbackRefCleanupForReact18.js.map +1 -0
  131. package/lib/index.cjs +6 -4
  132. package/lib/index.cjs.map +1 -1
  133. package/lib/index.d.ts +1 -2
  134. package/lib/index.js +3 -3
  135. package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.cjs +6 -0
  136. package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.cjs.map +1 -1
  137. package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.js +5 -1
  138. package/lib/vendor/.pnpm/react-icons@5.7.0_react@19.2.8/vendor/react-icons/fa6/index.js.map +1 -1
  139. package/metadata.json +1 -1
  140. package/package.json +2 -2
  141. package/lib/components/Fieldset/Fieldset.cjs +0 -9
  142. package/lib/components/Fieldset/Fieldset.cjs.map +0 -1
  143. package/lib/components/Fieldset/Fieldset.d.ts +0 -7
  144. package/lib/components/Fieldset/Fieldset.js +0 -7
  145. package/lib/components/Fieldset/Fieldset.js.map +0 -1
  146. package/lib/components/Fieldset/index.cjs +0 -8
  147. package/lib/components/Fieldset/index.d.ts +0 -1
  148. package/lib/components/FormControl/FormControl.cjs +0 -273
  149. package/lib/components/FormControl/FormControl.cjs.map +0 -1
  150. package/lib/components/FormControl/FormControl.js +0 -270
  151. package/lib/components/FormControl/FormControl.js.map +0 -1
  152. package/lib/components/FormControl/index.cjs +0 -9
  153. package/lib/components/FormControl/index.cjs.map +0 -1
  154. package/lib/components/FormControl/index.d.ts +0 -1
  155. package/lib/components/FormControl/index.js +0 -2
  156. 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
- handleDialogClose: () => latest.setIsOpen(false),
97
- clearAppLauncher: () => latest.setIsAppLauncherSelected(false),
98
- clearReleaseNote: () => latest.setIsReleaseNoteSelected(false),
99
- clearNavigationGroup: () => latest.setSelectedNavigationGroup(null),
100
- }), [latest]);
101
- // HINT: Contentをanimationで非表示にしたい
102
- // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、
103
- // unmount時に操作内容のclearを行う
104
- React.useEffect(() => () => {
105
- functions.clearReleaseNote();
106
- functions.clearAppLauncher();
107
- functions.clearNavigationGroup();
108
- }, [functions]);
109
- return (jsxRuntime.jsxs(components_SectioningContent_SectioningContent.Section, { role: "dialog", "aria-modal": "true", className: CLASS_NAMES.wrapper, ref: domRef, 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 ? (
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, useEffect, useRef } from 'react';
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
- handleDialogClose: () => latest.setIsOpen(false),
95
- clearAppLauncher: () => latest.setIsAppLauncherSelected(false),
96
- clearReleaseNote: () => latest.setIsReleaseNoteSelected(false),
97
- clearNavigationGroup: () => latest.setSelectedNavigationGroup(null),
98
- }), [latest]);
99
- // HINT: Contentをanimationで非表示にしたい
100
- // アニメーションが終われば、CSSTransitionのchildrenはunmountされるため、
101
- // unmount時に操作内容のclearを行う
102
- useEffect(() => () => {
103
- functions.clearReleaseNote();
104
- functions.clearAppLauncher();
105
- functions.clearNavigationGroup();
106
- }, [functions]);
107
- return (jsxs(Section, { role: "dialog", "aria-modal": "true", className: CLASS_NAMES.wrapper, ref: domRef, 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 ? (
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 focusingRef = React.useRef(null);
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
- React.useEffect(() => {
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, focusingRef, handleClick, className, childrenStyle }) => {
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 ? focusingRef : null, value: year, "aria-pressed": selected, onClick: handleClick, className: className, "data-this-year": isThisYear, "aria-label": 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: childrenStyle, children: year }) }));
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 {\n type ComponentProps,\n type FC,\n type MouseEvent,\n type RefObject,\n memo,\n useEffect,\n useMemo,\n useRef,\n} 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\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 focusingRef = useRef<HTMLButtonElement>(null)\n\n const thisYear = useMemo(() => 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 useEffect(() => {\n if (focusingRef.current) {\n // HINT: 現在の年に一度focusを当てることでtab移動をしやすくする\n // focusを当てたままでは違和感があるため、blurで解除している\n focusingRef.current.focus()\n focusingRef.current.blur()\n }\n }, [])\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 focusingRef={focusingRef}\n className={CLASS_NAMES.yearButton}\n childrenStyle={CLASS_NAMES.yearWrapper}\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 focusingRef: RefObject<HTMLButtonElement>\n className: string\n childrenStyle: string\n handleClick: (e: MouseEvent<HTMLButtonElement>) => void\n}>(({ year, thisYear, selected, focusingRef, handleClick, className, childrenStyle }) => {\n const { localize } = useIntl()\n const isThisYear = thisYear === year\n\n return (\n <UnstyledButton\n ref={isThisYear ? focusingRef : null}\n value={year}\n aria-pressed={selected}\n onClick={handleClick}\n className={className}\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={childrenStyle}>{year}</span>\n </UnstyledButton>\n )\n})\n"],"names":["tv","_jsx","useRef","useMemo","useEffect","Scroller","memo","useIntl","UnstyledButton"],"mappings":"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"}
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, useRef, useMemo, useEffect } from 'react';
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 focusingRef = useRef(null);
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
- useEffect(() => {
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, focusingRef, handleClick, className, childrenStyle }) => {
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 ? focusingRef : null, value: year, "aria-pressed": selected, onClick: handleClick, className: className, "data-this-year": isThisYear, "aria-label": 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: childrenStyle, children: year }) }));
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 {\n type ComponentProps,\n type FC,\n type MouseEvent,\n type RefObject,\n memo,\n useEffect,\n useMemo,\n useRef,\n} 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\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 focusingRef = useRef<HTMLButtonElement>(null)\n\n const thisYear = useMemo(() => 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 useEffect(() => {\n if (focusingRef.current) {\n // HINT: 現在の年に一度focusを当てることでtab移動をしやすくする\n // focusを当てたままでは違和感があるため、blurで解除している\n focusingRef.current.focus()\n focusingRef.current.blur()\n }\n }, [])\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 focusingRef={focusingRef}\n className={CLASS_NAMES.yearButton}\n childrenStyle={CLASS_NAMES.yearWrapper}\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 focusingRef: RefObject<HTMLButtonElement>\n className: string\n childrenStyle: string\n handleClick: (e: MouseEvent<HTMLButtonElement>) => void\n}>(({ year, thisYear, selected, focusingRef, handleClick, className, childrenStyle }) => {\n const { localize } = useIntl()\n const isThisYear = thisYear === year\n\n return (\n <UnstyledButton\n ref={isThisYear ? focusingRef : null}\n value={year}\n aria-pressed={selected}\n onClick={handleClick}\n className={className}\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={childrenStyle}>{year}</span>\n </UnstyledButton>\n )\n})\n"],"names":["tv","_jsx"],"mappings":"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"}
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
- React.useImperativeHandle(ref, () => inputRef.current, []);
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: inputRef, 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
+ 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 useImperativeHandle,\n useMemo,\n useRef,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\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 useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n [],\n )\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={inputRef}\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;AAEA;;AAOE;AACE;;AAEJ;;AA2BF;AAGF;AAIA;;AAKE;AAKF;;"}
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, useImperativeHandle, useEffect, memo } from 'react';
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
- useImperativeHandle(ref, () => inputRef.current, []);
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: inputRef, 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
+ 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 useImperativeHandle,\n useMemo,\n useRef,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\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 useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n [],\n )\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={inputRef}\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;AAEA;;AAOE;AACE;;AAEJ;;AA2BF;AAGF;AAIA;;AAKE;AAKF;;"}
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;;"}