@sellmate/design-system 1.28.0 → 1.31.0

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 (467) hide show
  1. package/dist/cjs/design-system.cjs.js +2 -2
  2. package/dist/cjs/{index-D12oddge.js → index-Jr8OU0y9.js} +1 -15
  3. package/dist/cjs/loader.cjs.js +2 -2
  4. package/dist/cjs/sd-action-modal.cjs.entry.js +2 -2
  5. package/dist/cjs/sd-badge.cjs.entry.js +2 -2
  6. package/dist/cjs/sd-barcode-input.cjs.entry.js +2 -2
  7. package/dist/cjs/sd-button_2.cjs.entry.js +3 -3
  8. package/dist/cjs/sd-calendar_2.cjs.entry.js +8 -9
  9. package/dist/cjs/sd-callout.cjs.entry.js +2 -2
  10. package/dist/cjs/sd-card.cjs.entry.js +2 -2
  11. package/dist/cjs/sd-checkbox.cjs.entry.js +5 -5
  12. package/dist/cjs/sd-chip-input.cjs.entry.js +22 -17
  13. package/dist/cjs/sd-chip.cjs.entry.js +7 -7
  14. package/dist/cjs/sd-circle-progress.cjs.entry.js +4 -4
  15. package/dist/cjs/sd-confirm-modal_2.cjs.entry.js +33 -36
  16. package/dist/cjs/sd-date-box.cjs.entry.js +1 -1
  17. package/dist/cjs/{component.datepicker-CUQbDSku.js → sd-date-picker.config-CgyNxY03.js} +64 -0
  18. package/dist/cjs/{sd-date-picker_7.cjs.entry.js → sd-date-picker_8.cjs.entry.js} +446 -47
  19. package/dist/cjs/sd-date-range-picker-calendar.cjs.entry.js +162 -12
  20. package/dist/cjs/sd-divider.cjs.entry.js +3 -3
  21. package/dist/cjs/sd-dropdown-button.cjs.entry.js +2 -2
  22. package/dist/cjs/sd-field_3.cjs.entry.js +51 -52
  23. package/dist/cjs/sd-form.cjs.entry.js +1 -1
  24. package/dist/cjs/sd-ghost-button_3.cjs.entry.js +14 -10
  25. package/dist/cjs/sd-guide.cjs.entry.js +2 -2
  26. package/dist/cjs/sd-key-value-table.cjs.entry.js +88 -18
  27. package/dist/cjs/sd-linear-progress.cjs.entry.js +3 -3
  28. package/dist/cjs/sd-loading-container.cjs.entry.js +3 -3
  29. package/dist/cjs/sd-modal-container.cjs.entry.js +16 -2
  30. package/dist/cjs/sd-pagination.cjs.entry.js +173 -0
  31. package/dist/cjs/sd-popover.cjs.entry.js +134 -44
  32. package/dist/cjs/sd-popup.cjs.entry.js +3 -3
  33. package/dist/cjs/sd-radio-button.cjs.entry.js +3 -3
  34. package/dist/cjs/sd-radio.cjs.entry.js +4 -2
  35. package/dist/cjs/{sd-select_3.cjs.entry.js → sd-select-list-item_4.cjs.entry.js} +294 -315
  36. package/dist/cjs/sd-switch.cjs.entry.js +13 -3
  37. package/dist/cjs/sd-tabs.cjs.entry.js +2 -2
  38. package/dist/cjs/sd-text-link.cjs.entry.js +4 -4
  39. package/dist/cjs/sd-time-picker-selector.cjs.entry.js +179 -0
  40. package/dist/cjs/sd-time-picker-trigger.cjs.entry.js +75 -0
  41. package/dist/cjs/sd-time-picker.cjs.entry.js +173 -0
  42. package/dist/cjs/sd-time-picker.config-C7REB08L.js +156 -0
  43. package/dist/cjs/sd-time-range-picker-selector.cjs.entry.js +219 -0
  44. package/dist/cjs/sd-time-range-picker.cjs.entry.js +204 -0
  45. package/dist/cjs/sd-toast-container.cjs.entry.js +2 -2
  46. package/dist/cjs/sd-toast.cjs.entry.js +3 -3
  47. package/dist/cjs/sd-toggle.cjs.entry.js +2 -2
  48. package/dist/cjs/{system-MjrAugX-.js → system-B4KkVpu2.js} +1 -7
  49. package/dist/cjs/{tooltipArrow-Dda4ik0V.js → tooltipArrow-BlrFItn5.js} +1 -1
  50. package/dist/cjs/useDatePicker-j06ymWZ_.js +103 -0
  51. package/dist/collection/collection-manifest.json +8 -8
  52. package/dist/collection/components/sd-action-modal/sd-action-modal.js +1 -1
  53. package/dist/collection/components/sd-badge/sd-badge.js +1 -1
  54. package/dist/collection/components/sd-barcode-input/sd-barcode-input.js +1 -1
  55. package/dist/collection/components/sd-button/sd-button.js +2 -2
  56. package/dist/collection/components/sd-calendar/sd-calendar.js +3 -3
  57. package/dist/collection/components/sd-callout/sd-callout.js +1 -1
  58. package/dist/collection/components/sd-card/sd-card.js +1 -1
  59. package/dist/collection/components/sd-checkbox/sd-checkbox.js +8 -8
  60. package/dist/collection/components/sd-chip/sd-chip.js +8 -8
  61. package/dist/collection/components/sd-chip-input/sd-chip-input.css +3 -0
  62. package/dist/collection/components/sd-chip-input/sd-chip-input.js +43 -17
  63. package/dist/collection/components/sd-circle-progress/sd-circle-progress.css +1 -0
  64. package/dist/collection/components/sd-circle-progress/sd-circle-progress.js +1 -1
  65. package/dist/collection/components/sd-confirm-modal/sd-confirm-modal.css +3 -0
  66. package/dist/collection/components/sd-confirm-modal/sd-confirm-modal.js +35 -59
  67. package/dist/collection/components/sd-date-picker/sd-date-picker-trigger/sd-date-picker-trigger.js +2 -2
  68. package/dist/collection/components/sd-date-picker/sd-date-picker.js +23 -2
  69. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker-calendar/sd-date-range-picker-calendar.css +75 -0
  70. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker-calendar/sd-date-range-picker-calendar.js +152 -6
  71. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker.config.js +27 -0
  72. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker.js +59 -3
  73. package/dist/collection/components/sd-divider/sd-divider.js +1 -1
  74. package/dist/collection/components/sd-field/sd-field.css +4 -0
  75. package/dist/collection/components/sd-field/sd-field.js +58 -5
  76. package/dist/collection/components/sd-file-picker/sd-file-picker.config.js +17 -10
  77. package/dist/collection/components/sd-file-picker/sd-file-picker.js +46 -16
  78. package/dist/collection/components/sd-floating-portal/sd-floating-portal.js +1 -1
  79. package/dist/collection/components/sd-ghost-button/sd-ghost-button.js +27 -3
  80. package/dist/collection/components/sd-input/sd-input.js +4 -4
  81. package/dist/collection/components/sd-key-value-table/sd-key-value-table.config.js +2 -0
  82. package/dist/collection/components/sd-key-value-table/sd-key-value-table.css +5 -1
  83. package/dist/collection/components/sd-key-value-table/sd-key-value-table.js +65 -15
  84. package/dist/collection/components/sd-linear-progress/sd-linear-progress.js +1 -1
  85. package/dist/collection/components/sd-loading-container/sd-loading-container.js +2 -2
  86. package/dist/collection/components/sd-loading-modal/sd-loading-modal.js +1 -1
  87. package/dist/collection/components/sd-modal-container/sd-modal-container.js +15 -1
  88. package/dist/collection/components/sd-number-input/sd-number-input.js +58 -7
  89. package/dist/collection/components/sd-pagination/sd-pagination.js +3 -3
  90. package/dist/collection/components/sd-popover/sd-popover.config.js +41 -0
  91. package/dist/collection/components/sd-popover/sd-popover.js +189 -191
  92. package/dist/collection/components/sd-popup/sd-popup.js +1 -1
  93. package/dist/collection/components/sd-portal/sd-portal.js +1 -1
  94. package/dist/collection/components/sd-radio/sd-radio.js +25 -4
  95. package/dist/collection/components/sd-radio-button/sd-radio-button.js +6 -6
  96. package/dist/collection/components/sd-radio-group/sd-radio-group.js +7 -7
  97. package/dist/collection/components/sd-select/sd-select-list-item/sd-select-list-item.js +2 -2
  98. package/dist/collection/components/sd-select/sd-select-list-item-search/sd-select-list-item-search.js +4 -4
  99. package/dist/collection/components/sd-select/sd-select-listbox/sd-select-listbox.js +2 -2
  100. package/dist/collection/components/sd-select/sd-select-trigger/sd-select-trigger.js +2 -2
  101. package/dist/collection/components/sd-select/sd-select.js +4 -4
  102. package/dist/collection/components/sd-switch/sd-switch.js +54 -3
  103. package/dist/collection/components/sd-tabs/sd-tabs.js +1 -1
  104. package/dist/collection/components/sd-tag/sd-tag.js +7 -8
  105. package/dist/collection/components/sd-text-link/sd-text-link.js +3 -3
  106. package/dist/collection/components/sd-textarea/sd-textarea.js +1 -1
  107. package/dist/collection/components/sd-time-picker/sd-time-picker-selector/sd-time-picker-selector.css +87 -0
  108. package/dist/collection/components/sd-time-picker/sd-time-picker-selector/sd-time-picker-selector.js +266 -0
  109. package/dist/collection/components/sd-time-picker/sd-time-picker-trigger/sd-time-picker-trigger.css +38 -0
  110. package/dist/collection/components/sd-time-picker/sd-time-picker-trigger/sd-time-picker-trigger.js +216 -0
  111. package/dist/collection/components/sd-time-picker/sd-time-picker.config.js +78 -0
  112. package/dist/collection/components/sd-time-picker/sd-time-picker.css +12 -0
  113. package/dist/collection/components/sd-time-picker/sd-time-picker.js +761 -0
  114. package/dist/collection/components/sd-time-range-picker/sd-time-range-picker-selector/sd-time-range-picker-selector.css +102 -0
  115. package/dist/collection/components/sd-time-range-picker/sd-time-range-picker-selector/sd-time-range-picker-selector.js +338 -0
  116. package/dist/collection/components/sd-time-range-picker/sd-time-range-picker.config.js +23 -0
  117. package/dist/collection/components/sd-time-range-picker/sd-time-range-picker.css +12 -0
  118. package/dist/collection/components/sd-time-range-picker/sd-time-range-picker.js +809 -0
  119. package/dist/collection/components/sd-toast/sd-toast.js +2 -2
  120. package/dist/collection/components/sd-toast-container/sd-toast-container.js +1 -1
  121. package/dist/collection/components/sd-toggle/sd-toggle.js +1 -1
  122. package/dist/collection/components/sd-tooltip/sd-tooltip.js +36 -189
  123. package/dist/components/index.js +1 -1
  124. package/dist/components/p-1DsQj3tv.js +1 -0
  125. package/dist/components/p-2g4jlJ3i.js +1 -0
  126. package/dist/components/{p-BE6ymp9E.js → p-6U1qyU5A.js} +1 -1
  127. package/dist/components/{p-1i6Q61TF.js → p-B-EV9bey.js} +1 -1
  128. package/dist/components/p-B887QQl2.js +1 -0
  129. package/dist/components/{p-BysikR_g.js → p-BPzs63D8.js} +1 -1
  130. package/dist/components/p-Bth2l1cy.js +1 -0
  131. package/dist/components/{p-CTDPl65u.js → p-BvJ14GuJ.js} +1 -1
  132. package/dist/components/p-Bxv2AFOb.js +1 -0
  133. package/dist/components/p-C6o10dl7.js +1 -0
  134. package/dist/components/p-C6wuKkUq.js +1 -0
  135. package/dist/components/{p-BAVsc1Ml.js → p-C9IKm4j5.js} +1 -1
  136. package/dist/components/{p-BuADVB78.js → p-CH9dgzTr.js} +1 -1
  137. package/dist/components/p-CKV2W-zU.js +1 -0
  138. package/dist/components/p-CTCt17CE.js +1 -0
  139. package/dist/components/{p-laVsm9VM.js → p-CghFB91T.js} +1 -1
  140. package/dist/components/p-Ckr9iuVb.js +1 -0
  141. package/dist/components/p-ClbD4Gsr.js +1 -0
  142. package/dist/components/p-CmCOLnc0.js +1 -0
  143. package/dist/components/{p-DNbbdJIc.js → p-CwzkplrI.js} +1 -1
  144. package/dist/components/p-CzJ9g73f.js +1 -0
  145. package/dist/components/p-D8yhjm54.js +1 -0
  146. package/dist/components/p-D9qp3o5Y.js +1 -0
  147. package/dist/components/{p-Bgxca9o5.js → p-DE8Ws9As.js} +1 -1
  148. package/dist/components/p-DMm_GeZC.js +1 -0
  149. package/dist/components/{p-BnI9HUOv.js → p-DOfLrOEu.js} +1 -1
  150. package/dist/components/{p-vtuEYpc6.js → p-DSWD8udu.js} +1 -1
  151. package/dist/components/{p-BKV1WAFb.js → p-DWnuCSqC.js} +1 -1
  152. package/dist/components/p-DYjaQs6e.js +1 -0
  153. package/dist/components/{p-pwGA4sDj.js → p-DasiqnrU.js} +1 -1
  154. package/dist/components/p-Dc9g3-5z.js +1 -0
  155. package/dist/components/{p-ClD0nx1l.js → p-DnlLqzGM.js} +1 -1
  156. package/dist/components/p-DsZwiWiU.js +1 -0
  157. package/dist/components/{p-IDlLs_KA.js → p-FGII920I.js} +1 -1
  158. package/dist/components/p-Hjv7LqkN.js +1 -0
  159. package/dist/components/{p-CHHlQceE.js → p-In6mljvA.js} +1 -1
  160. package/dist/components/p-OnBLxJAP.js +1 -0
  161. package/dist/components/p-SYnTIeiO.js +1 -0
  162. package/dist/{design-system/p-D2S9Zafz.js → components/p-bXzpfkfN.js} +1 -1
  163. package/dist/components/p-mcbwNjNT.js +1 -0
  164. package/dist/components/p-qZxAQy4p.js +1 -0
  165. package/dist/components/sd-action-modal.js +1 -1
  166. package/dist/components/sd-badge.js +1 -1
  167. package/dist/components/sd-barcode-input.js +1 -1
  168. package/dist/components/sd-button.js +1 -1
  169. package/dist/components/sd-calendar.js +1 -1
  170. package/dist/components/sd-callout.js +1 -1
  171. package/dist/components/sd-card.js +1 -1
  172. package/dist/components/sd-checkbox.js +1 -1
  173. package/dist/components/sd-chip-input.js +1 -1
  174. package/dist/components/sd-chip.js +1 -1
  175. package/dist/components/sd-circle-progress.js +1 -1
  176. package/dist/components/sd-confirm-modal.js +1 -1
  177. package/dist/components/sd-date-box.js +1 -1
  178. package/dist/components/sd-date-picker-trigger.js +1 -1
  179. package/dist/components/sd-date-picker.js +1 -1
  180. package/dist/components/sd-date-range-picker-calendar.js +1 -1
  181. package/dist/components/sd-date-range-picker.js +1 -1
  182. package/dist/components/sd-divider.js +1 -1
  183. package/dist/components/sd-dropdown-button.js +1 -1
  184. package/dist/components/sd-field.js +1 -1
  185. package/dist/components/sd-file-picker.js +1 -1
  186. package/dist/components/sd-floating-portal.js +1 -1
  187. package/dist/components/sd-form.js +1 -1
  188. package/dist/components/sd-ghost-button.js +1 -1
  189. package/dist/components/sd-guide.js +1 -1
  190. package/dist/components/sd-icon.js +1 -1
  191. package/dist/components/sd-input.js +1 -1
  192. package/dist/components/sd-key-value-table.js +1 -1
  193. package/dist/components/sd-linear-progress.js +1 -1
  194. package/dist/components/sd-loading-container.js +1 -1
  195. package/dist/components/sd-loading-modal.js +1 -1
  196. package/dist/components/sd-modal-container.js +1 -1
  197. package/dist/components/sd-number-input.js +1 -1
  198. package/dist/components/sd-pagination.js +1 -1
  199. package/dist/components/sd-popover.js +1 -1
  200. package/dist/components/sd-popup.js +1 -1
  201. package/dist/components/sd-portal.js +1 -1
  202. package/dist/components/sd-radio-button.js +1 -1
  203. package/dist/components/sd-radio-group.js +1 -1
  204. package/dist/components/sd-radio.js +1 -1
  205. package/dist/components/sd-select-list-item-search.js +1 -1
  206. package/dist/components/sd-select-list-item.js +1 -1
  207. package/dist/components/sd-select-listbox.js +1 -1
  208. package/dist/components/sd-select-trigger.js +1 -1
  209. package/dist/components/sd-select.js +1 -1
  210. package/dist/components/sd-switch.js +1 -1
  211. package/dist/components/sd-tabs.js +1 -1
  212. package/dist/components/sd-tag.js +1 -1
  213. package/dist/components/sd-text-link.js +1 -1
  214. package/dist/components/sd-textarea.js +1 -1
  215. package/dist/components/sd-time-picker-selector.d.ts +11 -0
  216. package/dist/components/sd-time-picker-selector.js +1 -0
  217. package/dist/components/{sd-table.d.ts → sd-time-picker-trigger.d.ts} +4 -4
  218. package/dist/components/sd-time-picker-trigger.js +1 -0
  219. package/dist/components/{sd-thead.d.ts → sd-time-picker.d.ts} +4 -4
  220. package/dist/components/sd-time-picker.js +1 -0
  221. package/dist/components/sd-time-range-picker-selector.d.ts +11 -0
  222. package/dist/components/sd-time-range-picker-selector.js +1 -0
  223. package/dist/components/{sd-td.d.ts → sd-time-range-picker.d.ts} +4 -4
  224. package/dist/components/sd-time-range-picker.js +1 -0
  225. package/dist/components/sd-toast-container.js +1 -1
  226. package/dist/components/sd-toast.js +1 -1
  227. package/dist/components/sd-toggle.js +1 -1
  228. package/dist/components/sd-tooltip.js +1 -1
  229. package/dist/design-system/design-system.css +1 -1
  230. package/dist/design-system/design-system.esm.js +1 -1
  231. package/dist/design-system/{p-750a9112.entry.js → p-129b6330.entry.js} +1 -1
  232. package/dist/design-system/p-15f43b9b.entry.js +1 -0
  233. package/dist/design-system/p-16b9eac4.entry.js +1 -0
  234. package/dist/design-system/{p-0b8c86c3.entry.js → p-1858636f.entry.js} +1 -1
  235. package/dist/design-system/{p-a938ffee.entry.js → p-21672bb8.entry.js} +1 -1
  236. package/dist/design-system/{p-3b3a46cd.entry.js → p-219288ef.entry.js} +1 -1
  237. package/dist/design-system/{p-26f2f4c2.entry.js → p-22ac9e05.entry.js} +1 -1
  238. package/dist/design-system/p-2534d3d4.entry.js +1 -0
  239. package/dist/design-system/p-3859316f.entry.js +1 -0
  240. package/dist/design-system/{p-67f19734.entry.js → p-46da4e95.entry.js} +1 -1
  241. package/dist/design-system/{p-287d8016.entry.js → p-46eb3421.entry.js} +1 -1
  242. package/dist/design-system/p-4782331f.entry.js +1 -0
  243. package/dist/design-system/p-4a117dd6.entry.js +1 -0
  244. package/dist/design-system/{p-58ec51db.entry.js → p-4ae0a64a.entry.js} +1 -1
  245. package/dist/design-system/{p-bbd24816.entry.js → p-52b1be6f.entry.js} +1 -1
  246. package/dist/design-system/p-56e7c87b.entry.js +1 -0
  247. package/dist/design-system/p-570b9e91.entry.js +1 -0
  248. package/dist/design-system/p-5a113197.entry.js +1 -0
  249. package/dist/design-system/p-62ff77e4.entry.js +1 -0
  250. package/dist/design-system/{p-1230b51b.entry.js → p-655324cd.entry.js} +1 -1
  251. package/dist/design-system/p-66cff123.entry.js +1 -0
  252. package/dist/design-system/{p-4970f1ff.entry.js → p-6c4fa9d7.entry.js} +1 -1
  253. package/dist/design-system/{p-071e73e0.entry.js → p-809a0a71.entry.js} +1 -1
  254. package/dist/design-system/{p-70608fec.entry.js → p-82cb62a9.entry.js} +1 -1
  255. package/dist/design-system/p-843d1a8a.entry.js +1 -0
  256. package/dist/design-system/{p-fbeed0e4.entry.js → p-8836d9ff.entry.js} +1 -1
  257. package/dist/design-system/p-8af8e302.entry.js +1 -0
  258. package/dist/design-system/p-9c131122.entry.js +1 -0
  259. package/dist/design-system/{p-BqWuC4-J.js → p-BnUjeY2n.js} +1 -1
  260. package/dist/design-system/p-Bth2l1cy.js +1 -0
  261. package/dist/design-system/p-C599jhDs.js +2 -0
  262. package/dist/design-system/{p-CRWmn35N.js → p-Cn8LZw1e.js} +1 -1
  263. package/dist/design-system/p-DMm_GeZC.js +1 -0
  264. package/dist/design-system/p-Dz23PPdF.js +1 -0
  265. package/dist/design-system/p-a0c55a19.entry.js +1 -0
  266. package/dist/design-system/p-a6c292d1.entry.js +1 -0
  267. package/dist/design-system/p-a9cc4697.entry.js +1 -0
  268. package/dist/design-system/{p-2553bb1f.entry.js → p-b2dc1202.entry.js} +1 -1
  269. package/dist/design-system/{p-9c0bca09.entry.js → p-b5229957.entry.js} +1 -1
  270. package/dist/design-system/{p-d7e302af.entry.js → p-b75cc0dd.entry.js} +1 -1
  271. package/dist/design-system/p-b97a6cf3.entry.js +1 -0
  272. package/dist/design-system/p-c1e625e5.entry.js +1 -0
  273. package/dist/design-system/{p-5687ed0c.entry.js → p-c7f03dea.entry.js} +1 -1
  274. package/dist/design-system/p-cdb2433a.entry.js +1 -0
  275. package/dist/design-system/{p-61f5d5ea.entry.js → p-d5325895.entry.js} +1 -1
  276. package/dist/design-system/p-e0e4a451.entry.js +1 -0
  277. package/dist/design-system/p-e387ec65.entry.js +1 -0
  278. package/dist/design-system/{p-bab692c6.entry.js → p-efe3601d.entry.js} +1 -1
  279. package/dist/esm/design-system.js +3 -3
  280. package/dist/esm/{index-DDNBPrZh.js → index-C599jhDs.js} +2 -14
  281. package/dist/esm/loader.js +3 -3
  282. package/dist/esm/sd-action-modal.entry.js +2 -2
  283. package/dist/esm/sd-badge.entry.js +2 -2
  284. package/dist/esm/sd-barcode-input.entry.js +2 -2
  285. package/dist/esm/sd-button_2.entry.js +3 -3
  286. package/dist/esm/sd-calendar_2.entry.js +8 -9
  287. package/dist/esm/sd-callout.entry.js +2 -2
  288. package/dist/esm/sd-card.entry.js +2 -2
  289. package/dist/esm/sd-checkbox.entry.js +5 -5
  290. package/dist/esm/sd-chip-input.entry.js +22 -17
  291. package/dist/esm/sd-chip.entry.js +7 -7
  292. package/dist/esm/sd-circle-progress.entry.js +4 -4
  293. package/dist/esm/sd-confirm-modal_2.entry.js +33 -36
  294. package/dist/esm/sd-date-box.entry.js +1 -1
  295. package/dist/esm/{component.datepicker-laVsm9VM.js → sd-date-picker.config-CdXJcOGr.js} +63 -1
  296. package/dist/esm/{sd-date-picker_7.entry.js → sd-date-picker_8.entry.js} +446 -48
  297. package/dist/esm/sd-date-range-picker-calendar.entry.js +158 -8
  298. package/dist/esm/sd-divider.entry.js +3 -3
  299. package/dist/esm/sd-dropdown-button.entry.js +2 -2
  300. package/dist/esm/sd-field_3.entry.js +51 -52
  301. package/dist/esm/sd-form.entry.js +1 -1
  302. package/dist/esm/sd-ghost-button_3.entry.js +14 -10
  303. package/dist/esm/sd-guide.entry.js +2 -2
  304. package/dist/esm/sd-key-value-table.entry.js +87 -17
  305. package/dist/esm/sd-linear-progress.entry.js +3 -3
  306. package/dist/esm/sd-loading-container.entry.js +3 -3
  307. package/dist/esm/sd-modal-container.entry.js +16 -2
  308. package/dist/esm/sd-pagination.entry.js +171 -0
  309. package/dist/esm/sd-popover.entry.js +134 -44
  310. package/dist/esm/sd-popup.entry.js +3 -3
  311. package/dist/esm/sd-radio-button.entry.js +3 -3
  312. package/dist/esm/sd-radio.entry.js +4 -2
  313. package/dist/esm/{sd-select_3.entry.js → sd-select-list-item_4.entry.js} +277 -299
  314. package/dist/esm/sd-switch.entry.js +13 -3
  315. package/dist/esm/sd-tabs.entry.js +2 -2
  316. package/dist/esm/sd-text-link.entry.js +4 -4
  317. package/dist/esm/sd-time-picker-selector.entry.js +177 -0
  318. package/dist/esm/sd-time-picker-trigger.entry.js +73 -0
  319. package/dist/esm/sd-time-picker.config-DUq29Nhs.js +148 -0
  320. package/dist/esm/sd-time-picker.entry.js +171 -0
  321. package/dist/esm/sd-time-range-picker-selector.entry.js +217 -0
  322. package/dist/esm/sd-time-range-picker.entry.js +202 -0
  323. package/dist/esm/sd-toast-container.entry.js +2 -2
  324. package/dist/esm/sd-toast.entry.js +3 -3
  325. package/dist/esm/sd-toggle.entry.js +2 -2
  326. package/dist/esm/{system-BJfiMC9H.js → system-Bth2l1cy.js} +1 -7
  327. package/dist/esm/{tooltipArrow-blL0aWPE.js → tooltipArrow-DbLihSLI.js} +1 -1
  328. package/dist/esm/{useDatePicker-DoUg--aq.js → useDatePicker-DQ5Kyy_D.js} +1 -1
  329. package/dist/types/components/sd-checkbox/sd-checkbox.d.ts +2 -2
  330. package/dist/types/components/sd-chip/sd-chip.d.ts +3 -3
  331. package/dist/types/components/sd-chip-input/sd-chip-input.d.ts +4 -2
  332. package/dist/types/components/sd-confirm-modal/sd-confirm-modal.d.ts +10 -10
  333. package/dist/types/components/sd-date-picker/sd-date-picker.d.ts +2 -0
  334. package/dist/types/components/sd-date-range-picker/sd-date-range-picker-calendar/sd-date-range-picker-calendar.d.ts +20 -0
  335. package/dist/types/components/sd-date-range-picker/sd-date-range-picker.config.d.ts +25 -0
  336. package/dist/types/components/sd-date-range-picker/sd-date-range-picker.d.ts +9 -0
  337. package/dist/types/components/sd-field/sd-field.d.ts +7 -0
  338. package/dist/types/components/sd-file-picker/sd-file-picker.config.d.ts +28 -0
  339. package/dist/types/components/sd-file-picker/sd-file-picker.d.ts +3 -1
  340. package/dist/types/components/sd-ghost-button/sd-ghost-button.d.ts +5 -0
  341. package/dist/types/components/sd-input/sd-input.d.ts +1 -1
  342. package/dist/types/components/sd-key-value-table/sd-key-value-table.config.d.ts +22 -3
  343. package/dist/types/components/sd-key-value-table/sd-key-value-table.d.ts +9 -1
  344. package/dist/types/components/sd-modal-container/sd-modal-container.config.d.ts +3 -0
  345. package/dist/types/components/sd-modal-container/sd-modal-container.d.ts +2 -0
  346. package/dist/types/components/sd-number-input/sd-number-input.d.ts +8 -0
  347. package/dist/types/components/sd-popover/sd-popover.config.d.ts +22 -0
  348. package/dist/types/components/sd-popover/sd-popover.d.ts +29 -36
  349. package/dist/types/components/sd-radio/sd-radio.d.ts +3 -1
  350. package/dist/types/components/sd-radio-button/sd-radio-button.d.ts +2 -2
  351. package/dist/types/components/sd-radio-group/sd-radio-group.d.ts +2 -2
  352. package/dist/types/components/sd-switch/sd-switch.d.ts +8 -1
  353. package/dist/types/components/sd-tag/sd-tag.d.ts +2 -2
  354. package/dist/types/components/sd-time-picker/sd-time-picker-selector/sd-time-picker-selector.d.ts +35 -0
  355. package/dist/types/components/sd-time-picker/sd-time-picker-trigger/sd-time-picker-trigger.d.ts +21 -0
  356. package/dist/types/components/sd-time-picker/sd-time-picker.config.d.ts +71 -0
  357. package/dist/types/components/sd-time-picker/sd-time-picker.d.ts +84 -0
  358. package/dist/types/components/sd-time-range-picker/sd-time-range-picker-selector/sd-time-range-picker-selector.d.ts +40 -0
  359. package/dist/types/components/sd-time-range-picker/sd-time-range-picker.config.d.ts +9 -0
  360. package/dist/types/components/sd-time-range-picker/sd-time-range-picker.d.ts +88 -0
  361. package/dist/types/components/sd-tooltip/sd-tooltip.d.ts +7 -22
  362. package/dist/types/components.d.ts +1093 -885
  363. package/dist/types/index.d.ts +0 -1
  364. package/hydrate/index.js +2573 -3144
  365. package/hydrate/index.mjs +2573 -3144
  366. package/package.json +1 -1
  367. package/dist/cjs/component.table-POXY492T.js +0 -72
  368. package/dist/cjs/constants-DJRV1upE.js +0 -5
  369. package/dist/cjs/sd-date-picker.config-De7ahWIs.js +0 -41
  370. package/dist/cjs/sd-pagination_4.cjs.entry.js +0 -858
  371. package/dist/cjs/sd-select-list-item_2.cjs.entry.js +0 -173
  372. package/dist/cjs/sd-select.config-omyxekRa.js +0 -144
  373. package/dist/cjs/sd-table.cjs.entry.js +0 -956
  374. package/dist/cjs/sd-table.config-DFy_S4bc.js +0 -83
  375. package/dist/cjs/sd-td.cjs.entry.js +0 -201
  376. package/dist/cjs/useDatePicker-iMd6WToc.js +0 -103
  377. package/dist/collection/components/sd-table/constants.js +0 -1
  378. package/dist/collection/components/sd-table/sd-table.config.js +0 -88
  379. package/dist/collection/components/sd-table/sd-table.css +0 -180
  380. package/dist/collection/components/sd-table/sd-table.js +0 -1709
  381. package/dist/collection/components/sd-table/sd-table.stories.helpers.js +0 -242
  382. package/dist/collection/components/sd-table/sd-tbody/sd-tbody.css +0 -10
  383. package/dist/collection/components/sd-table/sd-tbody/sd-tbody.js +0 -110
  384. package/dist/collection/components/sd-table/sd-td/sd-td.css +0 -15
  385. package/dist/collection/components/sd-table/sd-td/sd-td.js +0 -381
  386. package/dist/collection/components/sd-table/sd-thead/sd-thead.css +0 -186
  387. package/dist/collection/components/sd-table/sd-thead/sd-thead.js +0 -629
  388. package/dist/collection/components/sd-table/sd-tr/sd-tr.css +0 -145
  389. package/dist/collection/components/sd-table/sd-tr/sd-tr.js +0 -530
  390. package/dist/components/p-5pkzwl5N.js +0 -1
  391. package/dist/components/p-B-pJW3nY.js +0 -1
  392. package/dist/components/p-B2pYDEK7.js +0 -1
  393. package/dist/components/p-B3HYnTGx.js +0 -1
  394. package/dist/components/p-B6ezDhRg.js +0 -1
  395. package/dist/components/p-BCxePXvg.js +0 -1
  396. package/dist/components/p-BJfiMC9H.js +0 -1
  397. package/dist/components/p-BNHhtZUf.js +0 -1
  398. package/dist/components/p-BQ4Okfcm.js +0 -1
  399. package/dist/components/p-BSxleKw8.js +0 -1
  400. package/dist/components/p-BUgGuigd.js +0 -1
  401. package/dist/components/p-BWHQn4fD.js +0 -1
  402. package/dist/components/p-BZXgIBUG.js +0 -1
  403. package/dist/components/p-Bxb7TcZh.js +0 -1
  404. package/dist/components/p-C0tnN4yn.js +0 -1
  405. package/dist/components/p-CMvHDxR5.js +0 -1
  406. package/dist/components/p-CSh-DcM7.js +0 -1
  407. package/dist/components/p-Cf62Nvrx.js +0 -1
  408. package/dist/components/p-DbPS61bp.js +0 -1
  409. package/dist/components/p-DckXBMgo.js +0 -1
  410. package/dist/components/p-DmAnTwUx.js +0 -1
  411. package/dist/components/p-E8OA_psS.js +0 -1
  412. package/dist/components/p-PFLrdhQj.js +0 -1
  413. package/dist/components/p-l9RiSWRc.js +0 -1
  414. package/dist/components/p-paSLRXAR.js +0 -1
  415. package/dist/components/p-sZMi_32I.js +0 -1
  416. package/dist/components/p-yxZBh03f.js +0 -1
  417. package/dist/components/sd-table.js +0 -1
  418. package/dist/components/sd-tbody.d.ts +0 -11
  419. package/dist/components/sd-tbody.js +0 -1
  420. package/dist/components/sd-td.js +0 -1
  421. package/dist/components/sd-thead.js +0 -1
  422. package/dist/components/sd-tr.d.ts +0 -11
  423. package/dist/components/sd-tr.js +0 -1
  424. package/dist/design-system/p-0048de73.entry.js +0 -1
  425. package/dist/design-system/p-20f69606.entry.js +0 -1
  426. package/dist/design-system/p-27197194.entry.js +0 -1
  427. package/dist/design-system/p-5c8f4d9c.entry.js +0 -1
  428. package/dist/design-system/p-5pkzwl5N.js +0 -1
  429. package/dist/design-system/p-75726e20.entry.js +0 -1
  430. package/dist/design-system/p-7abf62f3.entry.js +0 -1
  431. package/dist/design-system/p-7ae27a26.entry.js +0 -1
  432. package/dist/design-system/p-84d0181b.entry.js +0 -1
  433. package/dist/design-system/p-91f7be74.entry.js +0 -1
  434. package/dist/design-system/p-94d6b7b4.entry.js +0 -1
  435. package/dist/design-system/p-9b21773a.entry.js +0 -1
  436. package/dist/design-system/p-BJfiMC9H.js +0 -1
  437. package/dist/design-system/p-Cf62Nvrx.js +0 -1
  438. package/dist/design-system/p-CuAh9n2o.js +0 -1
  439. package/dist/design-system/p-DDNBPrZh.js +0 -2
  440. package/dist/design-system/p-a12d7362.entry.js +0 -1
  441. package/dist/design-system/p-b831eded.entry.js +0 -1
  442. package/dist/design-system/p-c5502585.entry.js +0 -1
  443. package/dist/design-system/p-c81898a0.entry.js +0 -1
  444. package/dist/design-system/p-d4e2f412.entry.js +0 -1
  445. package/dist/design-system/p-d6b3d78b.entry.js +0 -1
  446. package/dist/design-system/p-dbfa3931.entry.js +0 -1
  447. package/dist/design-system/p-f16985c9.entry.js +0 -1
  448. package/dist/design-system/p-fa967329.entry.js +0 -1
  449. package/dist/design-system/p-laVsm9VM.js +0 -1
  450. package/dist/design-system/p-sZMi_32I.js +0 -1
  451. package/dist/esm/component.table-5pkzwl5N.js +0 -70
  452. package/dist/esm/constants-sZMi_32I.js +0 -3
  453. package/dist/esm/sd-date-picker.config-D-ks6qNf.js +0 -38
  454. package/dist/esm/sd-pagination_4.entry.js +0 -853
  455. package/dist/esm/sd-select-list-item_2.entry.js +0 -170
  456. package/dist/esm/sd-select.config-CeHGlqOT.js +0 -129
  457. package/dist/esm/sd-table.config-DmOBlnsM.js +0 -70
  458. package/dist/esm/sd-table.entry.js +0 -954
  459. package/dist/esm/sd-td.entry.js +0 -199
  460. package/dist/types/components/sd-table/constants.d.ts +0 -50
  461. package/dist/types/components/sd-table/sd-table.config.d.ts +0 -71
  462. package/dist/types/components/sd-table/sd-table.d.ts +0 -199
  463. package/dist/types/components/sd-table/sd-table.stories.helpers.d.ts +0 -39
  464. package/dist/types/components/sd-table/sd-tbody/sd-tbody.d.ts +0 -15
  465. package/dist/types/components/sd-table/sd-td/sd-td.d.ts +0 -38
  466. package/dist/types/components/sd-table/sd-thead/sd-thead.d.ts +0 -62
  467. package/dist/types/components/sd-table/sd-tr/sd-tr.d.ts +0 -54
