@simplysm/solid 13.0.69 → 13.0.70

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 (477) hide show
  1. package/README.md +168 -195
  2. package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
  3. package/dist/components/data/calendar/Calendar.js +15 -2
  4. package/dist/components/data/calendar/Calendar.js.map +2 -2
  5. package/dist/components/data/kanban/KanbanContext.js +2 -2
  6. package/dist/components/data/kanban/KanbanContext.js.map +1 -1
  7. package/dist/components/data/list/List.d.ts +8 -8
  8. package/dist/components/data/list/ListContext.d.ts +1 -1
  9. package/dist/components/data/list/ListItem.d.ts +15 -15
  10. package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
  11. package/dist/components/data/sheet/DataSheet.js +6 -4
  12. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  13. package/dist/components/data/sheet/DataSheetConfigDialog.js +8 -8
  14. package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
  15. package/dist/components/data/sheet/types.d.ts +4 -4
  16. package/dist/components/data/sheet/types.d.ts.map +1 -1
  17. package/dist/components/disclosure/Collapse.d.ts +4 -4
  18. package/dist/components/disclosure/Dialog.d.ts +24 -24
  19. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  20. package/dist/components/disclosure/Dialog.js +7 -2
  21. package/dist/components/disclosure/Dialog.js.map +2 -2
  22. package/dist/components/disclosure/DialogContext.d.ts +25 -25
  23. package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
  24. package/dist/components/disclosure/DialogContext.js +1 -1
  25. package/dist/components/disclosure/DialogContext.js.map +1 -1
  26. package/dist/components/disclosure/DialogInstanceContext.d.ts +7 -7
  27. package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
  28. package/dist/components/disclosure/DialogProvider.d.ts +3 -3
  29. package/dist/components/disclosure/Dropdown.d.ts +24 -24
  30. package/dist/components/disclosure/Tabs.js +1 -1
  31. package/dist/components/disclosure/Tabs.js.map +1 -1
  32. package/dist/components/disclosure/dialogZIndex.d.ts +7 -7
  33. package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
  34. package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
  35. package/dist/components/features/crud-detail/CrudDetail.js +19 -16
  36. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  37. package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
  38. package/dist/components/features/crud-sheet/CrudSheet.js +34 -28
  39. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  40. package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
  41. package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
  42. package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
  43. package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
  44. package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
  45. package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
  46. package/dist/components/features/permission-table/PermissionTable.js +6 -2
  47. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  48. package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
  49. package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
  50. package/dist/components/features/shared-data/SharedDataSelect.js +8 -2
  51. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  52. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
  53. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
  54. package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -13
  55. package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
  56. package/dist/components/features/shared-data/SharedDataSelectList.js +219 -58
  57. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  58. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
  59. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
  60. package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
  61. package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
  62. package/dist/components/feedback/Progress.d.ts +1 -1
  63. package/dist/components/feedback/Progress.d.ts.map +1 -1
  64. package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
  65. package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
  66. package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
  67. package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
  68. package/dist/components/feedback/busy/BusyContext.js +1 -1
  69. package/dist/components/feedback/busy/BusyContext.js.map +1 -1
  70. package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
  71. package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
  72. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  73. package/dist/components/feedback/notification/NotificationBanner.js +7 -3
  74. package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
  75. package/dist/components/feedback/notification/NotificationBell.js +2 -2
  76. package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
  77. package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
  78. package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
  79. package/dist/components/feedback/notification/NotificationContext.js +1 -1
  80. package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
  81. package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
  82. package/dist/components/feedback/notification/NotificationProvider.js +1 -1
  83. package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
  84. package/dist/components/feedback/print/PrintContext.js +1 -1
  85. package/dist/components/feedback/print/PrintContext.js.map +1 -1
  86. package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
  87. package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
  88. package/dist/components/form-control/ThemeToggle.d.ts +7 -7
  89. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  90. package/dist/components/form-control/ThemeToggle.js +3 -3
  91. package/dist/components/form-control/checkbox/Checkbox.js +1 -1
  92. package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
  93. package/dist/components/form-control/checkbox/Radio.js +1 -1
  94. package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
  95. package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
  96. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  97. package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
  98. package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
  99. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  100. package/dist/components/form-control/combobox/Combobox.js +2 -2
  101. package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
  102. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  103. package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
  104. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  105. package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
  106. package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
  107. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
  108. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  109. package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
  110. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  111. package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
  112. package/dist/components/form-control/editor/EditorToolbar.js +65 -20
  113. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  114. package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
  115. package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
  116. package/dist/components/form-control/editor/RichTextEditor.js +1 -1
  117. package/dist/components/form-control/editor/editor.css +5 -5
  118. package/dist/components/form-control/field/DatePicker.d.ts +22 -22
  119. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  120. package/dist/components/form-control/field/DatePicker.js +4 -4
  121. package/dist/components/form-control/field/DatePicker.js.map +1 -1
  122. package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
  123. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  124. package/dist/components/form-control/field/DateTimePicker.js +4 -4
  125. package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
  126. package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
  127. package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
  128. package/dist/components/form-control/field/NumberInput.d.ts +23 -23
  129. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  130. package/dist/components/form-control/field/NumberInput.js +4 -4
  131. package/dist/components/form-control/field/NumberInput.js.map +1 -1
  132. package/dist/components/form-control/field/TextInput.d.ts +25 -25
  133. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  134. package/dist/components/form-control/field/TextInput.js +5 -5
  135. package/dist/components/form-control/field/TextInput.js.map +1 -1
  136. package/dist/components/form-control/field/Textarea.d.ts +19 -19
  137. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  138. package/dist/components/form-control/field/Textarea.js +4 -4
  139. package/dist/components/form-control/field/Textarea.js.map +1 -1
  140. package/dist/components/form-control/field/TimePicker.d.ts +20 -20
  141. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  142. package/dist/components/form-control/field/TimePicker.js +4 -4
  143. package/dist/components/form-control/field/TimePicker.js.map +1 -1
  144. package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
  145. package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
  146. package/dist/components/form-control/select/Select.d.ts +26 -26
  147. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  148. package/dist/components/form-control/select/Select.js +34 -23
  149. package/dist/components/form-control/select/Select.js.map +2 -2
  150. package/dist/components/form-control/select/SelectContext.d.ts +7 -7
  151. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  152. package/dist/components/form-control/select/SelectContext.js +1 -1
  153. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  154. package/dist/components/form-control/select/SelectItem.d.ts +4 -4
  155. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  156. package/dist/components/form-control/state-preset/StatePreset.js +8 -8
  157. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  158. package/dist/components/layout/FormTable.js +4 -4
  159. package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
  160. package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
  161. package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
  162. package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
  163. package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
  164. package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
  165. package/dist/components/layout/sidebar/SidebarContext.js +1 -1
  166. package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
  167. package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
  168. package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
  169. package/dist/components/layout/topbar/Topbar.d.ts +6 -6
  170. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  171. package/dist/components/layout/topbar/Topbar.js +11 -6
  172. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  173. package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
  174. package/dist/components/layout/topbar/TopbarContext.js +2 -2
  175. package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
  176. package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
  177. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  178. package/dist/components/layout/topbar/TopbarMenu.js +5 -1
  179. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  180. package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
  181. package/dist/directives/ripple.d.ts +5 -5
  182. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  183. package/dist/helpers/createAppStructure.js +4 -1
  184. package/dist/helpers/createAppStructure.js.map +1 -1
  185. package/dist/helpers/createSlotComponent.d.ts +3 -3
  186. package/dist/helpers/mergeStyles.d.ts +8 -8
  187. package/dist/hooks/createControllableSignal.d.ts +10 -10
  188. package/dist/hooks/createControllableStore.d.ts +6 -6
  189. package/dist/hooks/createIMEHandler.d.ts +7 -7
  190. package/dist/hooks/createMountTransition.d.ts +4 -4
  191. package/dist/hooks/createSelectionGroup.js +1 -1
  192. package/dist/hooks/createSelectionGroup.js.map +1 -1
  193. package/dist/hooks/createSlotSignal.d.ts +2 -2
  194. package/dist/hooks/useLocalStorage.d.ts +11 -11
  195. package/dist/hooks/useLogger.d.ts +1 -1
  196. package/dist/hooks/useLogger.d.ts.map +1 -1
  197. package/dist/hooks/useLogger.js +1 -1
  198. package/dist/hooks/useLogger.js.map +1 -1
  199. package/dist/hooks/useRouterLink.d.ts +10 -10
  200. package/dist/hooks/useRouterLink.d.ts.map +1 -1
  201. package/dist/index.d.ts +2 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +2 -1
  204. package/dist/index.js.map +1 -1
  205. package/dist/providers/ClipboardProvider.d.ts +5 -5
  206. package/dist/providers/ConfigContext.d.ts +6 -6
  207. package/dist/providers/ConfigContext.js +2 -2
  208. package/dist/providers/ConfigContext.js.map +1 -1
  209. package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
  210. package/dist/providers/LoggerContext.d.ts +13 -13
  211. package/dist/providers/PwaUpdateProvider.d.ts +4 -4
  212. package/dist/providers/PwaUpdateProvider.js +2 -2
  213. package/dist/providers/PwaUpdateProvider.js.map +1 -1
  214. package/dist/providers/ServiceClientContext.d.ts +8 -8
  215. package/dist/providers/ServiceClientContext.d.ts.map +1 -1
  216. package/dist/providers/ServiceClientContext.js +1 -1
  217. package/dist/providers/ServiceClientContext.js.map +1 -1
  218. package/dist/providers/ServiceClientProvider.d.ts +6 -6
  219. package/dist/providers/ServiceClientProvider.js +7 -7
  220. package/dist/providers/ServiceClientProvider.js.map +1 -1
  221. package/dist/providers/SyncStorageContext.d.ts +14 -14
  222. package/dist/providers/SystemProvider.d.ts.map +1 -1
  223. package/dist/providers/SystemProvider.js +21 -16
  224. package/dist/providers/SystemProvider.js.map +2 -2
  225. package/dist/providers/ThemeContext.d.ts +20 -20
  226. package/dist/providers/ThemeContext.d.ts.map +1 -1
  227. package/dist/providers/ThemeContext.js +1 -1
  228. package/dist/providers/ThemeContext.js.map +1 -1
  229. package/dist/providers/i18n/I18nContext.d.ts +44 -0
  230. package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
  231. package/dist/providers/i18n/I18nContext.js +73 -0
  232. package/dist/providers/i18n/I18nContext.js.map +6 -0
  233. package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
  234. package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
  235. package/dist/providers/i18n/I18nContext.types.js +1 -0
  236. package/dist/providers/i18n/I18nContext.types.js.map +6 -0
  237. package/dist/providers/i18n/i18nUtils.d.ts +18 -0
  238. package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
  239. package/dist/providers/i18n/i18nUtils.js +25 -0
  240. package/dist/providers/i18n/i18nUtils.js.map +6 -0
  241. package/dist/providers/i18n/locales/en.d.ts +163 -0
  242. package/dist/providers/i18n/locales/en.d.ts.map +1 -0
  243. package/dist/providers/i18n/locales/en.js +165 -0
  244. package/dist/providers/i18n/locales/en.js.map +6 -0
  245. package/dist/providers/i18n/locales/ko.d.ts +163 -0
  246. package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
  247. package/dist/providers/i18n/locales/ko.js +165 -0
  248. package/dist/providers/i18n/locales/ko.js.map +6 -0
  249. package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
  250. package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
  251. package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
  252. package/dist/providers/shared-data/SharedDataContext.js +1 -1
  253. package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
  254. package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
  255. package/dist/providers/shared-data/SharedDataProvider.js +4 -4
  256. package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
  257. package/package.json +8 -8
  258. package/src/components/data/calendar/Calendar.tsx +10 -4
  259. package/src/components/data/kanban/Kanban.tsx +14 -14
  260. package/src/components/data/kanban/KanbanContext.ts +3 -3
  261. package/src/components/data/list/List.tsx +10 -10
  262. package/src/components/data/list/ListContext.ts +1 -1
  263. package/src/components/data/list/ListItem.styles.ts +8 -8
  264. package/src/components/data/list/ListItem.tsx +15 -15
  265. package/src/components/data/sheet/DataSheet.styles.ts +22 -22
  266. package/src/components/data/sheet/DataSheet.tsx +52 -48
  267. package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
  268. package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
  269. package/src/components/data/sheet/sheetUtils.ts +7 -7
  270. package/src/components/data/sheet/types.ts +16 -16
  271. package/src/components/disclosure/Collapse.tsx +11 -11
  272. package/src/components/disclosure/Dialog.tsx +60 -57
  273. package/src/components/disclosure/DialogContext.ts +26 -26
  274. package/src/components/disclosure/DialogInstanceContext.ts +7 -7
  275. package/src/components/disclosure/DialogProvider.tsx +5 -5
  276. package/src/components/disclosure/Dropdown.tsx +64 -64
  277. package/src/components/disclosure/Tabs.tsx +1 -1
  278. package/src/components/disclosure/dialogZIndex.ts +11 -11
  279. package/src/components/display/Echarts.tsx +4 -4
  280. package/src/components/features/address/AddressSearch.tsx +2 -2
  281. package/src/components/features/crud-detail/CrudDetail.tsx +18 -16
  282. package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
  283. package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
  284. package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
  285. package/src/components/features/crud-sheet/CrudSheet.tsx +39 -37
  286. package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
  287. package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
  288. package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
  289. package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
  290. package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
  291. package/src/components/features/permission-table/PermissionTable.tsx +22 -19
  292. package/src/components/features/shared-data/SharedDataSelect.tsx +22 -20
  293. package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
  294. package/src/components/features/shared-data/SharedDataSelectList.tsx +245 -48
  295. package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
  296. package/src/components/feedback/Progress.tsx +1 -1
  297. package/src/components/feedback/busy/BusyContainer.tsx +6 -6
  298. package/src/components/feedback/busy/BusyContext.ts +12 -12
  299. package/src/components/feedback/busy/BusyProvider.tsx +6 -6
  300. package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
  301. package/src/components/feedback/notification/NotificationBell.tsx +4 -4
  302. package/src/components/feedback/notification/NotificationContext.ts +28 -28
  303. package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
  304. package/src/components/feedback/print/PrintContext.ts +1 -1
  305. package/src/components/form-control/Button.tsx +1 -1
  306. package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
  307. package/src/components/form-control/Invalid.tsx +5 -5
  308. package/src/components/form-control/ThemeToggle.tsx +10 -10
  309. package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
  310. package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
  311. package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
  312. package/src/components/form-control/checkbox/Radio.tsx +2 -2
  313. package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
  314. package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
  315. package/src/components/form-control/combobox/Combobox.tsx +55 -55
  316. package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
  317. package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
  318. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
  319. package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
  320. package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
  321. package/src/components/form-control/editor/editor.css +5 -5
  322. package/src/components/form-control/field/DatePicker.tsx +39 -39
  323. package/src/components/form-control/field/DateTimePicker.tsx +38 -38
  324. package/src/components/form-control/field/Field.styles.ts +11 -11
  325. package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
  326. package/src/components/form-control/field/NumberInput.tsx +63 -63
  327. package/src/components/form-control/field/TextInput.tsx +48 -48
  328. package/src/components/form-control/field/Textarea.tsx +32 -32
  329. package/src/components/form-control/field/TimePicker.tsx +37 -37
  330. package/src/components/form-control/numpad/Numpad.tsx +26 -26
  331. package/src/components/form-control/select/Select.tsx +84 -84
  332. package/src/components/form-control/select/SelectContext.ts +8 -8
  333. package/src/components/form-control/select/SelectItem.tsx +5 -5
  334. package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
  335. package/src/components/layout/FormTable.tsx +4 -4
  336. package/src/components/layout/sidebar/Sidebar.tsx +8 -8
  337. package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
  338. package/src/components/layout/sidebar/SidebarContext.ts +8 -8
  339. package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
  340. package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
  341. package/src/components/layout/topbar/Topbar.tsx +15 -13
  342. package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
  343. package/src/components/layout/topbar/TopbarContext.ts +2 -2
  344. package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
  345. package/src/components/layout/topbar/TopbarUser.tsx +9 -9
  346. package/src/directives/ripple.ts +8 -8
  347. package/src/helpers/createAppStructure.ts +12 -6
  348. package/src/helpers/createSlotComponent.ts +4 -4
  349. package/src/helpers/mergeStyles.ts +11 -11
  350. package/src/hooks/createControllableSignal.ts +11 -11
  351. package/src/hooks/createControllableStore.ts +8 -8
  352. package/src/hooks/createIMEHandler.ts +7 -7
  353. package/src/hooks/createMountTransition.ts +4 -4
  354. package/src/hooks/createSelectionGroup.tsx +1 -1
  355. package/src/hooks/createSlotSignal.ts +2 -2
  356. package/src/hooks/useLocalStorage.ts +13 -13
  357. package/src/hooks/useLogger.ts +2 -2
  358. package/src/hooks/useRouterLink.ts +15 -15
  359. package/src/index.ts +4 -3
  360. package/src/providers/ClipboardProvider.tsx +19 -19
  361. package/src/providers/ConfigContext.tsx +8 -8
  362. package/src/providers/ErrorLoggerProvider.tsx +3 -3
  363. package/src/providers/LoggerContext.tsx +13 -13
  364. package/src/providers/PwaUpdateProvider.tsx +6 -6
  365. package/src/providers/ServiceClientContext.ts +9 -9
  366. package/src/providers/ServiceClientProvider.tsx +15 -15
  367. package/src/providers/SyncStorageContext.tsx +15 -15
  368. package/src/providers/SystemProvider.tsx +15 -12
  369. package/src/providers/ThemeContext.tsx +26 -26
  370. package/src/providers/i18n/I18nContext.tsx +129 -0
  371. package/src/providers/i18n/I18nContext.types.ts +30 -0
  372. package/src/providers/i18n/i18nUtils.ts +38 -0
  373. package/src/providers/i18n/locales/en.ts +161 -0
  374. package/src/providers/i18n/locales/ko.ts +161 -0
  375. package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
  376. package/src/providers/shared-data/SharedDataContext.ts +29 -29
  377. package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
  378. package/src/styles/patterns.styles.ts +6 -6
  379. package/src/styles/tokens.styles.ts +5 -5
  380. package/tailwind.config.ts +1 -1
  381. package/tailwind.css +4 -4
  382. package/tests/components/data/List.spec.tsx +689 -0
  383. package/tests/components/data/Pagination.spec.tsx +336 -0
  384. package/tests/components/data/Table.spec.tsx +55 -0
  385. package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
  386. package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
  387. package/tests/components/disclosure/Collapse.spec.tsx +173 -0
  388. package/tests/components/disclosure/Dialog.spec.tsx +438 -0
  389. package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
  390. package/tests/components/disclosure/Dropdown.spec.tsx +213 -0
  391. package/tests/components/disclosure/Tabs.spec.tsx +220 -0
  392. package/tests/components/display/Alert.spec.tsx +47 -0
  393. package/tests/components/display/Barcode.spec.tsx +61 -0
  394. package/tests/components/display/Card.spec.tsx +41 -0
  395. package/tests/components/display/Link.spec.tsx +62 -0
  396. package/tests/components/display/Tag.spec.tsx +47 -0
  397. package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
  398. package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
  399. package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
  400. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
  401. package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
  402. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +463 -0
  403. package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
  404. package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
  405. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
  406. package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
  407. package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
  408. package/tests/components/feedback/print/Print.spec.tsx +45 -0
  409. package/tests/components/form-control/Button.spec.tsx +119 -0
  410. package/tests/components/form-control/Invalid.spec.tsx +131 -0
  411. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
  412. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
  413. package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
  414. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
  415. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
  416. package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
  417. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
  418. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
  419. package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
  420. package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
  421. package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
  422. package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
  423. package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
  424. package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
  425. package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
  426. package/tests/components/form-control/select/Select.spec.tsx +676 -0
  427. package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
  428. package/tests/components/layout/FormGroup.spec.tsx +104 -0
  429. package/tests/components/layout/FormTable.spec.tsx +43 -0
  430. package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
  431. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
  432. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
  433. package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
  434. package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
  435. package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
  436. package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
  437. package/tests/directives/ripple.spec.tsx +130 -0
  438. package/tests/helpers/createAppStructure.spec.tsx +843 -0
  439. package/tests/helpers/mergeStyles.spec.ts +172 -0
  440. package/tests/hooks/createControllableSignal.spec.ts +194 -0
  441. package/tests/hooks/createIMEHandler.spec.ts +80 -0
  442. package/tests/hooks/createMountTransition.spec.ts +86 -0
  443. package/tests/hooks/useLocalStorage.spec.tsx +223 -0
  444. package/tests/hooks/useLogger.spec.tsx +116 -0
  445. package/tests/hooks/usePrint.spec.tsx +134 -0
  446. package/tests/hooks/useRouterLink.spec.tsx +183 -0
  447. package/tests/hooks/useSyncConfig.spec.tsx +304 -0
  448. package/tests/providers/ClipboardProvider.spec.tsx +20 -0
  449. package/tests/providers/ConfigContext.spec.tsx +42 -0
  450. package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
  451. package/tests/providers/LoggerContext.spec.tsx +76 -0
  452. package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
  453. package/tests/providers/ServiceClientContext.spec.tsx +88 -0
  454. package/tests/providers/SyncStorageContext.spec.tsx +77 -0
  455. package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
  456. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
  457. package/tests/vitest-env.d.ts +1 -0
  458. package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
  459. package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
  460. package/dist/components/form-control/select-list/SelectList.js +0 -280
  461. package/dist/components/form-control/select-list/SelectList.js.map +0 -6
  462. package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
  463. package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
  464. package/dist/components/form-control/select-list/SelectListContext.js +0 -14
  465. package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
  466. package/docs/data-components.md +0 -782
  467. package/docs/disclosure.md +0 -254
  468. package/docs/display.md +0 -153
  469. package/docs/feedback.md +0 -238
  470. package/docs/form-controls.md +0 -1068
  471. package/docs/helpers.md +0 -54
  472. package/docs/hooks.md +0 -588
  473. package/docs/layout.md +0 -384
  474. package/docs/providers.md +0 -211
  475. package/docs/styling.md +0 -184
  476. package/src/components/form-control/select-list/SelectList.tsx +0 -385
  477. package/src/components/form-control/select-list/SelectListContext.ts +0 -23
