@nlabs/gothamui 1.8.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 (426) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION.md +36 -0
  3. package/README.md +768 -0
  4. package/docs/assets/gothamui-app-architecture.svg +159 -0
  5. package/docs/assets/gothamui-logo.png +0 -0
  6. package/docs/assets/gothamui-logo.svg +42 -0
  7. package/docs/render-performance.md +34 -0
  8. package/lib/actions/GothamActions.d.ts +42 -0
  9. package/lib/actions/GothamActions.js +67 -0
  10. package/lib/actions/MarkdownActions.d.ts +4 -0
  11. package/lib/actions/MarkdownActions.js +48 -0
  12. package/lib/app.d.ts +1 -0
  13. package/lib/app.js +198 -0
  14. package/lib/components/Alert/Alert.d.ts +8 -0
  15. package/lib/components/Alert/Alert.js +24 -0
  16. package/lib/components/Alert/Alert.stories.js +59 -0
  17. package/lib/components/AuthRoute/AuthRoute.d.ts +3 -0
  18. package/lib/components/AuthRoute/AuthRoute.js +21 -0
  19. package/lib/components/AuthRoute/AuthRoute.stories.js +45 -0
  20. package/lib/components/AutocompleteField/AutocompleteField.d.ts +24 -0
  21. package/lib/components/AutocompleteField/AutocompleteField.js +148 -0
  22. package/lib/components/AutocompleteField/AutocompleteField.stories.js +62 -0
  23. package/lib/components/Avatar/Avatar.d.ts +29 -0
  24. package/lib/components/Avatar/Avatar.js +154 -0
  25. package/lib/components/Avatar/Avatar.stories.js +105 -0
  26. package/lib/components/Badge/Badge.d.ts +9 -0
  27. package/lib/components/Badge/Badge.js +22 -0
  28. package/lib/components/Badge/Badge.stories.js +53 -0
  29. package/lib/components/Breadcrumbs/Breadcrumbs.d.ts +19 -0
  30. package/lib/components/Breadcrumbs/Breadcrumbs.js +74 -0
  31. package/lib/components/Breadcrumbs/Breadcrumbs.stories.js +95 -0
  32. package/lib/components/Button/Button.d.ts +25 -0
  33. package/lib/components/Button/Button.js +157 -0
  34. package/lib/components/Button/Button.stories.js +119 -0
  35. package/lib/components/Card/Card.d.ts +8 -0
  36. package/lib/components/Card/Card.js +39 -0
  37. package/lib/components/Card/Card.stories.js +60 -0
  38. package/lib/components/CategoryGrid/CategoryGrid.d.ts +15 -0
  39. package/lib/components/CategoryGrid/CategoryGrid.js +42 -0
  40. package/lib/components/CategoryGrid/CategoryGrid.stories.js +35 -0
  41. package/lib/components/Chat/AudioMessage/AudioMessage.css +1 -0
  42. package/lib/components/Chat/AudioMessage/AudioMessage.d.ts +3 -0
  43. package/lib/components/Chat/AudioMessage/AudioMessage.js +28 -0
  44. package/lib/components/Chat/Avatar/Avatar.css +1 -0
  45. package/lib/components/Chat/Avatar/Avatar.d.ts +3 -0
  46. package/lib/components/Chat/Avatar/Avatar.js +72 -0
  47. package/lib/components/Chat/Button/Button.css +1 -0
  48. package/lib/components/Chat/Button/Button.d.ts +3 -0
  49. package/lib/components/Chat/Button/Button.js +37 -0
  50. package/lib/components/Chat/Chat.stories.js +688 -0
  51. package/lib/components/Chat/ChatItem/ChatItem.css +1 -0
  52. package/lib/components/Chat/ChatItem/ChatItem.d.ts +3 -0
  53. package/lib/components/Chat/ChatItem/ChatItem.js +183 -0
  54. package/lib/components/Chat/ChatList/ChatList.css +1 -0
  55. package/lib/components/Chat/ChatList/ChatList.d.ts +3 -0
  56. package/lib/components/Chat/ChatList/ChatList.js +84 -0
  57. package/lib/components/Chat/Circle/Circle.d.ts +3 -0
  58. package/lib/components/Chat/Circle/Circle.js +27 -0
  59. package/lib/components/Chat/Dropdown/Dropdown.css +1 -0
  60. package/lib/components/Chat/Dropdown/Dropdown.d.ts +3 -0
  61. package/lib/components/Chat/Dropdown/Dropdown.js +66 -0
  62. package/lib/components/Chat/FileMessage/FileMessage.css +1 -0
  63. package/lib/components/Chat/FileMessage/FileMessage.d.ts +3 -0
  64. package/lib/components/Chat/FileMessage/FileMessage.js +77 -0
  65. package/lib/components/Chat/Input/Input.css +1 -0
  66. package/lib/components/Chat/Input/Input.d.ts +3 -0
  67. package/lib/components/Chat/Input/Input.js +108 -0
  68. package/lib/components/Chat/LocationMessage/LocationMessage.css +1 -0
  69. package/lib/components/Chat/LocationMessage/LocationMessage.d.ts +3 -0
  70. package/lib/components/Chat/LocationMessage/LocationMessage.js +36 -0
  71. package/lib/components/Chat/MeetingItem/MeetingItem.css +1 -0
  72. package/lib/components/Chat/MeetingItem/MeetingItem.d.ts +3 -0
  73. package/lib/components/Chat/MeetingItem/MeetingItem.js +106 -0
  74. package/lib/components/Chat/MeetingLink/MeetingLink.css +1 -0
  75. package/lib/components/Chat/MeetingLink/MeetingLink.d.ts +3 -0
  76. package/lib/components/Chat/MeetingLink/MeetingLink.js +26 -0
  77. package/lib/components/Chat/MeetingList/MeetingList.css +1 -0
  78. package/lib/components/Chat/MeetingList/MeetingList.d.ts +3 -0
  79. package/lib/components/Chat/MeetingList/MeetingList.js +52 -0
  80. package/lib/components/Chat/MeetingMessage/MeetingMessage.css +1 -0
  81. package/lib/components/Chat/MeetingMessage/MeetingMessage.d.ts +3 -0
  82. package/lib/components/Chat/MeetingMessage/MeetingMessage.js +227 -0
  83. package/lib/components/Chat/MessageBox/MessageBox.css +1 -0
  84. package/lib/components/Chat/MessageBox/MessageBox.d.ts +3 -0
  85. package/lib/components/Chat/MessageBox/MessageBox.js +263 -0
  86. package/lib/components/Chat/MessageList/MessageList.css +1 -0
  87. package/lib/components/Chat/MessageList/MessageList.d.ts +2 -0
  88. package/lib/components/Chat/MessageList/MessageList.js +196 -0
  89. package/lib/components/Chat/Navbar/Navbar.css +1 -0
  90. package/lib/components/Chat/Navbar/Navbar.d.ts +3 -0
  91. package/lib/components/Chat/Navbar/Navbar.js +21 -0
  92. package/lib/components/Chat/PhotoMessage/PhotoMessage.css +1 -0
  93. package/lib/components/Chat/PhotoMessage/PhotoMessage.d.ts +3 -0
  94. package/lib/components/Chat/PhotoMessage/PhotoMessage.js +73 -0
  95. package/lib/components/Chat/Popup/Popup.css +1 -0
  96. package/lib/components/Chat/Popup/Popup.d.ts +3 -0
  97. package/lib/components/Chat/Popup/Popup.js +45 -0
  98. package/lib/components/Chat/README.md +50 -0
  99. package/lib/components/Chat/ReplyMessage/ReplyMessage.css +1 -0
  100. package/lib/components/Chat/ReplyMessage/ReplyMessage.d.ts +3 -0
  101. package/lib/components/Chat/ReplyMessage/ReplyMessage.js +42 -0
  102. package/lib/components/Chat/SideBar/SideBar.css +1 -0
  103. package/lib/components/Chat/SideBar/SideBar.d.ts +3 -0
  104. package/lib/components/Chat/SideBar/SideBar.js +21 -0
  105. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.css +1 -0
  106. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.d.ts +3 -0
  107. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.js +28 -0
  108. package/lib/components/Chat/SystemMessage/SystemMessage.css +1 -0
  109. package/lib/components/Chat/SystemMessage/SystemMessage.d.ts +3 -0
  110. package/lib/components/Chat/SystemMessage/SystemMessage.js +14 -0
  111. package/lib/components/Chat/VideoMessage/VideoMessage.css +1 -0
  112. package/lib/components/Chat/VideoMessage/VideoMessage.d.ts +3 -0
  113. package/lib/components/Chat/VideoMessage/VideoMessage.js +88 -0
  114. package/lib/components/Chat/assets/img/leftArrow.svg +6 -0
  115. package/lib/components/Chat/assets/img/rightArrow.svg +6 -0
  116. package/lib/components/Chat/index.d.ts +25 -0
  117. package/lib/components/Chat/index.js +27 -0
  118. package/lib/components/Chat/type.d.js +52 -0
  119. package/lib/components/Chat/utils/formatRelativeDate.d.ts +4 -0
  120. package/lib/components/Chat/utils/formatRelativeDate.js +110 -0
  121. package/lib/components/Checkbox/Checkbox.d.ts +15 -0
  122. package/lib/components/Checkbox/Checkbox.js +106 -0
  123. package/lib/components/Checkbox/Checkbox.stories.js +51 -0
  124. package/lib/components/ComponentUtils/renderWithAsChild.d.ts +9 -0
  125. package/lib/components/ComponentUtils/renderWithAsChild.js +27 -0
  126. package/lib/components/Container/Container.d.ts +7 -0
  127. package/lib/components/Container/Container.js +16 -0
  128. package/lib/components/Container/Container.stories.js +36 -0
  129. package/lib/components/DateField/DateField.d.ts +22 -0
  130. package/lib/components/DateField/DateField.js +145 -0
  131. package/lib/components/DateField/DateField.stories.js +125 -0
  132. package/lib/components/DateField/DatePicker.d.ts +9 -0
  133. package/lib/components/DateField/DatePicker.js +205 -0
  134. package/lib/components/DateField/DatePicker.stories.js +33 -0
  135. package/lib/components/DescriptionList/DescriptionList.d.ts +4 -0
  136. package/lib/components/DescriptionList/DescriptionList.js +19 -0
  137. package/lib/components/DescriptionList/DescriptionList.stories.js +34 -0
  138. package/lib/components/Dialog/Dialog.d.ts +25 -0
  139. package/lib/components/Dialog/Dialog.js +66 -0
  140. package/lib/components/Dialog/Dialog.stories.js +88 -0
  141. package/lib/components/DropUpload/DropUpload.d.ts +37 -0
  142. package/lib/components/DropUpload/DropUpload.js +323 -0
  143. package/lib/components/DropUpload/DropUpload.stories.js +48 -0
  144. package/lib/components/Empty/Empty.d.ts +11 -0
  145. package/lib/components/Empty/Empty.js +39 -0
  146. package/lib/components/Empty/Empty.stories.js +52 -0
  147. package/lib/components/EmptyState/EmptyState.d.ts +15 -0
  148. package/lib/components/EmptyState/EmptyState.js +44 -0
  149. package/lib/components/EmptyState/EmptyState.stories.js +36 -0
  150. package/lib/components/ErrorMessage/ErrorMessage.d.ts +7 -0
  151. package/lib/components/ErrorMessage/ErrorMessage.js +20 -0
  152. package/lib/components/ErrorMessage/ErrorMessage.stories.js +25 -0
  153. package/lib/components/FaqSection/FaqSection.d.ts +14 -0
  154. package/lib/components/FaqSection/FaqSection.js +37 -0
  155. package/lib/components/FaqSection/FaqSection.stories.js +31 -0
  156. package/lib/components/Fieldset/Fieldset.d.ts +21 -0
  157. package/lib/components/Fieldset/Fieldset.js +39 -0
  158. package/lib/components/Fieldset/Fieldset.stories.js +42 -0
  159. package/lib/components/Footer/Footer.d.ts +26 -0
  160. package/lib/components/Footer/Footer.js +119 -0
  161. package/lib/components/Footer/Footer.stories.js +184 -0
  162. package/lib/components/Form/Form.d.ts +42 -0
  163. package/lib/components/Form/Form.js +198 -0
  164. package/lib/components/Form/Form.stories.js +65 -0
  165. package/lib/components/Form/FormContext.d.ts +35 -0
  166. package/lib/components/Form/FormContext.js +71 -0
  167. package/lib/components/GothamRoute/GothamRoute.d.ts +0 -0
  168. package/lib/components/GothamRoute/GothamRoute.js +56 -0
  169. package/lib/components/GothamRouter/GothamRouter.d.ts +0 -0
  170. package/lib/components/GothamRouter/GothamRouter.js +52 -0
  171. package/lib/components/Heading/Heading.d.ts +7 -0
  172. package/lib/components/Heading/Heading.js +20 -0
  173. package/lib/components/Heading/Heading.stories.js +51 -0
  174. package/lib/components/IncentiveGrid/IncentiveGrid.d.ts +15 -0
  175. package/lib/components/IncentiveGrid/IncentiveGrid.js +34 -0
  176. package/lib/components/IncentiveGrid/IncentiveGrid.stories.js +41 -0
  177. package/lib/components/InputField/InputField.d.ts +25 -0
  178. package/lib/components/InputField/InputField.js +68 -0
  179. package/lib/components/InputField/InputField.stories.js +58 -0
  180. package/lib/components/Item/Item.d.ts +25 -0
  181. package/lib/components/Item/Item.js +79 -0
  182. package/lib/components/Item/Item.stories.js +94 -0
  183. package/lib/components/Kbd/Kbd.d.ts +2 -0
  184. package/lib/components/Kbd/Kbd.js +9 -0
  185. package/lib/components/Kbd/Kbd.stories.js +24 -0
  186. package/lib/components/Label/Label.d.ts +11 -0
  187. package/lib/components/Label/Label.js +23 -0
  188. package/lib/components/Label/Label.stories.js +38 -0
  189. package/lib/components/Link/Link.d.ts +7 -0
  190. package/lib/components/Link/Link.js +13 -0
  191. package/lib/components/Link/Link.stories.js +28 -0
  192. package/lib/components/ListContainer/ListContainer.d.ts +8 -0
  193. package/lib/components/ListContainer/ListContainer.js +14 -0
  194. package/lib/components/ListContainer/ListContainer.stories.js +45 -0
  195. package/lib/components/Loader/Loader.d.ts +9 -0
  196. package/lib/components/Loader/Loader.js +36 -0
  197. package/lib/components/Loader/Loader.stories.js +94 -0
  198. package/lib/components/LogoCloud/LogoCloud.d.ts +15 -0
  199. package/lib/components/LogoCloud/LogoCloud.js +43 -0
  200. package/lib/components/LogoCloud/LogoCloud.stories.js +28 -0
  201. package/lib/components/Markdown/Markdown.d.ts +8 -0
  202. package/lib/components/Markdown/Markdown.js +64 -0
  203. package/lib/components/Markdown/Markdown.stories.js +34 -0
  204. package/lib/components/MediaLightbox/MediaLightbox.d.ts +22 -0
  205. package/lib/components/MediaLightbox/MediaLightbox.js +80 -0
  206. package/lib/components/MediaObject/MediaObject.d.ts +8 -0
  207. package/lib/components/MediaObject/MediaObject.js +37 -0
  208. package/lib/components/MediaObject/MediaObject.stories.js +28 -0
  209. package/lib/components/Navbar/Navbar.d.ts +43 -0
  210. package/lib/components/Navbar/Navbar.js +213 -0
  211. package/lib/components/Navbar/Navbar.stories.js +235 -0
  212. package/lib/components/NotFound/NotFound.d.ts +34 -0
  213. package/lib/components/NotFound/NotFound.js +351 -0
  214. package/lib/components/NotFound/NotFound.stories.js +80 -0
  215. package/lib/components/Notify/Notify.d.ts +18 -0
  216. package/lib/components/Notify/Notify.js +178 -0
  217. package/lib/components/Notify/Notify.stories.js +148 -0
  218. package/lib/components/Notify/NotifyExample.d.ts +1 -0
  219. package/lib/components/Notify/NotifyExample.js +174 -0
  220. package/lib/components/Notify/README.md +103 -0
  221. package/lib/components/Pagination/Pagination.d.ts +18 -0
  222. package/lib/components/Pagination/Pagination.js +225 -0
  223. package/lib/components/Pagination/Pagination.stories.js +69 -0
  224. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.d.ts +12 -0
  225. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.js +88 -0
  226. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.js +16 -0
  227. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.d.ts +18 -0
  228. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.js +113 -0
  229. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.stories.js +88 -0
  230. package/lib/components/Pricing/Pricing.d.ts +78 -0
  231. package/lib/components/Pricing/Pricing.js +764 -0
  232. package/lib/components/Pricing/Pricing.stories.js +146 -0
  233. package/lib/components/ProductGrid/ProductGrid.d.ts +23 -0
  234. package/lib/components/ProductGrid/ProductGrid.js +79 -0
  235. package/lib/components/ProductGrid/ProductGrid.stories.js +50 -0
  236. package/lib/components/ProgressSteps/ProgressSteps.d.ts +13 -0
  237. package/lib/components/ProgressSteps/ProgressSteps.js +51 -0
  238. package/lib/components/ProgressSteps/ProgressSteps.stories.js +35 -0
  239. package/lib/components/RadioField/RadioField.d.ts +16 -0
  240. package/lib/components/RadioField/RadioField.js +63 -0
  241. package/lib/components/RadioField/RadioField.stories.js +140 -0
  242. package/lib/components/ReviewList/ReviewList.d.ts +15 -0
  243. package/lib/components/ReviewList/ReviewList.js +51 -0
  244. package/lib/components/ReviewList/ReviewList.stories.js +29 -0
  245. package/lib/components/SectionHeader/SectionHeader.d.ts +9 -0
  246. package/lib/components/SectionHeader/SectionHeader.js +36 -0
  247. package/lib/components/SectionHeader/SectionHeader.stories.js +35 -0
  248. package/lib/components/SelectField/SelectField.d.ts +18 -0
  249. package/lib/components/SelectField/SelectField.js +145 -0
  250. package/lib/components/SelectField/SelectField.stories.js +155 -0
  251. package/lib/components/SelectField/SelectOption.d.ts +13 -0
  252. package/lib/components/SelectField/SelectOption.js +40 -0
  253. package/lib/components/SelectField/SelectOption.stories.js +40 -0
  254. package/lib/components/Separator/Separator.d.ts +6 -0
  255. package/lib/components/Separator/Separator.js +13 -0
  256. package/lib/components/Separator/Separator.stories.js +70 -0
  257. package/lib/components/Skeleton/Skeleton.d.ts +2 -0
  258. package/lib/components/Skeleton/Skeleton.js +9 -0
  259. package/lib/components/Skeleton/Skeleton.stories.js +24 -0
  260. package/lib/components/Svg/Svg.d.ts +9 -0
  261. package/lib/components/Svg/Svg.js +25 -0
  262. package/lib/components/Svg/Svg.stories.js +34 -0
  263. package/lib/components/Switch/Switch.d.ts +12 -0
  264. package/lib/components/Switch/Switch.js +54 -0
  265. package/lib/components/Switch/Switch.stories.js +61 -0
  266. package/lib/components/Table/Table.d.ts +18 -0
  267. package/lib/components/Table/Table.js +99 -0
  268. package/lib/components/Table/Table.stories.js +79 -0
  269. package/lib/components/Tabs/Tabs.d.ts +17 -0
  270. package/lib/components/Tabs/Tabs.js +85 -0
  271. package/lib/components/Tabs/Tabs.stories.js +45 -0
  272. package/lib/components/Text/Text.d.ts +5 -0
  273. package/lib/components/Text/Text.js +24 -0
  274. package/lib/components/Text/Text.stories.js +35 -0
  275. package/lib/components/TextField/TextField.d.ts +31 -0
  276. package/lib/components/TextField/TextField.js +91 -0
  277. package/lib/components/TextField/TextField.stories.js +158 -0
  278. package/lib/components/Textarea/Textarea.d.ts +5 -0
  279. package/lib/components/Textarea/Textarea.js +10 -0
  280. package/lib/components/Textarea/Textarea.stories.js +32 -0
  281. package/lib/components/index.d.ts +60 -0
  282. package/lib/components/index.js +62 -0
  283. package/lib/config/appConfig.d.ts +5 -0
  284. package/lib/config/appConfig.js +20 -0
  285. package/lib/constants/AuthConstants.d.ts +8 -0
  286. package/lib/constants/AuthConstants.js +9 -0
  287. package/lib/constants/GothamConstants.d.ts +24 -0
  288. package/lib/constants/GothamConstants.js +25 -0
  289. package/lib/constants/MarkdownConstants.d.ts +8 -0
  290. package/lib/constants/MarkdownConstants.js +9 -0
  291. package/lib/constants/MessageConstants.d.ts +10 -0
  292. package/lib/constants/MessageConstants.js +11 -0
  293. package/lib/docs/analytics.md +231 -0
  294. package/lib/docs/api-reference.md +364 -0
  295. package/lib/docs/comparison.md +83 -0
  296. package/lib/docs/containers.md +11 -0
  297. package/lib/docs/gettingStarted.md +338 -0
  298. package/lib/docs/payments.md +79 -0
  299. package/lib/editor/CodeEditor.d.ts +11 -0
  300. package/lib/editor/CodeEditor.js +15 -0
  301. package/lib/editor/CodeEditor.stories.js +24 -0
  302. package/lib/editor/index.d.ts +1 -0
  303. package/lib/editor/index.js +3 -0
  304. package/lib/errors/UserError.d.ts +8 -0
  305. package/lib/errors/UserError.js +12 -0
  306. package/lib/examples/OptimizedFormExample.d.ts +1 -0
  307. package/lib/examples/OptimizedFormExample.js +130 -0
  308. package/lib/form/index.d.ts +11 -0
  309. package/lib/form/index.js +13 -0
  310. package/lib/hooks/useIsMobile.d.ts +1 -0
  311. package/lib/hooks/useIsMobile.js +12 -0
  312. package/lib/i18n/index.d.ts +8 -0
  313. package/lib/i18n/index.js +7 -0
  314. package/lib/icons/Dual Ring-1s-100px.svg +1 -0
  315. package/lib/icons/gotham-logo.svg +17 -0
  316. package/lib/icons/gotham.svg +8 -0
  317. package/lib/icons/index.d.ts +5 -0
  318. package/lib/icons/index.js +6 -0
  319. package/lib/icons/pencil.svg +6 -0
  320. package/lib/img/arkhamjs-logo.png +0 -0
  321. package/lib/img/logo.png +0 -0
  322. package/lib/index.d.ts +25 -0
  323. package/lib/index.js +25 -0
  324. package/lib/router/index.d.ts +5 -0
  325. package/lib/router/index.js +6 -0
  326. package/lib/stores/GothamAppStore.d.ts +35 -0
  327. package/lib/stores/GothamAppStore.js +70 -0
  328. package/lib/stories/Button.d.ts +28 -0
  329. package/lib/stories/Button.js +22 -0
  330. package/lib/stories/Header.d.ts +12 -0
  331. package/lib/stories/Header.js +78 -0
  332. package/lib/stories/Page.d.ts +3 -0
  333. package/lib/stories/Page.js +108 -0
  334. package/lib/stories/assets/accessibility.png +0 -0
  335. package/lib/stories/assets/accessibility.svg +5 -0
  336. package/lib/stories/assets/addon-library.png +0 -0
  337. package/lib/stories/assets/assets.png +0 -0
  338. package/lib/stories/assets/context.png +0 -0
  339. package/lib/stories/assets/discord.svg +15 -0
  340. package/lib/stories/assets/docs.png +0 -0
  341. package/lib/stories/assets/figma-plugin.png +0 -0
  342. package/lib/stories/assets/github.svg +3 -0
  343. package/lib/stories/assets/share.png +0 -0
  344. package/lib/stories/assets/styling.png +0 -0
  345. package/lib/stories/assets/testing.png +0 -0
  346. package/lib/stories/assets/theming.png +0 -0
  347. package/lib/stories/assets/tutorials.svg +12 -0
  348. package/lib/stories/assets/youtube.svg +4 -0
  349. package/lib/stories/button.css +1 -0
  350. package/lib/stories/header.css +1 -0
  351. package/lib/stories/page.css +1 -0
  352. package/lib/styles/chat.css +1 -0
  353. package/lib/styles/index.css +2 -0
  354. package/lib/styles/tailwind.css +1 -0
  355. package/lib/types/assets.d.js +2 -0
  356. package/lib/types/gotham.d.ts +12 -0
  357. package/lib/types/gotham.js +3 -0
  358. package/lib/types/vitest-globals.d.js +3 -0
  359. package/lib/utils/GothamContext.d.ts +14 -0
  360. package/lib/utils/GothamContext.js +14 -0
  361. package/lib/utils/awsRum.d.ts +23 -0
  362. package/lib/utils/awsRum.js +50 -0
  363. package/lib/utils/colorUtils.d.ts +20 -0
  364. package/lib/utils/colorUtils.js +499 -0
  365. package/lib/utils/contentUtils.d.ts +2 -0
  366. package/lib/utils/contentUtils.js +18 -0
  367. package/lib/utils/i18nUtil.d.ts +1 -0
  368. package/lib/utils/i18nUtil.js +7 -0
  369. package/lib/utils/imageUtils.d.ts +5 -0
  370. package/lib/utils/imageUtils.js +48 -0
  371. package/lib/utils/interactionAnalytics.d.ts +10 -0
  372. package/lib/utils/interactionAnalytics.js +142 -0
  373. package/lib/utils/navEventQueue.d.ts +6 -0
  374. package/lib/utils/navEventQueue.js +50 -0
  375. package/lib/utils/refUtils.d.ts +2 -0
  376. package/lib/utils/refUtils.js +11 -0
  377. package/lib/utils/routeUtils.d.ts +12 -0
  378. package/lib/utils/routeUtils.js +109 -0
  379. package/lib/utils/sizeUtils.d.ts +5 -0
  380. package/lib/utils/sizeUtils.js +6 -0
  381. package/lib/utils/storyInteractions.d.ts +6 -0
  382. package/lib/utils/storyInteractions.js +45 -0
  383. package/lib/utils/storyUtils.d.ts +1 -0
  384. package/lib/utils/storyUtils.js +11 -0
  385. package/lib/utils/testUtils.d.ts +3 -0
  386. package/lib/utils/testUtils.js +56 -0
  387. package/lib/utils/timer.d.ts +21 -0
  388. package/lib/utils/timer.js +38 -0
  389. package/lib/utils/useBreakpoint.d.ts +6 -0
  390. package/lib/utils/useBreakpoint.js +56 -0
  391. package/lib/utils/viewPerformance.d.ts +34 -0
  392. package/lib/utils/viewPerformance.js +103 -0
  393. package/lib/utils/viewUtils.d.ts +9 -0
  394. package/lib/utils/viewUtils.js +44 -0
  395. package/lib/views/AuthSignInView/AuthSignInView.d.ts +20 -0
  396. package/lib/views/AuthSignInView/AuthSignInView.js +107 -0
  397. package/lib/views/AuthSignInView/AuthSignInView.stories.js +29 -0
  398. package/lib/views/AuthSignUpView/AuthSignUpView.d.ts +21 -0
  399. package/lib/views/AuthSignUpView/AuthSignUpView.js +146 -0
  400. package/lib/views/AuthSignUpView/AuthSignUpView.stories.js +30 -0
  401. package/lib/views/AuthView/AuthView.d.ts +16 -0
  402. package/lib/views/AuthView/AuthView.js +60 -0
  403. package/lib/views/AuthView/AuthView.stories.js +34 -0
  404. package/lib/views/DefaultView/DefaultView.d.ts +5 -0
  405. package/lib/views/DefaultView/DefaultView.js +134 -0
  406. package/lib/views/Gotham/Gotham.d.ts +44 -0
  407. package/lib/views/Gotham/Gotham.js +24 -0
  408. package/lib/views/Gotham/Gotham.stories.js +31 -0
  409. package/lib/views/Gotham/GothamListeners.d.ts +0 -0
  410. package/lib/views/Gotham/GothamListeners.js +2 -0
  411. package/lib/views/Gotham/GothamProvider.d.ts +43 -0
  412. package/lib/views/Gotham/GothamProvider.js +217 -0
  413. package/lib/views/Gotham/GothamRoot.d.ts +6 -0
  414. package/lib/views/Gotham/GothamRoot.js +69 -0
  415. package/lib/views/HomeView/HomeView.d.ts +10 -0
  416. package/lib/views/HomeView/HomeView.js +134 -0
  417. package/lib/views/LoaderView/LoaderView.d.ts +8 -0
  418. package/lib/views/LoaderView/LoaderView.js +30 -0
  419. package/lib/views/MenuView/MenuView.d.ts +13 -0
  420. package/lib/views/MenuView/MenuView.js +305 -0
  421. package/lib/views/NotFoundView/NotFoundView.d.ts +2 -0
  422. package/lib/views/NotFoundView/NotFoundView.js +12 -0
  423. package/lib/views/index.d.ts +11 -0
  424. package/lib/views/index.js +13 -0
  425. package/package.json +202 -0
  426. package/styles/tailwind.css +1 -0
