smarthr-ui 99.3.0 → 99.3.2

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 (218) hide show
  1. package/lib/_virtual/index.cjs +2 -2
  2. package/lib/_virtual/index.js +2 -2
  3. package/lib/_virtual/index2.cjs +2 -2
  4. package/lib/_virtual/index2.js +2 -2
  5. package/lib/components/Checkbox/Checkbox.cjs +1 -1
  6. package/lib/components/Checkbox/Checkbox.cjs.map +1 -1
  7. package/lib/components/Checkbox/Checkbox.js +1 -1
  8. package/lib/components/Checkbox/Checkbox.js.map +1 -1
  9. package/lib/components/Combobox/ItemButton.cjs +11 -2
  10. package/lib/components/Combobox/ItemButton.cjs.map +1 -1
  11. package/lib/components/Combobox/ItemButton.js +11 -2
  12. package/lib/components/Combobox/ItemButton.js.map +1 -1
  13. package/lib/components/Combobox/MultiCombobox/MultiCombobox.cjs +2 -2
  14. package/lib/components/Combobox/MultiCombobox/MultiCombobox.cjs.map +1 -1
  15. package/lib/components/Combobox/MultiCombobox/MultiCombobox.js +2 -2
  16. package/lib/components/Combobox/MultiCombobox/MultiCombobox.js.map +1 -1
  17. package/lib/components/Combobox/SingleCombobox/SingleCombobox.cjs +2 -2
  18. package/lib/components/Combobox/SingleCombobox/SingleCombobox.cjs.map +1 -1
  19. package/lib/components/Combobox/SingleCombobox/SingleCombobox.js +2 -2
  20. package/lib/components/Combobox/SingleCombobox/SingleCombobox.js.map +1 -1
  21. package/lib/components/DatePicker/DatePicker.cjs +2 -2
  22. package/lib/components/DatePicker/DatePicker.cjs.map +1 -1
  23. package/lib/components/DatePicker/DatePicker.js +2 -2
  24. package/lib/components/DatePicker/DatePicker.js.map +1 -1
  25. package/lib/components/DatePicker/Portal.cjs +1 -1
  26. package/lib/components/DatePicker/Portal.cjs.map +1 -1
  27. package/lib/components/DatePicker/Portal.js +1 -1
  28. package/lib/components/DatePicker/Portal.js.map +1 -1
  29. package/lib/components/Dialog/FocusTrap.cjs +8 -8
  30. package/lib/components/Dialog/FocusTrap.cjs.map +1 -1
  31. package/lib/components/Dialog/FocusTrap.js +9 -9
  32. package/lib/components/Dialog/FocusTrap.js.map +1 -1
  33. package/lib/components/Dialog/ModelessDialog/ModelessDialog.cjs +2 -1
  34. package/lib/components/Dialog/ModelessDialog/ModelessDialog.cjs.map +1 -1
  35. package/lib/components/Dialog/ModelessDialog/ModelessDialog.js +2 -1
  36. package/lib/components/Dialog/ModelessDialog/ModelessDialog.js.map +1 -1
  37. package/lib/components/DropZone/DropZone.cjs +1 -1
  38. package/lib/components/DropZone/DropZone.cjs.map +1 -1
  39. package/lib/components/DropZone/DropZone.js +1 -1
  40. package/lib/components/DropZone/DropZone.js.map +1 -1
  41. package/lib/components/Heading/PageHeading/PageHeading.cjs +1 -1
  42. package/lib/components/Heading/PageHeading/PageHeading.cjs.map +1 -1
  43. package/lib/components/Heading/PageHeading/PageHeading.js +1 -1
  44. package/lib/components/Heading/PageHeading/PageHeading.js.map +1 -1
  45. package/lib/components/Input/CurrencyInput/CurrencyInput.cjs +3 -3
  46. package/lib/components/Input/CurrencyInput/CurrencyInput.cjs.map +1 -1
  47. package/lib/components/Input/CurrencyInput/CurrencyInput.js +3 -3
  48. package/lib/components/Input/CurrencyInput/CurrencyInput.js.map +1 -1
  49. package/lib/components/Input/Input.cjs +15 -17
  50. package/lib/components/Input/Input.cjs.map +1 -1
  51. package/lib/components/Input/Input.js +15 -17
  52. package/lib/components/Input/Input.js.map +1 -1
  53. package/lib/components/InputFile/InputFileMultiplyAppendable.cjs +8 -7
  54. package/lib/components/InputFile/InputFileMultiplyAppendable.cjs.map +1 -1
  55. package/lib/components/InputFile/InputFileMultiplyAppendable.js +8 -7
  56. package/lib/components/InputFile/InputFileMultiplyAppendable.js.map +1 -1
  57. package/lib/components/InputFile/InputFileNative.cjs +6 -5
  58. package/lib/components/InputFile/InputFileNative.cjs.map +1 -1
  59. package/lib/components/InputFile/InputFileNative.js +6 -5
  60. package/lib/components/InputFile/InputFileNative.js.map +1 -1
  61. package/lib/components/Layout/Container/Container.cjs.map +1 -1
  62. package/lib/components/Layout/Container/Container.js.map +1 -1
  63. package/lib/components/Pagination/Pagination.cjs +3 -2
  64. package/lib/components/Pagination/Pagination.cjs.map +1 -1
  65. package/lib/components/Pagination/Pagination.js +2 -1
  66. package/lib/components/Pagination/Pagination.js.map +1 -1
  67. package/lib/components/Panel/Groupbox/Groupbox.cjs +1 -0
  68. package/lib/components/Panel/Groupbox/Groupbox.cjs.map +1 -1
  69. package/lib/components/Panel/Groupbox/Groupbox.js +1 -0
  70. package/lib/components/Panel/Groupbox/Groupbox.js.map +1 -1
  71. package/lib/components/Scroller/Scroller.cjs +3 -1
  72. package/lib/components/Scroller/Scroller.cjs.map +1 -1
  73. package/lib/components/Scroller/Scroller.js +3 -1
  74. package/lib/components/Scroller/Scroller.js.map +1 -1
  75. package/lib/components/Select/Select.cjs +12 -14
  76. package/lib/components/Select/Select.cjs.map +1 -1
  77. package/lib/components/Select/Select.js +12 -14
  78. package/lib/components/Select/Select.js.map +1 -1
  79. package/lib/components/Table/TableReel.cjs +67 -3
  80. package/lib/components/Table/TableReel.cjs.map +1 -1
  81. package/lib/components/Table/TableReel.js +68 -4
  82. package/lib/components/Table/TableReel.js.map +1 -1
  83. package/lib/components/Table/TableScroller.cjs +13 -15
  84. package/lib/components/Table/TableScroller.cjs.map +1 -1
  85. package/lib/components/Table/TableScroller.js +14 -16
  86. package/lib/components/Table/TableScroller.js.map +1 -1
  87. package/lib/components/Textarea/Textarea.cjs +18 -12
  88. package/lib/components/Textarea/Textarea.cjs.map +1 -1
  89. package/lib/components/Textarea/Textarea.js +19 -13
  90. package/lib/components/Textarea/Textarea.js.map +1 -1
  91. package/lib/components/Tooltip/TooltipPortal.cjs +1 -0
  92. package/lib/components/Tooltip/TooltipPortal.cjs.map +1 -1
  93. package/lib/components/Tooltip/TooltipPortal.js +1 -0
  94. package/lib/components/Tooltip/TooltipPortal.js.map +1 -1
  95. package/lib/hooks/useClick.cjs +7 -4
  96. package/lib/hooks/useClick.cjs.map +1 -1
  97. package/lib/hooks/useClick.js +7 -4
  98. package/lib/hooks/useClick.js.map +1 -1
  99. package/lib/hooks/useOuterClick.cjs +5 -6
  100. package/lib/hooks/useOuterClick.cjs.map +1 -1
  101. package/lib/hooks/useOuterClick.js +6 -7
  102. package/lib/hooks/useOuterClick.js.map +1 -1
  103. package/lib/hooks/usePortal.cjs +24 -17
  104. package/lib/hooks/usePortal.cjs.map +1 -1
  105. package/lib/hooks/usePortal.d.ts +1 -1
  106. package/lib/hooks/usePortal.js +25 -18
  107. package/lib/hooks/usePortal.js.map +1 -1
  108. package/lib/hooks/useResponseStatus.cjs +20 -23
  109. package/lib/hooks/useResponseStatus.cjs.map +1 -1
  110. package/lib/hooks/useResponseStatus.js +20 -23
  111. package/lib/hooks/useResponseStatus.js.map +1 -1
  112. package/lib/intl/locales/en_us.json.cjs +1 -0
  113. package/lib/intl/locales/en_us.json.cjs.map +1 -1
  114. package/lib/intl/locales/en_us.json.js +1 -0
  115. package/lib/intl/locales/en_us.json.js.map +1 -1
  116. package/lib/intl/locales/id_id.json.cjs +0 -8
  117. package/lib/intl/locales/id_id.json.cjs.map +1 -1
  118. package/lib/intl/locales/id_id.json.js +0 -8
  119. package/lib/intl/locales/id_id.json.js.map +1 -1
  120. package/lib/intl/locales/index.d.ts +6 -16
  121. package/lib/intl/locales/ja_easy.json.cjs +1 -0
  122. package/lib/intl/locales/ja_easy.json.cjs.map +1 -1
  123. package/lib/intl/locales/ja_easy.json.js +1 -0
  124. package/lib/intl/locales/ja_easy.json.js.map +1 -1
  125. package/lib/intl/locales/ko_kr.json.cjs +1 -0
  126. package/lib/intl/locales/ko_kr.json.cjs.map +1 -1
  127. package/lib/intl/locales/ko_kr.json.js +1 -0
  128. package/lib/intl/locales/ko_kr.json.js.map +1 -1
  129. package/lib/intl/locales/pt_br.json.cjs +0 -8
  130. package/lib/intl/locales/pt_br.json.cjs.map +1 -1
  131. package/lib/intl/locales/pt_br.json.js +0 -8
  132. package/lib/intl/locales/pt_br.json.js.map +1 -1
  133. package/lib/intl/locales/vi_vn.json.cjs +1 -0
  134. package/lib/intl/locales/vi_vn.json.cjs.map +1 -1
  135. package/lib/intl/locales/vi_vn.json.js +1 -0
  136. package/lib/intl/locales/vi_vn.json.js.map +1 -1
  137. package/lib/intl/locales/zh_hans_cn.json.cjs +1 -0
  138. package/lib/intl/locales/zh_hans_cn.json.cjs.map +1 -1
  139. package/lib/intl/locales/zh_hans_cn.json.js +1 -0
  140. package/lib/intl/locales/zh_hans_cn.json.js.map +1 -1
  141. package/lib/intl/locales/zh_hant_tw.json.cjs +1 -0
  142. package/lib/intl/locales/zh_hant_tw.json.cjs.map +1 -1
  143. package/lib/intl/locales/zh_hant_tw.json.js +1 -0
  144. package/lib/intl/locales/zh_hant_tw.json.js.map +1 -1
  145. package/lib/intl/useDateFormat.cjs +1 -2
  146. package/lib/intl/useDateFormat.cjs.map +1 -1
  147. package/lib/intl/useDateFormat.js +1 -2
  148. package/lib/intl/useDateFormat.js.map +1 -1
  149. package/lib/intl/useIntl.cjs +2 -4
  150. package/lib/intl/useIntl.cjs.map +1 -1
  151. package/lib/intl/useIntl.js +2 -4
  152. package/lib/intl/useIntl.js.map +1 -1
  153. package/lib/libs/debounce.cjs +10 -2
  154. package/lib/libs/debounce.cjs.map +1 -1
  155. package/lib/libs/debounce.d.ts +4 -2
  156. package/lib/libs/debounce.js +10 -2
  157. package/lib/libs/debounce.js.map +1 -1
  158. package/lib/libs/lodash.cjs +3 -4
  159. package/lib/libs/lodash.cjs.map +1 -1
  160. package/lib/libs/lodash.d.ts +2 -11
  161. package/lib/libs/lodash.js +2 -7
  162. package/lib/libs/lodash.js.map +1 -1
  163. package/lib/libs/map.cjs +1 -5
  164. package/lib/libs/map.cjs.map +1 -1
  165. package/lib/libs/map.js +1 -5
  166. package/lib/libs/map.js.map +1 -1
  167. package/lib/themes/createBackgroundColor.cjs +3 -2
  168. package/lib/themes/createBackgroundColor.cjs.map +1 -1
  169. package/lib/themes/createBackgroundColor.js +2 -1
  170. package/lib/themes/createBackgroundColor.js.map +1 -1
  171. package/lib/themes/createBorder.cjs +3 -2
  172. package/lib/themes/createBorder.cjs.map +1 -1
  173. package/lib/themes/createBorder.js +2 -1
  174. package/lib/themes/createBorder.js.map +1 -1
  175. package/lib/themes/createBreakpoint.cjs +3 -2
  176. package/lib/themes/createBreakpoint.cjs.map +1 -1
  177. package/lib/themes/createBreakpoint.js +2 -1
  178. package/lib/themes/createBreakpoint.js.map +1 -1
  179. package/lib/themes/createColor.cjs +3 -2
  180. package/lib/themes/createColor.cjs.map +1 -1
  181. package/lib/themes/createColor.js +2 -1
  182. package/lib/themes/createColor.js.map +1 -1
  183. package/lib/themes/createFontSize.cjs +3 -2
  184. package/lib/themes/createFontSize.cjs.map +1 -1
  185. package/lib/themes/createFontSize.js +2 -1
  186. package/lib/themes/createFontSize.js.map +1 -1
  187. package/lib/themes/createInteraction.cjs +3 -2
  188. package/lib/themes/createInteraction.cjs.map +1 -1
  189. package/lib/themes/createInteraction.js +2 -1
  190. package/lib/themes/createInteraction.js.map +1 -1
  191. package/lib/themes/createLeading.cjs +3 -2
  192. package/lib/themes/createLeading.cjs.map +1 -1
  193. package/lib/themes/createLeading.js +2 -1
  194. package/lib/themes/createLeading.js.map +1 -1
  195. package/lib/themes/createRadius.cjs +3 -2
  196. package/lib/themes/createRadius.cjs.map +1 -1
  197. package/lib/themes/createRadius.js +2 -1
  198. package/lib/themes/createRadius.js.map +1 -1
  199. package/lib/themes/createShadow/createShadow.cjs +3 -2
  200. package/lib/themes/createShadow/createShadow.cjs.map +1 -1
  201. package/lib/themes/createShadow/createShadow.js +2 -1
  202. package/lib/themes/createShadow/createShadow.js.map +1 -1
  203. package/lib/themes/createTextColor.cjs +3 -2
  204. package/lib/themes/createTextColor.cjs.map +1 -1
  205. package/lib/themes/createTextColor.js +2 -1
  206. package/lib/themes/createTextColor.js.map +1 -1
  207. package/lib/themes/createZIndex.cjs +3 -2
  208. package/lib/themes/createZIndex.cjs.map +1 -1
  209. package/lib/themes/createZIndex.js +2 -1
  210. package/lib/themes/createZIndex.js.map +1 -1
  211. package/metadata.json +1 -1
  212. package/package.json +1 -1
  213. package/smarthr-ui.css +27 -7
  214. package/lib/components/Table/useReelCells.cjs +0 -83
  215. package/lib/components/Table/useReelCells.cjs.map +0 -1
  216. package/lib/components/Table/useReelCells.d.ts +0 -3
  217. package/lib/components/Table/useReelCells.js +0 -81
  218. package/lib/components/Table/useReelCells.js.map +0 -1
