@namroodinc/liquid-editorial 0.0.0-stage → 0.1.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 (354) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -2
  3. package/dist/chunks/Icon-CGY1FNXT.js +77 -0
  4. package/dist/chunks/Icon-CGY1FNXT.js.map +1 -0
  5. package/dist/chunks/Icon-CWsA1W83.cjs +2 -0
  6. package/dist/chunks/Icon-CWsA1W83.cjs.map +1 -0
  7. package/dist/components/AssetGrid/index.cjs +2 -0
  8. package/dist/components/AssetGrid/index.cjs.map +1 -0
  9. package/dist/components/AssetGrid/index.d.cts +54 -0
  10. package/dist/components/AssetGrid/index.d.cts.map +1 -0
  11. package/dist/components/AssetGrid/index.d.ts +54 -0
  12. package/dist/components/AssetGrid/index.d.ts.map +1 -0
  13. package/dist/components/AssetGrid/index.js +137 -0
  14. package/dist/components/AssetGrid/index.js.map +1 -0
  15. package/dist/components/AssetGrid/style.css +196 -0
  16. package/dist/components/Avatar/index.cjs +2 -0
  17. package/dist/components/Avatar/index.cjs.map +1 -0
  18. package/dist/components/Avatar/index.d.cts +24 -0
  19. package/dist/components/Avatar/index.d.cts.map +1 -0
  20. package/dist/components/Avatar/index.d.ts +24 -0
  21. package/dist/components/Avatar/index.d.ts.map +1 -0
  22. package/dist/components/Avatar/index.js +43 -0
  23. package/dist/components/Avatar/index.js.map +1 -0
  24. package/dist/components/Avatar/style.css +70 -0
  25. package/dist/components/Badge/index.cjs +2 -0
  26. package/dist/components/Badge/index.cjs.map +1 -0
  27. package/dist/components/Badge/index.d.cts +25 -0
  28. package/dist/components/Badge/index.d.cts.map +1 -0
  29. package/dist/components/Badge/index.d.ts +25 -0
  30. package/dist/components/Badge/index.d.ts.map +1 -0
  31. package/dist/components/Badge/index.js +28 -0
  32. package/dist/components/Badge/index.js.map +1 -0
  33. package/dist/components/Badge/style.css +103 -0
  34. package/dist/components/Board/index.cjs +2 -0
  35. package/dist/components/Board/index.cjs.map +1 -0
  36. package/dist/components/Board/index.d.cts +62 -0
  37. package/dist/components/Board/index.d.cts.map +1 -0
  38. package/dist/components/Board/index.d.ts +62 -0
  39. package/dist/components/Board/index.d.ts.map +1 -0
  40. package/dist/components/Board/index.js +227 -0
  41. package/dist/components/Board/index.js.map +1 -0
  42. package/dist/components/Board/style.css +145 -0
  43. package/dist/components/Button/index.cjs +2 -0
  44. package/dist/components/Button/index.cjs.map +1 -0
  45. package/dist/components/Button/index.d.cts +22 -0
  46. package/dist/components/Button/index.d.cts.map +1 -0
  47. package/dist/components/Button/index.d.ts +22 -0
  48. package/dist/components/Button/index.d.ts.map +1 -0
  49. package/dist/components/Button/index.js +37 -0
  50. package/dist/components/Button/index.js.map +1 -0
  51. package/dist/components/Button/style.css +139 -0
  52. package/dist/components/ButtonGroup/index.cjs +2 -0
  53. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  54. package/dist/components/ButtonGroup/index.d.cts +17 -0
  55. package/dist/components/ButtonGroup/index.d.cts.map +1 -0
  56. package/dist/components/ButtonGroup/index.d.ts +17 -0
  57. package/dist/components/ButtonGroup/index.d.ts.map +1 -0
  58. package/dist/components/ButtonGroup/index.js +18 -0
  59. package/dist/components/ButtonGroup/index.js.map +1 -0
  60. package/dist/components/ButtonGroup/style.css +66 -0
  61. package/dist/components/Choice/index.cjs +2 -0
  62. package/dist/components/Choice/index.cjs.map +1 -0
  63. package/dist/components/Choice/index.d.cts +25 -0
  64. package/dist/components/Choice/index.d.cts.map +1 -0
  65. package/dist/components/Choice/index.d.ts +25 -0
  66. package/dist/components/Choice/index.d.ts.map +1 -0
  67. package/dist/components/Choice/index.js +58 -0
  68. package/dist/components/Choice/index.js.map +1 -0
  69. package/dist/components/Choice/style.css +96 -0
  70. package/dist/components/Container/index.cjs +2 -0
  71. package/dist/components/Container/index.cjs.map +1 -0
  72. package/dist/components/Container/index.d.cts +19 -0
  73. package/dist/components/Container/index.d.cts.map +1 -0
  74. package/dist/components/Container/index.d.ts +19 -0
  75. package/dist/components/Container/index.d.ts.map +1 -0
  76. package/dist/components/Container/index.js +20 -0
  77. package/dist/components/Container/index.js.map +1 -0
  78. package/dist/components/Container/style.css +41 -0
  79. package/dist/components/DatePicker/index.cjs +2 -0
  80. package/dist/components/DatePicker/index.cjs.map +1 -0
  81. package/dist/components/DatePicker/index.d.cts +57 -0
  82. package/dist/components/DatePicker/index.d.cts.map +1 -0
  83. package/dist/components/DatePicker/index.d.ts +57 -0
  84. package/dist/components/DatePicker/index.d.ts.map +1 -0
  85. package/dist/components/DatePicker/index.js +248 -0
  86. package/dist/components/DatePicker/index.js.map +1 -0
  87. package/dist/components/DatePicker/style.css +149 -0
  88. package/dist/components/Drawer/index.cjs +2 -0
  89. package/dist/components/Drawer/index.cjs.map +1 -0
  90. package/dist/components/Drawer/index.d.cts +23 -0
  91. package/dist/components/Drawer/index.d.cts.map +1 -0
  92. package/dist/components/Drawer/index.d.ts +23 -0
  93. package/dist/components/Drawer/index.d.ts.map +1 -0
  94. package/dist/components/Drawer/index.js +85 -0
  95. package/dist/components/Drawer/index.js.map +1 -0
  96. package/dist/components/Drawer/style.css +147 -0
  97. package/dist/components/EntryPicker/index.cjs +2 -0
  98. package/dist/components/EntryPicker/index.cjs.map +1 -0
  99. package/dist/components/EntryPicker/index.d.cts +36 -0
  100. package/dist/components/EntryPicker/index.d.cts.map +1 -0
  101. package/dist/components/EntryPicker/index.d.ts +36 -0
  102. package/dist/components/EntryPicker/index.d.ts.map +1 -0
  103. package/dist/components/EntryPicker/index.js +178 -0
  104. package/dist/components/EntryPicker/index.js.map +1 -0
  105. package/dist/components/EntryPicker/style.css +162 -0
  106. package/dist/components/Field/index.cjs +2 -0
  107. package/dist/components/Field/index.cjs.map +1 -0
  108. package/dist/components/Field/index.d.cts +19 -0
  109. package/dist/components/Field/index.d.cts.map +1 -0
  110. package/dist/components/Field/index.d.ts +19 -0
  111. package/dist/components/Field/index.d.ts.map +1 -0
  112. package/dist/components/Field/index.js +41 -0
  113. package/dist/components/Field/index.js.map +1 -0
  114. package/dist/components/Field/style.css +100 -0
  115. package/dist/components/FieldAffix/index.cjs +2 -0
  116. package/dist/components/FieldAffix/index.cjs.map +1 -0
  117. package/dist/components/FieldAffix/index.d.cts +19 -0
  118. package/dist/components/FieldAffix/index.d.cts.map +1 -0
  119. package/dist/components/FieldAffix/index.d.ts +19 -0
  120. package/dist/components/FieldAffix/index.d.ts.map +1 -0
  121. package/dist/components/FieldAffix/index.js +45 -0
  122. package/dist/components/FieldAffix/index.js.map +1 -0
  123. package/dist/components/FieldAffix/style.css +54 -0
  124. package/dist/components/Grid/index.cjs +2 -0
  125. package/dist/components/Grid/index.cjs.map +1 -0
  126. package/dist/components/Grid/index.d.cts +44 -0
  127. package/dist/components/Grid/index.d.cts.map +1 -0
  128. package/dist/components/Grid/index.d.ts +44 -0
  129. package/dist/components/Grid/index.d.ts.map +1 -0
  130. package/dist/components/Grid/index.js +49 -0
  131. package/dist/components/Grid/index.js.map +1 -0
  132. package/dist/components/Grid/style.css +226 -0
  133. package/dist/components/Icon/icons.d.cts +64 -0
  134. package/dist/components/Icon/icons.d.cts.map +1 -0
  135. package/dist/components/Icon/icons.d.ts +64 -0
  136. package/dist/components/Icon/icons.d.ts.map +1 -0
  137. package/dist/components/Icon/index.cjs +1 -0
  138. package/dist/components/Icon/index.d.cts +15 -0
  139. package/dist/components/Icon/index.d.cts.map +1 -0
  140. package/dist/components/Icon/index.d.ts +15 -0
  141. package/dist/components/Icon/index.d.ts.map +1 -0
  142. package/dist/components/Icon/index.js +1 -0
  143. package/dist/components/Icon/style.css +10 -0
  144. package/dist/components/ImageCropper/index.cjs +2 -0
  145. package/dist/components/ImageCropper/index.cjs.map +1 -0
  146. package/dist/components/ImageCropper/index.d.cts +66 -0
  147. package/dist/components/ImageCropper/index.d.cts.map +1 -0
  148. package/dist/components/ImageCropper/index.d.ts +66 -0
  149. package/dist/components/ImageCropper/index.d.ts.map +1 -0
  150. package/dist/components/ImageCropper/index.js +263 -0
  151. package/dist/components/ImageCropper/index.js.map +1 -0
  152. package/dist/components/ImageCropper/style.css +160 -0
  153. package/dist/components/Menu/index.cjs +2 -0
  154. package/dist/components/Menu/index.cjs.map +1 -0
  155. package/dist/components/Menu/index.d.cts +35 -0
  156. package/dist/components/Menu/index.d.cts.map +1 -0
  157. package/dist/components/Menu/index.d.ts +35 -0
  158. package/dist/components/Menu/index.d.ts.map +1 -0
  159. package/dist/components/Menu/index.js +110 -0
  160. package/dist/components/Menu/index.js.map +1 -0
  161. package/dist/components/Menu/style.css +87 -0
  162. package/dist/components/Modal/index.cjs +2 -0
  163. package/dist/components/Modal/index.cjs.map +1 -0
  164. package/dist/components/Modal/index.d.cts +19 -0
  165. package/dist/components/Modal/index.d.cts.map +1 -0
  166. package/dist/components/Modal/index.d.ts +19 -0
  167. package/dist/components/Modal/index.d.ts.map +1 -0
  168. package/dist/components/Modal/index.js +84 -0
  169. package/dist/components/Modal/index.js.map +1 -0
  170. package/dist/components/Modal/style.css +106 -0
  171. package/dist/components/NumberField/index.cjs +2 -0
  172. package/dist/components/NumberField/index.cjs.map +1 -0
  173. package/dist/components/NumberField/index.d.cts +50 -0
  174. package/dist/components/NumberField/index.d.cts.map +1 -0
  175. package/dist/components/NumberField/index.d.ts +50 -0
  176. package/dist/components/NumberField/index.d.ts.map +1 -0
  177. package/dist/components/NumberField/index.js +124 -0
  178. package/dist/components/NumberField/index.js.map +1 -0
  179. package/dist/components/NumberField/style.css +85 -0
  180. package/dist/components/Popover/index.cjs +2 -0
  181. package/dist/components/Popover/index.cjs.map +1 -0
  182. package/dist/components/Popover/index.d.cts +28 -0
  183. package/dist/components/Popover/index.d.cts.map +1 -0
  184. package/dist/components/Popover/index.d.ts +28 -0
  185. package/dist/components/Popover/index.d.ts.map +1 -0
  186. package/dist/components/Popover/index.js +52 -0
  187. package/dist/components/Popover/index.js.map +1 -0
  188. package/dist/components/Popover/style.css +23 -0
  189. package/dist/components/RichTextEditor/index.cjs +2 -0
  190. package/dist/components/RichTextEditor/index.cjs.map +1 -0
  191. package/dist/components/RichTextEditor/index.d.cts +23 -0
  192. package/dist/components/RichTextEditor/index.d.cts.map +1 -0
  193. package/dist/components/RichTextEditor/index.d.ts +23 -0
  194. package/dist/components/RichTextEditor/index.d.ts.map +1 -0
  195. package/dist/components/RichTextEditor/index.js +175 -0
  196. package/dist/components/RichTextEditor/index.js.map +1 -0
  197. package/dist/components/RichTextEditor/style.css +136 -0
  198. package/dist/components/SearchField/index.cjs +2 -0
  199. package/dist/components/SearchField/index.cjs.map +1 -0
  200. package/dist/components/SearchField/index.d.cts +11 -0
  201. package/dist/components/SearchField/index.d.cts.map +1 -0
  202. package/dist/components/SearchField/index.d.ts +11 -0
  203. package/dist/components/SearchField/index.d.ts.map +1 -0
  204. package/dist/components/SearchField/index.js +49 -0
  205. package/dist/components/SearchField/index.js.map +1 -0
  206. package/dist/components/SearchField/style.css +27 -0
  207. package/dist/components/Select/index.cjs +2 -0
  208. package/dist/components/Select/index.cjs.map +1 -0
  209. package/dist/components/Select/index.d.cts +26 -0
  210. package/dist/components/Select/index.d.cts.map +1 -0
  211. package/dist/components/Select/index.d.ts +26 -0
  212. package/dist/components/Select/index.d.ts.map +1 -0
  213. package/dist/components/Select/index.js +129 -0
  214. package/dist/components/Select/index.js.map +1 -0
  215. package/dist/components/Select/style.css +88 -0
  216. package/dist/components/SelectionCard/index.cjs +2 -0
  217. package/dist/components/SelectionCard/index.cjs.map +1 -0
  218. package/dist/components/SelectionCard/index.d.cts +32 -0
  219. package/dist/components/SelectionCard/index.d.cts.map +1 -0
  220. package/dist/components/SelectionCard/index.d.ts +32 -0
  221. package/dist/components/SelectionCard/index.d.ts.map +1 -0
  222. package/dist/components/SelectionCard/index.js +71 -0
  223. package/dist/components/SelectionCard/index.js.map +1 -0
  224. package/dist/components/SelectionCard/style.css +133 -0
  225. package/dist/components/SideNav/index.cjs +2 -0
  226. package/dist/components/SideNav/index.cjs.map +1 -0
  227. package/dist/components/SideNav/index.d.cts +58 -0
  228. package/dist/components/SideNav/index.d.cts.map +1 -0
  229. package/dist/components/SideNav/index.d.ts +58 -0
  230. package/dist/components/SideNav/index.d.ts.map +1 -0
  231. package/dist/components/SideNav/index.js +113 -0
  232. package/dist/components/SideNav/index.js.map +1 -0
  233. package/dist/components/SideNav/style.css +184 -0
  234. package/dist/components/Skeleton/index.cjs +2 -0
  235. package/dist/components/Skeleton/index.cjs.map +1 -0
  236. package/dist/components/Skeleton/index.d.cts +21 -0
  237. package/dist/components/Skeleton/index.d.cts.map +1 -0
  238. package/dist/components/Skeleton/index.d.ts +21 -0
  239. package/dist/components/Skeleton/index.d.ts.map +1 -0
  240. package/dist/components/Skeleton/index.js +31 -0
  241. package/dist/components/Skeleton/index.js.map +1 -0
  242. package/dist/components/Skeleton/style.css +55 -0
  243. package/dist/components/Slider/index.cjs +2 -0
  244. package/dist/components/Slider/index.cjs.map +1 -0
  245. package/dist/components/Slider/index.d.cts +40 -0
  246. package/dist/components/Slider/index.d.cts.map +1 -0
  247. package/dist/components/Slider/index.d.ts +40 -0
  248. package/dist/components/Slider/index.d.ts.map +1 -0
  249. package/dist/components/Slider/index.js +117 -0
  250. package/dist/components/Slider/index.js.map +1 -0
  251. package/dist/components/Slider/style.css +156 -0
  252. package/dist/components/SortableList/index.cjs +2 -0
  253. package/dist/components/SortableList/index.cjs.map +1 -0
  254. package/dist/components/SortableList/index.d.cts +27 -0
  255. package/dist/components/SortableList/index.d.cts.map +1 -0
  256. package/dist/components/SortableList/index.d.ts +27 -0
  257. package/dist/components/SortableList/index.d.ts.map +1 -0
  258. package/dist/components/SortableList/index.js +85 -0
  259. package/dist/components/SortableList/index.js.map +1 -0
  260. package/dist/components/SortableList/style.css +71 -0
  261. package/dist/components/Stepper/index.cjs +2 -0
  262. package/dist/components/Stepper/index.cjs.map +1 -0
  263. package/dist/components/Stepper/index.d.cts +32 -0
  264. package/dist/components/Stepper/index.d.cts.map +1 -0
  265. package/dist/components/Stepper/index.d.ts +32 -0
  266. package/dist/components/Stepper/index.d.ts.map +1 -0
  267. package/dist/components/Stepper/index.js +69 -0
  268. package/dist/components/Stepper/index.js.map +1 -0
  269. package/dist/components/Stepper/style.css +154 -0
  270. package/dist/components/SubNav/index.cjs +2 -0
  271. package/dist/components/SubNav/index.cjs.map +1 -0
  272. package/dist/components/SubNav/index.d.cts +31 -0
  273. package/dist/components/SubNav/index.d.cts.map +1 -0
  274. package/dist/components/SubNav/index.d.ts +31 -0
  275. package/dist/components/SubNav/index.d.ts.map +1 -0
  276. package/dist/components/SubNav/index.js +62 -0
  277. package/dist/components/SubNav/index.js.map +1 -0
  278. package/dist/components/SubNav/style.css +86 -0
  279. package/dist/components/Switch/index.cjs +2 -0
  280. package/dist/components/Switch/index.cjs.map +1 -0
  281. package/dist/components/Switch/index.d.cts +12 -0
  282. package/dist/components/Switch/index.d.cts.map +1 -0
  283. package/dist/components/Switch/index.d.ts +12 -0
  284. package/dist/components/Switch/index.d.ts.map +1 -0
  285. package/dist/components/Switch/index.js +37 -0
  286. package/dist/components/Switch/index.js.map +1 -0
  287. package/dist/components/Switch/style.css +65 -0
  288. package/dist/components/Table/index.cjs +2 -0
  289. package/dist/components/Table/index.cjs.map +1 -0
  290. package/dist/components/Table/index.d.cts +54 -0
  291. package/dist/components/Table/index.d.cts.map +1 -0
  292. package/dist/components/Table/index.d.ts +54 -0
  293. package/dist/components/Table/index.d.ts.map +1 -0
  294. package/dist/components/Table/index.js +102 -0
  295. package/dist/components/Table/index.js.map +1 -0
  296. package/dist/components/Table/style.css +122 -0
  297. package/dist/components/TagsInput/index.cjs +2 -0
  298. package/dist/components/TagsInput/index.cjs.map +1 -0
  299. package/dist/components/TagsInput/index.d.cts +22 -0
  300. package/dist/components/TagsInput/index.d.cts.map +1 -0
  301. package/dist/components/TagsInput/index.d.ts +22 -0
  302. package/dist/components/TagsInput/index.d.ts.map +1 -0
  303. package/dist/components/TagsInput/index.js +60 -0
  304. package/dist/components/TagsInput/index.js.map +1 -0
  305. package/dist/components/TagsInput/style.css +83 -0
  306. package/dist/components/TextField/index.cjs +2 -0
  307. package/dist/components/TextField/index.cjs.map +1 -0
  308. package/dist/components/TextField/index.d.cts +11 -0
  309. package/dist/components/TextField/index.d.cts.map +1 -0
  310. package/dist/components/TextField/index.d.ts +11 -0
  311. package/dist/components/TextField/index.d.ts.map +1 -0
  312. package/dist/components/TextField/index.js +29 -0
  313. package/dist/components/TextField/index.js.map +1 -0
  314. package/dist/components/TextField/style.css +1 -0
  315. package/dist/components/Time/index.cjs +2 -0
  316. package/dist/components/Time/index.cjs.map +1 -0
  317. package/dist/components/Time/index.d.cts +35 -0
  318. package/dist/components/Time/index.d.cts.map +1 -0
  319. package/dist/components/Time/index.d.ts +35 -0
  320. package/dist/components/Time/index.d.ts.map +1 -0
  321. package/dist/components/Time/index.js +98 -0
  322. package/dist/components/Time/index.js.map +1 -0
  323. package/dist/components/Time/style.css +30 -0
  324. package/dist/components/Toast/index.cjs +2 -0
  325. package/dist/components/Toast/index.cjs.map +1 -0
  326. package/dist/components/Toast/index.d.cts +30 -0
  327. package/dist/components/Toast/index.d.cts.map +1 -0
  328. package/dist/components/Toast/index.d.ts +30 -0
  329. package/dist/components/Toast/index.d.ts.map +1 -0
  330. package/dist/components/Toast/index.js +96 -0
  331. package/dist/components/Toast/index.js.map +1 -0
  332. package/dist/components/Toast/style.css +80 -0
  333. package/dist/components/TopNav/index.cjs +2 -0
  334. package/dist/components/TopNav/index.cjs.map +1 -0
  335. package/dist/components/TopNav/index.d.cts +28 -0
  336. package/dist/components/TopNav/index.d.cts.map +1 -0
  337. package/dist/components/TopNav/index.d.ts +28 -0
  338. package/dist/components/TopNav/index.d.ts.map +1 -0
  339. package/dist/components/TopNav/index.js +45 -0
  340. package/dist/components/TopNav/index.js.map +1 -0
  341. package/dist/components/TopNav/style.css +80 -0
  342. package/dist/index.cjs +1 -0
  343. package/dist/index.d.cts +77 -0
  344. package/dist/index.d.cts.map +1 -0
  345. package/dist/index.d.ts +77 -0
  346. package/dist/index.d.ts.map +1 -0
  347. package/dist/index.js +38 -0
  348. package/dist/reset.css +15 -0
  349. package/dist/reset.css.d.ts +2 -0
  350. package/dist/styles.css +39 -0
  351. package/dist/styles.css.d.ts +2 -0
  352. package/dist/tokens.css +457 -0
  353. package/dist/tokens.css.d.ts +2 -0
  354. package/package.json +130 -4
