@danske/sapphire-react-lab 0.106.2 → 0.107.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 (327) hide show
  1. package/build/cjs/index.js +2557 -64
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js +11 -0
  4. package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js.map +1 -0
  5. package/build/esm/core/src/Flex/src/Flex.js +64 -0
  6. package/build/esm/core/src/Flex/src/Flex.js.map +1 -0
  7. package/build/esm/core/src/Grid/src/Grid.js +55 -0
  8. package/build/esm/core/src/Grid/src/Grid.js.map +1 -0
  9. package/build/esm/core/src/Icon/src/Icon.js +37 -0
  10. package/build/esm/core/src/Icon/src/Icon.js.map +1 -0
  11. package/build/esm/core/src/ListBox/i18n/da-DK.json.js +7 -0
  12. package/build/esm/core/src/ListBox/i18n/de-DE.json.js +7 -0
  13. package/build/esm/core/src/ListBox/i18n/en-US.json.js +7 -0
  14. package/build/esm/core/src/ListBox/i18n/fi-FI.json.js +7 -0
  15. package/build/esm/core/src/ListBox/i18n/index.js.map +1 -0
  16. package/build/esm/core/src/ListBox/i18n/nb-NO.json.js +7 -0
  17. package/build/esm/core/src/ListBox/i18n/pl-PL.json.js +7 -0
  18. package/build/esm/core/src/ListBox/i18n/sv-SE.json.js +7 -0
  19. package/build/esm/core/src/ListBox/src/ListBoxContext.js +8 -0
  20. package/build/esm/core/src/ListBox/src/ListBoxContext.js.map +1 -0
  21. package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js +26 -0
  22. package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js.map +1 -0
  23. package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js +37 -0
  24. package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js.map +1 -0
  25. package/build/esm/core/src/ListBox/src/ListBoxOption.js +105 -0
  26. package/build/esm/core/src/ListBox/src/ListBoxOption.js.map +1 -0
  27. package/build/esm/core/src/ListBox/src/ListBoxSection.js +86 -0
  28. package/build/esm/core/src/ListBox/src/ListBoxSection.js.map +1 -0
  29. package/build/esm/core/src/ListBox/src/StatelessListBox.js +162 -0
  30. package/build/esm/core/src/ListBox/src/StatelessListBox.js.map +1 -0
  31. package/build/esm/core/src/Pagination/src/usePaginationContext.js +8 -0
  32. package/build/esm/core/src/Pagination/src/usePaginationContext.js.map +1 -0
  33. package/build/esm/core/src/Popover/src/Popover.js +62 -0
  34. package/build/esm/core/src/Popover/src/Popover.js.map +1 -0
  35. package/build/esm/core/src/Radio/src/RadioBox.js +58 -0
  36. package/build/esm/core/src/Radio/src/RadioBox.js.map +1 -0
  37. package/build/esm/core/src/Separator/src/Separator.js +32 -0
  38. package/build/esm/core/src/Separator/src/Separator.js.map +1 -0
  39. package/build/esm/core/src/Skeleton/src/Skeleton.js +19 -0
  40. package/build/esm/core/src/Skeleton/src/Skeleton.js.map +1 -0
  41. package/build/esm/core/src/Skeleton/src/SkeletonCircle.js +39 -0
  42. package/build/esm/core/src/Skeleton/src/SkeletonCircle.js.map +1 -0
  43. package/build/esm/core/src/Skeleton/src/SkeletonText.js +59 -0
  44. package/build/esm/core/src/Skeleton/src/SkeletonText.js.map +1 -0
  45. package/build/esm/core/src/Skeleton/src/animation.js +4 -0
  46. package/build/esm/core/src/Skeleton/src/animation.js.map +1 -0
  47. package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js +42 -0
  48. package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js.map +1 -0
  49. package/build/esm/core/src/View/src/View.js +60 -0
  50. package/build/esm/core/src/View/src/View.js.map +1 -0
  51. package/build/esm/core/src/utils/SapphireStyleProps.js +48 -0
  52. package/build/esm/core/src/utils/SapphireStyleProps.js.map +1 -0
  53. package/build/esm/core/src/utils/useCollectionFocusProxy.js +53 -0
  54. package/build/esm/core/src/utils/useCollectionFocusProxy.js.map +1 -0
  55. package/build/esm/core/src/utils/usePreventTouchEnd.js +16 -0
  56. package/build/esm/core/src/utils/usePreventTouchEnd.js.map +1 -0
  57. package/build/esm/core/src/utils/useSapphireStyleProps.js +179 -0
  58. package/build/esm/core/src/utils/useSapphireStyleProps.js.map +1 -0
  59. package/build/esm/core/src/utils/useSapphireTextStyleProps.js +9 -0
  60. package/build/esm/core/src/utils/useSapphireTextStyleProps.js.map +1 -0
  61. package/build/esm/core/src/utils/useScrollCheck.js +38 -0
  62. package/build/esm/core/src/utils/useScrollCheck.js.map +1 -0
  63. package/build/esm/core/src/utils/useThemeCheck.js +14 -0
  64. package/build/esm/core/src/utils/useThemeCheck.js.map +1 -0
  65. package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js +158 -0
  66. package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js.map +1 -0
  67. package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js +69 -0
  68. package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js.map +1 -0
  69. package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js +40 -0
  70. package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js.map +1 -0
  71. package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js +35 -0
  72. package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js.map +1 -0
  73. package/build/esm/index.js +23 -20
  74. package/build/esm/index.js.map +1 -1
  75. package/build/esm/lab/src/Accordion/index.js.map +1 -0
  76. package/build/esm/lab/src/Accordion/src/Accordion.js.map +1 -0
  77. package/build/esm/lab/src/Accordion/src/AccordionContext.js.map +1 -0
  78. package/build/esm/lab/src/Accordion/src/AccordionHeading.js.map +1 -0
  79. package/build/esm/lab/src/Accordion/src/AccordionItem.js.map +1 -0
  80. package/build/esm/lab/src/Accordion/src/AccordionPanel.js.map +1 -0
  81. package/build/esm/lab/src/Accordion/src/utils.js.map +1 -0
  82. package/build/esm/lab/src/Alert/src/Alert.js.map +1 -0
  83. package/build/esm/lab/src/Amount/src/Amount.js.map +1 -0
  84. package/build/esm/lab/src/Amount/src/useGroupAmount.js.map +1 -0
  85. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js +2 -2
  86. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js +2 -2
  87. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js +2 -2
  88. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js +2 -2
  89. package/build/esm/lab/src/Autocomplete/i18n/index.js +20 -0
  90. package/build/esm/lab/src/Autocomplete/i18n/index.js.map +1 -0
  91. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js +2 -2
  92. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js +2 -2
  93. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js +2 -2
  94. package/build/esm/lab/src/Autocomplete/src/Autocomplete.js.map +1 -0
  95. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItem.js.map +1 -0
  96. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemLink.js.map +1 -0
  97. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -0
  98. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -0
  99. package/build/esm/lab/src/Breadcrumbs/src/Breadcrumbs.js.map +1 -0
  100. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbsSeparator.js.map +1 -0
  101. package/build/esm/lab/src/Breadcrumbs/src/useBreadcrumbThreshold.js.map +1 -0
  102. package/build/esm/lab/src/DataGrid/index.js +9 -0
  103. package/build/esm/lab/src/DataGrid/index.js.map +1 -0
  104. package/build/esm/lab/src/DataGrid/src/DataGrid.js +463 -0
  105. package/build/esm/lab/src/DataGrid/src/DataGrid.js.map +1 -0
  106. package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js +6 -0
  107. package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js.map +1 -0
  108. package/build/esm/lab/src/DataGrid/src/EditableCellContent.js +125 -0
  109. package/build/esm/lab/src/DataGrid/src/EditableCellContent.js.map +1 -0
  110. package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js +15 -0
  111. package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js.map +1 -0
  112. package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js +417 -0
  113. package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js.map +1 -0
  114. package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js +55 -0
  115. package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js.map +1 -0
  116. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js +2 -2
  117. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js +2 -2
  118. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js +2 -2
  119. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js +2 -2
  120. package/build/esm/lab/src/FileDropzone/i18n/index.js.map +1 -0
  121. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js +2 -2
  122. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js +2 -2
  123. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js +2 -2
  124. package/build/esm/lab/src/FileDropzone/src/FileDropzone.js.map +1 -0
  125. package/build/esm/lab/src/FileDropzone/src/FileTrigger.js.map +1 -0
  126. package/build/esm/lab/src/FileDropzone/src/utils.js.map +1 -0
  127. package/build/esm/lab/src/Filtering/src/FilterDropdown.js.map +1 -0
  128. package/build/esm/{Filtering → lab/src/Filtering}/src/SearchableSelectFilter.js +2 -0
  129. package/build/esm/lab/src/Filtering/src/SearchableSelectFilter.js.map +1 -0
  130. package/build/esm/lab/src/Flag/src/Flag.js.map +1 -0
  131. package/build/esm/lab/src/LabeledValue/src/LabeledValue.js.map +1 -0
  132. package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js +2 -2
  133. package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js +2 -2
  134. package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js +2 -2
  135. package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js +2 -2
  136. package/build/esm/lab/src/NumberField/i18n/index.js.map +1 -0
  137. package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js +2 -2
  138. package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js +2 -2
  139. package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js +2 -2
  140. package/build/esm/lab/src/NumberField/src/NumberField.js.map +1 -0
  141. package/build/esm/lab/src/NumberField/src/StepperButton.js.map +1 -0
  142. package/build/esm/lab/src/NumberField/src/cursorHelpers.js.map +1 -0
  143. package/build/esm/lab/src/NumberField/src/formatHelpers.js.map +1 -0
  144. package/build/esm/lab/src/NumberField/src/keyboardHelpers.js.map +1 -0
  145. package/build/esm/lab/src/NumberField/src/useAutofillStyle.js.map +1 -0
  146. package/build/esm/lab/src/NumberField/src/useNumberFieldFormatting.js.map +1 -0
  147. package/build/esm/lab/src/NumberField/src/useSapphireNumberField.js.map +1 -0
  148. package/build/esm/lab/src/ProgressIndicator/src/ProgressIndicator.js.map +1 -0
  149. package/build/esm/lab/src/Sidebar/index.js.map +1 -0
  150. package/build/esm/lab/src/Sidebar/src/Body.js.map +1 -0
  151. package/build/esm/lab/src/Sidebar/src/ExpandableItem.js.map +1 -0
  152. package/build/esm/lab/src/Sidebar/src/Header.js.map +1 -0
  153. package/build/esm/lab/src/Sidebar/src/Item.js.map +1 -0
  154. package/build/esm/lab/src/Sidebar/src/List.js.map +1 -0
  155. package/build/esm/lab/src/Sidebar/src/Panel.js.map +1 -0
  156. package/build/esm/lab/src/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
  157. package/build/esm/lab/src/Sidebar/src/SecondarySidebarContext.js.map +1 -0
  158. package/build/esm/lab/src/Sidebar/src/Section.js.map +1 -0
  159. package/build/esm/lab/src/Sidebar/src/Sidebar.js.map +1 -0
  160. package/build/esm/lab/src/Sidebar/src/useSidebar.js.map +1 -0
  161. package/build/esm/lab/src/Slider/index.js.map +1 -0
  162. package/build/esm/lab/src/Slider/src/Slider.js.map +1 -0
  163. package/build/esm/lab/src/TagGroup/src/Tag.js.map +1 -0
  164. package/build/esm/lab/src/TagGroup/src/TagGroup.js.map +1 -0
  165. package/build/esm/lab/src/TagGroup/src/TagItem.js.map +1 -0
  166. package/build/esm/{TimeField → lab/src/TimeField}/i18n/da-DK.json.js +2 -2
  167. package/build/esm/lab/src/TimeField/i18n/da-DK.json.js.map +1 -0
  168. package/build/esm/{TimeField → lab/src/TimeField}/i18n/de-DE.json.js +2 -2
  169. package/build/esm/lab/src/TimeField/i18n/de-DE.json.js.map +1 -0
  170. package/build/esm/{TimeField → lab/src/TimeField}/i18n/en-US.json.js +2 -2
  171. package/build/esm/lab/src/TimeField/i18n/en-US.json.js.map +1 -0
  172. package/build/esm/{TimeField → lab/src/TimeField}/i18n/fi-FI.json.js +2 -2
  173. package/build/esm/lab/src/TimeField/i18n/fi-FI.json.js.map +1 -0
  174. package/build/esm/lab/src/TimeField/i18n/index.js.map +1 -0
  175. package/build/esm/{TimeField → lab/src/TimeField}/i18n/nb-NO.json.js +2 -2
  176. package/build/esm/lab/src/TimeField/i18n/nb-NO.json.js.map +1 -0
  177. package/build/esm/{TimeField → lab/src/TimeField}/i18n/pl-PL.json.js +2 -2
  178. package/build/esm/lab/src/TimeField/i18n/pl-PL.json.js.map +1 -0
  179. package/build/esm/{TimeField → lab/src/TimeField}/i18n/sv-SE.json.js +2 -2
  180. package/build/esm/lab/src/TimeField/i18n/sv-SE.json.js.map +1 -0
  181. package/build/esm/lab/src/TimeField/src/TimeField.js.map +1 -0
  182. package/build/esm/lab/src/TimeField/src/TimeFieldSegment.js.map +1 -0
  183. package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js +46 -0
  184. package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js.map +1 -0
  185. package/build/index.d.ts +553 -10
  186. package/package.json +8 -8
  187. package/build/esm/Accordion/index.js.map +0 -1
  188. package/build/esm/Accordion/src/Accordion.js.map +0 -1
  189. package/build/esm/Accordion/src/AccordionContext.js.map +0 -1
  190. package/build/esm/Accordion/src/AccordionHeading.js.map +0 -1
  191. package/build/esm/Accordion/src/AccordionItem.js.map +0 -1
  192. package/build/esm/Accordion/src/AccordionPanel.js.map +0 -1
  193. package/build/esm/Accordion/src/utils.js.map +0 -1
  194. package/build/esm/Alert/src/Alert.js.map +0 -1
  195. package/build/esm/Amount/src/Amount.js.map +0 -1
  196. package/build/esm/Amount/src/useGroupAmount.js.map +0 -1
  197. package/build/esm/Autocomplete/i18n/index.js.map +0 -1
  198. package/build/esm/Autocomplete/src/Autocomplete.js.map +0 -1
  199. package/build/esm/Breadcrumbs/src/BreadcrumbItem.js.map +0 -1
  200. package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js.map +0 -1
  201. package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +0 -1
  202. package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +0 -1
  203. package/build/esm/Breadcrumbs/src/Breadcrumbs.js.map +0 -1
  204. package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js.map +0 -1
  205. package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js.map +0 -1
  206. package/build/esm/FileDropzone/i18n/index.js.map +0 -1
  207. package/build/esm/FileDropzone/src/FileDropzone.js.map +0 -1
  208. package/build/esm/FileDropzone/src/FileTrigger.js.map +0 -1
  209. package/build/esm/FileDropzone/src/utils.js.map +0 -1
  210. package/build/esm/Filtering/src/FilterDropdown.js.map +0 -1
  211. package/build/esm/Filtering/src/SearchableSelectFilter.js.map +0 -1
  212. package/build/esm/Flag/src/Flag.js.map +0 -1
  213. package/build/esm/LabeledValue/src/LabeledValue.js.map +0 -1
  214. package/build/esm/NumberField/i18n/index.js.map +0 -1
  215. package/build/esm/NumberField/src/NumberField.js.map +0 -1
  216. package/build/esm/NumberField/src/StepperButton.js.map +0 -1
  217. package/build/esm/NumberField/src/cursorHelpers.js.map +0 -1
  218. package/build/esm/NumberField/src/formatHelpers.js.map +0 -1
  219. package/build/esm/NumberField/src/keyboardHelpers.js.map +0 -1
  220. package/build/esm/NumberField/src/useAutofillStyle.js.map +0 -1
  221. package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +0 -1
  222. package/build/esm/NumberField/src/useSapphireNumberField.js.map +0 -1
  223. package/build/esm/ProgressIndicator/src/ProgressIndicator.js.map +0 -1
  224. package/build/esm/Sidebar/index.js.map +0 -1
  225. package/build/esm/Sidebar/src/Body.js.map +0 -1
  226. package/build/esm/Sidebar/src/ExpandableItem.js.map +0 -1
  227. package/build/esm/Sidebar/src/Header.js.map +0 -1
  228. package/build/esm/Sidebar/src/Item.js.map +0 -1
  229. package/build/esm/Sidebar/src/List.js.map +0 -1
  230. package/build/esm/Sidebar/src/Panel.js.map +0 -1
  231. package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +0 -1
  232. package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +0 -1
  233. package/build/esm/Sidebar/src/Section.js.map +0 -1
  234. package/build/esm/Sidebar/src/Sidebar.js.map +0 -1
  235. package/build/esm/Sidebar/src/useSidebar.js.map +0 -1
  236. package/build/esm/Slider/index.js.map +0 -1
  237. package/build/esm/Slider/src/Slider.js.map +0 -1
  238. package/build/esm/TagGroup/src/Tag.js.map +0 -1
  239. package/build/esm/TagGroup/src/TagGroup.js.map +0 -1
  240. package/build/esm/TagGroup/src/TagItem.js.map +0 -1
  241. package/build/esm/TimeField/i18n/index.js.map +0 -1
  242. package/build/esm/TimeField/src/TimeField.js.map +0 -1
  243. package/build/esm/TimeField/src/TimeFieldSegment.js.map +0 -1
  244. /package/build/esm/{TimeField → core/src/ListBox}/i18n/da-DK.json.js.map +0 -0
  245. /package/build/esm/{TimeField → core/src/ListBox}/i18n/de-DE.json.js.map +0 -0
  246. /package/build/esm/{TimeField → core/src/ListBox}/i18n/en-US.json.js.map +0 -0
  247. /package/build/esm/{TimeField → core/src/ListBox}/i18n/fi-FI.json.js.map +0 -0
  248. /package/build/esm/{TimeField → core/src/ListBox}/i18n/index.js +0 -0
  249. /package/build/esm/{TimeField → core/src/ListBox}/i18n/nb-NO.json.js.map +0 -0
  250. /package/build/esm/{TimeField → core/src/ListBox}/i18n/pl-PL.json.js.map +0 -0
  251. /package/build/esm/{TimeField → core/src/ListBox}/i18n/sv-SE.json.js.map +0 -0
  252. /package/build/esm/{Accordion → lab/src/Accordion}/index.js +0 -0
  253. /package/build/esm/{Accordion → lab/src/Accordion}/src/Accordion.js +0 -0
  254. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionContext.js +0 -0
  255. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionHeading.js +0 -0
  256. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionItem.js +0 -0
  257. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionPanel.js +0 -0
  258. /package/build/esm/{Accordion → lab/src/Accordion}/src/utils.js +0 -0
  259. /package/build/esm/{Alert → lab/src/Alert}/src/Alert.js +0 -0
  260. /package/build/esm/{Amount → lab/src/Amount}/src/Amount.js +0 -0
  261. /package/build/esm/{Amount → lab/src/Amount}/src/useGroupAmount.js +0 -0
  262. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js.map +0 -0
  263. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js.map +0 -0
  264. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js.map +0 -0
  265. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js.map +0 -0
  266. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js.map +0 -0
  267. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js.map +0 -0
  268. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js.map +0 -0
  269. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/src/Autocomplete.js +0 -0
  270. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItem.js +0 -0
  271. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemLink.js +0 -0
  272. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemStatic.js +0 -0
  273. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbOverflowMenu.js +0 -0
  274. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/Breadcrumbs.js +0 -0
  275. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbsSeparator.js +0 -0
  276. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/useBreadcrumbThreshold.js +0 -0
  277. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js.map +0 -0
  278. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js.map +0 -0
  279. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js.map +0 -0
  280. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js.map +0 -0
  281. /package/build/esm/{Autocomplete → lab/src/FileDropzone}/i18n/index.js +0 -0
  282. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js.map +0 -0
  283. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js.map +0 -0
  284. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js.map +0 -0
  285. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileDropzone.js +0 -0
  286. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileTrigger.js +0 -0
  287. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/utils.js +0 -0
  288. /package/build/esm/{Filtering → lab/src/Filtering}/src/FilterDropdown.js +0 -0
  289. /package/build/esm/{Flag → lab/src/Flag}/src/Flag.js +0 -0
  290. /package/build/esm/{LabeledValue → lab/src/LabeledValue}/src/LabeledValue.js +0 -0
  291. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js.map +0 -0
  292. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js.map +0 -0
  293. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js.map +0 -0
  294. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js.map +0 -0
  295. /package/build/esm/{FileDropzone → lab/src/NumberField}/i18n/index.js +0 -0
  296. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js.map +0 -0
  297. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js.map +0 -0
  298. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js.map +0 -0
  299. /package/build/esm/{NumberField → lab/src/NumberField}/src/NumberField.js +0 -0
  300. /package/build/esm/{NumberField → lab/src/NumberField}/src/StepperButton.js +0 -0
  301. /package/build/esm/{NumberField → lab/src/NumberField}/src/cursorHelpers.js +0 -0
  302. /package/build/esm/{NumberField → lab/src/NumberField}/src/formatHelpers.js +0 -0
  303. /package/build/esm/{NumberField → lab/src/NumberField}/src/keyboardHelpers.js +0 -0
  304. /package/build/esm/{NumberField → lab/src/NumberField}/src/useAutofillStyle.js +0 -0
  305. /package/build/esm/{NumberField → lab/src/NumberField}/src/useNumberFieldFormatting.js +0 -0
  306. /package/build/esm/{NumberField → lab/src/NumberField}/src/useSapphireNumberField.js +0 -0
  307. /package/build/esm/{ProgressIndicator → lab/src/ProgressIndicator}/src/ProgressIndicator.js +0 -0
  308. /package/build/esm/{Sidebar → lab/src/Sidebar}/index.js +0 -0
  309. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Body.js +0 -0
  310. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ExpandableItem.js +0 -0
  311. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Header.js +0 -0
  312. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Item.js +0 -0
  313. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/List.js +0 -0
  314. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Panel.js +0 -0
  315. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ResponsiveSidebarContext.js +0 -0
  316. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/SecondarySidebarContext.js +0 -0
  317. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Section.js +0 -0
  318. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Sidebar.js +0 -0
  319. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/useSidebar.js +0 -0
  320. /package/build/esm/{Slider → lab/src/Slider}/index.js +0 -0
  321. /package/build/esm/{Slider → lab/src/Slider}/src/Slider.js +0 -0
  322. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/Tag.js +0 -0
  323. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagGroup.js +0 -0
  324. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagItem.js +0 -0
  325. /package/build/esm/{NumberField → lab/src/TimeField}/i18n/index.js +0 -0
  326. /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeField.js +0 -0
  327. /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeFieldSegment.js +0 -0
