@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
@@ -18,6 +18,7 @@ import { twMerge } from "tailwind-merge";
18
18
  import { mergeStyles } from "../../helpers/mergeStyles";
19
19
  import { createSlotComponent } from "../../helpers/createSlotComponent";
20
20
  import { borderSubtle } from "../../styles/tokens.styles";
21
+ import { tabbable } from "tabbable";
21
22
 
22
23
  // --- DropdownContext (internal) ---
23
24
 
@@ -41,53 +42,55 @@ const DropdownContent = createSlotComponent(DropdownContext, (ctx) => ctx.setCon
41
42
 
42
43
  export interface DropdownProps {
43
44
  /**
44
- * 절대 위치 (컨텍스트 메뉴 등, minWidth 없음)
45
- * Trigger와 함께 사용 Trigger 기준 위치 계산
45
+ * Absolute position (for context menus, no minWidth)
46
+ * When used with Trigger, calculates position relative to Trigger
46
47
  */
47
48
  position?: { x: number; y: number };
48
49
 
49
50
  /**
50
- * 팝업 열림 상태
51
+ * Popup open state
51
52
  */
52
53
  open?: boolean;
53
54
 
54
55
  /**
55
- * 열림 상태 변경 콜백
56
+ * Callback when open state changes
56
57
  */
57
58
  onOpenChange?: (open: boolean) => void;
58
59
 
59
60
  /**
60
- * 팝업 최대 높이 (기본값: 300px), 초과 내부 스크롤
61
+ * Popup max height (default: 300px), scrolls internally if exceeded
61
62
  */
62
63
  maxHeight?: number;
63
64
 
64
65
  /**
65
- * 비활성화 (Trigger 클릭 무시)
66
+ * Disabled (Trigger click ignored)
66
67
  */
67
68
  disabled?: boolean;
68
69
 
69
70
  /**
70
- * 키보드 네비게이션 활성화 (Select 등에서 사용)
71
+ * Enable keyboard navigation (used in Select, etc)
71
72
  *
72
- * direction=down일 때:
73
- * - 트리거에서 ArrowDown -> focusable 아이템 포커스
74
- * - 아이템에서 ArrowUp -> 트리거 포커스
75
- * - 트리거에서 ArrowUp -> 닫기
73
+ * When direction=down:
74
+ * - ArrowDown from trigger -> focus first tabbable item in popup
75
+ * - ArrowUp/ArrowDown within popup -> navigate between tabbable items
76
+ * - ArrowUp from first tabbable -> focus trigger
77
+ * - ArrowUp from trigger -> close
76
78
  *
77
- * direction=up일 때:
78
- * - 트리거에서 ArrowUp -> 마지막 focusable 아이템 포커스
79
- * - 마지막 아이템에서 ArrowDown -> 트리거 포커스
80
- * - 트리거에서 ArrowDown -> 닫기
79
+ * When direction=up:
80
+ * - ArrowUp from trigger -> focus last tabbable item in popup
81
+ * - ArrowUp/ArrowDown within popup -> navigate between tabbable items
82
+ * - ArrowDown from last tabbable -> focus trigger
83
+ * - ArrowDown from trigger -> close
81
84
  */
82
85
  keyboardNav?: boolean;
83
86
 
84
87
  /**
85
- * 팝업에 적용할 커스텀 class
88
+ * Custom class for popup
86
89
  */
87
90
  class?: string;
88
91
 
89
92
  /**
90
- * 팝업에 적용할 커스텀 style
93
+ * Custom style for popup
91
94
  */
92
95
  style?: JSX.CSSProperties;
93
96
 
@@ -103,28 +106,28 @@ interface DropdownComponent extends ParentComponent<DropdownProps> {
103
106
  }
104
107
 
105
108
  /**
106
- * 드롭다운 팝업 컴포넌트
109
+ * Dropdown popup component
107
110
  *
108
- * Trigger/Content 슬롯 패턴으로 트리거와 컨텐츠를 분리합니다.
109
- * Trigger 클릭 auto-toggle되며, disabled prop으로 비활성화할 수 있습니다.
111
+ * Separates trigger and content using Trigger/Content slot pattern.
112
+ * Auto-toggles on Trigger click, can be disabled with disabled prop.
110
113
  *
111
114
  * @example
112
115
  * ```tsx
113
116
  * <Dropdown>
114
117
  * <Dropdown.Trigger>
115
- * <Button>열기</Button>
118
+ * <Button>Open</Button>
116
119
  * </Dropdown.Trigger>
117
120
  * <Dropdown.Content>
118
- * <div>팝업 내용</div>
121
+ * <div>Popup content</div>
119
122
  * </Dropdown.Content>
120
123
  * </Dropdown>
121
124
  * ```
122
125
  *
123
- * @example Context menu (Trigger 없이 position 사용)
126
+ * @example Context menu (position without Trigger)
124
127
  * ```tsx
125
128
  * <Dropdown position={{ x: 300, y: 200 }} open={true}>
126
129
  * <Dropdown.Content>
127
- * <div>메뉴</div>
130
+ * <div>Menu</div>
128
131
  * </Dropdown.Content>
129
132
  * </Dropdown>
130
133
  * ```
@@ -147,32 +150,32 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
147
150
  onChange: () => local.onOpenChange,
148
151
  });
149
152
 
150
- // toggle 함수 (disabled 체크 포함)
153
+ // Toggle function (includes disabled check)
151
154
  const toggle = () => {
152
155
  if (local.disabled) return;
153
156
  setOpen(!open());
154
157
  };
155
158
 
156
- // 슬롯 등록 시그널
159
+ // Slot registration signals
157
160
  const [triggerSlot, setTrigger] = createSlotSignal();
158
161
  const [contentSlot, setContent] = createSlotSignal();
159
162
 
160
- // Trigger wrapper ref (위치 계산에 필요)
163
+ // Trigger wrapper ref (needed for position calculation)
161
164
  let triggerRef: HTMLDivElement | undefined;
162
165
 
163
- // 팝업 ref
166
+ // Popup ref
164
167
  const [popupRef, setPopupRef] = createSignal<HTMLDivElement>();
165
168
 
166
- // 애니메이션 상태 (mount transition)
169
+ // Animation state (mount transition)
167
170
  const { mounted, animating, unmount } = createMountTransition(open);
168
171
 
169
- // 계산된 위치
172
+ // Computed position
170
173
  const [computedStyle, setComputedStyle] = createSignal<JSX.CSSProperties>({});
171
174
 
172
- // 방향 (위/아래)
175
+ // Direction (up/down)
173
176
  const [direction, setDirection] = createSignal<"down" | "up">("down");
174
177
 
175
- // 위치 계산 함수 추출
178
+ // Extract position calculation function
176
179
  const updatePosition = () => {
177
180
  const popup = popupRef();
178
181
  if (!popup) return;
@@ -184,13 +187,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
184
187
  const viewportHeight = window.innerHeight;
185
188
  const viewportWidth = window.innerWidth;
186
189
 
187
- // 위/아래 방향 결정 (화면 중앙 기준)
190
+ // Determine up/down direction (based on viewport center)
188
191
  const spaceBelow = viewportHeight - rect.bottom;
189
192
  const spaceAbove = rect.top;
190
193
  const openDown = spaceBelow >= spaceAbove;
191
194
  setDirection(openDown ? "down" : "up");
192
195
 
193
- // 좌/우 조정 (화면 밖으로 나가지 않도록) - 뷰포트 기준
196
+ // Adjust left/right (prevent off-screen) - relative to viewport
194
197
  const adjustedLeft = Math.min(rect.left, viewportWidth - popup.offsetWidth);
195
198
 
196
199
  style.left = `${Math.max(0, adjustedLeft)}px`;
@@ -205,13 +208,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
205
208
  const viewportHeight = window.innerHeight;
206
209
  const viewportWidth = window.innerWidth;
207
210
 
208
- // 위/아래 방향 결정
211
+ // Determine up/down direction
209
212
  const spaceBelow = viewportHeight - local.position.y;
210
213
  const spaceAbove = local.position.y;
211
214
  const openDown = spaceBelow >= spaceAbove;
212
215
  setDirection(openDown ? "down" : "up");
213
216
 
214
- // 좌/우 조정 - 뷰포트 기준
217
+ // Adjust left/right - relative to viewport
215
218
  const adjustedLeft = Math.min(local.position.x, viewportWidth - (popup.offsetWidth || 200));
216
219
  style.left = `${Math.max(0, adjustedLeft)}px`;
217
220
 
@@ -225,7 +228,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
225
228
  setComputedStyle(style);
226
229
  };
227
230
 
228
- // 마운트 위치 계산 + popup 크기 변경 재계산
231
+ // Calculate position on mount + recalculate when popup size changes
229
232
  createEffect(() => {
230
233
  if (!mounted()) return;
231
234
 
@@ -239,7 +242,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
239
242
  }
240
243
  });
241
244
 
242
- // 외부 클릭 감지 (pointerdown)
245
+ // Detect outside click (pointerdown)
243
246
  createEffect(() => {
244
247
  if (!open()) return;
245
248
 
@@ -247,13 +250,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
247
250
  const popup = popupRef();
248
251
  const target = e.target as Node;
249
252
 
250
- // 팝업 내부 클릭은 무시
253
+ // Ignore clicks inside popup
251
254
  if (popup?.contains(target)) return;
252
255
 
253
- // Trigger 내부 클릭도 무시
256
+ // Ignore clicks inside trigger
254
257
  if (triggerRef?.contains(target)) return;
255
258
 
256
- // 외부 클릭 -> 닫기
259
+ // Outside click -> close
257
260
  setOpen(false);
258
261
  };
259
262
 
@@ -261,7 +264,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
261
264
  onCleanup(() => document.removeEventListener("pointerdown", handlePointerDown));
262
265
  });
263
266
 
264
- // Tab 포커스 이동 감지 (focusout)
267
+ // Detect Tab key focus movement (focusout)
265
268
  createEffect(() => {
266
269
  if (!open()) return;
267
270
 
@@ -269,16 +272,16 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
269
272
  const popup = popupRef();
270
273
  const relatedTarget = e.relatedTarget as Node | null;
271
274
 
272
- // relatedTarget null이면 무시 (pointerdown 처리)
275
+ // Ignore if relatedTarget is null (pointerdown handles it)
273
276
  if (!relatedTarget) return;
274
277
 
275
- // 팝업 내부로 이동은 무시
278
+ // Ignore movement to popup
276
279
  if (popup?.contains(relatedTarget)) return;
277
280
 
278
- // Trigger 내부로 이동도 무시
281
+ // Ignore movement to trigger
279
282
  if (triggerRef?.contains(relatedTarget)) return;
280
283
 
281
- // 외부로 포커스 이동 -> 닫기
284
+ // Focus moved outside -> close
282
285
  setOpen(false);
283
286
  };
284
287
 
@@ -286,7 +289,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
286
289
  onCleanup(() => document.removeEventListener("focusout", handleFocusOut));
287
290
  });
288
291
 
289
- // Escape 키 감지
292
+ // Detect Escape key
290
293
  createEffect(() => {
291
294
  if (!open()) return;
292
295
 
@@ -301,11 +304,11 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
301
304
  onCleanup(() => document.removeEventListener("keydown", handleKeyDown));
302
305
  });
303
306
 
304
- // 키보드 네비게이션: 트리거용 핸들러
307
+ // Keyboard navigation: handler for trigger
305
308
  const handleTriggerKeyDown = (e: KeyboardEvent) => {
306
309
  if (!local.keyboardNav) return;
307
310
 
308
- // 닫혀있을 때: ArrowUp/ArrowDown으로 열기
311
+ // When closed: open with ArrowUp/ArrowDown
309
312
  if (!open()) {
310
313
  if (e.key === "ArrowDown" || e.key === "ArrowUp") {
311
314
  e.preventDefault();
@@ -314,16 +317,12 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
314
317
  return;
315
318
  }
316
319
 
317
- // 열려있을 때: direction에 따른 처리
320
+ // When open: handle based on direction
318
321
  const popup = popupRef();
319
322
  if (!popup) return;
320
323
 
321
324
  const dir = direction();
322
- const focusables = [
323
- ...popup.querySelectorAll<HTMLElement>(
324
- '[tabindex]:not([tabindex="-1"]), button, [data-list-item]',
325
- ),
326
- ];
325
+ const focusables = tabbable(popup);
327
326
 
328
327
  if (dir === "down") {
329
328
  if (e.key === "ArrowDown" && focusables.length > 0) {
@@ -345,46 +344,60 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
345
344
  }
346
345
  };
347
346
 
348
- // 키보드 네비게이션: 팝업용 핸들러
347
+ // Keyboard navigation: handler for popup
349
348
  const handlePopupKeyDown = (e: KeyboardEvent) => {
350
349
  if (!local.keyboardNav) return;
351
350
 
352
- // List 등에서 이미 처리된 이벤트는 무시
351
+ // Ignore events already handled (e.g., by List)
353
352
  if (e.defaultPrevented) return;
354
353
 
355
354
  if (!triggerRef) return;
356
355
 
356
+ const popup = popupRef();
357
+ if (!popup) return;
358
+
357
359
  const dir = direction();
360
+ const allTabbable = tabbable(popup);
361
+ const current = (document.activeElement ?? e.target) as HTMLElement;
362
+ const currentIdx = allTabbable.indexOf(current);
358
363
 
359
- // 팝업에서 ArrowUp/ArrowDown이 처리되지 않았다면 (첫/마지막 아이템)
360
- // 트리거로 포커스 이동
361
- if (dir === "down" && e.key === "ArrowUp") {
362
- e.preventDefault();
363
- triggerRef.focus();
364
- } else if (dir === "up" && e.key === "ArrowDown") {
365
- e.preventDefault();
366
- triggerRef.focus();
364
+ if (e.key === "ArrowUp") {
365
+ if (currentIdx > 0) {
366
+ e.preventDefault();
367
+ allTabbable[currentIdx - 1].focus();
368
+ } else if (dir === "down") {
369
+ e.preventDefault();
370
+ triggerRef.focus();
371
+ }
372
+ } else if (e.key === "ArrowDown") {
373
+ if (currentIdx >= 0 && currentIdx < allTabbable.length - 1) {
374
+ e.preventDefault();
375
+ allTabbable[currentIdx + 1].focus();
376
+ } else if (dir === "up") {
377
+ e.preventDefault();
378
+ triggerRef.focus();
379
+ }
367
380
  }
368
381
  };
369
382
 
370
- // 스크롤 감지
383
+ // Detect scroll
371
384
  createEffect(() => {
372
385
  if (!open()) return;
373
386
 
374
387
  const handleScroll = (e: Event) => {
375
- // 팝업 내부 스크롤은 무시
388
+ // Ignore scroll inside popup
376
389
  const popup = popupRef();
377
390
  if (popup?.contains(e.target as Node)) return;
378
391
 
379
392
  setOpen(false);
380
393
  };
381
394
 
382
- // capture로 모든 스크롤 감지
395
+ // Detect all scroll events with capture
383
396
  document.addEventListener("scroll", handleScroll, { capture: true });
384
397
  onCleanup(() => document.removeEventListener("scroll", handleScroll, { capture: true }));
385
398
  });
386
399
 
387
- // resize 감지 (뷰포트 크기 변경 닫기)
400
+ // Detect resize (close when viewport size changes)
388
401
  createEffect(() => {
389
402
  if (!open()) return;
390
403
 
@@ -396,20 +409,20 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
396
409
  onCleanup(() => window.removeEventListener("resize", handleResize));
397
410
  });
398
411
 
399
- // transitionend 이벤트 처리
412
+ // Handle transitionend event
400
413
  const handleTransitionEnd = (e: TransitionEvent) => {
401
- // opacity 전환 완료 시에만 처리
414
+ // Only handle when opacity transition completes
402
415
  if (e.propertyName !== "opacity") return;
403
416
 
404
417
  if (!open()) {
405
- // 닫힘 애니메이션 완료 -> DOM에서 제거
418
+ // Closing animation complete -> remove from DOM
406
419
  unmount();
407
420
  }
408
421
  };
409
422
 
410
423
  const maxHeight = () => local.maxHeight ?? 300;
411
424
 
412
- // 애니메이션 클래스 (opacity transform만 transition, 위치 속성은 제외)
425
+ // Animation class (only transition opacity and transform, not position properties)
413
426
  const animationClass = () => {
414
427
  const base = "transition-[opacity,transform] duration-150 ease-out";
415
428
  const visible = animating();
@@ -426,12 +439,13 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
426
439
  <DropdownContext.Provider value={{ toggle, setTrigger, setContent }}>
427
440
  {local.children}
428
441
 
429
- {/* Trigger 슬롯 렌더링 (wrapper div에 click/keyboard handler 부착) */}
442
+ {/* Render trigger slot (attach click/keyboard handlers to wrapper div) */}
430
443
  <Show when={triggerSlot()}>
431
444
  <div
432
445
  ref={(el) => {
433
446
  triggerRef = el;
434
447
  }}
448
+ tabIndex={-1}
435
449
  data-dropdown-trigger
436
450
  onClick={toggle}
437
451
  onKeyDown={handleTriggerKeyDown}
@@ -440,7 +454,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
440
454
  </div>
441
455
  </Show>
442
456
 
443
- {/* Content 슬롯: Portal + 팝업 */}
457
+ {/* Content slot: Portal + popup */}
444
458
  <Show when={mounted()}>
445
459
  <Portal>
446
460
  <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,28 @@ 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
  }
49
+
50
+ /** Get the topmost (front-most) Dialog element, or null if none are open */
51
+ export function getTopmostDialog(): HTMLElement | null {
52
+ return stack.length > 0 ? stack[stack.length - 1] : null;
53
+ }
@@ -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;