@simplysm/solid 13.0.69 → 13.0.71

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 (495) 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 +26 -24
  30. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  31. package/dist/components/disclosure/Dropdown.js +24 -8
  32. package/dist/components/disclosure/Dropdown.js.map +2 -2
  33. package/dist/components/disclosure/Tabs.js +1 -1
  34. package/dist/components/disclosure/Tabs.js.map +1 -1
  35. package/dist/components/disclosure/dialogZIndex.d.ts +9 -7
  36. package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
  37. package/dist/components/disclosure/dialogZIndex.js +4 -0
  38. package/dist/components/disclosure/dialogZIndex.js.map +1 -1
  39. package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
  40. package/dist/components/features/crud-detail/CrudDetail.js +34 -22
  41. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  42. package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
  43. package/dist/components/features/crud-sheet/CrudSheet.js +48 -33
  44. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  45. package/dist/components/features/crudRegistry.d.ts +16 -0
  46. package/dist/components/features/crudRegistry.d.ts.map +1 -0
  47. package/dist/components/features/crudRegistry.js +37 -0
  48. package/dist/components/features/crudRegistry.js.map +6 -0
  49. package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
  50. package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
  51. package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
  52. package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
  53. package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
  54. package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
  55. package/dist/components/features/permission-table/PermissionTable.js +74 -85
  56. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  57. package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
  58. package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
  59. package/dist/components/features/shared-data/SharedDataSelect.js +10 -6
  60. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  61. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
  62. package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
  63. package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -15
  64. package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
  65. package/dist/components/features/shared-data/SharedDataSelectList.js +191 -65
  66. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  67. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
  68. package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
  69. package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
  70. package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
  71. package/dist/components/feedback/Progress.d.ts +1 -1
  72. package/dist/components/feedback/Progress.d.ts.map +1 -1
  73. package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
  74. package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
  75. package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
  76. package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
  77. package/dist/components/feedback/busy/BusyContext.js +1 -1
  78. package/dist/components/feedback/busy/BusyContext.js.map +1 -1
  79. package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
  80. package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
  81. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  82. package/dist/components/feedback/notification/NotificationBanner.js +7 -3
  83. package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
  84. package/dist/components/feedback/notification/NotificationBell.js +2 -2
  85. package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
  86. package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
  87. package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
  88. package/dist/components/feedback/notification/NotificationContext.js +1 -1
  89. package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
  90. package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
  91. package/dist/components/feedback/notification/NotificationProvider.js +1 -1
  92. package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
  93. package/dist/components/feedback/print/PrintContext.js +1 -1
  94. package/dist/components/feedback/print/PrintContext.js.map +1 -1
  95. package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
  96. package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
  97. package/dist/components/form-control/ThemeToggle.d.ts +7 -7
  98. package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
  99. package/dist/components/form-control/ThemeToggle.js +3 -3
  100. package/dist/components/form-control/checkbox/Checkbox.js +1 -1
  101. package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
  102. package/dist/components/form-control/checkbox/Radio.js +1 -1
  103. package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
  104. package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
  105. package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
  106. package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
  107. package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
  108. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  109. package/dist/components/form-control/combobox/Combobox.js +2 -2
  110. package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
  111. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  112. package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
  113. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  114. package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
  115. package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
  116. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
  117. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  118. package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
  119. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  120. package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
  121. package/dist/components/form-control/editor/EditorToolbar.js +65 -20
  122. package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
  123. package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
  124. package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
  125. package/dist/components/form-control/editor/RichTextEditor.js +1 -1
  126. package/dist/components/form-control/editor/editor.css +5 -5
  127. package/dist/components/form-control/field/DatePicker.d.ts +22 -22
  128. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  129. package/dist/components/form-control/field/DatePicker.js +4 -4
  130. package/dist/components/form-control/field/DatePicker.js.map +1 -1
  131. package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
  132. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  133. package/dist/components/form-control/field/DateTimePicker.js +4 -4
  134. package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
  135. package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
  136. package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
  137. package/dist/components/form-control/field/NumberInput.d.ts +23 -23
  138. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  139. package/dist/components/form-control/field/NumberInput.js +4 -4
  140. package/dist/components/form-control/field/NumberInput.js.map +1 -1
  141. package/dist/components/form-control/field/TextInput.d.ts +25 -25
  142. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  143. package/dist/components/form-control/field/TextInput.js +5 -5
  144. package/dist/components/form-control/field/TextInput.js.map +1 -1
  145. package/dist/components/form-control/field/Textarea.d.ts +19 -19
  146. package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
  147. package/dist/components/form-control/field/Textarea.js +4 -4
  148. package/dist/components/form-control/field/Textarea.js.map +1 -1
  149. package/dist/components/form-control/field/TimePicker.d.ts +20 -20
  150. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  151. package/dist/components/form-control/field/TimePicker.js +4 -4
  152. package/dist/components/form-control/field/TimePicker.js.map +1 -1
  153. package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
  154. package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
  155. package/dist/components/form-control/select/Select.d.ts +26 -26
  156. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  157. package/dist/components/form-control/select/Select.js +34 -23
  158. package/dist/components/form-control/select/Select.js.map +2 -2
  159. package/dist/components/form-control/select/SelectContext.d.ts +7 -7
  160. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  161. package/dist/components/form-control/select/SelectContext.js +1 -1
  162. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  163. package/dist/components/form-control/select/SelectItem.d.ts +4 -4
  164. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  165. package/dist/components/form-control/state-preset/StatePreset.js +8 -8
  166. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  167. package/dist/components/layout/FormTable.js +4 -4
  168. package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
  169. package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
  170. package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
  171. package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
  172. package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
  173. package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
  174. package/dist/components/layout/sidebar/SidebarContext.js +1 -1
  175. package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
  176. package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
  177. package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
  178. package/dist/components/layout/topbar/Topbar.d.ts +6 -6
  179. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  180. package/dist/components/layout/topbar/Topbar.js +11 -6
  181. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  182. package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
  183. package/dist/components/layout/topbar/TopbarContext.js +2 -2
  184. package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
  185. package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
  186. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  187. package/dist/components/layout/topbar/TopbarMenu.js +5 -1
  188. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  189. package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
  190. package/dist/directives/ripple.d.ts +5 -5
  191. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  192. package/dist/helpers/createAppStructure.js +7 -3
  193. package/dist/helpers/createAppStructure.js.map +1 -1
  194. package/dist/helpers/createHmrSafeContext.d.ts +3 -0
  195. package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
  196. package/dist/helpers/createHmrSafeContext.js +10 -0
  197. package/dist/helpers/createHmrSafeContext.js.map +6 -0
  198. package/dist/helpers/createSlotComponent.d.ts +3 -3
  199. package/dist/helpers/mergeStyles.d.ts +8 -8
  200. package/dist/hooks/createControllableSignal.d.ts +10 -10
  201. package/dist/hooks/createControllableStore.d.ts +6 -6
  202. package/dist/hooks/createIMEHandler.d.ts +7 -7
  203. package/dist/hooks/createMountTransition.d.ts +4 -4
  204. package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
  205. package/dist/hooks/createSelectionGroup.js +4 -3
  206. package/dist/hooks/createSelectionGroup.js.map +2 -2
  207. package/dist/hooks/createSlotSignal.d.ts +2 -2
  208. package/dist/hooks/useLocalStorage.d.ts +11 -11
  209. package/dist/hooks/useLogger.d.ts +1 -1
  210. package/dist/hooks/useLogger.d.ts.map +1 -1
  211. package/dist/hooks/useLogger.js +1 -1
  212. package/dist/hooks/useLogger.js.map +1 -1
  213. package/dist/hooks/useRouterLink.d.ts +10 -10
  214. package/dist/hooks/useRouterLink.d.ts.map +1 -1
  215. package/dist/index.d.ts +2 -1
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +2 -1
  218. package/dist/index.js.map +1 -1
  219. package/dist/providers/ClipboardProvider.d.ts +5 -5
  220. package/dist/providers/ConfigContext.d.ts +6 -6
  221. package/dist/providers/ConfigContext.js +2 -2
  222. package/dist/providers/ConfigContext.js.map +1 -1
  223. package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
  224. package/dist/providers/LoggerContext.d.ts +13 -13
  225. package/dist/providers/PwaUpdateProvider.d.ts +4 -4
  226. package/dist/providers/PwaUpdateProvider.js +2 -2
  227. package/dist/providers/PwaUpdateProvider.js.map +1 -1
  228. package/dist/providers/ServiceClientContext.d.ts +8 -8
  229. package/dist/providers/ServiceClientContext.d.ts.map +1 -1
  230. package/dist/providers/ServiceClientContext.js +1 -1
  231. package/dist/providers/ServiceClientContext.js.map +1 -1
  232. package/dist/providers/ServiceClientProvider.d.ts +6 -6
  233. package/dist/providers/ServiceClientProvider.js +7 -7
  234. package/dist/providers/ServiceClientProvider.js.map +1 -1
  235. package/dist/providers/SyncStorageContext.d.ts +14 -14
  236. package/dist/providers/SystemProvider.d.ts.map +1 -1
  237. package/dist/providers/SystemProvider.js +21 -16
  238. package/dist/providers/SystemProvider.js.map +2 -2
  239. package/dist/providers/ThemeContext.d.ts +20 -20
  240. package/dist/providers/ThemeContext.d.ts.map +1 -1
  241. package/dist/providers/ThemeContext.js +1 -1
  242. package/dist/providers/ThemeContext.js.map +1 -1
  243. package/dist/providers/i18n/I18nContext.d.ts +44 -0
  244. package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
  245. package/dist/providers/i18n/I18nContext.js +73 -0
  246. package/dist/providers/i18n/I18nContext.js.map +6 -0
  247. package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
  248. package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
  249. package/dist/providers/i18n/I18nContext.types.js +1 -0
  250. package/dist/providers/i18n/I18nContext.types.js.map +6 -0
  251. package/dist/providers/i18n/i18nUtils.d.ts +18 -0
  252. package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
  253. package/dist/providers/i18n/i18nUtils.js +25 -0
  254. package/dist/providers/i18n/i18nUtils.js.map +6 -0
  255. package/dist/providers/i18n/locales/en.d.ts +163 -0
  256. package/dist/providers/i18n/locales/en.d.ts.map +1 -0
  257. package/dist/providers/i18n/locales/en.js +165 -0
  258. package/dist/providers/i18n/locales/en.js.map +6 -0
  259. package/dist/providers/i18n/locales/ko.d.ts +163 -0
  260. package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
  261. package/dist/providers/i18n/locales/ko.js +165 -0
  262. package/dist/providers/i18n/locales/ko.js.map +6 -0
  263. package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
  264. package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
  265. package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
  266. package/dist/providers/shared-data/SharedDataContext.js +1 -1
  267. package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
  268. package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
  269. package/dist/providers/shared-data/SharedDataProvider.js +4 -4
  270. package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
  271. package/package.json +9 -8
  272. package/src/components/data/calendar/Calendar.tsx +10 -4
  273. package/src/components/data/kanban/Kanban.tsx +14 -14
  274. package/src/components/data/kanban/KanbanContext.ts +3 -3
  275. package/src/components/data/list/List.tsx +10 -10
  276. package/src/components/data/list/ListContext.ts +1 -1
  277. package/src/components/data/list/ListItem.styles.ts +8 -8
  278. package/src/components/data/list/ListItem.tsx +15 -15
  279. package/src/components/data/sheet/DataSheet.styles.ts +22 -22
  280. package/src/components/data/sheet/DataSheet.tsx +52 -48
  281. package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
  282. package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
  283. package/src/components/data/sheet/sheetUtils.ts +7 -7
  284. package/src/components/data/sheet/types.ts +16 -16
  285. package/src/components/disclosure/Collapse.tsx +11 -11
  286. package/src/components/disclosure/Dialog.tsx +60 -57
  287. package/src/components/disclosure/DialogContext.ts +26 -26
  288. package/src/components/disclosure/DialogInstanceContext.ts +7 -7
  289. package/src/components/disclosure/DialogProvider.tsx +5 -5
  290. package/src/components/disclosure/Dropdown.tsx +89 -75
  291. package/src/components/disclosure/Tabs.tsx +1 -1
  292. package/src/components/disclosure/dialogZIndex.ts +16 -11
  293. package/src/components/display/Echarts.tsx +4 -4
  294. package/src/components/features/address/AddressSearch.tsx +2 -2
  295. package/src/components/features/crud-detail/CrudDetail.tsx +34 -21
  296. package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
  297. package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
  298. package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
  299. package/src/components/features/crud-sheet/CrudSheet.tsx +52 -40
  300. package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
  301. package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
  302. package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
  303. package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
  304. package/src/components/features/crudRegistry.ts +60 -0
  305. package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
  306. package/src/components/features/permission-table/PermissionTable.tsx +70 -64
  307. package/src/components/features/shared-data/SharedDataSelect.tsx +24 -22
  308. package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
  309. package/src/components/features/shared-data/SharedDataSelectList.tsx +231 -59
  310. package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
  311. package/src/components/feedback/Progress.tsx +1 -1
  312. package/src/components/feedback/busy/BusyContainer.tsx +6 -6
  313. package/src/components/feedback/busy/BusyContext.ts +12 -12
  314. package/src/components/feedback/busy/BusyProvider.tsx +6 -6
  315. package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
  316. package/src/components/feedback/notification/NotificationBell.tsx +4 -4
  317. package/src/components/feedback/notification/NotificationContext.ts +28 -28
  318. package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
  319. package/src/components/feedback/print/PrintContext.ts +1 -1
  320. package/src/components/form-control/Button.tsx +1 -1
  321. package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
  322. package/src/components/form-control/Invalid.tsx +5 -5
  323. package/src/components/form-control/ThemeToggle.tsx +10 -10
  324. package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
  325. package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
  326. package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
  327. package/src/components/form-control/checkbox/Radio.tsx +2 -2
  328. package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
  329. package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
  330. package/src/components/form-control/combobox/Combobox.tsx +55 -55
  331. package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
  332. package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
  333. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
  334. package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
  335. package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
  336. package/src/components/form-control/editor/editor.css +5 -5
  337. package/src/components/form-control/field/DatePicker.tsx +39 -39
  338. package/src/components/form-control/field/DateTimePicker.tsx +38 -38
  339. package/src/components/form-control/field/Field.styles.ts +11 -11
  340. package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
  341. package/src/components/form-control/field/NumberInput.tsx +63 -63
  342. package/src/components/form-control/field/TextInput.tsx +48 -48
  343. package/src/components/form-control/field/Textarea.tsx +32 -32
  344. package/src/components/form-control/field/TimePicker.tsx +37 -37
  345. package/src/components/form-control/numpad/Numpad.tsx +26 -26
  346. package/src/components/form-control/select/Select.tsx +82 -86
  347. package/src/components/form-control/select/SelectContext.ts +8 -8
  348. package/src/components/form-control/select/SelectItem.tsx +5 -5
  349. package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
  350. package/src/components/layout/FormTable.tsx +4 -4
  351. package/src/components/layout/sidebar/Sidebar.tsx +8 -8
  352. package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
  353. package/src/components/layout/sidebar/SidebarContext.ts +8 -8
  354. package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
  355. package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
  356. package/src/components/layout/topbar/Topbar.tsx +15 -13
  357. package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
  358. package/src/components/layout/topbar/TopbarContext.ts +2 -2
  359. package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
  360. package/src/components/layout/topbar/TopbarUser.tsx +9 -9
  361. package/src/directives/ripple.ts +8 -8
  362. package/src/helpers/createAppStructure.ts +15 -8
  363. package/src/helpers/createHmrSafeContext.ts +8 -0
  364. package/src/helpers/createSlotComponent.ts +4 -4
  365. package/src/helpers/mergeStyles.ts +11 -11
  366. package/src/hooks/createControllableSignal.ts +11 -11
  367. package/src/hooks/createControllableStore.ts +8 -8
  368. package/src/hooks/createIMEHandler.ts +7 -7
  369. package/src/hooks/createMountTransition.ts +4 -4
  370. package/src/hooks/createSelectionGroup.tsx +5 -3
  371. package/src/hooks/createSlotSignal.ts +2 -2
  372. package/src/hooks/useLocalStorage.ts +13 -13
  373. package/src/hooks/useLogger.ts +2 -2
  374. package/src/hooks/useRouterLink.ts +15 -15
  375. package/src/index.ts +4 -3
  376. package/src/providers/ClipboardProvider.tsx +19 -19
  377. package/src/providers/ConfigContext.tsx +8 -8
  378. package/src/providers/ErrorLoggerProvider.tsx +3 -3
  379. package/src/providers/LoggerContext.tsx +13 -13
  380. package/src/providers/PwaUpdateProvider.tsx +6 -6
  381. package/src/providers/ServiceClientContext.ts +9 -9
  382. package/src/providers/ServiceClientProvider.tsx +15 -15
  383. package/src/providers/SyncStorageContext.tsx +15 -15
  384. package/src/providers/SystemProvider.tsx +15 -12
  385. package/src/providers/ThemeContext.tsx +26 -26
  386. package/src/providers/i18n/I18nContext.tsx +129 -0
  387. package/src/providers/i18n/I18nContext.types.ts +30 -0
  388. package/src/providers/i18n/i18nUtils.ts +38 -0
  389. package/src/providers/i18n/locales/en.ts +161 -0
  390. package/src/providers/i18n/locales/ko.ts +161 -0
  391. package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
  392. package/src/providers/shared-data/SharedDataContext.ts +29 -29
  393. package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
  394. package/src/styles/patterns.styles.ts +6 -6
  395. package/src/styles/tokens.styles.ts +5 -5
  396. package/tailwind.config.ts +1 -1
  397. package/tailwind.css +4 -4
  398. package/tests/components/data/List.spec.tsx +689 -0
  399. package/tests/components/data/Pagination.spec.tsx +336 -0
  400. package/tests/components/data/Table.spec.tsx +55 -0
  401. package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
  402. package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
  403. package/tests/components/disclosure/Collapse.spec.tsx +173 -0
  404. package/tests/components/disclosure/Dialog.spec.tsx +438 -0
  405. package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
  406. package/tests/components/disclosure/Dropdown.spec.tsx +333 -0
  407. package/tests/components/disclosure/Tabs.spec.tsx +220 -0
  408. package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
  409. package/tests/components/display/Alert.spec.tsx +47 -0
  410. package/tests/components/display/Barcode.spec.tsx +61 -0
  411. package/tests/components/display/Card.spec.tsx +41 -0
  412. package/tests/components/display/Link.spec.tsx +62 -0
  413. package/tests/components/display/Tag.spec.tsx +47 -0
  414. package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
  415. package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
  416. package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
  417. package/tests/components/features/crudRegistry.spec.ts +119 -0
  418. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
  419. package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
  420. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +448 -0
  421. package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
  422. package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
  423. package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
  424. package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
  425. package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
  426. package/tests/components/feedback/print/Print.spec.tsx +45 -0
  427. package/tests/components/form-control/Button.spec.tsx +119 -0
  428. package/tests/components/form-control/Invalid.spec.tsx +131 -0
  429. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
  430. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
  431. package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
  432. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
  433. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
  434. package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
  435. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
  436. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
  437. package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
  438. package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
  439. package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
  440. package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
  441. package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
  442. package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
  443. package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
  444. package/tests/components/form-control/select/Select.spec.tsx +676 -0
  445. package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
  446. package/tests/components/layout/FormGroup.spec.tsx +104 -0
  447. package/tests/components/layout/FormTable.spec.tsx +43 -0
  448. package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
  449. package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
  450. package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
  451. package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
  452. package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
  453. package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
  454. package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
  455. package/tests/directives/ripple.spec.tsx +130 -0
  456. package/tests/helpers/createAppStructure.spec.tsx +843 -0
  457. package/tests/helpers/mergeStyles.spec.ts +172 -0
  458. package/tests/hooks/createControllableSignal.spec.ts +194 -0
  459. package/tests/hooks/createIMEHandler.spec.ts +80 -0
  460. package/tests/hooks/createMountTransition.spec.ts +86 -0
  461. package/tests/hooks/useLocalStorage.spec.tsx +223 -0
  462. package/tests/hooks/useLogger.spec.tsx +116 -0
  463. package/tests/hooks/usePrint.spec.tsx +134 -0
  464. package/tests/hooks/useRouterLink.spec.tsx +183 -0
  465. package/tests/hooks/useSyncConfig.spec.tsx +304 -0
  466. package/tests/providers/ClipboardProvider.spec.tsx +20 -0
  467. package/tests/providers/ConfigContext.spec.tsx +42 -0
  468. package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
  469. package/tests/providers/LoggerContext.spec.tsx +76 -0
  470. package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
  471. package/tests/providers/ServiceClientContext.spec.tsx +88 -0
  472. package/tests/providers/SyncStorageContext.spec.tsx +77 -0
  473. package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
  474. package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
  475. package/tests/vitest-env.d.ts +1 -0
  476. package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
  477. package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
  478. package/dist/components/form-control/select-list/SelectList.js +0 -280
  479. package/dist/components/form-control/select-list/SelectList.js.map +0 -6
  480. package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
  481. package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
  482. package/dist/components/form-control/select-list/SelectListContext.js +0 -14
  483. package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
  484. package/docs/data-components.md +0 -782
  485. package/docs/disclosure.md +0 -254
  486. package/docs/display.md +0 -153
  487. package/docs/feedback.md +0 -238
  488. package/docs/form-controls.md +0 -1068
  489. package/docs/helpers.md +0 -54
  490. package/docs/hooks.md +0 -588
  491. package/docs/layout.md +0 -384
  492. package/docs/providers.md +0 -211
  493. package/docs/styling.md +0 -184
  494. package/src/components/form-control/select-list/SelectList.tsx +0 -385
  495. package/src/components/form-control/select-list/SelectListContext.ts +0 -23