@@ -0,0 +1,98 @@
1
+ import { Popover as e } from "../Popover/index.js";
2
+ import { forwardRef as t, useEffect as n, useId as r, useRef as i, useState as a } from "react";
3
+ import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
4
+ //#region src/components/Time/index.tsx
5
+ function l(...e) {
6
+ return e.filter(Boolean).join(" ");
7
+ }
8
+ var u = [
9
+ "Jan",
10
+ "Feb",
11
+ "Mar",
12
+ "Apr",
13
+ "May",
14
+ "Jun",
15
+ "Jul",
16
+ "Aug",
17
+ "Sep",
18
+ "Oct",
19
+ "Nov",
20
+ "Dec"
21
+ ], d = 6e4, f = 60 * d, p = 24 * f, m = 7 * p;
22
+ function h(e) {
23
+ return String(e).padStart(2, "0");
24
+ }
25
+ function g(e, t = {}) {
26
+ let { hasYear: n = !0 } = t, r = `${e.getDate()} ${u[e.getMonth()]}`;
27
+ return n ? `${r} ${e.getFullYear()}` : r;
28
+ }
29
+ function _(e, t = {}) {
30
+ let { hasTimeZone: n = !0 } = t, r = `${g(e)}, ${h(e.getHours())}:${h(e.getMinutes())}`;
31
+ if (!n) return r;
32
+ let i = new Intl.DateTimeFormat(void 0, { timeZoneName: "short" }).formatToParts(e).find((e) => e.type === "timeZoneName")?.value;
33
+ return i ? `${r} ${i}` : r;
34
+ }
35
+ function v(e, t = /* @__PURE__ */ new Date()) {
36
+ let n = t.getTime() - e.getTime();
37
+ if (n < 0) return g(e, { hasYear: e.getFullYear() !== t.getFullYear() });
38
+ if (n < d) return "Just now";
39
+ if (n < f) return `${Math.floor(n / d)}m ago`;
40
+ if (n < p) return `${Math.floor(n / f)}h ago`;
41
+ if (n < m) {
42
+ let e = Math.floor(n / p);
43
+ return `${e} ${e === 1 ? "day" : "days"} ago`;
44
+ }
45
+ return g(e, { hasYear: e.getFullYear() !== t.getFullYear() });
46
+ }
47
+ var y = t(function({ value: t, format: u = "auto", hasTooltip: d = !0, hasTimeZone: f = !0, now: p, refreshInterval: m = 3e4, className: h, tabIndex: y, title: b, onMouseEnter: x, onMouseLeave: S, onFocus: C, onBlur: w, onKeyDown: T, "aria-describedby": E, ...D }, O) {
48
+ let k = t instanceof Date ? t : new Date(t), A = i(null), [j, M] = a(!1), N = r(), [, P] = a(0);
49
+ if (n(() => {
50
+ if (u === "absolute" || p) return;
51
+ let e = window.setInterval(() => P((e) => e + 1), m);
52
+ return () => window.clearInterval(e);
53
+ }, [
54
+ u,
55
+ p,
56
+ m
57
+ ]), Number.isNaN(k.getTime())) return null;
58
+ let F = u === "absolute" ? g(k) : v(k, p ?? /* @__PURE__ */ new Date()), I = _(k, { hasTimeZone: f }), L = d && F !== I;
59
+ return /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s("time", {
60
+ ref: (e) => {
61
+ A.current = e, typeof O == "function" ? O(e) : O && (O.current = e);
62
+ },
63
+ dateTime: k.toISOString(),
64
+ suppressHydrationWarning: !0,
65
+ className: l("ds-time", !L && "ds-time--plain", h),
66
+ tabIndex: y ?? (L ? 0 : void 0),
67
+ "aria-describedby": [E, L && j && N].filter(Boolean).join(" ") || void 0,
68
+ title: b ?? (L ? void 0 : I),
69
+ onMouseEnter: (e) => {
70
+ x?.(e), L && !e.defaultPrevented && M(!0);
71
+ },
72
+ onMouseLeave: (e) => {
73
+ S?.(e), L && !e.defaultPrevented && M(!1);
74
+ },
75
+ onFocus: (e) => {
76
+ C?.(e), L && !e.defaultPrevented && M(!0);
77
+ },
78
+ onBlur: (e) => {
79
+ w?.(e), L && !e.defaultPrevented && M(!1);
80
+ },
81
+ onKeyDown: (e) => {
82
+ T?.(e), L && !e.defaultPrevented && e.key === "Escape" && M(!1);
83
+ },
84
+ ...D,
85
+ children: F
86
+ }), L && /* @__PURE__ */ s(e, {
87
+ anchorRef: A,
88
+ isOpen: j,
89
+ id: N,
90
+ role: "tooltip",
91
+ className: "ds-surface-raised ds-time-tooltip",
92
+ children: I
93
+ })] });
94
+ });
95
+ //#endregion
96
+ export { y as Time, g as formatAbsoluteDate, _ as formatAbsoluteTime, v as formatRelativeTime };
97
+
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_Fragment","cx","parts","MONTHS","MINUTE","HOUR","DAY","WEEK","pad","value","formatAbsoluteDate","options","stem","date","hasYear","formatAbsoluteTime","stamp","hasTimeZone","zone","part","formatRelativeTime","delta","now","days","Time","forwardRef","describedBy","rest","anchorRef","useRef","isOpen","setIsOpen","useState","tooltipId","useId","setTick","useEffect","format","id","t","refreshInterval","label","isTipped","hasTooltip","Fragment","node","ref","className","tabIndex","title","onMouseEnter","event","onMouseLeave","onFocus","onBlur","onKeyDown","Popover"],"sources":["../../../src/components/Time/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n} from \"react\";\nimport { Popover } from \"../Popover\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\n\nfunction pad(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\n/** Day before month, one order everywhere: `12 Jun 2026`. */\nexport function formatAbsoluteDate(date: Date, options: { hasYear?: boolean } = {}) {\n const { hasYear = true } = options;\n const stem = `${date.getDate()} ${MONTHS[date.getMonth()]}`;\n return hasYear ? `${stem} ${date.getFullYear()}` : stem;\n}\n\n/** The tooltip form: `6 Aug 2026, 11:05`, with the reader's zone appended. */\nexport function formatAbsoluteTime(date: Date, options: { hasTimeZone?: boolean } = {}) {\n const { hasTimeZone = true } = options;\n const stamp = `${formatAbsoluteDate(date)}, ${pad(date.getHours())}:${pad(date.getMinutes())}`;\n if (!hasTimeZone) return stamp;\n const zone = new Intl.DateTimeFormat(undefined, { timeZoneName: \"short\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value;\n return zone ? `${stamp} ${zone}` : stamp;\n}\n\n/**\n * Relative up to a week, absolute after. Future dates are always absolute — a\n * scheduled publish reads `12 Jun`, never `in 3 days`.\n */\nexport function formatRelativeTime(date: Date, now: Date = new Date()) {\n const delta = now.getTime() - date.getTime();\n if (delta < 0) {\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n }\n if (delta < MINUTE) return \"Just now\";\n if (delta < HOUR) return `${Math.floor(delta / MINUTE)}m ago`;\n if (delta < DAY) return `${Math.floor(delta / HOUR)}h ago`;\n if (delta < WEEK) {\n const days = Math.floor(delta / DAY);\n return `${days} ${days === 1 ? \"day\" : \"days\"} ago`;\n }\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n}\n\nexport type TimeFormat = \"auto\" | \"relative\" | \"absolute\";\n\nexport interface TimeProps extends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n /** The instant to print — Date, epoch ms, or an ISO string. */\n value: Date | string | number;\n /** `auto` ages the value; `absolute` always prints the date. */\n format?: TimeFormat;\n /** Show the absolute stamp on hover and focus. */\n hasTooltip?: boolean;\n /** Append the reader's time zone to the tooltip. */\n hasTimeZone?: boolean;\n /** Pin \"now\" — useful for tests and stories. */\n now?: Date;\n /** Re-render interval in ms while the value is still relative. */\n refreshInterval?: number;\n}\n\n/**\n * A machine-readable `<time>` that ages itself. One form per cell: relative or\n * absolute, never both side by side.\n */\nexport const Time = forwardRef<HTMLTimeElement, TimeProps>(function Time(\n {\n value,\n format = \"auto\",\n hasTooltip = true,\n hasTimeZone = true,\n now,\n refreshInterval = 30_000,\n className,\n tabIndex,\n title,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n \"aria-describedby\": describedBy,\n ...rest\n },\n ref,\n) {\n const date = value instanceof Date ? value : new Date(value);\n const anchorRef = useRef<HTMLTimeElement | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const tooltipId = useId();\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (format === \"absolute\" || now) return;\n const id = window.setInterval(() => setTick((t) => t + 1), refreshInterval);\n return () => window.clearInterval(id);\n }, [format, now, refreshInterval]);\n\n if (Number.isNaN(date.getTime())) return null;\n\n const reference = now ?? new Date();\n const label =\n format === \"absolute\"\n ? formatAbsoluteDate(date)\n : formatRelativeTime(date, reference);\n const stamp = formatAbsoluteTime(date, { hasTimeZone });\n const isTipped = hasTooltip && label !== stamp;\n\n return (\n <>\n <time\n ref={(node) => {\n anchorRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n dateTime={date.toISOString()}\n suppressHydrationWarning\n className={cx(\"ds-time\", !isTipped && \"ds-time--plain\", className)}\n tabIndex={tabIndex ?? (isTipped ? 0 : undefined)}\n aria-describedby={[describedBy, isTipped && isOpen && tooltipId].filter(Boolean).join(\" \") || undefined}\n title={title ?? (isTipped ? undefined : stamp)}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onFocus={(event) => {\n onFocus?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onBlur={(event) => {\n onBlur?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (isTipped && !event.defaultPrevented && event.key === \"Escape\") setIsOpen(false);\n }}\n {...rest}\n >\n {label}\n </time>\n {isTipped && (\n <Popover\n anchorRef={anchorRef}\n isOpen={isOpen}\n id={tooltipId}\n role=\"tooltip\"\n className=\"ds-surface-raised ds-time-tooltip\"\n >\n {stamp}\n </Popover>\n )}\n </>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ @layer components {
2
+ /* The dotted underline is the only affordance — no icon, no colour change. */
3
+ .ds-time {
4
+ font-variant-numeric: tabular-nums;
5
+ text-decoration: underline dotted
6
+ color-mix(in srgb, var(--color-text) 45%, transparent);
7
+ text-underline-offset: 3px;
8
+ cursor: help;
9
+ }
10
+
11
+ .ds-time:focus-visible {
12
+ outline: var(--control-border-width) solid var(--color-focus);
13
+ outline-offset: 2px;
14
+ border-radius: var(--radius-sm);
15
+ text-decoration: none;
16
+ }
17
+
18
+ .ds-time--plain {
19
+ text-decoration: none;
20
+ cursor: auto;
21
+ }
22
+
23
+ .ds-time-tooltip {
24
+ padding: var(--space-2) var(--space-3);
25
+ color: var(--color-text);
26
+ font-size: var(--font-size-xs);
27
+ white-space: nowrap;
28
+ font-variant-numeric: tabular-nums;
29
+ }
30
+ }
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.cjs"),t=require("../Button/index.cjs");let n=require("react"),r=require("react/jsx-runtime");var i={neutral:`info`,info:`info`,success:`check`,warning:`alert-triangle`,danger:`alert-triangle`},a=(0,n.forwardRef)(function({tone:n=`neutral`,title:a,description:o,onDismiss:s,className:c,...l},u){return(0,r.jsxs)(`div`,{ref:u,role:`status`,"data-tone":n===`neutral`?void 0:n,className:[`ds-toast`,c].filter(Boolean).join(` `),...l,children:[(0,r.jsx)(e.t,{name:i[n],size:20,className:`ds-toast__icon`}),(0,r.jsxs)(`div`,{className:`ds-toast__body`,children:[(0,r.jsx)(`span`,{className:`ds-toast__title`,children:a}),o&&(0,r.jsx)(`span`,{className:`ds-toast__description`,children:o})]}),s&&(0,r.jsx)(t.Button,{variant:`simple`,size:`sm`,isIconOnly:!0,iconStart:`x`,"aria-label":`Dismiss notification`,onClick:s})]})}),o=(0,n.createContext)(null);function s({children:e}){let[t,i]=(0,n.useState)([]),a=(0,n.useRef)(0),s=(0,n.useCallback)(e=>{i(t=>t.filter(t=>t.id!==e))},[]),l=(0,n.useCallback)(e=>{i(t=>[...t,{...e,id:a.current++}])},[]),u=(0,n.useMemo)(()=>({toast:l,dismiss:s}),[l,s]);return(0,r.jsxs)(o.Provider,{value:u,children:[e,(0,r.jsx)(c,{items:t,onDismiss:s})]})}function c({items:e,onDismiss:t}){return e.length===0?null:(0,r.jsx)(`div`,{className:`ds-toast-region`,role:`region`,"aria-label":`Notifications`,children:e.map(e=>(0,r.jsx)(l,{item:e,onDismiss:t},e.id))})}function l({item:e,onDismiss:t}){return(0,n.useEffect)(()=>{let n=window.setTimeout(()=>t(e.id),e.duration??5e3);return()=>window.clearTimeout(n)},[e,t]),(0,r.jsx)(a,{tone:e.tone,title:e.title,description:e.description,onDismiss:()=>t(e.id)})}function u(){let e=(0,n.useContext)(o);if(!e)throw Error(`useToast must be used inside a <ToastProvider>.`);return e}exports.Toast=a,exports.ToastProvider=s,exports.useToast=u;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","Icon","Button","createContext","useState","useRef","useCallback","useMemo","useContext","require_Icon","require_components_Button_index","react","react_jsx_runtime","TONE_ICON","Toast","rest","tone","className","title","description","onDismiss","ToastContext","ToastProvider","items","setItems","nextId","dismiss","current","item","id","toast","options","value","children","ToastRegion","TimedToast","timer","useToast","context"],"sources":["../../../src/components/Toast/index.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nexport type ToastTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst TONE_ICON: Record<ToastTone, IconName> = {\n neutral: \"info\",\n info: \"info\",\n success: \"check\",\n warning: \"alert-triangle\",\n danger: \"alert-triangle\",\n};\n\nexport interface ToastProps extends HTMLAttributes<HTMLDivElement> {\n tone?: ToastTone;\n title: string;\n description?: string;\n /** Renders a dismiss button. Omit for a toast that only times out. */\n onDismiss?: () => void;\n}\n\n/** One fact about something that already happened. Never a question. */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(function Toast(\n { tone = \"neutral\", title, description, onDismiss, className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"status\"\n data-tone={tone === \"neutral\" ? undefined : tone}\n className={[\"ds-toast\", className].filter(Boolean).join(\" \")}\n {...rest}\n >\n <Icon name={TONE_ICON[tone]} size={20} className=\"ds-toast__icon\" />\n <div className=\"ds-toast__body\">\n <span className=\"ds-toast__title\">{title}</span>\n {description && <span className=\"ds-toast__description\">{description}</span>}\n </div>\n {onDismiss && (\n <Button\n variant=\"simple\"\n size=\"sm\"\n isIconOnly\n iconStart=\"x\"\n aria-label=\"Dismiss notification\"\n onClick={onDismiss}\n />\n )}\n </div>\n );\n});\n\nexport interface ToastOptions {\n tone?: ToastTone;\n title: string;\n description?: string;\n /** Milliseconds before it dismisses itself. Defaults to `--toast-duration`. */\n duration?: number;\n}\n\ninterface ToastRecord extends ToastOptions {\n id: number;\n}\n\ninterface ToastContextValue {\n toast: (options: ToastOptions) => void;\n dismiss: (id: number) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nexport interface ToastProviderProps {\n children: ReactNode;\n}\n\n/** Mount once, near the root. Everything below it can call `useToast()`. */\nexport function ToastProvider({ children }: ToastProviderProps) {\n const [items, setItems] = useState<ToastRecord[]>([]);\n const nextId = useRef(0);\n\n const dismiss = useCallback((id: number) => {\n setItems((current) => current.filter((item) => item.id !== id));\n }, []);\n\n const toast = useCallback((options: ToastOptions) => {\n setItems((current) => [...current, { ...options, id: nextId.current++ }]);\n }, []);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastRegion items={items} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n}\n\nfunction ToastRegion({\n items,\n onDismiss,\n}: {\n items: ToastRecord[];\n onDismiss: (id: number) => void;\n}) {\n if (items.length === 0) return null;\n return (\n <div className=\"ds-toast-region\" role=\"region\" aria-label=\"Notifications\">\n {items.map((item) => (\n <TimedToast key={item.id} item={item} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction TimedToast({\n item,\n onDismiss,\n}: {\n item: ToastRecord;\n onDismiss: (id: number) => void;\n}) {\n useEffect(() => {\n const timer = window.setTimeout(() => onDismiss(item.id), item.duration ?? 5000);\n return () => window.clearTimeout(timer);\n }, [item, onDismiss]);\n\n return (\n <Toast\n tone={item.tone}\n title={item.title}\n description={item.description}\n onDismiss={() => onDismiss(item.id)}\n />\n );\n}\n\nexport function useToast(): ToastContextValue {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be used inside a <ToastProvider>.\");\n return context;\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type HTMLAttributes, type ReactNode } from "react";
2
+ export type ToastTone = "neutral" | "info" | "success" | "warning" | "danger";
3
+ export interface ToastProps extends HTMLAttributes<HTMLDivElement> {
4
+ tone?: ToastTone;
5
+ title: string;
6
+ description?: string;
7
+ /** Renders a dismiss button. Omit for a toast that only times out. */
8
+ onDismiss?: () => void;
9
+ }
10
+ /** One fact about something that already happened. Never a question. */
11
+ export declare const Toast: import("react").ForwardRefExoticComponent<ToastProps & import("react").RefAttributes<HTMLDivElement>>;
12
+ export interface ToastOptions {
13
+ tone?: ToastTone;
14
+ title: string;
15
+ description?: string;
16
+ /** Milliseconds before it dismisses itself. Defaults to `--toast-duration`. */
17
+ duration?: number;
18
+ }
19
+ interface ToastContextValue {
20
+ toast: (options: ToastOptions) => void;
21
+ dismiss: (id: number) => void;
22
+ }
23
+ export interface ToastProviderProps {
24
+ children: ReactNode;
25
+ }
26
+ /** Mount once, near the root. Everything below it can call `useToast()`. */
27
+ export declare function ToastProvider({ children }: ToastProviderProps): import("react").JSX.Element;
28
+ export declare function useToast(): ToastContextValue;
29
+ export {};
30
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Toast/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAU9E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wEAAwE;AACxE,eAAO,MAAM,KAAK,uGA6BhB,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,UAAU,iBAAiB;IACzB,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAoB7D;AAyCD,wBAAgB,QAAQ,IAAI,iBAAiB,CAI5C"}
@@ -0,0 +1,30 @@
1
+ import { type HTMLAttributes, type ReactNode } from "react";
2
+ export type ToastTone = "neutral" | "info" | "success" | "warning" | "danger";
3
+ export interface ToastProps extends HTMLAttributes<HTMLDivElement> {
4
+ tone?: ToastTone;
5
+ title: string;
6
+ description?: string;
7
+ /** Renders a dismiss button. Omit for a toast that only times out. */
8
+ onDismiss?: () => void;
9
+ }
10
+ /** One fact about something that already happened. Never a question. */
11
+ export declare const Toast: import("react").ForwardRefExoticComponent<ToastProps & import("react").RefAttributes<HTMLDivElement>>;
12
+ export interface ToastOptions {
13
+ tone?: ToastTone;
14
+ title: string;
15
+ description?: string;
16
+ /** Milliseconds before it dismisses itself. Defaults to `--toast-duration`. */
17
+ duration?: number;
18
+ }
19
+ interface ToastContextValue {
20
+ toast: (options: ToastOptions) => void;
21
+ dismiss: (id: number) => void;
22
+ }
23
+ export interface ToastProviderProps {
24
+ children: ReactNode;
25
+ }
26
+ /** Mount once, near the root. Everything below it can call `useToast()`. */
27
+ export declare function ToastProvider({ children }: ToastProviderProps): import("react").JSX.Element;
28
+ export declare function useToast(): ToastContextValue;
29
+ export {};
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAU9E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wEAAwE;AACxE,eAAO,MAAM,KAAK,uGA6BhB,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,UAAU,iBAAiB;IACzB,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAoB7D;AAyCD,wBAAgB,QAAQ,IAAI,iBAAiB,CAI5C"}
@@ -0,0 +1,96 @@
1
+ import { t as e } from "../../chunks/Icon-CGY1FNXT.js";
2
+ import { Button as t } from "../Button/index.js";
3
+ import { createContext as n, forwardRef as r, useCallback as i, useContext as a, useEffect as o, useMemo as s, useRef as c, useState as l } from "react";
4
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
+ //#region src/components/Toast/index.tsx
6
+ var f = {
7
+ neutral: "info",
8
+ info: "info",
9
+ success: "check",
10
+ warning: "alert-triangle",
11
+ danger: "alert-triangle"
12
+ }, p = r(function({ tone: n = "neutral", title: r, description: i, onDismiss: a, className: o, ...s }, c) {
13
+ return /* @__PURE__ */ d("div", {
14
+ ref: c,
15
+ role: "status",
16
+ "data-tone": n === "neutral" ? void 0 : n,
17
+ className: ["ds-toast", o].filter(Boolean).join(" "),
18
+ ...s,
19
+ children: [
20
+ /* @__PURE__ */ u(e, {
21
+ name: f[n],
22
+ size: 20,
23
+ className: "ds-toast__icon"
24
+ }),
25
+ /* @__PURE__ */ d("div", {
26
+ className: "ds-toast__body",
27
+ children: [/* @__PURE__ */ u("span", {
28
+ className: "ds-toast__title",
29
+ children: r
30
+ }), i && /* @__PURE__ */ u("span", {
31
+ className: "ds-toast__description",
32
+ children: i
33
+ })]
34
+ }),
35
+ a && /* @__PURE__ */ u(t, {
36
+ variant: "simple",
37
+ size: "sm",
38
+ isIconOnly: !0,
39
+ iconStart: "x",
40
+ "aria-label": "Dismiss notification",
41
+ onClick: a
42
+ })
43
+ ]
44
+ });
45
+ }), m = n(null);
46
+ function h({ children: e }) {
47
+ let [t, n] = l([]), r = c(0), a = i((e) => {
48
+ n((t) => t.filter((t) => t.id !== e));
49
+ }, []), o = i((e) => {
50
+ n((t) => [...t, {
51
+ ...e,
52
+ id: r.current++
53
+ }]);
54
+ }, []), f = s(() => ({
55
+ toast: o,
56
+ dismiss: a
57
+ }), [o, a]);
58
+ return /* @__PURE__ */ d(m.Provider, {
59
+ value: f,
60
+ children: [e, /* @__PURE__ */ u(g, {
61
+ items: t,
62
+ onDismiss: a
63
+ })]
64
+ });
65
+ }
66
+ function g({ items: e, onDismiss: t }) {
67
+ return e.length === 0 ? null : /* @__PURE__ */ u("div", {
68
+ className: "ds-toast-region",
69
+ role: "region",
70
+ "aria-label": "Notifications",
71
+ children: e.map((e) => /* @__PURE__ */ u(_, {
72
+ item: e,
73
+ onDismiss: t
74
+ }, e.id))
75
+ });
76
+ }
77
+ function _({ item: e, onDismiss: t }) {
78
+ return o(() => {
79
+ let n = window.setTimeout(() => t(e.id), e.duration ?? 5e3);
80
+ return () => window.clearTimeout(n);
81
+ }, [e, t]), /* @__PURE__ */ u(p, {
82
+ tone: e.tone,
83
+ title: e.title,
84
+ description: e.description,
85
+ onDismiss: () => t(e.id)
86
+ });
87
+ }
88
+ function v() {
89
+ let e = a(m);
90
+ if (!e) throw Error("useToast must be used inside a <ToastProvider>.");
91
+ return e;
92
+ }
93
+ //#endregion
94
+ export { p as Toast, h as ToastProvider, v as useToast };
95
+
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Icon","TONE_ICON","Toast","forwardRef","rest","tone","className","title","description","onDismiss","Button","ToastContext","createContext","ToastProvider","items","setItems","useState","nextId","useRef","dismiss","useCallback","current","item","id","toast","options","value","useMemo","children","ToastRegion","TimedToast","useEffect","timer","useToast","context","useContext"],"sources":["../../../src/components/Toast/index.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nexport type ToastTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst TONE_ICON: Record<ToastTone, IconName> = {\n neutral: \"info\",\n info: \"info\",\n success: \"check\",\n warning: \"alert-triangle\",\n danger: \"alert-triangle\",\n};\n\nexport interface ToastProps extends HTMLAttributes<HTMLDivElement> {\n tone?: ToastTone;\n title: string;\n description?: string;\n /** Renders a dismiss button. Omit for a toast that only times out. */\n onDismiss?: () => void;\n}\n\n/** One fact about something that already happened. Never a question. */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(function Toast(\n { tone = \"neutral\", title, description, onDismiss, className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"status\"\n data-tone={tone === \"neutral\" ? undefined : tone}\n className={[\"ds-toast\", className].filter(Boolean).join(\" \")}\n {...rest}\n >\n <Icon name={TONE_ICON[tone]} size={20} className=\"ds-toast__icon\" />\n <div className=\"ds-toast__body\">\n <span className=\"ds-toast__title\">{title}</span>\n {description && <span className=\"ds-toast__description\">{description}</span>}\n </div>\n {onDismiss && (\n <Button\n variant=\"simple\"\n size=\"sm\"\n isIconOnly\n iconStart=\"x\"\n aria-label=\"Dismiss notification\"\n onClick={onDismiss}\n />\n )}\n </div>\n );\n});\n\nexport interface ToastOptions {\n tone?: ToastTone;\n title: string;\n description?: string;\n /** Milliseconds before it dismisses itself. Defaults to `--toast-duration`. */\n duration?: number;\n}\n\ninterface ToastRecord extends ToastOptions {\n id: number;\n}\n\ninterface ToastContextValue {\n toast: (options: ToastOptions) => void;\n dismiss: (id: number) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nexport interface ToastProviderProps {\n children: ReactNode;\n}\n\n/** Mount once, near the root. Everything below it can call `useToast()`. */\nexport function ToastProvider({ children }: ToastProviderProps) {\n const [items, setItems] = useState<ToastRecord[]>([]);\n const nextId = useRef(0);\n\n const dismiss = useCallback((id: number) => {\n setItems((current) => current.filter((item) => item.id !== id));\n }, []);\n\n const toast = useCallback((options: ToastOptions) => {\n setItems((current) => [...current, { ...options, id: nextId.current++ }]);\n }, []);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastRegion items={items} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n}\n\nfunction ToastRegion({\n items,\n onDismiss,\n}: {\n items: ToastRecord[];\n onDismiss: (id: number) => void;\n}) {\n if (items.length === 0) return null;\n return (\n <div className=\"ds-toast-region\" role=\"region\" aria-label=\"Notifications\">\n {items.map((item) => (\n <TimedToast key={item.id} item={item} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction TimedToast({\n item,\n onDismiss,\n}: {\n item: ToastRecord;\n onDismiss: (id: number) => void;\n}) {\n useEffect(() => {\n const timer = window.setTimeout(() => onDismiss(item.id), item.duration ?? 5000);\n return () => window.clearTimeout(timer);\n }, [item, onDismiss]);\n\n return (\n <Toast\n tone={item.tone}\n title={item.title}\n description={item.description}\n onDismiss={() => onDismiss(item.id)}\n />\n );\n}\n\nexport function useToast(): ToastContextValue {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be used inside a <ToastProvider>.\");\n return context;\n}\n"],"mappings":";;;;;AAmBA,IAAMC,IAAyC;CAC7C,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;AACV,GAWaC,IAAQC,EAAuC,SAC1D,EAAE,UAAO,WAAW,UAAO,gBAAa,cAAW,cAAW,GAAGC,KACjE,GACA;CACA,OACE,kBAAC,OAAD;EACO;EACL,MAAK;EACL,aAAWC,MAAS,YAAY,KAAA,IAAYA;EAC5C,WAAW,CAAC,YAAYC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAC3D,GAAIF;EALN,UAAA;GAOE,kBAACJ,GAAD;IAAM,MAAMC,EAAUI;IAAO,MAAM;IAAI,WAAU;GAAkB,CAAA;GACnE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,QAAD;KAAM,WAAU;KAAmB,UAAAE;IAAY,CAAA,GAC9CC,KAAe,kBAAC,QAAD;KAAM,WAAU;KAAyB,UAAAA;IAAkB,CAAA,CACxE;;GACJC,KACC,kBAACC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,YAAA;IACA,WAAU;IACV,cAAW;IACX,SAASD;GACV,CAAA;EAEA;;AAET,CAAC,GAmBKE,IAAeC,EAAwC,IAAI;AAOjE,SAAgBC,EAAc,EAAE,eAAgC;CAC9D,IAAM,CAACC,GAAOC,KAAYC,EAAwB,CAAC,CAAC,GAC9CC,IAASC,EAAO,CAAC,GAEjBC,IAAUC,GAAa,MAAe;EAC1C,GAAU,MAAYC,EAAQ,QAAQ,MAASC,EAAK,OAAOC,CAAE,CAAC;CAChE,GAAG,CAAC,CAAC,GAECC,IAAQJ,GAAa,MAA0B;EACnD,GAAU,MAAY,CAAC,GAAGC,GAAS;GAAE,GAAGI;GAAS,IAAI,EAAO;EAAU,CAAC,CAAC;CAC1E,GAAG,CAAC,CAAC,GAECC,IAAQC,SAAe;EAAE;EAAO;CAAQ,IAAI,CAACH,GAAOL,CAAO,CAAC;CAElE,OACE,kBAACR,EAAa,UAAd;EAA8B;EAA9B,UAAA,CACGiB,GACD,kBAACC,GAAD;GAAoB;GAAO,WAAWV;EAAU,CAAA,CAC3B;;AAE3B;AAEA,SAASU,EAAY,EACnB,UACA,gBAIC;CAED,OADIf,EAAM,WAAW,IAAU,OAE7B,kBAAC,OAAD;EAAK,WAAU;EAAkB,MAAK;EAAS,cAAW;EACvD,UAAAA,EAAM,KAAK,MACV,kBAACgB,GAAD;GAAgC;GAAiB;EAAY,GAA5CR,EAAK,EAAuC,CAC9D;CACE,CAAA;AAET;AAEA,SAASQ,EAAW,EAClB,SACA,gBAIC;CAMD,OALAC,QAAgB;EACd,IAAMC,IAAQ,OAAO,iBAAiBvB,EAAUa,EAAK,EAAE,GAAGA,EAAK,YAAY,GAAI;EAC/E,aAAa,OAAO,aAAaU,CAAK;CACxC,GAAG,CAACV,GAAMb,CAAS,CAAC,GAGlB,kBAACP,GAAD;EACE,MAAMoB,EAAK;EACX,OAAOA,EAAK;EACZ,aAAaA,EAAK;EAClB,iBAAiBb,EAAUa,EAAK,EAAE;CACnC,CAAA;AAEL;AAEA,SAAgBW,IAA8B;CAC5C,IAAMC,IAAUC,EAAWxB,CAAY;CACvC,IAAI,CAACuB,GAAS,MAAU,MAAM,iDAAiD;CAC/E,OAAOA;AACT"}
@@ -0,0 +1,80 @@
1
+ @layer components {
2
+ .ds-toast-region {
3
+ position: fixed;
4
+ z-index: 80;
5
+ inset-block-end: var(--space-6);
6
+ inset-inline-end: var(--space-6);
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--space-3);
10
+ inline-size: min(var(--toast-width), calc(100vw - var(--space-8)));
11
+ }
12
+
13
+ .ds-toast {
14
+ --field-bg: var(--color-surface-raised);
15
+ --toast-tone: var(--color-text);
16
+
17
+ display: flex;
18
+ align-items: start;
19
+ gap: var(--space-3);
20
+ padding: var(--space-4);
21
+ background: var(--color-surface-raised);
22
+ border: var(--control-border-width) solid var(--toast-tone);
23
+ border-radius: var(--radius-md);
24
+ box-shadow: var(--shadow-lg);
25
+ animation: ds-toast-in var(--duration-panel) var(--ease-panel);
26
+ }
27
+
28
+ .ds-toast[data-tone="success"] {
29
+ --toast-tone: var(--color-success);
30
+ }
31
+
32
+ .ds-toast[data-tone="warning"] {
33
+ --toast-tone: var(--color-warning);
34
+ }
35
+
36
+ .ds-toast[data-tone="danger"] {
37
+ --toast-tone: var(--color-danger);
38
+ }
39
+
40
+ .ds-toast[data-tone="info"] {
41
+ --toast-tone: var(--color-primary);
42
+ }
43
+
44
+ .ds-toast__icon {
45
+ color: var(--toast-tone);
46
+ }
47
+
48
+ .ds-toast__body {
49
+ display: flex;
50
+ flex-direction: column;
51
+ gap: var(--space-1);
52
+ flex: 1;
53
+ min-inline-size: 0;
54
+ }
55
+
56
+ .ds-toast__title {
57
+ font-size: var(--font-size-sm);
58
+ font-weight: var(--font-weight-bold);
59
+ line-height: var(--line-height-tight);
60
+ }
61
+
62
+ .ds-toast__description {
63
+ color: var(--color-text-muted);
64
+ font-size: var(--font-size-sm);
65
+ line-height: var(--line-height-body);
66
+ }
67
+
68
+ @keyframes ds-toast-in {
69
+ from {
70
+ opacity: 0%;
71
+ translate: 0 var(--space-4);
72
+ }
73
+ }
74
+
75
+ @media (prefers-reduced-motion: reduce) {
76
+ .ds-toast {
77
+ animation: none;
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.cjs");let t=require("react"),n=require("react/jsx-runtime");var r=(0,t.forwardRef)(function({brand:e,actions:t,label:r=`Product`,className:i,children:a,...o},s){return(0,n.jsxs)(`header`,{ref:s,className:[`ds-topnav`,i].filter(Boolean).join(` `),...o,children:[e&&(0,n.jsx)(`div`,{className:`ds-topnav__brand`,children:e}),a&&(0,n.jsx)(`nav`,{className:`ds-topnav__nav`,"aria-label":r,children:(0,n.jsx)(`ul`,{className:`ds-topnav__list`,children:a})}),t&&(0,n.jsx)(`div`,{className:`ds-topnav__actions`,children:t})]})}),i=(0,t.forwardRef)(function({label:t,icon:r,isActive:i,className:a,...o},s){return(0,n.jsx)(`li`,{className:`ds-topnav__row`,children:(0,n.jsxs)(`a`,{ref:s,className:[`ds-topnav__item`,a].filter(Boolean).join(` `),"data-active":i||void 0,"aria-current":i?`page`:void 0,...o,children:[r&&(0,n.jsx)(e.t,{name:r}),t]})})});exports.TopNav=r,exports.TopNavItem=i;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","Icon","require_Icon","react","react_jsx_runtime","TopNav","rest","className","brand","children","label","actions","TopNavItem","isActive","icon"],"sources":["../../../src/components/TopNav/index.tsx"],"sourcesContent":["import {\n forwardRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nexport interface TopNavProps extends HTMLAttributes<HTMLElement> {\n /** Brand block or product mark, first in the bar. */\n brand?: ReactNode;\n /** Controls at the end: search, notifications, the account avatar. */\n actions?: ReactNode;\n /** Accessible name for the landmark. */\n label?: string;\n children?: ReactNode;\n}\n\n/**\n * The product bar: brand at the start, destinations in the middle, account\n * work at the end, one hairline rule under the whole thing. It sits above the\n * side rail, never inside it.\n */\nexport const TopNav = forwardRef<HTMLElement, TopNavProps>(function TopNav(\n { brand, actions, label = \"Product\", className, children, ...rest },\n ref,\n) {\n return (\n <header\n ref={ref}\n className={[\"ds-topnav\", className].filter(Boolean).join(\" \")}\n {...rest}\n >\n {brand && <div className=\"ds-topnav__brand\">{brand}</div>}\n {children && (\n <nav className=\"ds-topnav__nav\" aria-label={label}>\n <ul className=\"ds-topnav__list\">{children}</ul>\n </nav>\n )}\n {actions && <div className=\"ds-topnav__actions\">{actions}</div>}\n </header>\n );\n});\n\nexport interface TopNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n label: string;\n icon?: IconName;\n isActive?: boolean;\n}\n\n/**\n * One destination in the bar. The active item carries a solid underline —\n * the rail turned on its side, so selection reads the same as everywhere else.\n */\nexport const TopNavItem = forwardRef<HTMLAnchorElement, TopNavItemProps>(\n function TopNavItem({ label, icon, isActive, className, ...rest }, ref) {\n return (\n <li className=\"ds-topnav__row\">\n <a\n ref={ref}\n className={[\"ds-topnav__item\", className].filter(Boolean).join(\" \")}\n data-active={isActive || undefined}\n aria-current={isActive ? \"page\" : undefined}\n {...rest}\n >\n {icon && <Icon name={icon} />}\n {label}\n </a>\n </li>\n );\n },\n);\n"],"mappings":"A,2KAyBA,IAAaK,GAAA,EAASL,EAAAA,WAAAA,CAAqC,SACzD,CAAE,QAAO,UAAS,QAAQ,UAAW,YAAW,WAAU,GAAGM,GAC7D,EACA,CACA,OACE,EAAAF,EAAA,KAAA,CAAC,SAAD,CACO,MACL,UAAW,CAAC,YAAaG,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EAC5D,GAAID,EAHN,SAAA,CAKGE,IAAS,EAAAJ,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,mBAAoB,SAAAI,CAAW,CAAA,EACvDC,IACC,EAAAL,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBAAiB,aAAYM,EAC1C,UAAA,EAAAN,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,kBAAmB,UAAa,CAAA,CAC3C,CAAA,EAENO,IAAW,EAAAP,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,qBAAsB,SAAAO,CAAa,CAAA,CACxD,C,EAEZ,CAAC,EAYYC,GAAA,EAAaZ,EAAAA,WAAAA,CACxB,SAAoB,CAAE,QAAO,OAAM,WAAU,YAAW,GAAGM,GAAQ,EAAK,CACtE,OACE,EAAAF,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,iBACZ,UAAA,EAAAA,EAAA,KAAA,CAAC,IAAD,CACO,MACL,UAAW,CAAC,kBAAmBG,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EAClE,cAAaM,GAAY,IAAA,GACzB,eAAcA,EAAW,OAAS,IAAA,GAClC,GAAIP,EALN,SAAA,CAOGQ,IAAQ,EAAAV,EAAA,IAAA,CAACH,EAAAA,EAAD,CAAM,KAAMa,CAAO,CAAA,EAC3BJ,CACA,C,EACD,CAAA,CAER,CACF,E"}
@@ -0,0 +1,28 @@
1
+ import { type AnchorHTMLAttributes, type HTMLAttributes, type ReactNode } from "react";
2
+ import type { IconName } from "../Icon/icons.cjs";
3
+ export interface TopNavProps extends HTMLAttributes<HTMLElement> {
4
+ /** Brand block or product mark, first in the bar. */
5
+ brand?: ReactNode;
6
+ /** Controls at the end: search, notifications, the account avatar. */
7
+ actions?: ReactNode;
8
+ /** Accessible name for the landmark. */
9
+ label?: string;
10
+ children?: ReactNode;
11
+ }
12
+ /**
13
+ * The product bar: brand at the start, destinations in the middle, account
14
+ * work at the end, one hairline rule under the whole thing. It sits above the
15
+ * side rail, never inside it.
16
+ */
17
+ export declare const TopNav: import("react").ForwardRefExoticComponent<TopNavProps & import("react").RefAttributes<HTMLElement>>;
18
+ export interface TopNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
19
+ label: string;
20
+ icon?: IconName;
21
+ isActive?: boolean;
22
+ }
23
+ /**
24
+ * One destination in the bar. The active item carries a solid underline —
25
+ * the rail turned on its side, so selection reads the same as everywhere else.
26
+ */
27
+ export declare const TopNavItem: import("react").ForwardRefExoticComponent<TopNavItemProps & import("react").RefAttributes<HTMLAnchorElement>>;
28
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/TopNav/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,aAAa,CAAC;AAErB,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC9D,qDAAqD;IACrD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,qGAmBjB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,+GAiBtB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type AnchorHTMLAttributes, type HTMLAttributes, type ReactNode } from "react";
2
+ import type { IconName } from "../Icon/icons.js";
3
+ export interface TopNavProps extends HTMLAttributes<HTMLElement> {
4
+ /** Brand block or product mark, first in the bar. */
5
+ brand?: ReactNode;
6
+ /** Controls at the end: search, notifications, the account avatar. */
7
+ actions?: ReactNode;
8
+ /** Accessible name for the landmark. */
9
+ label?: string;
10
+ children?: ReactNode;
11
+ }
12
+ /**
13
+ * The product bar: brand at the start, destinations in the middle, account
14
+ * work at the end, one hairline rule under the whole thing. It sits above the
15
+ * side rail, never inside it.
16
+ */
17
+ export declare const TopNav: import("react").ForwardRefExoticComponent<TopNavProps & import("react").RefAttributes<HTMLElement>>;
18
+ export interface TopNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
19
+ label: string;
20
+ icon?: IconName;
21
+ isActive?: boolean;
22
+ }
23
+ /**
24
+ * One destination in the bar. The active item carries a solid underline —
25
+ * the rail turned on its side, so selection reads the same as everywhere else.
26
+ */
27
+ export declare const TopNavItem: import("react").ForwardRefExoticComponent<TopNavItemProps & import("react").RefAttributes<HTMLAnchorElement>>;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TopNav/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,aAAa,CAAC;AAErB,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC9D,qDAAqD;IACrD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,qGAmBjB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,+GAiBtB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { t as e } from "../../chunks/Icon-CGY1FNXT.js";
2
+ import { forwardRef as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/components/TopNav/index.tsx
5
+ var i = t(function({ brand: e, actions: t, label: i = "Product", className: a, children: o, ...s }, c) {
6
+ return /* @__PURE__ */ r("header", {
7
+ ref: c,
8
+ className: ["ds-topnav", a].filter(Boolean).join(" "),
9
+ ...s,
10
+ children: [
11
+ e && /* @__PURE__ */ n("div", {
12
+ className: "ds-topnav__brand",
13
+ children: e
14
+ }),
15
+ o && /* @__PURE__ */ n("nav", {
16
+ className: "ds-topnav__nav",
17
+ "aria-label": i,
18
+ children: /* @__PURE__ */ n("ul", {
19
+ className: "ds-topnav__list",
20
+ children: o
21
+ })
22
+ }),
23
+ t && /* @__PURE__ */ n("div", {
24
+ className: "ds-topnav__actions",
25
+ children: t
26
+ })
27
+ ]
28
+ });
29
+ }), a = t(function({ label: t, icon: i, isActive: a, className: o, ...s }, c) {
30
+ return /* @__PURE__ */ n("li", {
31
+ className: "ds-topnav__row",
32
+ children: /* @__PURE__ */ r("a", {
33
+ ref: c,
34
+ className: ["ds-topnav__item", o].filter(Boolean).join(" "),
35
+ "data-active": a || void 0,
36
+ "aria-current": a ? "page" : void 0,
37
+ ...s,
38
+ children: [i && /* @__PURE__ */ n(e, { name: i }), t]
39
+ })
40
+ });
41
+ });
42
+ //#endregion
43
+ export { i as TopNav, a as TopNavItem };
44
+
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Icon","TopNav","forwardRef","rest","className","brand","children","label","actions","TopNavItem","isActive","icon"],"sources":["../../../src/components/TopNav/index.tsx"],"sourcesContent":["import {\n forwardRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nexport interface TopNavProps extends HTMLAttributes<HTMLElement> {\n /** Brand block or product mark, first in the bar. */\n brand?: ReactNode;\n /** Controls at the end: search, notifications, the account avatar. */\n actions?: ReactNode;\n /** Accessible name for the landmark. */\n label?: string;\n children?: ReactNode;\n}\n\n/**\n * The product bar: brand at the start, destinations in the middle, account\n * work at the end, one hairline rule under the whole thing. It sits above the\n * side rail, never inside it.\n */\nexport const TopNav = forwardRef<HTMLElement, TopNavProps>(function TopNav(\n { brand, actions, label = \"Product\", className, children, ...rest },\n ref,\n) {\n return (\n <header\n ref={ref}\n className={[\"ds-topnav\", className].filter(Boolean).join(\" \")}\n {...rest}\n >\n {brand && <div className=\"ds-topnav__brand\">{brand}</div>}\n {children && (\n <nav className=\"ds-topnav__nav\" aria-label={label}>\n <ul className=\"ds-topnav__list\">{children}</ul>\n </nav>\n )}\n {actions && <div className=\"ds-topnav__actions\">{actions}</div>}\n </header>\n );\n});\n\nexport interface TopNavItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n label: string;\n icon?: IconName;\n isActive?: boolean;\n}\n\n/**\n * One destination in the bar. The active item carries a solid underline —\n * the rail turned on its side, so selection reads the same as everywhere else.\n */\nexport const TopNavItem = forwardRef<HTMLAnchorElement, TopNavItemProps>(\n function TopNavItem({ label, icon, isActive, className, ...rest }, ref) {\n return (\n <li className=\"ds-topnav__row\">\n <a\n ref={ref}\n className={[\"ds-topnav__item\", className].filter(Boolean).join(\" \")}\n data-active={isActive || undefined}\n aria-current={isActive ? \"page\" : undefined}\n {...rest}\n >\n {icon && <Icon name={icon} />}\n {label}\n </a>\n </li>\n );\n },\n);\n"],"mappings":";;;;AAyBA,IAAaC,IAASC,EAAqC,SACzD,EAAE,UAAO,YAAS,WAAQ,WAAW,cAAW,aAAU,GAAGC,KAC7D,GACA;CACA,OACE,kBAAC,UAAD;EACO;EACL,WAAW,CAAC,aAAaC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAC5D,GAAID;EAHN,UAAA;GAKGE,KAAS,kBAAC,OAAD;IAAK,WAAU;IAAoB,UAAAA;GAAW,CAAA;GACvDC,KACC,kBAAC,OAAD;IAAK,WAAU;IAAiB,cAAYC;IAC1C,UAAA,kBAAC,MAAD;KAAI,WAAU;KAAmB;IAAa,CAAA;GAC3C,CAAA;GAENC,KAAW,kBAAC,OAAD;IAAK,WAAU;IAAsB,UAAAA;GAAa,CAAA;EACxD;;AAEZ,CAAC,GAYYC,IAAaP,EACxB,SAAoB,EAAE,UAAO,SAAM,aAAU,cAAW,GAAGC,KAAQ,GAAK;CACtE,OACE,kBAAC,MAAD;EAAI,WAAU;EACZ,UAAA,kBAAC,KAAD;GACO;GACL,WAAW,CAAC,mBAAmBC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GAClE,eAAaM,KAAY,KAAA;GACzB,gBAAcA,IAAW,SAAS,KAAA;GAClC,GAAIP;GALN,UAAA,CAOGQ,KAAQ,kBAACX,GAAD,EAAM,MAAMW,EAAO,CAAA,GAC3BJ,CACA;;CACD,CAAA;AAER,CACF"}