@@ -0,0 +1,60 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { flexStylePropsHandler } from '../../Flex/src/Flex.js';
3
+ import { gridStylePropsHandler } from '../../Grid/src/Grid.js';
4
+ import { useSapphireStyleProps } from '../../utils/useSapphireStyleProps.js';
5
+ import '../../utils/useSapphireTextStyleProps.js';
6
+ import { commonStyleHandlers } from '../../utils/SapphireStyleProps.js';
7
+ import '../../ListBox/src/StatelessListBox.js';
8
+ import '../../Popover/src/Popover.js';
9
+ import { useThemeCheck } from '../../utils/useThemeCheck.js';
10
+ import 'react-aria/mergeProps';
11
+ import 'react-aria/useButton';
12
+
13
+ const viewStylePropHandlers = {
14
+ ...commonStyleHandlers,
15
+ ...flexStylePropsHandler,
16
+ ...gridStylePropsHandler,
17
+ display: "display",
18
+ color: "color",
19
+ backgroundColor: "backgroundColor",
20
+ border: "border",
21
+ borderWidth: "borderWidth",
22
+ borderColor: "borderColor",
23
+ borderStyle: "borderStyle",
24
+ borderLeft: "borderLeft",
25
+ borderLeftWidth: "borderLeftWidth",
26
+ borderLeftColor: "borderLeftColor",
27
+ borderLeftStyle: "borderLeftStyle",
28
+ borderRight: "borderRight",
29
+ borderRightWidth: "borderRightWidth",
30
+ borderRightColor: "borderRightColor",
31
+ borderRightStyle: "borderRightStyle",
32
+ borderTop: "borderTop",
33
+ borderTopWidth: "borderTopWidth",
34
+ borderTopColor: "borderTopColor",
35
+ borderTopStyle: "borderTopStyle",
36
+ borderBottom: "borderBottom",
37
+ borderBottomWidth: "borderBottomWidth",
38
+ borderBottomColor: "borderBottomColor",
39
+ borderBottomStyle: "borderBottomStyle",
40
+ borderRadius: "borderRadius",
41
+ borderTopLeftRadius: "borderTopLeftRadius",
42
+ borderTopRightRadius: "borderTopRightRadius",
43
+ borderBottomLeftRadius: "borderBottomLeftRadius",
44
+ borderBottomRightRadius: "borderBottomRightRadius",
45
+ boxShadow: "boxShadow",
46
+ container: "container",
47
+ containerType: "containerType",
48
+ containerName: "containerName",
49
+ overflow: "overflow",
50
+ overflowX: "overflowX",
51
+ overflowY: "overflowY"
52
+ };
53
+ forwardRef(function View2({ elementType: ElementType = "div", children, ...otherProps }, ref) {
54
+ useThemeCheck();
55
+ const { styleProps, filteredProps } = useSapphireStyleProps(otherProps, viewStylePropHandlers);
56
+ return /* @__PURE__ */ React.createElement(ElementType, { ...filteredProps, ...styleProps, ref }, children);
57
+ });
58
+
59
+ export { viewStylePropHandlers };
60
+ //# sourceMappingURL=View.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.js","sources":["../../../../../../../core/src/View/src/View.tsx"],"sourcesContent":["import React, {\n ForwardedRef,\n forwardRef,\n JSXElementConstructor,\n ReactNode,\n} from 'react';\nimport { DOMProps, DOMAttributes } from '@react-types/shared';\n\nimport { FlexStyleProps, flexStylePropsHandler } from '../../Flex/src/Flex';\nimport { GridStyleProps, gridStylePropsHandler } from '../../Grid/src/Grid';\nimport {\n commonStyleHandlers,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n SapphireStyleProps,\n StyleHandlers,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\n\nexport interface ViewProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n SapphireViewStyleProps,\n DOMProps,\n Omit<\n DOMAttributes,\n 'children' | 'style' | 'className' | 'dangerouslySetInnerHTML'\n > {\n /**\n * The element to render as the node.\n * @default: 'div'\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n elementType?: string | JSXElementConstructor<any>;\n /**\n * Children to be displayed in the View.\n */\n children?: ReactNode;\n}\n\nexport interface SapphireViewStyleProps\n extends SapphireCommonStyleProps,\n FlexStyleProps,\n GridStyleProps {\n display?: ResponsiveCssProp<'display'>;\n\n backgroundColor?: ResponsiveCssProp<'backgroundColor', 'color'>;\n color?: ResponsiveCssProp<'color', 'color'>;\n\n border?: ResponsiveCssProp<'border'>;\n borderWidth?: ResponsiveCssProp<'borderWidth', 'size'>;\n borderColor?: ResponsiveCssProp<'borderColor', 'color'>;\n borderStyle?: ResponsiveCssProp<'borderColor'>;\n borderLeft?: ResponsiveCssProp<'borderLeft'>;\n borderLeftColor?: ResponsiveCssProp<'borderLeftColor', 'color'>;\n borderLeftWidth?: ResponsiveCssProp<'borderLeftWidth', 'size'>;\n borderLeftStyle?: ResponsiveCssProp<'borderLeftStyle'>;\n borderRight?: ResponsiveCssProp<'borderRight'>;\n borderRightColor?: ResponsiveCssProp<'borderRightColor', 'color'>;\n borderRightWidth?: ResponsiveCssProp<'borderRightWidth', 'size'>;\n borderRightStyle?: ResponsiveCssProp<'borderRightStyle'>;\n borderTop?: ResponsiveCssProp<'borderTop'>;\n borderTopColor?: ResponsiveCssProp<'borderTopColor', 'color'>;\n borderTopWidth?: ResponsiveCssProp<'borderTopWidth', 'size'>;\n borderTopStyle?: ResponsiveCssProp<'borderTopStyle'>;\n borderBottom?: ResponsiveCssProp<'borderBottom'>;\n borderBottomColor?: ResponsiveCssProp<'borderBottomColor', 'color'>;\n borderBottomWidth?: ResponsiveCssProp<'borderBottomWidth', 'size'>;\n borderBottomStyle?: ResponsiveCssProp<'borderBottomStyle'>;\n borderRadius?: ResponsiveCssProp<'borderRadius', 'size'>;\n borderTopLeftRadius?: ResponsiveCssProp<'borderTopLeftRadius', 'size'>;\n borderTopRightRadius?: ResponsiveCssProp<'borderTopRightRadius', 'size'>;\n borderBottomLeftRadius?: ResponsiveCssProp<'borderBottomLeftRadius', 'size'>;\n borderBottomRightRadius?: ResponsiveCssProp<\n 'borderBottomRightRadius',\n 'size'\n >;\n\n boxShadow?: ResponsiveCssProp<'boxShadow', 'shadow'>;\n\n container?: ResponsiveCssProp<'container'>;\n containerType?: ResponsiveCssProp<'containerType'>;\n containerName?: ResponsiveCssProp<'containerName'>;\n\n overflow?: ResponsiveCssProp<'overflow'>;\n overflowX?: ResponsiveCssProp<'overflowX'>;\n overflowY?: ResponsiveCssProp<'overflowY'>;\n}\nexport const viewStylePropHandlers: StyleHandlers<SapphireViewStyleProps> = {\n ...commonStyleHandlers,\n ...flexStylePropsHandler,\n ...gridStylePropsHandler,\n display: 'display',\n color: 'color',\n backgroundColor: 'backgroundColor',\n border: 'border',\n borderWidth: 'borderWidth',\n borderColor: 'borderColor',\n borderStyle: 'borderStyle',\n borderLeft: 'borderLeft',\n borderLeftWidth: 'borderLeftWidth',\n borderLeftColor: 'borderLeftColor',\n borderLeftStyle: 'borderLeftStyle',\n borderRight: 'borderRight',\n borderRightWidth: 'borderRightWidth',\n borderRightColor: 'borderRightColor',\n borderRightStyle: 'borderRightStyle',\n borderTop: 'borderTop',\n borderTopWidth: 'borderTopWidth',\n borderTopColor: 'borderTopColor',\n borderTopStyle: 'borderTopStyle',\n borderBottom: 'borderBottom',\n borderBottomWidth: 'borderBottomWidth',\n borderBottomColor: 'borderBottomColor',\n borderBottomStyle: 'borderBottomStyle',\n borderRadius: 'borderRadius',\n borderTopLeftRadius: 'borderTopLeftRadius',\n borderTopRightRadius: 'borderTopRightRadius',\n borderBottomLeftRadius: 'borderBottomLeftRadius',\n borderBottomRightRadius: 'borderBottomRightRadius',\n boxShadow: 'boxShadow',\n container: 'container',\n containerType: 'containerType',\n containerName: 'containerName',\n overflow: 'overflow',\n overflowX: 'overflowX',\n overflowY: 'overflowY',\n};\n\nexport const View = forwardRef(function View(\n { elementType: ElementType = 'div', children, ...otherProps }: ViewProps,\n ref: ForwardedRef<HTMLElement>\n) {\n useThemeCheck();\n\n const { styleProps, filteredProps } = useSapphireStyleProps<\n ViewProps,\n SapphireViewStyleProps\n >(otherProps, viewStylePropHandlers);\n\n return (\n <ElementType {...filteredProps} {...styleProps} ref={ref}>\n {children}\n </ElementType>\n );\n});\n"],"names":["View"],"mappings":";;;;;;;;;;;;AA0FO,MAAM,qBAAA,GAA+D;AAAA,EAC1E,GAAG,mBAAA;AAAA,EACH,GAAG,qBAAA;AAAA,EACH,GAAG,qBAAA;AAAA,EACH,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,eAAA,EAAiB,iBAAA;AAAA,EACjB,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA,EACZ,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,WAAA,EAAa,aAAA;AAAA,EACb,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe,eAAA;AAAA,EACf,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW;AACb;AAEoB,UAAA,CAAW,SAASA,KAAAA,CACtC,EAAE,WAAA,EAAa,WAAA,GAAc,KAAA,EAAO,QAAA,EAAU,GAAG,UAAA,EAAW,EAC5D,GAAA,EACA;AACA,EAAA,aAAA,EAAc;AAEd,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,qBAAA,CAGpC,YAAY,qBAAqB,CAAA;AAEnC,EAAA,2CACG,WAAA,EAAA,EAAa,GAAG,eAAgB,GAAG,UAAA,EAAY,OAC7C,QACH,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,48 @@
1
+ const isHiddenHandler = {
2
+ styleProp: "display",
3
+ convertValue: (value) => value ? "none" : void 0
4
+ };
5
+ const commonStyleHandlers = {
6
+ margin: "margin",
7
+ marginLeft: "marginLeft",
8
+ marginRight: "marginRight",
9
+ marginTop: "marginTop",
10
+ marginBottom: "marginBottom",
11
+ marginX: {
12
+ styleProps: ["marginLeft", "marginRight"]
13
+ },
14
+ marginY: {
15
+ styleProps: ["marginTop", "marginBottom"]
16
+ },
17
+ width: "width",
18
+ height: "height",
19
+ minWidth: "minWidth",
20
+ minHeight: "minHeight",
21
+ maxWidth: "maxWidth",
22
+ maxHeight: "maxHeight",
23
+ flex: "flex",
24
+ flexGrow: "flexGrow",
25
+ flexShrink: "flexShrink",
26
+ flexBasis: "flexBasis",
27
+ justifySelf: "justifySelf",
28
+ alignSelf: "alignSelf",
29
+ order: "order",
30
+ gridArea: "gridArea",
31
+ gridColumn: "gridColumn",
32
+ gridColumnEnd: "gridColumnEnd",
33
+ gridColumnStart: "gridColumnStart",
34
+ gridRow: "gridRow",
35
+ gridRowEnd: "gridRowEnd",
36
+ gridRowStart: "gridRowStart",
37
+ position: "position",
38
+ zIndex: "zIndex",
39
+ top: "top",
40
+ bottom: "bottom",
41
+ left: "left",
42
+ right: "right",
43
+ inset: "inset",
44
+ isHidden: isHiddenHandler
45
+ };
46
+
47
+ export { commonStyleHandlers };
48
+ //# sourceMappingURL=SapphireStyleProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SapphireStyleProps.js","sources":["../../../../../../core/src/utils/SapphireStyleProps.ts"],"sourcesContent":["import { CSSProperties } from 'react';\nimport { tokens } from '../SapphireProvider';\nimport { type BreakpointKey } from './useBreakpointTokens';\n\nexport type BaseResponsiveProp<T> =\n /**\n * Support design-token breakpoint values for both media queries and container queries.\n */\n { [key in BreakpointKey]?: T } & {\n /**\n * Used when the resolved width is less than all breakpoints. Or if breakpoint\n * detection is not possible for any reason (like being run in SSR),\n */\n base: T;\n };\n\nexport type ViewportResponsiveProp<T> = BaseResponsiveProp<T> & {\n container?: never;\n [key: number]: never;\n};\n\nexport type ContainerResponsiveProp<T> = BaseResponsiveProp<T> & {\n /**\n * Provide a container name to target a specific container.\n * If set to `true`, the element will target the closest container.\n *\n * When a container name is provided, the string is used as a container query selector, as per\n * the documentation:\n * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_containment/Container_queries#naming_containment_contexts.\n * This functionality requires that a layout element has `containerName` property set to the same\n * value.\n */\n container: true | string;\n /**\n * Container queries support passing a number value as a breakpoint, since some components may\n * not take up the space required to hit the design-tokens breakpoints.\n */\n [key: number]: T;\n};\n\nexport type ResponsiveProp<T> =\n | ViewportResponsiveProp<T>\n | ContainerResponsiveProp<T>;\n\nexport type Responsive<T> = ResponsiveProp<T> | T;\n\n/**\n * Represents either a single value or a set of different values for each breakpoint.\n * In both cases, the type of the value itself comes from a CSS property specified\n * by K and also a design token (a value from `theme`) of type T, if provided.\n * By default, it doesn't allow any theme value.\n */\nexport type ResponsiveCssProp<\n K extends keyof CSSProperties,\n T extends keyof typeof tokens | '' = ''\n> = Responsive<\n | CSSProperties[K]\n | (T extends keyof typeof tokens ? ValueOf<(typeof tokens)[T]> : never)\n>;\n\ntype ValueOf<T> = T[keyof T];\n\nexport interface SapphireCommonStyleProps {\n // Spacing\n margin?: ResponsiveCssProp<'margin', 'size'>;\n marginLeft?: ResponsiveCssProp<'marginLeft', 'size'>;\n marginRight?: ResponsiveCssProp<'marginRight', 'size'>;\n marginTop?: ResponsiveCssProp<'marginTop', 'size'>;\n marginBottom?: ResponsiveCssProp<'marginBottom', 'size'>;\n /**\n * Shorthand for marginLeft and marginRight\n */\n marginX?: ResponsiveCssProp<'marginBottom', 'size'>;\n /**\n * Shorthand for marginTop and marginBottom\n */\n marginY?: ResponsiveCssProp<'marginBottom', 'size'>;\n width?: ResponsiveCssProp<'width', 'size'>;\n height?: ResponsiveCssProp<'height', 'size'>;\n minWidth?: ResponsiveCssProp<'minWidth', 'size'>;\n minHeight?: ResponsiveCssProp<'minHeight', 'size'>;\n maxWidth?: ResponsiveCssProp<'maxWidth', 'size'>;\n maxHeight?: ResponsiveCssProp<'maxHeight', 'size'>;\n\n // Layout\n flex?: ResponsiveCssProp<'flex'>;\n flexGrow?: ResponsiveCssProp<'flexGrow'>;\n flexShrink?: ResponsiveCssProp<'flexShrink'>;\n flexBasis?: ResponsiveCssProp<'flexBasis'>;\n justifySelf?: ResponsiveCssProp<'justifySelf'>;\n alignSelf?: ResponsiveCssProp<'alignSelf'>;\n order?: ResponsiveCssProp<'order'>;\n gridArea?: ResponsiveCssProp<'gridArea'>;\n gridColumn?: ResponsiveCssProp<'gridColumn'>;\n gridRow?: ResponsiveCssProp<'gridRow'>;\n gridColumnStart?: ResponsiveCssProp<'gridColumnStart'>;\n gridColumnEnd?: ResponsiveCssProp<'gridColumnEnd'>;\n gridRowStart?: ResponsiveCssProp<'gridRowStart'>;\n gridRowEnd?: ResponsiveCssProp<'gridRowEnd'>;\n\n // Positioning\n position?: ResponsiveCssProp<'position'>;\n zIndex?: ResponsiveCssProp<'zIndex'>;\n top?: ResponsiveCssProp<'top', 'size'>;\n bottom?: ResponsiveCssProp<'bottom', 'size'>;\n left?: ResponsiveCssProp<'left', 'size'>;\n right?: ResponsiveCssProp<'right', 'size'>;\n inset?: ResponsiveCssProp<'marginBottom', 'size'>;\n\n isHidden?: Responsive<boolean>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type StyleHandler<T extends keyof CSSProperties> =\n | keyof CSSProperties\n | {\n styleProp: T;\n convertValue: (value: any) => CSSProperties[T] | undefined;\n }\n | {\n styleProps: T[];\n };\n\nexport type StyleHandlers<\n T extends {\n [key: string]: ResponsiveCssProp<any, any> | Responsive<any>;\n } = SapphireCommonStyleProps\n> = {\n [key in keyof T]-?: StyleHandler<any>;\n};\n\nconst isHiddenHandler: StyleHandler<'display'> = {\n styleProp: 'display',\n convertValue: (value: boolean) => (value ? 'none' : undefined),\n};\n\nexport const commonStyleHandlers: StyleHandlers = {\n margin: 'margin',\n marginLeft: 'marginLeft',\n marginRight: 'marginRight',\n marginTop: 'marginTop',\n marginBottom: 'marginBottom',\n marginX: {\n styleProps: ['marginLeft', 'marginRight'] as Array<keyof CSSProperties>,\n },\n marginY: {\n styleProps: ['marginTop', 'marginBottom'] as Array<keyof CSSProperties>,\n },\n width: 'width',\n height: 'height',\n minWidth: 'minWidth',\n minHeight: 'minHeight',\n maxWidth: 'maxWidth',\n maxHeight: 'maxHeight',\n flex: 'flex',\n flexGrow: 'flexGrow',\n flexShrink: 'flexShrink',\n flexBasis: 'flexBasis',\n justifySelf: 'justifySelf',\n alignSelf: 'alignSelf',\n order: 'order',\n gridArea: 'gridArea',\n gridColumn: 'gridColumn',\n gridColumnEnd: 'gridColumnEnd',\n gridColumnStart: 'gridColumnStart',\n gridRow: 'gridRow',\n gridRowEnd: 'gridRowEnd',\n gridRowStart: 'gridRowStart',\n position: 'position',\n zIndex: 'zIndex',\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n inset: 'inset',\n\n isHidden: isHiddenHandler,\n};\n"],"names":[],"mappings":"AAmIA,MAAM,eAAA,GAA2C;AAAA,EAC/C,SAAA,EAAW,SAAA;AAAA,EACX,YAAA,EAAc,CAAC,KAAA,KAAoB,KAAA,GAAQ,MAAA,GAAS;AACtD,CAAA;AAEO,MAAM,mBAAA,GAAqC;AAAA,EAChD,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,CAAC,YAAA,EAAc,aAAa;AAAA,GAC1C;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,CAAC,WAAA,EAAa,cAAc;AAAA,GAC1C;AAAA,EACA,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,iBAAA;AAAA,EACjB,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EAEP,QAAA,EAAU;AACZ;;;;"}
@@ -0,0 +1,53 @@
1
+ import { useEffect } from 'react';
2
+
3
+ const useCollectionFocusProxy = ({
4
+ state,
5
+ focusProxyRef,
6
+ collectionRef
7
+ }) => {
8
+ useEffect(
9
+ () => {
10
+ const proxy = focusProxyRef?.current;
11
+ if (proxy) {
12
+ const onKeyDown = (event) => {
13
+ if (event.key === "ArrowUp" || event.key === "ArrowDown") {
14
+ event.preventDefault();
15
+ event.stopPropagation();
16
+ state.selectionManager.setFocused(true);
17
+ collectionRef.current?.dispatchEvent(
18
+ new KeyboardEvent(event.type, event)
19
+ );
20
+ } else if (event.key === "Enter" && state.selectionManager?.focusedKey != null) {
21
+ forwardEventToFocusedItem(event);
22
+ event.preventDefault();
23
+ event.currentTarget?.addEventListener(
24
+ "keyup",
25
+ (event2) => {
26
+ if (event2.key === "Enter" && state.selectionManager.focusedKey != null) {
27
+ forwardEventToFocusedItem(event2);
28
+ }
29
+ },
30
+ { once: true, capture: true }
31
+ );
32
+ }
33
+ function forwardEventToFocusedItem(event2) {
34
+ if (state.selectionManager.focusedKey != null) {
35
+ collectionRef.current?.querySelector(
36
+ `[data-key="${state.selectionManager.focusedKey}"]`
37
+ )?.dispatchEvent(new KeyboardEvent(event2.type, event2));
38
+ }
39
+ }
40
+ };
41
+ proxy.addEventListener("keydown", onKeyDown);
42
+ return () => {
43
+ proxy.removeEventListener("keydown", onKeyDown);
44
+ };
45
+ }
46
+ }
47
+ /* with no dependency here, event listeners are reattached on each render, but that's the case when unmemoized
48
+ event handlers are passed to elements too (e.g., when using any react-aria hook) */
49
+ );
50
+ };
51
+
52
+ export { useCollectionFocusProxy };
53
+ //# sourceMappingURL=useCollectionFocusProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCollectionFocusProxy.js","sources":["../../../../../../core/src/utils/useCollectionFocusProxy.ts"],"sourcesContent":["import { RefObject, useEffect } from 'react';\nimport { SelectionManager } from 'react-stately/private/selection/SelectionManager';\nimport { Collection, Node } from '@react-types/shared';\n\n/**\n * A solution for connecting a collection to a search input so that the collection can still be navigated by keyboard\n * while the input is focused. It works by replaying certain keyboard events on the collection container and focused\n * item. An alternative approach (which is used in react-aria's useCombobox) is to use useSelectableCollection\n * separately for the input, but the biggest issue with that approach is that it's limiting in the following ways:\n * - Rendering input should be a part of the same component that renders the collection. Having specific components\n * for use cases that require a search input is not flexible enough.\n * Also, the input and the collection may need to be in different layouts in some use cases.\n * Decoupling the rendering of the input and collection is a more flexible solution.\n * - The same options used for collection should be passed to the input field for behavior consistency,\n * and that is prone to error.\n * Some of these options, like `keyboardDelegate` can even have a default value in hooks like\n * `useSelectableList`.\n * It means making sure the same value is passed to the useSelectableCollection for input\n * would require not using the default value, since the same value can't be accessed.\n *\n * With this event-forwarding approach, it's an arrow up or down event would behave exactly like it was triggered on\n * the collection itself, leaving no room for behavior discrepancies. But it has a few drawbacks:\n * - Although small, there is still some coupling between this code and implementation of the collection component.\n * More specifically, this implementation assumes the following things:\n * - \"Enter\" keys (selection or action) are handled on items, but arrow keys are handled on the collection element.\n * - \"[data-key] attribute is set on items. That is used to find the element for the focused item (which, of course,\n * is not actually focused while the input is).\n *\n * Note: there has been some addition to react-aria useSelectableCollection and useSelectableItem hooks\n * based on CustomEvent and a similar event reply mechanism in useAutocomplete.\n * It may be possible to replace this hook with built-in functionality in react-aria at some point.\n * But at the moment, it seems like that implementation is too coupled with the autocompletion use case, while\n * what is supported here is more generic and allows for the connected search input use case too.\n */\n\nexport const useCollectionFocusProxy = <T>({\n state,\n focusProxyRef,\n collectionRef,\n}: {\n focusProxyRef: RefObject<HTMLElement> | undefined;\n collectionRef: RefObject<HTMLElement>;\n state: {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>;\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager;\n };\n}): void => {\n useEffect(\n () => {\n const proxy = focusProxyRef?.current;\n if (proxy) {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n event.preventDefault();\n event.stopPropagation();\n\n state.selectionManager.setFocused(true);\n collectionRef.current?.dispatchEvent(\n new KeyboardEvent(event.type, event)\n );\n } else if (\n event.key === 'Enter' &&\n state.selectionManager?.focusedKey != null\n ) {\n forwardEventToFocusedItem(event);\n event.preventDefault(); // in forms, pressing Enter on input submits the form\n (event.currentTarget as HTMLElement)?.addEventListener(\n 'keyup',\n (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' &&\n state.selectionManager.focusedKey != null\n ) {\n // onEnter?.(state.selectionManager.focusedKey);\n forwardEventToFocusedItem(event);\n }\n },\n { once: true, capture: true }\n );\n }\n function forwardEventToFocusedItem(event: KeyboardEvent) {\n if (state.selectionManager.focusedKey != null) {\n collectionRef.current\n ?.querySelector(\n `[data-key=\"${state.selectionManager.focusedKey}\"]`\n )\n ?.dispatchEvent(new KeyboardEvent(event.type, event));\n }\n }\n };\n proxy.addEventListener('keydown', onKeyDown);\n return () => {\n proxy.removeEventListener('keydown', onKeyDown);\n };\n }\n } /* with no dependency here, event listeners are reattached on each render, but that's the case when unmemoized\n event handlers are passed to elements too (e.g., when using any react-aria hook) */\n );\n};\n"],"names":["event"],"mappings":";;AAmCO,MAAM,0BAA0B,CAAI;AAAA,EACzC,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KASY;AACV,EAAA,SAAA;AAAA,IACE,MAAM;AACJ,MAAA,MAAM,QAAQ,aAAA,EAAe,OAAA;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,UAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,SAAA,IAAa,KAAA,CAAM,QAAQ,WAAA,EAAa;AACxD,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,KAAA,CAAM,eAAA,EAAgB;AAEtB,YAAA,KAAA,CAAM,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACtC,YAAA,aAAA,CAAc,OAAA,EAAS,aAAA;AAAA,cACrB,IAAI,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,KAAK;AAAA,aACrC;AAAA,UACF,WACE,KAAA,CAAM,GAAA,KAAQ,WACd,KAAA,CAAM,gBAAA,EAAkB,cAAc,IAAA,EACtC;AACA,YAAA,yBAAA,CAA0B,KAAK,CAAA;AAC/B,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAC,MAAM,aAAA,EAA+B,gBAAA;AAAA,cACpC,OAAA;AAAA,cACA,CAACA,MAAAA,KAAyB;AACxB,gBAAA,IACEA,OAAM,GAAA,KAAQ,OAAA,IACd,KAAA,CAAM,gBAAA,CAAiB,cAAc,IAAA,EACrC;AAEA,kBAAA,yBAAA,CAA0BA,MAAK,CAAA;AAAA,gBACjC;AAAA,cACF,CAAA;AAAA,cACA,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK,aAC9B;AAAA,UACF;AACA,UAAA,SAAS,0BAA0BA,MAAAA,EAAsB;AACvD,YAAA,IAAI,KAAA,CAAM,gBAAA,CAAiB,UAAA,IAAc,IAAA,EAAM;AAC7C,cAAA,aAAA,CAAc,OAAA,EACV,aAAA;AAAA,gBACA,CAAA,WAAA,EAAc,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA,EAAA;AAAA,iBAE/C,aAAA,CAAc,IAAI,cAAcA,MAAAA,CAAM,IAAA,EAAMA,MAAK,CAAC,CAAA;AAAA,YACxD;AAAA,UACF;AAAA,QACF,CAAA;AACA,QAAA,KAAA,CAAM,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC3C,QAAA,OAAO,MAAM;AACX,UAAA,KAAA,CAAM,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,QAChD,CAAA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA,GAEF;AACF;;;;"}
@@ -0,0 +1,16 @@
1
+ import { useEffect } from 'react';
2
+
3
+ const usePreventTouchEnd = (ref) => useEffect(() => {
4
+ ref.current?.addEventListener(
5
+ "touchend",
6
+ (e) => {
7
+ if (e.currentTarget?.getAttribute("type") !== "submit" && typeof e.currentTarget?.getAttribute("href") !== "string") {
8
+ e.preventDefault();
9
+ }
10
+ },
11
+ { passive: false }
12
+ );
13
+ }, []);
14
+
15
+ export { usePreventTouchEnd };
16
+ //# sourceMappingURL=usePreventTouchEnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePreventTouchEnd.js","sources":["../../../../../../core/src/utils/usePreventTouchEnd.ts"],"sourcesContent":["import { RefObject, useEffect } from 'react';\n\n/**\n * Used to fix a react-aria issue on touch devices.\n * https://github.com/adobe/react-spectrum/issues/1513\n */\nexport const usePreventTouchEnd = (ref: RefObject<Element | null>): void =>\n useEffect(() => {\n ref.current?.addEventListener(\n 'touchend',\n (e) => {\n /**\n * The first condition is necessary to avoid the issue that a button with\n * type=\"submit\" inside a <form> would not trigger the form submit\n * event on a device with touch input.\n *\n * The second condition is needed for thse buttons that are links\n * underneath and will have a href. If \"touchend\" is prevented, links\n * won't open by touch.\n *\n * Admittedly, this is an ugly patch, but given the react-spectrum\n * issue it seems necessary. If this hook grows any larger after\n * further bug reports and edge cases, we may want to reconsider\n * this approach.\n */\n if (\n (e.currentTarget as HTMLElement)?.getAttribute('type') !== 'submit' &&\n typeof (e.currentTarget as HTMLElement)?.getAttribute('href') !==\n 'string'\n ) {\n e.preventDefault();\n }\n },\n { passive: false }\n );\n }, []);\n"],"names":[],"mappings":";;AAMO,MAAM,kBAAA,GAAqB,CAAC,GAAA,KACjC,SAAA,CAAU,MAAM;AACd,EAAA,GAAA,CAAI,OAAA,EAAS,gBAAA;AAAA,IACX,UAAA;AAAA,IACA,CAAC,CAAA,KAAM;AAeL,MAAA,IACG,CAAA,CAAE,aAAA,EAA+B,YAAA,CAAa,MAAM,CAAA,KAAM,QAAA,IAC3D,OAAQ,CAAA,CAAE,aAAA,EAA+B,YAAA,CAAa,MAAM,CAAA,KAC1D,QAAA,EACF;AACA,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,EAAE,SAAS,KAAA;AAAM,GACnB;AACF,CAAA,EAAG,EAAE;;;;"}
@@ -0,0 +1,179 @@
1
+ import { useCallback, useEffect } from 'react';
2
+ import { commonStyleHandlers } from './SapphireStyleProps.js';
3
+ import '@danske/sapphire-react-context';
4
+ import { useBreakpointContext } from '../BreakpointProvider/useBreakpointContext.js';
5
+ import { useId } from 'react-aria/useId';
6
+ import clsx from 'clsx';
7
+
8
+ const isSapphireToken = (obj) => "value" in obj;
9
+ const resolveResponsiveValue = (matchedBreakpoints, value) => {
10
+ if (value && typeof value === "object") {
11
+ if (isSapphireToken(value)) {
12
+ return value.value;
13
+ }
14
+ for (const breakpoint of matchedBreakpoints) {
15
+ if (breakpoint === "base") {
16
+ continue;
17
+ }
18
+ const breakpointValue = value[breakpoint];
19
+ if (breakpointValue != null) {
20
+ if (typeof breakpointValue === "object" && isSapphireToken(breakpointValue)) {
21
+ return breakpointValue.value;
22
+ }
23
+ return breakpointValue;
24
+ }
25
+ }
26
+ const baseValue = value.base;
27
+ if (baseValue != null) {
28
+ if (typeof baseValue === "object" && isSapphireToken(baseValue)) {
29
+ return baseValue.value;
30
+ }
31
+ return baseValue;
32
+ }
33
+ }
34
+ return value;
35
+ };
36
+ const useResolveResponsiveValue = () => {
37
+ const breakpointContext = useBreakpointContext();
38
+ const matchedBreakpoints = breakpointContext?.matchedBreakpoints || ["base"];
39
+ return (value) => resolveResponsiveValue(matchedBreakpoints, value);
40
+ };
41
+ const generateRulePart = (containerBreakpointValue, className, key, breakpointResponsiveValue, container) => {
42
+ const kebabCaseKey = key.replace(
43
+ /[A-Z]/g,
44
+ (match) => `-${match.toLowerCase()}`
45
+ );
46
+ const value = breakpointResponsiveValue && typeof breakpointResponsiveValue === "object" && isSapphireToken(breakpointResponsiveValue) ? breakpointResponsiveValue.value : breakpointResponsiveValue;
47
+ return `
48
+ @container ${typeof container === "string" ? container : ""} (min-width: ${containerBreakpointValue}px) {
49
+ .${className} {
50
+ ${kebabCaseKey}: ${value};
51
+ }
52
+ }`;
53
+ };
54
+ const useContainerStyleProps = (props, handlers) => {
55
+ const uniqueId = useId().replace(/:/g, "_");
56
+ const elementClassName = `container-query-${uniqueId}`;
57
+ const breakpointContext = useBreakpointContext();
58
+ let stylesString = "";
59
+ Object.keys(props).forEach((_key) => {
60
+ const key = _key;
61
+ const responsiveValue = props[key];
62
+ if (!responsiveValue || !isContainerResponsiveProp(responsiveValue)) {
63
+ return;
64
+ }
65
+ const breakpoints = [
66
+ 0,
67
+ // `value.base` should be mapped to min-width: 0px and should always be first in the stylesheet.
68
+ ...Object.keys(responsiveValue).filter(
69
+ (breakpointKey) => !["base", "container"].includes(breakpointKey)
70
+ )
71
+ ];
72
+ breakpoints.forEach((breakpointKey) => {
73
+ const isDesignTokenBreakpoint = isNaN(Number(breakpointKey));
74
+ const containerBreakpointValue = isDesignTokenBreakpoint ? (
75
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- we are confident it's a BreakpointKey
76
+ breakpointContext?.breakpoints?.[breakpointKey]
77
+ ) : Number(breakpointKey);
78
+ const value = isDesignTokenBreakpoint ? responsiveValue[breakpointKey] : breakpointKey === 0 ? responsiveValue.base : responsiveValue[containerBreakpointValue];
79
+ Object.entries(
80
+ normalizeHandler(handlers[key], value ?? void 0)
81
+ ).forEach(([styleProp, styleValue]) => {
82
+ stylesString += generateRulePart(
83
+ containerBreakpointValue,
84
+ elementClassName,
85
+ styleProp,
86
+ styleValue,
87
+ responsiveValue.container
88
+ );
89
+ });
90
+ });
91
+ });
92
+ const getOrCreateStylesheet = useCallback(() => {
93
+ const stylesheetElementId = "container-query-stylesheet-" + uniqueId;
94
+ let containerQueryStylesheetElement = document.getElementById(stylesheetElementId);
95
+ if (!containerQueryStylesheetElement) {
96
+ containerQueryStylesheetElement = document.createElement("style");
97
+ containerQueryStylesheetElement.id = stylesheetElementId;
98
+ document.head.appendChild(containerQueryStylesheetElement);
99
+ }
100
+ return containerQueryStylesheetElement;
101
+ }, [uniqueId]);
102
+ useEffect(() => {
103
+ if (!stylesString) {
104
+ return;
105
+ }
106
+ const styleSheet = getOrCreateStylesheet();
107
+ const cssRuleNode = document.createTextNode(stylesString);
108
+ styleSheet.appendChild(cssRuleNode);
109
+ return () => {
110
+ styleSheet.remove();
111
+ };
112
+ }, [stylesString, getOrCreateStylesheet]);
113
+ return {
114
+ containerStylesClassName: stylesString ? elementClassName : ""
115
+ };
116
+ };
117
+ function isContainerResponsiveProp(prop) {
118
+ return prop && typeof prop === "object" && "container" in prop;
119
+ }
120
+ const useSapphireStyleProps = ({ UNSAFE_className, UNSAFE_style, ...props }, handlers = commonStyleHandlers) => {
121
+ const resolveResponsiveValue2 = useResolveResponsiveValue();
122
+ const { containerStylesClassName } = useContainerStyleProps(
123
+ props,
124
+ handlers
125
+ );
126
+ const derivedStyle = {};
127
+ const filteredProps = {};
128
+ Object.keys(props).forEach((key) => {
129
+ if (["style", "className"].includes(key) && typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
130
+ return console.warn(
131
+ "Passing 'style' or 'className' props will have no effect. Please use supported style props directly or use UNSAFE_style or UNSAFE_className if you have no other options than applying style directly to the component."
132
+ );
133
+ }
134
+ const currentProp = props[key];
135
+ const handler = handlers[key];
136
+ if (handler !== void 0 && currentProp !== null) {
137
+ if (!isContainerResponsiveProp(currentProp)) {
138
+ const resolvedResponsiveValue = resolveResponsiveValue2(
139
+ // @ts-expect-error: TS2590: Expression produces a union type that is too complex to represent.
140
+ currentProp
141
+ );
142
+ Object.assign(
143
+ derivedStyle,
144
+ normalizeHandler(handler, resolvedResponsiveValue)
145
+ );
146
+ }
147
+ } else {
148
+ filteredProps[key] = currentProp;
149
+ }
150
+ });
151
+ return {
152
+ styleProps: {
153
+ style: { ...UNSAFE_style, ...derivedStyle },
154
+ className: clsx(UNSAFE_className, containerStylesClassName)
155
+ },
156
+ filteredProps
157
+ };
158
+ };
159
+ function normalizeHandler(handler, value) {
160
+ const result = {};
161
+ if (value == void 0) {
162
+ return result;
163
+ }
164
+ if (typeof handler === "object") {
165
+ if ("convertValue" in handler) {
166
+ value = handler.convertValue(value);
167
+ }
168
+ const styleProps = "styleProps" in handler ? handler.styleProps : [handler.styleProp];
169
+ styleProps.forEach((styleProp) => {
170
+ result[styleProp] = value;
171
+ });
172
+ } else {
173
+ result[handler] = value;
174
+ }
175
+ return result;
176
+ }
177
+
178
+ export { resolveResponsiveValue, useContainerStyleProps, useResolveResponsiveValue, useSapphireStyleProps };
179
+ //# sourceMappingURL=useSapphireStyleProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSapphireStyleProps.js","sources":["../../../../../../core/src/utils/useSapphireStyleProps.ts"],"sourcesContent":["import { CSSProperties, useCallback, useEffect } from 'react';\nimport {\n commonStyleHandlers,\n ContainerResponsiveProp,\n Responsive,\n SapphireCommonStyleProps,\n StyleHandler,\n StyleHandlers,\n} from './SapphireStyleProps';\nimport { type BreakpointKey } from './useBreakpointTokens';\nimport { useBreakpointContext } from '../BreakpointProvider';\nimport { useId } from 'react-aria/useId';\nimport clsx from 'clsx';\n\nconst isSapphireToken = (obj: Record<string, unknown>): obj is SapphireToken =>\n 'value' in obj;\n\nexport const resolveResponsiveValue = <\n T extends string | number | undefined | SapphireToken\n>(\n matchedBreakpoints: BreakpointKey[],\n value?: Responsive<T | SapphireToken>\n): T | string => {\n if (value && typeof value === 'object') {\n // Handle SapphireToken case like `{ value: 'var(--sapphire-semantic-size-width-panel-sm)' }`\n if (isSapphireToken(value)) {\n return (value as SapphireToken).value;\n }\n // `base` is the fallback breakpoint and must not shadow matched breakpoints.\n for (const breakpoint of matchedBreakpoints as Array<\n BreakpointKey | 'base'\n >) {\n if (breakpoint === 'base') {\n continue;\n }\n\n const breakpointValue = value[breakpoint];\n if (breakpointValue != null) {\n // Handle case where a breakpoint has a SapphireToken like `{ sm: { value: 'var(--sapphire-semantic-size-width-panel-sm)' } }`\n if (\n typeof breakpointValue === 'object' &&\n isSapphireToken(breakpointValue)\n ) {\n return breakpointValue.value;\n }\n\n // Handle case where a breakpoint has a 'string' | 'number' | 'undefined' value like `{ sm: '11px' }`\n return breakpointValue as T;\n }\n }\n\n const baseValue = value.base;\n if (baseValue != null) {\n if (typeof baseValue === 'object' && isSapphireToken(baseValue)) {\n return baseValue.value;\n }\n return baseValue as T;\n }\n }\n\n // Handle 'string' | 'number' | 'undefined' case\n return value as T;\n};\n\n// Unsure why an interface makes the typeguard fail - perhaps something that is fixed in later TS versions than 4.9?\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ntype SapphireToken = {\n value: string;\n};\n\nexport const useResolveResponsiveValue = (): (<\n T extends string | number | undefined\n>(\n value?: Responsive<T | SapphireToken>\n) => T | string) => {\n const breakpointContext = useBreakpointContext();\n const matchedBreakpoints =\n (breakpointContext?.matchedBreakpoints as BreakpointKey[]) || ['base'];\n return (value) => resolveResponsiveValue(matchedBreakpoints, value);\n};\n\nconst generateRulePart = <T extends string | number | undefined>(\n containerBreakpointValue: number,\n className: string,\n key: string,\n breakpointResponsiveValue: T | SapphireToken,\n container: true | string\n) => {\n const kebabCaseKey = key.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`\n );\n\n const value =\n breakpointResponsiveValue &&\n typeof breakpointResponsiveValue === 'object' &&\n isSapphireToken(breakpointResponsiveValue)\n ? breakpointResponsiveValue.value\n : breakpointResponsiveValue;\n\n return `\n @container ${\n typeof container === 'string' ? container : ''\n } (min-width: ${containerBreakpointValue}px) {\n .${className} {\n ${kebabCaseKey}: ${value};\n }\n }`;\n};\n\n/**\n * The `useResolveContainerQuery` hook leverages the power of CSS container queries to dynamically\n * generate and apply styles based on the provided responsive values in relation to the specified\n * container.\n *\n * This hook allows collecting the key-value pairs necessary for generating a new stylesheet that\n * will provide the necessary container queries based on the passed values and appends it to the\n * document's head.\n *\n * By using CSS container queries, we avoid emulating the behavior in JavaScript.\n */\nexport const useContainerStyleProps = <T extends SapphireCommonStyleProps>(\n props: Omit<T & SapphireStyleProps, 'UNSAFE_style' | 'UNSAFE_className'>,\n handlers: StyleHandlers<T>\n): {\n containerStylesClassName: string;\n} => {\n const uniqueId = useId().replace(/:/g, '_');\n // There should only be one classname per element\n const elementClassName = `container-query-${uniqueId}`;\n const breakpointContext = useBreakpointContext();\n\n let stylesString = '';\n Object.keys(props).forEach((_key) => {\n const key = _key as Exclude<keyof T, 'UNSAFE_style' | 'UNSAFE_className'>;\n const responsiveValue = props[key];\n if (!responsiveValue || !isContainerResponsiveProp(responsiveValue)) {\n return;\n }\n\n const breakpoints = [\n 0, // `value.base` should be mapped to min-width: 0px and should always be first in the stylesheet.\n ...Object.keys(responsiveValue).filter(\n (breakpointKey) => !['base', 'container'].includes(breakpointKey)\n ),\n ];\n\n breakpoints.forEach((breakpointKey) => {\n // Try resolving the current breakpoint as a number. If it doesn't work, it's for sure a design-token breakpoint.\n const isDesignTokenBreakpoint = isNaN(Number(breakpointKey));\n const containerBreakpointValue = isDesignTokenBreakpoint\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- we are confident it's a BreakpointKey\n breakpointContext?.breakpoints?.[breakpointKey as BreakpointKey]!\n : Number(breakpointKey);\n\n const value = (\n isDesignTokenBreakpoint\n ? responsiveValue[breakpointKey as BreakpointKey]\n : breakpointKey === 0\n ? responsiveValue.base\n : responsiveValue[containerBreakpointValue]\n ) as string | number | undefined | null;\n Object.entries(\n normalizeHandler(handlers[key], value ?? undefined)\n ).forEach(([styleProp, styleValue]) => {\n stylesString += generateRulePart(\n containerBreakpointValue,\n elementClassName,\n styleProp,\n styleValue,\n responsiveValue.container\n );\n });\n });\n });\n\n const getOrCreateStylesheet = useCallback(() => {\n const stylesheetElementId = 'container-query-stylesheet-' + uniqueId;\n let containerQueryStylesheetElement =\n document.getElementById(stylesheetElementId);\n if (!containerQueryStylesheetElement) {\n containerQueryStylesheetElement = document.createElement('style');\n containerQueryStylesheetElement.id = stylesheetElementId;\n document.head.appendChild(containerQueryStylesheetElement);\n }\n return containerQueryStylesheetElement as HTMLStyleElement;\n }, [uniqueId]);\n\n /**\n * Create or update the stylesheet with the generated container query styles.\n *\n * The stylesheet is only created if styles are provided.\n * The stylesheet is removed when the component using the hook is unmounted.\n */\n useEffect(() => {\n if (!stylesString) {\n return;\n }\n\n const styleSheet = getOrCreateStylesheet();\n const cssRuleNode = document.createTextNode(stylesString);\n styleSheet.appendChild(cssRuleNode);\n return () => {\n styleSheet.remove();\n };\n }, [stylesString, getOrCreateStylesheet]);\n\n return {\n containerStylesClassName: stylesString ? elementClassName : '',\n };\n};\n\ninterface RegularStyleProps {\n style?: CSSProperties;\n className?: string;\n}\n\ninterface UnsafeStyleProps {\n UNSAFE_className?: string;\n UNSAFE_style?: CSSProperties;\n}\n\nexport interface SapphireStyleProps\n extends SapphireCommonStyleProps,\n UnsafeStyleProps {}\n\nexport type FilteredProps<P, T> = Omit<\n P,\n keyof (T & RegularStyleProps & UnsafeStyleProps)\n>;\n\nfunction isContainerResponsiveProp<T>(\n prop: any\n): prop is ContainerResponsiveProp<T> {\n return prop && typeof prop === 'object' && 'container' in prop;\n}\n\nexport const useSapphireStyleProps = <\n P extends T,\n T extends SapphireCommonStyleProps = SapphireCommonStyleProps\n>(\n { UNSAFE_className, UNSAFE_style, ...props }: P & SapphireStyleProps,\n handlers: StyleHandlers<T> = commonStyleHandlers as StyleHandlers<T>\n): {\n styleProps: { style: CSSProperties; className?: string };\n filteredProps: FilteredProps<P, T>;\n} => {\n const resolveResponsiveValue = useResolveResponsiveValue();\n const { containerStylesClassName } = useContainerStyleProps<T>(\n props,\n handlers\n );\n const derivedStyle: CSSProperties = {};\n\n const filteredProps = {} as FilteredProps<P, T>;\n\n (Object.keys(props) as Array<keyof typeof props>).forEach((key) => {\n if (\n ['style', 'className'].includes(key as string) &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'development'\n ) {\n // eslint-disable-next-line no-console\n return console.warn(\n \"Passing 'style' or 'className' props will have no effect. Please use supported style props directly or use UNSAFE_style or UNSAFE_className if you have no other options than applying style directly to the component.\"\n );\n }\n\n const currentProp = props[key];\n const handler = handlers[key as keyof T];\n if (handler !== undefined && currentProp !== null) {\n if (!isContainerResponsiveProp<T>(currentProp)) {\n /**\n * If no context is provided, we treat it as a viewport query.\n */\n const resolvedResponsiveValue = resolveResponsiveValue(\n // @ts-expect-error: TS2590: Expression produces a union type that is too complex to represent.\n currentProp as Responsive<SapphireToken | string | number | undefined>\n );\n Object.assign(\n derivedStyle,\n normalizeHandler(handler, resolvedResponsiveValue)\n );\n }\n } else {\n // @ts-expect-error: TS2536: Cannot be used to index type 'Omit<P, keyof T>'.\n // TS is not convinced that we're not working with T at this point. We are.\n filteredProps[key] = currentProp;\n }\n });\n\n return {\n styleProps: {\n style: { ...UNSAFE_style, ...derivedStyle },\n className: clsx(UNSAFE_className, containerStylesClassName),\n },\n filteredProps,\n };\n};\n\nfunction normalizeHandler<T extends keyof CSSProperties>(\n handler: StyleHandler<T>,\n value: string | number | undefined\n): CSSProperties {\n const result: CSSProperties = {};\n if (value == undefined) {\n return result;\n }\n if (typeof handler === 'object') {\n if ('convertValue' in handler) {\n value = handler.convertValue(value);\n }\n const styleProps =\n 'styleProps' in handler ? handler.styleProps : [handler.styleProp];\n styleProps.forEach((styleProp) => {\n (result as Record<string, string | number | undefined>)[\n styleProp as keyof CSSProperties\n ] = value;\n });\n } else {\n (result as Record<string, string | number | undefined>)[\n handler as keyof CSSProperties\n ] = value;\n }\n\n return result;\n}\n"],"names":["resolveResponsiveValue"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { commonStyleHandlers } from './SapphireStyleProps.js';
2
+ import 'react';
3
+ import '@danske/sapphire-react-context';
4
+ import 'react-aria/useId';
5
+ import 'clsx';
6
+
7
+ ({
8
+ ...commonStyleHandlers});
9
+ //# sourceMappingURL=useSapphireTextStyleProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSapphireTextStyleProps.js","sources":["../../../../../../core/src/utils/useSapphireTextStyleProps.ts"],"sourcesContent":["import {\n commonStyleHandlers,\n Responsive,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n StyleHandlers,\n} from './SapphireStyleProps';\nimport { FilteredProps, useSapphireStyleProps } from './useSapphireStyleProps';\n\n/**\n * There are some css properties related to text layout which\n * seem like they should be allowed to be customized, but only\n * in those components which are mean to render text.\n *\n * All the usual text-related properties (eg. font-size,\n * line-height, color etc.) are not allowed because those\n * belong to Sapphire itself.\n *\n * https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Fundamentals#other_properties_worth_looking_at\n */\n\nexport type SapphireTextStyleProps = SapphireCommonStyleProps & {\n textAlign?: ResponsiveCssProp<'textAlign'>;\n textIndent?: ResponsiveCssProp<'textIndent'>;\n textOverflow?: ResponsiveCssProp<'textOverflow'>;\n textAlignLast?: ResponsiveCssProp<'textAlignLast'>;\n textJustify?: ResponsiveCssProp<'textJustify'>;\n overflowWrap?: ResponsiveCssProp<'overflowWrap'>;\n hyphens?: ResponsiveCssProp<'hyphens'>;\n whiteSpace?: ResponsiveCssProp<'whiteSpace'>;\n wordBreak?: ResponsiveCssProp<'wordBreak'>;\n overflow?: ResponsiveCssProp<'overflow'>;\n fontStyle?: Responsive<'normal' | 'italic'>;\n\n /* NOTE:\n *\n * These are the text-layout properties we do not want to support:\n *\n * - line-break: relevant only for asian languages\n * - text-orientation: relevant only for vertical scripts\n * - direction: not relevant. But also it should be defined for the html document itself.\n * - writing-mode: not relevant. But also it should be defined for the html document itself.\n */\n};\n\nexport const sapphireTextStyleHandlers: StyleHandlers<SapphireTextStyleProps> =\n {\n ...commonStyleHandlers,\n textAlign: 'textAlign',\n textIndent: 'textIndent',\n textOverflow: 'textOverflow',\n textAlignLast: 'textAlignLast',\n textJustify: 'textJustify',\n overflowWrap: 'overflowWrap',\n hyphens: 'hyphens',\n whiteSpace: 'whiteSpace',\n wordBreak: 'wordBreak',\n overflow: 'overflow',\n fontStyle: 'fontStyle',\n };\n\nexport const useSapphireTextStyleProps = (\n props: SapphireTextStyleProps\n): {\n styleProps: {\n style: React.CSSProperties;\n className?: string;\n };\n filteredProps: FilteredProps<\n SapphireTextStyleProps,\n SapphireCommonStyleProps\n >;\n} =>\n useSapphireStyleProps<SapphireTextStyleProps>(\n props,\n sapphireTextStyleHandlers\n );\n"],"names":[],"mappings":";;;;;;CA8CE;AAAA,EACE,GAAG,mBAYL"}
@@ -0,0 +1,38 @@
1
+ import { useState, useLayoutEffect, useEffect } from 'react';
2
+
3
+ const useScrollCheck = (ref) => {
4
+ const [isScrollable, setScrollable] = useState(false);
5
+ const [isScrolled, setScrolled] = useState(false);
6
+ const onScroll = () => {
7
+ if (ref.current?.scrollTop === 0) {
8
+ setScrolled(false);
9
+ } else {
10
+ setScrolled(true);
11
+ }
12
+ };
13
+ useLayoutEffect(() => {
14
+ const bodyElement = ref.current;
15
+ const resizeObserver = new ResizeObserver(() => {
16
+ if (bodyElement) {
17
+ setScrollable(bodyElement?.scrollHeight > bodyElement.offsetHeight);
18
+ }
19
+ });
20
+ if (bodyElement) {
21
+ resizeObserver.observe(bodyElement);
22
+ }
23
+ return () => {
24
+ if (bodyElement) {
25
+ resizeObserver.unobserve(bodyElement);
26
+ }
27
+ };
28
+ }, []);
29
+ useEffect(() => {
30
+ if (ref.current) {
31
+ setScrollable(ref.current?.scrollHeight > ref.current.offsetHeight);
32
+ }
33
+ });
34
+ return { isScrollable, isScrolled, scrollCheckProps: { onScroll } };
35
+ };
36
+
37
+ export { useScrollCheck };
38
+ //# sourceMappingURL=useScrollCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollCheck.js","sources":["../../../../../../core/src/utils/useScrollCheck.ts"],"sourcesContent":["import React, { useLayoutEffect, useEffect, useState } from 'react';\n\nexport const useScrollCheck = (\n ref: React.RefObject<HTMLElement>\n): {\n isScrolled: boolean;\n isScrollable: boolean;\n scrollCheckProps: { onScroll: () => void };\n} => {\n const [isScrollable, setScrollable] = useState(false);\n const [isScrolled, setScrolled] = useState(false);\n\n const onScroll = () => {\n if (ref.current?.scrollTop === 0) {\n setScrolled(false);\n } else {\n setScrolled(true);\n }\n };\n\n useLayoutEffect(() => {\n const bodyElement = ref.current;\n /**\n * ResizeObserver is not supported by IE but there is a polyfill for it\n * https://www.npmjs.com/package/resize-observer-polyfill\n * https://github.com/que-etc/resize-observer-polyfill\n * so it is safe to use it, in case we need to support IE as well.\n */\n const resizeObserver = new ResizeObserver(() => {\n if (bodyElement) {\n setScrollable(bodyElement?.scrollHeight > bodyElement.offsetHeight);\n }\n });\n if (bodyElement) {\n resizeObserver.observe(bodyElement);\n }\n return () => {\n if (bodyElement) {\n resizeObserver.unobserve(bodyElement);\n }\n };\n }, []);\n\n useEffect(() => {\n if (ref.current) {\n setScrollable(ref.current?.scrollHeight > ref.current.offsetHeight);\n }\n });\n\n return { isScrollable, isScrolled, scrollCheckProps: { onScroll } };\n};\n"],"names":[],"mappings":";;AAEO,MAAM,cAAA,GAAiB,CAC5B,GAAA,KAKG;AACH,EAAA,MAAM,CAAC,YAAA,EAAc,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,SAAA,KAAc,CAAA,EAAG;AAChC,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,cAAc,GAAA,CAAI,OAAA;AAOxB,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAM;AAC9C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,aAAA,CAAc,WAAA,EAAa,YAAA,GAAe,WAAA,CAAY,YAAY,CAAA;AAAA,MACpE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,QAAQ,WAAW,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,cAAA,CAAe,UAAU,WAAW,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,YAAA,GAAe,GAAA,CAAI,QAAQ,YAAY,CAAA;AAAA,IACpE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,YAAA,EAAc,UAAA,EAAY,gBAAA,EAAkB,EAAE,UAAS,EAAE;AACpE;;;;"}
@@ -0,0 +1,14 @@
1
+ import { useContext } from 'react';
2
+ import { ThemeContext } from '@danske/sapphire-react-context';
3
+
4
+ const useThemeCheck = () => {
5
+ const themeContext = useContext(ThemeContext);
6
+ if (typeof themeContext.theme === void 0) {
7
+ throw new Error(
8
+ "A Sapphire component must be rendered inside a <SapphireProvider>."
9
+ );
10
+ }
11
+ };
12
+
13
+ export { useThemeCheck };
14
+ //# sourceMappingURL=useThemeCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThemeCheck.js","sources":["../../../../../../core/src/utils/useThemeCheck.ts"],"sourcesContent":["import { useContext } from 'react';\nimport { ThemeContext } from '@danske/sapphire-react-context';\n\n/**\n * Checks if Sapphire theme context is provided. Meant to be used only inside Sapphire components.\n * @private\n */\nexport const useThemeCheck = (): void => {\n const themeContext = useContext(ThemeContext);\n if (typeof themeContext.theme === undefined) {\n throw new Error(\n 'A Sapphire component must be rendered inside a <SapphireProvider>.'\n );\n }\n};\n"],"names":[],"mappings":";;;AAOO,MAAM,gBAAgB,MAAY;AACvC,EAAA,MAAM,YAAA,GAAe,WAAW,YAAY,CAAA;AAC5C,EAAA,IAAI,OAAO,YAAA,CAAa,KAAA,KAAU,MAAA,EAAW;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;;;;"}