@spectral_labs/ui 1.1.2 → 1.2.1

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 (462) hide show
  1. package/dist/components/accordion/__tests__/AccordionTest.svelte +4 -4
  2. package/dist/components/accordion/components/accordion-content.svelte +3 -3
  3. package/dist/components/accordion/components/accordion-item.svelte +1 -1
  4. package/dist/components/accordion/components/accordion-root.svelte +5 -7
  5. package/dist/components/accordion/components/accordion-root.svelte.d.ts.map +1 -1
  6. package/dist/components/accordion/components/accordion-trigger.svelte +12 -12
  7. package/dist/components/alert-dialog/__tests__/AlertDialogTest.svelte +6 -3
  8. package/dist/components/alert-dialog/__tests__/alert-dialog.a11y.test.js +9 -2
  9. package/dist/components/alert-dialog/components/alert-dialog-action.svelte +2 -2
  10. package/dist/components/alert-dialog/components/alert-dialog-cancel.svelte +2 -2
  11. package/dist/components/alert-dialog/components/alert-dialog-content.svelte +15 -11
  12. package/dist/components/alert-dialog/components/alert-dialog-content.svelte.d.ts.map +1 -1
  13. package/dist/components/alert-dialog/components/alert-dialog-description.svelte +1 -1
  14. package/dist/components/alert-dialog/components/alert-dialog-overlay.svelte +8 -6
  15. package/dist/components/alert-dialog/components/alert-dialog-overlay.svelte.d.ts.map +1 -1
  16. package/dist/components/alert-dialog/components/alert-dialog-root.svelte +7 -2
  17. package/dist/components/alert-dialog/components/alert-dialog-root.svelte.d.ts.map +1 -1
  18. package/dist/components/alert-dialog/components/alert-dialog-title.svelte +6 -2
  19. package/dist/components/alert-dialog/components/alert-dialog-trigger.svelte +3 -3
  20. package/dist/components/app-bar/app-bar.svelte +12 -12
  21. package/dist/components/aspect-ratio/aspect-ratio.svelte +2 -2
  22. package/dist/components/avatar/avatar.svelte +6 -6
  23. package/dist/components/badge/badge.svelte +60 -16
  24. package/dist/components/badge/types.d.ts.map +1 -1
  25. package/dist/components/bottom-sheet/__tests__/BottomSheetTest.svelte +16 -6
  26. package/dist/components/bottom-sheet/components/bottom-sheet-root.svelte +20 -20
  27. package/dist/components/breadcrumb/breadcrumb-item.svelte +2 -2
  28. package/dist/components/breadcrumb/breadcrumb-link.svelte +6 -2
  29. package/dist/components/breadcrumb/breadcrumb-link.svelte.d.ts.map +1 -1
  30. package/dist/components/breadcrumb/breadcrumb-list.svelte +2 -2
  31. package/dist/components/breadcrumb/breadcrumb-page.svelte +3 -3
  32. package/dist/components/breadcrumb/breadcrumb-separator.svelte +12 -4
  33. package/dist/components/breadcrumb/breadcrumb.svelte +2 -2
  34. package/dist/components/button/button.svelte +1 -1
  35. package/dist/components/button/types.d.ts.map +1 -1
  36. package/dist/components/calendar/__tests__/CalendarTest.svelte +1 -1
  37. package/dist/components/calendar/calendar.svelte.d.ts.map +1 -1
  38. package/dist/components/calendar/calendar.svelte.js +89 -33
  39. package/dist/components/calendar/components/calendar-grid.svelte +16 -15
  40. package/dist/components/calendar/components/calendar-grid.svelte.d.ts.map +1 -1
  41. package/dist/components/calendar/components/calendar-header.svelte +1 -1
  42. package/dist/components/calendar/components/calendar-heading.svelte +2 -2
  43. package/dist/components/calendar/components/calendar-next-button.svelte +14 -6
  44. package/dist/components/calendar/components/calendar-prev-button.svelte +14 -6
  45. package/dist/components/calendar/components/calendar-root.svelte +50 -22
  46. package/dist/components/calendar/components/calendar-root.svelte.d.ts.map +1 -1
  47. package/dist/components/card/card.svelte +1 -1
  48. package/dist/components/checkbox/checkbox.svelte +23 -27
  49. package/dist/components/checkbox/checkbox.svelte.d.ts.map +1 -1
  50. package/dist/components/chips/chip-group.svelte +8 -13
  51. package/dist/components/chips/chip-group.svelte.d.ts.map +1 -1
  52. package/dist/components/chips/chips.svelte +32 -39
  53. package/dist/components/chips/chips.svelte.d.ts.map +1 -1
  54. package/dist/components/chips/types.d.ts +5 -5
  55. package/dist/components/chips/types.d.ts.map +1 -1
  56. package/dist/components/collapsible/__tests__/CollapsibleTest.svelte +1 -1
  57. package/dist/components/collapsible/components/collapsible-content.svelte +8 -6
  58. package/dist/components/collapsible/components/collapsible-content.svelte.d.ts.map +1 -1
  59. package/dist/components/collapsible/components/collapsible-root.svelte +2 -3
  60. package/dist/components/collapsible/components/collapsible-root.svelte.d.ts.map +1 -1
  61. package/dist/components/collapsible/components/collapsible-trigger.svelte +2 -2
  62. package/dist/components/combobox/__tests__/ComboboxTest.svelte +5 -5
  63. package/dist/components/combobox/components/combobox-content.svelte +4 -6
  64. package/dist/components/combobox/components/combobox-content.svelte.d.ts.map +1 -1
  65. package/dist/components/combobox/components/combobox-input.svelte +10 -15
  66. package/dist/components/combobox/components/combobox-input.svelte.d.ts.map +1 -1
  67. package/dist/components/combobox/components/combobox-item.svelte +5 -8
  68. package/dist/components/combobox/components/combobox-item.svelte.d.ts.map +1 -1
  69. package/dist/components/combobox/components/combobox-root.svelte +13 -18
  70. package/dist/components/combobox/components/combobox-root.svelte.d.ts.map +1 -1
  71. package/dist/components/combobox/index.d.ts +1 -1
  72. package/dist/components/combobox/index.d.ts.map +1 -1
  73. package/dist/components/command/__tests__/CommandTest.svelte +19 -10
  74. package/dist/components/command/__tests__/command.a11y.test.js +1 -1
  75. package/dist/components/command/command.svelte.d.ts.map +1 -1
  76. package/dist/components/command/command.svelte.js +20 -10
  77. package/dist/components/command/components/command-empty.svelte +2 -2
  78. package/dist/components/command/components/command-group.svelte +6 -4
  79. package/dist/components/command/components/command-group.svelte.d.ts.map +1 -1
  80. package/dist/components/command/components/command-input.svelte +27 -14
  81. package/dist/components/command/components/command-input.svelte.d.ts.map +1 -1
  82. package/dist/components/command/components/command-item.svelte +12 -7
  83. package/dist/components/command/components/command-item.svelte.d.ts.map +1 -1
  84. package/dist/components/command/components/command-list.svelte +2 -7
  85. package/dist/components/command/components/command-root.svelte +18 -10
  86. package/dist/components/command/components/command-root.svelte.d.ts.map +1 -1
  87. package/dist/components/command/components/command-separator.svelte +2 -2
  88. package/dist/components/context-menu/__tests__/ContextMenuNonInteractiveTest.svelte +32 -0
  89. package/dist/components/context-menu/__tests__/ContextMenuTest.svelte +1 -1
  90. package/dist/components/context-menu/__tests__/context-menu.test.svelte.js +77 -1
  91. package/dist/components/context-menu/components/context-menu-content.svelte +7 -10
  92. package/dist/components/context-menu/components/context-menu-content.svelte.d.ts.map +1 -1
  93. package/dist/components/context-menu/components/context-menu-root.svelte +7 -2
  94. package/dist/components/context-menu/components/context-menu-root.svelte.d.ts.map +1 -1
  95. package/dist/components/context-menu/components/context-menu-trigger.svelte +15 -15
  96. package/dist/components/context-menu/index.d.ts +1 -1
  97. package/dist/components/context-menu/index.d.ts.map +1 -1
  98. package/dist/components/context-menu/types.d.ts +16 -1
  99. package/dist/components/context-menu/types.d.ts.map +1 -1
  100. package/dist/components/date-field/__tests__/DateFieldTest.svelte +1 -1
  101. package/dist/components/date-field/__tests__/date-field.test.svelte.js +5 -5
  102. package/dist/components/date-field/components/date-field-root.svelte +55 -55
  103. package/dist/components/date-field/types.d.ts +14 -14
  104. package/dist/components/date-field/types.d.ts.map +1 -1
  105. package/dist/components/date-picker/__tests__/DatePickerTest.svelte +2 -8
  106. package/dist/components/date-picker/__tests__/date-picker.test.svelte.js +10 -9
  107. package/dist/components/date-picker/components/date-picker-root.svelte +38 -31
  108. package/dist/components/date-picker/components/date-picker-root.svelte.d.ts.map +1 -1
  109. package/dist/components/date-range-field/__tests__/DateRangeFieldTest.svelte +1 -1
  110. package/dist/components/date-range-field/__tests__/date-range-field.test.svelte.js +3 -3
  111. package/dist/components/date-range-field/components/date-range-field-root.svelte +5 -5
  112. package/dist/components/date-range-picker/__tests__/DateRangePickerTest.svelte +2 -7
  113. package/dist/components/date-range-picker/__tests__/date-range-picker.test.svelte.js +11 -11
  114. package/dist/components/date-range-picker/components/date-range-picker-root.svelte +40 -32
  115. package/dist/components/date-range-picker/components/date-range-picker-root.svelte.d.ts.map +1 -1
  116. package/dist/components/dialog/__tests__/DialogTest.svelte +8 -3
  117. package/dist/components/dialog/components/dialog-close.svelte +2 -2
  118. package/dist/components/dialog/components/dialog-content.svelte +16 -13
  119. package/dist/components/dialog/components/dialog-content.svelte.d.ts.map +1 -1
  120. package/dist/components/dialog/components/dialog-description.svelte +1 -1
  121. package/dist/components/dialog/components/dialog-overlay.svelte +8 -6
  122. package/dist/components/dialog/components/dialog-overlay.svelte.d.ts.map +1 -1
  123. package/dist/components/dialog/components/dialog-root.svelte +4 -2
  124. package/dist/components/dialog/components/dialog-root.svelte.d.ts.map +1 -1
  125. package/dist/components/dialog/components/dialog-title.svelte +6 -2
  126. package/dist/components/dialog/components/dialog-trigger.svelte +3 -3
  127. package/dist/components/drop-zone/drop-zone.svelte +12 -18
  128. package/dist/components/drop-zone/drop-zone.svelte.d.ts.map +1 -1
  129. package/dist/components/dropdown-menu/__tests__/DropdownMenuTest.svelte +1 -1
  130. package/dist/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte +19 -8
  131. package/dist/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte.d.ts.map +1 -1
  132. package/dist/components/dropdown-menu/components/dropdown-menu-content.svelte +8 -12
  133. package/dist/components/dropdown-menu/components/dropdown-menu-content.svelte.d.ts.map +1 -1
  134. package/dist/components/dropdown-menu/components/dropdown-menu-item.svelte +4 -6
  135. package/dist/components/dropdown-menu/components/dropdown-menu-item.svelte.d.ts.map +1 -1
  136. package/dist/components/dropdown-menu/components/dropdown-menu-label.svelte +1 -1
  137. package/dist/components/dropdown-menu/components/dropdown-menu-root.svelte +7 -2
  138. package/dist/components/dropdown-menu/components/dropdown-menu-root.svelte.d.ts.map +1 -1
  139. package/dist/components/dropdown-menu/components/dropdown-menu-separator.svelte +2 -2
  140. package/dist/components/dropdown-menu/components/dropdown-menu-sub-content.svelte +5 -8
  141. package/dist/components/dropdown-menu/components/dropdown-menu-sub-content.svelte.d.ts.map +1 -1
  142. package/dist/components/dropdown-menu/components/dropdown-menu-sub-trigger.svelte +19 -14
  143. package/dist/components/dropdown-menu/components/dropdown-menu-sub-trigger.svelte.d.ts.map +1 -1
  144. package/dist/components/dropdown-menu/components/dropdown-menu-sub.svelte +19 -7
  145. package/dist/components/dropdown-menu/components/dropdown-menu-sub.svelte.d.ts.map +1 -1
  146. package/dist/components/dropdown-menu/components/dropdown-menu-trigger.svelte +5 -7
  147. package/dist/components/dropdown-menu/components/dropdown-menu-trigger.svelte.d.ts.map +1 -1
  148. package/dist/components/empty-state/empty-state.svelte +6 -6
  149. package/dist/components/fab/fab.svelte +2 -2
  150. package/dist/components/field/__tests__/FieldTest.svelte +2 -2
  151. package/dist/components/field/field-description.svelte +1 -1
  152. package/dist/components/field/field-error.svelte +2 -2
  153. package/dist/components/field/field-group.svelte +1 -1
  154. package/dist/components/field/field-label.svelte +2 -2
  155. package/dist/components/field/field-separator.svelte +4 -4
  156. package/dist/components/field/field.svelte +1 -1
  157. package/dist/components/grid-list/__tests__/GridListTest.svelte +2 -2
  158. package/dist/components/grid-list/components/grid-list-item.svelte +11 -17
  159. package/dist/components/grid-list/components/grid-list-item.svelte.d.ts.map +1 -1
  160. package/dist/components/grid-list/components/grid-list-root.svelte +32 -35
  161. package/dist/components/grid-list/components/grid-list-root.svelte.d.ts.map +1 -1
  162. package/dist/components/grid-list/grid-list.svelte.d.ts.map +1 -1
  163. package/dist/components/grid-list/grid-list.svelte.js +25 -15
  164. package/dist/components/grid-list/index.d.ts +1 -1
  165. package/dist/components/grid-list/index.d.ts.map +1 -1
  166. package/dist/components/grid-list/types.d.ts +21 -21
  167. package/dist/components/grid-list/types.d.ts.map +1 -1
  168. package/dist/components/hover-card/__tests__/HoverCardTest.svelte +3 -3
  169. package/dist/components/hover-card/components/hover-card-content.svelte +26 -12
  170. package/dist/components/hover-card/components/hover-card-content.svelte.d.ts.map +1 -1
  171. package/dist/components/hover-card/components/hover-card-root.svelte +10 -4
  172. package/dist/components/hover-card/components/hover-card-root.svelte.d.ts.map +1 -1
  173. package/dist/components/hover-card/components/hover-card-trigger.svelte +3 -4
  174. package/dist/components/hover-card/components/hover-card-trigger.svelte.d.ts.map +1 -1
  175. package/dist/components/indicator/indicator.svelte +5 -5
  176. package/dist/components/input/__tests__/input.test.svelte.js +29 -0
  177. package/dist/components/input/input.svelte +22 -5
  178. package/dist/components/label/label.svelte +2 -3
  179. package/dist/components/label/label.svelte.d.ts.map +1 -1
  180. package/dist/components/language-select/__tests__/languages.test.js +8 -8
  181. package/dist/components/language-select/language-select.svelte +23 -35
  182. package/dist/components/language-select/language-select.svelte.d.ts.map +1 -1
  183. package/dist/components/link-preview/__tests__/LinkPreviewTest.svelte +2 -2
  184. package/dist/components/link-preview/__tests__/link-preview.a11y.test.js +5 -1
  185. package/dist/components/link-preview/__tests__/link-preview.test.svelte.js +4 -1
  186. package/dist/components/link-preview/components/link-preview-content.svelte +16 -7
  187. package/dist/components/link-preview/components/link-preview-content.svelte.d.ts.map +1 -1
  188. package/dist/components/link-preview/components/link-preview-root.svelte +7 -2
  189. package/dist/components/link-preview/components/link-preview-root.svelte.d.ts.map +1 -1
  190. package/dist/components/link-preview/components/link-preview-trigger.svelte +15 -13
  191. package/dist/components/link-preview/components/link-preview-trigger.svelte.d.ts.map +1 -1
  192. package/dist/components/link-preview/index.d.ts +1 -1
  193. package/dist/components/link-preview/index.d.ts.map +1 -1
  194. package/dist/components/list/components/list-item.svelte +4 -4
  195. package/dist/components/list/components/list-root.svelte +2 -2
  196. package/dist/components/menubar/__tests__/MenubarTest.svelte +5 -5
  197. package/dist/components/menubar/__tests__/menubar.a11y.test.js +5 -1
  198. package/dist/components/menubar/components/menubar-content.svelte +36 -27
  199. package/dist/components/menubar/components/menubar-content.svelte.d.ts.map +1 -1
  200. package/dist/components/menubar/components/menubar-menu.svelte +7 -3
  201. package/dist/components/menubar/components/menubar-menu.svelte.d.ts.map +1 -1
  202. package/dist/components/menubar/components/menubar-root.svelte +12 -22
  203. package/dist/components/menubar/components/menubar-root.svelte.d.ts.map +1 -1
  204. package/dist/components/menubar/components/menubar-trigger.svelte +6 -8
  205. package/dist/components/menubar/components/menubar-trigger.svelte.d.ts.map +1 -1
  206. package/dist/components/meter/meter.svelte +6 -9
  207. package/dist/components/meter/meter.svelte.d.ts.map +1 -1
  208. package/dist/components/nav-bar/components/nav-bar-item.svelte +9 -12
  209. package/dist/components/nav-bar/components/nav-bar-item.svelte.d.ts.map +1 -1
  210. package/dist/components/nav-bar/components/nav-bar-root.svelte +3 -3
  211. package/dist/components/nav-drawer/components/nav-drawer-item.svelte +8 -11
  212. package/dist/components/nav-drawer/components/nav-drawer-item.svelte.d.ts.map +1 -1
  213. package/dist/components/nav-drawer/components/nav-drawer-root.svelte +11 -11
  214. package/dist/components/nav-drawer/components/nav-drawer-root.svelte.d.ts.map +1 -1
  215. package/dist/components/nav-rail/components/nav-rail-item.svelte +10 -12
  216. package/dist/components/nav-rail/components/nav-rail-item.svelte.d.ts.map +1 -1
  217. package/dist/components/nav-rail/components/nav-rail-root.svelte +4 -4
  218. package/dist/components/pagination/pagination.svelte +28 -33
  219. package/dist/components/pagination/pagination.svelte.d.ts.map +1 -1
  220. package/dist/components/pin-input/pin-input.svelte +21 -20
  221. package/dist/components/pin-input/pin-input.svelte.d.ts.map +1 -1
  222. package/dist/components/popover/__tests__/PopoverTest.svelte +2 -2
  223. package/dist/components/popover/components/popover-close.svelte +2 -2
  224. package/dist/components/popover/components/popover-content.svelte +48 -25
  225. package/dist/components/popover/components/popover-content.svelte.d.ts.map +1 -1
  226. package/dist/components/popover/components/popover-root.svelte +1 -1
  227. package/dist/components/popover/components/popover-trigger.svelte +4 -5
  228. package/dist/components/popover/components/popover-trigger.svelte.d.ts.map +1 -1
  229. package/dist/components/progress/progress.svelte +3 -3
  230. package/dist/components/radio-group/components/radio-group-item.svelte +8 -9
  231. package/dist/components/radio-group/components/radio-group-item.svelte.d.ts.map +1 -1
  232. package/dist/components/radio-group/components/radio-group-root.svelte +6 -5
  233. package/dist/components/radio-group/components/radio-group-root.svelte.d.ts.map +1 -1
  234. package/dist/components/range-calendar/__tests__/RangeCalendarTest.svelte +1 -1
  235. package/dist/components/range-calendar/__tests__/range-calendar.test.svelte.js +4 -1
  236. package/dist/components/range-calendar/components/range-calendar-grid.svelte +16 -17
  237. package/dist/components/range-calendar/components/range-calendar-grid.svelte.d.ts.map +1 -1
  238. package/dist/components/range-calendar/components/range-calendar-header.svelte +29 -13
  239. package/dist/components/range-calendar/components/range-calendar-root.svelte +42 -17
  240. package/dist/components/range-calendar/components/range-calendar-root.svelte.d.ts.map +1 -1
  241. package/dist/components/range-calendar/range-calendar.svelte.d.ts.map +1 -1
  242. package/dist/components/range-calendar/range-calendar.svelte.js +54 -24
  243. package/dist/components/rating-group/rating-group.svelte +17 -23
  244. package/dist/components/rating-group/rating-group.svelte.d.ts.map +1 -1
  245. package/dist/components/scroll-area/scroll-area.svelte +22 -28
  246. package/dist/components/scroll-area/scroll-area.svelte.d.ts.map +1 -1
  247. package/dist/components/search-field/__tests__/SearchFieldTest.svelte +3 -3
  248. package/dist/components/search-field/__tests__/search-field.test.svelte.js +28 -0
  249. package/dist/components/search-field/search-field.svelte +44 -18
  250. package/dist/components/search-field/types.d.ts +7 -7
  251. package/dist/components/search-field/types.d.ts.map +1 -1
  252. package/dist/components/select/__tests__/SelectLabelPersistenceTest.svelte +6 -8
  253. package/dist/components/select/__tests__/SelectTest.svelte +1 -1
  254. package/dist/components/select/components/select-content.svelte +13 -16
  255. package/dist/components/select/components/select-content.svelte.d.ts.map +1 -1
  256. package/dist/components/select/components/select-item.svelte +14 -16
  257. package/dist/components/select/components/select-item.svelte.d.ts.map +1 -1
  258. package/dist/components/select/components/select-root.svelte +9 -12
  259. package/dist/components/select/components/select-root.svelte.d.ts.map +1 -1
  260. package/dist/components/select/components/select-trigger.svelte +20 -12
  261. package/dist/components/select/components/select-trigger.svelte.d.ts.map +1 -1
  262. package/dist/components/separator/separator.svelte +1 -1
  263. package/dist/components/sheet/__tests__/SheetTest.svelte +2 -2
  264. package/dist/components/sheet/components/sheet-close.svelte +2 -2
  265. package/dist/components/sheet/components/sheet-content.svelte +12 -11
  266. package/dist/components/sheet/components/sheet-content.svelte.d.ts.map +1 -1
  267. package/dist/components/sheet/components/sheet-description.svelte +1 -1
  268. package/dist/components/sheet/components/sheet-overlay.svelte +8 -6
  269. package/dist/components/sheet/components/sheet-overlay.svelte.d.ts.map +1 -1
  270. package/dist/components/sheet/components/sheet-root.svelte +4 -2
  271. package/dist/components/sheet/components/sheet-root.svelte.d.ts.map +1 -1
  272. package/dist/components/sheet/components/sheet-title.svelte +7 -6
  273. package/dist/components/sheet/components/sheet-trigger.svelte +3 -3
  274. package/dist/components/side-sheet/__tests__/side-sheet.test.svelte.js +3 -1
  275. package/dist/components/side-sheet/side-sheet.svelte +5 -5
  276. package/dist/components/sidebar/__tests__/SidebarFullTest.svelte +7 -7
  277. package/dist/components/sidebar/__tests__/SidebarTest.svelte +2 -2
  278. package/dist/components/sidebar/__tests__/sidebar.test.svelte.js +9 -5
  279. package/dist/components/sidebar/components/sidebar-content.svelte +1 -1
  280. package/dist/components/sidebar/components/sidebar-footer.svelte +1 -1
  281. package/dist/components/sidebar/components/sidebar-group-content.svelte +1 -1
  282. package/dist/components/sidebar/components/sidebar-group-label.svelte +1 -1
  283. package/dist/components/sidebar/components/sidebar-group.svelte +1 -1
  284. package/dist/components/sidebar/components/sidebar-header.svelte +1 -1
  285. package/dist/components/sidebar/components/sidebar-inset.svelte +1 -1
  286. package/dist/components/sidebar/components/sidebar-menu-action.svelte +11 -4
  287. package/dist/components/sidebar/components/sidebar-menu-action.svelte.d.ts.map +1 -1
  288. package/dist/components/sidebar/components/sidebar-menu-button.svelte +8 -4
  289. package/dist/components/sidebar/components/sidebar-menu-item.svelte +1 -1
  290. package/dist/components/sidebar/components/sidebar-menu-sub-button.svelte +5 -3
  291. package/dist/components/sidebar/components/sidebar-menu-sub-item.svelte +1 -1
  292. package/dist/components/sidebar/components/sidebar-menu-sub.svelte +1 -1
  293. package/dist/components/sidebar/components/sidebar-menu.svelte +1 -1
  294. package/dist/components/sidebar/components/sidebar-provider.svelte +5 -3
  295. package/dist/components/sidebar/components/sidebar-provider.svelte.d.ts.map +1 -1
  296. package/dist/components/sidebar/components/sidebar-root.svelte +6 -4
  297. package/dist/components/sidebar/components/sidebar-separator.svelte +1 -1
  298. package/dist/components/sidebar/components/sidebar-trigger.svelte +13 -5
  299. package/dist/components/sidebar/sidebar.svelte.d.ts.map +1 -1
  300. package/dist/components/sidebar/sidebar.svelte.js +9 -3
  301. package/dist/components/simple-dialog/__tests__/SimpleDialogTest.svelte +4 -4
  302. package/dist/components/simple-dialog/simple-dialog.svelte +7 -7
  303. package/dist/components/simple-tooltip/__tests__/SimpleTooltipTest.svelte +2 -2
  304. package/dist/components/simple-tooltip/__tests__/simple-tooltip.test.svelte.js +1 -0
  305. package/dist/components/simple-tooltip/simple-tooltip.svelte +1 -1
  306. package/dist/components/slider/slider.svelte +11 -15
  307. package/dist/components/slider/slider.svelte.d.ts.map +1 -1
  308. package/dist/components/slider/types.d.ts +10 -10
  309. package/dist/components/slider/types.d.ts.map +1 -1
  310. package/dist/components/sortable-list/__tests__/SortableListTest.svelte +9 -2
  311. package/dist/components/sortable-list/__tests__/sortable-list.test.svelte.js +13 -7
  312. package/dist/components/sortable-list/components/sortable-list-handle.svelte +20 -25
  313. package/dist/components/sortable-list/components/sortable-list-handle.svelte.d.ts.map +1 -1
  314. package/dist/components/sortable-list/components/sortable-list-indicator.svelte +11 -16
  315. package/dist/components/sortable-list/components/sortable-list-indicator.svelte.d.ts.map +1 -1
  316. package/dist/components/sortable-list/components/sortable-list-item.svelte +5 -9
  317. package/dist/components/sortable-list/components/sortable-list-item.svelte.d.ts.map +1 -1
  318. package/dist/components/sortable-list/components/sortable-list-root.svelte +3 -3
  319. package/dist/components/sortable-list/sortable-list.svelte.d.ts.map +1 -1
  320. package/dist/components/sortable-list/sortable-list.svelte.js +8 -10
  321. package/dist/components/sortable-list/types.d.ts +15 -15
  322. package/dist/components/sortable-list/types.d.ts.map +1 -1
  323. package/dist/components/splitter/splitter.svelte +21 -30
  324. package/dist/components/splitter/splitter.svelte.d.ts.map +1 -1
  325. package/dist/components/switch/switch.svelte +11 -11
  326. package/dist/components/switch/switch.svelte.d.ts.map +1 -1
  327. package/dist/components/table/components/table-body.svelte +1 -1
  328. package/dist/components/table/components/table-cell.svelte +23 -35
  329. package/dist/components/table/components/table-cell.svelte.d.ts.map +1 -1
  330. package/dist/components/table/components/table-header.svelte +1 -1
  331. package/dist/components/table/components/table-resize-handle.svelte +7 -10
  332. package/dist/components/table/components/table-resize-handle.svelte.d.ts.map +1 -1
  333. package/dist/components/table/components/table-root.svelte +26 -22
  334. package/dist/components/table/components/table-row.svelte +5 -4
  335. package/dist/components/table/components/table-row.svelte.d.ts.map +1 -1
  336. package/dist/components/table/table.svelte.d.ts.map +1 -1
  337. package/dist/components/table/table.svelte.js +6 -2
  338. package/dist/components/tabs/__tests__/TabsTest.svelte +11 -9
  339. package/dist/components/tabs/__tests__/tabs.test.svelte.js +77 -1
  340. package/dist/components/tabs/components/tabs-content.svelte +2 -2
  341. package/dist/components/tabs/components/tabs-list.svelte +61 -6
  342. package/dist/components/tabs/components/tabs-list.svelte.d.ts.map +1 -1
  343. package/dist/components/tabs/components/tabs-root.svelte +1 -1
  344. package/dist/components/tabs/components/tabs-trigger.svelte +4 -5
  345. package/dist/components/tabs/components/tabs-trigger.svelte.d.ts.map +1 -1
  346. package/dist/components/tabs/index.d.ts +1 -1
  347. package/dist/components/tabs/index.d.ts.map +1 -1
  348. package/dist/components/tabs/types.d.ts +26 -0
  349. package/dist/components/tabs/types.d.ts.map +1 -1
  350. package/dist/components/textarea/__tests__/textarea.test.svelte.js +29 -0
  351. package/dist/components/textarea/textarea.svelte +14 -1
  352. package/dist/components/time-field/__tests__/TimeFieldTest.svelte +1 -1
  353. package/dist/components/time-field/__tests__/time-field.test.svelte.js +6 -8
  354. package/dist/components/time-field/components/time-field-root.svelte +67 -73
  355. package/dist/components/time-field/components/time-field-root.svelte.d.ts.map +1 -1
  356. package/dist/components/time-field/index.d.ts +1 -1
  357. package/dist/components/time-field/index.d.ts.map +1 -1
  358. package/dist/components/time-field/time-field.svelte.d.ts.map +1 -1
  359. package/dist/components/time-field/types.d.ts +13 -13
  360. package/dist/components/time-field/types.d.ts.map +1 -1
  361. package/dist/components/time-range-field/__tests__/TimeRangeFieldTest.svelte +1 -1
  362. package/dist/components/time-range-field/__tests__/time-range-field.test.svelte.js +4 -4
  363. package/dist/components/time-range-field/components/time-range-field-root.svelte +5 -5
  364. package/dist/components/time-range-field/types.d.ts +1 -1
  365. package/dist/components/time-range-field/types.d.ts.map +1 -1
  366. package/dist/components/toast/toast.svelte +15 -15
  367. package/dist/components/toggle/toggle.svelte +3 -4
  368. package/dist/components/toggle/toggle.svelte.d.ts.map +1 -1
  369. package/dist/components/toggle-group/components/toggle-group-item.svelte +3 -4
  370. package/dist/components/toggle-group/components/toggle-group-item.svelte.d.ts.map +1 -1
  371. package/dist/components/toggle-group/components/toggle-group-root.svelte +7 -11
  372. package/dist/components/toggle-group/components/toggle-group-root.svelte.d.ts.map +1 -1
  373. package/dist/components/toggle-group/types.d.ts.map +1 -1
  374. package/dist/components/toolbar/__tests__/ToolbarCompositionTest.svelte +7 -7
  375. package/dist/components/toolbar/__tests__/ToolbarTabstopTest.svelte +5 -5
  376. package/dist/components/toolbar/toolbar-group.svelte +3 -8
  377. package/dist/components/toolbar/toolbar-group.svelte.d.ts.map +1 -1
  378. package/dist/components/toolbar/toolbar-separator.svelte +2 -3
  379. package/dist/components/toolbar/toolbar-separator.svelte.d.ts.map +1 -1
  380. package/dist/components/toolbar/toolbar.svelte +17 -23
  381. package/dist/components/toolbar/toolbar.svelte.d.ts.map +1 -1
  382. package/dist/components/tooltip/__tests__/TooltipTest.svelte +1 -1
  383. package/dist/components/tooltip/components/tooltip-content.svelte +20 -15
  384. package/dist/components/tooltip/components/tooltip-content.svelte.d.ts.map +1 -1
  385. package/dist/components/tooltip/components/tooltip-provider.svelte +8 -3
  386. package/dist/components/tooltip/components/tooltip-provider.svelte.d.ts.map +1 -1
  387. package/dist/components/tooltip/components/tooltip-root.svelte +1 -1
  388. package/dist/components/tooltip/components/tooltip-trigger.svelte +15 -13
  389. package/dist/components/tooltip/components/tooltip-trigger.svelte.d.ts.map +1 -1
  390. package/dist/components/tooltip/index.d.ts +1 -1
  391. package/dist/components/tooltip/index.d.ts.map +1 -1
  392. package/dist/components/tooltip/tooltip-provider.svelte.d.ts.map +1 -1
  393. package/dist/components/tree/__tests__/TreeLabelContentTest.svelte +7 -7
  394. package/dist/components/tree/__tests__/TreeTest.svelte +7 -7
  395. package/dist/components/tree/components/tree-item.svelte +34 -30
  396. package/dist/components/tree/components/tree-item.svelte.d.ts.map +1 -1
  397. package/dist/components/tree/components/tree-root.svelte +2 -2
  398. package/dist/components/tree/tree.svelte.d.ts.map +1 -1
  399. package/dist/components/tree/types.d.ts +9 -9
  400. package/dist/components/tree/types.d.ts.map +1 -1
  401. package/dist/components/virtualizer/__tests__/waterfall-layout.test.js +1 -1
  402. package/dist/components/virtualizer/components/virtualizer-root.svelte +8 -17
  403. package/dist/components/virtualizer/components/virtualizer-root.svelte.d.ts.map +1 -1
  404. package/dist/index.d.ts +2 -2
  405. package/dist/index.d.ts.map +1 -1
  406. package/dist/index.js +1 -1
  407. package/dist/internal/announcer/announcer.svelte.d.ts.map +1 -1
  408. package/dist/internal/date-time/calendar-helpers.d.ts.map +1 -1
  409. package/dist/internal/date-time/formatter.d.ts.map +1 -1
  410. package/dist/internal/date-time/types.d.ts.map +1 -1
  411. package/dist/internal/date-time/types.js +4 -1
  412. package/dist/internal/date-time/utils.d.ts +2 -2
  413. package/dist/internal/date-time/utils.d.ts.map +1 -1
  414. package/dist/internal/date-time/utils.js +2 -2
  415. package/dist/internal/dismissible-layer/dismissible-layer.svelte.d.ts.map +1 -1
  416. package/dist/internal/dismissible-layer/dismissible-layer.svelte.js +6 -6
  417. package/dist/internal/drag-drop/__tests__/auto-scroll.test.js +6 -2
  418. package/dist/internal/drag-drop/__tests__/drag-session.test.svelte.js +9 -4
  419. package/dist/internal/drag-drop/__tests__/drop-delegate.test.js +18 -10
  420. package/dist/internal/drag-drop/auto-scroll.svelte.d.ts.map +1 -1
  421. package/dist/internal/drag-drop/auto-scroll.svelte.js +12 -8
  422. package/dist/internal/drag-drop/drag-session.svelte.d.ts.map +1 -1
  423. package/dist/internal/drag-drop/drag-session.svelte.js +41 -17
  424. package/dist/internal/drag-drop/drag-source.svelte.d.ts.map +1 -1
  425. package/dist/internal/drag-drop/drop-delegate.svelte.d.ts.map +1 -1
  426. package/dist/internal/drag-drop/drop-delegate.svelte.js +3 -3
  427. package/dist/internal/drag-drop/drop-target.svelte.d.ts.map +1 -1
  428. package/dist/internal/drag-drop/keyboard-dnd.svelte.d.ts.map +1 -1
  429. package/dist/internal/escape-layer/escape-layer.svelte.d.ts.map +1 -1
  430. package/dist/internal/escape-layer/escape-layer.svelte.js +2 -2
  431. package/dist/internal/floating-layer/floating-layer.svelte.d.ts.map +1 -1
  432. package/dist/internal/floating-layer/types.d.ts.map +1 -1
  433. package/dist/internal/focus-scope/focus-scope.svelte.d.ts.map +1 -1
  434. package/dist/internal/grace-area/grace-area.svelte.d.ts.map +1 -1
  435. package/dist/internal/grace-area/grace-area.svelte.js +1 -1
  436. package/dist/internal/helpers/arrays.d.ts.map +1 -1
  437. package/dist/internal/helpers/dom.d.ts.map +1 -1
  438. package/dist/internal/helpers/dom.js +2 -2
  439. package/dist/internal/helpers/merge-props.d.ts.map +1 -1
  440. package/dist/internal/i18n/languages.d.ts.map +1 -1
  441. package/dist/internal/i18n/languages.js +2 -2
  442. package/dist/internal/portal/__tests__/PortalTest.svelte +3 -3
  443. package/dist/internal/portal/portal-consumer.svelte +1 -1
  444. package/dist/internal/portal/portal.svelte +7 -3
  445. package/dist/internal/portal/portal.svelte.d.ts.map +1 -1
  446. package/dist/internal/presence-layer/presence-layer.svelte.d.ts.map +1 -1
  447. package/dist/internal/roving-focus/roving-focus.svelte.d.ts.map +1 -1
  448. package/dist/internal/roving-focus/roving-focus.svelte.js +2 -2
  449. package/dist/internal/scroll-lock/scroll-lock.svelte.d.ts.map +1 -1
  450. package/dist/internal/text-selection-layer/text-selection-layer.svelte.d.ts.map +1 -1
  451. package/dist/internal/typeahead/typeahead.svelte.d.ts.map +1 -1
  452. package/dist/internal/typeahead/typeahead.svelte.js +1 -1
  453. package/package.json +1 -1
  454. package/src/fonts.css +2 -2
  455. package/src/themes/__tests__/carbon-dark-contrast.test.ts +170 -0
  456. package/src/themes/carbon.css +136 -107
  457. package/src/themes/day.css +104 -106
  458. package/src/themes/docs.css +104 -106
  459. package/src/themes/iris-ocr.css +104 -108
  460. package/src/themes/midnight.css +104 -107
  461. package/src/themes/spectral-components.css +3 -1
  462. package/src/themes/spectral.css +116 -111