@@ -34,12 +34,13 @@ const InputFileMultiplyAppendable = React.forwardRef(({ className, size, label,
34
34
  }, [size, className]);
35
35
  // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ
36
36
  const isUpdatingFilesRef = React.useRef(false);
37
- const inputRef = React.useRef(null);
38
- React.useImperativeHandle(ref, () => inputRef.current);
37
+ const innerRef = React.useRef(null);
38
+ // TODO: useMergeRefsが実装されたら修正
39
+ React.useImperativeHandle(ref, () => innerRef.current, []);
39
40
  const latest = hooks_useLatest.useLatest({ onChange, files, previewFile });
40
41
  const functions = React.useMemo(() => {
41
42
  const updateFiles = (newFiles) => {
42
- if (!inputRef.current) {
43
+ if (!innerRef.current) {
43
44
  return;
44
45
  }
45
46
  latest.onChange?.(newFiles);
@@ -48,7 +49,7 @@ const InputFileMultiplyAppendable = React.forwardRef(({ className, size, label,
48
49
  buff.items.add(file);
49
50
  });
50
51
  isUpdatingFilesRef.current = true;
51
- inputRef.current.files = buff.files;
52
+ innerRef.current.files = buff.files;
52
53
  isUpdatingFilesRef.current = false;
53
54
  setFiles(newFiles);
54
55
  };
@@ -62,13 +63,13 @@ const InputFileMultiplyAppendable = React.forwardRef(({ className, size, label,
62
63
  updateFiles([...latest.files, ...newFiles]);
63
64
  },
64
65
  handleDelete: (e) => {
65
- if (!inputRef.current) {
66
+ if (!innerRef.current) {
66
67
  return;
67
68
  }
68
69
  const index = parseInt(e.currentTarget.value, 10);
69
70
  const newFiles = latest.files.filter((_, i) => index !== i);
70
71
  // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット
71
- inputRef.current.value = '';
72
+ innerRef.current.value = '';
72
73
  updateFiles(newFiles);
73
74
  },
74
75
  handleClosePreview: () => {
@@ -87,7 +88,7 @@ const InputFileMultiplyAppendable = React.forwardRef(({ className, size, label,
87
88
  },
88
89
  };
89
90
  }, [latest]);
90
- return (jsxRuntime.jsxs(components_Layout_Stack_Stack.Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsxRuntime.jsx(components_Panel_Groupbox_Groupbox.Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsxRuntime.jsx(components_InputFile_parts.FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxRuntime.jsxs("span", { className: classNames.inputWrapper, children: [jsxRuntime.jsx("input", { ...rest, multiple: true, "data-smarthr-ui-input": "true", type: "file", onChange: functions.handleChange, disabled: disabled, ref: inputRef, "aria-invalid": error || undefined, "aria-labelledby": labelId, className: classNames.input }), jsxRuntime.jsx(components_InputFile_parts.StyledFaFolderOpenIcon, { className: classNames.prefix }), jsxRuntime.jsx(components_InputFile_parts.LabelRender, { id: labelId, label: label })] }), previewable && (jsxRuntime.jsx(components_InputFile_FilePreviewDialog.FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
91
+ return (jsxRuntime.jsxs(components_Layout_Stack_Stack.Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsxRuntime.jsx(components_Panel_Groupbox_Groupbox.Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsxRuntime.jsx(components_InputFile_parts.FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxRuntime.jsxs("span", { className: classNames.inputWrapper, children: [jsxRuntime.jsx("input", { ...rest, ref: innerRef, type: "file", disabled: disabled, multiple: true, "aria-invalid": error || undefined, "aria-labelledby": labelId, "data-smarthr-ui-input": "true", onChange: functions.handleChange, className: classNames.input }), jsxRuntime.jsx(components_InputFile_parts.StyledFaFolderOpenIcon, { className: classNames.prefix }), jsxRuntime.jsx(components_InputFile_parts.LabelRender, { id: labelId, label: label })] }), previewable && (jsxRuntime.jsx(components_InputFile_FilePreviewDialog.FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
91
92
  });
92
93
 
93
94
  exports.InputFileMultiplyAppendable = InputFileMultiplyAppendable;
@@ -1 +1 @@
1
- {"version":3,"file":"InputFileMultiplyAppendable.cjs","sources":["../../../src/components/InputFile/InputFileMultiplyAppendable.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\nexport const InputFileMultiplyAppendable = forwardRef<\n HTMLInputElement,\n Omit<LowerProps, 'multiple'>\n>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n if (!inputRef.current) {\n return\n }\n\n latest.onChange?.(newFiles)\n\n const buff = new DataTransfer()\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n inputRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n // Safari において、input.files への直接代入時はonChangeを発火させない\n if (isUpdatingFilesRef.current) {\n return\n }\n\n const newFiles = Array.from(e.target.files ?? [])\n\n updateFiles([...latest.files, ...newFiles])\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!inputRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット\n inputRef.current.value = ''\n\n updateFiles(newFiles)\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n multiple\n data-smarthr-ui-input=\"true\"\n type=\"file\"\n onChange={functions.handleChange}\n disabled={disabled}\n ref={inputRef}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA;AAEO;;;AAUH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAMA;AAEA;AACE;AACE;;;AAIA;AAEA;AACA;AACE;AACF;AAEA;;AAEA;;AAGF;;AAGE;;AAEE;;;AAIA;;;AAIF;AACE;;;AAIA;AACA;;AAGA;;;;;;;AAQA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA6CF;;"}
1
+ {"version":3,"file":"InputFileMultiplyAppendable.cjs","sources":["../../../src/components/InputFile/InputFileMultiplyAppendable.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\nexport const InputFileMultiplyAppendable = forwardRef<\n HTMLInputElement,\n Omit<LowerProps, 'multiple'>\n>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const innerRef = useRef<HTMLInputElement>(null)\n\n // TODO: useMergeRefsが実装されたら修正\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => innerRef.current,\n [],\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n if (!innerRef.current) {\n return\n }\n\n latest.onChange?.(newFiles)\n\n const buff = new DataTransfer()\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n innerRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n // Safari において、input.files への直接代入時はonChangeを発火させない\n if (isUpdatingFilesRef.current) {\n return\n }\n\n const newFiles = Array.from(e.target.files ?? [])\n\n updateFiles([...latest.files, ...newFiles])\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!innerRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット\n innerRef.current.value = ''\n\n updateFiles(newFiles)\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n ref={innerRef}\n type=\"file\"\n disabled={disabled}\n multiple\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n data-smarthr-ui-input=\"true\"\n onChange={functions.handleChange}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA;AAEO;;;AAUH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAGA;AAMA;AAEA;AACE;AACE;;;AAIA;AAEA;AACA;AACE;AACF;AAEA;;AAEA;;AAGF;;AAGE;;AAEE;;;AAIA;;;AAIF;AACE;;;AAIA;AACA;;AAGA;;;;;;;AAQA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA6CF;;"}
@@ -32,12 +32,13 @@ const InputFileMultiplyAppendable = forwardRef(({ className, size, label, hasFil
32
32
  }, [size, className]);
33
33
  // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ
34
34
  const isUpdatingFilesRef = useRef(false);
35
- const inputRef = useRef(null);
36
- useImperativeHandle(ref, () => inputRef.current);
35
+ const innerRef = useRef(null);
36
+ // TODO: useMergeRefsが実装されたら修正
37
+ useImperativeHandle(ref, () => innerRef.current, []);
37
38
  const latest = useLatest({ onChange, files, previewFile });
38
39
  const functions = useMemo(() => {
39
40
  const updateFiles = (newFiles) => {
40
- if (!inputRef.current) {
41
+ if (!innerRef.current) {
41
42
  return;
42
43
  }
43
44
  latest.onChange?.(newFiles);
@@ -46,7 +47,7 @@ const InputFileMultiplyAppendable = forwardRef(({ className, size, label, hasFil
46
47
  buff.items.add(file);
47
48
  });
48
49
  isUpdatingFilesRef.current = true;
49
- inputRef.current.files = buff.files;
50
+ innerRef.current.files = buff.files;
50
51
  isUpdatingFilesRef.current = false;
51
52
  setFiles(newFiles);
52
53
  };
@@ -60,13 +61,13 @@ const InputFileMultiplyAppendable = forwardRef(({ className, size, label, hasFil
60
61
  updateFiles([...latest.files, ...newFiles]);
61
62
  },
62
63
  handleDelete: (e) => {
63
- if (!inputRef.current) {
64
+ if (!innerRef.current) {
64
65
  return;
65
66
  }
66
67
  const index = parseInt(e.currentTarget.value, 10);
67
68
  const newFiles = latest.files.filter((_, i) => index !== i);
68
69
  // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット
69
- inputRef.current.value = '';
70
+ innerRef.current.value = '';
70
71
  updateFiles(newFiles);
71
72
  },
72
73
  handleClosePreview: () => {
@@ -85,7 +86,7 @@ const InputFileMultiplyAppendable = forwardRef(({ className, size, label, hasFil
85
86
  },
86
87
  };
87
88
  }, [latest]);
88
- return (jsxs(Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsx(Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsx(FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxs("span", { className: classNames.inputWrapper, children: [jsx("input", { ...rest, multiple: true, "data-smarthr-ui-input": "true", type: "file", onChange: functions.handleChange, disabled: disabled, ref: inputRef, "aria-invalid": error || undefined, "aria-labelledby": labelId, className: classNames.input }), jsx(StyledFaFolderOpenIcon, { className: classNames.prefix }), jsx(LabelRender, { id: labelId, label: label })] }), previewable && (jsx(FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
89
+ return (jsxs(Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsx(Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsx(FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxs("span", { className: classNames.inputWrapper, children: [jsx("input", { ...rest, ref: innerRef, type: "file", disabled: disabled, multiple: true, "aria-invalid": error || undefined, "aria-labelledby": labelId, "data-smarthr-ui-input": "true", onChange: functions.handleChange, className: classNames.input }), jsx(StyledFaFolderOpenIcon, { className: classNames.prefix }), jsx(LabelRender, { id: labelId, label: label })] }), previewable && (jsx(FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
89
90
  });
90
91
 
91
92
  export { InputFileMultiplyAppendable };
@@ -1 +1 @@
1
- {"version":3,"file":"InputFileMultiplyAppendable.js","sources":["../../../src/components/InputFile/InputFileMultiplyAppendable.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\nexport const InputFileMultiplyAppendable = forwardRef<\n HTMLInputElement,\n Omit<LowerProps, 'multiple'>\n>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n if (!inputRef.current) {\n return\n }\n\n latest.onChange?.(newFiles)\n\n const buff = new DataTransfer()\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n inputRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n // Safari において、input.files への直接代入時はonChangeを発火させない\n if (isUpdatingFilesRef.current) {\n return\n }\n\n const newFiles = Array.from(e.target.files ?? [])\n\n updateFiles([...latest.files, ...newFiles])\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!inputRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット\n inputRef.current.value = ''\n\n updateFiles(newFiles)\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n multiple\n data-smarthr-ui-input=\"true\"\n type=\"file\"\n onChange={functions.handleChange}\n disabled={disabled}\n ref={inputRef}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuBA;AAEO;;;AAUH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAMA;AAEA;AACE;AACE;;;AAIA;AAEA;AACA;AACE;AACF;AAEA;;AAEA;;AAGF;;AAGE;;AAEE;;;AAIA;;;AAIF;AACE;;;AAIA;AACA;;AAGA;;;;;;;AAQA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA6CF;;"}
1
+ {"version":3,"file":"InputFileMultiplyAppendable.js","sources":["../../../src/components/InputFile/InputFileMultiplyAppendable.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\nexport const InputFileMultiplyAppendable = forwardRef<\n HTMLInputElement,\n Omit<LowerProps, 'multiple'>\n>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const innerRef = useRef<HTMLInputElement>(null)\n\n // TODO: useMergeRefsが実装されたら修正\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => innerRef.current,\n [],\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n if (!innerRef.current) {\n return\n }\n\n latest.onChange?.(newFiles)\n\n const buff = new DataTransfer()\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n innerRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n // Safari において、input.files への直接代入時はonChangeを発火させない\n if (isUpdatingFilesRef.current) {\n return\n }\n\n const newFiles = Array.from(e.target.files ?? [])\n\n updateFiles([...latest.files, ...newFiles])\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!innerRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n // 削除後、同一ファイルを再選択可能にするためinput.valueをリセット\n innerRef.current.value = ''\n\n updateFiles(newFiles)\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n ref={innerRef}\n type=\"file\"\n disabled={disabled}\n multiple\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n data-smarthr-ui-input=\"true\"\n onChange={functions.handleChange}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuBA;AAEO;;;AAUH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAGA;AAMA;AAEA;AACE;AACE;;;AAIA;AAEA;AACA;AACE;AACF;AAEA;;AAEA;;AAGF;;AAGE;;AAEE;;;AAIA;;;AAIF;AACE;;;AAIA;AACA;;AAGA;;;;;;;AAQA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA6CF;;"}
@@ -34,8 +34,9 @@ const InputFileNative = React.forwardRef(({ className, size, label, hasFileList
34
34
  }, [size, className]);
35
35
  // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ
36
36
  const isUpdatingFilesRef = React.useRef(false);
37
- const inputRef = React.useRef(null);
38
- React.useImperativeHandle(ref, () => inputRef.current);
37
+ const innerRef = React.useRef(null);
38
+ // TODO: useMergeRefsが実装されたら修正
39
+ React.useImperativeHandle(ref, () => innerRef.current, []);
39
40
  const latest = hooks_useLatest.useLatest({ onChange, files, previewFile });
40
41
  const functions = React.useMemo(() => {
41
42
  const updateFiles = (newFiles) => {
@@ -49,7 +50,7 @@ const InputFileNative = React.forwardRef(({ className, size, label, hasFileList
49
50
  }
50
51
  },
51
52
  handleDelete: (e) => {
52
- if (!inputRef.current) {
53
+ if (!innerRef.current) {
53
54
  return;
54
55
  }
55
56
  const index = parseInt(e.currentTarget.value, 10);
@@ -60,7 +61,7 @@ const InputFileNative = React.forwardRef(({ className, size, label, hasFileList
60
61
  buff.items.add(file);
61
62
  });
62
63
  isUpdatingFilesRef.current = true;
63
- inputRef.current.files = buff.files;
64
+ innerRef.current.files = buff.files;
64
65
  isUpdatingFilesRef.current = false;
65
66
  },
66
67
  handleClosePreview: () => {
@@ -79,7 +80,7 @@ const InputFileNative = React.forwardRef(({ className, size, label, hasFileList
79
80
  },
80
81
  };
81
82
  }, [latest]);
82
- return (jsxRuntime.jsxs(components_Layout_Stack_Stack.Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsxRuntime.jsx(components_Panel_Groupbox_Groupbox.Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsxRuntime.jsx(components_InputFile_parts.FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxRuntime.jsxs("span", { className: classNames.inputWrapper, children: [jsxRuntime.jsx("input", { ...rest, "data-smarthr-ui-input": "true", type: "file", onChange: functions.handleChange, disabled: disabled, ref: inputRef, "aria-invalid": error || undefined, "aria-labelledby": labelId, className: classNames.input }), jsxRuntime.jsx(components_InputFile_parts.StyledFaFolderOpenIcon, { className: classNames.prefix }), jsxRuntime.jsx(components_InputFile_parts.LabelRender, { id: labelId, label: label })] }), previewable && (jsxRuntime.jsx(components_InputFile_FilePreviewDialog.FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
83
+ return (jsxRuntime.jsxs(components_Layout_Stack_Stack.Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsxRuntime.jsx(components_Panel_Groupbox_Groupbox.Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsxRuntime.jsx(components_InputFile_parts.FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxRuntime.jsxs("span", { className: classNames.inputWrapper, children: [jsxRuntime.jsx("input", { ...rest, ref: innerRef, type: "file", disabled: disabled, "aria-invalid": error || undefined, "aria-labelledby": labelId, "data-smarthr-ui-input": "true", onChange: functions.handleChange, className: classNames.input }), jsxRuntime.jsx(components_InputFile_parts.StyledFaFolderOpenIcon, { className: classNames.prefix }), jsxRuntime.jsx(components_InputFile_parts.LabelRender, { id: labelId, label: label })] }), previewable && (jsxRuntime.jsx(components_InputFile_FilePreviewDialog.FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
83
84
  });
84
85
 
85
86
  exports.InputFileNative = InputFileNative;
@@ -1 +1 @@
1
- {"version":3,"file":"InputFileNative.cjs","sources":["../../../src/components/InputFile/InputFileNative.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\ntype Props = Omit<LowerProps, 'multiple'> & {\n multiple?: boolean\n}\n\nexport const InputFileNative = forwardRef<HTMLInputElement, Props>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n latest.onChange?.(newFiles)\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n if (!isUpdatingFilesRef.current) {\n updateFiles(Array.from(e.target.files ?? []))\n }\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!inputRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n updateFiles(newFiles)\n\n const buff = new DataTransfer()\n\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n inputRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n data-smarthr-ui-input=\"true\"\n type=\"file\"\n onChange={functions.handleChange}\n disabled={disabled}\n ref={inputRef}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA;AAMO;;;AAOH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAMA;AAEA;AACE;AACE;;AAEF;;AAGE;AACE;AACE;;;AAGJ;AACE;;;AAIA;AACA;;AAIA;AAEA;AACE;AACF;AAEA;;AAEA;;;;;;AAMA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA4CF;;"}
1
+ {"version":3,"file":"InputFileNative.cjs","sources":["../../../src/components/InputFile/InputFileNative.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\ntype Props = Omit<LowerProps, 'multiple'> & {\n multiple?: boolean\n}\n\nexport const InputFileNative = forwardRef<HTMLInputElement, Props>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const innerRef = useRef<HTMLInputElement>(null)\n\n // TODO: useMergeRefsが実装されたら修正\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => innerRef.current,\n [],\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n latest.onChange?.(newFiles)\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n if (!isUpdatingFilesRef.current) {\n updateFiles(Array.from(e.target.files ?? []))\n }\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!innerRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n updateFiles(newFiles)\n\n const buff = new DataTransfer()\n\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n innerRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n ref={innerRef}\n type=\"file\"\n disabled={disabled}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n data-smarthr-ui-input=\"true\"\n onChange={functions.handleChange}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA;AAMO;;;AAOH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAGA;AAMA;AAEA;AACE;AACE;;AAEF;;AAGE;AACE;AACE;;;AAGJ;AACE;;;AAIA;AACA;;AAIA;AAEA;AACE;AACF;AAEA;;AAEA;;;;;;AAMA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA4CF;;"}
@@ -32,8 +32,9 @@ const InputFileNative = forwardRef(({ className, size, label, hasFileList = true
32
32
  }, [size, className]);
33
33
  // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ
34
34
  const isUpdatingFilesRef = useRef(false);
35
- const inputRef = useRef(null);
36
- useImperativeHandle(ref, () => inputRef.current);
35
+ const innerRef = useRef(null);
36
+ // TODO: useMergeRefsが実装されたら修正
37
+ useImperativeHandle(ref, () => innerRef.current, []);
37
38
  const latest = useLatest({ onChange, files, previewFile });
38
39
  const functions = useMemo(() => {
39
40
  const updateFiles = (newFiles) => {
@@ -47,7 +48,7 @@ const InputFileNative = forwardRef(({ className, size, label, hasFileList = true
47
48
  }
48
49
  },
49
50
  handleDelete: (e) => {
50
- if (!inputRef.current) {
51
+ if (!innerRef.current) {
51
52
  return;
52
53
  }
53
54
  const index = parseInt(e.currentTarget.value, 10);
@@ -58,7 +59,7 @@ const InputFileNative = forwardRef(({ className, size, label, hasFileList = true
58
59
  buff.items.add(file);
59
60
  });
60
61
  isUpdatingFilesRef.current = true;
61
- inputRef.current.files = buff.files;
62
+ innerRef.current.files = buff.files;
62
63
  isUpdatingFilesRef.current = false;
63
64
  },
64
65
  handleClosePreview: () => {
@@ -77,7 +78,7 @@ const InputFileNative = forwardRef(({ className, size, label, hasFileList = true
77
78
  },
78
79
  };
79
80
  }, [latest]);
80
- return (jsxs(Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsx(Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsx(FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxs("span", { className: classNames.inputWrapper, children: [jsx("input", { ...rest, "data-smarthr-ui-input": "true", type: "file", onChange: functions.handleChange, disabled: disabled, ref: inputRef, "aria-invalid": error || undefined, "aria-labelledby": labelId, className: classNames.input }), jsx(StyledFaFolderOpenIcon, { className: classNames.prefix }), jsx(LabelRender, { id: labelId, label: label })] }), previewable && (jsx(FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
81
+ return (jsxs(Stack, { align: "flex-start", className: classNames.wrapper, children: [hasFileList && !disabled && files.length > 0 && (jsx(Groupbox, { as: "ul", padding: BASE_COLUMN_PADDING, className: classNames.fileList, children: files.map((file, index) => (jsx(FileListItem, { file: file, index: index, previewable: !!previewable, handleDeleteClick: functions.handleDelete, handlePreviewClick: setPreviewFile, className: classNames.fileItem }, index))) })), jsxs("span", { className: classNames.inputWrapper, children: [jsx("input", { ...rest, ref: innerRef, type: "file", disabled: disabled, "aria-invalid": error || undefined, "aria-labelledby": labelId, "data-smarthr-ui-input": "true", onChange: functions.handleChange, className: classNames.input }), jsx(StyledFaFolderOpenIcon, { className: classNames.prefix }), jsx(LabelRender, { id: labelId, label: label })] }), previewable && (jsx(FilePreviewDialog, { file: previewFile, handleClose: functions.handleClosePreview, handleDownload: functions.handleDownload, searchable: previewable?.searchable }))] }));
81
82
  });
82
83
 
83
84
  export { InputFileNative };
@@ -1 +1 @@
1
- {"version":3,"file":"InputFileNative.js","sources":["../../../src/components/InputFile/InputFileNative.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\ntype Props = Omit<LowerProps, 'multiple'> & {\n multiple?: boolean\n}\n\nexport const InputFileNative = forwardRef<HTMLInputElement, Props>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => inputRef.current,\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n latest.onChange?.(newFiles)\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n if (!isUpdatingFilesRef.current) {\n updateFiles(Array.from(e.target.files ?? []))\n }\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!inputRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n updateFiles(newFiles)\n\n const buff = new DataTransfer()\n\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n inputRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n data-smarthr-ui-input=\"true\"\n type=\"file\"\n onChange={functions.handleChange}\n disabled={disabled}\n ref={inputRef}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuBA;AAMO;;;AAOH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAMA;AAEA;AACE;AACE;;AAEF;;AAGE;AACE;AACE;;;AAGJ;AACE;;;AAIA;AACA;;AAIA;AAEA;AACE;AACF;AAEA;;AAEA;;;;;;AAMA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA4CF;;"}
1
+ {"version":3,"file":"InputFileNative.js","sources":["../../../src/components/InputFile/InputFileNative.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type MouseEvent,\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { Stack } from '../Layout'\nimport { Groupbox } from '../Panel'\n\nimport { FilePreviewDialog } from './FilePreviewDialog'\nimport { FileListItem, LabelRender, StyledFaFolderOpenIcon } from './parts'\nimport { classNameGenerator } from './style'\n\nimport type { LowerProps } from './types'\n\nconst BASE_COLUMN_PADDING = { block: 0.5, inline: 1 } as const\n\ntype Props = Omit<LowerProps, 'multiple'> & {\n multiple?: boolean\n}\n\nexport const InputFileNative = forwardRef<HTMLInputElement, Props>(\n (\n { className, size, label, hasFileList = true, previewable, onChange, disabled, error, ...rest },\n ref,\n ) => {\n const [files, setFiles] = useState<File[]>([])\n const [previewFile, setPreviewFile] = useState<File | null>(null)\n const labelId = useId()\n\n const classNames = useMemo(() => {\n const { wrapper, fileList, fileItem, inputWrapper, input, prefix } = classNameGenerator()\n\n return {\n wrapper: wrapper({ className }),\n inputWrapper: inputWrapper({ size }),\n fileList: fileList(),\n fileItem: fileItem(),\n input: input(),\n prefix: prefix(),\n }\n }, [size, className])\n\n // Safari において、input.files への直接代入時に onChange が発火することを防ぐためのフラグ\n const isUpdatingFilesRef = useRef(false)\n\n const innerRef = useRef<HTMLInputElement>(null)\n\n // TODO: useMergeRefsが実装されたら修正\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(\n ref,\n () => innerRef.current,\n [],\n )\n\n const latest = useLatest({ onChange, files, previewFile })\n\n const functions = useMemo(() => {\n const updateFiles = (newFiles: File[]) => {\n latest.onChange?.(newFiles)\n setFiles(newFiles)\n }\n\n return {\n handleChange: (e: ChangeEvent<HTMLInputElement>) => {\n if (!isUpdatingFilesRef.current) {\n updateFiles(Array.from(e.target.files ?? []))\n }\n },\n handleDelete: (e: MouseEvent<HTMLButtonElement>) => {\n if (!innerRef.current) {\n return\n }\n\n const index = parseInt(e.currentTarget.value, 10)\n const newFiles = latest.files.filter((_, i) => index !== i)\n\n updateFiles(newFiles)\n\n const buff = new DataTransfer()\n\n newFiles.forEach((file) => {\n buff.items.add(file)\n })\n\n isUpdatingFilesRef.current = true\n innerRef.current.files = buff.files\n isUpdatingFilesRef.current = false\n },\n handleClosePreview: () => {\n setPreviewFile(null)\n },\n handleDownload: () => {\n const file = latest.previewFile\n if (!file) return\n\n const url = URL.createObjectURL(file)\n const a = document.createElement('a')\n a.href = url\n a.download = file.name\n a.click()\n URL.revokeObjectURL(url)\n },\n }\n }, [latest])\n\n return (\n <Stack align=\"flex-start\" className={classNames.wrapper}>\n {hasFileList && !disabled && files.length > 0 && (\n <Groupbox as=\"ul\" padding={BASE_COLUMN_PADDING} className={classNames.fileList}>\n {files.map((file, index) => (\n <FileListItem\n key={index}\n file={file}\n index={index}\n previewable={!!previewable}\n handleDeleteClick={functions.handleDelete}\n handlePreviewClick={setPreviewFile}\n className={classNames.fileItem}\n />\n ))}\n </Groupbox>\n )}\n <span className={classNames.inputWrapper}>\n <input\n {...rest}\n ref={innerRef}\n type=\"file\"\n disabled={disabled}\n aria-invalid={error || undefined}\n aria-labelledby={labelId}\n data-smarthr-ui-input=\"true\"\n onChange={functions.handleChange}\n className={classNames.input}\n />\n <StyledFaFolderOpenIcon className={classNames.prefix} />\n <LabelRender id={labelId} label={label} />\n </span>\n {previewable && (\n <FilePreviewDialog\n file={previewFile}\n handleClose={functions.handleClosePreview}\n handleDownload={functions.handleDownload}\n searchable={previewable?.searchable}\n />\n )}\n </Stack>\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuBA;AAMO;;;AAOH;AAEA;AACE;;AAGE;AACA;;;;;;AAMJ;;AAGA;AAEA;;AAGA;AAMA;AAEA;AACE;AACE;;AAEF;;AAGE;AACE;AACE;;;AAGJ;AACE;;;AAIA;AACA;;AAIA;AAEA;AACE;AACF;AAEA;;AAEA;;;;;;AAMA;AACA;;;;AAIA;AACA;;AAEA;;;AAGN;;AA4CF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Container.cjs","sources":["../../../../src/components/Layout/Container/Container.tsx"],"sourcesContent":["'use client'\n\nimport { type ComponentProps, type FC, type PropsWithChildren, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useEnvironment } from '../../../hooks/useEnvironment'\nimport { paddingBlock, paddingInline } from '../../../tailwind'\n\nimport type { Gap } from '../../../types'\n\ntype BaseProps = PropsWithChildren<\n Omit<VariantProps<typeof classNameGenerator>, 'paddingBlock' | 'paddingInline'> & {\n padding?: Gap | SeparatePadding\n }\n>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\ntype SeparatePadding = {\n block?: Gap\n inline?: Gap\n /** 画面幅が狭い時のブロック方向パディング */\n narrowModeBlock?: Gap\n /** 画面幅が狭い時のインライン方向パディング */\n narrowModeInline?: Gap\n}\n\nconst classNameGenerator = tv({\n base: 'shr-mx-auto shr-w-full',\n variants: {\n size: {\n NARROW: 'shr-max-w-col6',\n DEFAULT: 'shr-max-w-col8',\n WIDE: 'shr-max-w-col9',\n FULL: '',\n },\n paddingBlock,\n paddingInline,\n },\n compoundVariants: [\n {\n paddingInline: [0.25, 'X3S'],\n className: 'shr-w-[calc(100%-theme(spacing[0.25])*2)]',\n },\n {\n paddingInline: [0.5, 'XXS'],\n className: 'shr-w-[calc(100%-theme(spacing[0.5])*2)]',\n },\n {\n paddingInline: 0.75,\n className: 'shr-w-[calc(100%-theme(spacing[0.75])*2)]',\n },\n {\n paddingInline: [1, 'XS'],\n className: 'shr-w-[calc(100%-theme(spacing[1])*2)]',\n },\n {\n paddingInline: 1.25,\n className: 'shr-w-[calc(100%-theme(spacing[1.25])*2)]',\n },\n {\n paddingInline: [1.5, 'S'],\n className: 'shr-w-[calc(100%-theme(spacing[1.5])*2)]',\n },\n {\n paddingInline: [2, 'M'],\n className: 'shr-w-[calc(100%-theme(spacing[2])*2)]',\n },\n {\n paddingInline: [2.5, 'L'],\n className: 'shr-w-[calc(100%-theme(spacing[2.5])*2)]',\n },\n {\n paddingInline: [3, 'XL'],\n className: 'shr-w-[calc(100%-theme(spacing[3])*2)]',\n },\n {\n paddingInline: [3.5, 'XXL'],\n className: 'shr-w-[calc(100%-theme(spacing[3.5])*2)]',\n },\n {\n paddingInline: [4, 'X3L'],\n className: 'shr-w-[calc(100%-theme(spacing[4])*2)]',\n },\n {\n paddingInline: 8,\n className: 'shr-w-[calc(100%-theme(spacing[8])*2)]',\n },\n ],\n})\n\nconst DEFAULT_PADDING = {\n block: 2,\n inline: 2,\n narrowModeBlock: 1.5,\n narrowModeInline: 1,\n} as const\n\nexport const Container: FC<Props> = ({\n size = 'DEFAULT',\n padding = DEFAULT_PADDING,\n className,\n ...rest\n}) => {\n const { mobile } = useEnvironment()\n const actualClassName = useMemo(() => {\n const actualPadding =\n padding instanceof Object\n ? padding\n : { block: padding, inline: padding, narrowModeBlock: padding, narrowModeInline: padding }\n return classNameGenerator({\n size,\n paddingBlock: mobile ? actualPadding.narrowModeBlock : actualPadding.block,\n paddingInline: mobile ? actualPadding.narrowModeInline : actualPadding.inline,\n className,\n })\n }, [size, className, padding, mobile])\n return <div {...rest} className={actualClassName} />\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA;AACE;AACA;AACE;AACE;AACA;AACA;AACA;AACD;;;AAGF;AACD;AACE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AAED;AACE;AACA;AACA;AACA;;;AASA;AACA;AACE;AAEI;AACA;AACJ;;AAEE;AACA;;AAED;;AAEH;AACF;;"}
1
+ {"version":3,"file":"Container.cjs","sources":["../../../../src/components/Layout/Container/Container.tsx"],"sourcesContent":["'use client'\n\nimport { type ComponentProps, type FC, type PropsWithChildren, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useEnvironment } from '../../../hooks/useEnvironment'\nimport { paddingBlock, paddingInline } from '../../../tailwind'\n\nimport type { Gap } from '../../../types'\n\ntype BaseProps = PropsWithChildren<\n Omit<VariantProps<typeof classNameGenerator>, 'paddingBlock' | 'paddingInline'> & {\n padding?: Gap | SeparatePadding\n }\n>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\ntype SeparatePadding = {\n block?: Gap\n inline?: Gap\n /** 画面幅が狭い時のブロック方向パディング */\n narrowModeBlock?: Gap\n /** 画面幅が狭い時のインライン方向パディング */\n narrowModeInline?: Gap\n}\n\nconst classNameGenerator = tv({\n base: 'shr-mx-auto shr-w-full',\n variants: {\n size: {\n NARROW: 'shr-max-w-col6',\n DEFAULT: 'shr-max-w-col8',\n WIDE: 'shr-max-w-col9',\n FULL: '',\n },\n paddingBlock,\n paddingInline,\n },\n compoundVariants: [\n {\n paddingInline: [0.25, 'X3S'],\n className: 'shr-w-[calc(100%-theme(spacing[0.25])*2)]',\n },\n {\n paddingInline: [0.5, 'XXS'],\n className: 'shr-w-[calc(100%-theme(spacing[0.5])*2)]',\n },\n {\n paddingInline: 0.75,\n className: 'shr-w-[calc(100%-theme(spacing[0.75])*2)]',\n },\n {\n paddingInline: [1, 'XS'],\n className: 'shr-w-[calc(100%-theme(spacing[1])*2)]',\n },\n {\n paddingInline: 1.25,\n className: 'shr-w-[calc(100%-theme(spacing[1.25])*2)]',\n },\n {\n paddingInline: [1.5, 'S'],\n className: 'shr-w-[calc(100%-theme(spacing[1.5])*2)]',\n },\n {\n paddingInline: [2, 'M'],\n className: 'shr-w-[calc(100%-theme(spacing[2])*2)]',\n },\n {\n paddingInline: [2.5, 'L'],\n className: 'shr-w-[calc(100%-theme(spacing[2.5])*2)]',\n },\n {\n paddingInline: [3, 'XL'],\n className: 'shr-w-[calc(100%-theme(spacing[3])*2)]',\n },\n {\n paddingInline: [3.5, 'XXL'],\n className: 'shr-w-[calc(100%-theme(spacing[3.5])*2)]',\n },\n {\n paddingInline: [4, 'X3L'],\n className: 'shr-w-[calc(100%-theme(spacing[4])*2)]',\n },\n {\n paddingInline: 8,\n className: 'shr-w-[calc(100%-theme(spacing[8])*2)]',\n },\n ],\n})\n\nconst DEFAULT_PADDING = {\n block: 2,\n inline: 2,\n narrowModeBlock: 1.5,\n narrowModeInline: 1,\n} as const\n\nexport const Container: FC<Props> = ({\n size = 'DEFAULT',\n padding = DEFAULT_PADDING,\n className,\n ...rest\n}) => {\n const { mobile } = useEnvironment()\n const actualClassName = useMemo(() => {\n const actualPadding =\n padding instanceof Object\n ? padding\n : { block: padding, inline: padding, narrowModeBlock: padding, narrowModeInline: padding }\n return classNameGenerator({\n size,\n paddingBlock: mobile ? actualPadding.narrowModeBlock : actualPadding.block,\n paddingInline: mobile ? actualPadding.narrowModeInline : actualPadding.inline,\n className,\n })\n }, [size, className, padding, mobile])\n\n return <div {...rest} className={actualClassName} />\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA;AACE;AACA;AACE;AACE;AACA;AACA;AACA;AACD;;;AAGF;AACD;AACE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AAED;AACE;AACA;AACA;AACA;;;AASA;AACA;AACE;AAEI;AACA;AACJ;;AAEE;AACA;;AAED;;AAGH;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Container.js","sources":["../../../../src/components/Layout/Container/Container.tsx"],"sourcesContent":["'use client'\n\nimport { type ComponentProps, type FC, type PropsWithChildren, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useEnvironment } from '../../../hooks/useEnvironment'\nimport { paddingBlock, paddingInline } from '../../../tailwind'\n\nimport type { Gap } from '../../../types'\n\ntype BaseProps = PropsWithChildren<\n Omit<VariantProps<typeof classNameGenerator>, 'paddingBlock' | 'paddingInline'> & {\n padding?: Gap | SeparatePadding\n }\n>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\ntype SeparatePadding = {\n block?: Gap\n inline?: Gap\n /** 画面幅が狭い時のブロック方向パディング */\n narrowModeBlock?: Gap\n /** 画面幅が狭い時のインライン方向パディング */\n narrowModeInline?: Gap\n}\n\nconst classNameGenerator = tv({\n base: 'shr-mx-auto shr-w-full',\n variants: {\n size: {\n NARROW: 'shr-max-w-col6',\n DEFAULT: 'shr-max-w-col8',\n WIDE: 'shr-max-w-col9',\n FULL: '',\n },\n paddingBlock,\n paddingInline,\n },\n compoundVariants: [\n {\n paddingInline: [0.25, 'X3S'],\n className: 'shr-w-[calc(100%-theme(spacing[0.25])*2)]',\n },\n {\n paddingInline: [0.5, 'XXS'],\n className: 'shr-w-[calc(100%-theme(spacing[0.5])*2)]',\n },\n {\n paddingInline: 0.75,\n className: 'shr-w-[calc(100%-theme(spacing[0.75])*2)]',\n },\n {\n paddingInline: [1, 'XS'],\n className: 'shr-w-[calc(100%-theme(spacing[1])*2)]',\n },\n {\n paddingInline: 1.25,\n className: 'shr-w-[calc(100%-theme(spacing[1.25])*2)]',\n },\n {\n paddingInline: [1.5, 'S'],\n className: 'shr-w-[calc(100%-theme(spacing[1.5])*2)]',\n },\n {\n paddingInline: [2, 'M'],\n className: 'shr-w-[calc(100%-theme(spacing[2])*2)]',\n },\n {\n paddingInline: [2.5, 'L'],\n className: 'shr-w-[calc(100%-theme(spacing[2.5])*2)]',\n },\n {\n paddingInline: [3, 'XL'],\n className: 'shr-w-[calc(100%-theme(spacing[3])*2)]',\n },\n {\n paddingInline: [3.5, 'XXL'],\n className: 'shr-w-[calc(100%-theme(spacing[3.5])*2)]',\n },\n {\n paddingInline: [4, 'X3L'],\n className: 'shr-w-[calc(100%-theme(spacing[4])*2)]',\n },\n {\n paddingInline: 8,\n className: 'shr-w-[calc(100%-theme(spacing[8])*2)]',\n },\n ],\n})\n\nconst DEFAULT_PADDING = {\n block: 2,\n inline: 2,\n narrowModeBlock: 1.5,\n narrowModeInline: 1,\n} as const\n\nexport const Container: FC<Props> = ({\n size = 'DEFAULT',\n padding = DEFAULT_PADDING,\n className,\n ...rest\n}) => {\n const { mobile } = useEnvironment()\n const actualClassName = useMemo(() => {\n const actualPadding =\n padding instanceof Object\n ? padding\n : { block: padding, inline: padding, narrowModeBlock: padding, narrowModeInline: padding }\n return classNameGenerator({\n size,\n paddingBlock: mobile ? actualPadding.narrowModeBlock : actualPadding.block,\n paddingInline: mobile ? actualPadding.narrowModeInline : actualPadding.inline,\n className,\n })\n }, [size, className, padding, mobile])\n return <div {...rest} className={actualClassName} />\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA0BA;AACE;AACA;AACE;AACE;AACA;AACA;AACA;AACD;;;AAGF;AACD;AACE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AAED;AACE;AACA;AACA;AACA;;;AASA;AACA;AACE;AAEI;AACA;AACJ;;AAEE;AACA;;AAED;;AAEH;AACF;;"}
1
+ {"version":3,"file":"Container.js","sources":["../../../../src/components/Layout/Container/Container.tsx"],"sourcesContent":["'use client'\n\nimport { type ComponentProps, type FC, type PropsWithChildren, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useEnvironment } from '../../../hooks/useEnvironment'\nimport { paddingBlock, paddingInline } from '../../../tailwind'\n\nimport type { Gap } from '../../../types'\n\ntype BaseProps = PropsWithChildren<\n Omit<VariantProps<typeof classNameGenerator>, 'paddingBlock' | 'paddingInline'> & {\n padding?: Gap | SeparatePadding\n }\n>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\ntype SeparatePadding = {\n block?: Gap\n inline?: Gap\n /** 画面幅が狭い時のブロック方向パディング */\n narrowModeBlock?: Gap\n /** 画面幅が狭い時のインライン方向パディング */\n narrowModeInline?: Gap\n}\n\nconst classNameGenerator = tv({\n base: 'shr-mx-auto shr-w-full',\n variants: {\n size: {\n NARROW: 'shr-max-w-col6',\n DEFAULT: 'shr-max-w-col8',\n WIDE: 'shr-max-w-col9',\n FULL: '',\n },\n paddingBlock,\n paddingInline,\n },\n compoundVariants: [\n {\n paddingInline: [0.25, 'X3S'],\n className: 'shr-w-[calc(100%-theme(spacing[0.25])*2)]',\n },\n {\n paddingInline: [0.5, 'XXS'],\n className: 'shr-w-[calc(100%-theme(spacing[0.5])*2)]',\n },\n {\n paddingInline: 0.75,\n className: 'shr-w-[calc(100%-theme(spacing[0.75])*2)]',\n },\n {\n paddingInline: [1, 'XS'],\n className: 'shr-w-[calc(100%-theme(spacing[1])*2)]',\n },\n {\n paddingInline: 1.25,\n className: 'shr-w-[calc(100%-theme(spacing[1.25])*2)]',\n },\n {\n paddingInline: [1.5, 'S'],\n className: 'shr-w-[calc(100%-theme(spacing[1.5])*2)]',\n },\n {\n paddingInline: [2, 'M'],\n className: 'shr-w-[calc(100%-theme(spacing[2])*2)]',\n },\n {\n paddingInline: [2.5, 'L'],\n className: 'shr-w-[calc(100%-theme(spacing[2.5])*2)]',\n },\n {\n paddingInline: [3, 'XL'],\n className: 'shr-w-[calc(100%-theme(spacing[3])*2)]',\n },\n {\n paddingInline: [3.5, 'XXL'],\n className: 'shr-w-[calc(100%-theme(spacing[3.5])*2)]',\n },\n {\n paddingInline: [4, 'X3L'],\n className: 'shr-w-[calc(100%-theme(spacing[4])*2)]',\n },\n {\n paddingInline: 8,\n className: 'shr-w-[calc(100%-theme(spacing[8])*2)]',\n },\n ],\n})\n\nconst DEFAULT_PADDING = {\n block: 2,\n inline: 2,\n narrowModeBlock: 1.5,\n narrowModeInline: 1,\n} as const\n\nexport const Container: FC<Props> = ({\n size = 'DEFAULT',\n padding = DEFAULT_PADDING,\n className,\n ...rest\n}) => {\n const { mobile } = useEnvironment()\n const actualClassName = useMemo(() => {\n const actualPadding =\n padding instanceof Object\n ? padding\n : { block: padding, inline: padding, narrowModeBlock: padding, narrowModeInline: padding }\n return classNameGenerator({\n size,\n paddingBlock: mobile ? actualPadding.narrowModeBlock : actualPadding.block,\n paddingInline: mobile ? actualPadding.narrowModeInline : actualPadding.inline,\n className,\n })\n }, [size, className, padding, mobile])\n\n return <div {...rest} className={actualClassName} />\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA0BA;AACE;AACA;AACE;AACE;AACA;AACA;AACA;AACD;;;AAGF;AACD;AACE;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AAED;AACE;AACA;AACA;AACA;;;AASA;AACA;AACE;AAEI;AACA;AACJ;;AAEE;AACA;;AAED;;AAGH;AACF;;"}
@@ -11,7 +11,8 @@ require('react-intl');
11
11
  require('../../intl/Localizer.cjs');
12
12
  require('../../_virtual/dayjs.min.cjs');
13
13
  require('../../intl/TimeFormatter.cjs');
14
- var libs_lodash = require('../../libs/lodash.cjs');
14
+ require('../../_virtual/index.cjs');
15
+ var index$1 = require('../../_virtual/index2.cjs');
15
16
  require('../Layout/Stack/Stack.cjs');
16
17
  var components_Layout_Cluster_Cluster = require('../Layout/Cluster/Cluster.cjs');
17
18
  var components_Layout_Reel_Reel = require('../Layout/Reel/Reel.cjs');
@@ -107,7 +108,7 @@ const ItemButtons = React.memo(({ total, current, padding, withoutNumbers, hrefT
107
108
  return [];
108
109
  }
109
110
  const actualPadding = padding ?? 4;
110
- return libs_lodash.range(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1);
111
+ return index$1(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1);
111
112
  }, [current, total, padding, withoutNumbers]);
112
113
  const prevAttrs = {
113
114
  disabled: current === 1,
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.cjs","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ElementType,\n type FC,\n type HTMLAttributes,\n type MouseEvent,\n memo,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { useLocalize } from '../../intl'\nimport { range } from '../../libs/lodash'\nimport { Cluster, Reel } from '../Layout'\nimport { Nav } from '../SectioningContent'\n\nimport { PaginationControllerItemButton } from './PaginationControllerItemButton'\nimport { PaginationItemButton } from './PaginationItemButton'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Pagination shr-inline-block shr-max-w-full',\n list: 'shr-m-0.25 shr-list-none shr-ps-[unset]',\n firstListItem: 'smarthr-ui-Pagination-first',\n prevListItem: 'smarthr-ui-Pagination-prev',\n nextListItem: 'smarthr-ui-Pagination-next',\n lastListItem: 'smarthr-ui-Pagination-last',\n },\n variants: {\n withoutNumbers: {\n true: {\n firstListItem: 'shr-mr-0.5',\n prevListItem: 'shr-mr-0',\n nextListItem: 'shr-ml-0',\n lastListItem: 'shr-ml-0.5',\n },\n false: {\n prevListItem: 'shr-mr-0.5',\n nextListItem: 'shr-ml-0.5',\n },\n },\n },\n})\n\ntype CommonProps = {\n /** 全ページ数 */\n total: number\n /** 現在のページ */\n current: number\n /** 現在のページの前後に表示するページ番号のボタンの数 */\n padding?: number\n /** `true` のとき、ページ番号のボタンを表示しない */\n withoutNumbers?: boolean\n}\n\ntype ButtonProps = CommonProps & {\n /** ボタンを押下したときに発火するコールバック関数 */\n onClick: (pageNumber: number, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate?: undefined\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: undefined\n}\ntype AnchorProps = CommonProps & {\n /** リンクを押下したときに発火するコールバック関数 */\n onClick?: (href: string, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate: (pageNumber: number) => string\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: ElementType\n}\n\ntype BaseProps = ButtonProps | AnchorProps\ntype Props = BaseProps & Omit<HTMLAttributes<HTMLElement>, keyof BaseProps>\n\nconst BUTTON_REGEX = /^button$/i\nconst ANCHOR_REGEX = /^a/i\n\nconst getTargetDelegateElement = (e: MouseEvent<HTMLElement>, regex: RegExp) =>\n (e.nativeEvent.composedPath() as HTMLElement[]).find((elm) => regex.test(elm.tagName))\n\nexport const Pagination: FC<Props> = (props) =>\n props.total > 1 ? <ActualPagination {...props} /> : null\n\nconst ActualPagination: FC<Props> = ({\n total,\n current,\n onClick,\n padding,\n className,\n withoutNumbers,\n hrefTemplate,\n linkAs,\n ...rest\n}) => {\n const classNames = useMemo(() => {\n const { wrapper, list, firstListItem, prevListItem, nextListItem, lastListItem } =\n classNameGenerator()\n const itemArg = { withoutNumbers: withoutNumbers || false }\n\n return {\n wrapper: wrapper({ className }),\n list: list(),\n firstListItem: firstListItem(itemArg),\n prevListItem: prevListItem(itemArg),\n nextListItem: nextListItem(itemArg),\n lastListItem: lastListItem(itemArg),\n }\n }, [className, withoutNumbers])\n\n const latest = useLatest({ onClick, hrefTemplate })\n const hasHrefTemplate = !!hrefTemplate\n\n const functions = useMemo(\n () => ({\n actualHrefTemplate: hasHrefTemplate\n ? (pageNumber: number) => latest.hrefTemplate!(pageNumber)\n : undefined,\n handleDelegateClick: (e: MouseEvent<HTMLElement>) => {\n if (!latest.onClick) {\n return\n }\n\n if (latest.hrefTemplate) {\n const anchor = getTargetDelegateElement(e, ANCHOR_REGEX)\n\n if (!anchor) {\n return\n }\n\n const href = (anchor as HTMLAnchorElement).href\n\n if (href) {\n ;(latest.onClick as (href: string, e: MouseEvent<HTMLElement>) => void)(href, e)\n }\n } else {\n const button = getTargetDelegateElement(e, BUTTON_REGEX)\n\n if (button) {\n ;(latest.onClick as (pageNumber: number, e: MouseEvent<HTMLElement>) => void)(\n parseInt((button as HTMLButtonElement).value, 10),\n e,\n )\n }\n }\n },\n }),\n [hasHrefTemplate, latest],\n )\n\n const { navigationLabel } = useLocalize({\n navigationLabel: {\n id: 'smarthr-ui/Pagination/navigationLabel',\n defaultText: 'ページネーション',\n },\n })\n\n return (\n <Nav {...rest} className={classNames.wrapper} aria-label={navigationLabel}>\n <Reel onClick={functions.handleDelegateClick}>\n <ItemButtons\n total={total}\n current={current}\n padding={padding}\n withoutNumbers={withoutNumbers}\n hrefTemplate={functions.actualHrefTemplate}\n classNames={classNames}\n linkAs={linkAs}\n />\n </Reel>\n </Nav>\n )\n}\n\nconst ItemButtons = memo<\n Pick<Props, 'total' | 'current' | 'padding' | 'withoutNumbers' | 'hrefTemplate' | 'linkAs'> & {\n classNames: {\n list: string\n firstListItem: string\n prevListItem: string\n nextListItem: string\n lastListItem: string\n }\n }\n>(({ total, current, padding, withoutNumbers, hrefTemplate, classNames, linkAs }) => {\n const pageNumbers = useMemo(() => {\n if (withoutNumbers) {\n return []\n }\n\n const actualPadding = padding ?? 4\n\n return range(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1)\n }, [current, total, padding, withoutNumbers])\n\n const prevAttrs = {\n disabled: current === 1,\n direction: 'prev' as const,\n hrefTemplate,\n linkAs,\n }\n const nextAttrs = {\n disabled: current === total,\n direction: 'next' as const,\n hrefTemplate,\n linkAs,\n }\n\n return (\n <Cluster as=\"ul\" className={classNames.list}>\n <DoubleIconItemButton {...prevAttrs} targetPage={1} className={classNames.firstListItem} />\n <li className={classNames.prevListItem}>\n <PaginationControllerItemButton {...prevAttrs} targetPage={current - 1} />\n </li>\n {pageNumbers.map((page) => (\n <NumberItemButton\n key={page}\n page={page}\n disabled={page === current}\n hrefTemplate={hrefTemplate}\n linkAs={linkAs}\n />\n ))}\n <li className={classNames.nextListItem}>\n <PaginationControllerItemButton {...nextAttrs} targetPage={current + 1} />\n </li>\n <DoubleIconItemButton {...nextAttrs} targetPage={total} className={classNames.lastListItem} />\n </Cluster>\n )\n})\n\nconst NumberItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & { page: number; disabled: boolean }\n>(({ disabled, ...rest }) => (\n <li className={`smarthr-ui-Pagination-${disabled ? 'current' : 'page'}`}>\n <PaginationItemButton {...rest} disabled={disabled} />\n </li>\n))\n\nconst DoubleIconItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & {\n disabled: boolean\n direction: 'prev' | 'next'\n targetPage: number\n className: string\n }\n>(({ className, ...rest }) => (\n <li className={className}>\n <PaginationControllerItemButton {...rest} double />\n </li>\n))\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AACF;AAiCD;AACA;AAEA;AAGO;AAGP;AAWE;AACE;;;AAKE;;AAEA;AACA;AACA;AACA;;AAEJ;;AAGA;AAEA;AAEI;;AAEE;AACF;AACE;;;AAIA;;;;;AAOE;;AAGI;;;;;;AAMA;;;;AAOT;AAIH;AACE;AACE;AACA;AACD;AACF;;AAiBH;AAEA;AAWE;;AAEI;;AAGF;;;AAKF;;AAEE;;;;AAIF;;AAEE;;;;;AA0BJ;AAEA;AAQA;;"}
1
+ {"version":3,"file":"Pagination.cjs","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ElementType,\n type FC,\n type HTMLAttributes,\n type MouseEvent,\n memo,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { useLocalize } from '../../intl'\nimport { range } from '../../libs/lodash'\nimport { Cluster, Reel } from '../Layout'\nimport { Nav } from '../SectioningContent'\n\nimport { PaginationControllerItemButton } from './PaginationControllerItemButton'\nimport { PaginationItemButton } from './PaginationItemButton'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Pagination shr-inline-block shr-max-w-full',\n list: 'shr-m-0.25 shr-list-none shr-ps-[unset]',\n firstListItem: 'smarthr-ui-Pagination-first',\n prevListItem: 'smarthr-ui-Pagination-prev',\n nextListItem: 'smarthr-ui-Pagination-next',\n lastListItem: 'smarthr-ui-Pagination-last',\n },\n variants: {\n withoutNumbers: {\n true: {\n firstListItem: 'shr-mr-0.5',\n prevListItem: 'shr-mr-0',\n nextListItem: 'shr-ml-0',\n lastListItem: 'shr-ml-0.5',\n },\n false: {\n prevListItem: 'shr-mr-0.5',\n nextListItem: 'shr-ml-0.5',\n },\n },\n },\n})\n\ntype CommonProps = {\n /** 全ページ数 */\n total: number\n /** 現在のページ */\n current: number\n /** 現在のページの前後に表示するページ番号のボタンの数 */\n padding?: number\n /** `true` のとき、ページ番号のボタンを表示しない */\n withoutNumbers?: boolean\n}\n\ntype ButtonProps = CommonProps & {\n /** ボタンを押下したときに発火するコールバック関数 */\n onClick: (pageNumber: number, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate?: undefined\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: undefined\n}\ntype AnchorProps = CommonProps & {\n /** リンクを押下したときに発火するコールバック関数 */\n onClick?: (href: string, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate: (pageNumber: number) => string\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: ElementType\n}\n\ntype BaseProps = ButtonProps | AnchorProps\ntype Props = BaseProps & Omit<HTMLAttributes<HTMLElement>, keyof BaseProps>\n\nconst BUTTON_REGEX = /^button$/i\nconst ANCHOR_REGEX = /^a/i\n\nconst getTargetDelegateElement = (e: MouseEvent<HTMLElement>, regex: RegExp) =>\n (e.nativeEvent.composedPath() as HTMLElement[]).find((elm) => regex.test(elm.tagName))\n\nexport const Pagination: FC<Props> = (props) =>\n props.total > 1 ? <ActualPagination {...props} /> : null\n\nconst ActualPagination: FC<Props> = ({\n total,\n current,\n onClick,\n padding,\n className,\n withoutNumbers,\n hrefTemplate,\n linkAs,\n ...rest\n}) => {\n const classNames = useMemo(() => {\n const { wrapper, list, firstListItem, prevListItem, nextListItem, lastListItem } =\n classNameGenerator()\n const itemArg = { withoutNumbers: withoutNumbers || false }\n\n return {\n wrapper: wrapper({ className }),\n list: list(),\n firstListItem: firstListItem(itemArg),\n prevListItem: prevListItem(itemArg),\n nextListItem: nextListItem(itemArg),\n lastListItem: lastListItem(itemArg),\n }\n }, [className, withoutNumbers])\n\n const latest = useLatest({ onClick, hrefTemplate })\n const hasHrefTemplate = !!hrefTemplate\n\n const functions = useMemo(\n () => ({\n actualHrefTemplate: hasHrefTemplate\n ? (pageNumber: number) => latest.hrefTemplate!(pageNumber)\n : undefined,\n handleDelegateClick: (e: MouseEvent<HTMLElement>) => {\n if (!latest.onClick) {\n return\n }\n\n if (latest.hrefTemplate) {\n const anchor = getTargetDelegateElement(e, ANCHOR_REGEX)\n\n if (!anchor) {\n return\n }\n\n const href = (anchor as HTMLAnchorElement).href\n\n if (href) {\n ;(latest.onClick as (href: string, e: MouseEvent<HTMLElement>) => void)(href, e)\n }\n } else {\n const button = getTargetDelegateElement(e, BUTTON_REGEX)\n\n if (button) {\n ;(latest.onClick as (pageNumber: number, e: MouseEvent<HTMLElement>) => void)(\n parseInt((button as HTMLButtonElement).value, 10),\n e,\n )\n }\n }\n },\n }),\n [hasHrefTemplate, latest],\n )\n\n const { navigationLabel } = useLocalize({\n navigationLabel: {\n id: 'smarthr-ui/Pagination/navigationLabel',\n defaultText: 'ページネーション',\n },\n })\n\n return (\n <Nav {...rest} className={classNames.wrapper} aria-label={navigationLabel}>\n <Reel onClick={functions.handleDelegateClick}>\n <ItemButtons\n total={total}\n current={current}\n padding={padding}\n withoutNumbers={withoutNumbers}\n hrefTemplate={functions.actualHrefTemplate}\n classNames={classNames}\n linkAs={linkAs}\n />\n </Reel>\n </Nav>\n )\n}\n\nconst ItemButtons = memo<\n Pick<Props, 'total' | 'current' | 'padding' | 'withoutNumbers' | 'hrefTemplate' | 'linkAs'> & {\n classNames: {\n list: string\n firstListItem: string\n prevListItem: string\n nextListItem: string\n lastListItem: string\n }\n }\n>(({ total, current, padding, withoutNumbers, hrefTemplate, classNames, linkAs }) => {\n const pageNumbers = useMemo(() => {\n if (withoutNumbers) {\n return []\n }\n\n const actualPadding = padding ?? 4\n\n return range(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1)\n }, [current, total, padding, withoutNumbers])\n\n const prevAttrs = {\n disabled: current === 1,\n direction: 'prev' as const,\n hrefTemplate,\n linkAs,\n }\n const nextAttrs = {\n disabled: current === total,\n direction: 'next' as const,\n hrefTemplate,\n linkAs,\n }\n\n return (\n <Cluster as=\"ul\" className={classNames.list}>\n <DoubleIconItemButton {...prevAttrs} targetPage={1} className={classNames.firstListItem} />\n <li className={classNames.prevListItem}>\n <PaginationControllerItemButton {...prevAttrs} targetPage={current - 1} />\n </li>\n {pageNumbers.map((page) => (\n <NumberItemButton\n key={page}\n page={page}\n disabled={page === current}\n hrefTemplate={hrefTemplate}\n linkAs={linkAs}\n />\n ))}\n <li className={classNames.nextListItem}>\n <PaginationControllerItemButton {...nextAttrs} targetPage={current + 1} />\n </li>\n <DoubleIconItemButton {...nextAttrs} targetPage={total} className={classNames.lastListItem} />\n </Cluster>\n )\n})\n\nconst NumberItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & { page: number; disabled: boolean }\n>(({ disabled, ...rest }) => (\n <li className={`smarthr-ui-Pagination-${disabled ? 'current' : 'page'}`}>\n <PaginationItemButton {...rest} disabled={disabled} />\n </li>\n))\n\nconst DoubleIconItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & {\n disabled: boolean\n direction: 'prev' | 'next'\n targetPage: number\n className: string\n }\n>(({ className, ...rest }) => (\n <li className={className}>\n <PaginationControllerItemButton {...rest} double />\n </li>\n))\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AACF;AAiCD;AACA;AAEA;AAGO;AAGP;AAWE;AACE;;;AAKE;;AAEA;AACA;AACA;AACA;;AAEJ;;AAGA;AAEA;AAEI;;AAEE;AACF;AACE;;;AAIA;;;;;AAOE;;AAGI;;;;;;AAMA;;;;AAOT;AAIH;AACE;AACE;AACA;AACD;AACF;;AAiBH;AAEA;AAWE;;AAEI;;AAGF;;;AAKF;;AAEE;;;;AAIF;;AAEE;;;;;AA0BJ;AAEA;AAQA;;"}
@@ -9,7 +9,8 @@ import 'react-intl';
9
9
  import '../../intl/Localizer.js';
10
10
  import '../../_virtual/dayjs.min.js';
11
11
  import '../../intl/TimeFormatter.js';
12
- import { range } from '../../libs/lodash.js';
12
+ import '../../_virtual/index.js';
13
+ import range from '../../_virtual/index2.js';
13
14
  import '../Layout/Stack/Stack.js';
14
15
  import { Cluster } from '../Layout/Cluster/Cluster.js';
15
16
  import { Reel } from '../Layout/Reel/Reel.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ElementType,\n type FC,\n type HTMLAttributes,\n type MouseEvent,\n memo,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { useLocalize } from '../../intl'\nimport { range } from '../../libs/lodash'\nimport { Cluster, Reel } from '../Layout'\nimport { Nav } from '../SectioningContent'\n\nimport { PaginationControllerItemButton } from './PaginationControllerItemButton'\nimport { PaginationItemButton } from './PaginationItemButton'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Pagination shr-inline-block shr-max-w-full',\n list: 'shr-m-0.25 shr-list-none shr-ps-[unset]',\n firstListItem: 'smarthr-ui-Pagination-first',\n prevListItem: 'smarthr-ui-Pagination-prev',\n nextListItem: 'smarthr-ui-Pagination-next',\n lastListItem: 'smarthr-ui-Pagination-last',\n },\n variants: {\n withoutNumbers: {\n true: {\n firstListItem: 'shr-mr-0.5',\n prevListItem: 'shr-mr-0',\n nextListItem: 'shr-ml-0',\n lastListItem: 'shr-ml-0.5',\n },\n false: {\n prevListItem: 'shr-mr-0.5',\n nextListItem: 'shr-ml-0.5',\n },\n },\n },\n})\n\ntype CommonProps = {\n /** 全ページ数 */\n total: number\n /** 現在のページ */\n current: number\n /** 現在のページの前後に表示するページ番号のボタンの数 */\n padding?: number\n /** `true` のとき、ページ番号のボタンを表示しない */\n withoutNumbers?: boolean\n}\n\ntype ButtonProps = CommonProps & {\n /** ボタンを押下したときに発火するコールバック関数 */\n onClick: (pageNumber: number, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate?: undefined\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: undefined\n}\ntype AnchorProps = CommonProps & {\n /** リンクを押下したときに発火するコールバック関数 */\n onClick?: (href: string, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate: (pageNumber: number) => string\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: ElementType\n}\n\ntype BaseProps = ButtonProps | AnchorProps\ntype Props = BaseProps & Omit<HTMLAttributes<HTMLElement>, keyof BaseProps>\n\nconst BUTTON_REGEX = /^button$/i\nconst ANCHOR_REGEX = /^a/i\n\nconst getTargetDelegateElement = (e: MouseEvent<HTMLElement>, regex: RegExp) =>\n (e.nativeEvent.composedPath() as HTMLElement[]).find((elm) => regex.test(elm.tagName))\n\nexport const Pagination: FC<Props> = (props) =>\n props.total > 1 ? <ActualPagination {...props} /> : null\n\nconst ActualPagination: FC<Props> = ({\n total,\n current,\n onClick,\n padding,\n className,\n withoutNumbers,\n hrefTemplate,\n linkAs,\n ...rest\n}) => {\n const classNames = useMemo(() => {\n const { wrapper, list, firstListItem, prevListItem, nextListItem, lastListItem } =\n classNameGenerator()\n const itemArg = { withoutNumbers: withoutNumbers || false }\n\n return {\n wrapper: wrapper({ className }),\n list: list(),\n firstListItem: firstListItem(itemArg),\n prevListItem: prevListItem(itemArg),\n nextListItem: nextListItem(itemArg),\n lastListItem: lastListItem(itemArg),\n }\n }, [className, withoutNumbers])\n\n const latest = useLatest({ onClick, hrefTemplate })\n const hasHrefTemplate = !!hrefTemplate\n\n const functions = useMemo(\n () => ({\n actualHrefTemplate: hasHrefTemplate\n ? (pageNumber: number) => latest.hrefTemplate!(pageNumber)\n : undefined,\n handleDelegateClick: (e: MouseEvent<HTMLElement>) => {\n if (!latest.onClick) {\n return\n }\n\n if (latest.hrefTemplate) {\n const anchor = getTargetDelegateElement(e, ANCHOR_REGEX)\n\n if (!anchor) {\n return\n }\n\n const href = (anchor as HTMLAnchorElement).href\n\n if (href) {\n ;(latest.onClick as (href: string, e: MouseEvent<HTMLElement>) => void)(href, e)\n }\n } else {\n const button = getTargetDelegateElement(e, BUTTON_REGEX)\n\n if (button) {\n ;(latest.onClick as (pageNumber: number, e: MouseEvent<HTMLElement>) => void)(\n parseInt((button as HTMLButtonElement).value, 10),\n e,\n )\n }\n }\n },\n }),\n [hasHrefTemplate, latest],\n )\n\n const { navigationLabel } = useLocalize({\n navigationLabel: {\n id: 'smarthr-ui/Pagination/navigationLabel',\n defaultText: 'ページネーション',\n },\n })\n\n return (\n <Nav {...rest} className={classNames.wrapper} aria-label={navigationLabel}>\n <Reel onClick={functions.handleDelegateClick}>\n <ItemButtons\n total={total}\n current={current}\n padding={padding}\n withoutNumbers={withoutNumbers}\n hrefTemplate={functions.actualHrefTemplate}\n classNames={classNames}\n linkAs={linkAs}\n />\n </Reel>\n </Nav>\n )\n}\n\nconst ItemButtons = memo<\n Pick<Props, 'total' | 'current' | 'padding' | 'withoutNumbers' | 'hrefTemplate' | 'linkAs'> & {\n classNames: {\n list: string\n firstListItem: string\n prevListItem: string\n nextListItem: string\n lastListItem: string\n }\n }\n>(({ total, current, padding, withoutNumbers, hrefTemplate, classNames, linkAs }) => {\n const pageNumbers = useMemo(() => {\n if (withoutNumbers) {\n return []\n }\n\n const actualPadding = padding ?? 4\n\n return range(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1)\n }, [current, total, padding, withoutNumbers])\n\n const prevAttrs = {\n disabled: current === 1,\n direction: 'prev' as const,\n hrefTemplate,\n linkAs,\n }\n const nextAttrs = {\n disabled: current === total,\n direction: 'next' as const,\n hrefTemplate,\n linkAs,\n }\n\n return (\n <Cluster as=\"ul\" className={classNames.list}>\n <DoubleIconItemButton {...prevAttrs} targetPage={1} className={classNames.firstListItem} />\n <li className={classNames.prevListItem}>\n <PaginationControllerItemButton {...prevAttrs} targetPage={current - 1} />\n </li>\n {pageNumbers.map((page) => (\n <NumberItemButton\n key={page}\n page={page}\n disabled={page === current}\n hrefTemplate={hrefTemplate}\n linkAs={linkAs}\n />\n ))}\n <li className={classNames.nextListItem}>\n <PaginationControllerItemButton {...nextAttrs} targetPage={current + 1} />\n </li>\n <DoubleIconItemButton {...nextAttrs} targetPage={total} className={classNames.lastListItem} />\n </Cluster>\n )\n})\n\nconst NumberItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & { page: number; disabled: boolean }\n>(({ disabled, ...rest }) => (\n <li className={`smarthr-ui-Pagination-${disabled ? 'current' : 'page'}`}>\n <PaginationItemButton {...rest} disabled={disabled} />\n </li>\n))\n\nconst DoubleIconItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & {\n disabled: boolean\n direction: 'prev' | 'next'\n targetPage: number\n className: string\n }\n>(({ className, ...rest }) => (\n <li className={className}>\n <PaginationControllerItemButton {...rest} double />\n </li>\n))\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAqBA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AACF;AAiCD;AACA;AAEA;AAGO;AAGP;AAWE;AACE;;;AAKE;;AAEA;AACA;AACA;AACA;;AAEJ;;AAGA;AAEA;AAEI;;AAEE;AACF;AACE;;;AAIA;;;;;AAOE;;AAGI;;;;;;AAMA;;;;AAOT;AAIH;AACE;AACE;AACA;AACD;AACF;;AAiBH;AAEA;AAWE;;AAEI;;AAGF;;;AAKF;;AAEE;;;;AAIF;;AAEE;;;;;AA0BJ;AAEA;AAQA;;"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ElementType,\n type FC,\n type HTMLAttributes,\n type MouseEvent,\n memo,\n useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useLatest } from '../../hooks/useLatest'\nimport { useLocalize } from '../../intl'\nimport { range } from '../../libs/lodash'\nimport { Cluster, Reel } from '../Layout'\nimport { Nav } from '../SectioningContent'\n\nimport { PaginationControllerItemButton } from './PaginationControllerItemButton'\nimport { PaginationItemButton } from './PaginationItemButton'\n\nconst classNameGenerator = tv({\n slots: {\n wrapper: 'smarthr-ui-Pagination shr-inline-block shr-max-w-full',\n list: 'shr-m-0.25 shr-list-none shr-ps-[unset]',\n firstListItem: 'smarthr-ui-Pagination-first',\n prevListItem: 'smarthr-ui-Pagination-prev',\n nextListItem: 'smarthr-ui-Pagination-next',\n lastListItem: 'smarthr-ui-Pagination-last',\n },\n variants: {\n withoutNumbers: {\n true: {\n firstListItem: 'shr-mr-0.5',\n prevListItem: 'shr-mr-0',\n nextListItem: 'shr-ml-0',\n lastListItem: 'shr-ml-0.5',\n },\n false: {\n prevListItem: 'shr-mr-0.5',\n nextListItem: 'shr-ml-0.5',\n },\n },\n },\n})\n\ntype CommonProps = {\n /** 全ページ数 */\n total: number\n /** 現在のページ */\n current: number\n /** 現在のページの前後に表示するページ番号のボタンの数 */\n padding?: number\n /** `true` のとき、ページ番号のボタンを表示しない */\n withoutNumbers?: boolean\n}\n\ntype ButtonProps = CommonProps & {\n /** ボタンを押下したときに発火するコールバック関数 */\n onClick: (pageNumber: number, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate?: undefined\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: undefined\n}\ntype AnchorProps = CommonProps & {\n /** リンクを押下したときに発火するコールバック関数 */\n onClick?: (href: string, e: MouseEvent<HTMLElement>) => void\n /** href属性生成用関数。設定した場合、番号やarrowがbuttonからa要素に置き換わります */\n hrefTemplate: (pageNumber: number) => string\n /** next/linkなどのカスタムコンポーネントを指定します。指定がない場合はデフォルトで `a` タグが使用されます。 */\n linkAs?: ElementType\n}\n\ntype BaseProps = ButtonProps | AnchorProps\ntype Props = BaseProps & Omit<HTMLAttributes<HTMLElement>, keyof BaseProps>\n\nconst BUTTON_REGEX = /^button$/i\nconst ANCHOR_REGEX = /^a/i\n\nconst getTargetDelegateElement = (e: MouseEvent<HTMLElement>, regex: RegExp) =>\n (e.nativeEvent.composedPath() as HTMLElement[]).find((elm) => regex.test(elm.tagName))\n\nexport const Pagination: FC<Props> = (props) =>\n props.total > 1 ? <ActualPagination {...props} /> : null\n\nconst ActualPagination: FC<Props> = ({\n total,\n current,\n onClick,\n padding,\n className,\n withoutNumbers,\n hrefTemplate,\n linkAs,\n ...rest\n}) => {\n const classNames = useMemo(() => {\n const { wrapper, list, firstListItem, prevListItem, nextListItem, lastListItem } =\n classNameGenerator()\n const itemArg = { withoutNumbers: withoutNumbers || false }\n\n return {\n wrapper: wrapper({ className }),\n list: list(),\n firstListItem: firstListItem(itemArg),\n prevListItem: prevListItem(itemArg),\n nextListItem: nextListItem(itemArg),\n lastListItem: lastListItem(itemArg),\n }\n }, [className, withoutNumbers])\n\n const latest = useLatest({ onClick, hrefTemplate })\n const hasHrefTemplate = !!hrefTemplate\n\n const functions = useMemo(\n () => ({\n actualHrefTemplate: hasHrefTemplate\n ? (pageNumber: number) => latest.hrefTemplate!(pageNumber)\n : undefined,\n handleDelegateClick: (e: MouseEvent<HTMLElement>) => {\n if (!latest.onClick) {\n return\n }\n\n if (latest.hrefTemplate) {\n const anchor = getTargetDelegateElement(e, ANCHOR_REGEX)\n\n if (!anchor) {\n return\n }\n\n const href = (anchor as HTMLAnchorElement).href\n\n if (href) {\n ;(latest.onClick as (href: string, e: MouseEvent<HTMLElement>) => void)(href, e)\n }\n } else {\n const button = getTargetDelegateElement(e, BUTTON_REGEX)\n\n if (button) {\n ;(latest.onClick as (pageNumber: number, e: MouseEvent<HTMLElement>) => void)(\n parseInt((button as HTMLButtonElement).value, 10),\n e,\n )\n }\n }\n },\n }),\n [hasHrefTemplate, latest],\n )\n\n const { navigationLabel } = useLocalize({\n navigationLabel: {\n id: 'smarthr-ui/Pagination/navigationLabel',\n defaultText: 'ページネーション',\n },\n })\n\n return (\n <Nav {...rest} className={classNames.wrapper} aria-label={navigationLabel}>\n <Reel onClick={functions.handleDelegateClick}>\n <ItemButtons\n total={total}\n current={current}\n padding={padding}\n withoutNumbers={withoutNumbers}\n hrefTemplate={functions.actualHrefTemplate}\n classNames={classNames}\n linkAs={linkAs}\n />\n </Reel>\n </Nav>\n )\n}\n\nconst ItemButtons = memo<\n Pick<Props, 'total' | 'current' | 'padding' | 'withoutNumbers' | 'hrefTemplate' | 'linkAs'> & {\n classNames: {\n list: string\n firstListItem: string\n prevListItem: string\n nextListItem: string\n lastListItem: string\n }\n }\n>(({ total, current, padding, withoutNumbers, hrefTemplate, classNames, linkAs }) => {\n const pageNumbers = useMemo(() => {\n if (withoutNumbers) {\n return []\n }\n\n const actualPadding = padding ?? 4\n\n return range(Math.max(current - actualPadding, 1), Math.min(current + actualPadding, total) + 1)\n }, [current, total, padding, withoutNumbers])\n\n const prevAttrs = {\n disabled: current === 1,\n direction: 'prev' as const,\n hrefTemplate,\n linkAs,\n }\n const nextAttrs = {\n disabled: current === total,\n direction: 'next' as const,\n hrefTemplate,\n linkAs,\n }\n\n return (\n <Cluster as=\"ul\" className={classNames.list}>\n <DoubleIconItemButton {...prevAttrs} targetPage={1} className={classNames.firstListItem} />\n <li className={classNames.prevListItem}>\n <PaginationControllerItemButton {...prevAttrs} targetPage={current - 1} />\n </li>\n {pageNumbers.map((page) => (\n <NumberItemButton\n key={page}\n page={page}\n disabled={page === current}\n hrefTemplate={hrefTemplate}\n linkAs={linkAs}\n />\n ))}\n <li className={classNames.nextListItem}>\n <PaginationControllerItemButton {...nextAttrs} targetPage={current + 1} />\n </li>\n <DoubleIconItemButton {...nextAttrs} targetPage={total} className={classNames.lastListItem} />\n </Cluster>\n )\n})\n\nconst NumberItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & { page: number; disabled: boolean }\n>(({ disabled, ...rest }) => (\n <li className={`smarthr-ui-Pagination-${disabled ? 'current' : 'page'}`}>\n <PaginationItemButton {...rest} disabled={disabled} />\n </li>\n))\n\nconst DoubleIconItemButton = memo<\n Pick<Props, 'hrefTemplate' | 'linkAs'> & {\n disabled: boolean\n direction: 'prev' | 'next'\n targetPage: number\n className: string\n }\n>(({ className, ...rest }) => (\n <li className={className}>\n <PaginationControllerItemButton {...rest} double />\n </li>\n))\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqBA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACE;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACF;AACF;AAiCD;AACA;AAEA;AAGO;AAGP;AAWE;AACE;;;AAKE;;AAEA;AACA;AACA;AACA;;AAEJ;;AAGA;AAEA;AAEI;;AAEE;AACF;AACE;;;AAIA;;;;;AAOE;;AAGI;;;;;;AAMA;;;;AAOT;AAIH;AACE;AACE;AACA;AACD;AACF;;AAiBH;AAEA;AAWE;;AAEI;;AAGF;;;AAKF;;AAEE;;;;AAIF;;AAEE;;;;;AA0BJ;AAEA;AAQA;;"}
@@ -29,6 +29,7 @@ const classNameGenerator = index.tv({
29
29
  left: 'shr-rounded-l-l',
30
30
  },
31
31
  },
32
+ // TODO: tailwindの場合のみdefault値が設定される挙動はバグの原因になりかねないので整理する
32
33
  defaultVariants: {
33
34
  bgColor: 'COLUMN',
34
35
  rounded: false,
@@ -1 +1 @@
1
- {"version":3,"file":"Groupbox.cjs","sources":["../../../../src/components/Panel/Groupbox/Groupbox.tsx"],"sourcesContent":["import { type ComponentProps, type FC, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { backgroundColor } from '../../../tailwind'\nimport { Panel } from '../Panel'\n\ntype BaseProps = Omit<ComponentProps<typeof Panel>, 'radius' | 'layer'> &\n VariantProps<typeof classNameGenerator>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\nconst classNameGenerator = tv({\n base: 'shr-rounded-[unset]',\n variants: {\n bgColor: backgroundColor,\n rounded: {\n true: 'shr-rounded-l',\n all: 'shr-rounded-l',\n top: 'shr-rounded-t-l',\n right: 'shr-rounded-r-l',\n bottom: 'shr-rounded-b-l',\n left: 'shr-rounded-l-l',\n },\n },\n defaultVariants: {\n bgColor: 'COLUMN',\n rounded: false,\n },\n})\n\nexport const Groupbox: FC<Props> = ({ bgColor, rounded, padding = 1, className, ...rest }) => {\n const actualClassName = useMemo(\n () => classNameGenerator({ bgColor, rounded, className }),\n [bgColor, rounded, className],\n )\n\n return <Panel {...rest} padding={padding} layer={0} className={actualClassName} />\n}\n"],"names":["tv","backgroundColor","useMemo","_jsx","Panel"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,MAAM,kBAAkB,GAAGA,QAAE,CAAC;AAC5B,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAEC,wCAAe;AACxB,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,iBAAiB;AACtB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,OAAO,EAAE,KAAK;AACf,KAAA;AACF,CAAA,CAAC;MAEW,QAAQ,GAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,KAAI;IAC3F,MAAM,eAAe,GAAGC,aAAO,CAC7B,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACzD,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAC9B;AAED,IAAA,OAAOC,eAACC,4BAAK,EAAA,EAAA,GAAK,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,GAAI;AACpF;;;;"}
1
+ {"version":3,"file":"Groupbox.cjs","sources":["../../../../src/components/Panel/Groupbox/Groupbox.tsx"],"sourcesContent":["import { type ComponentProps, type FC, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { backgroundColor } from '../../../tailwind'\nimport { Panel } from '../Panel'\n\ntype BaseProps = Omit<ComponentProps<typeof Panel>, 'radius' | 'layer'> &\n VariantProps<typeof classNameGenerator>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\nconst classNameGenerator = tv({\n base: 'shr-rounded-[unset]',\n variants: {\n bgColor: backgroundColor,\n rounded: {\n true: 'shr-rounded-l',\n all: 'shr-rounded-l',\n top: 'shr-rounded-t-l',\n right: 'shr-rounded-r-l',\n bottom: 'shr-rounded-b-l',\n left: 'shr-rounded-l-l',\n },\n },\n // TODO: tailwindの場合のみdefault値が設定される挙動はバグの原因になりかねないので整理する\n defaultVariants: {\n bgColor: 'COLUMN',\n rounded: false,\n },\n})\n\nexport const Groupbox: FC<Props> = ({ bgColor, rounded, padding = 1, className, ...rest }) => {\n const actualClassName = useMemo(\n () => classNameGenerator({ bgColor, rounded, className }),\n [bgColor, rounded, className],\n )\n\n return <Panel {...rest} padding={padding} layer={0} className={actualClassName} />\n}\n"],"names":["tv","backgroundColor","useMemo","_jsx","Panel"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,MAAM,kBAAkB,GAAGA,QAAE,CAAC;AAC5B,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAEC,wCAAe;AACxB,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,iBAAiB;AACtB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA;AACF,KAAA;;AAED,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,OAAO,EAAE,KAAK;AACf,KAAA;AACF,CAAA,CAAC;MAEW,QAAQ,GAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,KAAI;IAC3F,MAAM,eAAe,GAAGC,aAAO,CAC7B,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACzD,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAC9B;AAED,IAAA,OAAOC,eAACC,4BAAK,EAAA,EAAA,GAAK,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,GAAI;AACpF;;;;"}
@@ -27,6 +27,7 @@ const classNameGenerator = ce({
27
27
  left: 'shr-rounded-l-l',
28
28
  },
29
29
  },
30
+ // TODO: tailwindの場合のみdefault値が設定される挙動はバグの原因になりかねないので整理する
30
31
  defaultVariants: {
31
32
  bgColor: 'COLUMN',
32
33
  rounded: false,
@@ -1 +1 @@
1
- {"version":3,"file":"Groupbox.js","sources":["../../../../src/components/Panel/Groupbox/Groupbox.tsx"],"sourcesContent":["import { type ComponentProps, type FC, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { backgroundColor } from '../../../tailwind'\nimport { Panel } from '../Panel'\n\ntype BaseProps = Omit<ComponentProps<typeof Panel>, 'radius' | 'layer'> &\n VariantProps<typeof classNameGenerator>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\nconst classNameGenerator = tv({\n base: 'shr-rounded-[unset]',\n variants: {\n bgColor: backgroundColor,\n rounded: {\n true: 'shr-rounded-l',\n all: 'shr-rounded-l',\n top: 'shr-rounded-t-l',\n right: 'shr-rounded-r-l',\n bottom: 'shr-rounded-b-l',\n left: 'shr-rounded-l-l',\n },\n },\n defaultVariants: {\n bgColor: 'COLUMN',\n rounded: false,\n },\n})\n\nexport const Groupbox: FC<Props> = ({ bgColor, rounded, padding = 1, className, ...rest }) => {\n const actualClassName = useMemo(\n () => classNameGenerator({ bgColor, rounded, className }),\n [bgColor, rounded, className],\n )\n\n return <Panel {...rest} padding={padding} layer={0} className={actualClassName} />\n}\n"],"names":["tv","_jsx"],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAM,kBAAkB,GAAGA,EAAE,CAAC;AAC5B,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE,eAAe;AACxB,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,iBAAiB;AACtB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,OAAO,EAAE,KAAK;AACf,KAAA;AACF,CAAA,CAAC;MAEW,QAAQ,GAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,KAAI;IAC3F,MAAM,eAAe,GAAG,OAAO,CAC7B,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACzD,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAC9B;AAED,IAAA,OAAOC,IAAC,KAAK,EAAA,EAAA,GAAK,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,GAAI;AACpF;;;;"}
1
+ {"version":3,"file":"Groupbox.js","sources":["../../../../src/components/Panel/Groupbox/Groupbox.tsx"],"sourcesContent":["import { type ComponentProps, type FC, useMemo } from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { backgroundColor } from '../../../tailwind'\nimport { Panel } from '../Panel'\n\ntype BaseProps = Omit<ComponentProps<typeof Panel>, 'radius' | 'layer'> &\n VariantProps<typeof classNameGenerator>\ntype Props = BaseProps & Omit<ComponentProps<'div'>, keyof BaseProps>\n\nconst classNameGenerator = tv({\n base: 'shr-rounded-[unset]',\n variants: {\n bgColor: backgroundColor,\n rounded: {\n true: 'shr-rounded-l',\n all: 'shr-rounded-l',\n top: 'shr-rounded-t-l',\n right: 'shr-rounded-r-l',\n bottom: 'shr-rounded-b-l',\n left: 'shr-rounded-l-l',\n },\n },\n // TODO: tailwindの場合のみdefault値が設定される挙動はバグの原因になりかねないので整理する\n defaultVariants: {\n bgColor: 'COLUMN',\n rounded: false,\n },\n})\n\nexport const Groupbox: FC<Props> = ({ bgColor, rounded, padding = 1, className, ...rest }) => {\n const actualClassName = useMemo(\n () => classNameGenerator({ bgColor, rounded, className }),\n [bgColor, rounded, className],\n )\n\n return <Panel {...rest} padding={padding} layer={0} className={actualClassName} />\n}\n"],"names":["tv","_jsx"],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAM,kBAAkB,GAAGA,EAAE,CAAC;AAC5B,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE,eAAe;AACxB,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,iBAAiB;AACtB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA;AACF,KAAA;;AAED,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,OAAO,EAAE,KAAK;AACf,KAAA;AACF,CAAA,CAAC;MAEW,QAAQ,GAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,KAAI;IAC3F,MAAM,eAAe,GAAG,OAAO,CAC7B,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACzD,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAC9B;AAED,IAAA,OAAOC,IAAC,KAAK,EAAA,EAAA,GAAK,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,GAAI;AACpF;;;;"}
@@ -56,7 +56,9 @@ const classNameGenerator = index.tv({
56
56
  });
57
57
  const Scroller = React.forwardRef(({ as: Component = 'div', direction = 'vertical', styleType = 'auto', className, children, ...rest }, ref) => {
58
58
  const wrapperRef = React.useRef(null);
59
- React.useImperativeHandle(ref, () => wrapperRef.current);
59
+ // as が切り替わると DOM 要素が変わるため、Component を依存配列に含める
60
+ // eslint-disable-next-line react-hooks/exhaustive-deps
61
+ React.useImperativeHandle(ref, () => wrapperRef.current, [Component]);
60
62
  const [tabIndex, setTabIndex] = React.useState(undefined);
61
63
  const actualClassName = React.useMemo(() => classNameGenerator({
62
64
  direction,
@@ -1 +1 @@
1
- {"version":3,"file":"Scroller.cjs","sources":["../../../src/components/Scroller/Scroller.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithoutRef,\n type ComponentType,\n type PropsWithChildren,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useSectionWrapper } from '../SectioningContent'\n\ntype BaseProps = PropsWithChildren<\n VariantProps<typeof classNameGenerator> & {\n as?: string | ComponentType<any>\n }\n>\ntype Props = BaseProps & Omit<ComponentPropsWithoutRef<'div'>, keyof BaseProps | 'tabIndex'>\n\nconst classNameGenerator = tv({\n base: 'smarthr-ui-Scroller',\n variants: {\n direction: {\n horizontal: '',\n vertical: '',\n both: '',\n },\n styleType: {\n auto: '',\n scroll: '',\n },\n },\n compoundVariants: [\n {\n direction: 'vertical',\n styleType: 'auto',\n className: 'shr-overflow-y-auto shr-overflow-x-hidden',\n },\n {\n direction: 'horizontal',\n styleType: 'auto',\n className: 'shr-overflow-x-auto shr-overflow-y-hidden',\n },\n {\n direction: 'both',\n styleType: 'auto',\n className: 'shr-overflow-auto',\n },\n {\n direction: 'vertical',\n styleType: 'scroll',\n className: 'shr-overflow-x-hidden shr-overflow-y-scroll',\n },\n {\n direction: 'horizontal',\n styleType: 'scroll',\n className: 'shr-overflow-y-hidden shr-overflow-x-scroll',\n },\n {\n direction: 'both',\n styleType: 'scroll',\n className: 'shr-overflow-scroll',\n },\n ],\n})\n\nexport const Scroller = forwardRef<HTMLDivElement, Props>(\n (\n {\n as: Component = 'div',\n direction = 'vertical',\n styleType = 'auto',\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(ref, () => wrapperRef.current!)\n\n const [tabIndex, setTabIndex] = useState<0 | undefined>(undefined)\n\n const actualClassName = useMemo(\n () =>\n classNameGenerator({\n direction,\n styleType,\n className,\n }),\n [direction, styleType, className],\n )\n\n useEffect(() => {\n const refCurrent = wrapperRef.current\n if (!refCurrent) return\n\n const autoTabIndex = () => {\n let nextTabIndex: 0 | undefined = undefined\n\n switch (direction) {\n case 'vertical':\n nextTabIndex = refCurrent.scrollHeight > refCurrent.clientHeight ? 0 : undefined\n break\n case 'horizontal':\n nextTabIndex = refCurrent.scrollWidth > refCurrent.clientWidth ? 0 : undefined\n break\n case 'both':\n nextTabIndex =\n refCurrent.scrollHeight > refCurrent.clientHeight ||\n refCurrent.scrollWidth > refCurrent.clientWidth\n ? 0\n : undefined\n break\n }\n\n setTabIndex(nextTabIndex)\n }\n\n autoTabIndex()\n\n const resizeObserver = new ResizeObserver(autoTabIndex)\n resizeObserver.observe(refCurrent)\n\n return () => {\n resizeObserver.unobserve(refCurrent)\n }\n }, [direction])\n\n const Wrapper = useSectionWrapper(Component)\n const body = (\n <Component {...rest} ref={wrapperRef} className={actualClassName} tabIndex={tabIndex}>\n {children}\n </Component>\n )\n\n if (Wrapper) {\n return <Wrapper>{body}</Wrapper>\n }\n\n return body\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;AAwBA;AACE;AACA;AACE;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACD;AACE;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACF;AACF;AAEM;AAYH;;;;;;;;;AAiBE;AACA;;;;;AAMI;AACE;;AAEF;AACE;;AAEF;;AAEI;AACA;AACE;;;;;AAMV;AAEA;AAEA;AACA;AAEA;AACE;AACF;AACF;AAEA;;;AAQE;;AAGF;AACF;;"}
1
+ {"version":3,"file":"Scroller.cjs","sources":["../../../src/components/Scroller/Scroller.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ComponentPropsWithoutRef,\n type ComponentType,\n type PropsWithChildren,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useSectionWrapper } from '../SectioningContent'\n\ntype BaseProps = PropsWithChildren<\n VariantProps<typeof classNameGenerator> & {\n as?: string | ComponentType<any>\n }\n>\ntype Props = BaseProps & Omit<ComponentPropsWithoutRef<'div'>, keyof BaseProps | 'tabIndex'>\n\nconst classNameGenerator = tv({\n base: 'smarthr-ui-Scroller',\n variants: {\n direction: {\n horizontal: '',\n vertical: '',\n both: '',\n },\n styleType: {\n auto: '',\n scroll: '',\n },\n },\n compoundVariants: [\n {\n direction: 'vertical',\n styleType: 'auto',\n className: 'shr-overflow-y-auto shr-overflow-x-hidden',\n },\n {\n direction: 'horizontal',\n styleType: 'auto',\n className: 'shr-overflow-x-auto shr-overflow-y-hidden',\n },\n {\n direction: 'both',\n styleType: 'auto',\n className: 'shr-overflow-auto',\n },\n {\n direction: 'vertical',\n styleType: 'scroll',\n className: 'shr-overflow-x-hidden shr-overflow-y-scroll',\n },\n {\n direction: 'horizontal',\n styleType: 'scroll',\n className: 'shr-overflow-y-hidden shr-overflow-x-scroll',\n },\n {\n direction: 'both',\n styleType: 'scroll',\n className: 'shr-overflow-scroll',\n },\n ],\n})\n\nexport const Scroller = forwardRef<HTMLDivElement, Props>(\n (\n {\n as: Component = 'div',\n direction = 'vertical',\n styleType = 'auto',\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // as が切り替わると DOM 要素が変わるため、Component を依存配列に含める\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useImperativeHandle(ref, () => wrapperRef.current!, [Component])\n\n const [tabIndex, setTabIndex] = useState<0 | undefined>(undefined)\n\n const actualClassName = useMemo(\n () =>\n classNameGenerator({\n direction,\n styleType,\n className,\n }),\n [direction, styleType, className],\n )\n\n useEffect(() => {\n const refCurrent = wrapperRef.current\n if (!refCurrent) return\n\n const autoTabIndex = () => {\n let nextTabIndex: 0 | undefined = undefined\n\n switch (direction) {\n case 'vertical':\n nextTabIndex = refCurrent.scrollHeight > refCurrent.clientHeight ? 0 : undefined\n break\n case 'horizontal':\n nextTabIndex = refCurrent.scrollWidth > refCurrent.clientWidth ? 0 : undefined\n break\n case 'both':\n nextTabIndex =\n refCurrent.scrollHeight > refCurrent.clientHeight ||\n refCurrent.scrollWidth > refCurrent.clientWidth\n ? 0\n : undefined\n break\n }\n\n setTabIndex(nextTabIndex)\n }\n\n autoTabIndex()\n\n const resizeObserver = new ResizeObserver(autoTabIndex)\n resizeObserver.observe(refCurrent)\n\n return () => {\n resizeObserver.unobserve(refCurrent)\n }\n }, [direction])\n\n const Wrapper = useSectionWrapper(Component)\n const body = (\n <Component {...rest} ref={wrapperRef} className={actualClassName} tabIndex={tabIndex}>\n {children}\n </Component>\n )\n\n if (Wrapper) {\n return <Wrapper>{body}</Wrapper>\n }\n\n return body\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;AAwBA;AACE;AACA;AACE;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACD;AACF;AACD;AACE;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACD;AACF;AACF;AAEM;AAYH;;;AAIA;;;;;;;;AAeE;AACA;;;;;AAMI;AACE;;AAEF;AACE;;AAEF;;AAEI;AACA;AACE;;;;;AAMV;AAEA;AAEA;AACA;AAEA;AACE;AACF;AACF;AAEA;;;AAQE;;AAGF;AACF;;"}
@@ -54,7 +54,9 @@ const classNameGenerator = ce({
54
54
  });
55
55
  const Scroller = forwardRef(({ as: Component = 'div', direction = 'vertical', styleType = 'auto', className, children, ...rest }, ref) => {
56
56
  const wrapperRef = useRef(null);
57
- useImperativeHandle(ref, () => wrapperRef.current);
57
+ // as が切り替わると DOM 要素が変わるため、Component を依存配列に含める
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ useImperativeHandle(ref, () => wrapperRef.current, [Component]);
58
60
  const [tabIndex, setTabIndex] = useState(undefined);
59
61
  const actualClassName = useMemo(() => classNameGenerator({
60
62
  direction,