@@ -6,15 +6,15 @@ export interface FormTableProps extends JSX.HTMLAttributes<HTMLTableElement> {}
6
6
 
7
7
  const baseClass = clsx(
8
8
  "border-separate border-spacing-0 border-0",
9
- // 모든 셀: 수직 중앙, 오른쪽/아래 패딩
9
+ // All cells: vertical center, right/bottom padding
10
10
  "[&_td]:align-middle [&_th]:align-middle",
11
11
  "[&_td]:pr-1.5 [&_th]:pr-1.5",
12
12
  "[&_td]:pb-1 [&_th]:pb-1",
13
- // 행의 마지막 셀: 오른쪽 패딩 제거
13
+ // Last cell in row: remove right padding
14
14
  "[&_tr>*:last-child]:pr-0",
15
- // 마지막 셀: 아래 패딩 제거
15
+ // Cells in last row: remove bottom padding
16
16
  "[&_tr:last-child>*]:pb-0",
17
- // th: 오른쪽 정렬, 콘텐츠 너비, 줄바꿈 방지
17
+ // th: right align, content width, prevent wrapping
18
18
  "[&_th]:w-0 [&_th]:whitespace-nowrap [&_th]:pl-1 [&_th]:text-right",
19
19
  );
20
20
 
@@ -38,18 +38,18 @@ export interface SidebarProps extends JSX.HTMLAttributes<HTMLElement> {
38
38
  }