@@ -1,5 +1,5 @@
1
1
  import { flushSync, mount, unmount } from 'svelte';
2
- import { afterEach, describe, expect, it } from 'vitest';
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
3
  import TabsRoot from '../components/tabs-root.svelte';
4
4
  import TabsTest from './TabsTest.svelte';
5
5
  describe('tabs', () => {
@@ -148,4 +148,80 @@ describe('tabs', () => {
148
148
  flushSync();
149
149
  expect(tabs[1]?.getAttribute('aria-selected')).toBe('true');
150
150
  });
151
+ // -------------------------------------------------------------------------
152
+ // overflow prop (mobile overflow strategy)
153
+ //
154
+ // Default is 'scroll' so long labels never silently truncate; consumers can
155
+ // opt into 'wrap' for multi-row pill layouts. When the active tab changes,
156
+ // the list scrolls it into view via `scrollIntoView` so the user is never
157
+ // looking at an out-of-viewport active tab.
158
+ // -------------------------------------------------------------------------
159
+ describe('overflow prop', () => {
160
+ it('default overflow="scroll" emits data-overflow="scroll" on tablist', () => {
161
+ setup();
162
+ const tablist = target.querySelector('[role="tablist"]');
163
+ expect(tablist.getAttribute('data-overflow')).toBe('scroll');
164
+ });
165
+ it('overflow="wrap" emits data-overflow="wrap" on tablist', () => {
166
+ setup({ overflow: 'wrap' });
167
+ const tablist = target.querySelector('[role="tablist"]');
168
+ expect(tablist.getAttribute('data-overflow')).toBe('wrap');
169
+ });
170
+ it('vertical + default overflow still emits data-overflow="scroll" alongside data-orientation', () => {
171
+ setup({ orientation: 'vertical' });
172
+ const tablist = target.querySelector('[role="tablist"]');
173
+ expect(tablist.getAttribute('data-overflow')).toBe('scroll');
174
+ expect(tablist.getAttribute('data-orientation')).toBe('vertical');
175
+ });
176
+ it('changing the active tab calls scrollIntoView on the newly active trigger when overflow="scroll"', () => {
177
+ // jsdom does not implement scrollIntoView — install a mock on the
178
+ // prototype so the component's call hits our spy instead of throwing.
179
+ const original = HTMLElement.prototype.scrollIntoView;
180
+ const spy = vi.fn();
181
+ HTMLElement.prototype.scrollIntoView = spy;
182
+ try {
183
+ setup({ value: 'tab1' });
184
+ const tabs = target.querySelectorAll('[role="tab"]');
185
+ spy.mockClear(); // ignore any call from the initial mount
186
+ tabs[1].click();
187
+ flushSync();
188
+ // The spy should have been called on the new active trigger with a
189
+ // sensible config that brings it into the viewport without scrolling
190
+ // the page vertically.
191
+ expect(spy).toHaveBeenCalled();
192
+ const lastCall = spy.mock.calls.at(-1);
193
+ const arg = lastCall?.[0];
194
+ expect(arg).toBeDefined();
195
+ expect(typeof arg).toBe('object');
196
+ expect(arg).toMatchObject({
197
+ inline: expect.stringMatching(/^(nearest|center|start|end)$/),
198
+ block: 'nearest',
199
+ });
200
+ // And the call target was the now-active trigger, not an arbitrary node.
201
+ const callTarget = spy.mock.contexts.at(-1);
202
+ expect(callTarget?.getAttribute('data-state')).toBe('active');
203
+ }
204
+ finally {
205
+ ;
206
+ HTMLElement.prototype.scrollIntoView = original;
207
+ }
208
+ });
209
+ it('overflow="wrap" does NOT call scrollIntoView on tab change (wrap layout shows all tabs)', () => {
210
+ const original = HTMLElement.prototype.scrollIntoView;
211
+ const spy = vi.fn();
212
+ HTMLElement.prototype.scrollIntoView = spy;
213
+ try {
214
+ setup({ value: 'tab1', overflow: 'wrap' });
215
+ const tabs = target.querySelectorAll('[role="tab"]');
216
+ spy.mockClear();
217
+ tabs[1].click();
218
+ flushSync();
219
+ expect(spy).not.toHaveBeenCalled();
220
+ }
221
+ finally {
222
+ ;
223
+ HTMLElement.prototype.scrollIntoView = original;
224
+ }
225
+ });
226
+ });
151
227
  });
