tempest-react-sdk 0.73.0 → 0.75.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 (246) hide show
  1. package/README.md +6 -4
  2. package/dist/br/BrazilMap.module.cjs.map +1 -1
  3. package/dist/br/BrazilMap.module.js.map +1 -1
  4. package/dist/br/MapMarkers.cjs +1 -1
  5. package/dist/br/MapMarkers.cjs.map +1 -1
  6. package/dist/br/MapMarkers.js +19 -22
  7. package/dist/br/MapMarkers.js.map +1 -1
  8. package/dist/br/MunicipalitySearch.cjs +1 -1
  9. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  10. package/dist/br/MunicipalitySearch.js +66 -48
  11. package/dist/br/MunicipalitySearch.js.map +1 -1
  12. package/dist/br/MunicipalitySearch.module.cjs +1 -1
  13. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  14. package/dist/br/MunicipalitySearch.module.js +4 -3
  15. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  16. package/dist/br.d.ts +12 -0
  17. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  18. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  19. package/dist/components/AIChat/AIChatTurn.cjs +1 -1
  20. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  21. package/dist/components/AIChat/AIChatTurn.js +1 -1
  22. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  23. package/dist/components/AppBar/AppBar.cjs +1 -1
  24. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  25. package/dist/components/AppBar/AppBar.js +1 -0
  26. package/dist/components/AppBar/AppBar.js.map +1 -1
  27. package/dist/components/AppBar/AppBar.module.cjs +1 -1
  28. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  29. package/dist/components/AppBar/AppBar.module.js +12 -11
  30. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  31. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  32. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  33. package/dist/components/Button/Button.cjs +1 -1
  34. package/dist/components/Button/Button.cjs.map +1 -1
  35. package/dist/components/Button/Button.js +41 -36
  36. package/dist/components/Button/Button.js.map +1 -1
  37. package/dist/components/Button/Button.module.cjs.map +1 -1
  38. package/dist/components/Button/Button.module.js.map +1 -1
  39. package/dist/components/Button/ButtonContent.cjs +2 -0
  40. package/dist/components/Button/ButtonContent.cjs.map +1 -0
  41. package/dist/components/Button/ButtonContent.js +34 -0
  42. package/dist/components/Button/ButtonContent.js.map +1 -0
  43. package/dist/components/Button/ButtonSlot.cjs +2 -0
  44. package/dist/components/Button/ButtonSlot.cjs.map +1 -0
  45. package/dist/components/Button/ButtonSlot.js +36 -0
  46. package/dist/components/Button/ButtonSlot.js.map +1 -0
  47. package/dist/components/Button/button-class.cjs +2 -0
  48. package/dist/components/Button/button-class.cjs.map +1 -0
  49. package/dist/components/Button/button-class.js +13 -0
  50. package/dist/components/Button/button-class.js.map +1 -0
  51. package/dist/components/Button/link-rel.cjs +2 -0
  52. package/dist/components/Button/link-rel.cjs.map +1 -0
  53. package/dist/components/Button/link-rel.js +11 -0
  54. package/dist/components/Button/link-rel.js.map +1 -0
  55. package/dist/components/Button/slot.cjs +2 -0
  56. package/dist/components/Button/slot.cjs.map +1 -0
  57. package/dist/components/Button/slot.js +41 -0
  58. package/dist/components/Button/slot.js.map +1 -0
  59. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  60. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  61. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  62. package/dist/components/Chat/Chat.module.js.map +1 -1
  63. package/dist/components/Collapsible/Collapsible.cjs +1 -1
  64. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  65. package/dist/components/Collapsible/Collapsible.js +1 -1
  66. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  67. package/dist/components/Combobox/Combobox.cjs +1 -1
  68. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  69. package/dist/components/Combobox/Combobox.js +18 -23
  70. package/dist/components/Combobox/Combobox.js.map +1 -1
  71. package/dist/components/Combobox/use-listbox-dismiss.cjs +2 -0
  72. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -0
  73. package/dist/components/Combobox/use-listbox-dismiss.js +34 -0
  74. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -0
  75. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  76. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  77. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  78. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  79. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  80. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  81. package/dist/components/Form/Form.cjs.map +1 -1
  82. package/dist/components/Form/Form.js.map +1 -1
  83. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  84. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  85. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  86. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  87. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  88. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  89. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  90. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  91. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  92. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  93. package/dist/components/Modal/Modal.cjs +1 -1
  94. package/dist/components/Modal/Modal.cjs.map +1 -1
  95. package/dist/components/Modal/Modal.js +1 -1
  96. package/dist/components/Modal/Modal.js.map +1 -1
  97. package/dist/components/Modal/Modal.module.cjs +1 -1
  98. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  99. package/dist/components/Modal/Modal.module.js +1 -1
  100. package/dist/components/Modal/Modal.module.js.map +1 -1
  101. package/dist/components/MultiSelect/MultiSelect.cjs +1 -1
  102. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  103. package/dist/components/MultiSelect/MultiSelect.js +55 -54
  104. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  105. package/dist/components/Navbar/Navbar.cjs +1 -1
  106. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  107. package/dist/components/Navbar/Navbar.js +1 -0
  108. package/dist/components/Navbar/Navbar.js.map +1 -1
  109. package/dist/components/Navbar/Navbar.module.cjs +1 -1
  110. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  111. package/dist/components/Navbar/Navbar.module.js +9 -8
  112. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  113. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  114. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  115. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  116. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  117. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  118. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  119. package/dist/components/Page/Page.cjs +1 -1
  120. package/dist/components/Page/Page.cjs.map +1 -1
  121. package/dist/components/Page/Page.js +23 -39
  122. package/dist/components/Page/Page.js.map +1 -1
  123. package/dist/components/Page/Page.module.cjs +1 -1
  124. package/dist/components/Page/Page.module.cjs.map +1 -1
  125. package/dist/components/Page/Page.module.js +5 -11
  126. package/dist/components/Page/Page.module.js.map +1 -1
  127. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  128. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  129. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  130. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  131. package/dist/components/Reveal/Reveal.cjs +2 -0
  132. package/dist/components/Reveal/Reveal.cjs.map +1 -0
  133. package/dist/components/Reveal/Reveal.js +56 -0
  134. package/dist/components/Reveal/Reveal.js.map +1 -0
  135. package/dist/components/Reveal/Reveal.module.cjs +3 -0
  136. package/dist/components/Reveal/Reveal.module.cjs.map +1 -0
  137. package/dist/components/Reveal/Reveal.module.js +7 -0
  138. package/dist/components/Reveal/Reveal.module.js.map +1 -0
  139. package/dist/components/Reveal/reveal-threshold.cjs +2 -0
  140. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -0
  141. package/dist/components/Reveal/reveal-threshold.js +13 -0
  142. package/dist/components/Reveal/reveal-threshold.js.map +1 -0
  143. package/dist/components/SectionHeader/SectionHeader.cjs +2 -0
  144. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -0
  145. package/dist/components/SectionHeader/SectionHeader.js +66 -0
  146. package/dist/components/SectionHeader/SectionHeader.js.map +1 -0
  147. package/dist/components/SectionHeader/SectionHeader.module.cjs +3 -0
  148. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -0
  149. package/dist/components/SectionHeader/SectionHeader.module.js +15 -0
  150. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -0
  151. package/dist/components/Timeline/Timeline.cjs +1 -1
  152. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  153. package/dist/components/Timeline/Timeline.js +22 -15
  154. package/dist/components/Timeline/Timeline.js.map +1 -1
  155. package/dist/components/Timeline/Timeline.module.cjs +1 -1
  156. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  157. package/dist/components/Timeline/Timeline.module.js +1 -1
  158. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  159. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  160. package/dist/components/Tour/Tour.module.js.map +1 -1
  161. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  162. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  163. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  164. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  165. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  166. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  167. package/dist/icons/IconPicker.module.cjs.map +1 -1
  168. package/dist/icons/IconPicker.module.js.map +1 -1
  169. package/dist/styles/Reveal.css +2 -0
  170. package/dist/styles/SectionHeader.css +2 -0
  171. package/dist/styles/actions.css +26 -24
  172. package/dist/styles/base.css +3 -1
  173. package/dist/styles/br.css +3 -3
  174. package/dist/styles/chat.css +5 -5
  175. package/dist/styles/component/AIChat.css +3 -3
  176. package/dist/styles/component/AppBar.css +1 -0
  177. package/dist/styles/component/AppShell.css +1 -1
  178. package/dist/styles/component/BrazilMap.css +2 -2
  179. package/dist/styles/component/Button.css +25 -23
  180. package/dist/styles/component/Carousel.css +3 -3
  181. package/dist/styles/component/Chat.css +2 -2
  182. package/dist/styles/component/Dropzone.css +2 -1
  183. package/dist/styles/component/FilterBar.css +2 -2
  184. package/dist/styles/component/FloatingActionButton.css +1 -1
  185. package/dist/styles/component/IconPicker.css +1 -1
  186. package/dist/styles/component/ImageCropper.css +2 -2
  187. package/dist/styles/component/ListTile.css +1 -1
  188. package/dist/styles/component/Markdown.css +1 -1
  189. package/dist/styles/component/Menubar.css +1 -1
  190. package/dist/styles/component/Modal.css +2 -2
  191. package/dist/styles/component/MunicipalitySearch.css +1 -1
  192. package/dist/styles/component/Navbar.css +1 -0
  193. package/dist/styles/component/NavigationMenu.css +1 -1
  194. package/dist/styles/component/NavigationRail.css +1 -1
  195. package/dist/styles/component/NotificationCenter.css +3 -3
  196. package/dist/styles/component/Page.css +0 -6
  197. package/dist/styles/component/PasswordInput.css +1 -1
  198. package/dist/styles/component/PinInput.css +1 -1
  199. package/dist/styles/component/Reveal.css +9 -0
  200. package/dist/styles/component/SectionHeader.css +9 -0
  201. package/dist/styles/component/Timeline.css +5 -5
  202. package/dist/styles/component/Tour.css +2 -2
  203. package/dist/styles/component/TrajectoryMap.css +1 -1
  204. package/dist/styles/component/Transfer.css +2 -2
  205. package/dist/styles/component/VirtualTable.css +2 -2
  206. package/dist/styles/core.css +3 -1
  207. package/dist/styles/data.css +15 -15
  208. package/dist/styles/feedback.css +3 -3
  209. package/dist/styles/forms.css +6 -5
  210. package/dist/styles/geo.css +1 -1
  211. package/dist/styles/icons.css +1 -1
  212. package/dist/styles/inverse.css +372 -0
  213. package/dist/styles/layout.css +9 -7
  214. package/dist/styles/manifest.json +14 -1
  215. package/dist/styles/navigation.css +8 -6
  216. package/dist/styles/overlay.css +2 -2
  217. package/dist/styles/utility.css +8 -0
  218. package/dist/styles.css +1 -1
  219. package/dist/tempest-react-sdk.cjs +1 -1
  220. package/dist/tempest-react-sdk.d.ts +473 -11
  221. package/dist/tempest-react-sdk.js +350 -346
  222. package/dist/theme/create-theme.cjs +3 -3
  223. package/dist/theme/create-theme.cjs.map +1 -1
  224. package/dist/theme/create-theme.js +72 -55
  225. package/dist/theme/create-theme.js.map +1 -1
  226. package/dist/theme/inverse-render.cjs +3 -0
  227. package/dist/theme/inverse-render.cjs.map +1 -0
  228. package/dist/theme/inverse-render.js +10 -0
  229. package/dist/theme/inverse-render.js.map +1 -0
  230. package/dist/theme/inverse-restore.cjs +5 -0
  231. package/dist/theme/inverse-restore.cjs.map +1 -0
  232. package/dist/theme/inverse-restore.js +30 -0
  233. package/dist/theme/inverse-restore.js.map +1 -0
  234. package/dist/theme/inverse-surface.cjs +2 -0
  235. package/dist/theme/inverse-surface.cjs.map +1 -0
  236. package/dist/theme/inverse-surface.js +255 -0
  237. package/dist/theme/inverse-surface.js.map +1 -0
  238. package/dist/theme/status-tokens.cjs +2 -0
  239. package/dist/theme/status-tokens.cjs.map +1 -0
  240. package/dist/theme/status-tokens.js +15 -0
  241. package/dist/theme/status-tokens.js.map +1 -0
  242. package/dist/vite/create-vite-config.cjs +1 -1
  243. package/dist/vite/create-vite-config.cjs.map +1 -1
  244. package/dist/vite/create-vite-config.js +6 -4
  245. package/dist/vite/create-vite-config.js.map +1 -1
  246. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationCenter.module.js","names":[],"sources":["../../../src/components/NotificationCenter/NotificationCenter.module.css"],"sourcesContent":[".panel {\n display: flex;\n flex-direction: column;\n min-width: 0;\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.title {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n margin: 0;\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.headerAction {\n padding: 0;\n border: none;\n background: none;\n color: var(--tempest-primary);\n font: inherit;\n font-size: var(--tempest-text-xs);\n cursor: pointer;\n white-space: nowrap;\n}\n\n.headerAction:hover {\n text-decoration: underline;\n}\n\n.headerAction:focus-visible {\n outline: 2px solid var(--tempest-primary);\n outline-offset: 2px;\n border-radius: var(--tempest-radius-sm);\n}\n\n.list {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-y: auto;\n}\n\n.item {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.item:last-child {\n border-bottom: none;\n}\n\n/*\n * Unread is marked by a left bar plus a tinted background, never by colour alone\n * — the distinction has to survive a monochrome display and colour blindness.\n * `aria-current` on the row carries the same information non-visually.\n */\n.item.unread {\n background-color: var(--tempest-surface);\n box-shadow: inset 3px 0 0 0 var(--tempest-primary);\n}\n\n.icon {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-2, var(--tempest-surface));\n color: var(--tempest-text-muted);\n}\n\n.body {\n display: flex;\n flex: 1;\n min-width: 0;\n flex-direction: column;\n gap: var(--tempest-space-1);\n}\n\n/*\n * The whole title/body block is one button so the hit target matches what the\n * user perceives as \"the notification\", instead of just its title text.\n */\n.trigger {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.trigger:focus-visible {\n outline: 2px solid var(--tempest-primary);\n outline-offset: 2px;\n border-radius: var(--tempest-radius-sm);\n}\n\n.itemTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n}\n\n.itemBody {\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n line-height: var(--tempest-leading-normal);\n}\n\n.time {\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n.dismiss {\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: none;\n border-radius: var(--tempest-radius-full);\n background: none;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-base);\n line-height: 1;\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .dismiss:hover {\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n }\n}\n\n.dismiss:focus-visible {\n outline: 2px solid var(--tempest-primary);\n outline-offset: 2px;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"NotificationCenter.module.js","names":[],"sources":["../../../src/components/NotificationCenter/NotificationCenter.module.css"],"sourcesContent":[".panel {\n display: flex;\n flex-direction: column;\n min-width: 0;\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.title {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n margin: 0;\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.headerAction {\n padding: 0;\n border: none;\n background: none;\n color: var(--tempest-primary);\n font: inherit;\n font-size: var(--tempest-text-xs);\n cursor: pointer;\n white-space: nowrap;\n}\n\n.headerAction:hover {\n text-decoration: underline;\n}\n\n.headerAction:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n border-radius: var(--tempest-radius-sm);\n}\n\n.list {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-y: auto;\n}\n\n.item {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.item:last-child {\n border-bottom: none;\n}\n\n/*\n * Unread is marked by a left bar plus a tinted background, never by colour alone\n * — the distinction has to survive a monochrome display and colour blindness.\n * `aria-current` on the row carries the same information non-visually.\n */\n.item.unread {\n background-color: var(--tempest-surface);\n box-shadow: inset 3px 0 0 0 var(--tempest-primary);\n}\n\n.icon {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-2, var(--tempest-surface));\n color: var(--tempest-text-muted);\n}\n\n.body {\n display: flex;\n flex: 1;\n min-width: 0;\n flex-direction: column;\n gap: var(--tempest-space-1);\n}\n\n/*\n * The whole title/body block is one button so the hit target matches what the\n * user perceives as \"the notification\", instead of just its title text.\n */\n.trigger {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.trigger:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n border-radius: var(--tempest-radius-sm);\n}\n\n.itemTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n}\n\n.itemBody {\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n line-height: var(--tempest-leading-normal);\n}\n\n.time {\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n.dismiss {\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: none;\n border-radius: var(--tempest-radius-full);\n background: none;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-base);\n line-height: 1;\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .dismiss:hover {\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n }\n}\n\n.dismiss:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n"],"mappings":";"}
@@ -1,2 +1,2 @@
1
- const e=require("../../utils/cn.cjs"),t=require("./Page.module.cjs");let n=require("react/jsx-runtime");function r({title:r,eyebrow:i,description:a,actions:o,toolbar:s,footer:c,padded:l=!0,className:u,children:d,...f}){let p=r||i||a||o;return(0,n.jsxs)(`main`,{className:e.cn(t.default.page,l&&t.default.padded,u),...f,children:[p&&(0,n.jsxs)(`header`,{className:t.default.header,children:[(0,n.jsxs)(`div`,{className:t.default.headerText,children:[i&&(0,n.jsx)(`div`,{className:t.default.eyebrow,children:i}),r&&(0,n.jsx)(`h1`,{className:t.default.title,children:r}),a&&(0,n.jsx)(`p`,{className:t.default.description,children:a})]}),o&&(0,n.jsx)(`div`,{className:t.default.actions,children:o})]}),s&&(0,n.jsx)(`div`,{className:t.default.toolbar,children:s}),(0,n.jsx)(`div`,{className:t.default.content,children:d}),c&&(0,n.jsx)(`footer`,{className:t.default.footer,children:c})]})}exports.Page=r;
1
+ const e=require("../../utils/cn.cjs"),t=require("../SectionHeader/SectionHeader.cjs"),n=require("./Page.module.cjs");let r=require("react/jsx-runtime");function i({title:i,eyebrow:a,description:o,actions:s,toolbar:c,footer:l,padded:u=!0,className:d,children:f,...p}){return(0,r.jsxs)(`main`,{className:e.cn(n.default.page,u&&n.default.padded,d),...p,children:[(0,r.jsx)(t.SectionHeader,{level:1,eyebrow:a,title:i,description:o,actions:s}),c&&(0,r.jsx)(`div`,{className:n.default.toolbar,children:c}),(0,r.jsx)(`div`,{className:n.default.content,children:f}),l&&(0,r.jsx)(`footer`,{className:n.default.footer,children:l})]})}exports.Page=i;
2
2
  //# sourceMappingURL=Page.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Page.cjs","names":[],"sources":["../../../src/components/Page/Page.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a page shell is slots: eyebrow, title, description,\n * actions, toolbar, footer and children, with padded as the one behavioural switch.\n * Slots are the component.\n */\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n const hasHeader = title || eyebrow || description || actions;\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n {hasHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && <h1 className={styles.title}>{title}</h1>}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n"],"mappings":"wGAoCA,SAAgB,EAAK,CACjB,QACA,UACA,cACA,UACA,UACA,SACA,SAAS,GACT,YACA,WACA,GAAG,GACO,CACV,IAAM,EAAY,GAAS,GAAW,GAAe,EACrD,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,OAAQ,CAAS,EAAG,GAAI,EAA1E,SAAA,CACK,IACG,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAA,QAAO,OAA1B,SAAA,EACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,WAAvB,SAAA,CACK,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,EACzD,IAAS,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAU,CAAA,EACjD,IAAe,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,YAAc,SAAA,CAAe,CAAA,CACjE,CACJ,CAAA,EAAA,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,CACtD,IAEX,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,UAAc,CAAA,EAC9C,IAAU,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAA,QAAO,OAAS,SAAA,CAAe,CAAA,CAC3D,GAEd"}
1
+ {"version":3,"file":"Page.cjs","names":[],"sources":["../../../src/components/Page/Page.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a page shell is slots: eyebrow, title, description,\n * actions, toolbar, footer and children, with padded as the one behavioural switch.\n * Slots are the component.\n */\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { SectionHeader } from \"../SectionHeader\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * The header is a `SectionHeader` at `level={1}`, so the page title and the\n * `<h2>` of each section below it share one look; when every header slot is\n * empty no `<header>` is rendered.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n <SectionHeader\n level={1}\n eyebrow={eyebrow}\n title={title}\n description={description}\n actions={actions}\n />\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n"],"mappings":"wJAyCA,SAAgB,EAAK,CACjB,QACA,UACA,cACA,UACA,UACA,SACA,SAAS,GACT,YACA,WACA,GAAG,GACO,CACV,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,OAAQ,CAAS,EAAG,GAAI,EAA1E,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,EAAA,cAAD,CACI,MAAO,EACE,UACF,QACM,cACJ,SACZ,CAAA,EACA,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,UAAc,CAAA,EAC9C,IAAU,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAA,QAAO,OAAS,SAAA,CAAe,CAAA,CAC3D,GAEd"}
@@ -1,52 +1,36 @@
1
1
  import { cn as e } from "../../utils/cn.js";
2
- import t from "./Page.module.js";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { SectionHeader as t } from "../SectionHeader/SectionHeader.js";
3
+ import n from "./Page.module.js";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
5
  //#region src/components/Page/Page.tsx
5
- function i({ title: i, eyebrow: a, description: o, actions: s, toolbar: c, footer: l, padded: u = !0, className: d, children: f, ...p }) {
6
- let m = i || a || o || s;
7
- return /* @__PURE__ */ r("main", {
8
- className: e(t.page, u && t.padded, d),
9
- ...p,
6
+ function a({ title: a, eyebrow: o, description: s, actions: c, toolbar: l, footer: u, padded: d = !0, className: f, children: p, ...m }) {
7
+ return /* @__PURE__ */ i("main", {
8
+ className: e(n.page, d && n.padded, f),
9
+ ...m,
10
10
  children: [
11
- m && /* @__PURE__ */ r("header", {
12
- className: t.header,
13
- children: [/* @__PURE__ */ r("div", {
14
- className: t.headerText,
15
- children: [
16
- a && /* @__PURE__ */ n("div", {
17
- className: t.eyebrow,
18
- children: a
19
- }),
20
- i && /* @__PURE__ */ n("h1", {
21
- className: t.title,
22
- children: i
23
- }),
24
- o && /* @__PURE__ */ n("p", {
25
- className: t.description,
26
- children: o
27
- })
28
- ]
29
- }), s && /* @__PURE__ */ n("div", {
30
- className: t.actions,
31
- children: s
32
- })]
11
+ /* @__PURE__ */ r(t, {
12
+ level: 1,
13
+ eyebrow: o,
14
+ title: a,
15
+ description: s,
16
+ actions: c
33
17
  }),
34
- c && /* @__PURE__ */ n("div", {
35
- className: t.toolbar,
36
- children: c
18
+ l && /* @__PURE__ */ r("div", {
19
+ className: n.toolbar,
20
+ children: l
37
21
  }),
38
- /* @__PURE__ */ n("div", {
39
- className: t.content,
40
- children: f
22
+ /* @__PURE__ */ r("div", {
23
+ className: n.content,
24
+ children: p
41
25
  }),
42
- l && /* @__PURE__ */ n("footer", {
43
- className: t.footer,
44
- children: l
26
+ u && /* @__PURE__ */ r("footer", {
27
+ className: n.footer,
28
+ children: u
45
29
  })
46
30
  ]
47
31
  });
48
32
  }
49
33
  //#endregion
50
- export { i as Page };
34
+ export { a as Page };
51
35
 
52
36
  //# sourceMappingURL=Page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Page.js","names":[],"sources":["../../../src/components/Page/Page.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a page shell is slots: eyebrow, title, description,\n * actions, toolbar, footer and children, with padded as the one behavioural switch.\n * Slots are the component.\n */\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n const hasHeader = title || eyebrow || description || actions;\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n {hasHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && <h1 className={styles.title}>{title}</h1>}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n"],"mappings":";;;;AAoCA,SAAgB,EAAK,EACjB,UACA,YACA,gBACA,YACA,YACA,WACA,YAAS,IACT,cACA,aACA,GAAG,KACO;CACV,IAAM,IAAY,KAAS,KAAW,KAAe;CACrD,OACI,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAO,MAAM,KAAU,EAAO,QAAQ,CAAS;EAAG,GAAI;EAA1E,UAAA;GACK,KACG,kBAAC,UAAD;IAAQ,WAAW,EAAO;IAA1B,UAAA,CACI,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAvB,UAAA;MACK,KAAW,kBAAC,OAAD;OAAK,WAAW,EAAO;OAAU,UAAA;MAAa,CAAA;MACzD,KAAS,kBAAC,MAAD;OAAI,WAAW,EAAO;OAAQ,UAAA;MAAU,CAAA;MACjD,KAAe,kBAAC,KAAD;OAAG,WAAW,EAAO;OAAc,UAAA;MAAe,CAAA;KACjE;IACJ,CAAA,GAAA,KAAW,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAU,UAAA;IAAa,CAAA,CACtD;;GAEX,KAAW,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAU,UAAA;GAAa,CAAA;GAC1D,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAU;GAAc,CAAA;GAC9C,KAAU,kBAAC,UAAD;IAAQ,WAAW,EAAO;IAAS,UAAA;GAAe,CAAA;EAC3D;;AAEd"}
1
+ {"version":3,"file":"Page.js","names":[],"sources":["../../../src/components/Page/Page.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a page shell is slots: eyebrow, title, description,\n * actions, toolbar, footer and children, with padded as the one behavioural switch.\n * Slots are the component.\n */\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { SectionHeader } from \"../SectionHeader\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * The header is a `SectionHeader` at `level={1}`, so the page title and the\n * `<h2>` of each section below it share one look; when every header slot is\n * empty no `<header>` is rendered.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n <SectionHeader\n level={1}\n eyebrow={eyebrow}\n title={title}\n description={description}\n actions={actions}\n />\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n"],"mappings":";;;;;AAyCA,SAAgB,EAAK,EACjB,UACA,YACA,gBACA,YACA,YACA,WACA,YAAS,IACT,cACA,aACA,GAAG,KACO;CACV,OACI,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAO,MAAM,KAAU,EAAO,QAAQ,CAAS;EAAG,GAAI;EAA1E,UAAA;GACI,kBAAC,GAAD;IACI,OAAO;IACE;IACF;IACM;IACJ;GACZ,CAAA;GACA,KAAW,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAU,UAAA;GAAa,CAAA;GAC1D,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAU;GAAc,CAAA;GAC9C,KAAU,kBAAC,UAAD;IAAQ,WAAW,EAAO;IAAS,UAAA;GAAe,CAAA;EAC3D;;AAEd"}
@@ -1,3 +1,3 @@
1
1
  require("../../styles/component/Page.css");
2
- var e=`tempest_page_THNNc`,t=`tempest_padded_bzjoF`,n=`tempest_header_PZEzk`,r=`tempest_headerText_qYXFI`,i=`tempest_eyebrow_651RV`,a=`tempest_title_2oGnT`,o=`tempest_description_YzmWl`,s=`tempest_actions_-rB3U`,c=`tempest_toolbar_sA7sD`,l=`tempest_content_RCB4b`,u=`tempest_footer_540pQ`,d={page:e,padded:t,header:n,headerText:r,eyebrow:i,title:a,description:o,actions:s,toolbar:c,content:l,footer:u};exports.actions=s,exports.content=l,exports.default=d,exports.description=o,exports.eyebrow=i,exports.footer=u,exports.header=n,exports.headerText=r,exports.padded=t,exports.page=e,exports.title=a,exports.toolbar=c;
2
+ var e=`tempest_page_THNNc`,t=`tempest_padded_bzjoF`,n=`tempest_toolbar_sA7sD`,r=`tempest_content_RCB4b`,i=`tempest_footer_540pQ`,a={page:e,padded:t,toolbar:n,content:r,footer:i};exports.content=r,exports.default=a,exports.footer=i,exports.padded=t,exports.page=e,exports.toolbar=n;
3
3
  //# sourceMappingURL=Page.module.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Page.module.cjs","names":[],"sources":["../../../src/components/Page/Page.module.css"],"sourcesContent":[".page {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n font-family: var(--tempest-font-sans);\n color: var(--tempest-text);\n}\n\n.padded {\n padding: var(--tempest-space-5) var(--tempest-space-4);\n}\n\n@media (min-width: 768px) {\n .padded {\n padding: var(--tempest-space-6) var(--tempest-space-6);\n }\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n margin-bottom: var(--tempest-space-5);\n flex-wrap: wrap;\n}\n\n.headerText {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.eyebrow {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n margin-bottom: var(--tempest-space-1);\n}\n\n.title {\n margin: 0;\n font-size: var(--tempest-text-2xl);\n font-weight: var(--tempest-weight-bold);\n line-height: var(--tempest-leading-tight);\n}\n\n.description {\n margin: var(--tempest-space-2) 0 0;\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n}\n\n.actions {\n display: flex;\n gap: var(--tempest-space-2);\n flex: 0 0 auto;\n flex-wrap: wrap;\n}\n\n.toolbar {\n margin-bottom: var(--tempest-space-4);\n}\n\n.content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.footer {\n margin-top: var(--tempest-space-6);\n padding-top: var(--tempest-space-4);\n border-top: 1px solid var(--tempest-border);\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Page.module.cjs","names":[],"sources":["../../../src/components/Page/Page.module.css"],"sourcesContent":[".page {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n font-family: var(--tempest-font-sans);\n color: var(--tempest-text);\n}\n\n.padded {\n padding: var(--tempest-space-5) var(--tempest-space-4);\n}\n\n@media (min-width: 768px) {\n .padded {\n padding: var(--tempest-space-6) var(--tempest-space-6);\n }\n}\n\n.toolbar {\n margin-bottom: var(--tempest-space-4);\n}\n\n.content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.footer {\n margin-top: var(--tempest-space-6);\n padding-top: var(--tempest-space-4);\n border-top: 1px solid var(--tempest-border);\n}\n"],"mappings":";"}
@@ -1,19 +1,13 @@
1
1
  import "../../styles/component/Page.css";
2
2
  //#region src/components/Page/Page.module.css
3
- var e = "tempest_page_THNNc", t = "tempest_padded_bzjoF", n = "tempest_header_PZEzk", r = "tempest_headerText_qYXFI", i = "tempest_eyebrow_651RV", a = "tempest_title_2oGnT", o = "tempest_description_YzmWl", s = "tempest_actions_-rB3U", c = "tempest_toolbar_sA7sD", l = "tempest_content_RCB4b", u = "tempest_footer_540pQ", d = {
3
+ var e = "tempest_page_THNNc", t = "tempest_padded_bzjoF", n = "tempest_toolbar_sA7sD", r = "tempest_content_RCB4b", i = "tempest_footer_540pQ", a = {
4
4
  page: e,
5
5
  padded: t,
6
- header: n,
7
- headerText: r,
8
- eyebrow: i,
9
- title: a,
10
- description: o,
11
- actions: s,
12
- toolbar: c,
13
- content: l,
14
- footer: u
6
+ toolbar: n,
7
+ content: r,
8
+ footer: i
15
9
  };
16
10
  //#endregion
17
- export { s as actions, l as content, d as default, o as description, i as eyebrow, u as footer, n as header, r as headerText, t as padded, e as page, a as title, c as toolbar };
11
+ export { r as content, a as default, i as footer, t as padded, e as page, n as toolbar };
18
12
 
19
13
  //# sourceMappingURL=Page.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Page.module.js","names":[],"sources":["../../../src/components/Page/Page.module.css"],"sourcesContent":[".page {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n font-family: var(--tempest-font-sans);\n color: var(--tempest-text);\n}\n\n.padded {\n padding: var(--tempest-space-5) var(--tempest-space-4);\n}\n\n@media (min-width: 768px) {\n .padded {\n padding: var(--tempest-space-6) var(--tempest-space-6);\n }\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n margin-bottom: var(--tempest-space-5);\n flex-wrap: wrap;\n}\n\n.headerText {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.eyebrow {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n margin-bottom: var(--tempest-space-1);\n}\n\n.title {\n margin: 0;\n font-size: var(--tempest-text-2xl);\n font-weight: var(--tempest-weight-bold);\n line-height: var(--tempest-leading-tight);\n}\n\n.description {\n margin: var(--tempest-space-2) 0 0;\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n}\n\n.actions {\n display: flex;\n gap: var(--tempest-space-2);\n flex: 0 0 auto;\n flex-wrap: wrap;\n}\n\n.toolbar {\n margin-bottom: var(--tempest-space-4);\n}\n\n.content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.footer {\n margin-top: var(--tempest-space-6);\n padding-top: var(--tempest-space-4);\n border-top: 1px solid var(--tempest-border);\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Page.module.js","names":[],"sources":["../../../src/components/Page/Page.module.css"],"sourcesContent":[".page {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n font-family: var(--tempest-font-sans);\n color: var(--tempest-text);\n}\n\n.padded {\n padding: var(--tempest-space-5) var(--tempest-space-4);\n}\n\n@media (min-width: 768px) {\n .padded {\n padding: var(--tempest-space-6) var(--tempest-space-6);\n }\n}\n\n.toolbar {\n margin-bottom: var(--tempest-space-4);\n}\n\n.content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.footer {\n margin-top: var(--tempest-space-6);\n padding-top: var(--tempest-space-4);\n border-top: 1px solid var(--tempest-border);\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordInput.module.cjs","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, var(--tempest-primary));\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"PasswordInput.module.cjs","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordInput.module.js","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, var(--tempest-primary));\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"PasswordInput.module.js","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"PinInput.module.cjs","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, var(--tempest-primary));\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"PinInput.module.cjs","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"PinInput.module.js","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, var(--tempest-primary));\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"PinInput.module.js","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../utils/cn.cjs"),t=require("../../hooks/use-intersection-observer.cjs"),n=require("./reveal-threshold.cjs"),r=require("./Reveal.module.cjs");let i=require("react"),a=require("react/jsx-runtime");var o={current:null};function s(){return()=>void 0}function c(){return typeof IntersectionObserver<`u`}function l(){return!1}function u({as:u=`div`,variant:d=`up`,delay:f,duration:p,once:m=!0,threshold:h=.15,rootMargin:g=`0px`,className:_,style:v,children:y,...b}){let x=(0,i.useRef)(null),S=(0,i.useSyncExternalStore)(s,c,l),[C,w]=(0,i.useState)(!1),[T,E]=(0,i.useState)({requested:h,value:h}),D=T.requested===h?T.value:h,O=t.useIntersectionObserver(S&&!(m&&C)?x:o,{rootMargin:g,threshold:D});(0,i.useEffect)(()=>{if(!O)return;let e=n.effectiveThreshold(h,O);Math.abs(e-D)>.001&&E({requested:h,value:e}),O.isIntersecting&&O.intersectionRatio+.001>=e?w(!0):!m&&!O.isIntersecting&&w(!1)},[O,h,D,m]);let k=S?C?`shown`:`hidden`:`static`,A={};return f!==void 0&&(A[`--tempest-reveal-delay`]=`${f}ms`),p!==void 0&&(A[`--tempest-reveal-duration`]=`${p}ms`),(0,a.jsx)(u,{...b,ref:x,className:e.cn(r.default.reveal,_),style:{...A,...v},"data-state":k,"data-variant":d,children:y})}exports.Reveal=u;
2
+ //# sourceMappingURL=Reveal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reveal.cjs","names":[],"sources":["../../../src/components/Reveal/Reveal.tsx"],"sourcesContent":["import type { CSSProperties, ElementType, HTMLAttributes, JSX, RefObject } from \"react\";\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useIntersectionObserver } from \"@/hooks/use-intersection-observer\";\nimport { cn } from \"@/utils/cn\";\nimport { RATIO_EPSILON, effectiveThreshold } from \"./reveal-threshold\";\nimport styles from \"./Reveal.module.css\";\n\n/** Direction the content travels from, or `\"fade\"` / `\"scale\"` for no travel. */\nexport type RevealVariant = \"fade\" | \"up\" | \"down\" | \"left\" | \"right\" | \"scale\";\n\n/** Visual state written to `data-state`. */\nexport type RevealState = \"static\" | \"hidden\" | \"shown\";\n\nexport interface RevealProps extends HTMLAttributes<HTMLElement> {\n /** Intrinsic element to render, e.g. `\"li\"` inside a list. Defaults to `\"div\"`. */\n as?: keyof JSX.IntrinsicElements;\n /** How the content enters. Defaults to `\"up\"`. */\n variant?: RevealVariant;\n /** Wait before the entrance starts, in ms. Stagger siblings with `index * step`. */\n delay?: number;\n /** Length of the entrance, in ms. Defaults to `--tempest-duration-slower`. */\n duration?: number;\n /** Reveal once and stop observing. With `false`, it hides again once fully out of view. Defaults to `true`. */\n once?: boolean;\n /**\n * Fraction of the element — or of the viewport, when the element is taller\n * than it — that must be visible to reveal. Defaults to `0.15`.\n */\n threshold?: number;\n /** Margin around the root, as in `IntersectionObserver`. Defaults to `\"0px\"`. */\n rootMargin?: string;\n}\n\n/** A ref that never points at an element, used to switch the observer off. */\nconst DETACHED: RefObject<Element | null> = { current: null };\n\n/**\n * Subscribe function for a snapshot that never changes after mount.\n *\n * @returns A no-op unsubscribe.\n */\nfunction subscribeNever(): () => void {\n return () => undefined;\n}\n\n/**\n * Whether this environment can observe intersections.\n *\n * @returns `true` when `IntersectionObserver` exists.\n */\nfunction canObserve(): boolean {\n return typeof IntersectionObserver !== \"undefined\";\n}\n\n/**\n * Server snapshot: never hide content that was rendered without JavaScript.\n *\n * @returns Always `false`.\n */\nfunction cannotObserve(): boolean {\n return false;\n}\n\n/**\n * Animate content into view the first time it is scrolled to.\n *\n * The three failure modes of a hand-rolled version are handled here, not left to\n * the docs:\n *\n * - **Reduced motion.** Under `prefers-reduced-motion: reduce` the stylesheet\n * pins the element visible with no transform and no transition, whatever\n * state it is in — so the setting also wins when it changes mid-session.\n * - **No `IntersectionObserver`** (old engines, some crawlers, tests): the\n * element stays in the `\"static\"` state, which is plain visible content. It is\n * never hidden waiting for an observation that cannot come.\n * - **Taller than the viewport.** A box three viewports tall never reaches a\n * ratio of 0.5, so a raw observer with that threshold never reveals it. The\n * threshold is rescaled by the highest ratio the element can reach (see\n * `effectiveThreshold`), read from the first observation.\n *\n * Content is hidden only when the client can observe: the server snapshot of\n * `useSyncExternalStore` is `\"static\"`, so markup rendered without JavaScript —\n * or before hydration — is visible. The transition is declared on the `\"shown\"`\n * state only, so the switch to `\"hidden\"` on mount is instant instead of a\n * fade-out, and with `once={false}` leaving the viewport hides without motion.\n *\n * With `once={false}` the element hides only once it is fully out of view. Hiding\n * on the threshold would oscillate: the hidden state translates the box, which\n * moves it back across the same threshold.\n *\n * @example\n * <ul>\n * {steps.map((step, index) => (\n * <Reveal key={step.id} as=\"li\" delay={index * 80}>\n * {step.title}\n * </Reveal>\n * ))}\n * </ul>\n */\nexport function Reveal({\n as = \"div\",\n variant = \"up\",\n delay,\n duration,\n once = true,\n threshold = 0.15,\n rootMargin = \"0px\",\n className,\n style,\n children,\n ...props\n}: RevealProps) {\n const ref = useRef<HTMLElement>(null);\n const observable = useSyncExternalStore(subscribeNever, canObserve, cannotObserve);\n const [shown, setShown] = useState<boolean>(false);\n const [rescaled, setRescaled] = useState<{ requested: number; value: number }>({\n requested: threshold,\n value: threshold,\n });\n const observeAt = rescaled.requested === threshold ? rescaled.value : threshold;\n const settled = once && shown;\n\n const entry = useIntersectionObserver(observable && !settled ? ref : DETACHED, {\n rootMargin,\n threshold: observeAt,\n });\n\n useEffect(() => {\n if (!entry) return;\n const target = effectiveThreshold(threshold, entry);\n if (Math.abs(target - observeAt) > RATIO_EPSILON) {\n setRescaled({ requested: threshold, value: target });\n }\n if (entry.isIntersecting && entry.intersectionRatio + RATIO_EPSILON >= target) {\n setShown(true);\n } else if (!once && !entry.isIntersecting) {\n setShown(false);\n }\n }, [entry, threshold, observeAt, once]);\n\n const state: RevealState = !observable ? \"static\" : shown ? \"shown\" : \"hidden\";\n const timing: Record<string, string> = {};\n if (delay !== undefined) timing[\"--tempest-reveal-delay\"] = `${delay}ms`;\n if (duration !== undefined) timing[\"--tempest-reveal-duration\"] = `${duration}ms`;\n\n const Tag = as as ElementType;\n\n return (\n <Tag\n {...props}\n ref={ref}\n className={cn(styles.reveal, className)}\n style={{ ...timing, ...style } as CSSProperties}\n data-state={state}\n data-variant={variant}\n >\n {children}\n </Tag>\n );\n}\n"],"mappings":"wNAkCA,IAAM,EAAsC,CAAE,QAAS,IAAK,EAO5D,SAAS,GAA6B,CAClC,UAAa,IAAA,EACjB,CAOA,SAAS,GAAsB,CAC3B,OAAO,OAAO,qBAAyB,GAC3C,CAOA,SAAS,GAAyB,CAC9B,MAAO,EACX,CAsCA,SAAgB,EAAO,CACnB,KAAK,MACL,UAAU,KACV,QACA,WACA,OAAO,GACP,YAAY,IACZ,aAAa,MACb,YACA,QACA,WACA,GAAG,GACS,CACZ,IAAM,GAAA,EAAM,EAAA,OAAA,CAAoB,IAAI,EAC9B,GAAA,EAAa,EAAA,qBAAA,CAAqB,EAAgB,EAAY,CAAa,EAC3E,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAkB,EAAK,EAC3C,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA+C,CAC3E,UAAW,EACX,MAAO,CACX,CAAC,EACK,EAAY,EAAS,YAAc,EAAY,EAAS,MAAQ,EAGhE,EAAQ,EAAA,wBAAwB,GAAc,EAFpC,GAAQ,GAEuC,EAAM,EAAU,CAC3E,aACA,UAAW,CACf,CAAC,GAED,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,EAAO,OACZ,IAAM,EAAS,EAAA,mBAAmB,EAAW,CAAK,EAC9C,KAAK,IAAI,EAAS,CAAS,EAAA,MAC3B,EAAY,CAAE,UAAW,EAAW,MAAO,CAAO,CAAC,EAEnD,EAAM,gBAAkB,EAAM,kBAAA,MAAqC,EACnE,EAAS,EAAI,EACN,CAAC,GAAQ,CAAC,EAAM,gBACvB,EAAS,EAAK,CAEtB,EAAG,CAAC,EAAO,EAAW,EAAW,CAAI,CAAC,EAEtC,IAAM,EAAsB,EAAwB,EAAQ,QAAU,SAA7B,SACnC,EAAiC,CAAC,EAMxC,OALI,IAAU,IAAA,KAAW,EAAO,0BAA4B,GAAG,EAAM,KACjE,IAAa,IAAA,KAAW,EAAO,6BAA+B,GAAG,EAAS,MAK1E,EAAA,EAAA,IAAA,CAAC,EAAD,CACI,GAAI,EACC,MACL,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,CAAS,EACtC,MAAO,CAAE,GAAG,EAAQ,GAAG,CAAM,EAC7B,aAAY,EACZ,eAAc,EAEb,UACA,CAAA,CAEb"}
@@ -0,0 +1,56 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import { useIntersectionObserver as t } from "../../hooks/use-intersection-observer.js";
3
+ import { effectiveThreshold as n } from "./reveal-threshold.js";
4
+ import r from "./Reveal.module.js";
5
+ import { useEffect as i, useRef as a, useState as o, useSyncExternalStore as s } from "react";
6
+ import { jsx as c } from "react/jsx-runtime";
7
+ //#region src/components/Reveal/Reveal.tsx
8
+ var l = { current: null };
9
+ function u() {
10
+ return () => void 0;
11
+ }
12
+ function d() {
13
+ return typeof IntersectionObserver < "u";
14
+ }
15
+ function f() {
16
+ return !1;
17
+ }
18
+ function p({ as: p = "div", variant: m = "up", delay: h, duration: g, once: _ = !0, threshold: v = .15, rootMargin: y = "0px", className: b, style: x, children: S, ...C }) {
19
+ let w = a(null), T = s(u, d, f), [E, D] = o(!1), [O, k] = o({
20
+ requested: v,
21
+ value: v
22
+ }), A = O.requested === v ? O.value : v, j = t(T && !(_ && E) ? w : l, {
23
+ rootMargin: y,
24
+ threshold: A
25
+ });
26
+ i(() => {
27
+ if (!j) return;
28
+ let e = n(v, j);
29
+ Math.abs(e - A) > .001 && k({
30
+ requested: v,
31
+ value: e
32
+ }), j.isIntersecting && j.intersectionRatio + .001 >= e ? D(!0) : !_ && !j.isIntersecting && D(!1);
33
+ }, [
34
+ j,
35
+ v,
36
+ A,
37
+ _
38
+ ]);
39
+ let M = T ? E ? "shown" : "hidden" : "static", N = {};
40
+ return h !== void 0 && (N["--tempest-reveal-delay"] = `${h}ms`), g !== void 0 && (N["--tempest-reveal-duration"] = `${g}ms`), /* @__PURE__ */ c(p, {
41
+ ...C,
42
+ ref: w,
43
+ className: e(r.reveal, b),
44
+ style: {
45
+ ...N,
46
+ ...x
47
+ },
48
+ "data-state": M,
49
+ "data-variant": m,
50
+ children: S
51
+ });
52
+ }
53
+ //#endregion
54
+ export { p as Reveal };
55
+
56
+ //# sourceMappingURL=Reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reveal.js","names":[],"sources":["../../../src/components/Reveal/Reveal.tsx"],"sourcesContent":["import type { CSSProperties, ElementType, HTMLAttributes, JSX, RefObject } from \"react\";\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useIntersectionObserver } from \"@/hooks/use-intersection-observer\";\nimport { cn } from \"@/utils/cn\";\nimport { RATIO_EPSILON, effectiveThreshold } from \"./reveal-threshold\";\nimport styles from \"./Reveal.module.css\";\n\n/** Direction the content travels from, or `\"fade\"` / `\"scale\"` for no travel. */\nexport type RevealVariant = \"fade\" | \"up\" | \"down\" | \"left\" | \"right\" | \"scale\";\n\n/** Visual state written to `data-state`. */\nexport type RevealState = \"static\" | \"hidden\" | \"shown\";\n\nexport interface RevealProps extends HTMLAttributes<HTMLElement> {\n /** Intrinsic element to render, e.g. `\"li\"` inside a list. Defaults to `\"div\"`. */\n as?: keyof JSX.IntrinsicElements;\n /** How the content enters. Defaults to `\"up\"`. */\n variant?: RevealVariant;\n /** Wait before the entrance starts, in ms. Stagger siblings with `index * step`. */\n delay?: number;\n /** Length of the entrance, in ms. Defaults to `--tempest-duration-slower`. */\n duration?: number;\n /** Reveal once and stop observing. With `false`, it hides again once fully out of view. Defaults to `true`. */\n once?: boolean;\n /**\n * Fraction of the element — or of the viewport, when the element is taller\n * than it — that must be visible to reveal. Defaults to `0.15`.\n */\n threshold?: number;\n /** Margin around the root, as in `IntersectionObserver`. Defaults to `\"0px\"`. */\n rootMargin?: string;\n}\n\n/** A ref that never points at an element, used to switch the observer off. */\nconst DETACHED: RefObject<Element | null> = { current: null };\n\n/**\n * Subscribe function for a snapshot that never changes after mount.\n *\n * @returns A no-op unsubscribe.\n */\nfunction subscribeNever(): () => void {\n return () => undefined;\n}\n\n/**\n * Whether this environment can observe intersections.\n *\n * @returns `true` when `IntersectionObserver` exists.\n */\nfunction canObserve(): boolean {\n return typeof IntersectionObserver !== \"undefined\";\n}\n\n/**\n * Server snapshot: never hide content that was rendered without JavaScript.\n *\n * @returns Always `false`.\n */\nfunction cannotObserve(): boolean {\n return false;\n}\n\n/**\n * Animate content into view the first time it is scrolled to.\n *\n * The three failure modes of a hand-rolled version are handled here, not left to\n * the docs:\n *\n * - **Reduced motion.** Under `prefers-reduced-motion: reduce` the stylesheet\n * pins the element visible with no transform and no transition, whatever\n * state it is in — so the setting also wins when it changes mid-session.\n * - **No `IntersectionObserver`** (old engines, some crawlers, tests): the\n * element stays in the `\"static\"` state, which is plain visible content. It is\n * never hidden waiting for an observation that cannot come.\n * - **Taller than the viewport.** A box three viewports tall never reaches a\n * ratio of 0.5, so a raw observer with that threshold never reveals it. The\n * threshold is rescaled by the highest ratio the element can reach (see\n * `effectiveThreshold`), read from the first observation.\n *\n * Content is hidden only when the client can observe: the server snapshot of\n * `useSyncExternalStore` is `\"static\"`, so markup rendered without JavaScript —\n * or before hydration — is visible. The transition is declared on the `\"shown\"`\n * state only, so the switch to `\"hidden\"` on mount is instant instead of a\n * fade-out, and with `once={false}` leaving the viewport hides without motion.\n *\n * With `once={false}` the element hides only once it is fully out of view. Hiding\n * on the threshold would oscillate: the hidden state translates the box, which\n * moves it back across the same threshold.\n *\n * @example\n * <ul>\n * {steps.map((step, index) => (\n * <Reveal key={step.id} as=\"li\" delay={index * 80}>\n * {step.title}\n * </Reveal>\n * ))}\n * </ul>\n */\nexport function Reveal({\n as = \"div\",\n variant = \"up\",\n delay,\n duration,\n once = true,\n threshold = 0.15,\n rootMargin = \"0px\",\n className,\n style,\n children,\n ...props\n}: RevealProps) {\n const ref = useRef<HTMLElement>(null);\n const observable = useSyncExternalStore(subscribeNever, canObserve, cannotObserve);\n const [shown, setShown] = useState<boolean>(false);\n const [rescaled, setRescaled] = useState<{ requested: number; value: number }>({\n requested: threshold,\n value: threshold,\n });\n const observeAt = rescaled.requested === threshold ? rescaled.value : threshold;\n const settled = once && shown;\n\n const entry = useIntersectionObserver(observable && !settled ? ref : DETACHED, {\n rootMargin,\n threshold: observeAt,\n });\n\n useEffect(() => {\n if (!entry) return;\n const target = effectiveThreshold(threshold, entry);\n if (Math.abs(target - observeAt) > RATIO_EPSILON) {\n setRescaled({ requested: threshold, value: target });\n }\n if (entry.isIntersecting && entry.intersectionRatio + RATIO_EPSILON >= target) {\n setShown(true);\n } else if (!once && !entry.isIntersecting) {\n setShown(false);\n }\n }, [entry, threshold, observeAt, once]);\n\n const state: RevealState = !observable ? \"static\" : shown ? \"shown\" : \"hidden\";\n const timing: Record<string, string> = {};\n if (delay !== undefined) timing[\"--tempest-reveal-delay\"] = `${delay}ms`;\n if (duration !== undefined) timing[\"--tempest-reveal-duration\"] = `${duration}ms`;\n\n const Tag = as as ElementType;\n\n return (\n <Tag\n {...props}\n ref={ref}\n className={cn(styles.reveal, className)}\n style={{ ...timing, ...style } as CSSProperties}\n data-state={state}\n data-variant={variant}\n >\n {children}\n </Tag>\n );\n}\n"],"mappings":";;;;;;;AAkCA,IAAM,IAAsC,EAAE,SAAS,KAAK;AAO5D,SAAS,IAA6B;CAClC,aAAa,KAAA;AACjB;AAOA,SAAS,IAAsB;CAC3B,OAAO,OAAO,uBAAyB;AAC3C;AAOA,SAAS,IAAyB;CAC9B,OAAO;AACX;AAsCA,SAAgB,EAAO,EACnB,QAAK,OACL,aAAU,MACV,UACA,aACA,UAAO,IACP,eAAY,KACZ,gBAAa,OACb,cACA,UACA,aACA,GAAG,KACS;CACZ,IAAM,IAAM,EAAoB,IAAI,GAC9B,IAAa,EAAqB,GAAgB,GAAY,CAAa,GAC3E,CAAC,GAAO,KAAY,EAAkB,EAAK,GAC3C,CAAC,GAAU,KAAe,EAA+C;EAC3E,WAAW;EACX,OAAO;CACX,CAAC,GACK,IAAY,EAAS,cAAc,IAAY,EAAS,QAAQ,GAGhE,IAAQ,EAAwB,KAAc,EAFpC,KAAQ,KAEuC,IAAM,GAAU;EAC3E;EACA,WAAW;CACf,CAAC;CAED,QAAgB;EACZ,IAAI,CAAC,GAAO;EACZ,IAAM,IAAS,EAAmB,GAAW,CAAK;EAIlD,AAHI,KAAK,IAAI,IAAS,CAAS,IAAA,QAC3B,EAAY;GAAE,WAAW;GAAW,OAAO;EAAO,CAAC,GAEnD,EAAM,kBAAkB,EAAM,oBAAA,QAAqC,IACnE,EAAS,EAAI,IACN,CAAC,KAAQ,CAAC,EAAM,kBACvB,EAAS,EAAK;CAEtB,GAAG;EAAC;EAAO;EAAW;EAAW;CAAI,CAAC;CAEtC,IAAM,IAAsB,IAAwB,IAAQ,UAAU,WAA7B,UACnC,IAAiC,CAAC;CAMxC,OALI,MAAU,KAAA,MAAW,EAAO,4BAA4B,GAAG,EAAM,MACjE,MAAa,KAAA,MAAW,EAAO,+BAA+B,GAAG,EAAS,MAK1E,kBAAC,GAAD;EACI,GAAI;EACC;EACL,WAAW,EAAG,EAAO,QAAQ,CAAS;EACtC,OAAO;GAAE,GAAG;GAAQ,GAAG;EAAM;EAC7B,cAAY;EACZ,gBAAc;EAEb;CACA,CAAA;AAEb"}
@@ -0,0 +1,3 @@
1
+ require("../../styles/component/Reveal.css");
2
+ var e=`tempest_reveal_jBgJJ`,t={reveal:e};exports.default=t,exports.reveal=e;
3
+ //# sourceMappingURL=Reveal.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reveal.module.cjs","names":[],"sources":["../../../src/components/Reveal/Reveal.module.css"],"sourcesContent":[".reveal[data-state=\"hidden\"] {\n opacity: 0;\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"up\"] {\n transform: translate3d(0, var(--tempest-reveal-distance, 1.5rem), 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"down\"] {\n transform: translate3d(0, calc(-1 * var(--tempest-reveal-distance, 1.5rem)), 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"left\"] {\n transform: translate3d(var(--tempest-reveal-distance, 1.5rem), 0, 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"right\"] {\n transform: translate3d(calc(-1 * var(--tempest-reveal-distance, 1.5rem)), 0, 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"scale\"] {\n transform: scale(var(--tempest-reveal-scale, 0.95));\n}\n\n.reveal[data-state=\"shown\"] {\n opacity: 1;\n transform: none;\n transition:\n opacity var(--tempest-reveal-duration, var(--tempest-duration-slower))\n var(--tempest-reveal-easing, var(--tempest-ease-out)),\n transform var(--tempest-reveal-duration, var(--tempest-duration-slower))\n var(--tempest-reveal-easing, var(--tempest-ease-emphasized));\n transition-delay: var(--tempest-reveal-delay, 0ms);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .reveal[data-state][data-variant] {\n opacity: 1;\n transform: none;\n transition: none;\n }\n}\n"],"mappings":";"}
@@ -0,0 +1,7 @@
1
+ import "../../styles/component/Reveal.css";
2
+ //#region src/components/Reveal/Reveal.module.css
3
+ var e = "tempest_reveal_jBgJJ", t = { reveal: e };
4
+ //#endregion
5
+ export { t as default, e as reveal };
6
+
7
+ //# sourceMappingURL=Reveal.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reveal.module.js","names":[],"sources":["../../../src/components/Reveal/Reveal.module.css"],"sourcesContent":[".reveal[data-state=\"hidden\"] {\n opacity: 0;\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"up\"] {\n transform: translate3d(0, var(--tempest-reveal-distance, 1.5rem), 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"down\"] {\n transform: translate3d(0, calc(-1 * var(--tempest-reveal-distance, 1.5rem)), 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"left\"] {\n transform: translate3d(var(--tempest-reveal-distance, 1.5rem), 0, 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"right\"] {\n transform: translate3d(calc(-1 * var(--tempest-reveal-distance, 1.5rem)), 0, 0);\n}\n\n.reveal[data-state=\"hidden\"][data-variant=\"scale\"] {\n transform: scale(var(--tempest-reveal-scale, 0.95));\n}\n\n.reveal[data-state=\"shown\"] {\n opacity: 1;\n transform: none;\n transition:\n opacity var(--tempest-reveal-duration, var(--tempest-duration-slower))\n var(--tempest-reveal-easing, var(--tempest-ease-out)),\n transform var(--tempest-reveal-duration, var(--tempest-duration-slower))\n var(--tempest-reveal-easing, var(--tempest-ease-emphasized));\n transition-delay: var(--tempest-reveal-delay, 0ms);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .reveal[data-state][data-variant] {\n opacity: 1;\n transform: none;\n transition: none;\n }\n}\n"],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ var e=.001;function t(e){let t=e.rootBounds,n=e.boundingClientRect;return!t||n.width<=0||n.height<=0?1:Math.min(1,t.height/n.height)*Math.min(1,t.width/n.width)}function n(e,n){return n?e*t(n):e}exports.RATIO_EPSILON=e,exports.effectiveThreshold=n,exports.reachableRatio=t;
2
+ //# sourceMappingURL=reveal-threshold.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reveal-threshold.cjs","names":[],"sources":["../../../src/components/Reveal/reveal-threshold.ts"],"sourcesContent":["/**\n * Tolerance for comparing intersection ratios.\n *\n * Browsers report `intersectionRatio` as the quotient of two rounded areas, so a\n * box sitting exactly on its threshold can come back a hair below it. Without\n * the slack the observer fires (it crossed) and the comparison says it did not.\n */\nexport const RATIO_EPSILON = 0.001;\n\n/**\n * Highest `intersectionRatio` the target can ever reach inside the root.\n *\n * A box taller (or wider) than the root never fits in it: a section three\n * viewports tall tops out at a ratio of about 0.33. Any threshold above that is\n * unreachable, and an observer asked for it never reports the crossing.\n *\n * @param entry - An observation of the target; only its geometry is read.\n * @returns A value in `(0, 1]`, or `1` when the geometry is unknown (no\n * `rootBounds`, as in a cross-origin iframe, or an empty box).\n */\nexport function reachableRatio(entry: IntersectionObserverEntry): number {\n const root = entry.rootBounds;\n const box = entry.boundingClientRect;\n if (!root || box.width <= 0 || box.height <= 0) return 1;\n return Math.min(1, root.height / box.height) * Math.min(1, root.width / box.width);\n}\n\n/**\n * The threshold `Reveal` actually observes with, given the one it was asked for.\n *\n * The requested threshold is read as \"this fraction of whichever is smaller,\n * the element or the viewport\". For a box that fits, that is the plain ratio;\n * for a box taller than the viewport it scales the threshold by the reachable\n * ratio, so `threshold={0.5}` on a 3-viewport section reveals once it fills\n * half the viewport instead of never.\n *\n * @param threshold - The requested threshold, in `[0, 1]`.\n * @param entry - The latest observation, or `null` before the first one.\n * @returns The threshold to observe with.\n */\nexport function effectiveThreshold(\n threshold: number,\n entry: IntersectionObserverEntry | null,\n): number {\n if (!entry) return threshold;\n return threshold * reachableRatio(entry);\n}\n"],"mappings":"AAOA,IAAa,EAAgB,KAa7B,SAAgB,EAAe,EAA0C,CACrE,IAAM,EAAO,EAAM,WACb,EAAM,EAAM,mBAElB,MADI,CAAC,GAAQ,EAAI,OAAS,GAAK,EAAI,QAAU,EAAU,EAChD,KAAK,IAAI,EAAG,EAAK,OAAS,EAAI,MAAM,EAAI,KAAK,IAAI,EAAG,EAAK,MAAQ,EAAI,KAAK,CACrF,CAeA,SAAgB,EACZ,EACA,EACM,CAEN,OADK,EACE,EAAY,EAAe,CAAK,EADpB,CAEvB"}
@@ -0,0 +1,13 @@
1
+ //#region src/components/Reveal/reveal-threshold.ts
2
+ var e = .001;
3
+ function t(e) {
4
+ let t = e.rootBounds, n = e.boundingClientRect;
5
+ return !t || n.width <= 0 || n.height <= 0 ? 1 : Math.min(1, t.height / n.height) * Math.min(1, t.width / n.width);
6
+ }
7
+ function n(e, n) {
8
+ return n ? e * t(n) : e;
9
+ }
10
+ //#endregion
11
+ export { e as RATIO_EPSILON, n as effectiveThreshold, t as reachableRatio };
12
+
13
+ //# sourceMappingURL=reveal-threshold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reveal-threshold.js","names":[],"sources":["../../../src/components/Reveal/reveal-threshold.ts"],"sourcesContent":["/**\n * Tolerance for comparing intersection ratios.\n *\n * Browsers report `intersectionRatio` as the quotient of two rounded areas, so a\n * box sitting exactly on its threshold can come back a hair below it. Without\n * the slack the observer fires (it crossed) and the comparison says it did not.\n */\nexport const RATIO_EPSILON = 0.001;\n\n/**\n * Highest `intersectionRatio` the target can ever reach inside the root.\n *\n * A box taller (or wider) than the root never fits in it: a section three\n * viewports tall tops out at a ratio of about 0.33. Any threshold above that is\n * unreachable, and an observer asked for it never reports the crossing.\n *\n * @param entry - An observation of the target; only its geometry is read.\n * @returns A value in `(0, 1]`, or `1` when the geometry is unknown (no\n * `rootBounds`, as in a cross-origin iframe, or an empty box).\n */\nexport function reachableRatio(entry: IntersectionObserverEntry): number {\n const root = entry.rootBounds;\n const box = entry.boundingClientRect;\n if (!root || box.width <= 0 || box.height <= 0) return 1;\n return Math.min(1, root.height / box.height) * Math.min(1, root.width / box.width);\n}\n\n/**\n * The threshold `Reveal` actually observes with, given the one it was asked for.\n *\n * The requested threshold is read as \"this fraction of whichever is smaller,\n * the element or the viewport\". For a box that fits, that is the plain ratio;\n * for a box taller than the viewport it scales the threshold by the reachable\n * ratio, so `threshold={0.5}` on a 3-viewport section reveals once it fills\n * half the viewport instead of never.\n *\n * @param threshold - The requested threshold, in `[0, 1]`.\n * @param entry - The latest observation, or `null` before the first one.\n * @returns The threshold to observe with.\n */\nexport function effectiveThreshold(\n threshold: number,\n entry: IntersectionObserverEntry | null,\n): number {\n if (!entry) return threshold;\n return threshold * reachableRatio(entry);\n}\n"],"mappings":";AAOA,IAAa,IAAgB;AAa7B,SAAgB,EAAe,GAA0C;CACrE,IAAM,IAAO,EAAM,YACb,IAAM,EAAM;CAElB,OADI,CAAC,KAAQ,EAAI,SAAS,KAAK,EAAI,UAAU,IAAU,IAChD,KAAK,IAAI,GAAG,EAAK,SAAS,EAAI,MAAM,IAAI,KAAK,IAAI,GAAG,EAAK,QAAQ,EAAI,KAAK;AACrF;AAeA,SAAgB,EACZ,GACA,GACM;CAEN,OADK,IACE,IAAY,EAAe,CAAK,IADpB;AAEvB"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../utils/cn.cjs"),t=require("./SectionHeader.module.cjs");let n=require("react"),r=require("react/jsx-runtime");var i=(0,n.createContext)(null);function a({title:a,eyebrow:o,description:s,actions:c,level:l=2,align:u=`start`,id:d,className:f,...p}){let m=(0,n.useId)(),h=(0,n.useContext)(i),g=!!a,_=h!==null&&g&&h.claim(m),v=d??(_?h.sectionId:m),y=h?.register;if((0,n.useLayoutEffect)(()=>{if(y&&g)return y(v)},[y,g,v]),!a&&!o&&!s&&!c)return null;let b=`h${l}`;return(0,r.jsxs)(`header`,{className:e.cn(t.default.header,u===`center`&&t.default.center,f),...p,children:[(0,r.jsxs)(`div`,{className:t.default.headerText,children:[o&&(0,r.jsx)(`div`,{className:t.default.eyebrow,children:o}),a&&(0,r.jsx)(b,{id:v,className:t.default.title,children:a}),s&&(0,r.jsx)(`p`,{className:t.default.description,children:s})]}),c&&(0,r.jsx)(`div`,{className:t.default.actions,children:c})]})}function o({children:e,tone:t,...a}){let o=(0,n.useId)(),s=(0,n.useRef)(null),[c,l]=(0,n.useState)(null),u=(0,n.useMemo)(()=>({sectionId:o,claim:e=>(s.current??=e,s.current===e),register:e=>(l(t=>[...t??[],e]),()=>l(t=>(t??[]).filter(t=>t!==e)))}),[o]);(0,n.useLayoutEffect)(()=>{l(e=>e??[])},[]);let d=a[`aria-labelledby`]!==void 0||a[`aria-label`]!==void 0,f=c===null?o:c[0];return(0,r.jsx)(i.Provider,{value:u,children:(0,r.jsx)(`section`,{"aria-labelledby":d?void 0:f,"data-tempest-tone":t,...a,children:e})})}exports.Section=o,exports.SectionHeader=a;
2
+ //# sourceMappingURL=SectionHeader.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.cjs","names":[],"sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a heading block is slots (eyebrow, title, description,\n * actions) plus the three switches that decide its semantics: level, align and the\n * heading id. Splitting them would leave the id away from the heading it names.\n */\nimport {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SectionHeader.module.css\";\n\nexport type SectionHeaderLevel = 1 | 2 | 3 | 4 | 5 | 6;\nexport type SectionHeaderAlign = \"start\" | \"center\";\n\n/**\n * Links the nearest `<Section>` to the heading that names it.\n *\n * Two channels, because they answer at different times:\n *\n * - `sectionId` + `claim` work during render, so the link exists in the very\n * first HTML (`renderToString`, hydration) where no effect runs. The section\n * owns `sectionId` (from `useId`, identical on server and client) and writes\n * it to `aria-labelledby` before any child renders; the first titled\n * `SectionHeader` to call `claim` in render order becomes its owner and, when\n * it has no explicit `id`, puts `sectionId` on its heading. `claim` is keyed by\n * the caller's own `useId`, so asking twice (Strict Mode, a re-render) gives\n * the same answer and never hands the id to a second heading.\n * - `register` works after mount and is the source of truth from then on: it\n * returns the matching unregister so a heading that unmounts (or changes id)\n * releases the section instead of leaving `aria-labelledby` pointing at an\n * element that no longer exists, and the next registered heading takes over.\n */\ninterface SectionContextValue {\n sectionId: string;\n claim: (headerKey: string) => boolean;\n register: (headingId: string) => () => void;\n}\n\nconst SectionContext = createContext<SectionContextValue | null>(null);\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\" | \"id\"> {\n /** Heading text, rendered as `<h{level}>`. */\n title?: ReactNode;\n /** Short label above the title (category, breadcrumbs). */\n eyebrow?: ReactNode;\n /** Supporting text rendered below the title. */\n description?: ReactNode;\n /** Trailing slot for buttons or menus. */\n actions?: ReactNode;\n /** Heading level — semantics only, the look does not change with it. Default `2`. */\n level?: SectionHeaderLevel;\n /** Horizontal alignment of the text block. Default `\"start\"`. */\n align?: SectionHeaderAlign;\n /** Id of the heading element. Generated with `useId` when absent. */\n id?: string;\n}\n\n/**\n * Header of a page or of one section of it: eyebrow, title, description and\n * actions, with the same look `Page` uses for its own header.\n *\n * The heading level is a prop because one page needs one `<h1>` and many\n * `<h2>` that look alike; the visual stays the same at every level so the\n * outline is picked by meaning, not by size. Inside a `<Section>` the first\n * titled header takes the section's own id for its heading (unless `id` is\n * given) and registers it, which is what gives the `region` landmark its\n * accessible name — in the server HTML too.\n *\n * @example\n * <Section>\n * <SectionHeader eyebrow=\"Soluções\" title=\"O que podemos desenvolver\" align=\"center\" />\n * <p>Conteúdo da seção.</p>\n * </Section>\n */\nexport function SectionHeader({\n title,\n eyebrow,\n description,\n actions,\n level = 2,\n align = \"start\",\n id,\n className,\n ...props\n}: SectionHeaderProps) {\n const autoId = useId();\n const section = useContext(SectionContext);\n const hasTitle = Boolean(title);\n const ownsSection = section !== null && hasTitle && section.claim(autoId);\n const headingId = id ?? (ownsSection ? section.sectionId : autoId);\n const register = section?.register;\n useLayoutEffect(() => {\n if (!register || !hasTitle) return undefined;\n return register(headingId);\n }, [register, hasTitle, headingId]);\n if (!title && !eyebrow && !description && !actions) return null;\n const Heading = `h${level}` as const;\n return (\n <header\n className={cn(styles.header, align === \"center\" && styles.center, className)}\n {...props}\n >\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && (\n <Heading id={headingId} className={styles.title}>\n {title}\n </Heading>\n )}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n );\n}\n\n/** Surface tone a {@link Section} can take. */\nexport type SectionTone = \"inverse\" | \"default\";\n\nexport interface SectionProps extends HTMLAttributes<HTMLElement> {\n /**\n * `\"inverse\"` paints the section in the brand color and inverts every color\n * token inside it, by writing `data-tempest-tone=\"inverse\"`. The tokens are\n * opt-in, because most apps never paint a section in the brand: they come\n * from `tempest-react-sdk/styles/inverse.css` for the SDK's own blue, or from\n * `createTheme({ primary, inverse: createInverseSurface })` for yours, each\n * measured against the fill (text and muted text at 4.5:1 or more, the focus\n * ring at 3:1 or more). With neither loaded the attribute matches nothing and\n * the section keeps the page's tokens — legible, not inverted. The prop\n * exists so the tone is typed: a typo in a hand-written attribute fails\n * silently, a typo here fails the build.\n *\n * `\"default\"` hands a region inside an inverse section back to the page's\n * tokens — light or dark, whichever the page is on — by writing\n * `data-tempest-tone=\"default\"`: a white form or price card in a navy hero.\n * The rules ship with the inverse tokens, so it costs nothing until those are\n * loaded, and outside an inverse section the tokens it restores are the ones\n * already there.\n */\n tone?: SectionTone;\n}\n\n/**\n * `<section>` that takes its accessible name from the `SectionHeader` inside it.\n *\n * A `<section>` is exposed as a `region` landmark only when it has an\n * accessible name; without one it is an anonymous group and screen-reader\n * landmark navigation skips it. Wiring `aria-labelledby` to the heading id is\n * the same mechanical step on every page, so the section does it: every\n * `SectionHeader` with a `title` below it reaches the section through context\n * (so wrappers in between do not break the link) and the first one names it;\n * when it unmounts, the next one takes over. An explicit `aria-labelledby` or\n * `aria-label` wins over the automatic one, and once mounted with no titled\n * heading the attribute is left off rather than pointing at nothing.\n *\n * The section owns the id (`useId`), so the link is already in the first\n * render — `renderToString` and the HTML a server sends — where no effect runs.\n * The parent's attributes are written before any child renders, so the section\n * cannot know what is below it: it always writes its own id, and the first\n * titled `SectionHeader` in render order puts that id on its heading. Two\n * cases cannot be known on the server, and both are settled on hydration\n * without a mismatch warning: with no titled heading the server attribute is\n * dropped (until then it resolves to nothing, which Chromium 153 exposes as\n * the same anonymous group as no attribute at all), and when that first header\n * has an explicit `id` the attribute moves to it. A consumer that needs the\n * explicit id in the server HTML passes `aria-labelledby` itself.\n *\n * @example\n * <Section>\n * <SectionHeader title=\"Planos\" />\n * <PlanGrid />\n * </Section>\n *\n * @example\n * <Section tone=\"inverse\">\n * <SectionHeader title=\"Comece agora\" />\n * <Button>Criar conta</Button>\n * </Section>\n */\nexport function Section({ children, tone, ...props }: SectionProps) {\n const sectionId = useId();\n const ownerRef = useRef<string | null>(null);\n const [headingIds, setHeadingIds] = useState<string[] | null>(null);\n const context = useMemo<SectionContextValue>(\n () => ({\n sectionId,\n claim: (headerKey: string) => {\n ownerRef.current ??= headerKey;\n return ownerRef.current === headerKey;\n },\n register: (id: string) => {\n setHeadingIds((current) => [...(current ?? []), id]);\n return () =>\n setHeadingIds((current) => (current ?? []).filter((entry) => entry !== id));\n },\n }),\n [sectionId],\n );\n useLayoutEffect(() => {\n setHeadingIds((current) => current ?? []);\n }, []);\n const named = props[\"aria-labelledby\"] !== undefined || props[\"aria-label\"] !== undefined;\n const labelledBy = headingIds === null ? sectionId : headingIds[0];\n return (\n <SectionContext.Provider value={context}>\n <section\n aria-labelledby={named ? undefined : labelledBy}\n data-tempest-tone={tone}\n {...props}\n >\n {children}\n </section>\n </SectionContext.Provider>\n );\n}\n"],"mappings":"oIA6CA,IAAM,GAAA,EAAiB,EAAA,cAAA,CAA0C,IAAI,EAoCrE,SAAgB,EAAc,CAC1B,QACA,UACA,cACA,UACA,QAAQ,EACR,QAAQ,QACR,KACA,YACA,GAAG,GACgB,CACnB,IAAM,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,GAAA,EAAU,EAAA,WAAA,CAAW,CAAc,EACnC,EAAW,EAAQ,EACnB,EAAc,IAAY,MAAQ,GAAY,EAAQ,MAAM,CAAM,EAClE,EAAY,IAAO,EAAc,EAAQ,UAAY,GACrD,EAAW,GAAS,SAK1B,IAJA,EAAA,EAAA,gBAAA,KAAsB,CACd,GAAC,GAAa,EAClB,OAAO,EAAS,CAAS,CAC7B,EAAG,CAAC,EAAU,EAAU,CAAS,CAAC,EAC9B,CAAC,GAAS,CAAC,GAAW,CAAC,GAAe,CAAC,EAAS,OAAO,KAC3D,IAAM,EAAU,IAAI,IACpB,OACI,EAAA,EAAA,KAAA,CAAC,SAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,IAAU,UAAY,EAAA,QAAO,OAAQ,CAAS,EAC3E,GAAI,EAFR,SAAA,EAII,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,WAAvB,SAAA,CACK,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,EACzD,IACG,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAI,EAAW,UAAW,EAAA,QAAO,MACrC,SAAA,CACI,CAAA,EAEZ,IAAe,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,YAAc,SAAA,CAAe,CAAA,CACjE,CACJ,CAAA,EAAA,IAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAU,SAAA,CAAa,CAAA,CACtD,GAEhB,CAiEA,SAAgB,EAAQ,CAAE,WAAU,OAAM,GAAG,GAAuB,CAChE,IAAM,GAAA,EAAY,EAAA,MAAA,CAAM,EAClB,GAAA,EAAW,EAAA,OAAA,CAAsB,IAAI,EACrC,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAA0B,IAAI,EAC5D,GAAA,EAAU,EAAA,QAAA,MACL,CACH,YACA,MAAQ,IACJ,EAAS,UAAY,EACd,EAAS,UAAY,GAEhC,SAAW,IACP,EAAe,GAAY,CAAC,GAAI,GAAW,CAAC,EAAI,CAAE,CAAC,MAE/C,EAAe,IAAa,GAAW,CAAC,EAAA,CAAG,OAAQ,GAAU,IAAU,CAAE,CAAC,EAEtF,GACA,CAAC,CAAS,CACd,GACA,EAAA,EAAA,gBAAA,KAAsB,CAClB,EAAe,GAAY,GAAW,CAAC,CAAC,CAC5C,EAAG,CAAC,CAAC,EACL,IAAM,EAAQ,EAAM,qBAAuB,IAAA,IAAa,EAAM,gBAAkB,IAAA,GAC1E,EAAa,IAAe,KAAO,EAAY,EAAW,GAChE,OACI,EAAA,EAAA,IAAA,CAAC,EAAe,SAAhB,CAAyB,MAAO,EAC5B,UAAA,EAAA,EAAA,IAAA,CAAC,UAAD,CACI,kBAAiB,EAAQ,IAAA,GAAY,EACrC,oBAAmB,EACnB,GAAI,EAEH,UACI,CAAA,CACY,CAAA,CAEjC"}
@@ -0,0 +1,66 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import t from "./SectionHeader.module.js";
3
+ import { createContext as n, useContext as r, useId as i, useLayoutEffect as a, useMemo as o, useRef as s, useState as c } from "react";
4
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
+ //#region src/components/SectionHeader/SectionHeader.tsx
6
+ var d = n(null);
7
+ function f({ title: n, eyebrow: o, description: s, actions: c, level: f = 2, align: p = "start", id: m, className: h, ...g }) {
8
+ let _ = i(), v = r(d), y = !!n, b = v !== null && y && v.claim(_), x = m ?? (b ? v.sectionId : _), S = v?.register;
9
+ if (a(() => {
10
+ if (S && y) return S(x);
11
+ }, [
12
+ S,
13
+ y,
14
+ x
15
+ ]), !n && !o && !s && !c) return null;
16
+ let C = `h${f}`;
17
+ return /* @__PURE__ */ u("header", {
18
+ className: e(t.header, p === "center" && t.center, h),
19
+ ...g,
20
+ children: [/* @__PURE__ */ u("div", {
21
+ className: t.headerText,
22
+ children: [
23
+ o && /* @__PURE__ */ l("div", {
24
+ className: t.eyebrow,
25
+ children: o
26
+ }),
27
+ n && /* @__PURE__ */ l(C, {
28
+ id: x,
29
+ className: t.title,
30
+ children: n
31
+ }),
32
+ s && /* @__PURE__ */ l("p", {
33
+ className: t.description,
34
+ children: s
35
+ })
36
+ ]
37
+ }), c && /* @__PURE__ */ l("div", {
38
+ className: t.actions,
39
+ children: c
40
+ })]
41
+ });
42
+ }
43
+ function p({ children: e, tone: t, ...n }) {
44
+ let r = i(), u = s(null), [f, p] = c(null), m = o(() => ({
45
+ sectionId: r,
46
+ claim: (e) => (u.current ??= e, u.current === e),
47
+ register: (e) => (p((t) => [...t ?? [], e]), () => p((t) => (t ?? []).filter((t) => t !== e)))
48
+ }), [r]);
49
+ a(() => {
50
+ p((e) => e ?? []);
51
+ }, []);
52
+ let h = n["aria-labelledby"] !== void 0 || n["aria-label"] !== void 0, g = f === null ? r : f[0];
53
+ return /* @__PURE__ */ l(d.Provider, {
54
+ value: m,
55
+ children: /* @__PURE__ */ l("section", {
56
+ "aria-labelledby": h ? void 0 : g,
57
+ "data-tempest-tone": t,
58
+ ...n,
59
+ children: e
60
+ })
61
+ });
62
+ }
63
+ //#endregion
64
+ export { p as Section, f as SectionHeader };
65
+
66
+ //# sourceMappingURL=SectionHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.js","names":[],"sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a heading block is slots (eyebrow, title, description,\n * actions) plus the three switches that decide its semantics: level, align and the\n * heading id. Splitting them would leave the id away from the heading it names.\n */\nimport {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SectionHeader.module.css\";\n\nexport type SectionHeaderLevel = 1 | 2 | 3 | 4 | 5 | 6;\nexport type SectionHeaderAlign = \"start\" | \"center\";\n\n/**\n * Links the nearest `<Section>` to the heading that names it.\n *\n * Two channels, because they answer at different times:\n *\n * - `sectionId` + `claim` work during render, so the link exists in the very\n * first HTML (`renderToString`, hydration) where no effect runs. The section\n * owns `sectionId` (from `useId`, identical on server and client) and writes\n * it to `aria-labelledby` before any child renders; the first titled\n * `SectionHeader` to call `claim` in render order becomes its owner and, when\n * it has no explicit `id`, puts `sectionId` on its heading. `claim` is keyed by\n * the caller's own `useId`, so asking twice (Strict Mode, a re-render) gives\n * the same answer and never hands the id to a second heading.\n * - `register` works after mount and is the source of truth from then on: it\n * returns the matching unregister so a heading that unmounts (or changes id)\n * releases the section instead of leaving `aria-labelledby` pointing at an\n * element that no longer exists, and the next registered heading takes over.\n */\ninterface SectionContextValue {\n sectionId: string;\n claim: (headerKey: string) => boolean;\n register: (headingId: string) => () => void;\n}\n\nconst SectionContext = createContext<SectionContextValue | null>(null);\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\" | \"id\"> {\n /** Heading text, rendered as `<h{level}>`. */\n title?: ReactNode;\n /** Short label above the title (category, breadcrumbs). */\n eyebrow?: ReactNode;\n /** Supporting text rendered below the title. */\n description?: ReactNode;\n /** Trailing slot for buttons or menus. */\n actions?: ReactNode;\n /** Heading level — semantics only, the look does not change with it. Default `2`. */\n level?: SectionHeaderLevel;\n /** Horizontal alignment of the text block. Default `\"start\"`. */\n align?: SectionHeaderAlign;\n /** Id of the heading element. Generated with `useId` when absent. */\n id?: string;\n}\n\n/**\n * Header of a page or of one section of it: eyebrow, title, description and\n * actions, with the same look `Page` uses for its own header.\n *\n * The heading level is a prop because one page needs one `<h1>` and many\n * `<h2>` that look alike; the visual stays the same at every level so the\n * outline is picked by meaning, not by size. Inside a `<Section>` the first\n * titled header takes the section's own id for its heading (unless `id` is\n * given) and registers it, which is what gives the `region` landmark its\n * accessible name — in the server HTML too.\n *\n * @example\n * <Section>\n * <SectionHeader eyebrow=\"Soluções\" title=\"O que podemos desenvolver\" align=\"center\" />\n * <p>Conteúdo da seção.</p>\n * </Section>\n */\nexport function SectionHeader({\n title,\n eyebrow,\n description,\n actions,\n level = 2,\n align = \"start\",\n id,\n className,\n ...props\n}: SectionHeaderProps) {\n const autoId = useId();\n const section = useContext(SectionContext);\n const hasTitle = Boolean(title);\n const ownsSection = section !== null && hasTitle && section.claim(autoId);\n const headingId = id ?? (ownsSection ? section.sectionId : autoId);\n const register = section?.register;\n useLayoutEffect(() => {\n if (!register || !hasTitle) return undefined;\n return register(headingId);\n }, [register, hasTitle, headingId]);\n if (!title && !eyebrow && !description && !actions) return null;\n const Heading = `h${level}` as const;\n return (\n <header\n className={cn(styles.header, align === \"center\" && styles.center, className)}\n {...props}\n >\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && (\n <Heading id={headingId} className={styles.title}>\n {title}\n </Heading>\n )}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n );\n}\n\n/** Surface tone a {@link Section} can take. */\nexport type SectionTone = \"inverse\" | \"default\";\n\nexport interface SectionProps extends HTMLAttributes<HTMLElement> {\n /**\n * `\"inverse\"` paints the section in the brand color and inverts every color\n * token inside it, by writing `data-tempest-tone=\"inverse\"`. The tokens are\n * opt-in, because most apps never paint a section in the brand: they come\n * from `tempest-react-sdk/styles/inverse.css` for the SDK's own blue, or from\n * `createTheme({ primary, inverse: createInverseSurface })` for yours, each\n * measured against the fill (text and muted text at 4.5:1 or more, the focus\n * ring at 3:1 or more). With neither loaded the attribute matches nothing and\n * the section keeps the page's tokens — legible, not inverted. The prop\n * exists so the tone is typed: a typo in a hand-written attribute fails\n * silently, a typo here fails the build.\n *\n * `\"default\"` hands a region inside an inverse section back to the page's\n * tokens — light or dark, whichever the page is on — by writing\n * `data-tempest-tone=\"default\"`: a white form or price card in a navy hero.\n * The rules ship with the inverse tokens, so it costs nothing until those are\n * loaded, and outside an inverse section the tokens it restores are the ones\n * already there.\n */\n tone?: SectionTone;\n}\n\n/**\n * `<section>` that takes its accessible name from the `SectionHeader` inside it.\n *\n * A `<section>` is exposed as a `region` landmark only when it has an\n * accessible name; without one it is an anonymous group and screen-reader\n * landmark navigation skips it. Wiring `aria-labelledby` to the heading id is\n * the same mechanical step on every page, so the section does it: every\n * `SectionHeader` with a `title` below it reaches the section through context\n * (so wrappers in between do not break the link) and the first one names it;\n * when it unmounts, the next one takes over. An explicit `aria-labelledby` or\n * `aria-label` wins over the automatic one, and once mounted with no titled\n * heading the attribute is left off rather than pointing at nothing.\n *\n * The section owns the id (`useId`), so the link is already in the first\n * render — `renderToString` and the HTML a server sends — where no effect runs.\n * The parent's attributes are written before any child renders, so the section\n * cannot know what is below it: it always writes its own id, and the first\n * titled `SectionHeader` in render order puts that id on its heading. Two\n * cases cannot be known on the server, and both are settled on hydration\n * without a mismatch warning: with no titled heading the server attribute is\n * dropped (until then it resolves to nothing, which Chromium 153 exposes as\n * the same anonymous group as no attribute at all), and when that first header\n * has an explicit `id` the attribute moves to it. A consumer that needs the\n * explicit id in the server HTML passes `aria-labelledby` itself.\n *\n * @example\n * <Section>\n * <SectionHeader title=\"Planos\" />\n * <PlanGrid />\n * </Section>\n *\n * @example\n * <Section tone=\"inverse\">\n * <SectionHeader title=\"Comece agora\" />\n * <Button>Criar conta</Button>\n * </Section>\n */\nexport function Section({ children, tone, ...props }: SectionProps) {\n const sectionId = useId();\n const ownerRef = useRef<string | null>(null);\n const [headingIds, setHeadingIds] = useState<string[] | null>(null);\n const context = useMemo<SectionContextValue>(\n () => ({\n sectionId,\n claim: (headerKey: string) => {\n ownerRef.current ??= headerKey;\n return ownerRef.current === headerKey;\n },\n register: (id: string) => {\n setHeadingIds((current) => [...(current ?? []), id]);\n return () =>\n setHeadingIds((current) => (current ?? []).filter((entry) => entry !== id));\n },\n }),\n [sectionId],\n );\n useLayoutEffect(() => {\n setHeadingIds((current) => current ?? []);\n }, []);\n const named = props[\"aria-labelledby\"] !== undefined || props[\"aria-label\"] !== undefined;\n const labelledBy = headingIds === null ? sectionId : headingIds[0];\n return (\n <SectionContext.Provider value={context}>\n <section\n aria-labelledby={named ? undefined : labelledBy}\n data-tempest-tone={tone}\n {...props}\n >\n {children}\n </section>\n </SectionContext.Provider>\n );\n}\n"],"mappings":";;;;;AA6CA,IAAM,IAAiB,EAA0C,IAAI;AAoCrE,SAAgB,EAAc,EAC1B,UACA,YACA,gBACA,YACA,WAAQ,GACR,WAAQ,SACR,OACA,cACA,GAAG,KACgB;CACnB,IAAM,IAAS,EAAM,GACf,IAAU,EAAW,CAAc,GACnC,IAAW,EAAQ,GACnB,IAAc,MAAY,QAAQ,KAAY,EAAQ,MAAM,CAAM,GAClE,IAAY,MAAO,IAAc,EAAQ,YAAY,IACrD,IAAW,GAAS;CAK1B,IAJA,QAAsB;EACd,IAAC,KAAa,GAClB,OAAO,EAAS,CAAS;CAC7B,GAAG;EAAC;EAAU;EAAU;CAAS,CAAC,GAC9B,CAAC,KAAS,CAAC,KAAW,CAAC,KAAe,CAAC,GAAS,OAAO;CAC3D,IAAM,IAAU,IAAI;CACpB,OACI,kBAAC,UAAD;EACI,WAAW,EAAG,EAAO,QAAQ,MAAU,YAAY,EAAO,QAAQ,CAAS;EAC3E,GAAI;EAFR,UAAA,CAII,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA;IACK,KAAW,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAU,UAAA;IAAa,CAAA;IACzD,KACG,kBAAC,GAAD;KAAS,IAAI;KAAW,WAAW,EAAO;KACrC,UAAA;IACI,CAAA;IAEZ,KAAe,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAc,UAAA;IAAe,CAAA;GACjE;EACJ,CAAA,GAAA,KAAW,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAU,UAAA;EAAa,CAAA,CACtD;;AAEhB;AAiEA,SAAgB,EAAQ,EAAE,aAAU,SAAM,GAAG,KAAuB;CAChE,IAAM,IAAY,EAAM,GAClB,IAAW,EAAsB,IAAI,GACrC,CAAC,GAAY,KAAiB,EAA0B,IAAI,GAC5D,IAAU,SACL;EACH;EACA,QAAQ,OACJ,EAAS,YAAY,GACd,EAAS,YAAY;EAEhC,WAAW,OACP,GAAe,MAAY,CAAC,GAAI,KAAW,CAAC,GAAI,CAAE,CAAC,SAE/C,GAAe,OAAa,KAAW,CAAC,EAAA,CAAG,QAAQ,MAAU,MAAU,CAAE,CAAC;CAEtF,IACA,CAAC,CAAS,CACd;CACA,QAAsB;EAClB,GAAe,MAAY,KAAW,CAAC,CAAC;CAC5C,GAAG,CAAC,CAAC;CACL,IAAM,IAAQ,EAAM,uBAAuB,KAAA,KAAa,EAAM,kBAAkB,KAAA,GAC1E,IAAa,MAAe,OAAO,IAAY,EAAW;CAChE,OACI,kBAAC,EAAe,UAAhB;EAAyB,OAAO;EAC5B,UAAA,kBAAC,WAAD;GACI,mBAAiB,IAAQ,KAAA,IAAY;GACrC,qBAAmB;GACnB,GAAI;GAEH;EACI,CAAA;CACY,CAAA;AAEjC"}
@@ -0,0 +1,3 @@
1
+ require("../../styles/component/SectionHeader.css");
2
+ var e=`tempest_header_38yhB`,t=`tempest_headerText_3YDF-`,n=`tempest_eyebrow_slLcy`,r=`tempest_title_nY6QC`,i=`tempest_description_-Gbs9`,a=`tempest_actions_dzFrP`,o=`tempest_center_lDAVK`,s={header:e,headerText:t,eyebrow:n,title:r,description:i,actions:a,center:o};exports.actions=a,exports.center=o,exports.default=s,exports.description=i,exports.eyebrow=n,exports.header=e,exports.headerText=t,exports.title=r;
3
+ //# sourceMappingURL=SectionHeader.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.module.cjs","names":[],"sources":["../../../src/components/SectionHeader/SectionHeader.module.css"],"sourcesContent":[".header {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n margin-bottom: var(--tempest-space-5);\n flex-wrap: wrap;\n}\n\n.headerText {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.eyebrow {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n margin-bottom: var(--tempest-space-1);\n}\n\n.title {\n margin: 0;\n font-size: var(--tempest-text-2xl);\n font-weight: var(--tempest-weight-bold);\n line-height: var(--tempest-leading-tight);\n}\n\n.description {\n margin: var(--tempest-space-2) 0 0;\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n}\n\n.actions {\n display: flex;\n gap: var(--tempest-space-2);\n flex: 0 0 auto;\n flex-wrap: wrap;\n}\n\n.center {\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n\n.center .actions {\n justify-content: center;\n}\n"],"mappings":";"}
@@ -0,0 +1,15 @@
1
+ import "../../styles/component/SectionHeader.css";
2
+ //#region src/components/SectionHeader/SectionHeader.module.css
3
+ var e = "tempest_header_38yhB", t = "tempest_headerText_3YDF-", n = "tempest_eyebrow_slLcy", r = "tempest_title_nY6QC", i = "tempest_description_-Gbs9", a = "tempest_actions_dzFrP", o = "tempest_center_lDAVK", s = {
4
+ header: e,
5
+ headerText: t,
6
+ eyebrow: n,
7
+ title: r,
8
+ description: i,
9
+ actions: a,
10
+ center: o
11
+ };
12
+ //#endregion
13
+ export { a as actions, o as center, s as default, i as description, n as eyebrow, e as header, t as headerText, r as title };
14
+
15
+ //# sourceMappingURL=SectionHeader.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.module.js","names":[],"sources":["../../../src/components/SectionHeader/SectionHeader.module.css"],"sourcesContent":[".header {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n margin-bottom: var(--tempest-space-5);\n flex-wrap: wrap;\n}\n\n.headerText {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.eyebrow {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n margin-bottom: var(--tempest-space-1);\n}\n\n.title {\n margin: 0;\n font-size: var(--tempest-text-2xl);\n font-weight: var(--tempest-weight-bold);\n line-height: var(--tempest-leading-tight);\n}\n\n.description {\n margin: var(--tempest-space-2) 0 0;\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n}\n\n.actions {\n display: flex;\n gap: var(--tempest-space-2);\n flex: 0 0 auto;\n flex-wrap: wrap;\n}\n\n.center {\n flex-direction: column;\n align-items: center;\n text-align: center;\n}\n\n.center .actions {\n justify-content: center;\n}\n"],"mappings":";"}