39
39
 
40
40
  /**
41
- * 사이드바 본체 컴포넌트
41
+ * Sidebar body component
42
42
  *
43
43
  * @remarks
44
- * - SidebarContainer 내부에서 사용해야 (`position: absolute`로 컨테이너에 종속)
45
- * - Context에서 toggle 상태를 읽어 열림/닫힘 애니메이션 적용
46
- * - 토글 버튼 미포함 - useSidebarContext().setToggle로 외부에서 제어
44
+ * - Must be used inside SidebarContainer (`position: absolute` dependency)
45
+ * - Reads toggle state from Context to apply open/close animation
46
+ * - Does not include toggle button - controlled externally via useSidebarContext().setToggle
47
47
  *
48
48
  * @example
49
49
  * ```tsx
50
50
  * <Sidebar>
51
51
  * <Sidebar.User menus={userMenus}>
52
- * <span>사용자</span>
52
+ * <span>User</span>
53
53
  * </Sidebar.User>
54
54
  * <Sidebar.Menu menus={menuItems} />
55
55
  * </Sidebar>
@@ -66,10 +66,10 @@ const SidebarBase: ParentComponent<SidebarProps> = (props) => {
66
66
 
67
67
  const { toggle } = useSidebarContext();
68
68
 
69
- // Tailwind sm: breakpoint 감지
69
+ // Detect Tailwind sm: breakpoint
70
70
  const isDesktop = createMediaQuery(SM_MEDIA_QUERY);
71
71
 
72
- // 사이드바 열림 여부 계산
72
+ // Calculate sidebar open state
73
73
  const isOpen = createMemo(() => {
74
74
  if (isDesktop()) {
75
75
  return !toggle();
@@ -77,7 +77,7 @@ const SidebarBase: ParentComponent<SidebarProps> = (props) => {
77
77
  return toggle();
78
78
  });
79
79
 
80
- // transform 계산: 닫힘 왼쪽으로 숨김
80
+ // Calculate transform: hide left when closed
81
81
  const getTransform = () => {
82
82
  return isOpen() ? "translateX(0)" : "translateX(-100%)";
83
83
  };
@@ -12,6 +12,7 @@ import clsx from "clsx";
12
12
  import { twMerge } from "tailwind-merge";
13
13
  import { SidebarContext, SM_MEDIA_QUERY } from "./SidebarContext";
14
14
  import { mergeStyles } from "../../../helpers/mergeStyles";
15
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
15
16
 
16
17
  const backdropClass = clsx(
17
18
  "absolute",
@@ -31,17 +32,17 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
31
32
  }
32
33
 
33
34
  /**
34
- * 사이드바 컨테이너 컴포넌트
35
+ * Sidebar container component
35
36
  *
36
37
  * @remarks
37
- * - `position: relative`로 Sidebar를 포함하는 컨테이너 역할
38
- * - 부모 요소에 높이가 지정되어야 (`h-full` 사용)
39
- * - 콘텐츠 영역의 `overflow-auto`는 사용자가 직접 적용해야
40
- * - SidebarContext.Provider로 toggle 상태 공유
41
- * - toggle 상태는 메모리에만 유지 (페이지 새로고침 초기화)
42
- * - 데스크탑(640px+)에서 padding-left + transition으로 콘텐츠 확장/축소
43
- * - 모바일(640px-)에서 backdrop 렌더링 클릭 시 닫기
44
- * - 페이지 이동 모바일에서 자동 닫기
38
+ * - Acts as container with `position: relative` for Sidebar
39
+ * - Parent element must have height specified (use `h-full`)
40
+ * - Content area's `overflow-auto` must be applied by user
41
+ * - Shares toggle state via SidebarContext.Provider
42
+ * - Toggle state is kept in memory only (reset on page refresh)
43
+ * - On desktop (640px+): uses padding-left + transition to expand/collapse content
44
+ * - On mobile (640px-): renders backdrop and closes on click
45
+ * - Auto closes on mobile when page navigates
45
46
  *
46
47
  * @example
47
48
  * ```tsx
@@ -49,11 +50,11 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
49
50
  * <SidebarContainer>
50
51
  * <Sidebar>
51
52
  * <SidebarUser menus={userMenus}>
52
- * <span>사용자</span>
53
+ * <span>User</span>
53
54
  * </SidebarUser>
54
55
  * <SidebarMenu menus={menuItems} />
55
56
  * </Sidebar>
56
- * <main class="h-full overflow-auto">콘텐츠</main>
57
+ * <main class="h-full overflow-auto">Content</main>
57
58
  * </SidebarContainer>
58
59
  * </div>
59
60
  * ```
@@ -61,12 +62,13 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
61
62
  export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props) => {
62
63
  const [local, rest] = splitProps(props, ["children", "class", "style"]);
63
64
 
65
+ const i18n = useI18nOptional();
64
66
  const [toggle, setToggle] = createSignal(false);
65
67
 
66
- // Tailwind sm: breakpoint 감지
68
+ // Detect Tailwind sm: breakpoint
67
69
  const isDesktop = createMediaQuery(SM_MEDIA_QUERY);
68
70
 
69
- // 사이드바 열림 여부 계산
71
+ // Calculate sidebar open state
70
72
  const isOpen = createMemo(() => {
71
73
  if (isDesktop()) {
72
74
  return !toggle();
@@ -74,19 +76,19 @@ export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props)
74
76
  return toggle();
75
77
  });
76
78
 
77
- // backdrop 클릭 닫기
79
+ // Close on backdrop click
78
80
  const handleBackdropClick = () => {
79
81
  setToggle(false);
80
82
  };
81
83
 
82
- // 모바일에서 페이지 이동 자동 닫기
84
+ // Auto-close on page navigation on mobile
83
85
  useBeforeLeave(() => {
84
86
  if (!isDesktop() && toggle()) {
85
87
  setToggle(false);
86
88
  }
87
89
  });
88
90
 
89
- // 데스크탑에서 사이드바 열림 시 padding-left 적용 (16rem = w-64)
91
+ // Apply padding-left on desktop when sidebar is open (16rem = w-64)
90
92
  const getPaddingLeft = () => {
91
93
  if (isDesktop() && isOpen()) {
92
94
  return "16rem";
@@ -111,7 +113,7 @@ export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props)
111
113
  onClick={handleBackdropClick}
112
114
  onKeyDown={(e) => e.key === "Escape" && handleBackdropClick()}
113
115
  role="button"
114
- aria-label="사이드바 닫기"
116
+ aria-label={i18n?.t("sidebar.closeSidebar") ?? "Close sidebar"}
115
117
  tabIndex={0}
116
118
  />
117
119
  </Show>
@@ -1,18 +1,18 @@
1
1
  import { createContext, useContext, type Accessor, type Setter } from "solid-js";
2
2
 
3
3
  /**
4
- * Tailwind sm: breakpoint에 해당하는 미디어 쿼리
4
+ * Media query corresponding to Tailwind sm: breakpoint
5
5
  * @see tailwind.config.ts screens.sm (640px)
6
6
  */