@@ -9,7 +9,7 @@ export function isCrudDetailBeforeDef(value: unknown): value is CrudDetailBefore
9
9
  );
10
10
  }
11
11
 
12
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
12
+ /* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
13
13
  export function CrudDetailBefore(props: { children: JSX.Element }): JSX.Element {
14
14
  return {
15
15
  __type: "crud-detail-before",
@@ -9,7 +9,7 @@ export function isCrudDetailToolsDef(value: unknown): value is CrudDetailToolsDe
9
9
  );
10
10
  }
11
11
 
12
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
12
+ /* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
13
13
  export function CrudDetailTools(props: { children: JSX.Element }): JSX.Element {
14
14
  return {
15
15
  __type: "crud-detail-tools",
@@ -19,6 +19,7 @@ import { DataSheet } from "../../data/sheet/DataSheet";
19
19
  import { DataSheetColumn } from "../../data/sheet/DataSheetColumn";
20
20
  import { BusyContainer } from "../../feedback/busy/BusyContainer";
21
21
  import { useNotification } from "../../feedback/notification/NotificationContext";
22
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
22
23
  import { Button } from "../../form-control/Button";
23
24
  import { Icon } from "../../display/Icon";
24
25
  import { FormGroup } from "../../layout/FormGroup";
@@ -91,6 +92,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
91
92
  ]);
92
93
 
93
94
  const noti = useNotification();
95
+ const i18n = useI18nOptional();
94
96
  const topbarCtx = useContext(TopbarContext);
95
97
  const dialogInstance = useDialogInstance();
96
98
  const isModal = dialogInstance !== undefined;
@@ -116,7 +118,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
116
118
  });
117
119
  let originalItems: TItem[] = [];
118
120
 
119
- // eslint-disable-next-line solid/reactivity -- filterInitial 초기값으로만 사용
121
+ // eslint-disable-next-line solid/reactivity -- filterInitial is used only for initial value
120
122
  const [filter, setFilter] = createStore<TFilter>((local.filterInitial ?? {}) as TFilter);
121
123
  const [lastFilter, setLastFilter] = createSignal<TFilter>(objClone(filter));
122
124
 
@@ -158,7 +160,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
158
160
  try {
159
161
  await refresh();
160
162
  } catch (err) {
161
- noti.error(err, "조회 실패");
163
+ noti.error(err, i18n?.t("crudSheet.lookupFailed") ?? "Lookup failed");
162
164
  }
163
165
  setBusyCount((c) => c - 1);
164
166
  setReady(true);
@@ -171,7 +173,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
171
173
  setTotalPageCount(result.pageCount ?? 0);
172
174
  }
173
175
 
174
- /* eslint-disable solid/reactivity -- 이벤트 핸들러에서만 호출, store 즉시 읽기 */
176
+ /* eslint-disable solid/reactivity -- called only in event handlers, immediate store read */
175
177
  function getItemDiffs() {
176
178
  return items.oneWayDiffs(originalItems, (item) => local.getItemKey(item), {
177
179
  excludes: local.inlineEdit?.diffsExcludes,
@@ -182,7 +184,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
182
184
  function checkIgnoreChanges(): boolean {
183
185
  if (!local.inlineEdit) return true;
184
186
  if (getItemDiffs().length === 0) return true;
185
- return confirm("변경사항이 있습니다. 무시하시겠습니까?");
187
+ return confirm(i18n?.t("crudSheet.discardChanges") ?? "You have unsaved changes. Discard them?");
186
188
  }
187
189
 
188
190
  // -- Filter --
@@ -233,18 +235,18 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
233
235
  const diffs = getItemDiffs();
234
236
 
235
237
  if (diffs.length === 0) {
236
- noti.info("안내", "변경사항이 없습니다.");
238
+ noti.info(i18n?.t("crudSheet.notice") ?? "Notice", i18n?.t("crudSheet.noChanges") ?? "No changes to save.");
237
239
  return;
238
240
  }
239
241
 
240
242
  setBusyCount((c) => c + 1);
241
243
  try {
242
244
  await local.inlineEdit.submit(diffs);
243
- noti.success("저장 완료", "저장되었습니다.");
245
+ noti.success(i18n?.t("crudSheet.saveCompleted") ?? "Save completed", i18n?.t("crudSheet.saveSuccess") ?? "Saved successfully.");
244
246
  await refresh();
245
247
  local.onSubmitted?.();
246
248
  } catch (err) {
247
- noti.error(err, "저장 실패");
249
+ noti.error(err, i18n?.t("crudSheet.saveFailed") ?? "Save failed");
248
250
  }
249
251
  setBusyCount((c) => c - 1);
250
252
  }
@@ -264,7 +266,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
264
266
  try {
265
267
  await refresh();
266
268
  } catch (err) {
267
- noti.error(err, "조회 실패");
269
+ noti.error(err, i18n?.t("crudSheet.lookupFailed") ?? "Lookup failed");
268
270
  }
269
271
  setBusyCount((c) => c - 1);
270
272
  }
@@ -277,9 +279,9 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
277
279
  setBusyCount((c) => c + 1);
278
280
  try {
279
281
  await refresh();
280
- noti.success("삭제 완료", "삭제되었습니다.");
282
+ noti.success(i18n?.t("crudSheet.deleteCompleted") ?? "Delete completed", i18n?.t("crudSheet.deleteSuccess") ?? "Deleted successfully.");
281
283
  } catch (err) {
282
- noti.error(err, "삭제 실패");
284
+ noti.error(err, i18n?.t("crudSheet.deleteFailed") ?? "Delete failed");
283
285
  }
284
286
  setBusyCount((c) => c - 1);
285
287
  }