@@ -1,4 +1,4 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TabsContentProps } from '../types.js'
3
3
  import { getTabsContext } from '../tabs.svelte.js'
4
4
 
@@ -11,7 +11,7 @@
11
11
  {#if isActive}
12
12
  <div
13
13
  class="sp-tabs-content {className ?? ''}"
14
- role='tabpanel'
14
+ role="tabpanel"
15
15
  tabindex={0}
16
16
  data-state={isActive ? 'active' : 'inactive'}
17
17
  >
@@ -1,9 +1,9 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TabsListProps } from '../types.js'
3
3
  import { RovingFocusGroup } from '../../../internal/roving-focus/index.js'
4
4
  import { getTabsContext } from '../tabs.svelte.js'
5
5
 
6
- const { class: className, children }: TabsListProps = $props()
6
+ const { overflow = 'scroll', class: className, children }: TabsListProps = $props()
7
7
 
8
8
  const ctx = getTabsContext()
9
9
 
@@ -16,27 +16,50 @@
16
16
  let listEl: HTMLElement | undefined = $state()
17
17
 
18
18
  function onkeydown(event: KeyboardEvent) {
19
- if (!listEl)
20
- return
19
+ if (!listEl) return
21
20
  roving.handleKeydown(listEl, event)
22
21
 
23
22
  if (ctx.activationMode === 'automatic') {
24
23
  // In automatic mode, focus activates the tab immediately
25
- const focused = (typeof document !== 'undefined' ? document.activeElement : null) as HTMLElement | null
24
+ const focused = (
25
+ typeof document !== 'undefined' ? document.activeElement : null
26
+ ) as HTMLElement | null
26
27
  if (focused?.hasAttribute('data-roving-focus-item')) {
27
28
  focused.click()
28
29
  }
29
30
  }
30
31
  }
