@navikt/ds-react 5.5.0 → 5.6.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 (342) hide show
  1. package/_docs.json +507 -106
  2. package/cjs/accordion/Accordion.js +1 -0
  3. package/cjs/accordion/AccordionContext.js +1 -1
  4. package/cjs/accordion/AccordionHeader.js +2 -2
  5. package/cjs/accordion/AccordionItem.js +6 -2
  6. package/cjs/date/datepicker/DatePicker.js +30 -34
  7. package/cjs/date/datepicker/DatePickerStandalone.js +23 -26
  8. package/cjs/date/datepicker/parts/Caption.js +28 -0
  9. package/cjs/date/datepicker/{DayButton.js → parts/DayButton.js} +1 -2
  10. package/cjs/date/datepicker/{caption → parts}/DropdownCaption.js +13 -7
  11. package/cjs/date/datepicker/parts/HeadRow.js +36 -0
  12. package/cjs/date/datepicker/parts/Row.js +23 -0
  13. package/cjs/date/datepicker/{TableHead.js → parts/TableHead.js} +4 -3
  14. package/cjs/date/datepicker/parts/WeekNumber.js +35 -0
  15. package/cjs/date/datepicker/parts/WeekRow.js +34 -0
  16. package/cjs/date/hooks/useDatepicker.js +2 -2
  17. package/cjs/date/hooks/useMonthPicker.js +2 -2
  18. package/cjs/date/hooks/useRangeDatepicker.js +3 -3
  19. package/cjs/date/monthpicker/MonthSelector.js +1 -1
  20. package/cjs/date/utils/get-month-weeks.js +46 -0
  21. package/cjs/date/utils/labels.js +40 -1
  22. package/cjs/dropdown/Toggle.js +2 -2
  23. package/cjs/dropdown/index.js +0 -15
  24. package/cjs/form/Select.js +1 -1
  25. package/cjs/form/checkbox/useCheckbox.js +3 -4
  26. package/cjs/form/combobox/Combobox.js +1 -1
  27. package/cjs/form/combobox/Input/Input.js +1 -1
  28. package/cjs/form/search/Search.js +3 -1
  29. package/cjs/index.js +1 -0
  30. package/cjs/layout/bleed/Bleed.js +69 -0
  31. package/cjs/layout/bleed/index.js +5 -0
  32. package/cjs/layout/bleed/package.json +6 -0
  33. package/cjs/layout/box/Box.js +1 -1
  34. package/cjs/layout/responsive/Responsive.js +8 -6
  35. package/cjs/layout/sidemal-test/AvatarPanel.js +18 -0
  36. package/cjs/layout/sidemal-test/Content.js +66 -0
  37. package/cjs/layout/sidemal-test/Filter.js +48 -0
  38. package/cjs/layout/sidemal-test/Header.js +48 -0
  39. package/cjs/layout/sidemal-test/Intro.js +36 -0
  40. package/cjs/layout/sidemal-test/Sidebar.js +49 -0
  41. package/cjs/layout/sidemal-test/content-box/ContentBox.js +65 -0
  42. package/cjs/layout/sidemal-test/content-box/index.js +8 -0
  43. package/cjs/layout/sidemal-test/content-box/package.json +6 -0
  44. package/cjs/layout/stack/Stack.js +2 -2
  45. package/cjs/layout/stack/index.js +3 -1
  46. package/cjs/layout/utilities/css.js +37 -14
  47. package/cjs/loader/Loader.js +2 -2
  48. package/cjs/modal/dialog-polyfill.js +2 -0
  49. package/cjs/popover/Popover.js +3 -2
  50. package/cjs/tabs/TabList.js +6 -7
  51. package/cjs/timeline/Pin.js +20 -20
  52. package/cjs/timeline/Timeline.js +4 -4
  53. package/cjs/timeline/period/ClickablePeriod.js +19 -19
  54. package/cjs/timeline/period/index.js +1 -1
  55. package/cjs/timeline/utils/timeline.js +3 -3
  56. package/cjs/toggle-group/ToggleGroup.js +1 -1
  57. package/cjs/tooltip/Tooltip.js +1 -1
  58. package/cjs/typography/Heading.js +1 -1
  59. package/cjs/util/RandomIcon.js +1 -0
  60. package/cjs/util/Slot.js +88 -0
  61. package/cjs/util/useId.js +2 -4
  62. package/esm/accordion/Accordion.js +1 -0
  63. package/esm/accordion/Accordion.js.map +1 -1
  64. package/esm/accordion/AccordionContext.d.ts +1 -0
  65. package/esm/accordion/AccordionContext.js +1 -1
  66. package/esm/accordion/AccordionContext.js.map +1 -1
  67. package/esm/accordion/AccordionHeader.js +2 -2
  68. package/esm/accordion/AccordionHeader.js.map +1 -1
  69. package/esm/accordion/AccordionItem.js +6 -2
  70. package/esm/accordion/AccordionItem.js.map +1 -1
  71. package/esm/date/datepicker/DatePicker.d.ts +14 -5
  72. package/esm/date/datepicker/DatePicker.js +29 -33
  73. package/esm/date/datepicker/DatePicker.js.map +1 -1
  74. package/esm/date/datepicker/DatePickerStandalone.d.ts +3 -2
  75. package/esm/date/datepicker/DatePickerStandalone.js +22 -25
  76. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  77. package/esm/date/datepicker/{caption → parts}/Caption.d.ts +3 -0
  78. package/esm/date/datepicker/parts/Caption.js +22 -0
  79. package/esm/date/datepicker/parts/Caption.js.map +1 -0
  80. package/esm/date/datepicker/parts/DayButton.d.ts +4 -0
  81. package/esm/date/datepicker/{DayButton.js → parts/DayButton.js} +2 -1
  82. package/esm/date/datepicker/parts/DayButton.js.map +1 -0
  83. package/esm/date/datepicker/{caption → parts}/DropdownCaption.d.ts +3 -0
  84. package/esm/date/datepicker/parts/DropdownCaption.js +44 -0
  85. package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -0
  86. package/esm/date/datepicker/parts/HeadRow.d.ts +11 -0
  87. package/esm/date/datepicker/parts/HeadRow.js +29 -0
  88. package/esm/date/datepicker/parts/HeadRow.js.map +1 -0
  89. package/esm/date/datepicker/parts/Row.d.ts +17 -0
  90. package/esm/date/datepicker/parts/Row.js +19 -0
  91. package/esm/date/datepicker/parts/Row.js.map +1 -0
  92. package/esm/date/datepicker/parts/TableHead.d.ts +6 -0
  93. package/esm/date/datepicker/{TableHead.js → parts/TableHead.js} +5 -2
  94. package/esm/date/datepicker/parts/TableHead.js.map +1 -0
  95. package/esm/date/datepicker/parts/WeekNumber.d.ts +13 -0
  96. package/esm/date/datepicker/parts/WeekNumber.js +31 -0
  97. package/esm/date/datepicker/parts/WeekNumber.js.map +1 -0
  98. package/esm/date/datepicker/parts/WeekRow.d.ts +5 -0
  99. package/esm/date/datepicker/parts/WeekRow.js +30 -0
  100. package/esm/date/datepicker/parts/WeekRow.js.map +1 -0
  101. package/esm/date/hooks/useDatepicker.js +2 -2
  102. package/esm/date/hooks/useDatepicker.js.map +1 -1
  103. package/esm/date/hooks/useMonthPicker.js +2 -2
  104. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  105. package/esm/date/hooks/useRangeDatepicker.js +3 -3
  106. package/esm/date/hooks/useRangeDatepicker.js.map +1 -1
  107. package/esm/date/monthpicker/MonthButton.d.ts +2 -2
  108. package/esm/date/monthpicker/MonthPicker.d.ts +1 -1
  109. package/esm/date/monthpicker/MonthSelector.js +1 -1
  110. package/esm/date/monthpicker/MonthSelector.js.map +1 -1
  111. package/esm/date/utils/get-month-weeks.d.ts +16 -0
  112. package/esm/date/utils/get-month-weeks.js +42 -0
  113. package/esm/date/utils/get-month-weeks.js.map +1 -0
  114. package/esm/date/utils/labels.d.ts +9 -0
  115. package/esm/date/utils/labels.js +36 -0
  116. package/esm/date/utils/labels.js.map +1 -1
  117. package/esm/date/utils/navigation.d.ts +1 -1
  118. package/esm/date/utils/navigation.js.map +1 -1
  119. package/esm/dropdown/Toggle.js +1 -1
  120. package/esm/dropdown/Toggle.js.map +1 -1
  121. package/esm/dropdown/index.d.ts +1 -2
  122. package/esm/dropdown/index.js +0 -1
  123. package/esm/dropdown/index.js.map +1 -1
  124. package/esm/form/Select.js +1 -1
  125. package/esm/form/Select.js.map +1 -1
  126. package/esm/form/checkbox/useCheckbox.d.ts +1 -1
  127. package/esm/form/checkbox/useCheckbox.js +3 -4
  128. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  129. package/esm/form/combobox/Combobox.d.ts +1 -1
  130. package/esm/form/combobox/Combobox.js +1 -1
  131. package/esm/form/combobox/Combobox.js.map +1 -1
  132. package/esm/form/combobox/Input/Input.d.ts +0 -2
  133. package/esm/form/combobox/Input/Input.js +1 -1
  134. package/esm/form/combobox/Input/Input.js.map +1 -1
  135. package/esm/form/search/Search.js +3 -1
  136. package/esm/form/search/Search.js.map +1 -1
  137. package/esm/index.d.ts +1 -0
  138. package/esm/index.js +1 -0
  139. package/esm/index.js.map +1 -1
  140. package/esm/layout/bleed/Bleed.d.ts +47 -0
  141. package/esm/layout/bleed/Bleed.js +41 -0
  142. package/esm/layout/bleed/Bleed.js.map +1 -0
  143. package/esm/layout/bleed/index.d.ts +1 -0
  144. package/esm/layout/bleed/index.js +2 -0
  145. package/esm/layout/bleed/index.js.map +1 -0
  146. package/esm/layout/box/Box.d.ts +1 -2
  147. package/esm/layout/box/Box.js +1 -1
  148. package/esm/layout/box/Box.js.map +1 -1
  149. package/esm/layout/responsive/Responsive.d.ts +8 -4
  150. package/esm/layout/responsive/Responsive.js +8 -6
  151. package/esm/layout/responsive/Responsive.js.map +1 -1
  152. package/esm/layout/sidemal-test/AvatarPanel.d.ts +4 -0
  153. package/esm/layout/sidemal-test/AvatarPanel.js +12 -0
  154. package/esm/layout/sidemal-test/AvatarPanel.js.map +1 -0
  155. package/esm/layout/sidemal-test/Content.d.ts +2 -0
  156. package/esm/layout/sidemal-test/Content.js +60 -0
  157. package/esm/layout/sidemal-test/Content.js.map +1 -0
  158. package/esm/layout/sidemal-test/Filter.d.ts +2 -0
  159. package/esm/layout/sidemal-test/Filter.js +22 -0
  160. package/esm/layout/sidemal-test/Filter.js.map +1 -0
  161. package/esm/layout/sidemal-test/Header.d.ts +2 -0
  162. package/esm/layout/sidemal-test/Header.js +42 -0
  163. package/esm/layout/sidemal-test/Header.js.map +1 -0
  164. package/esm/layout/sidemal-test/Intro.d.ts +2 -0
  165. package/esm/layout/sidemal-test/Intro.js +30 -0
  166. package/esm/layout/sidemal-test/Intro.js.map +1 -0
  167. package/esm/layout/sidemal-test/Sidebar.d.ts +4 -0
  168. package/esm/layout/sidemal-test/Sidebar.js +41 -0
  169. package/esm/layout/sidemal-test/Sidebar.js.map +1 -0
  170. package/esm/layout/sidemal-test/content-box/ContentBox.d.ts +8 -0
  171. package/esm/layout/sidemal-test/content-box/ContentBox.js +37 -0
  172. package/esm/layout/sidemal-test/content-box/ContentBox.js.map +1 -0
  173. package/esm/layout/sidemal-test/content-box/index.d.ts +1 -0
  174. package/esm/layout/sidemal-test/content-box/index.js +2 -0
  175. package/esm/layout/sidemal-test/content-box/index.js.map +1 -0
  176. package/esm/layout/stack/Stack.d.ts +7 -3
  177. package/esm/layout/stack/Stack.js +3 -3
  178. package/esm/layout/stack/Stack.js.map +1 -1
  179. package/esm/layout/stack/index.d.ts +1 -0
  180. package/esm/layout/stack/index.js +1 -0
  181. package/esm/layout/stack/index.js.map +1 -1
  182. package/esm/layout/utilities/css.d.ts +1 -1
  183. package/esm/layout/utilities/css.js +37 -14
  184. package/esm/layout/utilities/css.js.map +1 -1
  185. package/esm/loader/Loader.js +3 -3
  186. package/esm/loader/Loader.js.map +1 -1
  187. package/esm/modal/dialog-polyfill.js +2 -0
  188. package/esm/modal/dialog-polyfill.js.map +1 -1
  189. package/esm/popover/Popover.js +3 -2
  190. package/esm/popover/Popover.js.map +1 -1
  191. package/esm/tabs/TabList.js +6 -7
  192. package/esm/tabs/TabList.js.map +1 -1
  193. package/esm/timeline/Pin.js +21 -21
  194. package/esm/timeline/Pin.js.map +1 -1
  195. package/esm/timeline/Timeline.js +4 -4
  196. package/esm/timeline/Timeline.js.map +1 -1
  197. package/esm/timeline/TimelineRow.js.map +1 -1
  198. package/esm/timeline/hooks/usePeriodContext.d.ts +1 -1
  199. package/esm/timeline/period/ClickablePeriod.js +20 -20
  200. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  201. package/esm/timeline/period/index.d.ts +2 -2
  202. package/esm/timeline/period/index.js +1 -1
  203. package/esm/timeline/period/index.js.map +1 -1
  204. package/esm/timeline/utils/timeline.js +3 -3
  205. package/esm/timeline/utils/timeline.js.map +1 -1
  206. package/esm/toggle-group/ToggleGroup.js +1 -1
  207. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  208. package/esm/tooltip/Tooltip.js +1 -1
  209. package/esm/tooltip/Tooltip.js.map +1 -1
  210. package/esm/typography/Heading.js +1 -1
  211. package/esm/typography/Heading.js.map +1 -1
  212. package/esm/util/RandomIcon.js +1 -0
  213. package/esm/util/RandomIcon.js.map +1 -1
  214. package/esm/util/Slot.d.ts +6 -0
  215. package/esm/util/Slot.js +60 -0
  216. package/esm/util/Slot.js.map +1 -0
  217. package/esm/util/mergeRefs.d.ts +1 -1
  218. package/esm/util/useId.js +2 -4
  219. package/esm/util/useId.js.map +1 -1
  220. package/package.json +4 -4
  221. package/src/accordion/Accordion.tsx +1 -0
  222. package/src/accordion/AccordionContext.tsx +2 -1
  223. package/src/accordion/AccordionHeader.tsx +2 -2
  224. package/src/accordion/AccordionItem.tsx +7 -5
  225. package/src/accordion/accordion.stories.tsx +21 -34
  226. package/src/alert/alert.stories.tsx +2 -2
  227. package/src/chips/chips.stories.tsx +29 -32
  228. package/src/date/datepicker/DatePicker.tsx +63 -58
  229. package/src/date/datepicker/DatePickerStandalone.tsx +36 -39
  230. package/src/date/datepicker/datepicker.stories.tsx +67 -2
  231. package/src/date/datepicker/datepicker.test.tsx +5 -4
  232. package/src/date/datepicker/{caption → parts}/Caption.tsx +19 -17
  233. package/src/date/datepicker/{DayButton.tsx → parts/DayButton.tsx} +3 -1
  234. package/src/date/datepicker/parts/DropdownCaption.tsx +113 -0
  235. package/src/date/datepicker/parts/HeadRow.tsx +56 -0
  236. package/src/date/datepicker/parts/Row.tsx +47 -0
  237. package/src/date/datepicker/{TableHead.tsx → parts/TableHead.tsx} +6 -2
  238. package/src/date/datepicker/parts/WeekNumber.tsx +79 -0
  239. package/src/date/datepicker/parts/WeekRow.tsx +60 -0
  240. package/src/date/hooks/useDatepicker.tsx +2 -2
  241. package/src/date/hooks/useMonthPicker.tsx +2 -2
  242. package/src/date/hooks/useRangeDatepicker.test.tsx +11 -11
  243. package/src/date/hooks/useRangeDatepicker.tsx +3 -3
  244. package/src/date/monthpicker/MonthButton.tsx +2 -2
  245. package/src/date/monthpicker/MonthPicker.tsx +1 -1
  246. package/src/date/monthpicker/MonthSelector.tsx +3 -3
  247. package/src/date/monthpicker/monthpicker.stories.tsx +1 -1
  248. package/src/date/utils/__tests__/get-initial-year.test.ts +0 -12
  249. package/src/date/utils/__tests__/get-month-weeks.test.ts +113 -0
  250. package/src/date/utils/__tests__/is-match.test.ts +3 -3
  251. package/src/date/utils/__tests__/parse-dates.test.ts +4 -2
  252. package/src/date/utils/get-month-weeks.ts +93 -0
  253. package/src/date/utils/labels.ts +51 -0
  254. package/src/date/utils/navigation.ts +3 -3
  255. package/src/dropdown/Toggle.tsx +1 -1
  256. package/src/dropdown/dropdown.stories.tsx +25 -28
  257. package/src/dropdown/index.ts +1 -2
  258. package/src/expansion-card/expansion-card.stories.tsx +143 -161
  259. package/src/form/ConfirmationPanel.test.tsx +5 -5
  260. package/src/form/Select.tsx +1 -1
  261. package/src/form/checkbox/Checkbox.test.tsx +14 -26
  262. package/src/form/checkbox/checkbox.stories.tsx +66 -71
  263. package/src/form/checkbox/useCheckbox.ts +3 -4
  264. package/src/form/combobox/Combobox.tsx +2 -3
  265. package/src/form/combobox/Input/Input.tsx +1 -3
  266. package/src/form/combobox/combobox.stories.tsx +20 -23
  267. package/src/form/combobox/combobox.test.tsx +22 -20
  268. package/src/form/radio/radio.stories.tsx +39 -44
  269. package/src/form/search/Search.tsx +1 -0
  270. package/src/form/search/search.stories.tsx +22 -26
  271. package/src/form/stories/fieldset.stories.tsx +1 -1
  272. package/src/index.ts +1 -0
  273. package/src/layout/bleed/Bleed.stories.tsx +381 -0
  274. package/src/layout/bleed/Bleed.tsx +130 -0
  275. package/src/layout/bleed/index.ts +1 -0
  276. package/src/layout/box/Box.stories.tsx +251 -256
  277. package/src/layout/box/Box.tsx +2 -1
  278. package/src/layout/responsive/Responsive.tsx +21 -6
  279. package/src/layout/responsive/hide.stories.tsx +35 -0
  280. package/src/layout/responsive/show.stories.tsx +35 -0
  281. package/src/layout/sidemal-test/AvatarPanel.tsx +27 -0
  282. package/src/layout/sidemal-test/Content.tsx +129 -0
  283. package/src/layout/sidemal-test/Filter.tsx +46 -0
  284. package/src/layout/sidemal-test/Header.tsx +96 -0
  285. package/src/layout/sidemal-test/Intro.tsx +91 -0
  286. package/src/layout/sidemal-test/Sidebar.tsx +77 -0
  287. package/src/layout/sidemal-test/content-box/ContentBox.tsx +46 -0
  288. package/src/layout/sidemal-test/content-box/index.ts +1 -0
  289. package/src/layout/sidemal-test/navno-sidemal.stories.mdx +29 -0
  290. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +65 -0
  291. package/src/layout/sidemal-test/styling.css +43 -0
  292. package/src/layout/stack/Stack.tsx +14 -8
  293. package/src/layout/stack/index.ts +1 -0
  294. package/src/layout/stack/stack.stories.tsx +23 -1
  295. package/src/layout/utilities/css.ts +59 -20
  296. package/src/loader/Loader.tsx +2 -3
  297. package/src/modal/dialog-polyfill.ts +2 -0
  298. package/src/pagination/pagination.stories.tsx +35 -42
  299. package/src/popover/Popover.test.tsx +21 -35
  300. package/src/popover/Popover.tsx +2 -2
  301. package/src/popover/popover.stories.tsx +25 -41
  302. package/src/react-css.d.ts +0 -1
  303. package/src/read-more/readmore.stories.tsx +35 -36
  304. package/src/stepper/stepper.stories.tsx +45 -52
  305. package/src/table/stories/table-expandable.stories.tsx +59 -63
  306. package/src/tabs/TabList.tsx +4 -6
  307. package/src/tabs/Tabs.stories.tsx +3 -3
  308. package/src/tag/tag.stories.tsx +4 -4
  309. package/src/timeline/Pin.tsx +44 -39
  310. package/src/timeline/Timeline.tsx +6 -6
  311. package/src/timeline/TimelineRow.tsx +1 -0
  312. package/src/timeline/hooks/usePeriodContext.tsx +1 -1
  313. package/src/timeline/period/ClickablePeriod.tsx +42 -38
  314. package/src/timeline/period/index.tsx +5 -4
  315. package/src/timeline/timeline.stories.tsx +11 -10
  316. package/src/timeline/utils/timeline.ts +3 -3
  317. package/src/toggle-group/ToggleGroup.stories.tsx +25 -29
  318. package/src/toggle-group/ToggleGroup.tsx +0 -1
  319. package/src/tooltip/Tooltip.test.tsx +40 -54
  320. package/src/tooltip/Tooltip.tsx +1 -1
  321. package/src/typography/Heading.tsx +1 -1
  322. package/src/util/RandomIcon.tsx +1 -0
  323. package/src/util/Slot.tsx +69 -0
  324. package/src/util/__tests__/Slot.test.tsx +98 -0
  325. package/src/util/mergeRefs.tsx +1 -1
  326. package/src/util/useId.ts +1 -3
  327. package/cjs/date/datepicker/caption/Caption.js +0 -23
  328. package/cjs/date/datepicker/caption/index.js +0 -10
  329. package/cjs/date/datepicker/caption/package.json +0 -6
  330. package/esm/date/datepicker/DayButton.d.ts +0 -3
  331. package/esm/date/datepicker/DayButton.js.map +0 -1
  332. package/esm/date/datepicker/TableHead.d.ts +0 -3
  333. package/esm/date/datepicker/TableHead.js.map +0 -1
  334. package/esm/date/datepicker/caption/Caption.js +0 -17
  335. package/esm/date/datepicker/caption/Caption.js.map +0 -1
  336. package/esm/date/datepicker/caption/DropdownCaption.js +0 -38
  337. package/esm/date/datepicker/caption/DropdownCaption.js.map +0 -1
  338. package/esm/date/datepicker/caption/index.d.ts +0 -2
  339. package/esm/date/datepicker/caption/index.js +0 -3
  340. package/esm/date/datepicker/caption/index.js.map +0 -1
  341. package/src/date/datepicker/caption/DropdownCaption.tsx +0 -108
  342. package/src/date/datepicker/caption/index.ts +0 -2