@@ -292,9 +294,9 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
292
294
  setBusyCount((c) => c + 1);
293
295
  try {
294
296
  await refresh();
295
- noti.success("복구 완료", "복구되었습니다.");
297
+ noti.success(i18n?.t("crudSheet.restoreCompleted") ?? "Restore completed", i18n?.t("crudSheet.restoreSuccess") ?? "Restored successfully.");
296
298
  } catch (err) {
297
- noti.error(err, "복구 실패");
299
+ noti.error(err, i18n?.t("crudSheet.restoreFailed") ?? "Restore failed");
298
300
  }
299
301
  setBusyCount((c) => c - 1);
300
302
  }
@@ -308,7 +310,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
308
310
  const result = await local.search(lastFilter(), undefined, sorts());
309
311
  await local.excel.download(result.items);
310
312
  } catch (err) {
311
- noti.error(err, "엑셀 다운로드 실패");
313
+ noti.error(err, i18n?.t("crudSheet.excelDownloadFailed") ?? "Excel download failed");
312
314
  }
313
315
  setBusyCount((c) => c - 1);
314
316
  }
@@ -326,10 +328,10 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
326
328
  setBusyCount((c) => c + 1);
327
329
  try {
328
330
  await local.excel!.upload!(file);
329
- noti.success("완료", "엑셀 업로드가 완료되었습니다.");
331
+ noti.success(i18n?.t("crudSheet.excelCompleted") ?? "Completed", i18n?.t("crudSheet.excelUploadSuccess") ?? "Excel upload completed successfully.");
330
332
  await refresh();
331
333
  } catch (err) {
332
- noti.error(err, "엑셀 업로드 실패");
334
+ noti.error(err, i18n?.t("crudSheet.excelUploadFailed") ?? "Excel upload failed");
333
335
  }