32
+
33
+ // When `overflow="scroll"`, the active trigger may sit outside the visible
34
+ // viewport (especially on mobile after a tab is selected via list-restored
35
+ // state or via keyboard navigation). Re-run scrollIntoView on every value
36
+ // change so the user never looks at an out-of-viewport active tab. We use
37
+ // `inline: 'nearest'` + `block: 'nearest'` so the scroll is minimal and
38
+ // never moves the page vertically when the tablist is horizontal.
39
+ $effect(() => {
40
+ if (overflow !== 'scroll') return
41
+ // Track ctx.value to retrigger on activation changes.
42
+ const _activeValue = ctx.value
43
+ if (!listEl) return
44
+ const active = listEl.querySelector<HTMLElement>('[role="tab"][data-state="active"]')
45
+ if (!active) return
46
+ // SSR-safe: $effect only runs in the browser, but scrollIntoView may still
47
+ // be undefined in jsdom-based tests — guard before calling.
48
+ if (typeof active.scrollIntoView !== 'function') return
49
+ active.scrollIntoView({ inline: 'nearest', block: 'nearest' })
50
+ // `_activeValue` is read above strictly for the reactive subscription.
51
+ void _activeValue
52
+ })
31
53
  </script>
32
54
 
33
55
  <div
34
56
  bind:this={listEl}