@@ -1,10 +1,9 @@
1
- import { r as registerInstance, c as createEvent, a as getElement, h } from './index-DDNBPrZh.js';
1
+ import { r as registerInstance, c as createEvent, a as getElement, h } from './index-C599jhDs.js';
2
2
  import { n as nanoid } from './index-CCwNgVmC.js';
3
- import { D as DATEPICKER_COLORS, a as DATEPICKER_SIZE_MAP } from './sd-date-picker.config-D-ks6qNf.js';
3
+ import { D as DATEPICKER_COLORS, a as DATEPICKER_SIZE_MAP } from './sd-date-picker.config-CdXJcOGr.js';
4
+ import { f as fieldTokens } from './component.field-DjKOoQuF.js';
4
5
  import { l as listBoxTokens } from './component.listBox-DlJaYVWf.js';
5
6
  import { i as inputTokens } from './component.textinput-e0ABNkP6.js';
6
- import { f as fieldTokens } from './component.field-DjKOoQuF.js';
7
- import './component.datepicker-laVsm9VM.js';
8
7
 
9
8
  const sdDatePickerCss = () => `sd-date-picker{display:inline-flex}sd-date-picker sd-portal{display:none}sd-date-picker .sd-date-picker{position:relative;width:100%;height:100%}`;