334
336
  setBusyCount((c) => c - 1);
335
337
  };
@@ -338,7 +340,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
338
340
 
339
341
  // -- Select Mode --
340
342
  function handleSelectedItemsChange(newSelectedItems: TItem[]) {
341
- // 현재 페이지 아이템들의 key Set
343
+ // Current page items key Set
342
344
  const currentItems = items as unknown as TItem[];
343
345
  const currentKeys = new Set<string | number>();
344
346
  for (const item of currentItems) {
@@ -346,22 +348,22 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
346
348
  if (key != null) currentKeys.add(key);
347
349
  }
348
350
 
349
- // 새로 선택된 아이템들의 key
351
+ // Newly selected items key
350
352
  const newSelectedKeys = new Set<string | number>();
351
353
  for (const item of newSelectedItems) {
352
354
  const key = local.getItemKey(item);
353
355
  if (key != null) newSelectedKeys.add(key);
354
356
  }
355
357
 
356
- // 다른 페이지 key 보존 + 현재 페이지 key 갱신
358
+ // Preserve other page keys + update current page keys
357
359
  const merged = new Set<string | number>();
358
360
  for (const key of selectedKeys()) {
359
361
  if (!currentKeys.has(key)) {
360
- merged.add(key); // 다른 페이지 key 보존
362
+ merged.add(key); // Preserve other page keys
361
363
  }
362
364
  }
363
365
  for (const key of newSelectedKeys) {
364
- merged.add(key); // 현재 페이지 선택 추가
366
+ merged.add(key); // Add current page selection
365
367
  }
366
368
 
367
369
  setSelectedKeys(merged);
@@ -400,7 +402,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
400
402
  });