@@ -0,0 +1,381 @@
1
+ import React from "react";
2
+ import type { Meta } from "@storybook/react";
3
+ import { BodyLong } from "../../typography";
4
+ import { Bleed } from "./Bleed";
5
+ import { Box, HStack, VStack } from "../..";
6
+
7
+ export default {
8
+ title: "ds-react/Primitives/Bleed",
9
+ component: Bleed,
10
+ } satisfies Meta<typeof Bleed>;
11
+
12
+ export const Default = {
13
+ render: () => (
14
+ <>
15
+ <VStack gap="2">
16
+ <Box background="surface-alt-1-subtle" padding="5">
17
+ <Box background="surface-alt-2-subtle" padding="5">
18
+ <Bleed marginInline="10 0">
19
+ <Box
20
+ padding="3"
21
+ className="p"
22
+ background="surface-success-subtle"
23
+ >
24
+ <BodyLong>marginInline=&quot;10 0&quot;</BodyLong>
25
+ </Box>
26
+ </Bleed>
27
+ </Box>
28
+ </Box>
29
+ <Box background="surface-alt-1-subtle" padding="5">
30
+ <Box background="surface-alt-2-subtle" padding="5">
31
+ <Bleed marginInline="0 10">
32
+ <Box
33
+ padding="3"
34
+ className="p"
35
+ background="surface-success-subtle"
36
+ >
37
+ <BodyLong>marginInline=&quot;0 10&quot;</BodyLong>
38
+ </Box>
39
+ </Bleed>
40
+ </Box>
41
+ </Box>
42
+ <Box background="surface-alt-1-subtle" padding="5">
43
+ <Box background="surface-alt-2-subtle" padding="5">
44
+ <Bleed marginBlock="10 0">
45
+ <Box
46
+ padding="3"
47
+ className="p"
48
+ background="surface-success-subtle"
49
+ >
50
+ <BodyLong>marginBlock=&quot;10 0&quot;</BodyLong>
51
+ </Box>
52
+ </Bleed>
53
+ </Box>
54
+ </Box>
55
+ <Box background="surface-alt-1-subtle" padding="5">
56
+ <Box background="surface-alt-2-subtle" padding="5">
57
+ <Bleed marginBlock="0 10">
58
+ <Box
59
+ padding="3"
60
+ className="p"
61
+ background="surface-success-subtle"
62
+ >
63
+ <BodyLong>marginBlock=&quot;0 10&quot;</BodyLong>
64
+ </Box>
65
+ </Bleed>
66
+ </Box>
67
+ </Box>
68
+ </VStack>
69
+ </>
70
+ ),
71
+ };
72
+
73
+ export const AsChild = {
74
+ render: () => (
75
+ <>
76
+ <VStack gap="2">
77
+ <Box background="surface-alt-1-subtle" padding="5">
78
+ <Box background="surface-alt-2-subtle" padding="5">
79
+ <Bleed marginInline="10 0" asChild>
80
+ <Box padding="3" background="surface-success-subtle">
81
+ <BodyLong>marginInline=&quot;10 0&quot;</BodyLong>
82
+ </Box>
83
+ </Bleed>
84
+ </Box>
85
+ </Box>
86
+ <Box background="surface-alt-1-subtle" padding="5">
87
+ <Box background="surface-alt-2-subtle" padding="5">
88
+ <Bleed marginInline="0 10" asChild>
89
+ <Box padding="3" background="surface-success-subtle">
90
+ <BodyLong>marginInline=&quot;0 10&quot;</BodyLong>
91
+ </Box>
92
+ </Bleed>
93
+ </Box>
94
+ </Box>
95
+ <Box background="surface-alt-1-subtle" padding="5">
96
+ <Box background="surface-alt-2-subtle" padding="5">
97
+ <Bleed marginBlock="10 0" asChild>
98
+ <Box padding="3" background="surface-success-subtle">
99
+ <BodyLong>marginBlock=&quot;10 0&quot;</BodyLong>
100
+ </Box>
101
+ </Bleed>
102
+ </Box>
103
+ </Box>
104
+ <Box background="surface-alt-1-subtle" padding="5">
105
+ <Box background="surface-alt-2-subtle" padding="5">
106
+ <Bleed marginBlock="0 10" asChild>
107
+ <Box padding="3" background="surface-success-subtle">
108
+ <BodyLong>marginBlock=&quot;0 10&quot;</BodyLong>
109
+ </Box>
110
+ </Bleed>
111
+ </Box>
112
+ </Box>
113
+ </VStack>
114
+ </>
115
+ ),
116
+ };
117
+
118
+ export const Breakpoints = {
119
+ render: () => (
120
+ <>
121
+ <VStack gap="2">
122
+ <Box background="surface-alt-1-subtle" padding={{ xs: "5", md: "10" }}>
123
+ <Box
124
+ background="surface-alt-2-subtle"
125
+ padding={{ xs: "5", md: "10" }}
126
+ >
127
+ <Bleed marginInline={{ xs: "10 0", md: "20 0" }}>
128
+ <Box padding="3" background="surface-success-subtle">
129
+ <BodyLong>
130
+ {'marginInline={{ xs: "10 0", md: "20 0" }}'}
131
+ </BodyLong>
132
+ </Box>
133
+ </Bleed>
134
+ </Box>
135
+ </Box>
136
+ <Box background="surface-alt-1-subtle" padding={{ xs: "5", md: "10" }}>
137
+ <Box
138
+ background="surface-alt-2-subtle"
139
+ padding={{ xs: "5", md: "10" }}
140
+ >
141
+ <Bleed marginInline={{ xs: "0 10", md: "0 20" }}>
142
+ <Box padding="3" background="surface-success-subtle">
143
+ <BodyLong>
144
+ {'marginInline={{ xs: "0 10", md: "0 20" }}'}
145
+ </BodyLong>
146
+ </Box>
147
+ </Bleed>
148
+ </Box>
149
+ </Box>
150
+ <Box background="surface-alt-1-subtle" padding={{ xs: "5", md: "10" }}>
151
+ <Box
152
+ background="surface-alt-2-subtle"
153
+ padding={{ xs: "5", md: "10" }}
154
+ >
155
+ <Bleed marginBlock={{ xs: "10 0", md: "20 0" }}>
156
+ <Box padding="3" background="surface-success-subtle">
157
+ <BodyLong>
158
+ {'marginBlock={{ xs: "10 0", md: "20 0" }}'}
159
+ </BodyLong>
160
+ </Box>
161
+ </Bleed>
162
+ </Box>
163
+ </Box>
164
+ <Box background="surface-alt-1-subtle" padding={{ xs: "5", md: "10" }}>
165
+ <Box
166
+ background="surface-alt-2-subtle"
167
+ padding={{ xs: "5", md: "10" }}
168
+ >
169
+ <Bleed marginBlock={{ xs: "0 10", md: "0 20" }}>
170
+ <Box padding="3" background="surface-success-subtle">
171
+ <BodyLong>
172
+ {'marginBlock={{ xs: "0 10", md: "0 20" }}'}
173
+ </BodyLong>
174
+ </Box>
175
+ </Bleed>
176
+ </Box>
177
+ </Box>
178
+ </VStack>
179
+ </>
180
+ ),
181
+ };
182
+
183
+ export const Px = {
184
+ render: () => (
185
+ <>
186
+ <style>
187
+ {`
188
+ .circle {
189
+ width: 24px;
190
+ height: 24px;
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ }
195
+ .scale {
196
+ transform: scale(5);
197
+ }
198
+ `}
199
+ </style>
200
+ <Box padding="32">
201
+ <HStack className="" gap="32">
202
+ <Box
203
+ className="circle scale"
204
+ background="surface-success-subtle"
205
+ borderRadius="full"
206
+ >
207
+ L
208
+ </Box>
209
+ <Box
210
+ className="circle scale"
211
+ background="surface-success-subtle"
212
+ borderRadius="full"
213
+ >
214
+ <Bleed marginInline="0 px">L</Bleed>
215
+ </Box>
216
+ </HStack>
217
+ </Box>
218
+ </>
219
+ ),
220
+ };
221
+
222
+ export const Full = {
223
+ parameters: {
224
+ layout: "fullscreen",
225
+ },
226
+ render: () => (
227
+ <>
228
+ <style>
229
+ {`
230
+ .maxWidth {
231
+ max-width: 300px;
232
+ }
233
+ `}
234
+ </style>
235
+ <VStack gap="2" align="center">
236
+ <Box
237
+ className="maxWidth"
238
+ background="surface-alt-1-subtle"
239
+ padding="10"
240
+ >
241
+ <Box background="surface-alt-2-subtle" padding="10">
242
+ <Bleed marginInline="full">
243
+ <Box background="surface-success-subtle">
244
+ <BodyLong>marginInline=&quot;full&quot;</BodyLong>
245
+ </Box>
246
+ </Bleed>
247
+ </Box>
248
+ </Box>
249
+ <Box
250
+ className="maxWidth"
251
+ background="surface-alt-1-subtle"
252
+ padding="10"
253
+ >
254
+ <Box background="surface-alt-2-subtle" padding="10">
255
+ <Bleed marginInline="full 0">
256
+ <Box background="surface-success-subtle">
257
+ <BodyLong>marginInline=&quot;full 0&quot;</BodyLong>
258
+ </Box>
259
+ </Bleed>
260
+ </Box>
261
+ </Box>
262
+ <Box
263
+ className="maxWidth"
264
+ background="surface-alt-1-subtle"
265
+ padding="10"
266
+ >
267
+ <Box background="surface-alt-2-subtle" padding="10">
268
+ <Bleed marginInline="0 full">
269
+ <Box background="surface-success-subtle">
270
+ <BodyLong>marginInline=&quot;0 full&quot;</BodyLong>
271
+ </Box>
272
+ </Bleed>
273
+ </Box>
274
+ </Box>
275
+ </VStack>
276
+ </>
277
+ ),
278
+ };
279
+
280
+ export const ReflectivePadding = {
281
+ render: () => (
282
+ <>
283
+ <style>
284
+ {`
285
+ .navds-bleed {
286
+ background-color: var(--a-surface-success-subtle);
287
+ width: fit-content;
288
+ }
289
+ `}
290
+ </style>
291
+ <HStack gap="3">
292
+ <VStack gap="2">
293
+ <p>CSS string</p>
294
+ <Box background="surface-alt-1-subtle" padding="5">
295
+ <Box background="surface-alt-2-subtle" padding="5">
296
+ <Bleed asChild>
297
+ <BodyLong>before Bleed</BodyLong>
298
+ </Bleed>
299
+ </Box>
300
+ </Box>
301
+ <Box background="surface-alt-1-subtle" padding="5">
302
+ <Box background="surface-alt-2-subtle" padding="5">
303
+ <Bleed marginInline="10 0" asChild>
304
+ <BodyLong>without reflectivePadding</BodyLong>
305
+ </Bleed>
306
+ </Box>
307
+ </Box>
308
+ <Box background="surface-alt-1-subtle" padding="5">
309
+ <Box background="surface-alt-2-subtle" padding="5">
310
+ <Bleed marginInline="10 0" reflectivePadding asChild>
311
+ <BodyLong>with reflectivePadding</BodyLong>
312
+ </Bleed>
313
+ </Box>
314
+ </Box>
315
+ </VStack>
316
+
317
+ <VStack gap="2">
318
+ <p>breakpoints</p>
319
+ <Box
320
+ background="surface-alt-1-subtle"
321
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
322
+ >
323
+ <Box
324
+ background="surface-alt-2-subtle"
325
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
326
+ >
327
+ <Bleed asChild>
328
+ <BodyLong>before Bleed</BodyLong>
329
+ </Bleed>
330
+ </Box>
331
+ </Box>
332
+ <Box
333
+ background="surface-alt-1-subtle"
334
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
335
+ >
336
+ <Box
337
+ background="surface-alt-2-subtle"
338
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
339
+ >
340
+ <Bleed
341
+ marginInline={{
342
+ xs: "4 0",
343
+ sm: "8 0",
344
+ md: "12 0",
345
+ lg: "16 0",
346
+ xl: "20 0",
347
+ }}
348
+ asChild
349
+ >
350
+ <BodyLong>without reflectivePadding</BodyLong>
351
+ </Bleed>
352
+ </Box>
353
+ </Box>
354
+ <Box
355
+ background="surface-alt-1-subtle"
356
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
357
+ >
358
+ <Box
359
+ background="surface-alt-2-subtle"
360
+ padding={{ xs: "2", sm: "4", md: "6", lg: "8", xl: "10" }}
361
+ >
362
+ <Bleed
363
+ marginInline={{
364
+ xs: "4 0",
365
+ sm: "8 0",
366
+ md: "12 0",
367
+ lg: "16 0",
368
+ xl: "20 0",
369
+ }}
370
+ reflectivePadding
371
+ asChild
372
+ >
373
+ <BodyLong>with reflectivePadding</BodyLong>
374
+ </Bleed>
375
+ </Box>
376
+ </Box>
377
+ </VStack>
378
+ </HStack>
379
+ </>
380
+ ),
381
+ };
@@ -0,0 +1,130 @@
1
+ import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
+ import {
4
+ ResponsiveProp,
5
+ SpacingScale,
6
+ getResponsiveProps,
7
+ } from "../utilities/css";
8
+ import { Slot } from "../../util/Slot";
9
+
10
+ export type BleedSpacingInline = "0" | "full" | "px" | SpacingScale;
11
+ export type BleedSpacingBlock = "0" | "px" | SpacingScale;
12
+
13
+ export interface BleedProps extends React.HTMLAttributes<HTMLDivElement> {
14
+ /** **Negative** horizontal margin around children.
15
+ * Accepts a spacing token or an object of spacing tokens for different breakpoints.
16
+ * @example
17
+ * marginInline='4'
18
+ * marginInline='4 5'
19
+ * marginInline={{xs: '0 32', sm: '3', md: '4 5', lg: '5', xl: '6'}}
20
+ */
21
+ marginInline?: ResponsiveProp<
22
+ BleedSpacingInline | `${BleedSpacingInline} ${BleedSpacingInline}`
23
+ >;
24
+ /** **Negative** vertical margin around children.
25
+ * Accepts a spacing token or an object of spacing tokens for different breakpoints.
26
+ * @example
27
+ * marginBlock='4'
28
+ * marginBlock='4 5'
29
+ * marginBlock={{xs: '2', sm: '3', md: '4', lg: '5', xl: '6'}}
30
+ */
31
+ marginBlock?: ResponsiveProp<
32
+ BleedSpacingBlock | `${BleedSpacingBlock} ${BleedSpacingBlock}`
33
+ >;
34
+ /**
35
+ * When true, set the padding to mirror the margin.
36
+ * This maintains the apparent width of the element prior to adding Bleed.
37
+ * When this is used with `asChild`, it will overwrite the padding of the child.
38
+ */
39
+ reflectivePadding?: boolean;
40
+
41
+ /**
42
+ * When true, the Bleed will render as its child. This merges classes, styles and event handlers.
43
+ */
44
+ asChild?: boolean;
45
+ }
46
+
47
+ /**
48
+ * Foundational Layout-primitive for generic encapsulation & styling.
49
+ *
50
+ * @see [📝 Documentation](https://aksel.nav.no/komponenter/primitives/Bleed)
51
+ * @see 🏷️ {@link BleedProps}
52
+ * @see [🤖 OverridableComponent](https://aksel.nav.no/grunnleggende/kode/overridablecomponent) support
53
+ *
54
+ * @example
55
+ * <Box padding="4">
56
+ * <Bleed marginInline="4" marginBlock="4">
57
+ * <BodyLong>Some content</BodyLong>
58
+ * </Bleed>
59
+ * </Box>
60
+ */
61
+ export const Bleed = forwardRef<HTMLDivElement, BleedProps>(
62
+ (
63
+ {
64
+ className,
65
+ marginInline,
66
+ marginBlock,
67
+ reflectivePadding,
68
+ style: _style,
69
+ asChild,
70
+ ...rest
71
+ },
72
+ ref
73
+ ) => {
74
+ let style: React.CSSProperties = {
75
+ ..._style,
76
+ ...getResponsiveProps(
77
+ "bleed",
78
+ "margin-inline",
79
+ "spacing",
80
+ marginInline,
81
+ true,
82
+ ["0", "full", "px"]
83
+ ),
84
+
85
+ ...getResponsiveProps(
86
+ "bleed",
87
+ "margin-block",
88
+ "spacing",
89
+ marginBlock,
90
+ true,
91
+ ["0", "px"]
92
+ ),
93
+ };
94
+
95
+ if (reflectivePadding) {
96
+ style = {
97
+ ...style,
98
+ ...getResponsiveProps(
99
+ "bleed",
100
+ "padding-inline",
101
+ "spacing",
102
+ marginInline,
103
+ false,
104
+ ["0", "full", "px"]
105
+ ),
106
+ ...getResponsiveProps(
107
+ "bleed",
108
+ "padding-block",
109
+ "spacing",
110
+ marginBlock,
111
+ false,
112
+ ["0", "px"]
113
+ ),
114
+ };
115
+ }
116
+
117
+ const Comp = asChild ? Slot : "div";
118
+
119
+ return (
120
+ <Comp
121
+ {...rest}
122
+ className={cl("navds-bleed", className, {
123
+ "navds-bleed--padding": reflectivePadding,
124
+ })}
125
+ ref={ref}
126
+ style={style}
127
+ />
128
+ );
129
+ }
130
+ );
@@ -0,0 +1 @@
1
+ export { Bleed, type BleedProps } from "./Bleed";