35
57
  class="sp-tabs-list {className ?? ''}"
36
- role='tablist'
58
+ role="tablist"
37
59
  aria-orientation={ctx.orientation}
38
60
  tabindex={0}
39
61
  data-orientation={ctx.orientation}
62
+ data-overflow={overflow}
40
63
  {onkeydown}
41
64
  >
42
65
  {#if children}{@render children()}{/if}
@@ -54,4 +77,36 @@
54
77
  border-bottom: none;
55
78
  border-right: 1px solid var(--sp-sys-color-outline-variant);
56
79
  }
80
+
81
+ /* `overflow="scroll"` (default): horizontal scroll on horizontal tablist,
82
+ vertical scroll on vertical tablist. Native scrollbar hidden — the
83
+ active trigger is brought into view programmatically via scrollIntoView.
84
+ The tablist itself keeps its tabindex={0}, so it remains keyboard-scrollable. */
85
+ .sp-tabs-list[data-overflow='scroll'][data-orientation='horizontal'] {
86
+ overflow-x: auto;
87
+ overflow-y: hidden;
88
+ scrollbar-width: none; /* Firefox */
89
+ }
90
+
91
+ .sp-tabs-list[data-overflow='scroll'][data-orientation='vertical'] {
92
+ overflow-x: hidden;
93
+ overflow-y: auto;
94
+ scrollbar-width: none;
95
+ }
96
+
97
+ .sp-tabs-list[data-overflow='scroll']::-webkit-scrollbar {
98
+ display: none; /* WebKit */
99
+ }
100
+
101
+ /* `overflow="wrap"`: triggers wrap onto multiple lines. We also unset
102
+ `white-space: nowrap` on every trigger (set in tabs-trigger.svelte) via
103
+ a scoped `:global` selector — without this the trigger labels would
104
+ still refuse to wrap inside their pill, defeating the point of wrap. */
105
+ .sp-tabs-list[data-overflow='wrap'] {
106
+ flex-wrap: wrap;
107
+ }
108
+
109
+ .sp-tabs-list[data-overflow='wrap'] :global(.sp-tabs-trigger) {
110
+ white-space: normal;
111
+ }
57
112
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-list.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tabs/components/tabs-list.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AA4ChD,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"tabs-list.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tabs/components/tabs-list.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAkEhD,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -1,4 +1,4 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TabsProps } from '../types.js'
3
3
  import { setTabsContext } from '../tabs.svelte.js'