401
403
 
402
404
  // -- Route Leave Guard --
403
- // eslint-disable-next-line solid/reactivity -- inlineEdit 초기 설정값으로만 사용
405
+ // eslint-disable-next-line solid/reactivity -- inlineEdit is used only for initial value
404
406
  if (!isModal && local.inlineEdit) {
405
407
  try {
406
408
  useBeforeLeave((e) => {
@@ -409,7 +411,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
409
411
  }
410
412
  });
411
413
  } catch {
412
- // Router context 없으면 skip
414
+ // Skip if no Router context
413
415
  }
414
416
  }
415
417
 
@@ -425,12 +427,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
425
427
  onClick={() => formRef?.requestSubmit()}
426
428
  >
427
429
  <Icon icon={IconDeviceFloppy} class="mr-1" />
428
- 저장
430
+ {i18n?.t("crudSheet.save") ?? "Save"}
429
431
  </Button>
430
432
  </Show>
431
433
  <Button size="lg" variant="ghost" theme="info" onClick={handleRefresh}>
432
434
  <Icon icon={IconRefresh} class="mr-1" />
433
- 새로고침
435
+ {i18n?.t("crudSheet.refresh") ?? "Refresh"}
434
436
  </Button>
435
437
  </>
436
438
  ));
@@ -491,12 +493,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
491
493
  onClick={() => formRef?.requestSubmit()}