10
9
 
@@ -45,6 +44,8 @@ const SdDatePicker = class {
45
44
  rules = [];
46
45
  /** 에러 상태 여부 */
47
46
  error = false;
47
+ /** 필드 상태 (없으면 error/rules 결과로 자동 결정) */
48
+ status;
48
49
  /** 레이블 영역 아이콘 */
49
50
  icon = undefined;
50
51
  /** 레이블 툴팁 텍스트 */
@@ -128,9 +129,9 @@ const SdDatePicker = class {
128
129
  '--sd-system-color-field-border-focus': DATEPICKER_COLORS.border.focus,
129
130
  '--sd-system-color-field-bg-default': DATEPICKER_COLORS.bg.default,
130
131
  };
131
- return (h("sd-field", { key: '4359c9ce80bfc919088774a4458c730c427aa3f5', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: '638f4e59c9a7c5c841428c424181b3d2320857eb', class: "sd-date-picker", ref: el => {
132
+ return (h("sd-field", { key: 'c3adbcb65f372a7c33350a747b29b5a35990c292', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, status: this.status, disabled: this.disabled, focused: this.focused, hovered: this.hovered, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: 'aac9b498321c4506a6979a17de4896c4521887a1', class: "sd-date-picker", ref: el => {
132
133
  this.triggerRef = el;
133
- } }, h("sd-date-picker-trigger", { key: 'cbfe2bee0fdea1f089860cf3a7da9b7e35327c87', displayText: this.value ?? '', placeholder: this.placeholder, disabled: this.disabled, size: this.size, onSdTriggerClick: this.handleTriggerClick })), (this.isOpen || this.isAnimatingOut) && (h("sd-portal", { key: 'a348437c5f9f53180cc7f74d5b275e4f3fbedea6', open: this.isOpen, parentRef: this.triggerRef, onSdClose: () => this.closeDropdown() }, h("sd-calendar", { key: '7dd08053b3a24d25e6149d4bc751c75eff94f752', elevated: true, value: this.value, selectable: this.selectable, onSdUpdate: this.handleSelect, onSdViewChange: this.handleViewChange })))));
134
+ } }, h("sd-date-picker-trigger", { key: '00a558ac1c9a5af666c62c15e18e240036e1bb34', displayText: this.value ?? '', placeholder: this.placeholder, disabled: this.disabled, size: this.size, onSdTriggerClick: this.handleTriggerClick })), (this.isOpen || this.isAnimatingOut) && (h("sd-portal", { key: '142098d59d8a5df4054e7a39f4d93b0ddc06109b', open: this.isOpen, parentRef: this.triggerRef, onSdClose: () => this.closeDropdown() }, h("sd-calendar", { key: '319dc85ff9a41e8b04fdaecc1c7e9e01c953014b', elevated: true, value: this.value, selectable: this.selectable, onSdUpdate: this.handleSelect, onSdViewChange: this.handleViewChange })))));
134
135
  }
