@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
@@ -41,53 +41,53 @@ const DropdownContent = createSlotComponent(DropdownContext, (ctx) => ctx.setCon
41
41
 
42
42
  export interface DropdownProps {
43
43
  /**
44
- * 절대 위치 (컨텍스트 메뉴 등, minWidth 없음)
45
- * Trigger와 함께 사용 Trigger 기준 위치 계산
44
+ * Absolute position (for context menus, no minWidth)
45
+ * When used with Trigger, calculates position relative to Trigger
46
46
  */
47
47
  position?: { x: number; y: number };
48
48
 
49
49
  /**
50
- * 팝업 열림 상태
50
+ * Popup open state
51
51
  */
52
52
  open?: boolean;
53
53
 
54
54
  /**
55
- * 열림 상태 변경 콜백
55
+ * Callback when open state changes
56
56
  */
57
57
  onOpenChange?: (open: boolean) => void;
58
58
 
59
59
  /**
60
- * 팝업 최대 높이 (기본값: 300px), 초과 내부 스크롤
60
+ * Popup max height (default: 300px), scrolls internally if exceeded
61
61
  */
62
62
  maxHeight?: number;
63
63
 
64
64
  /**
65
- * 비활성화 (Trigger 클릭 무시)
65
+ * Disabled (Trigger click ignored)
66
66
  */
67
67
  disabled?: boolean;
68
68
 
69
69
  /**
70
- * 키보드 네비게이션 활성화 (Select 등에서 사용)
70
+ * Enable keyboard navigation (used in Select, etc)
71
71
  *
72
- * direction=down일 때:
73
- * - 트리거에서 ArrowDown -> focusable 아이템 포커스
74
- * - 아이템에서 ArrowUp -> 트리거 포커스
75
- * - 트리거에서 ArrowUp -> 닫기
72
+ * When direction=down:
73
+ * - ArrowDown from trigger -> focus first focusable item
74
+ * - ArrowUp from first item -> focus trigger
75
+ * - ArrowUp from trigger -> close
76
76
  *
77
- * direction=up일 때:
78
- * - 트리거에서 ArrowUp -> 마지막 focusable 아이템 포커스
79
- * - 마지막 아이템에서 ArrowDown -> 트리거 포커스
80
- * - 트리거에서 ArrowDown -> 닫기
77
+ * When direction=up:
78
+ * - ArrowUp from trigger -> focus last focusable item
79
+ * - ArrowDown from last item -> focus trigger
80
+ * - ArrowDown from trigger -> close
81
81
  */
82
82
  keyboardNav?: boolean;
83
83
 
84
84
  /**
85
- * 팝업에 적용할 커스텀 class
85
+ * Custom class for popup
86
86
  */
87
87
  class?: string;
88
88
 
89
89
  /**
90
- * 팝업에 적용할 커스텀 style
90
+ * Custom style for popup
91
91
  */
92
92
  style?: JSX.CSSProperties;
93
93
 
@@ -103,28 +103,28 @@ interface DropdownComponent extends ParentComponent<DropdownProps> {
103
103
  }
104
104
 
105
105
  /**
106
- * 드롭다운 팝업 컴포넌트
106
+ * Dropdown popup component
107
107
  *
108
- * Trigger/Content 슬롯 패턴으로 트리거와 컨텐츠를 분리합니다.
109
- * Trigger 클릭 auto-toggle되며, disabled prop으로 비활성화할 수 있습니다.
108
+ * Separates trigger and content using Trigger/Content slot pattern.
109
+ * Auto-toggles on Trigger click, can be disabled with disabled prop.
110
110
  *
111
111
  * @example
112
112
  * ```tsx
113
113
  * <Dropdown>
114
114
  * <Dropdown.Trigger>
115
- * <Button>열기</Button>
115
+ * <Button>Open</Button>
116
116
  * </Dropdown.Trigger>
117
117
  * <Dropdown.Content>
118
- * <div>팝업 내용</div>
118
+ * <div>Popup content</div>
119
119
  * </Dropdown.Content>
120
120
  * </Dropdown>
121
121
  * ```
122
122
  *
123
- * @example Context menu (Trigger 없이 position 사용)
123
+ * @example Context menu (position without Trigger)
124
124
  * ```tsx
125
125
  * <Dropdown position={{ x: 300, y: 200 }} open={true}>
126
126
  * <Dropdown.Content>
127
- * <div>메뉴</div>
127
+ * <div>Menu</div>
128
128
  * </Dropdown.Content>
129
129
  * </Dropdown>
130
130
  * ```
@@ -147,32 +147,32 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
147
147
  onChange: () => local.onOpenChange,
148
148
  });
149
149
 
150
- // toggle 함수 (disabled 체크 포함)
150
+ // Toggle function (includes disabled check)
151
151
  const toggle = () => {
152
152
  if (local.disabled) return;
153
153
  setOpen(!open());
154
154
  };
155
155
 
156
- // 슬롯 등록 시그널
156
+ // Slot registration signals
157
157
  const [triggerSlot, setTrigger] = createSlotSignal();
158
158
  const [contentSlot, setContent] = createSlotSignal();
159
159
 
160
- // Trigger wrapper ref (위치 계산에 필요)
160
+ // Trigger wrapper ref (needed for position calculation)
161
161
  let triggerRef: HTMLDivElement | undefined;
162
162
 
163
- // 팝업 ref
163
+ // Popup ref
164
164
  const [popupRef, setPopupRef] = createSignal<HTMLDivElement>();
165
165
 
166
- // 애니메이션 상태 (mount transition)
166
+ // Animation state (mount transition)
167
167
  const { mounted, animating, unmount } = createMountTransition(open);
168
168
 
169
- // 계산된 위치
169
+ // Computed position
170
170
  const [computedStyle, setComputedStyle] = createSignal<JSX.CSSProperties>({});
171
171
 
172
- // 방향 (위/아래)
172
+ // Direction (up/down)
173
173
  const [direction, setDirection] = createSignal<"down" | "up">("down");
174
174
 
175
- // 위치 계산 함수 추출
175
+ // Extract position calculation function
176
176
  const updatePosition = () => {
177
177
  const popup = popupRef();
178
178
  if (!popup) return;
@@ -184,13 +184,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
184
184
  const viewportHeight = window.innerHeight;
185
185
  const viewportWidth = window.innerWidth;
186
186
 
187
- // 위/아래 방향 결정 (화면 중앙 기준)
187
+ // Determine up/down direction (based on viewport center)
188
188
  const spaceBelow = viewportHeight - rect.bottom;
189
189
  const spaceAbove = rect.top;
190
190
  const openDown = spaceBelow >= spaceAbove;
191
191
  setDirection(openDown ? "down" : "up");
192
192
 
193
- // 좌/우 조정 (화면 밖으로 나가지 않도록) - 뷰포트 기준
193
+ // Adjust left/right (prevent off-screen) - relative to viewport
194
194
  const adjustedLeft = Math.min(rect.left, viewportWidth - popup.offsetWidth);
195
195
 
196
196
  style.left = `${Math.max(0, adjustedLeft)}px`;
@@ -205,13 +205,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
205
205
  const viewportHeight = window.innerHeight;
206
206
  const viewportWidth = window.innerWidth;
207
207
 
208
- // 위/아래 방향 결정
208
+ // Determine up/down direction
209
209
  const spaceBelow = viewportHeight - local.position.y;
210
210
  const spaceAbove = local.position.y;
211
211
  const openDown = spaceBelow >= spaceAbove;
212
212
  setDirection(openDown ? "down" : "up");
213
213
 
214
- // 좌/우 조정 - 뷰포트 기준
214
+ // Adjust left/right - relative to viewport
215
215
  const adjustedLeft = Math.min(local.position.x, viewportWidth - (popup.offsetWidth || 200));
216
216
  style.left = `${Math.max(0, adjustedLeft)}px`;
217
217
 
@@ -225,7 +225,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
225
225
  setComputedStyle(style);
226
226
  };
227
227
 
228
- // 마운트 위치 계산 + popup 크기 변경 재계산
228
+ // Calculate position on mount + recalculate when popup size changes
229
229
  createEffect(() => {
230
230
  if (!mounted()) return;
231
231
 
@@ -239,7 +239,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
239
239
  }
240
240
  });
241
241
 
242
- // 외부 클릭 감지 (pointerdown)
242
+ // Detect outside click (pointerdown)
243
243
  createEffect(() => {
244
244
  if (!open()) return;
245
245
 
@@ -247,13 +247,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
247
247
  const popup = popupRef();
248
248
  const target = e.target as Node;
249
249
 
250
- // 팝업 내부 클릭은 무시
250
+ // Ignore clicks inside popup
251
251
  if (popup?.contains(target)) return;
252
252
 
253
- // Trigger 내부 클릭도 무시
253
+ // Ignore clicks inside trigger
254
254
  if (triggerRef?.contains(target)) return;
255
255
 
256
- // 외부 클릭 -> 닫기
256
+ // Outside click -> close
257
257
  setOpen(false);
258
258
  };
259
259
 
@@ -261,7 +261,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
261
261
  onCleanup(() => document.removeEventListener("pointerdown", handlePointerDown));
262
262
  });
263
263
 
264
- // Tab 포커스 이동 감지 (focusout)
264
+ // Detect Tab key focus movement (focusout)
265
265
  createEffect(() => {
266
266
  if (!open()) return;
267
267
 
@@ -269,16 +269,16 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
269
269
  const popup = popupRef();
270
270
  const relatedTarget = e.relatedTarget as Node | null;
271
271
 
272
- // relatedTarget null이면 무시 (pointerdown 처리)
272
+ // Ignore if relatedTarget is null (pointerdown handles it)
273
273
  if (!relatedTarget) return;
274
274
 
275
- // 팝업 내부로 이동은 무시
275
+ // Ignore movement to popup
276
276
  if (popup?.contains(relatedTarget)) return;
277
277
 
278
- // Trigger 내부로 이동도 무시
278
+ // Ignore movement to trigger
279
279
  if (triggerRef?.contains(relatedTarget)) return;
280
280
 
281
- // 외부로 포커스 이동 -> 닫기
281
+ // Focus moved outside -> close
282
282
  setOpen(false);
283
283
  };
284
284
 
@@ -286,7 +286,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
286
286
  onCleanup(() => document.removeEventListener("focusout", handleFocusOut));
287
287
  });
288
288
 
289
- // Escape 키 감지
289
+ // Detect Escape key
290
290
  createEffect(() => {
291
291
  if (!open()) return;
292
292
 
@@ -301,11 +301,11 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
301
301
  onCleanup(() => document.removeEventListener("keydown", handleKeyDown));
302
302
  });
303
303
 
304
- // 키보드 네비게이션: 트리거용 핸들러
304
+ // Keyboard navigation: handler for trigger
305
305
  const handleTriggerKeyDown = (e: KeyboardEvent) => {
306
306
  if (!local.keyboardNav) return;
307
307
 
308
- // 닫혀있을 때: ArrowUp/ArrowDown으로 열기
308
+ // When closed: open with ArrowUp/ArrowDown
309
309
  if (!open()) {
310
310
  if (e.key === "ArrowDown" || e.key === "ArrowUp") {
311
311
  e.preventDefault();
@@ -314,7 +314,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
314
314
  return;
315
315
  }
316
316
 
317
- // 열려있을 때: direction에 따른 처리
317
+ // When open: handle based on direction
318
318
  const popup = popupRef();
319
319
  if (!popup) return;
320
320
 
@@ -345,19 +345,19 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
345
345
  }
346
346
  };
347
347
 
348
- // 키보드 네비게이션: 팝업용 핸들러
348
+ // Keyboard navigation: handler for popup
349
349
  const handlePopupKeyDown = (e: KeyboardEvent) => {
350
350
  if (!local.keyboardNav) return;
351
351
 
352
- // List 등에서 이미 처리된 이벤트는 무시
352
+ // Ignore events already handled (e.g., by List)
353
353
  if (e.defaultPrevented) return;
354
354
 
355
355
  if (!triggerRef) return;
356
356
 
357
357
  const dir = direction();
358
358
 
359
- // 팝업에서 ArrowUp/ArrowDown 처리되지 않았다면 (첫/마지막 아이템)
360
- // 트리거로 포커스 이동
359
+ // If ArrowUp/ArrowDown not handled in popup (first/last item)
360
+ // Move focus to trigger
361
361
  if (dir === "down" && e.key === "ArrowUp") {
362
362
  e.preventDefault();
363
363
  triggerRef.focus();
@@ -367,24 +367,24 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
367
367
  }
368
368
  };
369
369
 
370
- // 스크롤 감지
370
+ // Detect scroll
371
371
  createEffect(() => {
372
372
  if (!open()) return;
373
373
 
374
374
  const handleScroll = (e: Event) => {
375
- // 팝업 내부 스크롤은 무시
375
+ // Ignore scroll inside popup
376
376
  const popup = popupRef();
377
377
  if (popup?.contains(e.target as Node)) return;
378
378
 
379
379
  setOpen(false);
380
380
  };
381
381
 
382
- // capture로 모든 스크롤 감지
382
+ // Detect all scroll events with capture
383
383
  document.addEventListener("scroll", handleScroll, { capture: true });
384
384
  onCleanup(() => document.removeEventListener("scroll", handleScroll, { capture: true }));
385
385
  });
386
386
 
387
- // resize 감지 (뷰포트 크기 변경 닫기)
387
+ // Detect resize (close when viewport size changes)
388
388
  createEffect(() => {
389
389
  if (!open()) return;
390
390
 
@@ -396,20 +396,20 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
396
396
  onCleanup(() => window.removeEventListener("resize", handleResize));
397
397
  });
398
398
 
399
- // transitionend 이벤트 처리
399
+ // Handle transitionend event
400
400
  const handleTransitionEnd = (e: TransitionEvent) => {
401
- // opacity 전환 완료 시에만 처리
401
+ // Only handle when opacity transition completes
402
402
  if (e.propertyName !== "opacity") return;
403
403
 
404
404
  if (!open()) {
405
- // 닫힘 애니메이션 완료 -> DOM에서 제거
405
+ // Closing animation complete -> remove from DOM
406
406
  unmount();
407
407
  }
408
408
  };
409
409
 
410
410
  const maxHeight = () => local.maxHeight ?? 300;
411
411
 
412
- // 애니메이션 클래스 (opacity transform만 transition, 위치 속성은 제외)
412
+ // Animation class (only transition opacity and transform, not position properties)
413
413
  const animationClass = () => {
414
414
  const base = "transition-[opacity,transform] duration-150 ease-out";
415
415
  const visible = animating();
@@ -426,7 +426,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
426
426
  <DropdownContext.Provider value={{ toggle, setTrigger, setContent }}>
427
427
  {local.children}
428
428
 
429
- {/* Trigger 슬롯 렌더링 (wrapper div에 click/keyboard handler 부착) */}
429
+ {/* Render trigger slot (attach click/keyboard handlers to wrapper div) */}
430
430
  <Show when={triggerSlot()}>
431
431
  <div
432
432
  ref={(el) => {
@@ -440,7 +440,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
440
440
  </div>
441
441
  </Show>
442
442
 
443
- {/* Content 슬롯: Portal + 팝업 */}
443
+ {/* Content slot: Portal + popup */}
444
444
  <Show when={mounted()}>
445
445
  <Portal>
446
446
  <div
@@ -25,7 +25,7 @@ interface TabsTabProps {
25
25
 
26
26
  function TabsTabInner(props: TabsTabProps) {
27
27
  const ctx = useContext(TabsContext);
28
- if (!ctx) throw new Error("Tabs.Tab Tabs 내부에서만 사용할 있습니다");
28
+ if (!ctx) throw new Error("Tabs.Tab can only be used inside Tabs");
29
29
 
30
30
  const isSelected = () => ctx.value() === props.value;
31
31
 
@@ -1,24 +1,24 @@
1
1
  /**
2
- * Dialog z-index 레지스트리
2
+ * Dialog z-index registry
3
3
  *
4
- * 열린 Dialog의 z-index 관리하여 무한 증가를 방지한다.
5
- * 기본 시작값 2000 (tailwind z-modal과 동일), 최대 열린 Dialog 수만큼만 사용.
4
+ * Manages z-index of open Dialogs to prevent infinite increase.
5
+ * Base starting value is 2000 (same as tailwind z-modal), uses only as many as there are open Dialogs.
6
6
  */
7
7
 
8
8
  const BASE_Z = 2000;
9
9
 
10
- // 열린 Dialog wrapper 요소 목록 (순서 = z-index 순서)
10
+ // List of open Dialog wrapper elements (order = z-index order)
11
11
  const stack: HTMLElement[] = [];
12
12
 
13
- /** Dialog 등록 스택 최상위에 추가하고 z-index 할당 */
13
+ /** Register Dialog — add to top of stack and assign z-index */
14
14
  export function registerDialog(el: HTMLElement): void {
15
15
  const idx = stack.indexOf(el);
16
- if (idx >= 0) return; // 이미 등록됨
16
+ if (idx >= 0) return; // Already registered
17
17
  stack.push(el);
18
18
  el.style.zIndex = (BASE_Z + stack.length - 1).toString();
19
19
  }
20
20
 
21
- /** Dialog 해제 스택에서 제거하고 나머지 재정렬 */
21
+ /** Unregister Dialog — remove from stack and reorder rest */
22
22
  export function unregisterDialog(el: HTMLElement): void {
23
23
  const idx = stack.indexOf(el);
24
24
  if (idx < 0) return;
@@ -26,23 +26,23 @@ export function unregisterDialog(el: HTMLElement): void {
26
26
  reindex();
27
27
  }
28
28
 
29
- /** Dialog 최상위로 올림 (포커스 ) */
29
+ /** Bring Dialog to front (on focus) */
30
30
  export function bringToFront(el: HTMLElement): void {
31
31
  const idx = stack.indexOf(el);
32
- if (idx < 0 || idx === stack.length - 1) return; // 이미 최상위
32
+ if (idx < 0 || idx === stack.length - 1) return; // Already at front
33
33
  stack.splice(idx, 1);
34
34
  stack.push(el);
35
35
  reindex();
36
36
  }
37
37
 
38
- /** 스택 순서대로 z-index 재할당 */
38
+ /** Reassign z-index in stack order */
39
39
  function reindex(): void {
40
40
  for (let i = 0; i < stack.length; i++) {
41
41
  stack[i].style.zIndex = (BASE_Z + i).toString();
42
42
  }
43
43
  }
44
44
 
45
- /** 해당 Dialog 스택 최상위인지 확인 */
45
+ /** Check if Dialog is at top of stack */
46
46
  export function isTopmost(el: HTMLElement): boolean {
47
47
  return stack.length > 0 && stack[stack.length - 1] === el;
48
48
  }
@@ -24,7 +24,7 @@ export const Echarts: Component<EchartsProps> = (props) => {
24
24
  let chart: echartsType.EChartsType | undefined;
25
25
  const [ready, setReady] = createSignal(false);
26
26
 
27
- // 마운트 echarts 동적 로드 + 차트 초기화
27
+ // On mount, dynamically load echarts + initialize chart
28
28
  createEffect(() => {
29
29
  void import("echarts").then((echarts) => {
30
30
  chart = echarts.init(containerRef, null, { renderer: "svg" });
@@ -34,13 +34,13 @@ export const Echarts: Component<EchartsProps> = (props) => {
34
34
  onCleanup(() => chart?.dispose());
35
35
  });
36
36
 
37
- // option 변경 감지
37
+ // Detect option changes
38
38
  createEffect(() => {
39
39
  if (!ready()) return;
40
40
  chart!.setOption(local.option);
41
41
  });
42
42
 
43
- // busy 상태 변경 감지
43
+ // Detect busy state changes
44
44
  createEffect(() => {
45
45
  if (!ready()) return;
46
46
  if (local.busy) {
@@ -50,7 +50,7 @@ export const Echarts: Component<EchartsProps> = (props) => {
50
50
  }
51
51
  });
52
52
 
53
- // 컨테이너 크기 변경 감지
53
+ // Detect container size changes
54
54
  createResizeObserver(containerRef, () => {
55
55
  chart?.resize();
56
56
  });
@@ -22,7 +22,7 @@ export const AddressSearchContent: Component = () => {
22
22
  scriptEl.setAttribute("id", "daum_address");
23
23
 
24
24
  scriptEl.onload = (): void => {
25
- // @ts-expect-error -- Daum Postcode 글로벌 API
25
+ // @ts-expect-error -- Daum Postcode global API
26
26
  daum.postcode.load(() => {
27
27
  resolve();
28
28
  });
@@ -31,7 +31,7 @@ export const AddressSearchContent: Component = () => {
31
31
  });
32
32
  }
33
33
 
34
- // @ts-expect-error -- Daum Postcode 글로벌 API
34
+ // @ts-expect-error -- Daum Postcode global API
35
35
  new daum.Postcode({
36
36
  oncomplete: (data: any): void => {
37
37
  const addr = data.userSelectedType === "R" ? data.roadAddress : data.jibunAddress;
@@ -19,6 +19,7 @@ import { createTopbarActions, TopbarContext } from "../../layout/topbar/TopbarCo
19
19
  import { useDialogInstance } from "../../disclosure/DialogInstanceContext";
20
20
  import { Dialog } from "../../disclosure/Dialog";
21
21
  import { createEventListener } from "@solid-primitives/event-listener";
22
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
22
23
  import clsx from "clsx";
23
24
  import {
24
25
  IconCheck,
@@ -60,6 +61,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
60
61
  ]);
61
62
 
62
63
  const noti = useNotification();
64
+ const i18n = useI18nOptional();
63
65
  const topbarCtx = useContext(TopbarContext);
64
66
  const dialogInstance = useDialogInstance<boolean>();
65
67
 
@@ -89,7 +91,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
89
91
  originalData = objClone(result.data);
90
92
  setInfo(result.info);
91
93
  } catch (err) {
92
- noti.error(err, "조회실패");
94
+ noti.error(err, i18n?.t("crudDetail.lookupFailed") ?? "Lookup failed");
93
95
  }
94
96
  setBusyCount((c) => c - 1);
95
97
  setReady(true);
@@ -108,7 +110,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
108
110
  // -- Refresh --
109
111
  async function handleRefresh() {
110
112
  if (hasChanges()) {
111
- if (!confirm("변경사항을 무시하시겠습니까?")) return;
113
+ if (!confirm(i18n?.t("crudDetail.discardChanges") ?? "Discard changes?")) return;
112
114
  }
113
115
  await doLoad();
114
116
  }
@@ -120,7 +122,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
120
122
 
121
123
  const currentInfo = info();
122
124
  if (currentInfo && !currentInfo.isNew && !hasChanges()) {
123
- noti.info("안내", "변경사항이 없습니다.");
125
+ noti.info(i18n?.t("crudDetail.notice") ?? "Notice", i18n?.t("crudDetail.noChanges") ?? "No changes to save.");
124
126
  return;
125
127
  }
126
128
 
@@ -128,7 +130,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
128
130
  try {
129
131
  const result = await local.submit(objClone(unwrap(data)));
130
132
  if (result) {
131
- noti.success("저장 완료", "저장되었습니다.");
133
+ noti.success(i18n?.t("crudDetail.saveCompleted") ?? "Save completed", i18n?.t("crudDetail.saveSuccess") ?? "Saved successfully.");
132
134
  if (dialogInstance) {
133
135
  dialogInstance.close(true);
134
136
  } else {
@@ -136,7 +138,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
136
138
  }
137
139
  }
138
140
  } catch (err) {
139
- noti.error(err, "저장 실패");
141
+ noti.error(err, i18n?.t("crudDetail.saveFailed") ?? "Save failed");
140
142
  }
141
143
  setBusyCount((c) => c - 1);
142
144
  }
@@ -160,7 +162,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
160
162
  try {
161
163
  const result = await local.toggleDelete(del);
162
164
  if (result) {
163
- noti.success(del ? "삭제 완료" : "복구 완료", del ? "삭제되었습니다." : "복구되었습니다.");
165
+ noti.success(del ? (i18n?.t("crudDetail.deleteCompleted") ?? "Delete completed") : (i18n?.t("crudDetail.restoreCompleted") ?? "Restore completed"), del ? (i18n?.t("crudDetail.deleteSuccess") ?? "Deleted successfully.") : (i18n?.t("crudDetail.restoreSuccess") ?? "Restored successfully."));
164
166
  if (dialogInstance) {
165
167
  dialogInstance.close(true);
166
168
  } else {
@@ -168,7 +170,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
168
170
  }
169
171
  }
170
172
  } catch (err) {
171
- noti.error(err, del ? "삭제 실패" : "복구 실패");
173
+ noti.error(err, del ? (i18n?.t("crudDetail.deleteFailed") ?? "Delete failed") : (i18n?.t("crudDetail.restoreFailed") ?? "Restore failed"));
172
174
  }
173
175
  setBusyCount((c) => c - 1);
174
176
  }
@@ -198,7 +200,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
198
200
  onClick={() => formRef?.requestSubmit()}
199
201
  >
200
202
  <Icon icon={IconDeviceFloppy} class="mr-1" />
201
- 저장
203
+ {i18n?.t("crudDetail.save") ?? "Save"}
202
204
  </Button>
203
205
  </Show>
204
206
  <Show
@@ -214,13 +216,13 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
214
216
  onClick={() => void handleToggleDelete()}
215
217
  >
216
218
  <Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
217
- {info()!.isDeleted ? "복구" : "삭제"}
219
+ {info()!.isDeleted ? (i18n?.t("crudDetail.restore") ?? "Restore") : (i18n?.t("crudDetail.delete") ?? "Delete")}
218
220
  </Button>
219
221
  )}
220
222
  </Show>
221
223
  <Button size="lg" variant="ghost" theme="info" onClick={() => void handleRefresh()}>
222
224
  <Icon icon={IconRefresh} class="mr-1" />
223
- 새로고침
225
+ {i18n?.t("crudDetail.refresh") ?? "Refresh"}
224
226
  </Button>
225
227
  </>
226
228
  ));
@@ -285,7 +287,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
285
287
  onClick={() => formRef?.requestSubmit()}
286
288
  >
287
289
  <Icon icon={IconDeviceFloppy} class="mr-1" />
288
- 저장
290
+ {i18n?.t("crudDetail.save") ?? "Save"}
289
291
  </Button>
290
292
  </Show>
291
293
  <Show
@@ -305,13 +307,13 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
305
307
  onClick={() => void handleToggleDelete()}
306
308
  >
307
309
  <Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
308
- {info()!.isDeleted ? "복구" : "삭제"}
310
+ {info()!.isDeleted ? (i18n?.t("crudDetail.restore") ?? "Restore") : (i18n?.t("crudDetail.delete") ?? "Delete")}
309
311
  </Button>
310
312
  )}
311
313
  </Show>
312
314
  <Button size="sm" theme="info" variant="ghost" onClick={() => void handleRefresh()}>
313
315
  <Icon icon={IconRefresh} class="mr-1" />
314
- 새로고침
316
+ {i18n?.t("crudDetail.refresh") ?? "Refresh"}
315
317
  </Button>
316
318
  </Show>
317
319
  <Show when={defs().tools}>{(toolsDef) => toolsDef().children}</Show>
@@ -330,7 +332,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
330
332
  <Show when={info()?.lastModifiedAt}>
331
333
  {(_) => (
332
334
  <div class="px-2 pb-1 text-xs text-base-400">
333
- 최종 수정: {info()!.lastModifiedAt!.toFormatString("yyyy-MM-dd HH:mm")}
335
+ {i18n?.t("crudDetail.lastModified") ?? "Last modified"}: {info()!.lastModifiedAt!.toFormatString("yyyy-MM-dd HH:mm")}
334
336
  <Show when={info()?.lastModifiedBy}> ({info()!.lastModifiedBy})</Show>
335
337
  </div>
336
338
  )}
@@ -349,7 +351,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
349
351
  {(_) => (
350
352
  <Button variant={"solid"} theme="danger" onClick={() => void handleToggleDelete()}>
351
353
  <Icon icon={info()!.isDeleted ? IconTrashOff : IconTrash} class="mr-1" />
352
- {info()!.isDeleted ? "복구" : "삭제"}
354
+ {info()!.isDeleted ? (i18n?.t("crudDetail.restore") ?? "Restore") : (i18n?.t("crudDetail.delete") ?? "Delete")}
353
355
  </Button>
354
356
  )}
355
357
  </Show>
@@ -361,7 +363,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
361
363
  class={"gap-1"}
362
364
  >
363
365
  <Icon icon={IconCheck} />
364
- 확인
366
+ {i18n?.t("crudDetail.confirm") ?? "Confirm"}
365
367
  </Button>
366
368
  </Show>
367
369
  </div>
@@ -9,7 +9,7 @@ export function isCrudDetailAfterDef(value: unknown): value is CrudDetailAfterDe
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 CrudDetailAfter(props: { children: JSX.Element }): JSX.Element {
14
14
  return {
15
15
  __type: "crud-detail-after",