@@ -0,0 +1,323 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '@nlabs/utils';
3
+ import { FileImage, UploadCloud, X } from 'lucide-react';
4
+ import { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
5
+ const imageMimeTypes = new Set([
6
+ 'image/jpeg',
7
+ 'image/png',
8
+ 'image/webp'
9
+ ]);
10
+ const createId = (file, index = 0)=>[
11
+ file.name,
12
+ file.size,
13
+ file.lastModified,
14
+ index
15
+ ].join('-');
16
+ const parseAccept = (accept = '')=>accept.split(',').map((value)=>value.trim().toLowerCase()).filter(Boolean);
17
+ const acceptsFile = (file, accept = '')=>{
18
+ const acceptRules = parseAccept(accept);
19
+ if (!acceptRules.length) {
20
+ return true;
21
+ }
22
+ const fileType = file.type.toLowerCase();
23
+ const fileName = file.name.toLowerCase();
24
+ return acceptRules.some((rule)=>{
25
+ if (rule.endsWith('/*')) {
26
+ return fileType.startsWith(rule.slice(0, -1));
27
+ }
28
+ if (rule.startsWith('.')) {
29
+ return fileName.endsWith(rule);
30
+ }
31
+ return fileType === rule;
32
+ });
33
+ };
34
+ const createImagePreview = (file)=>{
35
+ if (!imageMimeTypes.has(file.type)) {
36
+ return undefined;
37
+ }
38
+ return URL.createObjectURL(file);
39
+ };
40
+ const resizeImage = async (file, { imageOutputMimeType = 'image/jpeg', imageOutputQuality = 0.92, imageResizeTargetHeight, imageResizeTargetWidth, imageResizeUpscale = false })=>{
41
+ if (!imageMimeTypes.has(file.type) || !imageResizeTargetHeight && !imageResizeTargetWidth) {
42
+ return file;
43
+ }
44
+ const sourceUrl = URL.createObjectURL(file);
45
+ const image = new Image();
46
+ image.src = sourceUrl;
47
+ await image.decode();
48
+ const widthRatio = imageResizeTargetWidth ? imageResizeTargetWidth / image.width : Number.POSITIVE_INFINITY;
49
+ const heightRatio = imageResizeTargetHeight ? imageResizeTargetHeight / image.height : Number.POSITIVE_INFINITY;
50
+ const scale = Math.min(widthRatio, heightRatio, imageResizeUpscale ? Number.POSITIVE_INFINITY : 1);
51
+ if (scale >= 1 && !imageResizeUpscale) {
52
+ URL.revokeObjectURL(sourceUrl);
53
+ return file;
54
+ }
55
+ const canvas = document.createElement('canvas');
56
+ canvas.width = Math.max(1, Math.round(image.width * scale));
57
+ canvas.height = Math.max(1, Math.round(image.height * scale));
58
+ const context = canvas.getContext('2d');
59
+ context?.drawImage(image, 0, 0, canvas.width, canvas.height);
60
+ URL.revokeObjectURL(sourceUrl);
61
+ const blob = await new Promise((resolve)=>{
62
+ canvas.toBlob(resolve, imageOutputMimeType, imageOutputQuality);
63
+ });
64
+ if (!blob) {
65
+ return file;
66
+ }
67
+ return new File([
68
+ blob
69
+ ], file.name, {
70
+ lastModified: file.lastModified,
71
+ type: imageOutputMimeType
72
+ });
73
+ };
74
+ const filesToItems = (files)=>files.map((file, index)=>({
75
+ file,
76
+ id: createId(file, index),
77
+ previewUrl: createImagePreview(file)
78
+ }));
79
+ const DropUploadComponent = ({ accept, browseLabel = 'browse', className, defaultFiles = [], disabled = false, files, helperText, imageOutputMimeType = 'image/jpeg', imageOutputQuality = 0.92, imageResizeTargetHeight, imageResizeTargetWidth, imageResizeUpscale = false, label = 'Drop files here or', maxFileSize, maxFiles = Number.POSITIVE_INFINITY, multiple = true, onFilesChange, onReject, previewClassName, ref, showPreviews = true, transformImages = true, ...props })=>{
80
+ const inputId = useId();
81
+ const inputRef = useRef(null);
82
+ const itemsRef = useRef([]);
83
+ const [isDragging, setIsDragging] = useState(false);
84
+ const [internalItems, setInternalItems] = useState(()=>filesToItems(defaultFiles));
85
+ const isControlled = Array.isArray(files);
86
+ const items = useMemo(()=>isControlled ? filesToItems(files || []) : internalItems, [
87
+ files,
88
+ internalItems,
89
+ isControlled
90
+ ]);
91
+ useEffect(()=>{
92
+ const nextPreviewUrls = new Set(items.map((item)=>item.previewUrl).filter(Boolean));
93
+ itemsRef.current.forEach((item)=>{
94
+ if (item.previewUrl && !nextPreviewUrls.has(item.previewUrl)) {
95
+ URL.revokeObjectURL(item.previewUrl);
96
+ }
97
+ });
98
+ itemsRef.current = items;
99
+ }, [
100
+ items
101
+ ]);
102
+ useEffect(()=>()=>{
103
+ itemsRef.current.forEach((item)=>{
104
+ if (item.previewUrl) {
105
+ URL.revokeObjectURL(item.previewUrl);
106
+ }
107
+ });
108
+ }, []);
109
+ const updateItems = useCallback((nextItems)=>{
110
+ if (!isControlled) {
111
+ setInternalItems(nextItems);
112
+ }
113
+ onFilesChange?.(nextItems.map((item)=>item.file), nextItems);
114
+ }, [
115
+ isControlled,
116
+ onFilesChange
117
+ ]);
118
+ const addFiles = useCallback(async (incomingFiles)=>{
119
+ if (disabled) {
120
+ return;
121
+ }
122
+ const currentItems = multiple ? items : [];
123
+ const acceptedFiles = [];
124
+ const rejections = [];
125
+ const remainingSlots = Math.max(0, maxFiles - currentItems.length);
126
+ incomingFiles.forEach((file)=>{
127
+ if (acceptedFiles.length >= remainingSlots) {
128
+ rejections.push({
129
+ file,
130
+ reason: 'max-files'
131
+ });
132
+ return;
133
+ }
134
+ if (!acceptsFile(file, accept)) {
135
+ rejections.push({
136
+ file,
137
+ reason: 'type'
138
+ });
139
+ return;
140
+ }
141
+ if (maxFileSize && file.size > maxFileSize) {
142
+ rejections.push({
143
+ file,
144
+ reason: 'max-size'
145
+ });
146
+ return;
147
+ }
148
+ acceptedFiles.push(file);
149
+ });
150
+ if (rejections.length) {
151
+ onReject?.(rejections);
152
+ }
153
+ if (!acceptedFiles.length) {
154
+ return;
155
+ }
156
+ const transformedFiles = transformImages ? await Promise.all(acceptedFiles.map((file)=>resizeImage(file, {
157
+ imageOutputMimeType,
158
+ imageOutputQuality,
159
+ imageResizeTargetHeight,
160
+ imageResizeTargetWidth,
161
+ imageResizeUpscale
162
+ }))) : acceptedFiles;
163
+ updateItems([
164
+ ...currentItems,
165
+ ...filesToItems(transformedFiles)
166
+ ]);
167
+ }, [
168
+ accept,
169
+ disabled,
170
+ imageOutputMimeType,
171
+ imageOutputQuality,
172
+ imageResizeTargetHeight,
173
+ imageResizeTargetWidth,
174
+ imageResizeUpscale,
175
+ items,
176
+ maxFileSize,
177
+ maxFiles,
178
+ multiple,
179
+ onReject,
180
+ transformImages,
181
+ updateItems
182
+ ]);
183
+ const onInputChange = async (event)=>{
184
+ await addFiles(Array.from(event.target.files || []));
185
+ event.target.value = '';
186
+ };
187
+ const onDragOver = (event)=>{
188
+ event.preventDefault();
189
+ setIsDragging(true);
190
+ };
191
+ const onDragLeave = (event)=>{
192
+ event.preventDefault();
193
+ if (event.currentTarget === event.target) {
194
+ setIsDragging(false);
195
+ }
196
+ };
197
+ const onDrop = async (event)=>{
198
+ event.preventDefault();
199
+ setIsDragging(false);
200
+ await addFiles(Array.from(event.dataTransfer.files || []));
201
+ };
202
+ const onKeyDown = (event)=>{
203
+ if (event.key === 'Enter' || event.key === ' ') {
204
+ event.preventDefault();
205
+ inputRef.current?.click();
206
+ }
207
+ };
208
+ const removeItem = (id)=>{
209
+ updateItems(items.filter((item)=>item.id !== id));
210
+ };
211
+ return /*#__PURE__*/ _jsxs("div", {
212
+ className: cn('flex w-full flex-col gap-4', className),
213
+ ref: ref,
214
+ ...props,
215
+ children: [
216
+ /*#__PURE__*/ _jsxs("div", {
217
+ "aria-disabled": disabled,
218
+ className: cn('group relative flex min-h-44 w-full cursor-pointer flex-col items-center justify-center rounded-xl border border-dashed border-border bg-transparent px-6 py-8 text-center transition-colors', 'focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/30', 'hover:border-primary/70 hover:bg-primary/5', disabled && 'cursor-not-allowed opacity-50', isDragging && 'border-primary bg-primary/10'),
219
+ onClick: ()=>inputRef.current?.click(),
220
+ onDragLeave: onDragLeave,
221
+ onDragOver: onDragOver,
222
+ onDrop: onDrop,
223
+ onKeyDown: onKeyDown,
224
+ role: "button",
225
+ tabIndex: disabled ? -1 : 0,
226
+ children: [
227
+ /*#__PURE__*/ _jsx("input", {
228
+ accept: accept,
229
+ className: "sr-only",
230
+ disabled: disabled,
231
+ id: inputId,
232
+ multiple: multiple,
233
+ onChange: onInputChange,
234
+ ref: inputRef,
235
+ type: "file"
236
+ }),
237
+ /*#__PURE__*/ _jsx(UploadCloud, {
238
+ "aria-hidden": "true",
239
+ className: "mb-4 size-10 text-muted-foreground transition-colors group-hover:text-primary"
240
+ }),
241
+ /*#__PURE__*/ _jsxs("div", {
242
+ className: "text-sm font-medium text-foreground",
243
+ children: [
244
+ /*#__PURE__*/ _jsxs("span", {
245
+ children: [
246
+ label,
247
+ " "
248
+ ]
249
+ }),
250
+ /*#__PURE__*/ _jsx("label", {
251
+ className: "cursor-pointer text-primary underline-offset-4 hover:underline",
252
+ htmlFor: inputId,
253
+ children: browseLabel
254
+ })
255
+ ]
256
+ }),
257
+ helperText && /*#__PURE__*/ _jsx("div", {
258
+ className: "mt-2 text-sm text-muted-foreground",
259
+ children: helperText
260
+ })
261
+ ]
262
+ }),
263
+ showPreviews && !!items.length && /*#__PURE__*/ _jsx("div", {
264
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3",
265
+ children: items.map((item)=>/*#__PURE__*/ _jsxs("div", {
266
+ className: cn('group/item relative overflow-hidden rounded-lg border border-border bg-card text-card-foreground', previewClassName),
267
+ children: [
268
+ /*#__PURE__*/ _jsx("div", {
269
+ className: "flex aspect-video items-center justify-center bg-muted",
270
+ children: item.previewUrl ? /*#__PURE__*/ _jsx("img", {
271
+ alt: item.file.name,
272
+ className: "size-full object-cover",
273
+ src: item.previewUrl
274
+ }) : /*#__PURE__*/ _jsx(FileImage, {
275
+ "aria-hidden": "true",
276
+ className: "size-9 text-muted-foreground"
277
+ })
278
+ }),
279
+ /*#__PURE__*/ _jsxs("div", {
280
+ className: "flex items-center justify-between gap-3 px-3 py-2",
281
+ children: [
282
+ /*#__PURE__*/ _jsxs("div", {
283
+ className: "min-w-0",
284
+ children: [
285
+ /*#__PURE__*/ _jsx("p", {
286
+ className: "truncate text-sm font-medium",
287
+ children: item.file.name
288
+ }),
289
+ /*#__PURE__*/ _jsxs("p", {
290
+ className: "text-xs text-muted-foreground",
291
+ children: [
292
+ Math.ceil(item.file.size / 1024),
293
+ " KB"
294
+ ]
295
+ })
296
+ ]
297
+ }),
298
+ /*#__PURE__*/ _jsx("button", {
299
+ "aria-label": `Remove ${item.file.name}`,
300
+ className: "inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",
301
+ disabled: disabled,
302
+ onClick: (event)=>{
303
+ event.stopPropagation();
304
+ removeItem(item.id);
305
+ },
306
+ type: "button",
307
+ children: /*#__PURE__*/ _jsx(X, {
308
+ "aria-hidden": "true",
309
+ className: "size-4"
310
+ })
311
+ })
312
+ ]
313
+ })
314
+ ]
315
+ }, item.id))
316
+ })
317
+ ]
318
+ });
319
+ };
320
+ export const DropUpload = /*#__PURE__*/ memo(DropUploadComponent);
321
+ DropUpload.displayName = 'DropUpload';
322
+
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Ryb3BVcGxvYWQvRHJvcFVwbG9hZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjbn0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7RmlsZUltYWdlLCBVcGxvYWRDbG91ZCwgWH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7bWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlSWQsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGVcbn0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENoYW5nZUV2ZW50LFxuICBEcmFnRXZlbnQsXG4gIEhUTUxBdHRyaWJ1dGVzLFxuICBLZXlib2FyZEV2ZW50LFxuICBSZWFjdE5vZGUsXG4gIFJlZlxufSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCB0eXBlIERyb3BVcGxvYWRSZWplY3Rpb25SZWFzb24gPSAnbWF4LWZpbGVzJyB8ICdtYXgtc2l6ZScgfCAndHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcFVwbG9hZEl0ZW0ge1xuICByZWFkb25seSBmaWxlOiBGaWxlO1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBwcmV2aWV3VXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyb3BVcGxvYWRSZWplY3Rpb24ge1xuICByZWFkb25seSBmaWxlOiBGaWxlO1xuICByZWFkb25seSByZWFzb246IERyb3BVcGxvYWRSZWplY3Rpb25SZWFzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcFVwbG9hZFByb3BzIGV4dGVuZHMgT21pdDxIVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4sICdvbkNoYW5nZScgfCAnb25Ecm9wJz4ge1xuICByZWFkb25seSBhY2NlcHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJyb3dzZUxhYmVsPzogc3RyaW5nO1xuICByZWFkb25seSBkZWZhdWx0RmlsZXM/OiByZWFkb25seSBGaWxlW107XG4gIHJlYWRvbmx5IGRpc2FibGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZmlsZXM/OiByZWFkb25seSBGaWxlW107XG4gIHJlYWRvbmx5IGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGltYWdlT3V0cHV0TWltZVR5cGU/OiAnaW1hZ2UvanBlZycgfCAnaW1hZ2UvcG5nJyB8ICdpbWFnZS93ZWJwJztcbiAgcmVhZG9ubHkgaW1hZ2VPdXRwdXRRdWFsaXR5PzogbnVtYmVyO1xuICByZWFkb25seSBpbWFnZVJlc2l6ZVRhcmdldEhlaWdodD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaW1hZ2VSZXNpemVUYXJnZXRXaWR0aD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaW1hZ2VSZXNpemVVcHNjYWxlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IG1heEZpbGVTaXplPzogbnVtYmVyO1xuICByZWFkb25seSBtYXhGaWxlcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgbXVsdGlwbGU/OiBib29sZWFuO1xuICByZWFkb25seSBvbkZpbGVzQ2hhbmdlPzogKGZpbGVzOiBGaWxlW10sIGl0ZW1zOiBEcm9wVXBsb2FkSXRlbVtdKSA9PiB2b2lkO1xuICByZWFkb25seSBvblJlamVjdD86IChyZWplY3Rpb25zOiBEcm9wVXBsb2FkUmVqZWN0aW9uW10pID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHByZXZpZXdDbGFzc05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZj86IFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIHJlYWRvbmx5IHNob3dQcmV2aWV3cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYW5zZm9ybUltYWdlcz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGltYWdlTWltZVR5cGVzID0gbmV3IFNldChbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcG5nJywgJ2ltYWdlL3dlYnAnXSk7XG5cbmNvbnN0IGNyZWF0ZUlkID0gKGZpbGU6IEZpbGUsIGluZGV4ID0gMCk6IHN0cmluZyA9PiBbXG4gIGZpbGUubmFtZSxcbiAgZmlsZS5zaXplLFxuICBmaWxlLmxhc3RNb2RpZmllZCxcbiAgaW5kZXhcbl0uam9pbignLScpO1xuXG5jb25zdCBwYXJzZUFjY2VwdCA9IChhY2NlcHQgPSAnJyk6IHN0cmluZ1tdID0+IGFjY2VwdFxuICAuc3BsaXQoJywnKVxuICAubWFwKCh2YWx1ZSkgPT4gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpXG4gIC5maWx0ZXIoQm9vbGVhbik7XG5cbmNvbnN0IGFjY2VwdHNGaWxlID0gKGZpbGU6IEZpbGUsIGFjY2VwdCA9ICcnKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGFjY2VwdFJ1bGVzID0gcGFyc2VBY2NlcHQoYWNjZXB0KTtcblxuICBpZighYWNjZXB0UnVsZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmaWxlTmFtZSA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBhY2NlcHRSdWxlcy5zb21lKChydWxlKSA9PiB7XG4gICAgaWYocnVsZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgcmV0dXJuIGZpbGVUeXBlLnN0YXJ0c1dpdGgocnVsZS5zbGljZSgwLCAtMSkpO1xuICAgIH1cblxuICAgIGlmKHJ1bGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICByZXR1cm4gZmlsZU5hbWUuZW5kc1dpdGgocnVsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVUeXBlID09PSBydWxlO1xuICB9KTtcbn07XG5cbmNvbnN0IGNyZWF0ZUltYWdlUHJldmlldyA9IChmaWxlOiBGaWxlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYoIWltYWdlTWltZVR5cGVzLmhhcyhmaWxlLnR5cGUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xufTtcblxuY29uc3QgcmVzaXplSW1hZ2UgPSBhc3luYyAoXG4gIGZpbGU6IEZpbGUsXG4gIHtcbiAgICBpbWFnZU91dHB1dE1pbWVUeXBlID0gJ2ltYWdlL2pwZWcnLFxuICAgIGltYWdlT3V0cHV0UXVhbGl0eSA9IDAuOTIsXG4gICAgaW1hZ2VSZXNpemVUYXJnZXRIZWlnaHQsXG4gICAgaW1hZ2VSZXNpemVUYXJnZXRXaWR0aCxcbiAgICBpbWFnZVJlc2l6ZVVwc2NhbGUgPSBmYWxzZVxuICB9OiBQaWNrPFxuICAgIERyb3BVcGxvYWRQcm9wcyxcbiAgICAnaW1hZ2VPdXRwdXRNaW1lVHlwZScgfFxuICAgICdpbWFnZU91dHB1dFF1YWxpdHknIHxcbiAgICAnaW1hZ2VSZXNpemVUYXJnZXRIZWlnaHQnIHxcbiAgICAnaW1hZ2VSZXNpemVUYXJnZXRXaWR0aCcgfFxuICAgICdpbWFnZVJlc2l6ZVVwc2NhbGUnXG4gID5cbik6IFByb21pc2U8RmlsZT4gPT4ge1xuICBpZighaW1hZ2VNaW1lVHlwZXMuaGFzKGZpbGUudHlwZSkgfHwgKCFpbWFnZVJlc2l6ZVRhcmdldEhlaWdodCAmJiAhaW1hZ2VSZXNpemVUYXJnZXRXaWR0aCkpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZVVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gIGltYWdlLnNyYyA9IHNvdXJjZVVybDtcbiAgYXdhaXQgaW1hZ2UuZGVjb2RlKCk7XG5cbiAgY29uc3Qgd2lkdGhSYXRpbyA9IGltYWdlUmVzaXplVGFyZ2V0V2lkdGggPyBpbWFnZVJlc2l6ZVRhcmdldFdpZHRoIC8gaW1hZ2Uud2lkdGggOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGNvbnN0IGhlaWdodFJhdGlvID0gaW1hZ2VSZXNpemVUYXJnZXRIZWlnaHQgPyBpbWFnZVJlc2l6ZVRhcmdldEhlaWdodCAvIGltYWdlLmhlaWdodCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFJhdGlvLCBoZWlnaHRSYXRpbywgaW1hZ2VSZXNpemVVcHNjYWxlID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogMSk7XG5cbiAgaWYoc2NhbGUgPj0gMSAmJiAhaW1hZ2VSZXNpemVVcHNjYWxlKSB7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChzb3VyY2VVcmwpO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIGNhbnZhcy53aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaW1hZ2Uud2lkdGggKiBzY2FsZSkpO1xuICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChpbWFnZS5oZWlnaHQgKiBzY2FsZSkpO1xuXG4gIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgY29udGV4dD8uZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICBVUkwucmV2b2tlT2JqZWN0VVJMKHNvdXJjZVVybCk7XG5cbiAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgIGNhbnZhcy50b0Jsb2IocmVzb2x2ZSwgaW1hZ2VPdXRwdXRNaW1lVHlwZSwgaW1hZ2VPdXRwdXRRdWFsaXR5KTtcbiAgfSk7XG5cbiAgaWYoIWJsb2IpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRmlsZShbYmxvYl0sIGZpbGUubmFtZSwge1xuICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgdHlwZTogaW1hZ2VPdXRwdXRNaW1lVHlwZVxuICB9KTtcbn07XG5cbmNvbnN0IGZpbGVzVG9JdGVtcyA9IChmaWxlczogcmVhZG9ubHkgRmlsZVtdKTogRHJvcFVwbG9hZEl0ZW1bXSA9PiBmaWxlcy5tYXAoKGZpbGUsIGluZGV4KSA9PiAoe1xuICBmaWxlLFxuICBpZDogY3JlYXRlSWQoZmlsZSwgaW5kZXgpLFxuICBwcmV2aWV3VXJsOiBjcmVhdGVJbWFnZVByZXZpZXcoZmlsZSlcbn0pKTtcblxuY29uc3QgRHJvcFVwbG9hZENvbXBvbmVudCA9ICh7XG4gIGFjY2VwdCxcbiAgYnJvd3NlTGFiZWwgPSAnYnJvd3NlJyxcbiAgY2xhc3NOYW1lLFxuICBkZWZhdWx0RmlsZXMgPSBbXSxcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZmlsZXMsXG4gIGhlbHBlclRleHQsXG4gIGltYWdlT3V0cHV0TWltZVR5cGUgPSAnaW1hZ2UvanBlZycsXG4gIGltYWdlT3V0cHV0UXVhbGl0eSA9IDAuOTIsXG4gIGltYWdlUmVzaXplVGFyZ2V0SGVpZ2h0LFxuICBpbWFnZVJlc2l6ZVRhcmdldFdpZHRoLFxuICBpbWFnZVJlc2l6ZVVwc2NhbGUgPSBmYWxzZSxcbiAgbGFiZWwgPSAnRHJvcCBmaWxlcyBoZXJlIG9yJyxcbiAgbWF4RmlsZVNpemUsXG4gIG1heEZpbGVzID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICBtdWx0aXBsZSA9IHRydWUsXG4gIG9uRmlsZXNDaGFuZ2UsXG4gIG9uUmVqZWN0LFxuICBwcmV2aWV3Q2xhc3NOYW1lLFxuICByZWYsXG4gIHNob3dQcmV2aWV3cyA9IHRydWUsXG4gIHRyYW5zZm9ybUltYWdlcyA9IHRydWUsXG4gIC4uLnByb3BzXG59OiBEcm9wVXBsb2FkUHJvcHMpID0+IHtcbiAgY29uc3QgaW5wdXRJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBpdGVtc1JlZiA9IHVzZVJlZjxEcm9wVXBsb2FkSXRlbVtdPihbXSk7XG4gIGNvbnN0IFtpc0RyYWdnaW5nLCBzZXRJc0RyYWdnaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2ludGVybmFsSXRlbXMsIHNldEludGVybmFsSXRlbXNdID0gdXNlU3RhdGU8RHJvcFVwbG9hZEl0ZW1bXT4oKCkgPT4gZmlsZXNUb0l0ZW1zKGRlZmF1bHRGaWxlcykpO1xuICBjb25zdCBpc0NvbnRyb2xsZWQgPSBBcnJheS5pc0FycmF5KGZpbGVzKTtcbiAgY29uc3QgaXRlbXMgPSB1c2VNZW1vKFxuICAgICgpID0+IChpc0NvbnRyb2xsZWQgPyBmaWxlc1RvSXRlbXMoZmlsZXMgfHwgW10pIDogaW50ZXJuYWxJdGVtcyksXG4gICAgW2ZpbGVzLCBpbnRlcm5hbEl0ZW1zLCBpc0NvbnRyb2xsZWRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBuZXh0UHJldmlld1VybHMgPSBuZXcgU2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5wcmV2aWV3VXJsKS5maWx0ZXIoQm9vbGVhbikpO1xuXG4gICAgaXRlbXNSZWYuY3VycmVudC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZihpdGVtLnByZXZpZXdVcmwgJiYgIW5leHRQcmV2aWV3VXJscy5oYXMoaXRlbS5wcmV2aWV3VXJsKSkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGl0ZW0ucHJldmlld1VybCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdGVtc1JlZi5jdXJyZW50ID0gaXRlbXM7XG4gIH0sIFtpdGVtc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiB7XG4gICAgaXRlbXNSZWYuY3VycmVudC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZihpdGVtLnByZXZpZXdVcmwpIHtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChpdGVtLnByZXZpZXdVcmwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgdXBkYXRlSXRlbXMgPSB1c2VDYWxsYmFjaygobmV4dEl0ZW1zOiBEcm9wVXBsb2FkSXRlbVtdKSA9PiB7XG4gICAgaWYoIWlzQ29udHJvbGxlZCkge1xuICAgICAgc2V0SW50ZXJuYWxJdGVtcyhuZXh0SXRlbXMpO1xuICAgIH1cblxuICAgIG9uRmlsZXNDaGFuZ2U/LihuZXh0SXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmZpbGUpLCBuZXh0SXRlbXMpO1xuICB9LCBbaXNDb250cm9sbGVkLCBvbkZpbGVzQ2hhbmdlXSk7XG5cbiAgY29uc3QgYWRkRmlsZXMgPSB1c2VDYWxsYmFjayhhc3luYyAoaW5jb21pbmdGaWxlczogRmlsZVtdKSA9PiB7XG4gICAgaWYoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50SXRlbXMgPSBtdWx0aXBsZSA/IGl0ZW1zIDogW107XG4gICAgY29uc3QgYWNjZXB0ZWRGaWxlczogRmlsZVtdID0gW107XG4gICAgY29uc3QgcmVqZWN0aW9uczogRHJvcFVwbG9hZFJlamVjdGlvbltdID0gW107XG4gICAgY29uc3QgcmVtYWluaW5nU2xvdHMgPSBNYXRoLm1heCgwLCBtYXhGaWxlcyAtIGN1cnJlbnRJdGVtcy5sZW5ndGgpO1xuXG4gICAgaW5jb21pbmdGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBpZihhY2NlcHRlZEZpbGVzLmxlbmd0aCA+PSByZW1haW5pbmdTbG90cykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goe2ZpbGUsIHJlYXNvbjogJ21heC1maWxlcyd9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighYWNjZXB0c0ZpbGUoZmlsZSwgYWNjZXB0KSkge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goe2ZpbGUsIHJlYXNvbjogJ3R5cGUnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYobWF4RmlsZVNpemUgJiYgZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcbiAgICAgICAgcmVqZWN0aW9ucy5wdXNoKHtmaWxlLCByZWFzb246ICdtYXgtc2l6ZSd9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgfSk7XG5cbiAgICBpZihyZWplY3Rpb25zLmxlbmd0aCkge1xuICAgICAgb25SZWplY3Q/LihyZWplY3Rpb25zKTtcbiAgICB9XG5cbiAgICBpZighYWNjZXB0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZEZpbGVzID0gdHJhbnNmb3JtSW1hZ2VzXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKGFjY2VwdGVkRmlsZXMubWFwKChmaWxlKSA9PiByZXNpemVJbWFnZShmaWxlLCB7XG4gICAgICAgIGltYWdlT3V0cHV0TWltZVR5cGUsXG4gICAgICAgIGltYWdlT3V0cHV0UXVhbGl0eSxcbiAgICAgICAgaW1hZ2VSZXNpemVUYXJnZXRIZWlnaHQsXG4gICAgICAgIGltYWdlUmVzaXplVGFyZ2V0V2lkdGgsXG4gICAgICAgIGltYWdlUmVzaXplVXBzY2FsZVxuICAgICAgfSkpKVxuICAgICAgOiBhY2NlcHRlZEZpbGVzO1xuXG4gICAgdXBkYXRlSXRlbXMoW1xuICAgICAgLi4uY3VycmVudEl0ZW1zLFxuICAgICAgLi4uZmlsZXNUb0l0ZW1zKHRyYW5zZm9ybWVkRmlsZXMpXG4gICAgXSk7XG4gIH0sIFtcbiAgICBhY2NlcHQsXG4gICAgZGlzYWJsZWQsXG4gICAgaW1hZ2VPdXRwdXRNaW1lVHlwZSxcbiAgICBpbWFnZU91dHB1dFF1YWxpdHksXG4gICAgaW1hZ2VSZXNpemVUYXJnZXRIZWlnaHQsXG4gICAgaW1hZ2VSZXNpemVUYXJnZXRXaWR0aCxcbiAgICBpbWFnZVJlc2l6ZVVwc2NhbGUsXG4gICAgaXRlbXMsXG4gICAgbWF4RmlsZVNpemUsXG4gICAgbWF4RmlsZXMsXG4gICAgbXVsdGlwbGUsXG4gICAgb25SZWplY3QsXG4gICAgdHJhbnNmb3JtSW1hZ2VzLFxuICAgIHVwZGF0ZUl0ZW1zXG4gIF0pO1xuXG4gIGNvbnN0IG9uSW5wdXRDaGFuZ2UgPSBhc3luYyAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgYXdhaXQgYWRkRmlsZXMoQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMgfHwgW10pKTtcbiAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgfTtcblxuICBjb25zdCBvbkRyYWdPdmVyID0gKGV2ZW50OiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBzZXRJc0RyYWdnaW5nKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IG9uRHJhZ0xlYXZlID0gKGV2ZW50OiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmKGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGV2ZW50LnRhcmdldCkge1xuICAgICAgc2V0SXNEcmFnZ2luZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uRHJvcCA9IGFzeW5jIChldmVudDogRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgc2V0SXNEcmFnZ2luZyhmYWxzZSk7XG4gICAgYXdhaXQgYWRkRmlsZXMoQXJyYXkuZnJvbShldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgfHwgW10pKTtcbiAgfTtcblxuICBjb25zdCBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaW5wdXRSZWYuY3VycmVudD8uY2xpY2soKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlSXRlbSA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgdXBkYXRlSXRlbXMoaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2NuKCdmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAtNCcsIGNsYXNzTmFtZSl9IHJlZj17cmVmfSB7Li4ucHJvcHN9PlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnZ3JvdXAgcmVsYXRpdmUgZmxleCBtaW4taC00NCB3LWZ1bGwgY3Vyc29yLXBvaW50ZXIgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1kYXNoZWQgYm9yZGVyLWJvcmRlciBiZy10cmFuc3BhcmVudCBweC02IHB5LTggdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgICAgICdmb2N1cy13aXRoaW46Ym9yZGVyLXJpbmcgZm9jdXMtd2l0aGluOnJpbmctMyBmb2N1cy13aXRoaW46cmluZy1yaW5nLzMwJyxcbiAgICAgICAgICAnaG92ZXI6Ym9yZGVyLXByaW1hcnkvNzAgaG92ZXI6YmctcHJpbWFyeS81JyxcbiAgICAgICAgICBkaXNhYmxlZCAmJiAnY3Vyc29yLW5vdC1hbGxvd2VkIG9wYWNpdHktNTAnLFxuICAgICAgICAgIGlzRHJhZ2dpbmcgJiYgJ2JvcmRlci1wcmltYXJ5IGJnLXByaW1hcnkvMTAnXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IGlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCl9XG4gICAgICAgIG9uRHJhZ0xlYXZlPXtvbkRyYWdMZWF2ZX1cbiAgICAgICAgb25EcmFnT3Zlcj17b25EcmFnT3Zlcn1cbiAgICAgICAgb25Ecm9wPXtvbkRyb3B9XG4gICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiSW5kZXg9e2Rpc2FibGVkID8gLTEgOiAwfT5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgYWNjZXB0PXthY2NlcHR9XG4gICAgICAgICAgY2xhc3NOYW1lPVwic3Itb25seVwiXG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGlkPXtpbnB1dElkfVxuICAgICAgICAgIG11bHRpcGxlPXttdWx0aXBsZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25JbnB1dENoYW5nZX1cbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPFVwbG9hZENsb3VkIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cIm1iLTQgc2l6ZS0xMCB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMgZ3JvdXAtaG92ZXI6dGV4dC1wcmltYXJ5XCIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgIDxzcGFuPntsYWJlbH0gPC9zcGFuPlxuICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZVwiIGh0bWxGb3I9e2lucHV0SWR9PlxuICAgICAgICAgICAge2Jyb3dzZUxhYmVsfVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7aGVscGVyVGV4dCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICB7aGVscGVyVGV4dH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7c2hvd1ByZXZpZXdzICYmICEhaXRlbXMubGVuZ3RoICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIHNtOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICdncm91cC9pdGVtIHJlbGF0aXZlIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgICAgICAgICAgIHByZXZpZXdDbGFzc05hbWVcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAga2V5PXtpdGVtLmlkfT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGFzcGVjdC12aWRlbyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7aXRlbS5wcmV2aWV3VXJsID8gKFxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBhbHQ9e2l0ZW0uZmlsZS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaXplLWZ1bGwgb2JqZWN0LWNvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgc3JjPXtpdGVtLnByZXZpZXdVcmx9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICA8RmlsZUltYWdlIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cInNpemUtOSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRydW5jYXRlIHRleHQtc20gZm9udC1tZWRpdW1cIj57aXRlbS5maWxlLm5hbWV9PC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57TWF0aC5jZWlsKGl0ZW0uZmlsZS5zaXplIC8gMTAyNCl9IEtCPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2BSZW1vdmUgJHtpdGVtLmZpbGUubmFtZX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggc2l6ZS04IHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1tdXRlZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVJdGVtKGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxYIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBEcm9wVXBsb2FkID0gbWVtbyhEcm9wVXBsb2FkQ29tcG9uZW50KTtcbkRyb3BVcGxvYWQuZGlzcGxheU5hbWUgPSAnRHJvcFVwbG9hZCc7XG4iXSwibmFtZXMiOlsiY24iLCJGaWxlSW1hZ2UiLCJVcGxvYWRDbG91ZCIsIlgiLCJtZW1vIiwidXNlQ2FsbGJhY2siLCJ1c2VFZmZlY3QiLCJ1c2VJZCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImltYWdlTWltZVR5cGVzIiwiU2V0IiwiY3JlYXRlSWQiLCJmaWxlIiwiaW5kZXgiLCJuYW1lIiwic2l6ZSIsImxhc3RNb2RpZmllZCIsImpvaW4iLCJwYXJzZUFjY2VwdCIsImFjY2VwdCIsInNwbGl0IiwibWFwIiwidmFsdWUiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJmaWx0ZXIiLCJCb29sZWFuIiwiYWNjZXB0c0ZpbGUiLCJhY2NlcHRSdWxlcyIsImxlbmd0aCIsImZpbGVUeXBlIiwidHlwZSIsImZpbGVOYW1lIiwic29tZSIsInJ1bGUiLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImNyZWF0ZUltYWdlUHJldmlldyIsImhhcyIsInVuZGVmaW5lZCIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInJlc2l6ZUltYWdlIiwiaW1hZ2VPdXRwdXRNaW1lVHlwZSIsImltYWdlT3V0cHV0UXVhbGl0eSIsImltYWdlUmVzaXplVGFyZ2V0SGVpZ2h0IiwiaW1hZ2VSZXNpemVUYXJnZXRXaWR0aCIsImltYWdlUmVzaXplVXBzY2FsZSIsInNvdXJjZVVybCIsImltYWdlIiwiSW1hZ2UiLCJzcmMiLCJkZWNvZGUiLCJ3aWR0aFJhdGlvIiwid2lkdGgiLCJOdW1iZXIiLCJQT1NJVElWRV9JTkZJTklUWSIsImhlaWdodFJhdGlvIiwiaGVpZ2h0Iiwic2NhbGUiLCJNYXRoIiwibWluIiwicmV2b2tlT2JqZWN0VVJMIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwibWF4Iiwicm91bmQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImRyYXdJbWFnZSIsImJsb2IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRvQmxvYiIsIkZpbGUiLCJmaWxlc1RvSXRlbXMiLCJmaWxlcyIsImlkIiwicHJldmlld1VybCIsIkRyb3BVcGxvYWRDb21wb25lbnQiLCJicm93c2VMYWJlbCIsImNsYXNzTmFtZSIsImRlZmF1bHRGaWxlcyIsImRpc2FibGVkIiwiaGVscGVyVGV4dCIsImxhYmVsIiwibWF4RmlsZVNpemUiLCJtYXhGaWxlcyIsIm11bHRpcGxlIiwib25GaWxlc0NoYW5nZSIsIm9uUmVqZWN0IiwicHJldmlld0NsYXNzTmFtZSIsInJlZiIsInNob3dQcmV2aWV3cyIsInRyYW5zZm9ybUltYWdlcyIsInByb3BzIiwiaW5wdXRJZCIsImlucHV0UmVmIiwiaXRlbXNSZWYiLCJpc0RyYWdnaW5nIiwic2V0SXNEcmFnZ2luZyIsImludGVybmFsSXRlbXMiLCJzZXRJbnRlcm5hbEl0ZW1zIiwiaXNDb250cm9sbGVkIiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbXMiLCJuZXh0UHJldmlld1VybHMiLCJpdGVtIiwiY3VycmVudCIsImZvckVhY2giLCJ1cGRhdGVJdGVtcyIsIm5leHRJdGVtcyIsImFkZEZpbGVzIiwiaW5jb21pbmdGaWxlcyIsImN1cnJlbnRJdGVtcyIsImFjY2VwdGVkRmlsZXMiLCJyZWplY3Rpb25zIiwicmVtYWluaW5nU2xvdHMiLCJwdXNoIiwicmVhc29uIiwidHJhbnNmb3JtZWRGaWxlcyIsImFsbCIsIm9uSW5wdXRDaGFuZ2UiLCJldmVudCIsImZyb20iLCJ0YXJnZXQiLCJvbkRyYWdPdmVyIiwicHJldmVudERlZmF1bHQiLCJvbkRyYWdMZWF2ZSIsImN1cnJlbnRUYXJnZXQiLCJvbkRyb3AiLCJkYXRhVHJhbnNmZXIiLCJvbktleURvd24iLCJrZXkiLCJjbGljayIsInJlbW92ZUl0ZW0iLCJkaXYiLCJhcmlhLWRpc2FibGVkIiwib25DbGljayIsInJvbGUiLCJ0YWJJbmRleCIsImlucHV0Iiwib25DaGFuZ2UiLCJhcmlhLWhpZGRlbiIsInNwYW4iLCJodG1sRm9yIiwiaW1nIiwiYWx0IiwicCIsImNlaWwiLCJidXR0b24iLCJhcmlhLWxhYmVsIiwic3RvcFByb3BhZ2F0aW9uIiwiRHJvcFVwbG9hZCIsImRpc3BsYXlOYW1lIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBUUEsRUFBRSxRQUFPLGVBQWU7QUFDaEMsU0FBUUMsU0FBUyxFQUFFQyxXQUFXLEVBQUVDLENBQUMsUUFBTyxlQUFlO0FBQ3ZELFNBQVFDLElBQUksRUFDVkMsV0FBVyxFQUNYQyxTQUFTLEVBQ1RDLEtBQUssRUFDTEMsT0FBTyxFQUNQQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxRQUFRO0FBZ0RmLE1BQU1DLGlCQUFpQixJQUFJQyxJQUFJO0lBQUM7SUFBYztJQUFhO0NBQWE7QUFFeEUsTUFBTUMsV0FBVyxDQUFDQyxNQUFZQyxRQUFRLENBQUMsR0FBYTtRQUNsREQsS0FBS0UsSUFBSTtRQUNURixLQUFLRyxJQUFJO1FBQ1RILEtBQUtJLFlBQVk7UUFDakJIO0tBQ0QsQ0FBQ0ksSUFBSSxDQUFDO0FBRVAsTUFBTUMsY0FBYyxDQUFDQyxTQUFTLEVBQUUsR0FBZUEsT0FDNUNDLEtBQUssQ0FBQyxLQUNOQyxHQUFHLENBQUMsQ0FBQ0MsUUFBVUEsTUFBTUMsSUFBSSxHQUFHQyxXQUFXLElBQ3ZDQyxNQUFNLENBQUNDO0FBRVYsTUFBTUMsY0FBYyxDQUFDZixNQUFZTyxTQUFTLEVB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
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import { interactWithCanvas } from '../../utils/storyInteractions.js';
3
+ import { DropUpload } from './DropUpload.js';
4
+ const meta = {
5
+ argTypes: {
6
+ accept: {
7
+ control: 'text'
8
+ },
9
+ disabled: {
10
+ control: 'boolean'
11
+ },
12
+ helperText: {
13
+ control: 'text'
14
+ },
15
+ label: {
16
+ control: 'text'
17
+ },
18
+ maxFiles: {
19
+ control: 'number'
20
+ },
21
+ multiple: {
22
+ control: 'boolean'
23
+ },
24
+ showPreviews: {
25
+ control: 'boolean'
26
+ }
27
+ },
28
+ component: DropUpload,
29
+ parameters: {
30
+ layout: 'centered'
31
+ },
32
+ title: 'Components/Form/DropUpload'
33
+ };
34
+ export default meta;
35
+ export const Default = {
36
+ args: {
37
+ accept: 'image/*,.pdf',
38
+ helperText: 'PNG, JPG, or PDF up to 5 MB',
39
+ label: 'Drop assets here or',
40
+ maxFiles: 3,
41
+ multiple: true,
42
+ showPreviews: false,
43
+ transformImages: false
44
+ },
45
+ play: interactWithCanvas
46
+ };
47
+
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Ryb3BVcGxvYWQvRHJvcFVwbG9hZC5zdG9yaWVzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge2ludGVyYWN0V2l0aENhbnZhc30gZnJvbSAnLi4vLi4vdXRpbHMvc3RvcnlJbnRlcmFjdGlvbnMuanMnO1xuaW1wb3J0IHtEcm9wVXBsb2FkfSBmcm9tICcuL0Ryb3BVcGxvYWQuanMnO1xuXG5pbXBvcnQgdHlwZSB7TWV0YSwgU3RvcnlPYmp9IGZyb20gJ0BubGFicy9sZXgvc3Rvcnlib29rJztcblxuY29uc3QgbWV0YTogTWV0YTx0eXBlb2YgRHJvcFVwbG9hZD4gPSB7XG4gIGFyZ1R5cGVzOiB7XG4gICAgYWNjZXB0OiB7XG4gICAgICBjb250cm9sOiAndGV4dCdcbiAgICB9LFxuICAgIGRpc2FibGVkOiB7XG4gICAgICBjb250cm9sOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGhlbHBlclRleHQ6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH0sXG4gICAgbGFiZWw6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH0sXG4gICAgbWF4RmlsZXM6IHtcbiAgICAgIGNvbnRyb2w6ICdudW1iZXInXG4gICAgfSxcbiAgICBtdWx0aXBsZToge1xuICAgICAgY29udHJvbDogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBzaG93UHJldmlld3M6IHtcbiAgICAgIGNvbnRyb2w6ICdib29sZWFuJ1xuICAgIH1cbiAgfSxcbiAgY29tcG9uZW50OiBEcm9wVXBsb2FkLFxuICBwYXJhbWV0ZXJzOiB7XG4gICAgbGF5b3V0OiAnY2VudGVyZWQnXG4gIH0sXG4gIHRpdGxlOiAnQ29tcG9uZW50cy9Gb3JtL0Ryb3BVcGxvYWQnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRhO1xuXG50eXBlIFN0b3J5ID0gU3RvcnlPYmo8dHlwZW9mIERyb3BVcGxvYWQ+O1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdDogU3RvcnkgPSB7XG4gIGFyZ3M6IHtcbiAgICBhY2NlcHQ6ICdpbWFnZS8qLC5wZGYnLFxuICAgIGhlbHBlclRleHQ6ICdQTkcsIEpQRywgb3IgUERGIHVwIHRvIDUgTUInLFxuICAgIGxhYmVsOiAnRHJvcCBhc3NldHMgaGVyZSBvcicsXG4gICAgbWF4RmlsZXM6IDMsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgc2hvd1ByZXZpZXdzOiBmYWxzZSxcbiAgICB0cmFuc2Zvcm1JbWFnZXM6IGZhbHNlXG4gIH0sXG4gIHBsYXk6IGludGVyYWN0V2l0aENhbnZhc1xufTtcbiJdLCJuYW1lcyI6WyJSZWFjdCIsImludGVyYWN0V2l0aENhbnZhcyIsIkRyb3BVcGxvYWQiLCJtZXRhIiwiYXJnVHlwZXMiLCJhY2NlcHQiLCJjb250cm9sIiwiZGlzYWJsZWQiLCJoZWxwZXJUZXh0IiwibGFiZWwiLCJtYXhGaWxlcyIsIm11bHRpcGxlIiwic2hvd1ByZXZpZXdzIiwiY29tcG9uZW50IiwicGFyYW1ldGVycyIsImxheW91dCIsInRpdGxlIiwiRGVmYXVsdCIsImFyZ3MiLCJ0cmFuc2Zvcm1JbWFnZXMiLCJwbGF5Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFFMUIsU0FBUUMsa0JBQWtCLFFBQU8sbUNBQW1DO0FBQ3BFLFNBQVFDLFVBQVUsUUFBTyxrQkFBa0I7QUFJM0MsTUFBTUMsT0FBZ0M7SUFDcENDLFVBQVU7UUFDUkMsUUFBUTtZQUNOQyxTQUFTO1FBQ1g7UUFDQUMsVUFBVTtZQUNSRCxTQUFTO1FBQ1g7UUFDQUUsWUFBWTtZQUNWRixTQUFTO1FBQ1g7UUFDQUcsT0FBTztZQUNMSCxTQUFTO1FBQ1g7UUFDQUksVUFBVTtZQUNSSixTQUFTO1FBQ1g7UUFDQUssVUFBVTtZQUNSTCxTQUFTO1FBQ1g7UUFDQU0sY0FBYztZQUNaTixTQUFTO1FBQ1g7SUFDRjtJQUNBTyxXQUFXWDtJQUNYWSxZQUFZO1FBQ1ZDLFFBQVE7SUFDVjtJQUNBQyxPQUFPO0FBQ1Q7QUFFQSxlQUFlYixLQUFLO0FBSXBCLE9BQU8sTUFBTWMsVUFBaUI7SUFDNUJDLE1BQU07UUFDSmIsUUFBUTtRQUNSRyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsVUFBVTtRQUNWQyxVQUFVO1FBQ1ZDLGNBQWM7UUFDZE8saUJBQWlCO0lBQ25CO0lBQ0FDLE1BQU1uQjtBQUNSLEVBQUUifQ==
@@ -0,0 +1,11 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export type EmptyMediaVariant = 'default' | 'icon';
3
+ export declare const Empty: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => import("react").JSX.Element;
4
+ export declare const EmptyHeader: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => import("react").JSX.Element;
5
+ export interface EmptyMediaProps extends HTMLAttributes<HTMLDivElement> {
6
+ readonly variant?: EmptyMediaVariant;
7
+ }
8
+ export declare const EmptyMedia: ({ className, variant, ...props }: EmptyMediaProps) => import("react").JSX.Element;
9
+ export declare const EmptyTitle: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => import("react").JSX.Element;
10
+ export declare const EmptyDescription: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => import("react").JSX.Element;
11
+ export declare const EmptyContent: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => import("react").JSX.Element;
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '@nlabs/utils';
3
+ const mediaClasses = {
4
+ default: 'bg-transparent',
5
+ icon: 'flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*=size-])]:size-6'
6
+ };
7
+ export const Empty = ({ className, ...props })=>/*#__PURE__*/ _jsx("div", {
8
+ className: cn('flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border border-dashed border-border p-6 text-center text-balance md:p-12', className),
9
+ "data-slot": "empty",
10
+ ...props
11
+ });
12
+ export const EmptyHeader = ({ className, ...props })=>/*#__PURE__*/ _jsx("div", {
13
+ className: cn('flex max-w-sm flex-col items-center gap-2 text-center', className),
14
+ "data-slot": "empty-header",
15
+ ...props
16
+ });
17
+ export const EmptyMedia = ({ className, variant = 'default', ...props })=>/*#__PURE__*/ _jsx("div", {
18
+ className: cn('mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0', mediaClasses[variant], className),
19
+ "data-slot": "empty-media",
20
+ "data-variant": variant,
21
+ ...props
22
+ });
23
+ export const EmptyTitle = ({ className, ...props })=>/*#__PURE__*/ _jsx("div", {
24
+ className: cn('text-lg font-medium tracking-tight', className),
25
+ "data-slot": "empty-title",
26
+ ...props
27
+ });
28
+ export const EmptyDescription = ({ className, ...props })=>/*#__PURE__*/ _jsx("p", {
29
+ className: cn('text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary', className),
30
+ "data-slot": "empty-description",
31
+ ...props
32
+ });
33
+ export const EmptyContent = ({ className, ...props })=>/*#__PURE__*/ _jsx("div", {
34
+ className: cn('flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance', className),
35
+ "data-slot": "empty-content",
36
+ ...props
37
+ });
38
+
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0VtcHR5L0VtcHR5LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7SFRNTEF0dHJpYnV0ZXN9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IHR5cGUgRW1wdHlNZWRpYVZhcmlhbnQgPSAnZGVmYXVsdCcgfCAnaWNvbic7XG5cbmNvbnN0IG1lZGlhQ2xhc3NlczogUmVjb3JkPEVtcHR5TWVkaWFWYXJpYW50LCBzdHJpbmc+ID0ge1xuICBkZWZhdWx0OiAnYmctdHJhbnNwYXJlbnQnLFxuICBpY29uOiAnZmxleCBzaXplLTEwIHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWxnIGJnLW11dGVkIHRleHQtZm9yZWdyb3VuZCBbJl9zdmc6bm90KFtjbGFzcyo9c2l6ZS1dKV06c2l6ZS02J1xufTtcblxuZXhwb3J0IGNvbnN0IEVtcHR5ID0gKHtjbGFzc05hbWUsIC4uLnByb3BzfTogSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9e2NuKCdmbGV4IG1pbi13LTAgZmxleC0xIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtNiByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZGFzaGVkIGJvcmRlci1ib3JkZXIgcC02IHRleHQtY2VudGVyIHRleHQtYmFsYW5jZSBtZDpwLTEyJywgY2xhc3NOYW1lKX1cbiAgICBkYXRhLXNsb3Q9XCJlbXB0eVwiXG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcblxuZXhwb3J0IGNvbnN0IEVtcHR5SGVhZGVyID0gKHtjbGFzc05hbWUsIC4uLnByb3BzfTogSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9e2NuKCdmbGV4IG1heC13LXNtIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LWNlbnRlcicsIGNsYXNzTmFtZSl9XG4gICAgZGF0YS1zbG90PVwiZW1wdHktaGVhZGVyXCJcbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5TWVkaWFQcm9wcyBleHRlbmRzIEhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PiB7XG4gIHJlYWRvbmx5IHZhcmlhbnQ/OiBFbXB0eU1lZGlhVmFyaWFudDtcbn1cblxuZXhwb3J0IGNvbnN0IEVtcHR5TWVkaWEgPSAoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQgPSAnZGVmYXVsdCcsXG4gIC4uLnByb3BzXG59OiBFbXB0eU1lZGlhUHJvcHMpID0+IChcbiAgPGRpdlxuICAgIGNsYXNzTmFtZT17Y24oJ21iLTIgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAnLCBtZWRpYUNsYXNzZXNbdmFyaWFudF0sIGNsYXNzTmFtZSl9XG4gICAgZGF0YS1zbG90PVwiZW1wdHktbWVkaWFcIlxuICAgIGRhdGEtdmFyaWFudD17dmFyaWFudH1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pO1xuXG5leHBvcnQgY29uc3QgRW1wdHlUaXRsZSA9ICh7Y2xhc3NOYW1lLCAuLi5wcm9wc306IEhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PikgPT4gKFxuICA8ZGl2XG4gICAgY2xhc3NOYW1lPXtjbigndGV4dC1sZyBmb250LW1lZGl1bSB0cmFja2luZy10aWdodCcsIGNsYXNzTmFtZSl9XG4gICAgZGF0YS1zbG90PVwiZW1wdHktdGl0bGVcIlxuICAgIHsuLi5wcm9wc31cbiAgLz5cbik7XG5cbmV4cG9ydCBjb25zdCBFbXB0eURlc2NyaXB0aW9uID0gKHtjbGFzc05hbWUsIC4uLnByb3BzfTogSFRNTEF0dHJpYnV0ZXM8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KSA9PiAoXG4gIDxwXG4gICAgY2xhc3NOYW1lPXtjbigndGV4dC1zbS9yZWxheGVkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBbJj5hXTp1bmRlcmxpbmUgWyY+YV06dW5kZXJsaW5lLW9mZnNldC00IFsmPmE6aG92ZXJdOnRleHQtcHJpbWFyeScsIGNsYXNzTmFtZSl9XG4gICAgZGF0YS1zbG90PVwiZW1wdHktZGVzY3JpcHRpb25cIlxuICAgIHsuLi5wcm9wc31cbiAgLz5cbik7XG5cbmV4cG9ydCBjb25zdCBFbXB0eUNvbnRlbnQgPSAoe2NsYXNzTmFtZSwgLi4ucHJvcHN9OiBIVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4pID0+IChcbiAgPGRpdlxuICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggdy1mdWxsIG1heC13LXNtIG1pbi13LTAgZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC00IHRleHQtc20gdGV4dC1iYWxhbmNlJywgY2xhc3NOYW1lKX1cbiAgICBkYXRhLXNsb3Q9XCJlbXB0eS1jb250ZW50XCJcbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pO1xuIl0sIm5hbWVzIjpbImNuIiwibWVkaWFDbGFzc2VzIiwiZGVmYXVsdCIsImljb24iLCJFbXB0eSIsImNsYXNzTmFtZSIsInByb3BzIiwiZGl2IiwiZGF0YS1zbG90IiwiRW1wdHlIZWFkZXIiLCJFbXB0eU1lZGlhIiwidmFyaWFudCIsImRhdGEtdmFyaWFudCIsIkVtcHR5VGl0bGUiLCJFbXB0eURlc2NyaXB0aW9uIiwicCIsIkVtcHR5Q29udGVudCJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVFBLEVBQUUsUUFBTyxlQUFlO0FBTWhDLE1BQU1DLGVBQWtEO0lBQ3REQyxTQUFTO0lBQ1RDLE1BQU07QUFDUjtBQUVBLE9BQU8sTUFBTUMsUUFBUSxDQUFDLEVBQUNDLFNBQVMsRUFBRSxHQUFHQyxPQUFzQyxpQkFDekUsS0FBQ0M7UUFDQ0YsV0FBV0wsR0FBRyxxSkFBcUpLO1FBQ25LRyxhQUFVO1FBQ1QsR0FBR0YsS0FBSztPQUVYO0FBRUYsT0FBTyxNQUFNRyxjQUFjLENBQUMsRUFBQ0osU0FBUyxFQUFFLEdBQUdDLE9BQXNDLGlCQUMvRSxLQUFDQztRQUNDRixXQUFXTCxHQUFHLHlEQUF5REs7UUFDdkVHLGFBQVU7UUFDVCxHQUFHRixLQUFLO09BRVg7QUFNRixPQUFPLE1BQU1JLGFBQWEsQ0FBQyxFQUN6QkwsU0FBUyxFQUNUTSxVQUFVLFNBQVMsRUFDbkIsR0FBR0wsT0FDYSxpQkFDaEIsS0FBQ0M7UUFDQ0YsV0FBV0wsR0FBRywrRkFBK0ZDLFlBQVksQ0FBQ1UsUUFBUSxFQUFFTjtRQUNwSUcsYUFBVTtRQUNWSSxnQkFBY0Q7UUFDYixHQUFHTCxLQUFLO09BRVg7QUFFRixPQUFPLE1BQU1PLGFBQWEsQ0FBQyxFQUFDUixTQUFTLEVBQUUsR0FBR0MsT0FBc0MsaUJBQzlFLEtBQUNDO1FBQ0NGLFdBQVdMLEdBQUcsc0NBQXNDSztRQUNwREcsYUFBVTtRQUNULEdBQUdGLEtBQUs7T0FFWDtBQUVGLE9BQU8sTUFBTVEsbUJBQW1CLENBQUMsRUFBQ1QsU0FBUyxFQUFFLEdBQUdDLE9BQTRDLGlCQUMxRixLQUFDUztRQUNDVixXQUFXTCxHQUFHLDJHQUEyR0s7UUFDekhHLGFBQVU7UUFDVCxHQUFHRixLQUFLO09BRVg7QUFFRixPQUFPLE1BQU1VLGVBQWUsQ0FBQyxFQUFDWCxTQUFTLEVBQUUsR0FBR0MsT0FBc0MsaUJBQ2hGLEtBQUNDO1FBQ0NGLFdBQVdMLEdBQUcsaUZBQWlGSztRQUMvRkcsYUFBVTtRQUNULEdBQUdGLEtBQUs7T0FFWCJ9
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Search } from 'lucide-react';
4
+ import { interactWithCanvas } from '../../utils/storyInteractions.js';
5
+ import { Button } from '../Button/Button.js';
6
+ import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from './Empty.js';
7
+ const meta = {
8
+ argTypes: {
9
+ className: {
10
+ control: 'text'
11
+ }
12
+ },
13
+ component: Empty,
14
+ parameters: {
15
+ layout: 'centered'
16
+ },
17
+ title: 'Components/Empty'
18
+ };
19
+ export default meta;
20
+ export const Default = {
21
+ args: {
22
+ className: 'w-[28rem]'
23
+ },
24
+ play: interactWithCanvas,
25
+ render: (args)=>/*#__PURE__*/ _jsxs(Empty, {
26
+ ...args,
27
+ children: [
28
+ /*#__PURE__*/ _jsxs(EmptyHeader, {
29
+ children: [
30
+ /*#__PURE__*/ _jsx(EmptyMedia, {
31
+ variant: "icon",
32
+ children: /*#__PURE__*/ _jsx(Search, {})
33
+ }),
34
+ /*#__PURE__*/ _jsx(EmptyTitle, {
35
+ children: "No results"
36
+ }),
37
+ /*#__PURE__*/ _jsx(EmptyDescription, {
38
+ children: "Try changing the filters or creating a new saved view."
39
+ })
40
+ ]
41
+ }),
42
+ /*#__PURE__*/ _jsx(EmptyContent, {
43
+ children: /*#__PURE__*/ _jsx(Button, {
44
+ label: "Create view",
45
+ size: "sm"
46
+ })
47
+ })
48
+ ]
49
+ })
50
+ };
51
+
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0VtcHR5L0VtcHR5LnN0b3JpZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1NlYXJjaH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7aW50ZXJhY3RXaXRoQ2FudmFzfSBmcm9tICcuLi8uLi91dGlscy9zdG9yeUludGVyYWN0aW9ucy5qcyc7XG5pbXBvcnQge0J1dHRvbn0gZnJvbSAnLi4vQnV0dG9uL0J1dHRvbi5qcyc7XG5pbXBvcnQge0VtcHR5LCBFbXB0eUNvbnRlbnQsIEVtcHR5RGVzY3JpcHRpb24sIEVtcHR5SGVhZGVyLCBFbXB0eU1lZGlhLCBFbXB0eVRpdGxlfSBmcm9tICcuL0VtcHR5LmpzJztcblxuaW1wb3J0IHR5cGUge01ldGEsIFN0b3J5T2JqfSBmcm9tICdAbmxhYnMvbGV4L3N0b3J5Ym9vayc7XG5cbmNvbnN0IG1ldGE6IE1ldGE8dHlwZW9mIEVtcHR5PiA9IHtcbiAgYXJnVHlwZXM6IHtcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH1cbiAgfSxcbiAgY29tcG9uZW50OiBFbXB0eSxcbiAgcGFyYW1ldGVyczoge1xuICAgIGxheW91dDogJ2NlbnRlcmVkJ1xuICB9LFxuICB0aXRsZTogJ0NvbXBvbmVudHMvRW1wdHknXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRhO1xuXG50eXBlIFN0b3J5ID0gU3RvcnlPYmo8dHlwZW9mIEVtcHR5PjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHQ6IFN0b3J5ID0ge1xuICBhcmdzOiB7XG4gICAgY2xhc3NOYW1lOiAndy1bMjhyZW1dJ1xuICB9LFxuICBwbGF5OiBpbnRlcmFjdFdpdGhDYW52YXMsXG4gIHJlbmRlcjogKGFyZ3MpID0+IChcbiAgICA8RW1wdHkgey4uLmFyZ3N9PlxuICAgICAgPEVtcHR5SGVhZGVyPlxuICAgICAgICA8RW1wdHlNZWRpYSB2YXJpYW50PVwiaWNvblwiPlxuICAgICAgICAgIDxTZWFyY2ggLz5cbiAgICAgICAgPC9FbXB0eU1lZGlhPlxuICAgICAgICA8RW1wdHlUaXRsZT5ObyByZXN1bHRzPC9FbXB0eVRpdGxlPlxuICAgICAgICA8RW1wdHlEZXNjcmlwdGlvbj5UcnkgY2hhbmdpbmcgdGhlIGZpbHRlcnMgb3IgY3JlYXRpbmcgYSBuZXcgc2F2ZWQgdmlldy48L0VtcHR5RGVzY3JpcHRpb24+XG4gICAgICA8L0VtcHR5SGVhZGVyPlxuICAgICAgPEVtcHR5Q29udGVudD5cbiAgICAgICAgPEJ1dHRvbiBsYWJlbD1cIkNyZWF0ZSB2aWV3XCIgc2l6ZT1cInNtXCIgLz5cbiAgICAgIDwvRW1wdHlDb250ZW50PlxuICAgIDwvRW1wdHk+XG4gIClcbn07XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJTZWFyY2giLCJpbnRlcmFjdFdpdGhDYW52YXMiLCJCdXR0b24iLCJFbXB0eSIsIkVtcHR5Q29udGVudCIsIkVtcHR5RGVzY3JpcHRpb24iLCJFbXB0eUhlYWRlciIsIkVtcHR5TWVkaWEiLCJFbXB0eVRpdGxlIiwibWV0YSIsImFyZ1R5cGVzIiwiY2xhc3NOYW1lIiwiY29udHJvbCIsImNvbXBvbmVudCIsInBhcmFtZXRlcnMiLCJsYXlvdXQiLCJ0aXRsZSIsIkRlZmF1bHQiLCJhcmdzIiwicGxheSIsInJlbmRlciIsInZhcmlhbnQiLCJsYWJlbCIsInNpemUiXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsa0JBQWtCLFFBQU8sbUNBQW1DO0FBQ3BFLFNBQVFDLE1BQU0sUUFBTyxzQkFBc0I7QUFDM0MsU0FBUUMsS0FBSyxFQUFFQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxXQUFXLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxRQUFPLGFBQWE7QUFJdEcsTUFBTUMsT0FBMkI7SUFDL0JDLFVBQVU7UUFDUkMsV0FBVztZQUNUQyxTQUFTO1FBQ1g7SUFDRjtJQUNBQyxXQUFXVjtJQUNYVyxZQUFZO1FBQ1ZDLFFBQVE7SUFDVjtJQUNBQyxPQUFPO0FBQ1Q7QUFFQSxlQUFlUCxLQUFLO0FBSXBCLE9BQU8sTUFBTVEsVUFBaUI7SUFDNUJDLE1BQU07UUFDSlAsV0FBVztJQUNiO0lBQ0FRLE1BQU1sQjtJQUNObUIsUUFBUSxDQUFDRixxQkFDUCxNQUFDZjtZQUFPLEdBQUdlLElBQUk7OzhCQUNiLE1BQUNaOztzQ0FDQyxLQUFDQzs0QkFBV2MsU0FBUTtzQ0FDbEIsY0FBQSxLQUFDckI7O3NDQUVILEtBQUNRO3NDQUFXOztzQ0FDWixLQUFDSDtzQ0FBaUI7Ozs7OEJBRXBCLEtBQUNEOzhCQUNDLGNBQUEsS0FBQ0Y7d0JBQU9vQixPQUFNO3dCQUFjQyxNQUFLOzs7OztBQUl6QyxFQUFFIn0=
@@ -0,0 +1,15 @@
1
+ import type { ButtonProps } from '../Button/Button.js';
2
+ import type { ReactNode } from 'react';
3
+ export interface EmptyStateProps {
4
+ readonly action?: ReactNode;
5
+ readonly actionClassName?: string;
6
+ readonly actionIcon?: ReactNode;
7
+ readonly actionLabel?: string;
8
+ readonly actionProps?: Omit<ButtonProps, 'children' | 'icon' | 'label' | 'onClick' | 'variant'>;
9
+ readonly className?: string;
10
+ readonly description: string;
11
+ readonly icon?: ReactNode;
12
+ readonly onAction?: () => void;
13
+ readonly title: string;
14
+ }
15
+ export declare const EmptyState: ({ action, actionClassName, actionIcon, actionLabel, actionProps, className, description, icon, onAction, title }: EmptyStateProps) => import("react").JSX.Element;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '@nlabs/utils';
3
+ import { Button } from '../Button/Button.js';
4
+ const defaultIcon = /*#__PURE__*/ _jsx("svg", {
5
+ "aria-hidden": "true",
6
+ className: "mx-auto size-12 text-gray-400 dark:text-gray-500",
7
+ fill: "none",
8
+ stroke: "currentColor",
9
+ viewBox: "0 0 24 24",
10
+ children: /*#__PURE__*/ _jsx("path", {
11
+ d: "M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z",
12
+ strokeLinecap: "round",
13
+ strokeLinejoin: "round",
14
+ strokeWidth: 2,
15
+ vectorEffect: "non-scaling-stroke"
16
+ })
17
+ });
18
+ export const EmptyState = ({ action, actionClassName, actionIcon, actionLabel, actionProps, className, description, icon = defaultIcon, onAction, title })=>/*#__PURE__*/ _jsxs("div", {
19
+ className: cn('flex flex-col items-center text-center', className),
20
+ children: [
21
+ icon,
22
+ /*#__PURE__*/ _jsx("h3", {
23
+ className: "mt-2 text-sm font-semibold text-gray-900 dark:text-white",
24
+ children: title
25
+ }),
26
+ /*#__PURE__*/ _jsx("p", {
27
+ className: "mt-1 text-sm text-gray-500 dark:text-gray-400",
28
+ children: description
29
+ }),
30
+ (action || actionLabel) && /*#__PURE__*/ _jsx("div", {
31
+ className: "mt-6 flex justify-center",
32
+ children: action || /*#__PURE__*/ _jsx(Button, {
33
+ className: actionClassName,
34
+ icon: actionIcon,
35
+ label: actionLabel,
36
+ onClick: onAction,
37
+ variant: "contained",
38
+ ...actionProps
39
+ })
40
+ })
41
+ ]
42
+ });
43
+
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0VtcHR5U3RhdGUvRW1wdHlTdGF0ZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjbn0gZnJvbSAnQG5sYWJzL3V0aWxzJztcblxuaW1wb3J0IHtCdXR0b259IGZyb20gJy4uL0J1dHRvbi9CdXR0b24uanMnO1xuXG5pbXBvcnQgdHlwZSB7QnV0dG9uUHJvcHN9IGZyb20gJy4uL0J1dHRvbi9CdXR0b24uanMnO1xuaW1wb3J0IHR5cGUge1JlYWN0Tm9kZX0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5U3RhdGVQcm9wcyB7XG4gIHJlYWRvbmx5IGFjdGlvbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgYWN0aW9uQ2xhc3NOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBhY3Rpb25JY29uPzogUmVhY3ROb2RlO1xuICByZWFkb25seSBhY3Rpb25MYWJlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgYWN0aW9uUHJvcHM/OiBPbWl0PEJ1dHRvblByb3BzLCAnY2hpbGRyZW4nIHwgJ2ljb24nIHwgJ2xhYmVsJyB8ICdvbkNsaWNrJyB8ICd2YXJpYW50Jz47XG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgaWNvbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgb25BY3Rpb24/OiAoKSA9PiB2b2lkO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xufVxuXG5jb25zdCBkZWZhdWx0SWNvbiA9IChcbiAgPHN2Z1xuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgY2xhc3NOYW1lPVwibXgtYXV0byBzaXplLTEyIHRleHQtZ3JheS00MDAgZGFyazp0ZXh0LWdyYXktNTAwXCJcbiAgICBmaWxsPVwibm9uZVwiXG4gICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgPlxuICAgIDxwYXRoXG4gICAgICBkPVwiTTkgMTNoNm0tMy0zdjZtLTkgMVY3YTIgMiAwIDAxMi0yaDZsMiAyaDZhMiAyIDAgMDEyIDJ2OGEyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJ6XCJcbiAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgdmVjdG9yRWZmZWN0PVwibm9uLXNjYWxpbmctc3Ryb2tlXCJcbiAgICAvPlxuICA8L3N2Zz5cbik7XG5cbmV4cG9ydCBjb25zdCBFbXB0eVN0YXRlID0gKHtcbiAgYWN0aW9uLFxuICBhY3Rpb25DbGFzc05hbWUsXG4gIGFjdGlvbkljb24sXG4gIGFjdGlvbkxhYmVsLFxuICBhY3Rpb25Qcm9wcyxcbiAgY2xhc3NOYW1lLFxuICBkZXNjcmlwdGlvbixcbiAgaWNvbiA9IGRlZmF1bHRJY29uLFxuICBvbkFjdGlvbixcbiAgdGl0bGVcbn06IEVtcHR5U3RhdGVQcm9wcykgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIHRleHQtY2VudGVyJywgY2xhc3NOYW1lKX0+XG4gICAge2ljb259XG4gICAgPGgzIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlXCI+e3RpdGxlfTwvaDM+XG4gICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwXCI+e2Rlc2NyaXB0aW9ufTwvcD5cbiAgICB7KGFjdGlvbiB8fCBhY3Rpb25MYWJlbCkgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02IGZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAge2FjdGlvbiB8fCAoXG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXthY3Rpb25DbGFzc05hbWV9XG4gICAgICAgICAgICBpY29uPXthY3Rpb25JY29ufVxuICAgICAgICAgICAgbGFiZWw9e2FjdGlvbkxhYmVsfVxuICAgICAgICAgICAgb25DbGljaz17b25BY3Rpb259XG4gICAgICAgICAgICB2YXJpYW50PVwiY29udGFpbmVkXCJcbiAgICAgICAgICAgIHsuLi5hY3Rpb25Qcm9wc31cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgPC9kaXY+XG4pO1xuIl0sIm5hbWVzIjpbImNuIiwiQnV0dG9uIiwiZGVmYXVsdEljb24iLCJzdmciLCJhcmlhLWhpZGRlbiIsImNsYXNzTmFtZSIsImZpbGwiLCJzdHJva2UiLCJ2aWV3Qm94IiwicGF0aCIsImQiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJzdHJva2VXaWR0aCIsInZlY3RvckVmZmVjdCIsIkVtcHR5U3RhdGUiLCJhY3Rpb24iLCJhY3Rpb25DbGFzc05hbWUiLCJhY3Rpb25JY29uIiwiYWN0aW9uTGFiZWwiLCJhY3Rpb25Qcm9wcyIsImRlc2NyaXB0aW9uIiwiaWNvbiIsIm9uQWN0aW9uIiwidGl0bGUiLCJkaXYiLCJoMyIsInAiLCJsYWJlbCIsIm9uQ2xpY2siLCJ2YXJpYW50Il0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBUUEsRUFBRSxRQUFPLGVBQWU7QUFFaEMsU0FBUUMsTUFBTSxRQUFPLHNCQUFzQjtBQWtCM0MsTUFBTUMsNEJBQ0osS0FBQ0M7SUFDQ0MsZUFBWTtJQUNaQyxXQUFVO0lBQ1ZDLE1BQUs7SUFDTEMsUUFBTztJQUNQQyxTQUFRO2NBRVIsY0FBQSxLQUFDQztRQUNDQyxHQUFFO1FBQ0ZDLGVBQWM7UUFDZEMsZ0JBQWU7UUFDZkMsYUFBYTtRQUNiQyxjQUFhOzs7QUFLbkIsT0FBTyxNQUFNQyxhQUFhLENBQUMsRUFDekJDLE1BQU0sRUFDTkMsZUFBZSxFQUNmQyxVQUFVLEVBQ1ZDLFdBQVcsRUFDWEMsV0FBVyxFQUNYZixTQUFTLEVBQ1RnQixXQUFXLEVBQ1hDLE9BQU9wQixXQUFXLEVBQ2xCcUIsUUFBUSxFQUNSQyxLQUFLLEVBQ1csaUJBQ2hCLE1BQUNDO1FBQUlwQixXQUFXTCxHQUFHLDBDQUEwQ0s7O1lBQzFEaUI7MEJBQ0QsS0FBQ0k7Z0JBQUdyQixXQUFVOzBCQUE0RG1COzswQkFDMUUsS0FBQ0c7Z0JBQUV0QixXQUFVOzBCQUFpRGdCOztZQUM1REwsQ0FBQUEsVUFBVUcsV0FBVSxtQkFDcEIsS0FBQ007Z0JBQUlwQixXQUFVOzBCQUNaVyx3QkFDQyxLQUFDZjtvQkFDQ0ksV0FBV1k7b0JBQ1hLLE1BQU1KO29CQUNOVSxPQUFPVDtvQkFDUFUsU0FBU047b0JBQ1RPLFNBQVE7b0JBQ1AsR0FBR1YsV0FBVzs7OztPQU16QiJ9