7
7
  export const SM_MEDIA_QUERY = "(min-width: 640px)";
8
8
 
9
9
  /**
10
- * 사이드바 toggle 상태 공유 Context
10
+ * Sidebar toggle state shared Context
11
11
  *
12
12
  * @remarks
13
- * toggle 시맨틱:
14
- * - `toggle=false` (기본값): 데스크탑(640px+)에서 열림, 모바일(640px-)에서 닫힘
15
- * - `toggle=true`: 데스크탑(640px+)에서 닫힘, 모바일(640px-)에서 열림 (오버레이)
13
+ * toggle semantics:
14
+ * - `toggle=false` (default): open on desktop (640px+), closed on mobile (640px-)
15
+ * - `toggle=true`: closed on desktop (640px+), open on mobile (640px-) as overlay
16
16
  */
17
17
  export interface SidebarContextValue {
18
18
  toggle: Accessor<boolean>;
@@ -24,16 +24,16 @@ export const SidebarContext = createContext<SidebarContextValue>();
24
24
  export function useSidebarContext(): SidebarContextValue {
25
25
  const context = useContext(SidebarContext);
26
26
  if (!context) {
27
- throw new Error("useSidebarContext SidebarContainer 내부에서만 사용할 있습니다");
27
+ throw new Error("useSidebarContext can only be used inside SidebarContainer");
28
28
  }
29
29
  return context;
30
30
  }
31
31
 
32
32
  /**
33
- * SidebarContext를 선택적으로 사용 (Context 없으면 undefined 반환)
33
+ * Optionally use SidebarContext (returns undefined if no Context)
34
34
  *
35
35
  * @remarks
36
- * SidebarContainer 외부에서도 사용 가능한 컴포넌트(예: Topbar)에서 사용
36
+ * Used in components that can be used outside SidebarContainer (e.g., Topbar)
37
37
  */
38
38
  export function useSidebarContextOptional(): SidebarContextValue | undefined {
39
39
  return useContext(SidebarContext);
@@ -33,12 +33,12 @@ const headerClass = clsx(
33
33
 
34
34
  export interface SidebarMenuProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "children"> {
35
35
  /**
36
- * 메뉴 아이템 배열
36
+ * Menu items array
37
37
  */
38
38
  menus: AppMenu[];
39
39
  }
40
40
 
41
- // 내부 Context: 초기 펼침 상태 공유
41
+ // Internal Context: share initial open state
42
42
  interface MenuContextValue {
43
43
  initialOpenItems: Accessor<Set<AppMenu>>;
44
44
  }
@@ -46,25 +46,25 @@ interface MenuContextValue {
46
46
  const MenuContext = createContext<MenuContextValue>();
47
47
 
48
48
  /**
49
- * 사이드바 메뉴 컴포넌트
49
+ * Sidebar menu component
50
50
  *
51
51
  * @remarks
52
- * - "MENU" 헤더 고정 표시
53
- * - List/ListItem으로 재귀적 메뉴 렌더링
54
- * - pathname 정확 일치로 선택 상태 판단 (query string 무시)
55
- * - 선택된 메뉴의 부모들은 초기 렌더링 자동 펼침
56
- * - 외부 링크(://포함) 탭에서 열기
52
+ * - "MENU" header always shown
53
+ * - Recursive menu rendering with List/ListItem
54
+ * - Selection state determined by exact pathname match (ignores query string)
55
+ * - Parent items of selected menu automatically open on initial render
56
+ * - External links (containing ://) open in new tab
57
57
  *
58
58
  * @example
59
59
  * ```tsx
60
60
  * <SidebarMenu menus={[
61
- * { title: "대시보드", href: "/dashboard", icon: IconHome },
61
+ * { title: "Dashboard", href: "/dashboard", icon: IconHome },
62
62
  * {
63
- * title: "설정",
63
+ * title: "Settings",
64
64
  * icon: IconSettings,
65
65
  * children: [
66
- * { title: "프로필", href: "/settings/profile" },
67
- * { title: "보안", href: "/settings/security" },
66
+ * { title: "Profile", href: "/settings/profile" },
67
+ * { title: "Security", href: "/settings/security" },
68
68
  * ],
69
69
  * },
70
70
  * ]} />
@@ -75,7 +75,7 @@ export const SidebarMenu: Component<SidebarMenuProps> = (props) => {
75
75
 
76
76
  const location = useLocation();
77
77
 
78
- // 현재 pathname과 일치하는 메뉴의 부모들을 찾아 펼침 상태 계산
78
+ // Find parents of menu matching current pathname and calculate open state
79
79
  const findSelectedPath = (
80
80
  menus: AppMenu[],
81
81
  pathname: string,
@@ -94,11 +94,11 @@ export const SidebarMenu: Component<SidebarMenuProps> = (props) => {
94
94
  return null;
95
95
  };
96
96
 
97
- // pathname 변경에 반응하여 펼침 상태 재계산
97
+ // Recalculate open state in response to pathname change
98
98
  const initialOpenItems = createMemo(() => {
99
99
  const selectedPath = findSelectedPath(local.menus, location.pathname);
100
100
  return selectedPath
101
- ? new Set(selectedPath.slice(0, -1)) // 마지막 항목(선택된 메뉴)은 제외하고 부모들만 펼침
101
+ ? new Set(selectedPath.slice(0, -1)) // Open parents only, exclude last item (selected menu)
102
102
  : new Set<AppMenu>();
103
103
  });
104
104
 
@@ -128,18 +128,18 @@ const MenuItem: Component<MenuItemProps> = (props) => {
128
128
 
129
129
  const hasChildren = () => props.menu.children !== undefined && props.menu.children.length > 0;
130
130
 
131
- // 외부 링크 여부 확인
131
+ // Check if external link
132
132
  const isExternalLink = () => props.menu.href?.includes("://") ?? false;
133
133
 
134
- // 선택 상태
134
+ // Selection state
135
135
  const isSelected = () => props.menu.href === location.pathname;
136
136
 
137
- // 펼침 상태 계산 (object reference로 비교)
137
+ // Calculate open state (compare by object reference)
138
138
  const shouldBeOpen = () => menuContext.initialOpenItems().has(props.menu);
139
139
 
140
140
  const [open, setOpen] = createSignal(false);
141
141
 
142
- // pathname 변경에 반응하여 펼침 상태 업데이트
142
+ // Update open state in response to pathname change
143
143
  createEffect(() => {
144
144
  if (shouldBeOpen()) {
145
145
  setOpen(true);
@@ -40,44 +40,44 @@ export interface SidebarUserMenu {
40
40
 
41
41
  export interface SidebarUserProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onClick"> {
42
42
  /**
43
- * 사용자 이름 (필수)
43
+ * User name (required)
44
44
  */
45
45
  name: string;
46
46
 
47
47
  /**
48
- * 아바타 아이콘 (미입력 기본 사용자 아이콘)
48
+ * Avatar icon (defaults to user icon if not provided)
49
49
  */
50
50
  icon?: Component<TablerIconProps>;
51
51
 
52
52
  /**
53
- * 부가 정보 (이메일 등, 미입력 이름만 표시)
53
+ * Additional information (email, etc.; shows name only if not provided)
54
54
  */
55
55
  description?: string;
56
56
 
57
57
  /**
58
- * 드롭다운 메뉴 (있을 때만 클릭 가능)
58
+ * Dropdown menu (clickable only when provided)
59
59
  */
60
60
  menus?: SidebarUserMenu[];
61
61
  }
62
62
 
63
63
  /**
64
- * 사이드바 사용자 정보 컴포넌트
64
+ * Sidebar user information component
65
65
  *
66
66
  * @remarks
67
- * - name, icon, description props로 사용자 정보 표시
68
- * - icon 미입력 기본 사용자 아이콘 표시
69
- * - description 미입력 이름만 세로 중앙 정렬
70
- * - menus가 있을 때만 클릭 가능 ripple 효과 적용
71
- * - 클릭 드롭다운 메뉴 펼침/접힘
67
+ * - Displays user info via name, icon, description props
68
+ * - Shows default user icon if icon not provided
69
+ * - Shows name only with vertical centering if description not provided
70
+ * - Clickable and ripple effect apply only when menus provided
71
+ * - Click toggles dropdown menu
72
72
  *
73
73
  * @example
74
74
  * ```tsx
75
75
  * <SidebarUser
76
- * name="홍길동"
77
- * description="hong@example.com"
76
+ * name="John Doe"
77
+ * description="john@example.com"
78
78
  * menus={[
79
- * { title: "프로필", onClick: () => navigate("/profile") },
80
- * { title: "로그아웃", onClick: handleLogout },
79
+ * { title: "Profile", onClick: () => navigate("/profile") },
80
+ * { title: "Logout", onClick: handleLogout },
81
81
  * ]}
82
82
  * />
83
83
  * ```
@@ -5,6 +5,7 @@ import { Icon } from "../../display/Icon";
5
5
  import { twMerge } from "tailwind-merge";
6
6
  import { Button } from "../../form-control/Button";
7
7
  import { useSidebarContextOptional } from "../sidebar/SidebarContext";
8
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
8
9
  import { TopbarActions } from "./TopbarActions";
9
10
  import { TopbarContainer } from "./TopbarContainer";
10
11
  import { TopbarMenu } from "./TopbarMenu";
@@ -15,24 +16,24 @@ export type { TopbarMenuItem, TopbarMenuProps } from "./TopbarMenu";
15
16
  export type { TopbarUserMenu, TopbarUserProps } from "./TopbarUser";
16
17
 
17
18
  const baseClass = clsx(
18
- // 레이아웃
19
+ // Layout
19
20
  "flex",
20
21
  "flex-row",
21
22
  "gap-2",
22
23
  "items-center",
23
- // 크기
24
+ // Size
24
25
  "min-h-12",
25
26
  "px-2",
26
- // 배경/테두리
27
+ // Background/border
27
28
  "bg-white",
28
29
  "dark:bg-base-900",
29
30
  "border-b",
30
31
  "border-base-200",
31
32
  "dark:border-base-700",
32
- // 스크롤
33
+ // Scroll
33
34
  "overflow-x-auto",
34
35
  "overflow-y-hidden",
35
- // 기타
36
+ // Other
36
37
  "select-none",
37
38
  );
38
39
 
@@ -41,20 +42,20 @@ export interface TopbarProps extends JSX.HTMLAttributes<HTMLElement> {
41
42
  }
42
43
 
43
44
  /**
44
- * 상단바 본체 컴포넌트
45
+ * Topbar main component
45
46
  *
46
47
  * @remarks
47
- * - SidebarContext가 있을 경우 사이드바 토글 버튼 자동 표시
48
- * - SidebarContainer 내부에서 사용하면 토글 버튼이 나타남
49
- * - 단독 사용 토글 버튼 없이 순수 Topbar로 동작
48
+ * - Automatically shows sidebar toggle button if SidebarContext exists
49
+ * - Toggle button appears when used inside SidebarContainer
50
+ * - Acts as pure Topbar without toggle button when used standalone
50
51
  *
51
52
  * @example
52
53
  * ```tsx
53
54
  * <Topbar>
54
- * <h1 class="text-lg font-bold">앱 이름</h1>
55
+ * <h1 class="text-lg font-bold">App Name</h1>
55
56
  * <Topbar.Menu menus={menuItems} />
56
57
  * <div class="flex-1" />
57
- * <Topbar.User menus={userMenus}>사용자</Topbar.User>
58
+ * <Topbar.User menus={userMenus}>User</Topbar.User>
58
59
  * </Topbar>
59
60
  * ```
60
61
  */
@@ -68,8 +69,9 @@ interface TopbarComponent extends ParentComponent<TopbarProps> {
68
69
  const TopbarBase: ParentComponent<TopbarProps> = (props) => {
69
70
  const [local, rest] = splitProps(props, ["children", "class"]);
70
71
 
71
- // SidebarContext 선택적 사용 (Context 없으면 토글 버튼 미표시)
72
+ // Optional use of SidebarContext (toggle button not shown if Context doesn't exist)
72
73
  const sidebarContext = useSidebarContextOptional();
74
+ const i18n = useI18nOptional();
73
75
 
74
76
  const handleToggle = () => {
75
77
  sidebarContext?.setToggle((v) => !v);
@@ -80,7 +82,7 @@ const TopbarBase: ParentComponent<TopbarProps> = (props) => {
80
82
  return (
81
83
  <header {...rest} data-topbar class={getClassName()}>
82
84
  <Show when={sidebarContext}>
83
- <Button variant="ghost" onClick={handleToggle} class="p-2" aria-label="사이드바 토글">
85
+ <Button variant="ghost" onClick={handleToggle} class="p-2" aria-label={i18n?.t("topbar.toggleSidebar") ?? "Toggle sidebar"}>
84
86
  <Icon icon={IconMenu2} size="1.5em" />
85
87
  </Button>
86
88
  </Show>
@@ -10,21 +10,21 @@ export interface TopbarContainerProps extends JSX.HTMLAttributes<HTMLDivElement>
10
10
  }
11
11
 
12
12
  /**
13
- * Topbar + 콘텐츠 영역을 감싸는 레이아웃 컨테이너
13
+ * Layout container wrapping Topbar and content area
14
14
  *
15
15
  * @remarks
16
- * - `flex flex-col h-full` 구조로 Topbar 콘텐츠를 수직 배치
17
- * - TopbarContext.Provider로 actions 상태 공유
18
- * - 부모 요소에 높이가 지정되어야
16
+ * - Uses `flex flex-col h-full` structure to vertically layout Topbar and content
17
+ * - Shares actions state via TopbarContext.Provider
18
+ * - Parent element must have height specified
19
19
  *
20
20
  * @example
21
21
  * ```tsx
22
22
  * <TopbarContainer>
23
23
  * <Topbar>
24
- * <h1>앱 이름</h1>
24
+ * <h1>App Name</h1>
25
25
  * <TopbarMenu menus={menuItems} />
26
26
  * </Topbar>
27
- * <main class="flex-1 overflow-auto">콘텐츠</main>
27
+ * <main class="flex-1 overflow-auto">Content</main>
28
28
  * </TopbarContainer>
29
29
  * ```
30
30
  */
@@ -17,7 +17,7 @@ export const TopbarContext = createContext<TopbarContextValue>();
17
17
  export function useTopbarActionsAccessor(): Accessor<JSX.Element | undefined> {
18
18
  const context = useContext(TopbarContext);
19
19
  if (!context) {
20
- throw new Error("useTopbarActionsAccessor Topbar.Container 내부에서만 사용할 있습니다");
20
+ throw new Error("useTopbarActionsAccessor can only be used inside Topbar.Container");
21
21
  }
22
22
  return context.actions;
23
23
  }
@@ -25,7 +25,7 @@ export function useTopbarActionsAccessor(): Accessor<JSX.Element | undefined> {
25
25
  export function createTopbarActions(accessor: () => JSX.Element): void {
26
26
  const context = useContext(TopbarContext);
27
27
  if (!context) {
28
- throw new Error("createTopbarActions Topbar.Container 내부에서만 사용할 있습니다");
28
+ throw new Error("createTopbarActions can only be used inside Topbar.Container");
29
29
  }
30
30
 
31
31
  context.setActions(() => accessor());
@@ -16,6 +16,7 @@ import { Button } from "../../form-control/Button";
16
16
  import { Dropdown } from "../../disclosure/Dropdown";
17
17
  import { List } from "../../data/list/List";
18
18
  import { ListItem } from "../../data/list/ListItem";
19
+ import { useI18nOptional } from "../../../providers/i18n/I18nContext";
19
20
 
20
21
  const desktopNavBaseClass = clsx("hidden sm:flex", "flex-row gap-1", "items-center");
21
22
  const mobileWrapperClass = clsx("flex sm:hidden");
@@ -30,31 +31,31 @@ export interface TopbarMenuItem {
30
31
 
31
32
  export interface TopbarMenuProps extends Omit<JSX.HTMLAttributes<HTMLElement>, "children"> {
32
33
  /**
33
- * 메뉴 아이템 배열
34
+ * Menu items array
34
35
  */
35
36
  menus: TopbarMenuItem[];
36
37
  }
37
38
 
38
39
  /**
39
- * Topbar 드롭다운 메뉴 컴포넌트
40
+ * Topbar dropdown menu component
40
41
  *
41
42
  * @remarks
42
- * - children이 있는 항목: 클릭 드롭다운 표시
43
- * - children이 없는 항목: 클릭 바로 네비게이션
44
- * - 외부 링크(://포함) 탭에서 열기
45
- * - pathname 정확 일치로 선택 상태 판단
46
- * - 하위 메뉴는 List/ListItem으로 렌더링 (모든 계층 펼침)
43
+ * - Items with children: show dropdown on click
44
+ * - Items without children: navigate directly on click
45
+ * - External links (containing ://): open in new tab
46
+ * - Selection determined by exact pathname match
47
+ * - Submenus rendered with List/ListItem (all levels expanded)
47
48
  *
48
49
  * @example
49
50
  * ```tsx
50
51
  * <TopbarMenu menus={[
51
- * { title: "대시보드", href: "/dashboard", icon: IconHome },
52
+ * { title: "Dashboard", href: "/dashboard", icon: IconHome },
52
53
  * {
53
- * title: "메뉴1",
54
+ * title: "Menu 1",
54
55
  * icon: IconFolder,
55
56
  * children: [
56
- * { title: "서브메뉴1", href: "/menu1/sub1" },
57
- * { title: "서브메뉴2", href: "/menu1/sub2" },
57
+ * { title: "Submenu 1", href: "/menu1/sub1" },
58
+ * { title: "Submenu 2", href: "/menu1/sub2" },
58
59
  * ],
59
60
  * },
60
61
  * ]} />
@@ -63,21 +64,22 @@ export interface TopbarMenuProps extends Omit<JSX.HTMLAttributes<HTMLElement>, "
63
64
  export const TopbarMenu: Component<TopbarMenuProps> = (props) => {
64
65
  const [local, rest] = splitProps(props, ["menus", "class"]);
65
66
  const [mobileMenuOpen, setMobileMenuOpen] = createSignal(false);
67
+ const i18n = useI18nOptional();
66
68
 
67
69
  return (
68
70
  <>
69
- {/* 데스크탑 메뉴 (640px 이상에서만 표시) */}
71
+ {/* Desktop menu (shown only on 640px and above) */}
70
72
  <nav {...rest} data-topbar-menu class={twMerge(desktopNavBaseClass, local.class)}>
71
73
  <For each={local.menus}>{(menu) => <TopbarMenuButton menu={menu} />}</For>
72
74
  </nav>
73
75
 
74
- {/* 모바일 햄버거 (640px 미만에서만 표시) */}
76
+ {/* Mobile hamburger (shown only below 640px) */}
75
77
  <div class={mobileWrapperClass}>
76
78
  <Dropdown open={mobileMenuOpen()} onOpenChange={setMobileMenuOpen}>
77
79
  <Dropdown.Trigger>
78
80
  <Button
79
81
  variant="ghost"
80
- aria-label="메뉴"
82
+ aria-label={i18n?.t("topbarMenu.menu") ?? "Menu"}
81
83
  aria-haspopup="menu"
82
84
  aria-expanded={mobileMenuOpen()}
83
85
  >
@@ -120,7 +122,7 @@ const TopbarMenuButton: Component<TopbarMenuButtonProps> = (props) => {
120
122
  return false;
121
123
  };
122
124
 
123
- // 현재 메뉴 또는 하위 메뉴가 선택되었는지 확인 (createMemo로 캐싱)
125
+ // Check if current menu or submenu is selected (cached with createMemo)
124
126
  const isSelected = createMemo(() => {
125
127
  if (props.menu.href === location.pathname) return true;
126
128
  if (props.menu.children) {
@@ -200,7 +202,7 @@ const TopbarMenuDropdownItem: Component<TopbarMenuDropdownItemProps> = (props) =
200
202
  }
201
203
  props.onClose();
202
204
  }
203
- // href 없고 children 있는 경우 클릭해도 닫히지 않음
205
+ // if no href but has children, clicking doesn't close the menu
204
206
  };
205
207
 
206
208
  return (
@@ -18,31 +18,31 @@ export interface TopbarUserMenu {
18
18
 
19
19
  export interface TopbarUserProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onClick"> {
20
20
  /**
21
- * 드롭다운 메뉴 (있을 때만 드롭다운 표시)
21
+ * Dropdown menu (dropdown shown only when provided)
22
22
  */
23
23
  menus?: TopbarUserMenu[];
24
24
 
25
25
  /**
26
- * 사용자 정보 영역 (커스터마이징)
26
+ * User information area (customizable)
27
27
  */
28
28
  children: JSX.Element;
29
29
  }
30
30
 
31
31
  /**
32
- * Topbar 사용자 정보 컴포넌트
32
+ * Topbar user information component
33
33
  *
34
34
  * @remarks
35
- * - children으로 사용자 정보 표시 커스터마이징
36
- * - menus 있을 클릭 Dropdown으로 메뉴 표시
37
- * - Button ghost 스타일 사용
35
+ * - Customize user info display with children
36
+ * - When menus provided, click shows Dropdown menu
37
+ * - Uses Button's ghost style
38
38
  *
39
39
  * @example
40
40
  * ```tsx
41
41
  * <TopbarUser menus={[
42
- * { title: "프로필", onClick: () => navigate("/profile") },
43
- * { title: "로그아웃", onClick: handleLogout },
42
+ * { title: "Profile", onClick: () => navigate("/profile") },
43
+ * { title: "Logout", onClick: handleLogout },
44
44
  * ]}>
45
- * <span>사용자명</span>
45
+ * <span>Username</span>
46
46
  * </TopbarUser>
47
47
  * ```
48
48
  */