135
136
  static get watchers() { return {
136
137
  "isOpen": [{
@@ -160,6 +161,11 @@ const SdDateRangePicker = class {
160
161
  selectable;
161
162
  /** 최대 선택 가능한 날짜 범위 (일 단위) */
162
163
  maxRange;
164
+ /**
165
+ * 시간(시:분) 선택 푸터 사용 여부.
166
+ * true이면 value는 "YYYY-MM-DD HH:mm" 형식이 되고, 캘린더 하단에 시작·종료 시간 입력이 표시됩니다.
167
+ */
168
+ useTimePicker = false;
163
169
  /** 비활성 상태 여부 */
164
170
  disabled = false;
165
171
  /** 필드 너비 (숫자면 px, 문자열이면 그대로 적용) */
@@ -181,6 +187,8 @@ const SdDateRangePicker = class {
181
187
  rules = [];
182
188
  /** 에러 상태 여부 */
183
189
  error = false;
190
+ /** 필드 상태 (없으면 error/rules 결과로 자동 결정) */
191
+ status;
184
192
  /** 레이블 영역 아이콘 */
185
193
  icon = undefined;
186
194
  /** 레이블 툴팁 텍스트 */
@@ -240,7 +248,9 @@ const SdDateRangePicker = class {
240
248
  }
241
249
  };
242
250
  handleSelect = (e) => {
243
- this.closeDropdown();
251
+ // 시간 선택 모드에서는 사용자가 시:분을 조정할 수 있도록 드롭다운을 닫지 않고 실시간 반영만 한다
252
+ if (!this.useTimePicker)
253
+ this.closeDropdown();
244
254
  this.value = e.detail;
245
255
  const nextValue = this.value;
246
256
  requestAnimationFrame(() => {
@@ -255,6 +265,14 @@ const SdDateRangePicker = class {
255
265
  return '';
256
266
  return `${this.value[0]} ~ ${this.value[1]}`;
257
267
  }
268
+ static DEFAULT_PLACEHOLDER = 'YYYY-MM-DD ~ YYYY-MM-DD';
269
+ get resolvedPlaceholder() {
270
+ // placeholder를 따로 지정하지 않았고 시간 선택 모드이면 시:분을 포함한 기본 placeholder를 쓴다
271
+ if (this.useTimePicker && this.placeholder === SdDateRangePicker.DEFAULT_PLACEHOLDER) {
272
+ return 'YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm';
273
+ }
274
+ return this.placeholder;
275
+ }
258
276
  disconnectedCallback() {
259
277
  if (this.closeAnimationTimer)
260
278
  clearTimeout(this.closeAnimationTimer);
@@ -268,9 +286,9 @@ const SdDateRangePicker = class {
268
286
  '--sd-system-color-field-border-focus': DATEPICKER_COLORS.border.focus,
269
287
  '--sd-system-color-field-bg-default': DATEPICKER_COLORS.bg.default,
270
288
  };
271
- return (h("sd-field", { key: '00e25ab4608b5340b8be9e1dd19050968e34b758', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: '98179e2ec90e55f83e5deff6e36fc821fc103456', class: "sd-date-range-picker", ref: el => {
289
+ return (h("sd-field", { key: '01098a74a5066d2328409dcdf21bb38691adf455', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, status: this.status, disabled: this.disabled, focused: this.focused, hovered: this.hovered, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: 'dab4a666f5c144bbcbf3848528ce246c752ab906', class: "sd-date-range-picker", ref: el => {
272
290
  this.triggerRef = el;
273
- } }, h("sd-date-picker-trigger", { key: 'fe123228a851da602f0a5a8929fc20782742a24b', displayText: this.displayText, placeholder: this.placeholder, disabled: this.disabled, size: this.size, onSdTriggerClick: this.handleTriggerClick })), (this.isOpen || this.isAnimatingOut) && (h("sd-portal", { key: 'ee7eb14cc09fd067a8eeb9f19bd93178378d81b2', open: this.isOpen, parentRef: this.triggerRef, onSdClose: () => this.closeDropdown() }, h("sd-date-range-picker-calendar", { key: '8dc57a29f1ecd6811fb4538a96eea823dfebe080', value: this.value, selectable: this.selectable, maxRange: this.maxRange, onSdSelect: this.handleSelect, onSdViewChange: this.handleViewChange })))));
291
+ } }, h("sd-date-picker-trigger", { key: '5aa378df1b53a2b8cc29e159e7bda0544210a81e', displayText: this.displayText, placeholder: this.resolvedPlaceholder, disabled: this.disabled, size: this.size, onSdTriggerClick: this.handleTriggerClick })), (this.isOpen || this.isAnimatingOut) && (h("sd-portal", { key: '8d18658004dc009d869804bdabd31155117edde3', open: this.isOpen, parentRef: this.triggerRef, onSdClose: () => this.closeDropdown() }, h("sd-date-range-picker-calendar", { key: '0bf96efeed4c567052e690a83a70f27df85ccc64', value: this.value, selectable: this.selectable, maxRange: this.maxRange, useTimePicker: this.useTimePicker, onSdSelect: this.handleSelect, onSdViewChange: this.handleViewChange })))));
274
292
  }
275
293
  static get watchers() { return {
276
294
  "isOpen": [{
@@ -286,12 +304,39 @@ const filepicker = {
286
304
  paddingX: "12",
287
305
  gap: "8",
288
306
  radius: "4",
307
+ borderWidth: "1",
289
308
  typography: {
309
+ fontFamily: "Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif",
290
310
  fontWeight: "400",
291
311
  fontSize: "12",
292
- lineHeight: "20"},
312
+ lineHeight: "20",
313
+ textDecoration: "none"
314
+ },
293
315
  icon: "16"
294
316
  },
317
+ md: {
318
+ height: "36",
319
+ paddingX: "16",
320
+ gap: "12",
321
+ radius: "6",
322
+ borderWidth: "1",
323
+ typography: {
324
+ fontFamily: "Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif",
325
+ fontWeight: "400",
326
+ fontSize: "14",
327
+ textDecoration: "none",
328
+ lineHeight: "24"
329
+ },
330
+ icon: "20"
331
+ },
332
+ border: {
333
+ "default": "#AAAAAA",
334
+ disabled: "#CCCCCC"
335
+ },
336
+ bg: {
337
+ "default": "#FFFFFF",
338
+ disabled: "#E1E1E1"
339
+ },
295
340
  text: {
296
341
  "default": "#222222",
297
342
  placeholder: "#AAAAAA",
@@ -306,15 +351,25 @@ var filePickerTokens = {
306
351
  };
307
352
 
308
353
  const fp = filePickerTokens.filepicker;
309
- const FILE_PICKER_LAYOUT = {
310
- height: fp.sm.height,
311
- paddingX: fp.sm.paddingX,
312
- gap: fp.sm.gap,
313
- radius: fp.sm.radius,
314
- fontSize: fp.sm.typography.fontSize,
315
- lineHeight: fp.sm.typography.lineHeight,
316
- fontWeight: fp.sm.typography.fontWeight,
317
- iconSize: fp.sm.icon};
354
+ const buildLayout = (s) => ({
355
+ height: fp[s].height,
356
+ paddingX: fp[s].paddingX,
357
+ gap: fp[s].gap,
358
+ radius: fp[s].radius,
359
+ borderWidth: fp[s].borderWidth,
360
+ fontSize: fp[s].typography.fontSize,
361
+ lineHeight: fp[s].typography.lineHeight,
362
+ fontWeight: fp[s].typography.fontWeight,
363
+ iconSize: fp[s].icon,
364
+ contentsGap: fieldTokens.field.contents.gap,
365
+ });
366
+ /** 기본(sm) 레이아웃 — 하위호환용 단일 export */
367
+ const FILE_PICKER_LAYOUT = buildLayout('sm');
368
+ /** size별 레이아웃 맵 */
369
+ const FILE_PICKER_LAYOUTS = {
370
+ sm: FILE_PICKER_LAYOUT,
371
+ md: buildLayout('md'),
372
+ };
318
373
  const FILE_PICKER_COLORS = {
319
374
  text: fp.text,
320
375
  icon: {
@@ -361,6 +416,8 @@ const SdFilePicker = class {
361
416
  /** 최대 파일 개수 */
362
417
  maxFiles;
363
418
  // sd-field 패스스루 props
419
+ /** 필드 크기 */
420
+ size = 'sm';
364
421
  /** 폼 연동용 name 속성 */
365
422
  name = nanoid();
366
423
  /** 레이블 텍스트 */
@@ -563,7 +620,7 @@ const SdFilePicker = class {
563
620
  renderChipList() {
564
621
  if (!this.hasChips())
565
622
  return null;
566
- return (h("div", { class: "sd-file-picker__chip-list" }, this.internalValue.map((file, index) => (h("sd-chip", { value: file.name, onSdRemove: () => this.handleChipRemove(index) })))));
623
+ return (h("div", { class: "sd-file-picker__chip-list" }, this.internalValue.map((file, index) => (h("sd-chip", { value: file.name, editable: false, onSdRemove: () => this.handleChipRemove(index) })))));
567
624
  }
568
625
  renderListbox() {
569
626
  if (!this.hasChips() || !this.isListboxOpen)
@@ -589,38 +646,39 @@ const SdFilePicker = class {
589
646
  render() {
590
647
  const hasFiles = this.hasFiles();
591
648
  const displayText = this.getDisplayText();
649
+ const layout = FILE_PICKER_LAYOUTS[this.size] ?? FILE_PICKER_LAYOUT;
592
650
  const cssVars = {
593
- '--sd-file-picker-font-size': `${FILE_PICKER_LAYOUT.fontSize}px`,
594
- '--sd-file-picker-line-height': `${FILE_PICKER_LAYOUT.lineHeight}px`,
595
- '--sd-file-picker-font-weight': FILE_PICKER_LAYOUT.fontWeight,
596
- '--sd-file-picker-padding-x': `${FILE_PICKER_LAYOUT.paddingX}px`,
597
- '--sd-file-picker-gap': `${FILE_PICKER_LAYOUT.gap}px`,
651
+ '--sd-file-picker-font-size': `${layout.fontSize}px`,
652
+ '--sd-file-picker-line-height': `${layout.lineHeight}px`,
653
+ '--sd-file-picker-font-weight': layout.fontWeight,
654
+ '--sd-file-picker-padding-x': `${layout.paddingX}px`,
655
+ '--sd-file-picker-gap': `${layout.gap}px`,
598
656
  '--sd-file-picker-text-color': FILE_PICKER_COLORS.text.default,
599
657
  '--sd-file-picker-placeholder-color': FILE_PICKER_COLORS.text.placeholder,
600
658
  '--sd-file-picker-disabled-color': FILE_PICKER_COLORS.text.disabled,
601
- // sd-field 시스템 변수 override
602
- '--sd-system-size-field-sm-height': `${FILE_PICKER_LAYOUT.height}px`,
603
- '--sd-system-radius-field-sm': `${FILE_PICKER_LAYOUT.radius}px`,
659
+ // sd-field 시스템 변수 override (size에 맞춰)
660
+ [`--sd-system-size-field-${this.size}-height`]: `${layout.height}px`,
661
+ [`--sd-system-radius-field-${this.size}`]: `${layout.radius}px`,
604
662
  };
605
663
  const showListbox = this.multiple && this.useMultipleListBox;
606
- const content = (h("div", { key: '692bb28ba1adaa90317e18c6b824ab7d2287eb96', role: "button", tabindex: this.disabled ? -1 : 0, class: "sd-file-picker__content", ref: el => (this.contentRef = el), onClick: this.handleClick, onKeyDown: e => {
664
+ const content = (h("div", { key: 'd1c3af9860038ddb11d540af8312ad59d051524f', role: "button", tabindex: this.disabled ? -1 : 0, class: "sd-file-picker__content", ref: el => (this.contentRef = el), onClick: this.handleClick, onKeyDown: e => {
607
665
  if (e.key === 'Enter' || e.key === ' ') {
608
666
  e.preventDefault();
609
667
  this.handleClick();
610
668
  }
611
- } }, h("input", { key: '7a1cddff8097952c0c9eda9ae8d1b46b4a18967e', ref: el => (this.fileInputRef = el), type: "file", class: "sd-file-picker__input", disabled: this.disabled, multiple: this.multiple, accept: this.accept, onInput: this.handleFileChange, "aria-label": this.placeholder ?? 'Click to upload' }), h("sd-icon", { key: '2f7dffb5bfc39efb0eace252a45aaaa23091d337', name: "attachFile", size: Number(FILE_PICKER_LAYOUT.iconSize), color: this.getIconColor(), class: "sd-file-picker__icon" }), h("div", { key: '1a6ae3daa59c7befebcfcfdcbbb2c46a32c6c40c', ref: el => (this.fileNamesRef = el), class: {
669
+ } }, h("input", { key: '760c38cd73d0a2a3d0832c5597c0e22bf737bb06', ref: el => (this.fileInputRef = el), type: "file", class: "sd-file-picker__input", disabled: this.disabled, multiple: this.multiple, accept: this.accept, onInput: this.handleFileChange, "aria-label": this.placeholder ?? 'Click to upload' }), h("sd-icon", { key: '96ff0bf43eb3f17df92bd8834cd38a1ae36ad475', name: "attachFile", size: Number(layout.iconSize), color: this.getIconColor(), class: "sd-file-picker__icon" }), h("div", { key: '0757b8b734e21fcf7bed04d7306ee3a9d202f950', ref: el => (this.fileNamesRef = el), class: {
612
670
  'sd-file-picker__text': true,
613
671
  'sd-file-picker__text--placeholder': !hasFiles,
614
672
  'sd-file-picker__text--active': hasFiles,
615
- } }, displayText), showListbox && hasFiles && !this.disabled && (h("sd-ghost-button", { key: '895eafa47b1e1d851794fd471b304f8458bcac0f', icon: "caretDown", size: "xxs", ariaLabel: "toggle file list", disabled: this.disabled, class: {
673
+ } }, displayText), showListbox && hasFiles && !this.disabled && (h("sd-ghost-button", { key: '8e42d38452d00256147ee65e614bdeb7040917d7', icon: "caretDown", size: "xxs", ariaLabel: "toggle file list", disabled: this.disabled, class: {
616
674
  'sd-file-picker__caret': true,
617
675
  'sd-file-picker__caret--open': this.isListboxOpen,
618
- }, onClick: this.handleListboxToggle })), !this.disabled && hasFiles && (h("sd-ghost-button", { key: '38d3fe31be05ae66a170671ffb4855bce4984630', icon: "close", size: "xxs", ariaLabel: "clear", disabled: this.disabled, class: "sd-file-picker__clear-icon", onClick: this.handleClear })), this.showTooltip && hasFiles && this.hovered && (h("div", { key: 'bb94815d7149ce9f1117828f893224c8bc1dbc50', class: "sd-file-picker__tooltip" }, displayText))));
619
- return (h("div", { key: '3ada174508214a9fafd4f7f228ff52eb60aa76e4', class: {
676
+ }, onClick: this.handleListboxToggle })), !this.disabled && hasFiles && (h("sd-ghost-button", { key: '6f65042ce5e4efa1b6ab126653d434ca77cdd790', icon: "close", size: "xxs", ariaLabel: "clear", disabled: this.disabled, class: "sd-file-picker__clear-icon", onClick: this.handleClear })), this.showTooltip && hasFiles && this.hovered && (h("div", { key: 'b41146f39c384a5954dca22f2d3da767a63ef0c0', class: "sd-file-picker__tooltip" }, displayText))));
677
+ return (h("div", { key: '858fea100a9317ac6806ae40699e9f5608394e10', class: {
620
678
  'sd-file-picker__wrapper': true,
621
679
  'sd-file-picker--inline': this.inline,
622
680
  'sd-file-picker--inline-disabled': this.inline && this.disabled,
623
- }, style: cssVars }, h("sd-field", { key: '29314b3ba5fc7c6b7d2f1a93a14381d9fb91bcfc', borderless: this.inline, name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, status: this.status, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, content), this.useMultipleListBox ? this.renderListbox() : this.renderChipList()));
681
+ }, style: cssVars }, h("sd-field", { key: '1b7a6a57e4e46c253bd9f77c500dabf92edc2ae0', borderless: this.inline, size: this.size, name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, status: this.status, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, content), this.useMultipleListBox ? this.renderListbox() : this.renderChipList()));
624
682
  }
625
683
  static get watchers() { return {
626
684
  "value": [{
@@ -816,12 +874,12 @@ const SdInput = class {
816
874
  '--sd-system-size-field-sm-height': `${sizeTokens.height}px`,
817
875
  '--sd-system-radius-field-sm': `${sizeTokens.radius}px`,
818
876
  };
819
- return (h("sd-field", { key: '7ec67f4433bff2a7d2f1b44935f761d79f0e8681', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("label", { key: '6c0118c2610f06d13d4a38a857bf37c7ad9508d0', class: "sd-input__content" }, h("slot", { key: '31cd8fe72ab21cb7a562accff98545fdf59efa80', name: "prefix" }), h("input", { key: '47579f31e9255bda6d5623eca8071ffdafd0ca55', name: this.name, ref: el => (this.nativeEl = el), class: `sd-input__native ${this.inputClass}`, type: this.type === 'password' && this.passwordVisible ? 'text' : (this.type ?? 'text'), value: this.internalValue || '', placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readonly: this.readonly, autofocus: this.autoFocus, autocomplete: this.autocomplete || undefined, maxlength: this.maxlength, minlength: this.minlength, inputmode: this.inputmode, enterkeyhint: this.enterkeyhint, spellcheck: this.spellcheck, onInput: this.handleInput, onFocus: event => this.handleFocus('focus', event), onBlur: event => this.handleFocus('blur', event), style: this.inputStyle }), h("slot", { key: 'f2d6e313c8c542d88c252e26cbb2618977fda5fa', name: "suffix" }), this.clearable && this.internalValue && !this.disabled && !this.readonly && (h("sd-ghost-button", { key: 'b24cb32d5963b244aef76e31f1c0f350d316be5c', icon: "close", ariaLabel: "clear", size: "xxs", disabled: this.disabled, class: "sd-input__clear-icon", onClick: async () => {
877
+ return (h("sd-field", { key: '66c7d6a9292bf8129fea6a33d2288733c264a39f', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("label", { key: 'b429ae6e521440eb917b17b10525ff3d3767a50d', class: "sd-input__content" }, h("slot", { key: 'dc1cd825ff1bea6484eada71d5aff621f82522c2', name: "prefix" }), h("input", { key: '93bd923644ac7660c2c9be28e4c64d39d93365c3', name: this.name, ref: el => (this.nativeEl = el), class: `sd-input__native ${this.inputClass}`, type: this.type === 'password' && this.passwordVisible ? 'text' : (this.type ?? 'text'), value: this.internalValue || '', placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readonly: this.readonly, autofocus: this.autoFocus, autocomplete: this.autocomplete || undefined, maxlength: this.maxlength, minlength: this.minlength, inputmode: this.inputmode, enterkeyhint: this.enterkeyhint, spellcheck: this.spellcheck, onInput: this.handleInput, onFocus: event => this.handleFocus('focus', event), onBlur: event => this.handleFocus('blur', event), style: this.inputStyle }), h("slot", { key: 'ec2f67a7ae01ebbaaa1f48f1e231f6fe2cfb413c', name: "suffix" }), this.clearable && this.internalValue && !this.disabled && !this.readonly && (h("sd-ghost-button", { key: 'de33f6902ab5560e151ef13e01ef84eea14da17d', icon: "close", ariaLabel: "clear", size: "xxs", disabled: this.disabled, class: "sd-input__clear-icon", onClick: async () => {
820
878
  if (this.disabled || this.readonly)
821
879
  return;
822
880
  this.internalValue = '';
823
881
  await this.formField?.sdValidate();
824
- } })), this.type === 'password' && (h("sd-ghost-button", { key: '9592350fd3820fa8c8af637cb84f2d4517d6decd', icon: this.passwordVisible ? 'visibilityOn' : 'visibilityOff', ariaLabel: "visibility", size: "xxs", disabled: this.disabled || this.readonly, class: "sd-input__password-icon", onClick: () => {
882
+ } })), this.type === 'password' && (h("sd-ghost-button", { key: 'db07c28cede67dbec93454b5ea90e94f72c5f313', icon: this.passwordVisible ? 'visibilityOn' : 'visibilityOff', ariaLabel: "visibility", size: "xxs", disabled: this.disabled || this.readonly, class: "sd-input__password-icon", onClick: () => {
825
883
  if (this.disabled || this.readonly)
826
884
  return;
827
885
  this.passwordVisible = !this.passwordVisible;
@@ -946,6 +1004,8 @@ const SdNumberInput = class {
946
1004
  useButton = false;
947
1005
  /** 소수점 입력 허용 여부 */
948
1006
  useDecimal = false;
1007
+ /** 소수점 이하 최대 자리수 (useDecimal일 때만 적용, 초과 입력한 소수부는 잘라냄) */
1008
+ maxDecimalLength;
949
1009
  /** 입력 값 */
950
1010
  value = null;
951
1011
  /** 레이블 텍스트 */
@@ -1026,6 +1086,31 @@ const SdNumberInput = class {
1026
1086
  const result = isNegative ? '-' + formatted : formatted;
1027
1087
  return decPart !== undefined && decPart !== '' ? result + '.' + decPart : String(result);
1028
1088
  }
1089
+ /** useDecimal이면서 유효한 maxDecimalLength가 있을 때만 소수점 이하 제한 자리수를 반환합니다. */
1090
+ getDecimalLimit() {
1091
+ if (!this.useDecimal ||
1092
+ this.maxDecimalLength === undefined ||
1093
+ !Number.isFinite(this.maxDecimalLength)) {
1094
+ return undefined;
1095
+ }
1096
+ return Math.max(0, Math.floor(this.maxDecimalLength));
1097
+ }
1098
+ /** 소수부를 제한 자리수로 잘라낸 문자열을 반환합니다(반올림하지 않고 잘라냄). */
1099
+ truncateToDecimalLimit(cleaned, limit) {
1100
+ if (!cleaned.includes('.'))
1101
+ return cleaned;
1102
+ const [intPart, fractionPart = ''] = cleaned.split('.');
1103
+ const truncatedFraction = fractionPart.slice(0, limit);
1104
+ return truncatedFraction === '' ? intPart : `${intPart}.${truncatedFraction}`;
1105
+ }
1106
+ /** 숫자값의 소수부를 제한 자리수로 잘라냅니다(제한이 없으면 원본 그대로). */
1107
+ applyDecimalLimit(value) {
1108
+ const decimalLimit = this.getDecimalLimit();
1109
+ if (decimalLimit === undefined)
1110
+ return value;
1111
+ const parsed = parseFloat(this.truncateToDecimalLimit(value.toString(), decimalLimit));
1112
+ return isNaN(parsed) ? value : parsed;
1113
+ }
1029
1114
  parseInput(input) {
1030
1115
  if (input.trim() === '')
1031
1116
  return null;
@@ -1033,12 +1118,15 @@ const SdNumberInput = class {
1033
1118
  if (!/^-?(\d+\.?\d*|\d*\.\d+)$/.test(cleaned)) {
1034
1119
  return null;
1035
1120
  }
1036
- const parsed = parseFloat(cleaned);
1037
- if (isNaN(parsed))
1038
- return null;
1039
1121
  if (!this.useDecimal && cleaned.includes('.')) {
1040
1122
  return null;
1041
1123
  }
1124
+ // useDecimal이면서 maxDecimalLength가 설정된 경우 소수부를 제한 자리수로 잘라냄(반올림 아님)
1125
+ const decimalLimit = this.getDecimalLimit();
1126
+ const normalized = decimalLimit !== undefined ? this.truncateToDecimalLimit(cleaned, decimalLimit) : cleaned;
1127
+ const parsed = parseFloat(normalized);
1128
+ if (isNaN(parsed))
1129
+ return null;
1042
1130
  return parsed;
1043
1131
  }
1044
1132
  clampMinMax(value) {
@@ -1193,6 +1281,7 @@ const SdNumberInput = class {
1193
1281
  if (nextVal > this.max) {
1194
1282
  nextVal = this.max;
1195
1283
  }
1284
+ nextVal = this.applyDecimalLimit(nextVal);
1196
1285
  if (nextVal === currentVal)
1197
1286
  return;
1198
1287
  this.internalValue = nextVal;
@@ -1205,6 +1294,7 @@ const SdNumberInput = class {
1205
1294
  if (nextVal < this.min) {
1206
1295
  nextVal = this.min;
1207
1296
  }
1297
+ nextVal = this.applyDecimalLimit(nextVal);
1208
1298
  if (nextVal === currentVal)
1209
1299
  return;
1210
1300
  this.internalValue = nextVal;
@@ -1245,15 +1335,15 @@ const SdNumberInput = class {
1245
1335
  '--sd-textinput-input-hint-typography-line-height': `${NUMBER_INPUT_HINT.typography.lineHeight}px`,
1246
1336
  '--sd-textinput-input-contents-gap': `${NUMBER_INPUT_CONTENTS_GAP}px`,
1247
1337
  };
1248
- return (h("sd-field", { key: '9e82f7ec1e40c7f435233d1d8e05fdd2de0c2712', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: 'b5f2e1c32bbba8147a72edf2dfe42f591d81d6f7', class: {
1338
+ return (h("sd-field", { key: 'ffa6befb9565a33e762fce231c29d7a2f663eb08', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: '2fb1686b071fd69c65fc0c908807c029edc3b253', class: {
1249
1339
  'sd-number-input__content': true,
1250
1340
  'sd-number-input__content--no-stepper': !this.useButton,
1251
- } }, this.useButton && (h("button", { key: '07e053c769556282da7595ba7d185db7c9af19a2', type: "button", class: "sd-number-input__stepper sd-number-input__stepper--decrement", disabled: this.isDecrementDisabled(), onClick: this.handleDecrement, tabindex: -1 }, h("sd-icon", { key: '95b48b8a0fa45ff60b3097d24405b48e4776b928', name: "minus", size: iconSize, color: this.isDecrementDisabled()
1341
+ } }, this.useButton && (h("button", { key: '6b2464867bb0224f4fbcb50ea4e4bfc5386474ba', type: "button", class: "sd-number-input__stepper sd-number-input__stepper--decrement", disabled: this.isDecrementDisabled(), onClick: this.handleDecrement, tabindex: -1 }, h("sd-icon", { key: 'f65e9144ad93f4ba8d293b5af1bf9fd1286e7520', name: "minus", size: iconSize, color: this.isDecrementDisabled()
1252
1342
  ? NUMBER_INPUT_STEPPER.icon.disabled
1253
- : NUMBER_INPUT_STEPPER.icon.default }))), this.inputPrefix && h("span", { key: '2381fade9767b593d5f6848bc411c3244a6f9da2', class: "sd-number-input__prefix" }, this.inputPrefix), h("input", { key: '00b886990e9c1155c20ee404eda26777e56d31c2', name: this.name, ref: el => (this.nativeEl = el), class: `sd-number-input__native ${this.inputClass}`, type: "text", inputMode: "numeric", value: this.displayValue, placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readonly: this.readonly, autofocus: this.autoFocus, onInput: this.handleInput, onKeyDown: this.handleKeyDown, onFocus: this.handleFocus, onBlur: this.handleBlur, style: {
1343
+ : NUMBER_INPUT_STEPPER.icon.default }))), this.inputPrefix && h("span", { key: '3d89b3557f961f36b429e3cf4ae247098a412b30', class: "sd-number-input__prefix" }, this.inputPrefix), h("input", { key: 'c5c503b634aee3b0c8d81f855b5de1d0abe35eac', name: this.name, ref: el => (this.nativeEl = el), class: `sd-number-input__native ${this.inputClass}`, type: "text", inputMode: "numeric", value: this.displayValue, placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readonly: this.readonly, autofocus: this.autoFocus, onInput: this.handleInput, onKeyDown: this.handleKeyDown, onFocus: this.handleFocus, onBlur: this.handleBlur, style: {
1254
1344
  textAlign: this.useButton ? 'center' : 'right',
1255
1345
  ...this.inputStyle,
1256
- } }), this.inputSuffix && h("span", { key: '5254313e957f3ded4139f047b588e38222c33975', class: "sd-number-input__suffix" }, this.inputSuffix), this.useButton && (h("button", { key: 'f7389a1c5869460791249f579b3195b3583255fe', type: "button", class: "sd-number-input__stepper sd-number-input__stepper--increment", disabled: this.isIncrementDisabled(), onClick: this.handleIncrement, tabindex: -1 }, h("sd-icon", { key: 'b272b62e2ce27a1e5ecb86738af6eacb89b0d6c6', name: "add", size: iconSize, color: this.isIncrementDisabled()
1346
+ } }), this.inputSuffix && h("span", { key: '15177064a4daab2ede3af4f8758912da266f1c29', class: "sd-number-input__suffix" }, this.inputSuffix), this.useButton && (h("button", { key: 'dcc1fbfe7c4e7eaa6db95fe7dc9a34f4b82ade8b', type: "button", class: "sd-number-input__stepper sd-number-input__stepper--increment", disabled: this.isIncrementDisabled(), onClick: this.handleIncrement, tabindex: -1 }, h("sd-icon", { key: '58eee48f37c0e942a3734a9275a9d459bc9bc420', name: "add", size: iconSize, color: this.isIncrementDisabled()
1257
1347
  ? NUMBER_INPUT_STEPPER.icon.disabled
1258
1348
  : NUMBER_INPUT_STEPPER.icon.default }))))));
1259
1349
  }
@@ -1275,7 +1365,7 @@ const SdRadioGroup = class {
1275
1365
  registerInstance(this, hostRef);
1276
1366
  this.change = createEvent(this, "sdUpdate", 7);
1277
1367
  }
1278
- /** 현재 선택된 값 */
1368
+ /** 현재 선택된 값 (미지정 시 선택 없음) */
1279
1369
  value;
1280
1370
  /** 라디오 옵션 목록 */
1281
1371
  options = [];
@@ -1303,8 +1393,8 @@ const SdRadioGroup = class {
1303
1393
  return classes.join(' ');
1304
1394
  }
1305
1395
  render() {
1306
- return (h("div", { key: 'e5f4051ea9b2843816a849a018b8040e7b951a55', class: this.getGroupClasses(), role: "radiogroup" }, this.options.map(option => {
1307
- return (h("sd-radio", { key: `radio-${option.value}`, val: String(option.value), value: String(this.value), label: option.label, disabled: this.disabled || !!option.disabled, onSdUpdate: ({ detail }) => this.handleRadioChange(detail) }));
1396
+ return (h("div", { key: '7ee8aaf1872ac215e7d4c27e71d4a0a41c6f5e4e', class: this.getGroupClasses(), role: "radiogroup" }, this.options.map(option => {
1397
+ return (h("sd-radio", { key: `radio-${option.value}`, val: String(option.value), value: String(this.value ?? ''), label: option.label, disabled: this.disabled || !!option.disabled, onSdUpdate: ({ detail }) => this.handleRadioChange(detail) }));
1308
1398
  })));
1309
1399
  }
1310
1400
  static get watchers() { return {
@@ -1315,6 +1405,314 @@ const SdRadioGroup = class {
1315
1405
  };
1316
1406
  SdRadioGroup.style = sdRadioGroupCss();
1317
1407
 
1408
+ const sdSelectCss = () => `sd-select{display:inline-flex}sd-select sd-portal{display:none}sd-select .sd-select{position:relative;width:100%;height:100%}`;
1409
+
1410
+ const SdSelect = class {
1411
+ constructor(hostRef) {
1412
+ registerInstance(this, hostRef);
1413
+ this.update = createEvent(this, "sdUpdate", 7);
1414
+ this.dropDownShow = createEvent(this, "sdDropDownShow", 7);
1415
+ }
1416
+ static VIEWPORT_PADDING = 20;
1417
+ static PORTAL_OFFSET_Y = 4;
1418
+ static CLOSE_ANIMATION_DURATION = 150;
1419
+ get el() { return getElement(this); }
1420
+ /** 셀렉트 타입 (단일/다중/계층) */
1421
+ type = 'default';
1422
+ /** 현재 선택된 값 */
1423
+ value = null;
1424
+ /** 선택 옵션 목록 */
1425
+ options = [];
1426
+ /** 값이 없을 때 표시할 플레이스홀더 */
1427
+ placeholder = '선택';
1428
+ /** 드롭다운 너비 (없으면 트리거 너비로 자동 맞춤) */
1429
+ dropdownWidth = '';
1430
+ /** 드롭다운 최대 너비 */
1431
+ maxDropdownWidth = '640px';
1432
+ /** 드롭다운 최대 높이 */
1433
+ dropdownHeight = '260px';
1434
+ /** 비활성 상태 여부 */
1435
+ disabled = false;
1436
+ /** 레이블 텍스트 */
1437
+ label = '';
1438
+ /** 레이블 너비 */
1439
+ labelWidth = '';
1440
+ /** 필드 우측 어드온 레이블 */
1441
+ addonLabel = '';
1442
+ /** 어드온 정렬 방향 */
1443
+ addonAlign = 'start';
1444
+ /** 에러 상태 여부 */
1445
+ error = false;
1446
+ /** 필드 하단 힌트 텍스트 */
1447
+ hint = '';
1448
+ /** 에러 메시지 */
1449
+ errorMessage = '';
1450
+ /** 유효성 검사 규칙 목록 */
1451
+ rules = [];
1452
+ /** 레이블 영역 아이콘 */
1453
+ icon = undefined;
1454
+ /** 레이블 툴팁 텍스트 */
1455
+ labelTooltip = '';
1456
+ /** 레이블 툴팁 상세 옵션 */
1457
+ labelTooltipProps = null;
1458
+ /** true이면 value로 SelectOption 대신 원시값(string|number) 방출 */
1459
+ emitValue = false;
1460
+ /** 필드 너비 */
1461
+ width = '';
1462
+ /** 드롭다운 내 검색 입력 표시 여부 */
1463
+ useSearch = false;
1464
+ /** 전체 선택 시 표시할 레이블 */
1465
+ allSelectedLabel = '전체';
1466
+ /** 전체 선택 체크박스 표시 여부 */
1467
+ useSelectAll = false;
1468
+ isOpen = false;
1469
+ isAnimatingOut = false;
1470
+ triggerWidth = '200px';
1471
+ resolvedDropdownHeight = '260px';
1472
+ resolvedMaxDropdownWidth = '640px';
1473
+ focused = false;
1474
+ hovered = false;
1475
+ /** 선택 값이 변경될 때 발생합니다. */
1476
+ update;
1477
+ /** 드롭다운 열림/닫힘 상태가 바뀔 때 발생합니다. */
1478
+ dropDownShow;
1479
+ /** 셀렉트 트리거에 포커스를 이동합니다. */
1480
+ async sdFocus() {
1481
+ if (this.disabled)
1482
+ return;
1483
+ await this.triggerComponentRef?.sdFocus();
1484
+ }
1485
+ /** 드롭다운을 엽니다. */
1486
+ async sdOpen() {
1487
+ // sdFocus 직후 호출 시 트리거 ref/레이아웃이 안정될 때까지 한 틱 대기
1488
+ await new Promise(resolve => setTimeout(resolve, 0));
1489
+ if (this.disabled || this.isOpen)
1490
+ return;
1491
+ this.prepareDropdownGeometry();
1492
+ if (this.closeAnimationTimer)
1493
+ clearTimeout(this.closeAnimationTimer);
1494
+ this.isAnimatingOut = false;
1495
+ this.isOpen = true;
1496
+ }
1497
+ triggerRef;
1498
+ triggerComponentRef;
1499
+ closeAnimationTimer;
1500
+ /** 폼 연동용 name 속성 */
1501
+ name = nanoid();
1502
+ triggerHasFocus = false;
1503
+ watchIsOpen(newValue) {
1504
+ this.syncFocusedState(newValue);
1505
+ this.dropDownShow.emit({ isOpen: newValue });
1506
+ }
1507
+ get isMulti() {
1508
+ return this.type === 'multi' || this.type === 'multi_depth';
1509
+ }
1510
+ get displayText() {
1511
+ if (this.isMulti) {
1512
+ if (!Array.isArray(this.value) || this.value.length === 0)
1513
+ return '';
1514
+ const nonDisabledLeaves = this.getNonDisabledLeaves(this.options);
1515
+ const selected = this.getSelectedOptions();
1516
+ const allSelected = nonDisabledLeaves.length > 0 &&
1517
+ nonDisabledLeaves.every(leaf => selected.some(s => s.value === leaf.value));
1518
+ if (allSelected)
1519
+ return this.allSelectedLabel ?? '전체';
1520
+ const flat = this.flattenOptions(this.options);
1521
+ return this.value
1522
+ .map(item => {
1523
+ if (item != null && typeof item === 'object') {
1524
+ const opt = item;
1525
+ return opt.label ?? flat.find(o => o.value === opt.value)?.label ?? '';
1526
+ }
1527
+ return flat.find(o => o.value === item)?.label ?? '';
1528
+ })
1529
+ .filter(Boolean)
1530
+ .join(', ');
1531
+ }
1532
+ if (this.value == null)
1533
+ return '';
1534
+ if (!this.emitValue && typeof this.value === 'object' && !Array.isArray(this.value)) {
1535
+ return this.value.label ?? '';
1536
+ }
1537
+ const flat = this.flattenOptions(this.options);
1538
+ return flat.find(o => o.value === this.value)?.label ?? '';
1539
+ }
1540
+ flattenOptions(options) {
1541
+ return options.flatMap(o => (o.children ? this.flattenOptions(o.children) : [o]));
1542
+ }
1543
+ getNonDisabledLeaves(options) {
1544
+ return options.flatMap(o => {
1545
+ if (o.disabled)
1546
+ return [];
1547
+ if (o.children)
1548
+ return this.getNonDisabledLeaves(o.children);
1549
+ return [o];
1550
+ });
1551
+ }
1552
+ getSelectedOptions() {
1553
+ const val = this.value;
1554
+ if (val == null || !Array.isArray(val))
1555
+ return [];
1556
+ if (this.emitValue) {
1557
+ return val
1558
+ .map(v => this.findOriginalOption(v, this.options))
1559
+ .filter((o) => !!o);
1560
+ }
1561
+ return val;
1562
+ }
1563
+ toMultiValue(options) {
1564
+ return this.emitValue ? options.map(o => o.value) : options;
1565
+ }
1566
+ parsePixelValue(value, fallback) {
1567
+ const parsed = Number.parseFloat(value);
1568
+ return Number.isFinite(parsed) ? parsed : fallback;
1569
+ }
1570
+ updateDropdownViewportConstraints() {
1571
+ if (!this.triggerRef)
1572
+ return;
1573
+ const triggerRect = this.triggerRef.getBoundingClientRect();
1574
+ const viewportPadding = SdSelect.VIEWPORT_PADDING;
1575
+ const offsetY = SdSelect.PORTAL_OFFSET_Y;
1576
+ const preferredHeight = this.parsePixelValue(this.dropdownHeight, 260);
1577
+ const preferredWidth = this.parsePixelValue(this.maxDropdownWidth, 640);
1578
+ const availableBelow = Math.max(window.innerHeight - triggerRect.bottom - viewportPadding - offsetY, 0);
1579
+ const availableAbove = Math.max(triggerRect.top - viewportPadding - offsetY, 0);
1580
+ const availableHeight = Math.max(availableBelow, availableAbove);
1581
+ const availableWidth = Math.max(window.innerWidth - viewportPadding * 2, 0);
1582
+ this.resolvedDropdownHeight = `${Math.min(preferredHeight, availableHeight)}px`;
1583
+ this.resolvedMaxDropdownWidth = `${Math.min(preferredWidth, availableWidth)}px`;
1584
+ }
1585
+ handleViewportResize = () => {
1586
+ if (!this.isOpen)
1587
+ return;
1588
+ this.updateDropdownViewportConstraints();
1589
+ };
1590
+ findOriginalOption(value, options) {
1591
+ for (const opt of options) {
1592
+ if (opt.value === value)
1593
+ return opt;
1594
+ if (opt.children) {
1595
+ const found = this.findOriginalOption(value, opt.children);
1596
+ if (found)
1597
+ return found;
1598
+ }
1599
+ }
1600
+ return undefined;
1601
+ }
1602
+ closeDropdown() {
1603
+ if (!this.isOpen)
1604
+ return;
1605
+ this.isOpen = false;
1606
+ this.isAnimatingOut = true;
1607
+ if (this.closeAnimationTimer)
1608
+ clearTimeout(this.closeAnimationTimer);
1609
+ this.closeAnimationTimer = setTimeout(() => {
1610
+ this.isAnimatingOut = false;
1611
+ }, SdSelect.CLOSE_ANIMATION_DURATION);
1612
+ }
1613
+ prepareDropdownGeometry() {
1614
+ if (this.triggerRef) {
1615
+ this.triggerWidth = `${this.triggerRef.offsetWidth}px`;
1616
+ }
1617
+ this.updateDropdownViewportConstraints();
1618
+ }
1619
+ syncFocusedState(isOpen = this.isOpen) {
1620
+ this.focused = isOpen || this.triggerHasFocus;
1621
+ }
1622
+ handleTriggerFocus = () => {
1623
+ this.triggerHasFocus = true;
1624
+ this.syncFocusedState();
1625
+ };
1626
+ handleTriggerBlur = () => {
1627
+ this.triggerHasFocus = false;
1628
+ this.syncFocusedState();
1629
+ };
1630
+ handleTriggerClick = () => {
1631
+ if (this.isOpen) {
1632
+ this.closeDropdown();
1633
+ return;
1634
+ }
1635
+ this.prepareDropdownGeometry();
1636
+ if (this.closeAnimationTimer)
1637
+ clearTimeout(this.closeAnimationTimer);
1638
+ this.isAnimatingOut = false;
1639
+ this.isOpen = true;
1640
+ };
1641
+ emitUpdate(value) {
1642
+ this.update.emit(value);
1643
+ }
1644
+ handleOptionSelect = (detail) => {
1645
+ const { option, leaves } = detail;
1646
+ if (this.isMulti) {
1647
+ this.handleMultiSelect(option, leaves);
1648
+ }
1649
+ else {
1650
+ this.closeDropdown();
1651
+ this.value = this.emitValue ? option.value : option;
1652
+ const nextValue = this.value;
1653
+ requestAnimationFrame(() => {
1654
+ this.emitUpdate(nextValue);
1655
+ });
1656
+ }
1657
+ };
1658
+ handleMultiSelect(option, leaves) {
1659
+ const selected = this.getSelectedOptions();
1660
+ const isGroup = !!option.children;
1661
+ let newSelected;
1662
+ if (isGroup) {
1663
+ const allSelected = leaves.every(l => selected.some(s => s.value === l.value));
1664
+ if (allSelected) {
1665
+ const leafValues = new Set(leaves.map(l => l.value));
1666
+ newSelected = selected.filter(s => !leafValues.has(s.value));
1667
+ }
1668
+ else {
1669
+ const existing = new Set(selected.map(s => s.value));
1670
+ const toAdd = leaves.filter(l => !existing.has(l.value));
1671
+ newSelected = [...selected, ...toAdd];
1672
+ }
1673
+ }
1674
+ else {
1675
+ const exists = selected.some(s => s.value === option.value);
1676
+ newSelected = exists ? selected.filter(s => s.value !== option.value) : [...selected, option];
1677
+ }
1678
+ this.value = this.toMultiValue(newSelected);
1679
+ this.emitUpdate(this.value);
1680
+ }
1681
+ connectedCallback() {
1682
+ window.addEventListener('resize', this.handleViewportResize);
1683
+ }
1684
+ disconnectedCallback() {
1685
+ window.removeEventListener('resize', this.handleViewportResize);
1686
+ if (this.closeAnimationTimer)
1687
+ clearTimeout(this.closeAnimationTimer);
1688
+ }
1689
+ render() {
1690
+ const portalProps = {
1691
+ open: this.isOpen,
1692
+ parentRef: this.triggerRef,
1693
+ viewportPadding: SdSelect.VIEWPORT_PADDING,
1694
+ onSdClose: () => {
1695
+ this.closeDropdown();
1696
+ },
1697
+ };
1698
+ return (h("sd-field", { key: 'a8107af7c63f38eee519b44e33021f3d650c97a4', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, onMouseEnter: () => {
1699
+ this.hovered = true;
1700
+ }, onMouseLeave: () => {
1701
+ this.hovered = false;
1702
+ } }, h("div", { key: 'd1b3c4d6f1da7ca9eeb31a19db7dd7b28a94103d', class: "sd-select", ref: el => {
1703
+ this.triggerRef = el;
1704
+ } }, h("sd-select-trigger", { key: 'c2ce229c398cf35aa1cdc58a12eb7ed81f316d0d', ref: el => {
1705
+ this.triggerComponentRef = el;
1706
+ }, displayText: this.displayText, placeholder: this.placeholder ?? '선택', disabled: this.disabled, isOpen: this.isOpen, onSdTriggerClick: this.handleTriggerClick, onSdTriggerFocus: this.handleTriggerFocus, onSdTriggerBlur: this.handleTriggerBlur })), (this.isOpen || this.isAnimatingOut) && (h("sd-portal", { key: '1f67ba5abb693d49b2e332edb991bf89edbc2456', ...portalProps }, h("sd-select-listbox", { key: '108acb8763dc0cf4bd7e807643140a9f41381248', type: this.type, options: this.options, value: this.value, emitValue: this.emitValue, useSearch: this.useSearch, useSelectAll: this.useSelectAll, triggerWidth: this.dropdownWidth || this.triggerWidth, maxWidth: this.resolvedMaxDropdownWidth, maxHeight: this.resolvedDropdownHeight, onSdOptionSelect: event => this.handleOptionSelect(event.detail) })))));
1707
+ }
1708
+ static get watchers() { return {
1709
+ "isOpen": [{
1710
+ "watchIsOpen": 0
1711
+ }]
1712
+ }; }
1713
+ };
1714
+ SdSelect.style = sdSelectCss();
1715
+
1318
1716
  const TEXTAREA_TOKENS = {
1319
1717
  paddingX: inputTokens.textinput.sm.paddingX,
1320
1718
  paddingY: inputTokens.textinput.sm.paddingY,
@@ -1475,7 +1873,7 @@ const SdTextarea = class {
1475
1873
  '--sd-system-size-field-sm-height': 'auto',
1476
1874
  '--sd-system-radius-field-sm': `${TEXTAREA_TOKENS.radius}px`,
1477
1875
  };
1478
- return (h("sd-field", { key: '2ad9f1d11282bcbf4da1d365e8084b3e6dd1a434', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: '8e70c87579b4d2ec7908b749867ba090cd4ca743', class: "sd-textarea__content" }, h("textarea", { key: 'fe72f7208a22c8f36786cb53b8bbf18e5d7cf939', name: this.name, ref: el => (this.nativeEl = el), class: `sd-textarea__native ${this.textareaClass}`, value: this.internalValue || '', placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readOnly: this.readonly, autofocus: this.autoFocus, maxLength: this.maxLength, rows: this.rows, spellcheck: this.spellcheck, onInput: this.handleInput, onFocus: event => this.handleFocus('focus', event), onBlur: event => this.handleFocus('blur', event), style: this.textareaStyle }))));
1876
+ return (h("sd-field", { key: 'f8fd8949824938bb79f101de2e5eca7980224b09', name: this.name, label: this.label, labelWidth: this.labelWidth, addonLabel: this.addonLabel, addonAlign: this.addonAlign, hint: this.hint, errorMessage: this.errorMessage, width: this.width, rules: this.rules, error: this.error, disabled: this.disabled, readonly: this.readonly, focused: this.focused, hovered: this.hovered, status: this.status, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false), style: cssVars }, h("div", { key: '382441be15dd047888cf876006f1966256a503b7', class: "sd-textarea__content" }, h("textarea", { key: '5f5985ccdcc401f4aff2f47fe40003abeb76e8b3', name: this.name, ref: el => (this.nativeEl = el), class: `sd-textarea__native ${this.textareaClass}`, value: this.internalValue || '', placeholder: this.placeholder ?? '입력해 주세요.', disabled: this.disabled, readOnly: this.readonly, autofocus: this.autoFocus, maxLength: this.maxLength, rows: this.rows, spellcheck: this.spellcheck, onInput: this.handleInput, onFocus: event => this.handleFocus('focus', event), onBlur: event => this.handleFocus('blur', event), style: this.textareaStyle }))));
1479
1877
  }
1480
1878
  static get watchers() { return {
1481
1879
  "value": [{
@@ -1488,4 +1886,4 @@ const SdTextarea = class {
1488
1886
  };
1489
1887
  SdTextarea.style = sdTextareaCss();
1490
1888
 
1491
- export { SdDatePicker as sd_date_picker, SdDateRangePicker as sd_date_range_picker, SdFilePicker as sd_file_picker, SdInput as sd_input, SdNumberInput as sd_number_input, SdRadioGroup as sd_radio_group, SdTextarea as sd_textarea };
1889
+ export { SdDatePicker as sd_date_picker, SdDateRangePicker as sd_date_range_picker, SdFilePicker as sd_file_picker, SdInput as sd_input, SdNumberInput as sd_number_input, SdRadioGroup as sd_radio_group, SdSelect as sd_select, SdTextarea as sd_textarea };