4
4
 
@@ -1,4 +1,4 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TabsTriggerProps } from '../types.js'
3
3
  import { getTabsContext } from '../tabs.svelte.js'
4
4
 
@@ -8,15 +8,14 @@
8
8
  const isActive = $derived(ctx.value === value)
9
9
 
10
10
  function onclick() {
11
- if (!disabled)
12
- ctx.setValue(value)
11
+ if (!disabled) ctx.setValue(value)
13
12
  }
14
13
  </script>
15
14
 
16
15
  <button
17
16
  class="sp-tabs-trigger {className ?? ''}"
18
- type='button'
19
- role='tab'
17
+ type="button"
18
+ role="tab"
20
19
  aria-selected={isActive}
21
20
  tabindex={isActive ? 0 : -1}
22
21
  {disabled}
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-trigger.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tabs/components/tabs-trigger.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AA0BnD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"tabs-trigger.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tabs/components/tabs-trigger.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAyBnD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -2,5 +2,5 @@ export { default as Content } from './components/tabs-content.svelte';
2
2
  export { default as List } from './components/tabs-list.svelte';
3
3
  export { default as Root } from './components/tabs-root.svelte';
4
4
  export { default as Trigger } from './components/tabs-trigger.svelte';
5
- export type { TabsActivationMode, TabsContentProps, TabsListProps, TabsOrientation, TabsProps, TabsTriggerProps, } from './types.js';
5
+ export type { TabsActivationMode, TabsContentProps, TabsListOverflow, TabsListProps, TabsOrientation, TabsProps, TabsTriggerProps, } from './types.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAA;AACrE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAA;AACrE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
@@ -1,6 +1,27 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  export type TabsOrientation = 'horizontal' | 'vertical';
3
3
  export type TabsActivationMode = 'automatic' | 'manual';
