@deriv-com/dds-marketing 0.1.0 → 0.2.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 (460) hide show
  1. package/.llm/components/accordion.md +193 -0
  2. package/.llm/components/accordionitem.md +236 -0
  3. package/.llm/components/aspectratio.md +212 -0
  4. package/.llm/components/badge.md +231 -0
  5. package/.llm/components/bottomsheet.md +404 -0
  6. package/.llm/components/breadcrumb.md +197 -0
  7. package/.llm/components/breadcrumbitem.md +178 -0
  8. package/.llm/components/button.md +271 -0
  9. package/.llm/components/buttonicon.md +313 -0
  10. package/.llm/components/card.md +313 -0
  11. package/.llm/components/cardbody.md +409 -0
  12. package/.llm/components/cardbutton.md +259 -0
  13. package/.llm/components/checkbox.md +285 -0
  14. package/.llm/components/divider.md +230 -0
  15. package/.llm/components/dropdownmenu.md +453 -0
  16. package/.llm/components/filterchip.md +314 -0
  17. package/.llm/components/footer.md +408 -0
  18. package/.llm/components/footergroup.md +241 -0
  19. package/.llm/components/grid.md +659 -0
  20. package/.llm/components/icon.md +194 -0
  21. package/.llm/components/link.md +354 -0
  22. package/.llm/components/menuitem.md +218 -0
  23. package/.llm/components/navbar.md +458 -0
  24. package/.llm/components/navbaritem.md +238 -0
  25. package/.llm/components/navbarmenu.md +319 -0
  26. package/.llm/components/navbarmenugroup.md +184 -0
  27. package/.llm/components/navbarpanel.md +255 -0
  28. package/.llm/components/navbarswitcher.md +343 -0
  29. package/.llm/components/navbarswitcheroption.md +156 -0
  30. package/.llm/components/option.md +268 -0
  31. package/.llm/components/pagination.md +361 -0
  32. package/.llm/components/removablechip.md +247 -0
  33. package/.llm/components/row.md +381 -0
  34. package/.llm/components/scroller.md +470 -0
  35. package/.llm/components/searchinput.md +279 -0
  36. package/.llm/components/segmentedcontrol.md +358 -0
  37. package/.llm/components/segmentedcontrolitem.md +272 -0
  38. package/.llm/components/select.md +509 -0
  39. package/.llm/components/selectchip.md +334 -0
  40. package/.llm/components/spinner.md +222 -0
  41. package/.llm/components/stack.md +334 -0
  42. package/.llm/components/statusdot.md +205 -0
  43. package/.llm/components/subdomainnavbar.md +327 -0
  44. package/.llm/components/tab.md +291 -0
  45. package/.llm/components/table.md +660 -0
  46. package/.llm/components/tablebody.md +258 -0
  47. package/.llm/components/tablecell.md +248 -0
  48. package/.llm/components/tablehead.md +248 -0
  49. package/.llm/components/tableheadercell.md +298 -0
  50. package/.llm/components/tablerow.md +285 -0
  51. package/.llm/components/tablist.md +210 -0
  52. package/.llm/components/textarea.md +362 -0
  53. package/.llm/components/textinput.md +467 -0
  54. package/.llm/components/tooltip.md +267 -0
  55. package/.llm/components/typography.md +245 -0
  56. package/.llm/digest/accordion.md +43 -0
  57. package/.llm/digest/accordionitem.md +47 -0
  58. package/.llm/digest/aspectratio.md +47 -0
  59. package/.llm/digest/badge.md +45 -0
  60. package/.llm/digest/bottomsheet.md +69 -0
  61. package/.llm/digest/breadcrumb.md +38 -0
  62. package/.llm/digest/breadcrumbitem.md +43 -0
  63. package/.llm/digest/button.md +48 -0
  64. package/.llm/digest/buttonicon.md +61 -0
  65. package/.llm/digest/card.md +50 -0
  66. package/.llm/digest/cardbody.md +68 -0
  67. package/.llm/digest/cardbutton.md +49 -0
  68. package/.llm/digest/checkbox.md +63 -0
  69. package/.llm/digest/divider.md +52 -0
  70. package/.llm/digest/dropdownmenu.md +67 -0
  71. package/.llm/digest/filterchip.md +68 -0
  72. package/.llm/digest/footer.md +57 -0
  73. package/.llm/digest/footergroup.md +42 -0
  74. package/.llm/digest/grid.md +62 -0
  75. package/.llm/digest/icon.md +45 -0
  76. package/.llm/digest/link.md +59 -0
  77. package/.llm/digest/menuitem.md +46 -0
  78. package/.llm/digest/navbar.md +60 -0
  79. package/.llm/digest/navbaritem.md +54 -0
  80. package/.llm/digest/navbarmenu.md +54 -0
  81. package/.llm/digest/navbarmenugroup.md +40 -0
  82. package/.llm/digest/navbarpanel.md +53 -0
  83. package/.llm/digest/navbarswitcher.md +51 -0
  84. package/.llm/digest/navbarswitcheroption.md +37 -0
  85. package/.llm/digest/option.md +54 -0
  86. package/.llm/digest/pagination.md +71 -0
  87. package/.llm/digest/removablechip.md +51 -0
  88. package/.llm/digest/row.md +60 -0
  89. package/.llm/digest/scroller.md +59 -0
  90. package/.llm/digest/searchinput.md +56 -0
  91. package/.llm/digest/segmentedcontrol.md +59 -0
  92. package/.llm/digest/segmentedcontrolitem.md +59 -0
  93. package/.llm/digest/select.md +92 -0
  94. package/.llm/digest/selectchip.md +68 -0
  95. package/.llm/digest/spinner.md +52 -0
  96. package/.llm/digest/stack.md +56 -0
  97. package/.llm/digest/statusdot.md +46 -0
  98. package/.llm/digest/subdomainnavbar.md +54 -0
  99. package/.llm/digest/tab.md +60 -0
  100. package/.llm/digest/table.md +71 -0
  101. package/.llm/digest/tablebody.md +49 -0
  102. package/.llm/digest/tablecell.md +55 -0
  103. package/.llm/digest/tablehead.md +50 -0
  104. package/.llm/digest/tableheadercell.md +65 -0
  105. package/.llm/digest/tablerow.md +56 -0
  106. package/.llm/digest/tablist.md +46 -0
  107. package/.llm/digest/textarea.md +78 -0
  108. package/.llm/digest/textinput.md +95 -0
  109. package/.llm/digest/tooltip.md +58 -0
  110. package/.llm/digest/typography.md +59 -0
  111. package/.llm/index.md +86 -0
  112. package/.llm/rules.md +122 -0
  113. package/.llm/tokens.md +341 -0
  114. package/AGENTS.md +164 -0
  115. package/LICENSE +21 -0
  116. package/README.md +63 -15
  117. package/dist/components/core/accordion/Accordion.css +10 -0
  118. package/dist/components/core/accordion/Accordion.d.ts +20 -0
  119. package/dist/components/core/accordion/Accordion.js +69 -0
  120. package/dist/components/core/accordion/Accordion.types.d.ts +20 -0
  121. package/dist/components/core/accordion/Accordion.types.js +7 -0
  122. package/dist/components/core/accordion-item/AccordionItem.css +98 -0
  123. package/dist/components/core/accordion-item/AccordionItem.d.ts +44 -0
  124. package/dist/components/core/accordion-item/AccordionItem.js +63 -0
  125. package/dist/components/core/accordion-item/AccordionItem.types.d.ts +32 -0
  126. package/dist/components/core/accordion-item/AccordionItem.types.js +13 -0
  127. package/dist/components/core/accordion-item/accordion-item-impl.css +107 -0
  128. package/dist/components/core/badge/Badge.css +37 -0
  129. package/dist/components/core/badge/Badge.d.ts +37 -0
  130. package/dist/components/core/badge/Badge.js +40 -0
  131. package/dist/components/core/badge/Badge.types.d.ts +24 -0
  132. package/dist/components/core/badge/Badge.types.js +8 -0
  133. package/dist/components/core/badge/badge-impl.css +32 -0
  134. package/dist/components/core/bottom-sheet/BottomSheet.css +178 -0
  135. package/dist/components/core/bottom-sheet/BottomSheet.d.ts +22 -0
  136. package/dist/components/core/bottom-sheet/BottomSheet.js +359 -0
  137. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +67 -0
  138. package/dist/components/core/bottom-sheet/BottomSheet.types.js +18 -0
  139. package/dist/components/core/bottom-sheet/bottom-sheet-impl.css +57 -0
  140. package/dist/components/core/breadcrumb/Breadcrumb.css +19 -0
  141. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +16 -0
  142. package/dist/components/core/breadcrumb/Breadcrumb.js +22 -0
  143. package/dist/components/core/breadcrumb/Breadcrumb.types.d.ts +18 -0
  144. package/dist/components/core/breadcrumb/Breadcrumb.types.js +9 -0
  145. package/dist/components/core/breadcrumb-item/BreadcrumbItem.css +34 -0
  146. package/dist/components/core/breadcrumb-item/BreadcrumbItem.d.ts +12 -0
  147. package/dist/components/core/breadcrumb-item/BreadcrumbItem.js +15 -0
  148. package/dist/components/core/breadcrumb-item/BreadcrumbItem.types.d.ts +22 -0
  149. package/dist/components/core/breadcrumb-item/BreadcrumbItem.types.js +9 -0
  150. package/dist/components/core/button/Button.css +141 -0
  151. package/dist/components/core/button/Button.d.ts +25 -0
  152. package/dist/components/core/button/Button.js +28 -0
  153. package/dist/components/core/button/Button.types.d.ts +40 -0
  154. package/dist/components/core/button/Button.types.js +9 -0
  155. package/dist/components/core/button/button-impl.css +46 -0
  156. package/dist/components/core/button-icon/ButtonIcon.css +135 -0
  157. package/dist/components/core/button-icon/ButtonIcon.d.ts +34 -0
  158. package/dist/components/core/button-icon/ButtonIcon.js +117 -0
  159. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +41 -0
  160. package/dist/components/core/button-icon/ButtonIcon.types.js +8 -0
  161. package/dist/components/core/card/Card.css +65 -0
  162. package/dist/components/core/card/Card.d.ts +24 -0
  163. package/dist/components/core/card/Card.js +26 -0
  164. package/dist/components/core/card/Card.types.d.ts +33 -0
  165. package/dist/components/core/card/Card.types.js +7 -0
  166. package/dist/components/core/card-body/CardBody.css +139 -0
  167. package/dist/components/core/card-body/CardBody.d.ts +62 -0
  168. package/dist/components/core/card-body/CardBody.js +97 -0
  169. package/dist/components/core/card-body/CardBody.types.d.ts +61 -0
  170. package/dist/components/core/card-body/CardBody.types.js +15 -0
  171. package/dist/components/core/card-body/card-body-impl.css +87 -0
  172. package/dist/components/core/card-button/CardButton.css +73 -0
  173. package/dist/components/core/card-button/CardButton.d.ts +27 -0
  174. package/dist/components/core/card-button/CardButton.js +37 -0
  175. package/dist/components/core/card-button/CardButton.types.d.ts +24 -0
  176. package/dist/components/core/card-button/CardButton.types.js +7 -0
  177. package/dist/components/core/card-button/card-button-impl.css +39 -0
  178. package/dist/components/core/checkbox/Checkbox.css +149 -0
  179. package/dist/components/core/checkbox/Checkbox.d.ts +21 -0
  180. package/dist/components/core/checkbox/Checkbox.js +97 -0
  181. package/dist/components/core/checkbox/Checkbox.types.d.ts +46 -0
  182. package/dist/components/core/checkbox/Checkbox.types.js +15 -0
  183. package/dist/components/core/checkbox/checkbox-impl.css +90 -0
  184. package/dist/components/core/divider/Divider.css +41 -0
  185. package/dist/components/core/divider/Divider.d.ts +46 -0
  186. package/dist/components/core/divider/Divider.js +51 -0
  187. package/dist/components/core/divider/Divider.types.d.ts +25 -0
  188. package/dist/components/core/divider/Divider.types.js +9 -0
  189. package/dist/components/core/dropdown-menu/DropdownMenu.css +146 -0
  190. package/dist/components/core/dropdown-menu/DropdownMenu.d.ts +22 -0
  191. package/dist/components/core/dropdown-menu/DropdownMenu.js +309 -0
  192. package/dist/components/core/dropdown-menu/DropdownMenu.types.d.ts +62 -0
  193. package/dist/components/core/dropdown-menu/DropdownMenu.types.js +12 -0
  194. package/dist/components/core/dropdown-menu/dropdown-menu-impl.css +70 -0
  195. package/dist/components/core/filter-chip/FilterChip.css +149 -0
  196. package/dist/components/core/filter-chip/FilterChip.d.ts +23 -0
  197. package/dist/components/core/filter-chip/FilterChip.js +37 -0
  198. package/dist/components/core/filter-chip/FilterChip.types.d.ts +53 -0
  199. package/dist/components/core/filter-chip/FilterChip.types.js +12 -0
  200. package/dist/components/core/footer/Footer.css +104 -0
  201. package/dist/components/core/footer/Footer.d.ts +43 -0
  202. package/dist/components/core/footer/Footer.js +53 -0
  203. package/dist/components/core/footer/Footer.types.d.ts +47 -0
  204. package/dist/components/core/footer/Footer.types.js +18 -0
  205. package/dist/components/core/footer/footer-impl.css +218 -0
  206. package/dist/components/core/footer-group/FooterGroup.css +90 -0
  207. package/dist/components/core/footer-group/FooterGroup.d.ts +32 -0
  208. package/dist/components/core/footer-group/FooterGroup.js +64 -0
  209. package/dist/components/core/footer-group/FooterGroup.types.d.ts +25 -0
  210. package/dist/components/core/footer-group/FooterGroup.types.js +12 -0
  211. package/dist/components/core/footer-group/footer-group-impl.css +78 -0
  212. package/dist/components/core/icon/Icon.css +40 -0
  213. package/dist/components/core/icon/Icon.d.ts +23 -0
  214. package/dist/components/core/icon/Icon.js +79 -0
  215. package/dist/components/core/icon/Icon.types.d.ts +24 -0
  216. package/dist/components/core/icon/Icon.types.js +7 -0
  217. package/dist/components/core/link/Link.css +89 -0
  218. package/dist/components/core/link/Link.d.ts +37 -0
  219. package/dist/components/core/link/Link.js +141 -0
  220. package/dist/components/core/link/Link.types.d.ts +41 -0
  221. package/dist/components/core/link/Link.types.js +9 -0
  222. package/dist/components/core/link/link-impl.css +168 -0
  223. package/dist/components/core/menu-item/MenuItem.css +70 -0
  224. package/dist/components/core/menu-item/MenuItem.d.ts +11 -0
  225. package/dist/components/core/menu-item/MenuItem.js +26 -0
  226. package/dist/components/core/menu-item/MenuItem.types.d.ts +28 -0
  227. package/dist/components/core/menu-item/MenuItem.types.js +9 -0
  228. package/dist/components/core/navbar/Navbar.css +135 -0
  229. package/dist/components/core/navbar/Navbar.d.ts +36 -0
  230. package/dist/components/core/navbar/Navbar.js +371 -0
  231. package/dist/components/core/navbar/Navbar.types.d.ts +49 -0
  232. package/dist/components/core/navbar/Navbar.types.js +17 -0
  233. package/dist/components/core/navbar/navbar-impl.css +590 -0
  234. package/dist/components/core/navbar-item/NavbarItem.css +75 -0
  235. package/dist/components/core/navbar-item/NavbarItem.d.ts +22 -0
  236. package/dist/components/core/navbar-item/NavbarItem.js +40 -0
  237. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +34 -0
  238. package/dist/components/core/navbar-item/NavbarItem.types.js +10 -0
  239. package/dist/components/core/navbar-menu/NavbarMenu.css +128 -0
  240. package/dist/components/core/navbar-menu/NavbarMenu.d.ts +5 -0
  241. package/dist/components/core/navbar-menu/NavbarMenu.js +186 -0
  242. package/dist/components/core/navbar-menu/NavbarMenu.types.d.ts +45 -0
  243. package/dist/components/core/navbar-menu/NavbarMenu.types.js +12 -0
  244. package/dist/components/core/navbar-menu/navbar-menu-impl.css +186 -0
  245. package/dist/components/core/navbar-menu-group/NavbarMenuGroup.css +26 -0
  246. package/dist/components/core/navbar-menu-group/NavbarMenuGroup.d.ts +17 -0
  247. package/dist/components/core/navbar-menu-group/NavbarMenuGroup.js +22 -0
  248. package/dist/components/core/navbar-menu-group/NavbarMenuGroup.types.d.ts +14 -0
  249. package/dist/components/core/navbar-menu-group/NavbarMenuGroup.types.js +7 -0
  250. package/dist/components/core/navbar-panel/NavbarPanel.css +87 -0
  251. package/dist/components/core/navbar-panel/NavbarPanel.d.ts +34 -0
  252. package/dist/components/core/navbar-panel/NavbarPanel.js +46 -0
  253. package/dist/components/core/navbar-panel/NavbarPanel.types.d.ts +29 -0
  254. package/dist/components/core/navbar-panel/NavbarPanel.types.js +12 -0
  255. package/dist/components/core/navbar-panel/navbar-panel-impl.css +104 -0
  256. package/dist/components/core/navbar-panel/use-navbar-panel.d.ts +26 -0
  257. package/dist/components/core/navbar-panel/use-navbar-panel.js +135 -0
  258. package/dist/components/core/navbar-switcher/NavbarSwitcher.css +117 -0
  259. package/dist/components/core/navbar-switcher/NavbarSwitcher.d.ts +20 -0
  260. package/dist/components/core/navbar-switcher/NavbarSwitcher.js +90 -0
  261. package/dist/components/core/navbar-switcher/NavbarSwitcher.types.d.ts +46 -0
  262. package/dist/components/core/navbar-switcher/NavbarSwitcher.types.js +13 -0
  263. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +179 -0
  264. package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.css +39 -0
  265. package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.d.ts +16 -0
  266. package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.js +19 -0
  267. package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.types.d.ts +18 -0
  268. package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.types.js +7 -0
  269. package/dist/components/core/option/Option.css +133 -0
  270. package/dist/components/core/option/Option.d.ts +25 -0
  271. package/dist/components/core/option/Option.js +31 -0
  272. package/dist/components/core/option/Option.types.d.ts +44 -0
  273. package/dist/components/core/option/Option.types.js +14 -0
  274. package/dist/components/core/pagination/Pagination.css +237 -0
  275. package/dist/components/core/pagination/Pagination.d.ts +30 -0
  276. package/dist/components/core/pagination/Pagination.js +406 -0
  277. package/dist/components/core/pagination/Pagination.types.d.ts +59 -0
  278. package/dist/components/core/pagination/Pagination.types.js +14 -0
  279. package/dist/components/core/pagination/pagination-impl.css +17 -0
  280. package/dist/components/core/removable-chip/RemovableChip.css +125 -0
  281. package/dist/components/core/removable-chip/RemovableChip.d.ts +25 -0
  282. package/dist/components/core/removable-chip/RemovableChip.js +36 -0
  283. package/dist/components/core/removable-chip/RemovableChip.types.d.ts +38 -0
  284. package/dist/components/core/removable-chip/RemovableChip.types.js +13 -0
  285. package/dist/components/core/search-input/SearchInput.css +205 -0
  286. package/dist/components/core/search-input/SearchInput.d.ts +5 -0
  287. package/dist/components/core/search-input/SearchInput.js +81 -0
  288. package/dist/components/core/search-input/SearchInput.types.d.ts +43 -0
  289. package/dist/components/core/search-input/SearchInput.types.js +13 -0
  290. package/dist/components/core/search-input/search-input-impl.css +20 -0
  291. package/dist/components/core/segmented-control/SegmentedControl.css +57 -0
  292. package/dist/components/core/segmented-control/SegmentedControl.d.ts +37 -0
  293. package/dist/components/core/segmented-control/SegmentedControl.js +269 -0
  294. package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +38 -0
  295. package/dist/components/core/segmented-control/SegmentedControl.types.js +8 -0
  296. package/dist/components/core/segmented-control/segmented-control-impl.css +57 -0
  297. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +151 -0
  298. package/dist/components/core/segmented-control-item/SegmentedControlItem.d.ts +50 -0
  299. package/dist/components/core/segmented-control-item/SegmentedControlItem.js +101 -0
  300. package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +37 -0
  301. package/dist/components/core/segmented-control-item/SegmentedControlItem.types.js +10 -0
  302. package/dist/components/core/segmented-control-item/segmented-control-item-impl.css +69 -0
  303. package/dist/components/core/select/Select.css +400 -0
  304. package/dist/components/core/select/Select.d.ts +29 -0
  305. package/dist/components/core/select/Select.js +524 -0
  306. package/dist/components/core/select/Select.types.d.ts +96 -0
  307. package/dist/components/core/select/Select.types.js +26 -0
  308. package/dist/components/core/select/select-impl.css +114 -0
  309. package/dist/components/core/select-chip/SelectChip.css +155 -0
  310. package/dist/components/core/select-chip/SelectChip.d.ts +20 -0
  311. package/dist/components/core/select-chip/SelectChip.js +273 -0
  312. package/dist/components/core/select-chip/SelectChip.types.d.ts +56 -0
  313. package/dist/components/core/select-chip/SelectChip.types.js +14 -0
  314. package/dist/components/core/select-chip/select-chip-impl.css +38 -0
  315. package/dist/components/core/spinner/Spinner.css +76 -0
  316. package/dist/components/core/spinner/Spinner.d.ts +5 -0
  317. package/dist/components/core/spinner/Spinner.js +29 -0
  318. package/dist/components/core/spinner/Spinner.types.d.ts +37 -0
  319. package/dist/components/core/spinner/Spinner.types.js +10 -0
  320. package/dist/components/core/spinner/spinner-impl.css +27 -0
  321. package/dist/components/core/status-dot/StatusDot.css +43 -0
  322. package/dist/components/core/status-dot/StatusDot.d.ts +35 -0
  323. package/dist/components/core/status-dot/StatusDot.js +46 -0
  324. package/dist/components/core/status-dot/StatusDot.types.d.ts +29 -0
  325. package/dist/components/core/status-dot/StatusDot.types.js +7 -0
  326. package/dist/components/core/status-dot/status-dot-impl.css +42 -0
  327. package/dist/components/core/subdomain-navbar/SubdomainNavbar.css +89 -0
  328. package/dist/components/core/subdomain-navbar/SubdomainNavbar.d.ts +21 -0
  329. package/dist/components/core/subdomain-navbar/SubdomainNavbar.js +127 -0
  330. package/dist/components/core/subdomain-navbar/SubdomainNavbar.types.d.ts +43 -0
  331. package/dist/components/core/subdomain-navbar/SubdomainNavbar.types.js +13 -0
  332. package/dist/components/core/subdomain-navbar/subdomain-navbar-impl.css +147 -0
  333. package/dist/components/core/tab/Tab.css +113 -0
  334. package/dist/components/core/tab/Tab.d.ts +36 -0
  335. package/dist/components/core/tab/Tab.js +53 -0
  336. package/dist/components/core/tab/Tab.types.d.ts +42 -0
  337. package/dist/components/core/tab/Tab.types.js +13 -0
  338. package/dist/components/core/tab/tab-impl.css +49 -0
  339. package/dist/components/core/tab-list/TabList.css +40 -0
  340. package/dist/components/core/tab-list/TabList.d.ts +26 -0
  341. package/dist/components/core/tab-list/TabList.js +124 -0
  342. package/dist/components/core/tab-list/TabList.types.d.ts +20 -0
  343. package/dist/components/core/tab-list/TabList.types.js +7 -0
  344. package/dist/components/core/tab-list/tab-list-impl.css +56 -0
  345. package/dist/components/core/table/Table.css +40 -0
  346. package/dist/components/core/table/Table.d.ts +19 -0
  347. package/dist/components/core/table/Table.js +55 -0
  348. package/dist/components/core/table/Table.types.d.ts +59 -0
  349. package/dist/components/core/table/Table.types.js +9 -0
  350. package/dist/components/core/table/table-impl.css +75 -0
  351. package/dist/components/core/table/use-table-sort.d.ts +43 -0
  352. package/dist/components/core/table/use-table-sort.js +51 -0
  353. package/dist/components/core/table-body/TableBody.css +6 -0
  354. package/dist/components/core/table-body/TableBody.d.ts +12 -0
  355. package/dist/components/core/table-body/TableBody.js +26 -0
  356. package/dist/components/core/table-body/TableBody.types.d.ts +36 -0
  357. package/dist/components/core/table-body/TableBody.types.js +7 -0
  358. package/dist/components/core/table-cell/TableCell.css +76 -0
  359. package/dist/components/core/table-cell/TableCell.d.ts +21 -0
  360. package/dist/components/core/table-cell/TableCell.js +31 -0
  361. package/dist/components/core/table-cell/TableCell.types.d.ts +43 -0
  362. package/dist/components/core/table-cell/TableCell.types.js +7 -0
  363. package/dist/components/core/table-head/TableHead.css +6 -0
  364. package/dist/components/core/table-head/TableHead.d.ts +22 -0
  365. package/dist/components/core/table-head/TableHead.js +52 -0
  366. package/dist/components/core/table-head/TableHead.types.d.ts +39 -0
  367. package/dist/components/core/table-head/TableHead.types.js +7 -0
  368. package/dist/components/core/table-head/table-head-impl.css +51 -0
  369. package/dist/components/core/table-header-cell/TableHeaderCell.css +126 -0
  370. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +21 -0
  371. package/dist/components/core/table-header-cell/TableHeaderCell.js +34 -0
  372. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +56 -0
  373. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +9 -0
  374. package/dist/components/core/table-header-cell/table-header-cell-impl.css +74 -0
  375. package/dist/components/core/table-row/TableRow.css +18 -0
  376. package/dist/components/core/table-row/TableRow.d.ts +17 -0
  377. package/dist/components/core/table-row/TableRow.js +32 -0
  378. package/dist/components/core/table-row/TableRow.types.d.ts +45 -0
  379. package/dist/components/core/table-row/TableRow.types.js +7 -0
  380. package/dist/components/core/table-row/table-row-impl.css +31 -0
  381. package/dist/components/core/text-area/TextArea.css +325 -0
  382. package/dist/components/core/text-area/TextArea.d.ts +13 -0
  383. package/dist/components/core/text-area/TextArea.js +133 -0
  384. package/dist/components/core/text-area/TextArea.types.d.ts +67 -0
  385. package/dist/components/core/text-area/TextArea.types.js +19 -0
  386. package/dist/components/core/text-area/text-area-impl.css +36 -0
  387. package/dist/components/core/text-input/TextInput.css +400 -0
  388. package/dist/components/core/text-input/TextInput.d.ts +5 -0
  389. package/dist/components/core/text-input/TextInput.js +130 -0
  390. package/dist/components/core/text-input/TextInput.types.d.ts +96 -0
  391. package/dist/components/core/text-input/TextInput.types.js +24 -0
  392. package/dist/components/core/text-input/text-input-impl.css +36 -0
  393. package/dist/components/core/tooltip/Tooltip.css +101 -0
  394. package/dist/components/core/tooltip/Tooltip.d.ts +51 -0
  395. package/dist/components/core/tooltip/Tooltip.js +87 -0
  396. package/dist/components/core/tooltip/Tooltip.types.d.ts +38 -0
  397. package/dist/components/core/tooltip/Tooltip.types.js +9 -0
  398. package/dist/components/core/tooltip/TooltipAnchor.d.ts +52 -0
  399. package/dist/components/core/tooltip/TooltipAnchor.js +69 -0
  400. package/dist/components/core/tooltip/tooltip-anchor.css +145 -0
  401. package/dist/components/core/tooltip/tooltip-impl.css +54 -0
  402. package/dist/components/core/tooltip/use-tooltip.d.ts +111 -0
  403. package/dist/components/core/tooltip/use-tooltip.js +189 -0
  404. package/dist/components/core/typography/Typography.css +96 -0
  405. package/dist/components/core/typography/Typography.d.ts +297 -0
  406. package/dist/components/core/typography/Typography.js +28 -0
  407. package/dist/components/core/typography/Typography.types.d.ts +40 -0
  408. package/dist/components/core/typography/Typography.types.js +7 -0
  409. package/dist/components/css-time.d.ts +20 -0
  410. package/dist/components/css-time.js +30 -0
  411. package/dist/components/given.d.ts +7 -0
  412. package/dist/components/given.js +9 -0
  413. package/dist/components/hover-open.d.ts +34 -0
  414. package/dist/components/hover-open.js +90 -0
  415. package/dist/components/index.d.ts +114 -1
  416. package/dist/components/index.js +115 -2
  417. package/dist/components/layout/aspect-ratio/AspectRatio.css +29 -0
  418. package/dist/components/layout/aspect-ratio/AspectRatio.d.ts +24 -0
  419. package/dist/components/layout/aspect-ratio/AspectRatio.js +26 -0
  420. package/dist/components/layout/aspect-ratio/AspectRatio.types.d.ts +22 -0
  421. package/dist/components/layout/aspect-ratio/AspectRatio.types.js +7 -0
  422. package/dist/components/layout/aspect-ratio/aspect-ratio-impl.css +44 -0
  423. package/dist/components/layout/grid/Grid.css +76 -0
  424. package/dist/components/layout/grid/Grid.d.ts +31 -0
  425. package/dist/components/layout/grid/Grid.js +33 -0
  426. package/dist/components/layout/grid/Grid.types.d.ts +48 -0
  427. package/dist/components/layout/grid/Grid.types.js +7 -0
  428. package/dist/components/layout/grid/grid-impl.css +62 -0
  429. package/dist/components/layout/row/Row.css +85 -0
  430. package/dist/components/layout/row/Row.d.ts +32 -0
  431. package/dist/components/layout/row/Row.js +34 -0
  432. package/dist/components/layout/row/Row.types.d.ts +45 -0
  433. package/dist/components/layout/row/Row.types.js +7 -0
  434. package/dist/components/layout/scroller/Scroller.css +59 -0
  435. package/dist/components/layout/scroller/Scroller.d.ts +34 -0
  436. package/dist/components/layout/scroller/Scroller.js +36 -0
  437. package/dist/components/layout/scroller/Scroller.types.d.ts +38 -0
  438. package/dist/components/layout/scroller/Scroller.types.js +7 -0
  439. package/dist/components/layout/scroller/scroller-impl.css +45 -0
  440. package/dist/components/layout/stack/Stack.css +73 -0
  441. package/dist/components/layout/stack/Stack.d.ts +28 -0
  442. package/dist/components/layout/stack/Stack.js +30 -0
  443. package/dist/components/layout/stack/Stack.types.d.ts +41 -0
  444. package/dist/components/layout/stack/Stack.types.js +7 -0
  445. package/dist/components/visually-hidden.d.ts +22 -0
  446. package/dist/components/visually-hidden.js +31 -0
  447. package/dist/fonts/LICENSE-inter.txt +93 -0
  448. package/dist/fonts/LICENSE-red-hat-mono.txt +93 -0
  449. package/dist/fonts/fonts.css +111 -0
  450. package/dist/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
  451. package/dist/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
  452. package/dist/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
  453. package/dist/fonts/inter-greek-wght-normal.woff2 +0 -0
  454. package/dist/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
  455. package/dist/fonts/inter-latin-wght-normal.woff2 +0 -0
  456. package/dist/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
  457. package/dist/fonts/red-hat-mono-latin-ext-wght-normal.woff2 +0 -0
  458. package/dist/fonts/red-hat-mono-latin-wght-normal.woff2 +0 -0
  459. package/dist/marketing.css +289 -241
  460. package/package.json +18 -4