492
494
  >
493
495
  <Icon icon={IconDeviceFloppy} class="mr-1" />
494
- 저장
496
+ {i18n?.t("crudSheet.save") ?? "Save"}
495
497
  </Button>
496
498
  </Show>
497
499
  <Button size="sm" theme="info" variant="ghost" onClick={handleRefresh}>
498
500
  <Icon icon={IconRefresh} class="mr-1" />
499
- 새로고침
501
+ {i18n?.t("crudSheet.refresh") ?? "Refresh"}
500
502
  </Button>
501
503
  </div>
502
504
  </Show>
@@ -512,7 +514,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
512
514
  <FormGroup.Item>
513
515
  <Button type="submit" theme="info" variant="solid">
514
516
  <Icon icon={IconSearch} class="mr-1" />
515
- 조회
517
+ {i18n?.t("crudSheet.search") ?? "Search"}
516
518
  </Button>
517
519
  </FormGroup.Item>
518
520
  {filterDef().children(filter, setFilter)}
@@ -528,7 +530,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
528
530
  {/* Inline edit buttons */}
529
531
  <Show when={canEdit() && local.inlineEdit}>
530
532
  <Button size="sm" theme="primary" variant="ghost" onClick={handleAddRow}>
531
- <Icon icon={IconPlus} class="mr-1" />행 추가
533
+ <Icon icon={IconPlus} class="mr-1" />{i18n?.t("crudSheet.addRow") ?? "Add Row"}
532
534
  </Button>
533
535
  </Show>
534
536
 
@@ -541,7 +543,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
541
543
  onClick={() => void handleEditItem()}
542
544
  >
543
545
  <Icon icon={IconPlus} class="mr-1" />
544
- 등록
546
+ {i18n?.t("crudSheet.register") ?? "Register"}
545
547
  </Button>
546
548
  </Show>
547
549
  <Show when={canEdit() && local.modalEdit?.deleteItems}>
@@ -560,7 +562,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
560
562
  }
561
563
  >
562
564
  <Icon icon={IconTrash} class="mr-1" />
563
- 선택 삭제
565
+ {i18n?.t("crudSheet.deleteSelected") ?? "Delete Selected"}
564
566
  </Button>
565
567
  </Show>
566
568
  <Show when={canEdit() && local.modalEdit?.restoreItems}>
@@ -575,7 +577,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
575
577
  }
576
578
  >
577
579
  <Icon icon={IconTrashOff} class="mr-1" />
578
- 선택 복구
580
+ {i18n?.t("crudSheet.restoreSelected") ?? "Restore Selected"}
579
581
  </Button>
580
582
  </Show>
581
583
 
@@ -583,13 +585,13 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
583
585
  <Show when={canEdit() && local.excel?.upload}>
584
586
  <Button size="sm" theme="success" variant="ghost" onClick={handleExcelUpload}>
585
587
  <Icon icon={IconUpload} class="mr-1" />
586
- 엑셀 업로드
588
+ {i18n?.t("crudSheet.excelUpload") ?? "Excel Upload"}
587
589
  </Button>
588
590
  </Show>
589
591
  <Show when={local.excel}>
590
592
  <Button size="sm" theme="success" variant="ghost" onClick={handleExcelDownload}>