4
+ /**
5
+ * Strategy used by `Tabs.List` when its triggers exceed the available space.
6
+ *
7
+ * - `'scroll'` (default): the tablist becomes horizontally (or vertically, when
8
+ * `orientation="vertical"`) scrollable, hides its native scrollbar, and
9
+ * programmatically scrolls the newly active trigger into view via
10
+ * `scrollIntoView({ inline: 'nearest', block: 'nearest' })` on every value
11
+ * change. Suited to narrow viewports (mobile) and to surfaces with an
12
+ * unknown number of tabs.
13
+ * - `'wrap'`: the tablist wraps its triggers onto multiple lines and unsets
14
+ * `white-space: nowrap` on the trigger labels so long labels remain
15
+ * readable on multi-row. No `scrollIntoView` is performed because every
16
+ * trigger is already visible.
17
+ *
18
+ * The previous behaviour (no overflow handling at all — long labels silently
19
+ * truncated and the user had no scroll affordance) is intentionally not
20
+ * exposed in the API: consumers who need it can still use `class` to override
21
+ * the styling locally, but the design system does not offer a mode whose
22
+ * documented behaviour is "silently broken on narrow viewports".
23
+ */
24
+ export type TabsListOverflow = 'scroll' | 'wrap';
4
25
  export interface TabsProps {
5
26
  /** The currently active tab value. */
6
27
  value?: string;
@@ -20,6 +41,11 @@ export interface TabsProps {
20
41
  children?: Snippet;
21
42
  }
22
43
  export interface TabsListProps {
44
+ /**
45
+ * Strategy used when triggers exceed the available space. Defaults to
46
+ * `'scroll'`. See {@link TabsListOverflow}.
47
+ */
48
+ overflow?: TabsListOverflow;
23
49
  /** Additional CSS class. */
24
50
  class?: string;
25
51
  /** Content snippet. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/components/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,CAAA;AACvD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEvD,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;OAIG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/components/tabs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,CAAA;AACvD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEhD,MAAM,WAAW,SAAS;IACxB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;OAIG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
@@ -1,6 +1,10 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
1
4
  import { mount, unmount } from 'svelte';
2
5
  import { afterEach, describe, expect, it } from 'vitest';
3
6
  import Textarea from '../textarea.svelte';
7
+ const componentSource = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../textarea.svelte'), 'utf8');
4
8
  describe('textarea', () => {
5
9
  let target;
6
10
  let instance;
@@ -23,4 +27,29 @@ describe('textarea', () => {
23
27
  setup({ invalid: true });
24
28
  expect(target.querySelector('textarea')?.getAttribute('aria-invalid')).toBe('true');
25
29
  });
30
+ // ── iOS Safari focus-zoom contract ────────────────────────────────
31
+ // Real WebKit focus-zoom cannot be reproduced in jsdom. These tests
32
+ // lock the CSS contract that prevents the regression on `size="sm"` :
33
+ // the `sm` typography stays token-driven for desktop, and a clamp to
34
+ // >= 1rem is applied on coarse pointers (touch / iOS). Other sizes
35
+ // inherit the base 1rem and are already iOS-safe.
36
+ describe('iOS Safari focus-zoom contract (size="sm")', () => {
37
+ it('keeps fine-pointer typography on the body-medium token', () => {
38
+ expect(componentSource).toMatch(/\.sp-textarea\.sm\s*\{[^}]*font-size:\s*var\(--sp-sys-typescale-body-medium-size[^}]*\}/);
39
+ });
40
+ it('clamps the sm textarea to at least 1rem on coarse pointers', () => {
41
+ expect(componentSource).toMatch(/@media\s*\(pointer:\s*coarse\)\s*\{[\s\S]*?\.sp-textarea\.sm\s*\{[^}]*font-size:\s*max\(1rem,[^)]*\)[\s\S]*?\}/);
42
+ });
43
+ it('only the sm variant is targeted by the coarse-pointer clamp', () => {
44
+ // The clamp must target `.sp-textarea.sm` and only `.sp-textarea.sm`.
45
+ // Other sizes inherit the base 1rem and must not get an override.
46
+ const coarseRules = [
47
+ ...componentSource.matchAll(/@media\s*\(pointer:\s*coarse\)\s*\{[^}]*\{/g),
48
+ ];
49
+ expect(coarseRules.length).toBe(1);
50
+ expect(coarseRules[0][0]).toContain('.sp-textarea.sm');
51
+ expect(coarseRules[0][0]).not.toContain('.sp-textarea.md');
52
+ expect(coarseRules[0][0]).not.toContain('.sp-textarea.lg');
53
+ });
54
+ });
26
55
  });
@@ -1,4 +1,4 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TextareaProps } from './types.js'
3
3
 
4
4
  let {
@@ -48,6 +48,19 @@
48
48
  font-size: var(--sp-sys-typescale-body-medium-size, 0.875rem);
49
49
  }
50
50
 
51
+ /* iOS Safari focus zoom : WebKit auto-zooms the viewport when a focused
52
+ form control's computed font-size is < 16px. The `sm` size renders
53
+ at `body-medium` (14px by default), which crosses that threshold.
54
+ Clamp to at least 1rem on coarse pointers (touch / iOS) so dense
55
+ forms on mobile stay usable; `max()` preserves any theme that may
56
+ override `--sp-sys-typescale-body-medium-size` upward. Other sizes
57
+ inherit the base 1rem and are already iOS-safe. */
58
+ @media (pointer: coarse) {
59
+ .sp-textarea.sm {
60
+ font-size: max(1rem, var(--sp-sys-typescale-body-medium-size, 0.875rem));
61
+ }
62
+ }
63
+
51
64
  .sp-textarea.md {
52
65
  min-height: 96px;
53
66
  }
@@ -1,4 +1,4 @@
1
- <script lang='ts'>
1
+ <script lang="ts">
2
2
  import type { TimeValue } from '../types.js'
3
3
  import * as TimeField from '../index.js'
4
4
 
@@ -29,10 +29,9 @@ describe('timeField', () => {
29
29
  // 3. Segments include hour and minute labels
30
30
  it('segments include hour and minute labels', () => {
31
31
  setup();
32
- const labels = Array.from(target.querySelectorAll('[role="spinbutton"]'))
33
- .map(s => s.getAttribute('aria-label')?.toLowerCase() ?? '');
34
- expect(labels.some(l => l && (l.includes('hour') || l.includes('heure')))).toBe(true);
35
- expect(labels.some(l => l && l.includes('minute'))).toBe(true);
32
+ const labels = Array.from(target.querySelectorAll('[role="spinbutton"]')).map((s) => s.getAttribute('aria-label')?.toLowerCase() ?? '');
33
+ expect(labels.some((l) => l && (l.includes('hour') || l.includes('heure')))).toBe(true);
34
+ expect(labels.some((l) => l && l.includes('minute'))).toBe(true);
36
35
  });
37
36
  // 4. Renders value when provided (minute field shows 30)
38
37
  it('renders value when provided', () => {
@@ -76,9 +75,8 @@ describe('timeField', () => {
76
75
  // 9. granularity="second" adds seconds segment
77
76
  it('granularity="second" adds seconds segment', () => {
78
77
  setup({ granularity: 'second', value: { hour: 14, minute: 30, second: 45 } });
79
- const labels = Array.from(target.querySelectorAll('[role="spinbutton"]'))
80
- .map(s => s.getAttribute('aria-label')?.toLowerCase() ?? '');
81
- expect(labels.some(l => l && l.includes('second'))).toBe(true);
78
+ const labels = Array.from(target.querySelectorAll('[role="spinbutton"]')).map((s) => s.getAttribute('aria-label')?.toLowerCase() ?? '');
79
+ expect(labels.some((l) => l && l.includes('second'))).toBe(true);
82
80
  });
83
81
  // 10. disabled marks group with data-disabled
84
82
  it('disabled marks group as disabled', () => {
@@ -90,7 +88,7 @@ describe('timeField', () => {
90
88
  it('readonly marks segments as readonly', () => {
91
89
  setup({ readonly: true });
92
90
  const segments = target.querySelectorAll('[role="spinbutton"]');
93
- const readonlySegments = Array.from(segments).filter(s => s.getAttribute('aria-readonly') === 'true');
91
+ const readonlySegments = Array.from(segments).filter((s) => s.getAttribute('aria-readonly') === 'true');
94
92
  expect(readonlySegments.length).toBeGreaterThanOrEqual(2);
95
93
  });
96
94
  // 12. group has aria-label