@@ -0,0 +1,660 @@
1
+ <!-- GENERATED from table.contract.json. Do not edit. -->
2
+
3
+ # Table
4
+
5
+ Structured data in rows and columns, where every row has the same shape. It owns what the whole table shares — a row's air, the rule between rows, how the columns take their widths — and none of what a cell holds, which is the page's to compose.
6
+
7
+ It remembers nothing. Which column is sorted outlives a render, so it arrives as a hook beside this component; the toolbar above and the footer beneath are the page's too, on the same surface. None of the three is a prop, and a table that grew one would hold a second copy of what the page already has.
8
+
9
+ ## Use when
10
+
11
+ - Data with a uniform structure, where the same fields exist on every row and a reader compares one row against another down a column
12
+ - Values that line up — amounts, dates, counts. A column is what makes them comparable, and comparison is the only reason to pay for a table's weight
13
+ - Rows that carry more than words: a badge against a name, a link at the end. The cell is a slot, so what a row holds is the page's decision
14
+
15
+ ## Do not use
16
+
17
+ - The records do not share a shape, or each is a thing in itself rather than a row to compare → `Card`
18
+ - There is one field per record → nothing here does this
19
+ - Layout. A table means the rows and columns carry meaning, and using one to place things puts a grid in the accessibility tree that a screen reader reads out as rows and columns of nothing
20
+ - A single record's fields. Two columns of label-and-value is a description list wearing a table's markup, and it announces every label as a column header it is not
21
+ - Data a reader cannot compare. If nobody will read down a column, the alignment, the rules and the header are all cost with no return
22
+ - Holding the answer to its own sorting or selection. Both outlive the render, so a table that kept them would be a second copy of what the page already has, and the two disagree the first time anything else changes either
23
+ - A row placed straight into the table. `forbiddenChildren` refuses it and the reason is worth more than the refusal: `<table>` cannot contain `<tr>`, so an HTML parser inserts an implied `<tbody>` around it — and React does not do the same on the client. Server-rendered markup therefore gains a node the client render lacks, and the two disagree at hydration. Every row belongs inside a section, which is what the sections are for
24
+
25
+ ## Anatomy
26
+
27
+ Table renders 3 elements. A token binding names the part it applies to.
28
+
29
+ - `root` — `<div>`, class `dds-table`. The scroll container, and the only thing here that is not the table. A table cannot scroll itself — `display: table` establishes no scroll container — so the element that does has to be a box around it, which is why this component renders two elements where it used to render one.
30
+
31
+ It earns that second element on the narrowest screen. A table is as wide as its columns need and a phone is not, and the surface it sits on clips: Card holds a corner and `overflow: hidden` to keep it, so a table wider than its card was cut off at the edge with nothing to say so and no way to reach the rest. That is the same unrecoverable failure the grid itself has — a column that is not there and a column that was never asked for look identical — and it is why this is the component's problem rather than the page's.
32
+
33
+ It scrolls on one axis only. The block axis is the page's: a table long enough to scroll vertically inside a box of its own is a table a reader cannot get out of, and the rows are the page's to paginate.
34
+
35
+ It is declared focusable, which is the contract saying what the implementation does: a div takes no focus on its own, and this one is given a tabindex. That is the cost of being a scroll region and not optional — a region a pointer can scroll and a keyboard cannot is unreachable for anybody not using a mouse. Named from the caption where there is one, so what a reader arrives in is announced rather than being an unlabelled box.
36
+ - `grid` — `<table>`, class `dds-table__grid`. The grid itself, and nothing under it. It paints no fill and holds no corner: a table is data, and the surface it sits on belongs to whatever put it there — a card, a panel, a section of a page. A table that painted its own would be a second surface inside the one it was given, and the two would disagree about the corner the moment either changed.
37
+
38
+ Its borders are separate with no spacing between them. A collapsed table ignores `border-radius`, which matters here even though this element draws none: a wrapper that rounds and clips a collapsed table cannot, so the table would fight the very surface it is meant to sit inside. The cost is that `<tr>` borders stop being painted at all, so the rules moved onto the cells — each cell draws the line above it, and a run of cells across one row draws one rule. `border-spacing: 0` keeps them touching, so the line is continuous rather than dashed by gaps.
39
+
40
+ It fills the scroller it is given rather than hugging its contents, so a table narrower than its container does not leave the last column floating with nothing under it. Where the columns need more room than that, the scroller takes over.
41
+
42
+ It owns the size, the rules and the column strategy, and hands all three to what it holds, section by section and then row by row. Each part re-declares them so it is still correct on its own, and nothing has to look upward to know how it is drawn.
43
+
44
+ It holds sections and never rows, which `forbiddenChildren` enforces and hydration is the reason for. `<table>` cannot contain `<tr>`: a parser reading server-rendered markup inserts an implied `<tbody>` around a bare row, and React does not insert one on the client — so the two trees differ by a node that nothing in the source asked for, and hydration mismatches.
45
+ - `caption` — `<caption>`, class `dds-table__caption`. What the table is, in words, above it. A table is announced as a grid of so many rows and columns and nothing else, so without a name a reader arrives inside one with no idea what it holds.
46
+
47
+ Visible rather than hidden, which is the point of it being a caption at all: a name a sighted reader can see is one they can also skip past, and a table in the middle of a page needs saying what it is as much as any other reader does. Where a heading directly above already says so, omit this and point at that heading instead. Rendered only when `caption` is set.
48
+
49
+ Apply these classes from the generated `tableParts` constant rather than writing the strings by hand.
50
+
51
+ ## Composition
52
+
53
+ - Can contain: `TableHead`, `TableBody`
54
+ - Never contains: `Table`, `TableRow`, `TableCell`, `TableHeaderCell`, `Card` — in children or in any prop that takes a node
55
+ - Holds at least 1 and at most 2
56
+
57
+ ## Props
58
+
59
+ ### layout — `auto` | `fixed` (default `auto`)
60
+
61
+ - `auto` — The default. Columns take their widths from what is in them, which is right when the content is known and varied — a name column wants more room than a status one and can say so itself
62
+ - `fixed` — Columns take an equal share of the width whatever they hold, and the table stops re-flowing as data changes. Reach for it when rows arrive over time: with auto widths every new page of results shifts every column and the reader loses the shape they had learnt.
63
+
64
+ Equal shares is the whole of what it does here. `table-layout: fixed` exists to make declared column widths authoritative, and this component declares none — there is no per-column width to set — so three columns are a third each however unlike they are.
65
+ Never for: A table whose columns need unequal room. Fixed gives them a third each, and a column that needs more does not clip — the text wraps instead — so the one carrying a name becomes a column of three-line cells while the one carrying a status keeps two thirds of its width empty. That is worse than the re-flow it was avoiding, and there is no width prop to correct it with: the pair that fixes it is a per-column width, which this component does not have yet.
66
+
67
+ ### pinFirstColumn — `boolean` (default `false`)
68
+
69
+ Use when: The first column is what identifies the row — a market, a product, a plan — and the columns after it are the values being compared. Pinned, the name stays while the numbers scroll, so a reader who has scrolled three columns out still knows which row they are reading. It is worth asking for exactly when the table is wider than the screen it is read on, which on a marketing page is most tables on a phone
70
+ Never for: A table that fits. Nothing sticks until there is something to scroll, so the pinning itself costs nothing — but the rule marking the pinned column is drawn either way, and a line down a table that never moves is a boundary the reader cannot act on. Nor a first column that is one of the values rather than the name of the row: pinning it says the rest are read against it, and a reader will believe that whether it is true or not
71
+
72
+ ### caption — `string`
73
+
74
+ Use when: Where nothing else names the table. A table is announced as a grid of so many rows and columns, so a reader landing inside an unnamed one has to read a cell to find out what they are in — "Open positions", "October statements". It renders a real `<caption>`, which browsers centre above the grid in bold, so it is a visible heading rather than a hidden label.
75
+
76
+ Most pages already have that heading, sitting above the table and styled by the page rather than by this component. Point at it with aria-labelledby and leave this out: two headings, one of them the browser's own idea of what a caption looks like, is worse than the one the page had.
77
+ Never for: Explaining the table. It is a name rather than a sentence: what the columns mean belongs in the header row, and anything longer than a few words is a paragraph the reader has to get past before reaching the data
78
+
79
+ ### dividers — `rows` | `grid` | `none` (default `rows`)
80
+
81
+ - `rows` — The default. A line between rows and none between columns, which is what stops the eye slipping from one row's start to another's end — the mistake a wide table invites and the one a reader never notices making
82
+ - `grid` — Lines both ways, for a table read as a matrix rather than as a list of records: a rate card, a comparison where the reader traces a column as often as a row. It is more lines than most tables need, so it should be asked for
83
+ - `none` — No lines at all. Right for two or three rows, where the rules are more structure than data, and for a table whose columns are already separated by their alignment
84
+ Never for: Marking a group. A missing line is not a heading — a table that wants sections wants a header row inside the body, or two tables. Nor `grid` as decoration on a long table: every vertical line is another thing between a reader and the value they came for
85
+
86
+ ### headerCase — `upper` | `title` (default `upper`)
87
+
88
+ - `upper` — The house setting: column names in capitals, at the role that suits them. A header is read once where the data under it is read many times, and capitals are what stop it competing
89
+ - `title` — Names drawn as they were written, at twelve pixels. Right where the names are long, are proper nouns whose own capitals would be flattened, or are in a script with no case at all
90
+
91
+ ### hoverable — `boolean` (default `true`)
92
+
93
+ Use when: On by default. A wash follows the pointer and says which row a press would land on, which a wide table needs and a narrow one is not harmed by: the further a row runs, the easier it is to be reading one and about to click another. Only on devices that have a pointer, which the row's own stylesheet gates
94
+ Never for: Nothing, usually — turning it off is the decision that takes a reason. A table that is only ever read is the case: a row that lights up under the pointer says it can be acted on, and one that lights up and does nothing makes that promise on every row at once
95
+
96
+ ### overflow — `wrap` | `truncate` (default `wrap`)
97
+
98
+ - `wrap` — The default. Text too long for its column wraps and the row grows taller, so nothing is hidden — right whenever the value is the point and a reader has to read all of it
99
+ - `truncate` — Rows must stay one line high — a dense table a reader scans down, where a row that grew would break the rhythm they are scanning by. The value is clipped with an ellipsis and the whole of it is still reachable, so this trades seeing for scanning rather than losing anything
100
+ Never for: Making a column narrow enough to be worth truncating. Clipping is what a column does when it has run out of room, not a way to give it less — a table of ellipses has hidden its data behind a hover on every cell
101
+
102
+ ### size — `sm` | `md` | `lg` (default `md`)
103
+
104
+ - `sm` — Compact. Dense data a reader scans rather than reads — a ledger, a positions table, anything where fitting more rows on screen is worth more than air around each one
105
+ - `md` — Balanced, and the default: rows a reader moves through at reading pace, with enough room that the eye does not slip between them
106
+ - `lg` — Spacious. Few rows, each carrying something substantial — a plan comparison, a summary of three accounts. Reach for it when the table is the page rather than a part of it
107
+ Never for: Making the text bigger or smaller. It changes how tall a row is and nothing else — the type stays one size down the whole table, because a reader comparing values across three tables at three densities is comparing the values rather than the tables. A table too wide for its column scrolls, and a smaller size only makes the same problem harder to read
108
+
109
+ Also accepts everything from `HTMLAttributes<HTMLDivElement>`.
110
+
111
+ ## Behaviour
112
+
113
+ A table renders what it is given and remembers nothing. Which column is sorted outlives a render and belongs to the page — a table that kept it would hold a second copy of what the page already has, and the two disagree the first time anything else changes either.
114
+
115
+ So it arrives as a hook beside the component. It owns one answer and hands back what to spread; it touches no DOM, and a table composed without it is a static grid, which is what most of a marketing page wants.
116
+
117
+ ```tsx
118
+ import { TableHeaderCell, useTableSort } from '@deriv-com/dds-marketing'
119
+
120
+ // The hook holds which column and which way; the header cell draws the mark and reports the
121
+ // press. Ordering the rows stays the page's, since only the page knows what a value means.
122
+ const sort = useTableSort({ column: 'spread', direction: 'ascending' })
123
+
124
+ <TableHeaderCell align="end" {...sort.columnProps('spread')}>Spread</TableHeaderCell>
125
+ ```
126
+
127
+ It takes the state the table opens in, because a table arriving already ordered the way its page means it to be read is the ordinary case rather than the exotic one.
128
+
129
+ Product ships two more hooks beside this one — row selection and column management. Neither comes over. They are how an application operates a table, and a marketing table is read rather than operated: a page that needs a reader to pick rows out of a set is an application view, and the table there is product's.
130
+
131
+ The hook makes a table using it a client component, since useState cannot cross the server boundary. A table composed without it is markup and props only and renders on a server perfectly well — worth knowing on a marketing page, because it is the difference between a static section and a bundle every reader downloads.
132
+
133
+ - `useTableSort` — with `TableSort`, `TableSortDirection`
134
+
135
+ All from `@deriv-com/dds-marketing`, the same import as the component.
136
+
137
+ ## Accessibility
138
+
139
+ Guaranteed by the component. Write none of it by hand: the ids these attributes point at are generated per instance, so an attribute set from outside either says the same thing twice or points at nothing.
140
+
141
+ - Announced as: `table`
142
+ - `Tab` — reaches the controls inside cells, in the order they are drawn. The table itself is not a tab stop — it is content, and a reader arrives at it by reading
143
+ - the scroll container is named where the table has a caption, so a reader who tabs into it is told what they have arrived in rather than meeting an unlabelled box
144
+ - the scroll container is reachable by keyboard and says so when it is reached. A region a pointer can scroll and a keyboard cannot is unreachable for anybody not using a mouse — and a tab stop that lands somewhere with nothing drawn on it is a reader losing their place in a table, which is the one thing this component exists to prevent. So it takes a tab stop and the ring this package paints on everything else that takes one
145
+ - the table has an accessible name, which caption supplies. A table is announced as a grid of so many rows and columns and nothing else, so a reader landing inside an unnamed one has to read a cell to find out what they are in
146
+ - the header row is marked up as header cells rather than styled to look like them. A screen reader announces the column header before each cell's value, which is the whole of how a reader knows what a number means without looking it up
147
+ - every row has the same number of cells. A table promises a shape, and a short row shifts every value after it into the wrong column for anyone reading it a cell at a time
148
+ - nothing here is focusable but the controls the cells hold. The grid takes no tabindex of its own
149
+ - a pinned column is a visual arrangement and nothing more. The cell keeps its place in the row, its header keeps naming its column, and the reading order is untouched — a reader who cannot see the scrolling meets the same table either way
150
+
151
+ ## Rules
152
+
153
+ - **On a phone a section's actions stack and each fills the width, including when there is only one** — On a phone a page's actions stack, and each one fills the width. Not most of it, and not the width its label happens to need — the whole column.
154
+
155
+ Two side by side is what this replaces. On the narrowest screen each gets half a column minus the gap, which is rarely enough for a real label: the words wrap inside the pills, the two buttons come out different heights, and the pair reads as a broken row rather than as a choice. Stacked, each has the whole width and neither has to shorten its words to fit.
156
+
157
+ A single action fills too, and that is the part worth saying, because it is the one that looks unnecessary. A lone button has the room to sit at its natural width and still should not: a full-width control is the phone's convention for the thing the screen is asking you to do, and a pill hugging its label reads as one option among others that are not there. It also makes the target predictable — the whole width, wherever the thumb lands — which a centred pill does not.
158
+
159
+ Filling is the row's job rather than the button's. A button has no width of its own and is not given one; the row it sits in becomes a column and stretches its children, so nothing about the control changes and the same button is full width here and its own size on a desktop.
160
+
161
+ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that decides whether a heading is centred. Those are different questions and they break at different widths: a heading stops being centred when the measure is the screen, while a button stops being full width much sooner than that — stretched across a tablet it is a long way from its own label, and a label centred in a metre of pill is harder to hit than one in a pill the size of the words.
162
+
163
+ What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
164
+ Guidance only — cannot be checked automatically.
165
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
166
+ Guidance only — cannot be checked automatically.
167
+ - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
168
+
169
+ color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
170
+
171
+ color.bg.strong is not a section ground. It is the inverted fill for an action that has to outrank what surrounds it, and the components that paint it — Button and ButtonIcon in their inverse form — already set both halves in one rule, which is the pattern a hand-painted section has to copy.
172
+ Guidance only — cannot be checked automatically.
173
+ - **Every gap inside a section names the relationship it expresses, and the same relationship keeps its measure when it turns on its side** — A section's spacing is named by the relationship it expresses, not chosen by size. Every gap in a section has a role token, and reaching for a step off the generic scale because it happens to be the right number is how two sections written by two people stop lining up: the numbers agree today and drift the first time one of them is tuned.
174
+
175
+ The heading group is three steps, not one gap. An eyebrow sits nearer its title than the title sits to its description, and the actions sit further from the description than either — space.heading.eyebrow-title, space.heading.title-description, space.heading.description-actions, in that order. A single `gap` on the group cannot say this; it sets all three the same and the block reads as evenly spaced lines rather than as a mark, a name and a paragraph. The eyebrow has to identify itself for this to work, because a group that opens with a title must not give its description the eyebrow's tighter step.
176
+
177
+ The step between a title and its description follows the size of the title, which is why there are two of it. What a reader sees is not the gap but the gap plus the leading above it, and leading scales with the type: under a display title the leading is most of the space, under a card's title it is half as deep. One value for both makes a card look loose at the size that made a section look right. So space.heading.title-description is the display step and space.heading.title-description-compact is the step at a card's size, and the choice is made by how big the title is rather than by what kind of block it sits in.
178
+
179
+ Every one of those steps is smaller than the gap below the group, and that ordering is what holds the group together as one thing. space.heading.content is the step between a heading group and the content it introduces, and it is the widest measure inside a section: the one gap the eye reads as a change of subject rather than as a continuation.
180
+
181
+ That step is the same whether the content is under the heading or beside it. A split is the same relationship turned on its side — a heading group and the content it introduces — so the space between the two halves is space.heading.content, not a gutter. When the split collapses to one column on a phone the gap becomes vertical again, which is where it started, and nothing has to change for that to be right.
182
+
183
+ space.grid.gutter is between two things of the same kind. Two cards in a row are the same kind; the two halves of a split are not, which is why the gutter is the wrong measure there even when the number would have looked acceptable. The gutter runs on both axes, so a grid reads as an even field rather than as rows with a seam down them.
184
+
185
+ space.inset.card is the card's, not the page's. A row of cards padded differently is a row of different cards, and the fill is the only edge they have. A page composing a row does not get to choose it.
186
+
187
+ Column count is not a breakpoint decision. A row holds as many columns as fit before a column would be narrower than size.grid.column-min, and drops one when they would not. Written as a fixed count that collapses at a breakpoint, a four-up row keeps four columns at every width above the phone and sets its copy two or three words to a line through the whole of the tablet range — and on a narrow desktop, which no breakpoint sits on at all. The threshold is a property of the row rather than of a card: a card fills whatever cell it is given.
188
+
189
+ What this does not cover is the space above and below a section, which is space.section.default and space.section.compact, and the page's own side margin, which is space.inset.page. Those are the section's outside; everything here is its inside.
190
+ Guidance only — cannot be checked automatically.
191
+ - **A section's title is centred over stacked content, starts beside content in columns, and starts on a phone** — Two arrangements, and the title's alignment is decided by which one it is introducing rather than chosen per section.
192
+
193
+ Content stacked under the title — a row of cards, an accordion, a set of steps — takes a centred title. The heading group and the block below it share one axis, so a centred title is symmetric with the thing it names, and the eye drops from the middle of the words to the middle of the set. A title starting at the left over a centred or full-width block reads as belonging to the first column rather than to all of them.
194
+
195
+ Content beside the title — a split, a picture in the other half, anything laid out in columns — takes a title that starts where its content starts. The two share a left edge, and that edge is what says they are one thing read across rather than two stacked. Centring the title there breaks the only alignment the reader has to hold the halves together, and it drifts further from its content the wider the page gets.
196
+
197
+ The heading group is what carries this, not the heading alone. An eyebrow, a title and a description are read as one block and align together; aligning the title without them leaves a centred heading over start-aligned copy, which reads as a mistake rather than as a choice.
198
+
199
+ Centred means all of it, not just the words. A badge, a row of actions, a picture — these are flex children, and a flex child is placed by align-items rather than by text-align, so a block that only sets the text leaves everything that is not text at the start. A hero is the case that shows it: its title and copy centred while its badge and its buttons did not.
200
+
201
+ A capped block centres itself as well as its words. A heading group takes size.heading-group.max, and a cap that is not centred leaves the measure at the start of the column with the words centred inside it — composed, and a long way left of the middle it appears to be in.
202
+
203
+ Both arrangements go to the start on a phone. A centred block reverts below the breakpoint, and the reason is the measure: on a phone the measure is the screen, so a centred title wraps to three or four ragged lines and the eye loses the left edge it was tracking — the same symmetry that reads as composure on a desktop is what makes it hard to scan on a phone. Centring there has to be asked for twice, and a section title is not one of the things that asks: it is centred because there is room for it, and on a phone there is not. Going back to the start means all of it too, and a capped block is the one that hides a leftover: its words go to the start while its measure stays in the middle of the column, which reads as a title still centred over a badge and buttons that are not — the box in the middle and the line inside it at the edge.
204
+
205
+ A hero is a section like any other: its badge, title, copy and actions are one stacked block, so it is centred on a desktop and starts on a phone with everything else.
206
+
207
+ What this is not about is a page whose body is a form or a document. A title over a sign-up form or a guide is not introducing a set of content — it is the first line of the thing itself, and it keeps the alignment the body has, which for running text is the start. The distinction is whether the block below is content the title names or content the title is part of.
208
+ Guidance only — cannot be checked automatically.
209
+ - **Anything a pointer has to hit is at least 24px in both directions** — A control sized by its contents is as big as its contents, and a glyph is chosen for how it reads rather than for how easily it is hit. An icon-only button with no padding is a 16px target — smaller than the pad of a finger, and smaller than the tremor of a hand using a mouse.
210
+
211
+ WCAG 2.2 asks for 24 by 24 CSS pixels at AA. The exceptions are narrower than they look: inline targets inside a sentence are exempt, and so is a small target with 24px of clear space around it — but a clear button sits against the field it empties, and a field is itself a target, so the spacing exemption does not apply to the case that keeps arising.
212
+
213
+ The target and the mark are separate decisions, and conflating them is what produces both faults. Growing the glyph to 24px makes it shout; leaving the button at 16px makes it hard to hit. So the glyph keeps the size that reads correctly beside its text, and the box around it declares a minimum of its own — which is what size.target.min is for.
214
+
215
+ Declared rather than emergent. Padding plus contents does clear 24px in several components today, and it is the weaker statement: it is a size nobody wrote down, so it moves when the type scale or the glyph does, and nothing says it was meant to be a target at all.
216
+ Guidance only — cannot be checked automatically.
217
+
218
+ ## Anti-examples
219
+
220
+ ❌ Table for: The records do not share a shape, or each is a thing in itself rather than a row to compare
221
+ A table promises that every row answers the same questions, and a column with nothing in it for half the rows is that promise broken in the one place a reader is looking. A card is a group of content read as one thing — reach for it when the reader looks at records one at a time, because a table is for looking across them and its whole cost buys that comparison
222
+ → use `Card` instead.
223
+
224
+ ❌ Table for: There is one field per record
225
+ A table of one column is a stack of values with rules around it. The grid earns its weight by aligning values against each other, and with a single column there is nothing to align — the same words in a plain stack say as much for none of the weight
226
+ → nothing in this system does this. Not a gap waiting to be filled — the case belongs outside it.
227
+
228
+ ## Example
229
+
230
+ ```tsx
231
+ import { Table, TableHead, TableRow, TableHeaderCell, TableBody, TableCell } from '@deriv-com/dds-marketing'
232
+
233
+ <Table>
234
+ <TableHead>
235
+ <TableRow>
236
+ <TableHeaderCell>Name</TableHeaderCell>
237
+ <TableHeaderCell>Email</TableHeaderCell>
238
+ <TableHeaderCell>Role</TableHeaderCell>
239
+ </TableRow>
240
+ </TableHead>
241
+ <TableBody>
242
+ <TableRow>
243
+ <TableCell>Alice Johnson</TableCell>
244
+ <TableCell>alice@example.com</TableCell>
245
+ <TableCell>Engineer</TableCell>
246
+ </TableRow>
247
+ <TableRow>
248
+ <TableCell>Bob Smith</TableCell>
249
+ <TableCell>bob@example.com</TableCell>
250
+ <TableCell>Designer</TableCell>
251
+ </TableRow>
252
+ <TableRow>
253
+ <TableCell>Charlie Brown</TableCell>
254
+ <TableCell>charlie@example.com</TableCell>
255
+ <TableCell>PM</TableCell>
256
+ </TableRow>
257
+ </TableBody>
258
+ </Table>
259
+ ```
260
+
261
+ ## In use
262
+
263
+ Most rows below hold the same set, written once here:
264
+
265
+ ```tsx
266
+ import { TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
267
+
268
+ const tableheads = (
269
+ <>
270
+ <TableHead>
271
+ <TableRow>
272
+ <TableHeaderCell>Name</TableHeaderCell>
273
+ <TableHeaderCell>Email</TableHeaderCell>
274
+ <TableHeaderCell>Role</TableHeaderCell>
275
+ </TableRow>
276
+ </TableHead>
277
+ <TableBody>
278
+ <TableRow>
279
+ <TableCell>Alice Johnson</TableCell>
280
+ <TableCell>alice@example.com</TableCell>
281
+ <TableCell>Engineer</TableCell>
282
+ </TableRow>
283
+ <TableRow>
284
+ <TableCell>Bob Smith</TableCell>
285
+ <TableCell>bob@example.com</TableCell>
286
+ <TableCell>Designer</TableCell>
287
+ </TableRow>
288
+ <TableRow>
289
+ <TableCell>Charlie Brown</TableCell>
290
+ <TableCell>charlie@example.com</TableCell>
291
+ <TableCell>PM</TableCell>
292
+ </TableRow>
293
+ </TableBody>
294
+ </>
295
+ )
296
+ ```
297
+
298
+ ### What it is for
299
+
300
+ Values a reader compares down a column. The alignment, the rules and the header are the whole cost, and comparison is the only thing that repays them.
301
+
302
+ ```tsx
303
+ import { Table } from '@deriv-com/dds-marketing'
304
+
305
+ // Three columns of uniform records
306
+ <Table>{tableheads}</Table>
307
+ ```
308
+
309
+ ### The case of the column names
310
+
311
+ Capitals read as a different texture from the values rather than a louder version of them. Names drawn as written are right where they are long, or are proper nouns, or are in a script with no case.
312
+
313
+ ```tsx
314
+ import { Table } from '@deriv-com/dds-marketing'
315
+
316
+ // upper — the default, capitals at eleven pixels
317
+ <Table headerCase="upper">{tableheads}</Table>
318
+
319
+ // title — as written, at twelve
320
+ <Table headerCase="title">{tableheads}</Table>
321
+ ```
322
+
323
+ ### Row density
324
+
325
+ One decision on the table, drawn by every cell: the padding and the size of the type together. Compact for scanning, spacious when the table is the page.
326
+
327
+ ```tsx
328
+ import { Table } from '@deriv-com/dds-marketing'
329
+
330
+ // sm — compact
331
+ <Table size="sm">{tableheads}</Table>
332
+
333
+ // md — balanced
334
+ <Table size="md">{tableheads}</Table>
335
+
336
+ // lg — spacious
337
+ <Table size="lg">{tableheads}</Table>
338
+ ```
339
+
340
+ ### Dividers
341
+
342
+ Rows for a list of records, which is most tables. Grid for one read as a matrix, where a reader traces a column as often as a row. None where alignment already separates them.
343
+
344
+ ```tsx
345
+ import { Table } from '@deriv-com/dds-marketing'
346
+
347
+ // rows — the default
348
+ <Table dividers="rows">{tableheads}</Table>
349
+
350
+ // grid — lines both ways
351
+ <Table dividers="grid">{tableheads}</Table>
352
+
353
+ // none
354
+ <Table dividers="none">{tableheads}</Table>
355
+ ```
356
+
357
+ ### How the columns take their widths
358
+
359
+ Auto lets content decide, which suits known data. Fixed shares the width evenly so the table stops re-flowing as rows arrive over time.
360
+
361
+ ```tsx
362
+ import { Table } from '@deriv-com/dds-marketing'
363
+
364
+ // auto — content decides
365
+ <Table layout="auto">{tableheads}</Table>
366
+
367
+ // fixed — steady as data changes
368
+ <Table layout="fixed">{tableheads}</Table>
369
+ ```
370
+
371
+ ### Hover
372
+
373
+ On by default: a wash under the pointer saying which row a press would land on. Only on devices that have a pointer. Turning it off is what takes a reason.
374
+
375
+ ```tsx
376
+ import { Table } from '@deriv-com/dds-marketing'
377
+
378
+ // The default — rows answer the pointer
379
+ <Table hoverable>{tableheads}</Table>
380
+
381
+ // Off — a table that is only read
382
+ <Table hoverable={false}>{tableheads}</Table>
383
+ ```
384
+
385
+ ### When a value is too long
386
+
387
+ Wrapping grows the row and hides nothing. Truncating keeps every row one line high, which is what a reader scanning a dense table is using. Headers always truncate.
388
+
389
+ ```tsx
390
+ import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
391
+
392
+ // wrap — the row grows
393
+ <Table overflow="wrap">
394
+ <TableHead>
395
+ <TableRow>
396
+ <TableHeaderCell>Name</TableHeaderCell>
397
+ <TableHeaderCell>Email</TableHeaderCell>
398
+ <TableHeaderCell>Role</TableHeaderCell>
399
+ </TableRow>
400
+ </TableHead>
401
+ <TableBody>
402
+ <TableRow>
403
+ <TableCell>Charlotte Featherstonehaugh-Willoughby</TableCell>
404
+ <TableCell>charlotte@example.com</TableCell>
405
+ <TableCell>Engineer</TableCell>
406
+ </TableRow>
407
+ <TableRow>
408
+ <TableCell>Bob Smith</TableCell>
409
+ <TableCell>bob@example.com</TableCell>
410
+ <TableCell>Designer</TableCell>
411
+ </TableRow>
412
+ </TableBody>
413
+ </Table>
414
+
415
+ // truncate — the row stays one line
416
+ <Table overflow="truncate">
417
+ <TableHead>
418
+ <TableRow>
419
+ <TableHeaderCell>Name</TableHeaderCell>
420
+ <TableHeaderCell>Email</TableHeaderCell>
421
+ <TableHeaderCell>Role</TableHeaderCell>
422
+ </TableRow>
423
+ </TableHead>
424
+ <TableBody>
425
+ <TableRow>
426
+ <TableCell>Charlotte Featherstonehaugh-Willoughby</TableCell>
427
+ <TableCell>charlotte@example.com</TableCell>
428
+ <TableCell>Engineer</TableCell>
429
+ </TableRow>
430
+ <TableRow>
431
+ <TableCell>Bob Smith</TableCell>
432
+ <TableCell>bob@example.com</TableCell>
433
+ <TableCell>Designer</TableCell>
434
+ </TableRow>
435
+ </TableBody>
436
+ </Table>
437
+ ```
438
+
439
+ ### Ordering by a column
440
+
441
+ Every sortable column carries a mark, not only the sorted one — a mark on the active header alone leaves a reader guessing which of the others can be pressed at all.
442
+
443
+ ```tsx
444
+ import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
445
+
446
+ // Sorted by balance, largest first
447
+ <Table>
448
+ <TableHead>
449
+ <TableRow>
450
+ <TableHeaderCell sortable sortDirection="none">Market</TableHeaderCell>
451
+ <TableHeaderCell align="end" sortable sortDirection="descending">Balance</TableHeaderCell>
452
+ <TableHeaderCell>Status</TableHeaderCell>
453
+ </TableRow>
454
+ </TableHead>
455
+ <TableBody>
456
+ <TableRow>
457
+ <TableCell>EUR/USD</TableCell>
458
+ <TableCell align="end" numeric>1,284.00</TableCell>
459
+ <TableCell>Open</TableCell>
460
+ </TableRow>
461
+ <TableRow>
462
+ <TableCell>GBP/JPY</TableCell>
463
+ <TableCell align="end" numeric>942.50</TableCell>
464
+ <TableCell>Open</TableCell>
465
+ </TableRow>
466
+ <TableRow>
467
+ <TableCell>BTC/USD</TableCell>
468
+ <TableCell align="end" numeric>317.25</TableCell>
469
+ <TableCell>Closed</TableCell>
470
+ </TableRow>
471
+ </TableBody>
472
+ </Table>
473
+ ```
474
+
475
+ ### Rich cells
476
+
477
+ A cell is a slot, so a row can carry a badge rather than only words. What goes in is the page's to compose.
478
+
479
+ ```tsx
480
+ import { Badge, Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
481
+
482
+ // A status carried by a Badge
483
+ <Table>
484
+ <TableHead>
485
+ <TableRow>
486
+ <TableHeaderCell>Name</TableHeaderCell>
487
+ <TableHeaderCell>Email</TableHeaderCell>
488
+ <TableHeaderCell>Status</TableHeaderCell>
489
+ </TableRow>
490
+ </TableHead>
491
+ <TableBody>
492
+ <TableRow>
493
+ <TableCell>Alice Johnson</TableCell>
494
+ <TableCell>alice@example.com</TableCell>
495
+ <TableCell>
496
+ <Badge label="Active" variant="accent" />
497
+ </TableCell>
498
+ </TableRow>
499
+ <TableRow>
500
+ <TableCell>Bob Smith</TableCell>
501
+ <TableCell>bob@example.com</TableCell>
502
+ <TableCell>
503
+ <Badge label="Away" variant="neutral" />
504
+ </TableCell>
505
+ </TableRow>
506
+ </TableBody>
507
+ </Table>
508
+ ```
509
+
510
+ ### Filtering in the head
511
+
512
+ A second row under the names, one control per column. Each control sits under the column it narrows, which is what a toolbar above the table would have to say in words.
513
+
514
+ ```tsx
515
+ import { Badge, SearchInput, Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
516
+
517
+ // A control under each column it filters
518
+ <Table>
519
+ <TableHead>
520
+ <TableRow>
521
+ <TableHeaderCell>Market</TableHeaderCell>
522
+ <TableHeaderCell align="end">Balance</TableHeaderCell>
523
+ <TableHeaderCell>Status</TableHeaderCell>
524
+ </TableRow>
525
+ <TableRow>
526
+ <TableCell>
527
+ <SearchInput label="Filter by market" showLabel={false} placeholder="Any market" size="sm" />
528
+ </TableCell>
529
+ <TableCell>
530
+ <SearchInput label="Filter by balance" showLabel={false} placeholder="Any amount" size="sm" />
531
+ </TableCell>
532
+ <TableCell />
533
+ </TableRow>
534
+ </TableHead>
535
+ <TableBody>
536
+ <TableRow>
537
+ <TableCell>EUR/USD</TableCell>
538
+ <TableCell align="end" numeric>1,284.00</TableCell>
539
+ <TableCell>
540
+ <Badge label="Open" variant="accent" />
541
+ </TableCell>
542
+ </TableRow>
543
+ <TableRow>
544
+ <TableCell>GBP/JPY</TableCell>
545
+ <TableCell align="end" numeric>942.50</TableCell>
546
+ <TableCell>
547
+ <Badge label="Open" variant="accent" />
548
+ </TableCell>
549
+ </TableRow>
550
+ <TableRow>
551
+ <TableCell>BTC/USD</TableCell>
552
+ <TableCell align="end" numeric>317.25</TableCell>
553
+ <TableCell>
554
+ <Badge label="Closed" variant="neutral" />
555
+ </TableCell>
556
+ </TableRow>
557
+ </TableBody>
558
+ </Table>
559
+ ```
560
+
561
+ ### The surface it sits on
562
+
563
+ A Table paints no fill and holds no corner: the surface belongs to whatever the table is put in. This is that pairing, and it is the one composition every consumer writes.
564
+
565
+ ```tsx
566
+ import { Card, Table } from '@deriv-com/dds-marketing'
567
+
568
+ // Inside a Card, which brings the fill and the corner
569
+ <Card bordered>
570
+ <Table>{tableheads}</Table>
571
+ </Card>
572
+ ```
573
+
574
+ ### A column that stays put
575
+
576
+ The first column names the row and the rest are the values compared against it. Pinned, the name stays while the numbers scroll out from under it.
577
+
578
+ ```tsx
579
+ import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '@deriv-com/dds-marketing'
580
+
581
+ // Pinned — the name survives the scroll
582
+ <Table pinFirstColumn overflow="truncate">
583
+ <TableHead>
584
+ <TableRow>
585
+ <TableHeaderCell>Market</TableHeaderCell>
586
+ <TableHeaderCell align="end">Spread</TableHeaderCell>
587
+ <TableHeaderCell align="end">Commission</TableHeaderCell>
588
+ <TableHeaderCell align="end">Swap long</TableHeaderCell>
589
+ <TableHeaderCell align="end">Swap short</TableHeaderCell>
590
+ <TableHeaderCell align="end">Leverage</TableHeaderCell>
591
+ </TableRow>
592
+ </TableHead>
593
+ <TableBody>
594
+ <TableRow>
595
+ <TableCell>BRKR.OQ: Bruker Corp (NASDAQ)</TableCell>
596
+ <TableCell numeric align="end">0.08</TableCell>
597
+ <TableCell numeric align="end">1200</TableCell>
598
+ <TableCell numeric align="end">-2.14</TableCell>
599
+ <TableCell numeric align="end">-0.87</TableCell>
600
+ <TableCell numeric align="end">1:20</TableCell>
601
+ </TableRow>
602
+ <TableRow>
603
+ <TableCell>BRO.N: Brown & Brown Inc (NYSE)</TableCell>
604
+ <TableCell numeric align="end">0.20</TableCell>
605
+ <TableCell numeric align="end">950</TableCell>
606
+ <TableCell numeric align="end">-1.96</TableCell>
607
+ <TableCell numeric align="end">-1.02</TableCell>
608
+ <TableCell numeric align="end">1:20</TableCell>
609
+ </TableRow>
610
+ <TableRow>
611
+ <TableCell>BSX.N: Boston Scientific Corp (NYSE)</TableCell>
612
+ <TableCell numeric align="end">0.23</TableCell>
613
+ <TableCell numeric align="end">500</TableCell>
614
+ <TableCell numeric align="end">-3.01</TableCell>
615
+ <TableCell numeric align="end">-0.44</TableCell>
616
+ <TableCell numeric align="end">1:10</TableCell>
617
+ </TableRow>
618
+ </TableBody>
619
+ </Table>
620
+
621
+ // Not pinned — the name scrolls away with the rest
622
+ <Table overflow="truncate">
623
+ <TableHead>
624
+ <TableRow>
625
+ <TableHeaderCell>Market</TableHeaderCell>
626
+ <TableHeaderCell align="end">Spread</TableHeaderCell>
627
+ <TableHeaderCell align="end">Commission</TableHeaderCell>
628
+ <TableHeaderCell align="end">Swap long</TableHeaderCell>
629
+ <TableHeaderCell align="end">Swap short</TableHeaderCell>
630
+ <TableHeaderCell align="end">Leverage</TableHeaderCell>
631
+ </TableRow>
632
+ </TableHead>
633
+ <TableBody>
634
+ <TableRow>
635
+ <TableCell>BRKR.OQ: Bruker Corp (NASDAQ)</TableCell>
636
+ <TableCell numeric align="end">0.08</TableCell>
637
+ <TableCell numeric align="end">1200</TableCell>
638
+ <TableCell numeric align="end">-2.14</TableCell>
639
+ <TableCell numeric align="end">-0.87</TableCell>
640
+ <TableCell numeric align="end">1:20</TableCell>
641
+ </TableRow>
642
+ <TableRow>
643
+ <TableCell>BRO.N: Brown & Brown Inc (NYSE)</TableCell>
644
+ <TableCell numeric align="end">0.20</TableCell>
645
+ <TableCell numeric align="end">950</TableCell>
646
+ <TableCell numeric align="end">-1.96</TableCell>
647
+ <TableCell numeric align="end">-1.02</TableCell>
648
+ <TableCell numeric align="end">1:20</TableCell>
649
+ </TableRow>
650
+ <TableRow>
651
+ <TableCell>BSX.N: Boston Scientific Corp (NYSE)</TableCell>
652
+ <TableCell numeric align="end">0.23</TableCell>
653
+ <TableCell numeric align="end">500</TableCell>
654
+ <TableCell numeric align="end">-3.01</TableCell>
655
+ <TableCell numeric align="end">-0.44</TableCell>
656
+ <TableCell numeric align="end">1:10</TableCell>
657
+ </TableRow>
658
+ </TableBody>
659
+ </Table>
660
+ ```