591
593
  <Icon icon={IconFileExcel} class="mr-1" />
592
- 엑셀 다운로드
594
+ {i18n?.t("crudSheet.excelDownload") ?? "Excel Download"}
593
595
  </Button>
594
596
  </Show>
595
597
  </Show>
@@ -709,7 +711,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
709
711
 
710
712
  {/* Auto lastModified columns */}
711
713
  <Show when={local.lastModifiedAtProp}>
712
- <DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header="수정일시" hidden>
714
+ <DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header={i18n?.t("crudSheet.lastModified") ?? "Last Modified"} hidden>
713
715
  {(dsCtx) => (
714
716
  <div class="px-2 py-1 text-center">
715
717
  {(
@@ -723,7 +725,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
723
725
  </Show>
724
726
 
725
727
  <Show when={local.lastModifiedByProp}>
726
- <DataSheetColumn<TItem> key={local.lastModifiedByProp!} header="수정자" hidden>
728
+ <DataSheetColumn<TItem> key={local.lastModifiedByProp!} header={i18n?.t("crudSheet.modifiedBy") ?? "Modified By"} hidden>
727
729
  {(dsCtx) => (
728
730
  <div class="px-2 py-1 text-center">
729
731
  {objGetChainValue(dsCtx.item, local.lastModifiedByProp!, true) as string}
@@ -740,12 +742,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
740
742
  <div class="flex-1" />
741
743
  <Show when={selectedItems().length > 0}>
742
744
  <Button size="sm" theme="danger" onClick={handleSelectCancel}>
743
- {local.selectMode === "multiple" ? "모두" : "선택"} 해제
745
+ {local.selectMode === "multiple" ? (i18n?.t("crudSheet.deselectAll") ?? "Deselect All") : (i18n?.t("crudSheet.deselect") ?? "Deselect")}
744
746
  </Button>
745
747
  </Show>
746
748
  <Show when={local.selectMode === "multiple"}>
747
749
  <Button size="sm" theme="primary" onClick={handleSelectConfirm}>
748
- 확인({selectedItems().length})
750
+ {i18n?.t("crudSheet.confirm") ?? "Confirm"} ({selectedItems().length})
749
751
  </Button>
750
752
  </Show>
751
753
  </div>
@@ -10,7 +10,7 @@ export function isCrudSheetColumnDef(value: unknown): value is CrudSheetColumnDe
10
10
  );
11
11
  }
12
12
 
13
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
13
+ /* eslint-disable solid/reactivity -- plain object return pattern, reactive context not needed */
14
14
  export function CrudSheetColumn<TItem>(props: CrudSheetColumnProps<TItem>): JSX.Element {
15
15
  return {
16
16
  __type: "crud-sheet-column",
@@ -9,7 +9,7 @@ export function isCrudSheetFilterDef(value: unknown): value is CrudSheetFilterDe
9
9
  );
10
10
  }
11
11
 
12
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
12
+ /* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
13
13
  export function CrudSheetFilter<TFilter>(props: {
14
14
  children: (filter: TFilter, setFilter: any) => JSX.Element;
15
15
  }): JSX.Element {
@@ -9,7 +9,7 @@ export function isCrudSheetHeaderDef(value: unknown): value is CrudSheetHeaderDe
9
9
  );
10
10
  }
11
11
 
12
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
12
+ /* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
13
13
  export function CrudSheetHeader(props: { children: JSX.Element }): JSX.Element {
14
14
  return {
15
15
  __type: "crud-sheet-header",
@@ -9,7 +9,7 @@ export function isCrudSheetToolsDef(value: unknown): value is CrudSheetToolsDef<
9
9
  );
10
10
  }
11
11
 
12
- /* eslint-disable solid/reactivity -- plain object 반환 패턴으로 reactive context 불필요 */
12
+ /* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
13
13
  export function CrudSheetTools<_TItem>(props: {
14
14
  children: (ctx: any) => JSX.Element;
15
15
  }): JSX.Element {
@@ -15,6 +15,7 @@ import { IconSearch, IconX } from "@tabler/icons-solidjs";
15
15
  import { Icon } from "../../display/Icon";
16
16
  import { Invalid } from "../../form-control/Invalid";
17
17
  import { useDialog, type DialogShowOptions } from "../../disclosure/DialogContext";
18
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
18
19
  import { createControllableSignal } from "../../../hooks/createControllableSignal";
19
20
  import { type ComponentSize, textMuted } from "../../../styles/tokens.styles";
20
21
  import {
@@ -24,46 +25,46 @@ import {
24
25
  triggerSizeClasses,
25
26
  } from "../../form-control/DropdownTrigger.styles";
26
27
 
27
- /** 모달에서 반환하는 결과 인터페이스 */
28
+ /** Result interface returned from modal */
28
29
  export interface DataSelectModalResult<TKey> {
29
30
  selectedKeys: TKey[];
30
31
  }
31
32
 
32
33
  /** DataSelectButton Props */
33
34
  export interface DataSelectButtonProps<TItem, TKey = string | number> {
34
- /** 현재 선택된 (단일 또는 다중) */
35
+ /** Currently selected key(s) (single or multiple) */
35
36
  value?: TKey | TKey[];
36
- /** 변경 콜백 */
37
+ /** Value change callback */
37
38
  onValueChange?: (value: TKey | TKey[] | undefined) => void;
38
39
 
39
- /** 키로 아이템을 로드하는 함수 */
40
+ /** Function to load items by key */
40
41
  load: (keys: TKey[]) => TItem[] | Promise<TItem[]>;
41
- /** 선택 모달 컴포넌트 팩토리 */
42
+ /** Selection modal component factory */
42
43
  modal: () => JSX.Element;
43
- /** 아이템 렌더링 함수 */
44
+ /** Item rendering function */
44
45
  renderItem: (item: TItem) => JSX.Element;
45
46
 
46
- /** 다중 선택 모드 */
47
+ /** Multiple selection mode */
47
48
  multiple?: boolean;
48
- /** 필수 입력 */
49
+ /** Required input */
49
50
  required?: boolean;
50
- /** 비활성화 */
51
+ /** Disabled */
51
52
  disabled?: boolean;
52
- /** 트리거 크기 */
53
+ /** Trigger size */
53
54
  size?: ComponentSize;
54
- /** 테두리 없는 스타일 */
55
+ /** Borderless style */
55
56
  inset?: boolean;
56
57
 
57
- /** 커스텀 유효성 검사 함수 */
58
+ /** Custom validation function */
58
59
  validate?: (value: unknown) => string | undefined;
59
- /** touchMode: 포커스 해제 후에만 에러 표시 */
60
+ /** touchMode: show error only after focus is lost */
60
61
  touchMode?: boolean;
61
62
 
62
- /** 다이얼로그 옵션 */
63
+ /** Dialog options */
63
64
  dialogOptions?: DialogShowOptions;
64
65
  }
65
66
 
66
- // 스타일
67
+ // Styles
67
68
  const containerClass = clsx("inline-flex items-center", "group");
68
69
  const selectedValueClass = clsx("flex-1", "whitespace-nowrap", "overflow-hidden", "text-ellipsis");
69
70
  const actionButtonClass = clsx(
@@ -111,27 +112,28 @@ export function DataSelectButton<TItem, TKey = string | number>(
111
112
  "dialogOptions",
112
113
  ]);
113
114
 
115
+ const i18n = useI18nOptional();
114
116
  const dialog = useDialog();
115
117
 
116
- // value 항상 배열로 정규화
118
+ // Always normalize value to array
117
119
  const normalizeKeys = (value: TKey | TKey[] | undefined): TKey[] => {
118
120
  if (value === undefined || value === null) return [];
119
121
  if (Array.isArray(value)) return value;
120
122
  return [value];
121
123
  };
122
124
 
123
- // controlled/uncontrolled 패턴
125
+ // Controlled/uncontrolled pattern
124
126
  type ValueType = TKey | TKey[] | undefined;
125
127
  const [getValue, setValue] = createControllableSignal<ValueType>({
126
128
  value: () => local.value,
127
129
  onChange: () => local.onValueChange as ((v: ValueType) => void) | undefined,
128
130
  } as Parameters<typeof createControllableSignal<ValueType>>[0]);
129
131
 
130
- // load를 위한 추적 signal
131
- // eslint-disable-next-line solid/reactivity -- 초기값은 mount 시점에 번만 읽음
132
+ // Track keys for loading
133
+ // eslint-disable-next-line solid/reactivity -- initial value read once at mount time
132
134
  const [loadKeys, setLoadKeys] = createSignal<TKey[]>(normalizeKeys(local.value));
133
135
 
134
- // value가 변경되면 loadKeys 업데이트
136
+ // Update loadKeys when value changes
135
137
  createEffect(
136
138
  on(
137
139
  () => getValue(),
@@ -141,33 +143,33 @@ export function DataSelectButton<TItem, TKey = string | number>(
141
143
  ),
142
144
  );
143
145
 
144
- // createResource로 load 호출
145
- // eslint-disable-next-line solid/reactivity -- createResource fetcher source 변경 호출됨
146
+ // Call load via createResource
147
+ // eslint-disable-next-line solid/reactivity -- createResource fetcher is called when source changes
146
148
  const [selectedItems] = createResource(loadKeys, async (keys) => {
147
149
  if (keys.length === 0) return [];
148
150
  return Promise.resolve(local.load(keys));
149
151
  });
150
152
 
151
- // 값이 있는지 확인
153
+ // Check if has value
152
154
  const hasValue = createMemo(() => {
153
155
  const keys = normalizeKeys(getValue());
154
156
  return keys.length > 0;
155
157
  });
156
158
 
157
- // 지우기 가능 여부
159
+ // Check if clearable
158
160
  const clearable = createMemo(() => !local.required && hasValue() && !local.disabled);
159
161
 
160
- // 유효성 검사
162
+ // Validation
161
163
  const errorMsg = createMemo(() => {
162
164
  const v = getValue();
163
165
  if (local.required) {
164
166
  const keys = normalizeKeys(v);
165
- if (keys.length === 0) return "필수 입력 항목입니다";
167
+ if (keys.length === 0) return "Required field";
166
168
  }
167
169
  return local.validate?.(v);
168
170
  });
169
171
 
170
- // 모달 열기
172
+ // Open modal
171
173
  const handleOpenModal = async () => {
172
174
  if (local.disabled) return;
173
175
 
@@ -186,7 +188,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
186
188
  }
187
189
  };
188
190
 
189
- // 지우기
191
+ // Clear selection
190
192
  const handleClear = (e: MouseEvent) => {
191
193
  e.stopPropagation();
192
194
  if (local.multiple) {
@@ -196,7 +198,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
196
198
  }
197
199
  };
198
200
 
199
- // 선택된 표시
201
+ // Render selected value display
200
202
  const renderSelectedDisplay = (): JSX.Element => {
201
203
  const items = selectedItems();
202
204
  if (!items || items.length === 0) {
@@ -218,7 +220,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
218
220
  );
219
221
  };
220
222
 
221
- // 트리거 클래스 계산
223
+ // Calculate trigger class
222
224
  const triggerClassName = () =>
223
225
  getTriggerContainerClass({
224
226
  size: local.size,
@@ -254,7 +256,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
254
256
  class={twMerge(actionButtonClass, "text-base-400 hover:text-danger-500")}
255
257
  onClick={handleClear}
256
258
  tabIndex={-1}
257
- aria-label="선택 해제"
259
+ aria-label={i18n?.t("dataSelectButton.deselect") ?? "Deselect"}
258
260
  >
259
261
  <Icon icon={IconX} size="0.875em" />
260
262
  </button>
@@ -266,7 +268,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
266
268
  class={twMerge(actionButtonClass, "text-base-400 hover:text-primary-500")}
267
269
  onClick={() => void handleOpenModal()}
268
270
  tabIndex={-1}
269
- aria-label="검색"
271
+ aria-label={i18n?.t("dataSelectButton.search") ?? "Search"}
270
272
  >
271
273
  <Icon icon={IconSearch} size="0.875em" />
272
274
  </button>