@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.
- package/LICENSE +21 -0
- package/MIGRATION.md +36 -0
- package/README.md +768 -0
- package/docs/assets/gothamui-app-architecture.svg +159 -0
- package/docs/assets/gothamui-logo.png +0 -0
- package/docs/assets/gothamui-logo.svg +42 -0
- package/docs/render-performance.md +34 -0
- package/lib/actions/GothamActions.d.ts +42 -0
- package/lib/actions/GothamActions.js +67 -0
- package/lib/actions/MarkdownActions.d.ts +4 -0
- package/lib/actions/MarkdownActions.js +48 -0
- package/lib/app.d.ts +1 -0
- package/lib/app.js +198 -0
- package/lib/components/Alert/Alert.d.ts +8 -0
- package/lib/components/Alert/Alert.js +24 -0
- package/lib/components/Alert/Alert.stories.js +59 -0
- package/lib/components/AuthRoute/AuthRoute.d.ts +3 -0
- package/lib/components/AuthRoute/AuthRoute.js +21 -0
- package/lib/components/AuthRoute/AuthRoute.stories.js +45 -0
- package/lib/components/AutocompleteField/AutocompleteField.d.ts +24 -0
- package/lib/components/AutocompleteField/AutocompleteField.js +148 -0
- package/lib/components/AutocompleteField/AutocompleteField.stories.js +62 -0
- package/lib/components/Avatar/Avatar.d.ts +29 -0
- package/lib/components/Avatar/Avatar.js +154 -0
- package/lib/components/Avatar/Avatar.stories.js +105 -0
- package/lib/components/Badge/Badge.d.ts +9 -0
- package/lib/components/Badge/Badge.js +22 -0
- package/lib/components/Badge/Badge.stories.js +53 -0
- package/lib/components/Breadcrumbs/Breadcrumbs.d.ts +19 -0
- package/lib/components/Breadcrumbs/Breadcrumbs.js +74 -0
- package/lib/components/Breadcrumbs/Breadcrumbs.stories.js +95 -0
- package/lib/components/Button/Button.d.ts +25 -0
- package/lib/components/Button/Button.js +157 -0
- package/lib/components/Button/Button.stories.js +119 -0
- package/lib/components/Card/Card.d.ts +8 -0
- package/lib/components/Card/Card.js +39 -0
- package/lib/components/Card/Card.stories.js +60 -0
- package/lib/components/CategoryGrid/CategoryGrid.d.ts +15 -0
- package/lib/components/CategoryGrid/CategoryGrid.js +42 -0
- package/lib/components/CategoryGrid/CategoryGrid.stories.js +35 -0
- package/lib/components/Chat/AudioMessage/AudioMessage.css +1 -0
- package/lib/components/Chat/AudioMessage/AudioMessage.d.ts +3 -0
- package/lib/components/Chat/AudioMessage/AudioMessage.js +28 -0
- package/lib/components/Chat/Avatar/Avatar.css +1 -0
- package/lib/components/Chat/Avatar/Avatar.d.ts +3 -0
- package/lib/components/Chat/Avatar/Avatar.js +72 -0
- package/lib/components/Chat/Button/Button.css +1 -0
- package/lib/components/Chat/Button/Button.d.ts +3 -0
- package/lib/components/Chat/Button/Button.js +37 -0
- package/lib/components/Chat/Chat.stories.js +688 -0
- package/lib/components/Chat/ChatItem/ChatItem.css +1 -0
- package/lib/components/Chat/ChatItem/ChatItem.d.ts +3 -0
- package/lib/components/Chat/ChatItem/ChatItem.js +183 -0
- package/lib/components/Chat/ChatList/ChatList.css +1 -0
- package/lib/components/Chat/ChatList/ChatList.d.ts +3 -0
- package/lib/components/Chat/ChatList/ChatList.js +84 -0
- package/lib/components/Chat/Circle/Circle.d.ts +3 -0
- package/lib/components/Chat/Circle/Circle.js +27 -0
- package/lib/components/Chat/Dropdown/Dropdown.css +1 -0
- package/lib/components/Chat/Dropdown/Dropdown.d.ts +3 -0
- package/lib/components/Chat/Dropdown/Dropdown.js +66 -0
- package/lib/components/Chat/FileMessage/FileMessage.css +1 -0
- package/lib/components/Chat/FileMessage/FileMessage.d.ts +3 -0
- package/lib/components/Chat/FileMessage/FileMessage.js +77 -0
- package/lib/components/Chat/Input/Input.css +1 -0
- package/lib/components/Chat/Input/Input.d.ts +3 -0
- package/lib/components/Chat/Input/Input.js +108 -0
- package/lib/components/Chat/LocationMessage/LocationMessage.css +1 -0
- package/lib/components/Chat/LocationMessage/LocationMessage.d.ts +3 -0
- package/lib/components/Chat/LocationMessage/LocationMessage.js +36 -0
- package/lib/components/Chat/MeetingItem/MeetingItem.css +1 -0
- package/lib/components/Chat/MeetingItem/MeetingItem.d.ts +3 -0
- package/lib/components/Chat/MeetingItem/MeetingItem.js +106 -0
- package/lib/components/Chat/MeetingLink/MeetingLink.css +1 -0
- package/lib/components/Chat/MeetingLink/MeetingLink.d.ts +3 -0
- package/lib/components/Chat/MeetingLink/MeetingLink.js +26 -0
- package/lib/components/Chat/MeetingList/MeetingList.css +1 -0
- package/lib/components/Chat/MeetingList/MeetingList.d.ts +3 -0
- package/lib/components/Chat/MeetingList/MeetingList.js +52 -0
- package/lib/components/Chat/MeetingMessage/MeetingMessage.css +1 -0
- package/lib/components/Chat/MeetingMessage/MeetingMessage.d.ts +3 -0
- package/lib/components/Chat/MeetingMessage/MeetingMessage.js +227 -0
- package/lib/components/Chat/MessageBox/MessageBox.css +1 -0
- package/lib/components/Chat/MessageBox/MessageBox.d.ts +3 -0
- package/lib/components/Chat/MessageBox/MessageBox.js +263 -0
- package/lib/components/Chat/MessageList/MessageList.css +1 -0
- package/lib/components/Chat/MessageList/MessageList.d.ts +2 -0
- package/lib/components/Chat/MessageList/MessageList.js +196 -0
- package/lib/components/Chat/Navbar/Navbar.css +1 -0
- package/lib/components/Chat/Navbar/Navbar.d.ts +3 -0
- package/lib/components/Chat/Navbar/Navbar.js +21 -0
- package/lib/components/Chat/PhotoMessage/PhotoMessage.css +1 -0
- package/lib/components/Chat/PhotoMessage/PhotoMessage.d.ts +3 -0
- package/lib/components/Chat/PhotoMessage/PhotoMessage.js +73 -0
- package/lib/components/Chat/Popup/Popup.css +1 -0
- package/lib/components/Chat/Popup/Popup.d.ts +3 -0
- package/lib/components/Chat/Popup/Popup.js +45 -0
- package/lib/components/Chat/README.md +50 -0
- package/lib/components/Chat/ReplyMessage/ReplyMessage.css +1 -0
- package/lib/components/Chat/ReplyMessage/ReplyMessage.d.ts +3 -0
- package/lib/components/Chat/ReplyMessage/ReplyMessage.js +42 -0
- package/lib/components/Chat/SideBar/SideBar.css +1 -0
- package/lib/components/Chat/SideBar/SideBar.d.ts +3 -0
- package/lib/components/Chat/SideBar/SideBar.js +21 -0
- package/lib/components/Chat/SpotifyMessage/SpotifyMessage.css +1 -0
- package/lib/components/Chat/SpotifyMessage/SpotifyMessage.d.ts +3 -0
- package/lib/components/Chat/SpotifyMessage/SpotifyMessage.js +28 -0
- package/lib/components/Chat/SystemMessage/SystemMessage.css +1 -0
- package/lib/components/Chat/SystemMessage/SystemMessage.d.ts +3 -0
- package/lib/components/Chat/SystemMessage/SystemMessage.js +14 -0
- package/lib/components/Chat/VideoMessage/VideoMessage.css +1 -0
- package/lib/components/Chat/VideoMessage/VideoMessage.d.ts +3 -0
- package/lib/components/Chat/VideoMessage/VideoMessage.js +88 -0
- package/lib/components/Chat/assets/img/leftArrow.svg +6 -0
- package/lib/components/Chat/assets/img/rightArrow.svg +6 -0
- package/lib/components/Chat/index.d.ts +25 -0
- package/lib/components/Chat/index.js +27 -0
- package/lib/components/Chat/type.d.js +52 -0
- package/lib/components/Chat/utils/formatRelativeDate.d.ts +4 -0
- package/lib/components/Chat/utils/formatRelativeDate.js +110 -0
- package/lib/components/Checkbox/Checkbox.d.ts +15 -0
- package/lib/components/Checkbox/Checkbox.js +106 -0
- package/lib/components/Checkbox/Checkbox.stories.js +51 -0
- package/lib/components/ComponentUtils/renderWithAsChild.d.ts +9 -0
- package/lib/components/ComponentUtils/renderWithAsChild.js +27 -0
- package/lib/components/Container/Container.d.ts +7 -0
- package/lib/components/Container/Container.js +16 -0
- package/lib/components/Container/Container.stories.js +36 -0
- package/lib/components/DateField/DateField.d.ts +22 -0
- package/lib/components/DateField/DateField.js +145 -0
- package/lib/components/DateField/DateField.stories.js +125 -0
- package/lib/components/DateField/DatePicker.d.ts +9 -0
- package/lib/components/DateField/DatePicker.js +205 -0
- package/lib/components/DateField/DatePicker.stories.js +33 -0
- package/lib/components/DescriptionList/DescriptionList.d.ts +4 -0
- package/lib/components/DescriptionList/DescriptionList.js +19 -0
- package/lib/components/DescriptionList/DescriptionList.stories.js +34 -0
- package/lib/components/Dialog/Dialog.d.ts +25 -0
- package/lib/components/Dialog/Dialog.js +66 -0
- package/lib/components/Dialog/Dialog.stories.js +88 -0
- package/lib/components/DropUpload/DropUpload.d.ts +37 -0
- package/lib/components/DropUpload/DropUpload.js +323 -0
- package/lib/components/DropUpload/DropUpload.stories.js +48 -0
- package/lib/components/Empty/Empty.d.ts +11 -0
- package/lib/components/Empty/Empty.js +39 -0
- package/lib/components/Empty/Empty.stories.js +52 -0
- package/lib/components/EmptyState/EmptyState.d.ts +15 -0
- package/lib/components/EmptyState/EmptyState.js +44 -0
- package/lib/components/EmptyState/EmptyState.stories.js +36 -0
- package/lib/components/ErrorMessage/ErrorMessage.d.ts +7 -0
- package/lib/components/ErrorMessage/ErrorMessage.js +20 -0
- package/lib/components/ErrorMessage/ErrorMessage.stories.js +25 -0
- package/lib/components/FaqSection/FaqSection.d.ts +14 -0
- package/lib/components/FaqSection/FaqSection.js +37 -0
- package/lib/components/FaqSection/FaqSection.stories.js +31 -0
- package/lib/components/Fieldset/Fieldset.d.ts +21 -0
- package/lib/components/Fieldset/Fieldset.js +39 -0
- package/lib/components/Fieldset/Fieldset.stories.js +42 -0
- package/lib/components/Footer/Footer.d.ts +26 -0
- package/lib/components/Footer/Footer.js +119 -0
- package/lib/components/Footer/Footer.stories.js +184 -0
- package/lib/components/Form/Form.d.ts +42 -0
- package/lib/components/Form/Form.js +198 -0
- package/lib/components/Form/Form.stories.js +65 -0
- package/lib/components/Form/FormContext.d.ts +35 -0
- package/lib/components/Form/FormContext.js +71 -0
- package/lib/components/GothamRoute/GothamRoute.d.ts +0 -0
- package/lib/components/GothamRoute/GothamRoute.js +56 -0
- package/lib/components/GothamRouter/GothamRouter.d.ts +0 -0
- package/lib/components/GothamRouter/GothamRouter.js +52 -0
- package/lib/components/Heading/Heading.d.ts +7 -0
- package/lib/components/Heading/Heading.js +20 -0
- package/lib/components/Heading/Heading.stories.js +51 -0
- package/lib/components/IncentiveGrid/IncentiveGrid.d.ts +15 -0
- package/lib/components/IncentiveGrid/IncentiveGrid.js +34 -0
- package/lib/components/IncentiveGrid/IncentiveGrid.stories.js +41 -0
- package/lib/components/InputField/InputField.d.ts +25 -0
- package/lib/components/InputField/InputField.js +68 -0
- package/lib/components/InputField/InputField.stories.js +58 -0
- package/lib/components/Item/Item.d.ts +25 -0
- package/lib/components/Item/Item.js +79 -0
- package/lib/components/Item/Item.stories.js +94 -0
- package/lib/components/Kbd/Kbd.d.ts +2 -0
- package/lib/components/Kbd/Kbd.js +9 -0
- package/lib/components/Kbd/Kbd.stories.js +24 -0
- package/lib/components/Label/Label.d.ts +11 -0
- package/lib/components/Label/Label.js +23 -0
- package/lib/components/Label/Label.stories.js +38 -0
- package/lib/components/Link/Link.d.ts +7 -0
- package/lib/components/Link/Link.js +13 -0
- package/lib/components/Link/Link.stories.js +28 -0
- package/lib/components/ListContainer/ListContainer.d.ts +8 -0
- package/lib/components/ListContainer/ListContainer.js +14 -0
- package/lib/components/ListContainer/ListContainer.stories.js +45 -0
- package/lib/components/Loader/Loader.d.ts +9 -0
- package/lib/components/Loader/Loader.js +36 -0
- package/lib/components/Loader/Loader.stories.js +94 -0
- package/lib/components/LogoCloud/LogoCloud.d.ts +15 -0
- package/lib/components/LogoCloud/LogoCloud.js +43 -0
- package/lib/components/LogoCloud/LogoCloud.stories.js +28 -0
- package/lib/components/Markdown/Markdown.d.ts +8 -0
- package/lib/components/Markdown/Markdown.js +64 -0
- package/lib/components/Markdown/Markdown.stories.js +34 -0
- package/lib/components/MediaLightbox/MediaLightbox.d.ts +22 -0
- package/lib/components/MediaLightbox/MediaLightbox.js +80 -0
- package/lib/components/MediaObject/MediaObject.d.ts +8 -0
- package/lib/components/MediaObject/MediaObject.js +37 -0
- package/lib/components/MediaObject/MediaObject.stories.js +28 -0
- package/lib/components/Navbar/Navbar.d.ts +43 -0
- package/lib/components/Navbar/Navbar.js +213 -0
- package/lib/components/Navbar/Navbar.stories.js +235 -0
- package/lib/components/NotFound/NotFound.d.ts +34 -0
- package/lib/components/NotFound/NotFound.js +351 -0
- package/lib/components/NotFound/NotFound.stories.js +80 -0
- package/lib/components/Notify/Notify.d.ts +18 -0
- package/lib/components/Notify/Notify.js +178 -0
- package/lib/components/Notify/Notify.stories.js +148 -0
- package/lib/components/Notify/NotifyExample.d.ts +1 -0
- package/lib/components/Notify/NotifyExample.js +174 -0
- package/lib/components/Notify/README.md +103 -0
- package/lib/components/Pagination/Pagination.d.ts +18 -0
- package/lib/components/Pagination/Pagination.js +225 -0
- package/lib/components/Pagination/Pagination.stories.js +69 -0
- package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.d.ts +12 -0
- package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.js +88 -0
- package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.js +16 -0
- package/lib/components/PaymentMethodPanel/PaymentMethodPanel.d.ts +18 -0
- package/lib/components/PaymentMethodPanel/PaymentMethodPanel.js +113 -0
- package/lib/components/PaymentMethodPanel/PaymentMethodPanel.stories.js +88 -0
- package/lib/components/Pricing/Pricing.d.ts +78 -0
- package/lib/components/Pricing/Pricing.js +764 -0
- package/lib/components/Pricing/Pricing.stories.js +146 -0
- package/lib/components/ProductGrid/ProductGrid.d.ts +23 -0
- package/lib/components/ProductGrid/ProductGrid.js +79 -0
- package/lib/components/ProductGrid/ProductGrid.stories.js +50 -0
- package/lib/components/ProgressSteps/ProgressSteps.d.ts +13 -0
- package/lib/components/ProgressSteps/ProgressSteps.js +51 -0
- package/lib/components/ProgressSteps/ProgressSteps.stories.js +35 -0
- package/lib/components/RadioField/RadioField.d.ts +16 -0
- package/lib/components/RadioField/RadioField.js +63 -0
- package/lib/components/RadioField/RadioField.stories.js +140 -0
- package/lib/components/ReviewList/ReviewList.d.ts +15 -0
- package/lib/components/ReviewList/ReviewList.js +51 -0
- package/lib/components/ReviewList/ReviewList.stories.js +29 -0
- package/lib/components/SectionHeader/SectionHeader.d.ts +9 -0
- package/lib/components/SectionHeader/SectionHeader.js +36 -0
- package/lib/components/SectionHeader/SectionHeader.stories.js +35 -0
- package/lib/components/SelectField/SelectField.d.ts +18 -0
- package/lib/components/SelectField/SelectField.js +145 -0
- package/lib/components/SelectField/SelectField.stories.js +155 -0
- package/lib/components/SelectField/SelectOption.d.ts +13 -0
- package/lib/components/SelectField/SelectOption.js +40 -0
- package/lib/components/SelectField/SelectOption.stories.js +40 -0
- package/lib/components/Separator/Separator.d.ts +6 -0
- package/lib/components/Separator/Separator.js +13 -0
- package/lib/components/Separator/Separator.stories.js +70 -0
- package/lib/components/Skeleton/Skeleton.d.ts +2 -0
- package/lib/components/Skeleton/Skeleton.js +9 -0
- package/lib/components/Skeleton/Skeleton.stories.js +24 -0
- package/lib/components/Svg/Svg.d.ts +9 -0
- package/lib/components/Svg/Svg.js +25 -0
- package/lib/components/Svg/Svg.stories.js +34 -0
- package/lib/components/Switch/Switch.d.ts +12 -0
- package/lib/components/Switch/Switch.js +54 -0
- package/lib/components/Switch/Switch.stories.js +61 -0
- package/lib/components/Table/Table.d.ts +18 -0
- package/lib/components/Table/Table.js +99 -0
- package/lib/components/Table/Table.stories.js +79 -0
- package/lib/components/Tabs/Tabs.d.ts +17 -0
- package/lib/components/Tabs/Tabs.js +85 -0
- package/lib/components/Tabs/Tabs.stories.js +45 -0
- package/lib/components/Text/Text.d.ts +5 -0
- package/lib/components/Text/Text.js +24 -0
- package/lib/components/Text/Text.stories.js +35 -0
- package/lib/components/TextField/TextField.d.ts +31 -0
- package/lib/components/TextField/TextField.js +91 -0
- package/lib/components/TextField/TextField.stories.js +158 -0
- package/lib/components/Textarea/Textarea.d.ts +5 -0
- package/lib/components/Textarea/Textarea.js +10 -0
- package/lib/components/Textarea/Textarea.stories.js +32 -0
- package/lib/components/index.d.ts +60 -0
- package/lib/components/index.js +62 -0
- package/lib/config/appConfig.d.ts +5 -0
- package/lib/config/appConfig.js +20 -0
- package/lib/constants/AuthConstants.d.ts +8 -0
- package/lib/constants/AuthConstants.js +9 -0
- package/lib/constants/GothamConstants.d.ts +24 -0
- package/lib/constants/GothamConstants.js +25 -0
- package/lib/constants/MarkdownConstants.d.ts +8 -0
- package/lib/constants/MarkdownConstants.js +9 -0
- package/lib/constants/MessageConstants.d.ts +10 -0
- package/lib/constants/MessageConstants.js +11 -0
- package/lib/docs/analytics.md +231 -0
- package/lib/docs/api-reference.md +364 -0
- package/lib/docs/comparison.md +83 -0
- package/lib/docs/containers.md +11 -0
- package/lib/docs/gettingStarted.md +338 -0
- package/lib/docs/payments.md +79 -0
- package/lib/editor/CodeEditor.d.ts +11 -0
- package/lib/editor/CodeEditor.js +15 -0
- package/lib/editor/CodeEditor.stories.js +24 -0
- package/lib/editor/index.d.ts +1 -0
- package/lib/editor/index.js +3 -0
- package/lib/errors/UserError.d.ts +8 -0
- package/lib/errors/UserError.js +12 -0
- package/lib/examples/OptimizedFormExample.d.ts +1 -0
- package/lib/examples/OptimizedFormExample.js +130 -0
- package/lib/form/index.d.ts +11 -0
- package/lib/form/index.js +13 -0
- package/lib/hooks/useIsMobile.d.ts +1 -0
- package/lib/hooks/useIsMobile.js +12 -0
- package/lib/i18n/index.d.ts +8 -0
- package/lib/i18n/index.js +7 -0
- package/lib/icons/Dual Ring-1s-100px.svg +1 -0
- package/lib/icons/gotham-logo.svg +17 -0
- package/lib/icons/gotham.svg +8 -0
- package/lib/icons/index.d.ts +5 -0
- package/lib/icons/index.js +6 -0
- package/lib/icons/pencil.svg +6 -0
- package/lib/img/arkhamjs-logo.png +0 -0
- package/lib/img/logo.png +0 -0
- package/lib/index.d.ts +25 -0
- package/lib/index.js +25 -0
- package/lib/router/index.d.ts +5 -0
- package/lib/router/index.js +6 -0
- package/lib/stores/GothamAppStore.d.ts +35 -0
- package/lib/stores/GothamAppStore.js +70 -0
- package/lib/stories/Button.d.ts +28 -0
- package/lib/stories/Button.js +22 -0
- package/lib/stories/Header.d.ts +12 -0
- package/lib/stories/Header.js +78 -0
- package/lib/stories/Page.d.ts +3 -0
- package/lib/stories/Page.js +108 -0
- package/lib/stories/assets/accessibility.png +0 -0
- package/lib/stories/assets/accessibility.svg +5 -0
- package/lib/stories/assets/addon-library.png +0 -0
- package/lib/stories/assets/assets.png +0 -0
- package/lib/stories/assets/context.png +0 -0
- package/lib/stories/assets/discord.svg +15 -0
- package/lib/stories/assets/docs.png +0 -0
- package/lib/stories/assets/figma-plugin.png +0 -0
- package/lib/stories/assets/github.svg +3 -0
- package/lib/stories/assets/share.png +0 -0
- package/lib/stories/assets/styling.png +0 -0
- package/lib/stories/assets/testing.png +0 -0
- package/lib/stories/assets/theming.png +0 -0
- package/lib/stories/assets/tutorials.svg +12 -0
- package/lib/stories/assets/youtube.svg +4 -0
- package/lib/stories/button.css +1 -0
- package/lib/stories/header.css +1 -0
- package/lib/stories/page.css +1 -0
- package/lib/styles/chat.css +1 -0
- package/lib/styles/index.css +2 -0
- package/lib/styles/tailwind.css +1 -0
- package/lib/types/assets.d.js +2 -0
- package/lib/types/gotham.d.ts +12 -0
- package/lib/types/gotham.js +3 -0
- package/lib/types/vitest-globals.d.js +3 -0
- package/lib/utils/GothamContext.d.ts +14 -0
- package/lib/utils/GothamContext.js +14 -0
- package/lib/utils/awsRum.d.ts +23 -0
- package/lib/utils/awsRum.js +50 -0
- package/lib/utils/colorUtils.d.ts +20 -0
- package/lib/utils/colorUtils.js +499 -0
- package/lib/utils/contentUtils.d.ts +2 -0
- package/lib/utils/contentUtils.js +18 -0
- package/lib/utils/i18nUtil.d.ts +1 -0
- package/lib/utils/i18nUtil.js +7 -0
- package/lib/utils/imageUtils.d.ts +5 -0
- package/lib/utils/imageUtils.js +48 -0
- package/lib/utils/interactionAnalytics.d.ts +10 -0
- package/lib/utils/interactionAnalytics.js +142 -0
- package/lib/utils/navEventQueue.d.ts +6 -0
- package/lib/utils/navEventQueue.js +50 -0
- package/lib/utils/refUtils.d.ts +2 -0
- package/lib/utils/refUtils.js +11 -0
- package/lib/utils/routeUtils.d.ts +12 -0
- package/lib/utils/routeUtils.js +109 -0
- package/lib/utils/sizeUtils.d.ts +5 -0
- package/lib/utils/sizeUtils.js +6 -0
- package/lib/utils/storyInteractions.d.ts +6 -0
- package/lib/utils/storyInteractions.js +45 -0
- package/lib/utils/storyUtils.d.ts +1 -0
- package/lib/utils/storyUtils.js +11 -0
- package/lib/utils/testUtils.d.ts +3 -0
- package/lib/utils/testUtils.js +56 -0
- package/lib/utils/timer.d.ts +21 -0
- package/lib/utils/timer.js +38 -0
- package/lib/utils/useBreakpoint.d.ts +6 -0
- package/lib/utils/useBreakpoint.js +56 -0
- package/lib/utils/viewPerformance.d.ts +34 -0
- package/lib/utils/viewPerformance.js +103 -0
- package/lib/utils/viewUtils.d.ts +9 -0
- package/lib/utils/viewUtils.js +44 -0
- package/lib/views/AuthSignInView/AuthSignInView.d.ts +20 -0
- package/lib/views/AuthSignInView/AuthSignInView.js +107 -0
- package/lib/views/AuthSignInView/AuthSignInView.stories.js +29 -0
- package/lib/views/AuthSignUpView/AuthSignUpView.d.ts +21 -0
- package/lib/views/AuthSignUpView/AuthSignUpView.js +146 -0
- package/lib/views/AuthSignUpView/AuthSignUpView.stories.js +30 -0
- package/lib/views/AuthView/AuthView.d.ts +16 -0
- package/lib/views/AuthView/AuthView.js +60 -0
- package/lib/views/AuthView/AuthView.stories.js +34 -0
- package/lib/views/DefaultView/DefaultView.d.ts +5 -0
- package/lib/views/DefaultView/DefaultView.js +134 -0
- package/lib/views/Gotham/Gotham.d.ts +44 -0
- package/lib/views/Gotham/Gotham.js +24 -0
- package/lib/views/Gotham/Gotham.stories.js +31 -0
- package/lib/views/Gotham/GothamListeners.d.ts +0 -0
- package/lib/views/Gotham/GothamListeners.js +2 -0
- package/lib/views/Gotham/GothamProvider.d.ts +43 -0
- package/lib/views/Gotham/GothamProvider.js +217 -0
- package/lib/views/Gotham/GothamRoot.d.ts +6 -0
- package/lib/views/Gotham/GothamRoot.js +69 -0
- package/lib/views/HomeView/HomeView.d.ts +10 -0
- package/lib/views/HomeView/HomeView.js +134 -0
- package/lib/views/LoaderView/LoaderView.d.ts +8 -0
- package/lib/views/LoaderView/LoaderView.js +30 -0
- package/lib/views/MenuView/MenuView.d.ts +13 -0
- package/lib/views/MenuView/MenuView.js +305 -0
- package/lib/views/NotFoundView/NotFoundView.d.ts +2 -0
- package/lib/views/NotFoundView/NotFoundView.js +12 -0
- package/lib/views/index.d.ts +11 -0
- package/lib/views/index.js +13 -0
- package/package.json +202 -0
- package/styles/tailwind.css +1 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { interactWithCanvas } from '../../utils/storyInteractions.js';
|
|
4
|
+
import { Footer } from './Footer.js';
|
|
5
|
+
const links = [
|
|
6
|
+
{
|
|
7
|
+
href: '#docs',
|
|
8
|
+
label: 'Docs'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
href: '#status',
|
|
12
|
+
label: 'Status'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
href: '#privacy',
|
|
16
|
+
label: 'Privacy'
|
|
17
|
+
}
|
|
18
|
+
];
|
|
19
|
+
const linkGroups = [
|
|
20
|
+
{
|
|
21
|
+
title: 'Solutions',
|
|
22
|
+
links: [
|
|
23
|
+
{
|
|
24
|
+
href: '#stack-management',
|
|
25
|
+
label: 'Stack Management'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
href: '#resources',
|
|
29
|
+
label: 'Resource Monitor'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
href: '#automation',
|
|
33
|
+
label: 'Automation'
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
title: 'Support',
|
|
39
|
+
links: [
|
|
40
|
+
{
|
|
41
|
+
href: '#docs',
|
|
42
|
+
label: 'Documentation'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
href: '#api',
|
|
46
|
+
label: 'API Reference'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
href: '#guides',
|
|
50
|
+
label: 'Support Guides'
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
title: 'Company',
|
|
56
|
+
links: [
|
|
57
|
+
{
|
|
58
|
+
href: '#about',
|
|
59
|
+
label: 'About'
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
href: '#blog',
|
|
63
|
+
label: 'Blog'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
href: '#careers',
|
|
67
|
+
label: 'Careers'
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
title: 'Legal',
|
|
73
|
+
links: [
|
|
74
|
+
{
|
|
75
|
+
href: '#terms',
|
|
76
|
+
label: 'Terms of service'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
href: '#privacy',
|
|
80
|
+
label: 'Privacy policy'
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
href: '#license',
|
|
84
|
+
label: 'License'
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
];
|
|
89
|
+
const socialLinks = [
|
|
90
|
+
{
|
|
91
|
+
href: '#github',
|
|
92
|
+
label: 'GitHub',
|
|
93
|
+
icon: /*#__PURE__*/ _jsx("svg", {
|
|
94
|
+
"aria-hidden": "true",
|
|
95
|
+
className: "size-6",
|
|
96
|
+
fill: "currentColor",
|
|
97
|
+
viewBox: "0 0 24 24",
|
|
98
|
+
children: /*#__PURE__*/ _jsx("path", {
|
|
99
|
+
clipRule: "evenodd",
|
|
100
|
+
d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",
|
|
101
|
+
fillRule: "evenodd"
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
href: '#x',
|
|
107
|
+
label: 'X',
|
|
108
|
+
icon: /*#__PURE__*/ _jsx("svg", {
|
|
109
|
+
"aria-hidden": "true",
|
|
110
|
+
className: "size-6",
|
|
111
|
+
fill: "currentColor",
|
|
112
|
+
viewBox: "0 0 24 24",
|
|
113
|
+
children: /*#__PURE__*/ _jsx("path", {
|
|
114
|
+
d: "M13.6823 10.6218L20.2391 3H18.6854L12.9921 9.61788L8.44486 3H3.2002L10.0765 13.0074L3.2002 21H4.75404L10.7663 14.0113L15.5685 21H20.8131L13.6819 10.6218H13.6823ZM11.5541 13.0956L10.8574 12.0991L5.31391 4.16971H7.70053L12.1742 10.5689L12.8709 11.5655L18.6861 19.8835H16.2995L11.5541 13.096V13.0956Z"
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
const meta = {
|
|
120
|
+
argTypes: {
|
|
121
|
+
brand: {
|
|
122
|
+
control: 'text'
|
|
123
|
+
},
|
|
124
|
+
copyright: {
|
|
125
|
+
control: 'text'
|
|
126
|
+
},
|
|
127
|
+
supportEmail: {
|
|
128
|
+
control: 'text'
|
|
129
|
+
},
|
|
130
|
+
supportLabel: {
|
|
131
|
+
control: 'text'
|
|
132
|
+
},
|
|
133
|
+
variant: {
|
|
134
|
+
control: 'select',
|
|
135
|
+
options: [
|
|
136
|
+
'small',
|
|
137
|
+
'large'
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
component: Footer,
|
|
142
|
+
parameters: {
|
|
143
|
+
layout: 'fullscreen'
|
|
144
|
+
},
|
|
145
|
+
title: 'Components/Footer'
|
|
146
|
+
};
|
|
147
|
+
export default meta;
|
|
148
|
+
export const Default = {
|
|
149
|
+
args: {
|
|
150
|
+
brand: 'GothamUI',
|
|
151
|
+
copyright: '© 2026 Nitrogen Labs',
|
|
152
|
+
links,
|
|
153
|
+
supportEmail: 'support@example.com',
|
|
154
|
+
supportLabel: 'Support'
|
|
155
|
+
},
|
|
156
|
+
play: interactWithCanvas
|
|
157
|
+
};
|
|
158
|
+
export const Small = {
|
|
159
|
+
args: {
|
|
160
|
+
brand: 'GothamUI',
|
|
161
|
+
copyright: '© 2026 Nitrogen Labs',
|
|
162
|
+
links,
|
|
163
|
+
supportEmail: 'support@example.com',
|
|
164
|
+
supportLabel: 'Support',
|
|
165
|
+
variant: 'small'
|
|
166
|
+
},
|
|
167
|
+
play: interactWithCanvas
|
|
168
|
+
};
|
|
169
|
+
export const Large = {
|
|
170
|
+
args: {
|
|
171
|
+
brand: /*#__PURE__*/ _jsx("span", {
|
|
172
|
+
className: "text-2xl font-bold text-white",
|
|
173
|
+
children: "GothamUI"
|
|
174
|
+
}),
|
|
175
|
+
copyright: '© 2026 Nitrogen Labs. All rights reserved.',
|
|
176
|
+
description: 'Manage cloud applications, deployments, and resources with a polished operational interface.',
|
|
177
|
+
linkGroups,
|
|
178
|
+
socialLinks,
|
|
179
|
+
variant: 'large'
|
|
180
|
+
},
|
|
181
|
+
play: interactWithCanvas
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Zvb3Rlci9Gb290ZXIuc3Rvcmllcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7aW50ZXJhY3RXaXRoQ2FudmFzfSBmcm9tICcuLi8uLi91dGlscy9zdG9yeUludGVyYWN0aW9ucy5qcyc7XG5pbXBvcnQge0Zvb3Rlcn0gZnJvbSAnLi9Gb290ZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7TWV0YSwgU3RvcnlPYmp9IGZyb20gJ0BubGFicy9sZXgvc3Rvcnlib29rJztcblxuY29uc3QgbGlua3MgPSBbXG4gIHtocmVmOiAnI2RvY3MnLCBsYWJlbDogJ0RvY3MnfSxcbiAge2hyZWY6ICcjc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnfSxcbiAge2hyZWY6ICcjcHJpdmFjeScsIGxhYmVsOiAnUHJpdmFjeSd9XG5dO1xuXG5jb25zdCBsaW5rR3JvdXBzID0gW1xuICB7XG4gICAgdGl0bGU6ICdTb2x1dGlvbnMnLFxuICAgIGxpbmtzOiBbXG4gICAgICB7aHJlZjogJyNzdGFjay1tYW5hZ2VtZW50JywgbGFiZWw6ICdTdGFjayBNYW5hZ2VtZW50J30sXG4gICAgICB7aHJlZjogJyNyZXNvdXJjZXMnLCBsYWJlbDogJ1Jlc291cmNlIE1vbml0b3InfSxcbiAgICAgIHtocmVmOiAnI2F1dG9tYXRpb24nLCBsYWJlbDogJ0F1dG9tYXRpb24nfVxuICAgIF1cbiAgfSxcbiAge1xuICAgIHRpdGxlOiAnU3VwcG9ydCcsXG4gICAgbGlua3M6IFtcbiAgICAgIHtocmVmOiAnI2RvY3MnLCBsYWJlbDogJ0RvY3VtZW50YXRpb24nfSxcbiAgICAgIHtocmVmOiAnI2FwaScsIGxhYmVsOiAnQVBJIFJlZmVyZW5jZSd9LFxuICAgICAge2hyZWY6ICcjZ3VpZGVzJywgbGFiZWw6ICdTdXBwb3J0IEd1aWRlcyd9XG4gICAgXVxuICB9LFxuICB7XG4gICAgdGl0bGU6ICdDb21wYW55JyxcbiAgICBsaW5rczogW1xuICAgICAge2hyZWY6ICcjYWJvdXQnLCBsYWJlbDogJ0Fib3V0J30sXG4gICAgICB7aHJlZjogJyNibG9nJywgbGFiZWw6ICdCbG9nJ30sXG4gICAgICB7aHJlZjogJyNjYXJlZXJzJywgbGFiZWw6ICdDYXJlZXJzJ31cbiAgICBdXG4gIH0sXG4gIHtcbiAgICB0aXRsZTogJ0xlZ2FsJyxcbiAgICBsaW5rczogW1xuICAgICAge2hyZWY6ICcjdGVybXMnLCBsYWJlbDogJ1Rlcm1zIG9mIHNlcnZpY2UnfSxcbiAgICAgIHtocmVmOiAnI3ByaXZhY3knLCBsYWJlbDogJ1ByaXZhY3kgcG9saWN5J30sXG4gICAgICB7aHJlZjogJyNsaWNlbnNlJywgbGFiZWw6ICdMaWNlbnNlJ31cbiAgICBdXG4gIH1cbl07XG5cbmNvbnN0IHNvY2lhbExpbmtzID0gW1xuICB7XG4gICAgaHJlZjogJyNnaXRodWInLFxuICAgIGxhYmVsOiAnR2l0SHViJyxcbiAgICBpY29uOiAoXG4gICAgICA8c3ZnIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cInNpemUtNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICBkPVwiTTEyIDJDNi40NzcgMiAyIDYuNDg0IDIgMTIuMDE3YzAgNC40MjUgMi44NjUgOC4xOCA2LjgzOSA5LjUwNC41LjA5Mi42ODItLjIxNy42ODItLjQ4MyAwLS4yMzctLjAwOC0uODY4LS4wMTMtMS43MDMtMi43ODIuNjA1LTMuMzY5LTEuMzQzLTMuMzY5LTEuMzQzLS40NTQtMS4xNTgtMS4xMS0xLjQ2Ni0xLjExLTEuNDY2LS45MDgtLjYyLjA2OS0uNjA4LjA2OS0uNjA4IDEuMDAzLjA3IDEuNTMxIDEuMDMyIDEuNTMxIDEuMDMyLjg5MiAxLjUzIDIuMzQxIDEuMDg4IDIuOTEuODMyLjA5Mi0uNjQ3LjM1LTEuMDg4LjYzNi0xLjMzOC0yLjIyLS4yNTMtNC41NTUtMS4xMTMtNC41NTUtNC45NTEgMC0xLjA5My4zOS0xLjk4OCAxLjAyOS0yLjY4OC0uMTAzLS4yNTMtLjQ0Ni0xLjI3Mi4wOTgtMi42NSAwIDAgLjg0LS4yNyAyLjc1IDEuMDI2QTkuNTY0IDkuNTY0IDAgMDExMiA2Ljg0NGMuODUuMDA0IDEuNzA1LjExNSAyLjUwNC4zMzcgMS45MDktMS4yOTYgMi43NDctMS4wMjcgMi43NDctMS4wMjcuNTQ2IDEuMzc5LjIwMiAyLjM5OC4xIDIuNjUxLjY0LjcgMS4wMjggMS41OTUgMS4wMjggMi42ODggMCAzLjg0OC0yLjMzOSA0LjY5NS00LjU2NiA0Ljk0My4zNTkuMzA5LjY3OC45Mi42NzggMS44NTUgMCAxLjMzOC0uMDEyIDIuNDE5LS4wMTIgMi43NDcgMCAuMjY4LjE4LjU4LjY4OC40ODJBMTAuMDE5IDEwLjAxOSAwIDAwMjIgMTIuMDE3QzIyIDYuNDg0IDE3LjUyMiAyIDEyIDJ6XCJcbiAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc+XG4gICAgKVxuICB9LFxuICB7XG4gICAgaHJlZjogJyN4JyxcbiAgICBsYWJlbDogJ1gnLFxuICAgIGljb246IChcbiAgICAgIDxzdmcgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3NOYW1lPVwic2l6ZS02XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMy42ODIzIDEwLjYyMThMMjAuMjM5MSAzSDE4LjY4NTRMMTIuOTkyMSA5LjYxNzg4TDguNDQ0ODYgM0gzLjIwMDJMMTAuMDc2NSAxMy4wMDc0TDMuMjAwMiAyMUg0Ljc1NDA0TDEwLjc2NjMgMTQuMDExM0wxNS41Njg1IDIxSDIwLjgxMzFMMTMuNjgxOSAxMC42MjE4SDEzLjY4MjNaTTExLjU1NDEgMTMuMDk1NkwxMC44NTc0IDEyLjA5OTFMNS4zMTM5MSA0LjE2OTcxSDcuNzAwNTNMMTIuMTc0MiAxMC41Njg5TDEyLjg3MDkgMTEuNTY1NUwxOC42ODYxIDE5Ljg4MzVIMTYuMjk5NUwxMS41NTQxIDEzLjA5NlYxMy4wOTU2WlwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICApXG4gIH1cbl07XG5cbmNvbnN0IG1ldGE6IE1ldGE8dHlwZW9mIEZvb3Rlcj4gPSB7XG4gIGFyZ1R5cGVzOiB7XG4gICAgYnJhbmQ6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH0sXG4gICAgY29weXJpZ2h0OiB7XG4gICAgICBjb250cm9sOiAndGV4dCdcbiAgICB9LFxuICAgIHN1cHBvcnRFbWFpbDoge1xuICAgICAgY29udHJvbDogJ3RleHQnXG4gICAgfSxcbiAgICBzdXBwb3J0TGFiZWw6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH0sXG4gICAgdmFyaWFudDoge1xuICAgICAgY29udHJvbDogJ3NlbGVjdCcsXG4gICAgICBvcHRpb25zOiBbJ3NtYWxsJywgJ2xhcmdlJ11cbiAgICB9XG4gIH0sXG4gIGNvbXBvbmVudDogRm9vdGVyLFxuICBwYXJhbWV0ZXJzOiB7XG4gICAgbGF5b3V0OiAnZnVsbHNjcmVlbidcbiAgfSxcbiAgdGl0bGU6ICdDb21wb25lbnRzL0Zvb3Rlcidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGE7XG5cbnR5cGUgU3RvcnkgPSBTdG9yeU9iajx0eXBlb2YgRm9vdGVyPjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHQ6IFN0b3J5ID0ge1xuICBhcmdzOiB7XG4gICAgYnJhbmQ6ICdHb3RoYW1VSScsXG4gICAgY29weXJpZ2h0OiAnwqkgMjAyNiBOaXRyb2dlbiBMYWJzJyxcbiAgICBsaW5rcyxcbiAgICBzdXBwb3J0RW1haWw6ICdzdXBwb3J0QGV4YW1wbGUuY29tJyxcbiAgICBzdXBwb3J0TGFiZWw6ICdTdXBwb3J0J1xuICB9LFxuICBwbGF5OiBpbnRlcmFjdFdpdGhDYW52YXNcbn07XG5cbmV4cG9ydCBjb25zdCBTbWFsbDogU3RvcnkgPSB7XG4gIGFyZ3M6IHtcbiAgICBicmFuZDogJ0dvdGhhbVVJJyxcbiAgICBjb3B5cmlnaHQ6ICfCqSAyMDI2IE5pdHJvZ2VuIExhYnMnLFxuICAgIGxpbmtzLFxuICAgIHN1cHBvcnRFbWFpbDogJ3N1cHBvcnRAZXhhbXBsZS5jb20nLFxuICAgIHN1cHBvcnRMYWJlbDogJ1N1cHBvcnQnLFxuICAgIHZhcmlhbnQ6ICdzbWFsbCdcbiAgfSxcbiAgcGxheTogaW50ZXJhY3RXaXRoQ2FudmFzXG59O1xuXG5leHBvcnQgY29uc3QgTGFyZ2U6IFN0b3J5ID0ge1xuICBhcmdzOiB7XG4gICAgYnJhbmQ6IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlXCI+R290aGFtVUk8L3NwYW4+LFxuICAgIGNvcHlyaWdodDogJ8KpIDIwMjYgTml0cm9nZW4gTGFicy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWFuYWdlIGNsb3VkIGFwcGxpY2F0aW9ucywgZGVwbG95bWVudHMsIGFuZCByZXNvdXJjZXMgd2l0aCBhIHBvbGlzaGVkIG9wZXJhdGlvbmFsIGludGVyZmFjZS4nLFxuICAgIGxpbmtHcm91cHMsXG4gICAgc29jaWFsTGlua3MsXG4gICAgdmFyaWFudDogJ2xhcmdlJ1xuICB9LFxuICBwbGF5OiBpbnRlcmFjdFdpdGhDYW52YXNcbn07XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJpbnRlcmFjdFdpdGhDYW52YXMiLCJGb290ZXIiLCJsaW5rcyIsImhyZWYiLCJsYWJlbCIsImxpbmtHcm91cHMiLCJ0aXRsZSIsInNvY2lhbExpbmtzIiwiaWNvbiIsInN2ZyIsImFyaWEtaGlkZGVuIiwiY2xhc3NOYW1lIiwiZmlsbCIsInZpZXdCb3giLCJwYXRoIiwiY2xpcFJ1bGUiLCJkIiwiZmlsbFJ1bGUiLCJtZXRhIiwiYXJnVHlwZXMiLCJicmFuZCIsImNvbnRyb2wiLCJjb3B5cmlnaHQiLCJzdXBwb3J0RW1haWwiLCJzdXBwb3J0TGFiZWwiLCJ2YXJpYW50Iiwib3B0aW9ucyIsImNvbXBvbmVudCIsInBhcmFtZXRlcnMiLCJsYXlvdXQiLCJEZWZhdWx0IiwiYXJncyIsInBsYXkiLCJTbWFsbCIsIkxhcmdlIiwic3BhbiIsImRlc2NyaXB0aW9uIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLFNBQVFDLGtCQUFrQixRQUFPLG1DQUFtQztBQUNwRSxTQUFRQyxNQUFNLFFBQU8sY0FBYztBQUluQyxNQUFNQyxRQUFRO0lBQ1o7UUFBQ0MsTUFBTTtRQUFTQyxPQUFPO0lBQU07SUFDN0I7UUFBQ0QsTUFBTTtRQUFXQyxPQUFPO0lBQVE7SUFDakM7UUFBQ0QsTUFBTTtRQUFZQyxPQUFPO0lBQVM7Q0FDcEM7QUFFRCxNQUFNQyxhQUFhO0lBQ2pCO1FBQ0VDLE9BQU87UUFDUEosT0FBTztZQUNMO2dCQUFDQyxNQUFNO2dCQUFxQkMsT0FBTztZQUFrQjtZQUNyRDtnQkFBQ0QsTUFBTTtnQkFBY0MsT0FBTztZQUFrQjtZQUM5QztnQkFBQ0QsTUFBTTtnQkFBZUMsT0FBTztZQUFZO1NBQzFDO0lBQ0g7SUFDQTtRQUNFRSxPQUFPO1FBQ1BKLE9BQU87WUFDTDtnQkFBQ0MsTUFBTTtnQkFBU0MsT0FBTztZQUFlO1lBQ3RDO2dCQUFDRCxNQUFNO2dCQUFRQyxPQUFPO1lBQWU7WUFDckM7Z0JBQUNELE1BQU07Z0JBQVdDLE9BQU87WUFBZ0I7U0FDMUM7SUFDSDtJQUNBO1FBQ0VFLE9BQU87UUFDUEosT0FBTztZQUNMO2dCQUFDQyxNQUFNO2dCQUFVQyxPQUFPO1lBQU87WUFDL0I7Z0JBQUNELE1BQU07Z0JBQVNDLE9BQU87WUFBTTtZQUM3QjtnQkFBQ0QsTUFBTTtnQkFBWUMsT0FBTztZQUFTO1NBQ3BDO0lBQ0g7SUFDQTtRQUNFRSxPQUFPO1FBQ1BKLE9BQU87WUFDTDtnQkFBQ0MsTUFBTTtnQkFBVUMsT0FBTztZQUFrQjtZQUMxQztnQkFBQ0QsTUFBTTtnQkFBWUMsT0FBTztZQUFnQjtZQUMxQztnQkFBQ0QsTUFBTTtnQkFBWUMsT0FBTztZQUFTO1NBQ3BDO0lBQ0g7Q0FDRDtBQUVELE1BQU1HLGNBQWM7SUFDbEI7UUFDRUosTUFBTTtRQUNOQyxPQUFPO1FBQ1BJLG9CQUNFLEtBQUNDO1lBQUlDLGVBQVk7WUFBT0MsV0FBVTtZQUFTQyxNQUFLO1lBQWVDLFNBQVE7c0JBQ3JFLGNBQUEsS0FBQ0M7Z0JBQ0NDLFVBQVM7Z0JBQ1RDLEdBQUU7Z0JBQ0ZDLFVBQVM7OztJQUlqQjtJQUNBO1FBQ0VkLE1BQU07UUFDTkMsT0FBTztRQUNQSSxvQkFDRSxLQUFDQztZQUFJQyxlQUFZO1lBQU9DLFdBQVU7WUFBU0MsTUFBSztZQUFlQyxTQUFRO3NCQUNyRSxjQUFBLEtBQUNDO2dCQUFLRSxHQUFFOzs7SUFHZDtDQUNEO0FBRUQsTUFBTUUsT0FBNEI7SUFDaENDLFVBQVU7UUFDUkMsT0FBTztZQUNMQyxTQUFTO1FBQ1g7UUFDQUMsV0FBVztZQUNURCxTQUFTO1FBQ1g7UUFDQUUsY0FBYztZQUNaRixTQUFTO1FBQ1g7UUFDQUcsY0FBYztZQUNaSCxTQUFTO1FBQ1g7UUFDQUksU0FBUztZQUNQSixTQUFTO1lBQ1RLLFNBQVM7Z0JBQUM7Z0JBQVM7YUFBUTtRQUM3QjtJQUNGO0lBQ0FDLFdBQVcxQjtJQUNYMkIsWUFBWTtRQUNWQyxRQUFRO0lBQ1Y7SUFDQXZCLE9BQU87QUFDVDtBQUVBLGVBQWVZLEtBQUs7QUFJcEIsT0FBTyxNQUFNWSxVQUFpQjtJQUM1QkMsTUFBTTtRQUNKWCxPQUFPO1FBQ1BFLFdBQVc7UUFDWHBCO1FBQ0FxQixjQUFjO1FBQ2RDLGNBQWM7SUFDaEI7SUFDQVEsTUFBTWhDO0FBQ1IsRUFBRTtBQUVGLE9BQU8sTUFBTWlDLFFBQWU7SUFDMUJGLE1BQU07UUFDSlgsT0FBTztRQUNQRSxXQUFXO1FBQ1hwQjtRQUNBcUIsY0FBYztRQUNkQyxjQUFjO1FBQ2RDLFNBQVM7SUFDWDtJQUNBTyxNQUFNaEM7QUFDUixFQUFFO0FBRUYsT0FBTyxNQUFNa0MsUUFBZTtJQUMxQkgsTUFBTTtRQUNKWCxxQkFBTyxLQUFDZTtZQUFLeEIsV0FBVTtzQkFBZ0M7O1FBQ3ZEVyxXQUFXO1FBQ1hjLGFBQWE7UUFDYi9CO1FBQ0FFO1FBQ0FrQixTQUFTO0lBQ1g7SUFDQU8sTUFBTWhDO0FBQ1IsRUFBRSJ9
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { BaseSyntheticEvent, ReactNode } from 'react';
|
|
3
|
+
import type { FormErrors, FormValues } from './FormContext.js';
|
|
4
|
+
export interface GothamFormMethods {
|
|
5
|
+
readonly formState: {
|
|
6
|
+
readonly errors: FormErrors;
|
|
7
|
+
readonly isSubmitting: boolean;
|
|
8
|
+
};
|
|
9
|
+
readonly getValues: () => FormValues;
|
|
10
|
+
readonly register: (name: string) => {
|
|
11
|
+
readonly defaultValue: unknown;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
};
|
|
14
|
+
readonly setError: (field: string, error: {
|
|
15
|
+
type: string;
|
|
16
|
+
message: string;
|
|
17
|
+
}) => void;
|
|
18
|
+
readonly setValue: (name: string, value: unknown) => void;
|
|
19
|
+
}
|
|
20
|
+
export interface FormActionState {
|
|
21
|
+
readonly errors: FormErrors;
|
|
22
|
+
readonly values: FormValues;
|
|
23
|
+
}
|
|
24
|
+
export interface FormProps<T> {
|
|
25
|
+
readonly children: ReactNode | ((methods: GothamFormMethods) => ReactNode);
|
|
26
|
+
readonly className?: string;
|
|
27
|
+
readonly defaultValues?: FormValues;
|
|
28
|
+
readonly disabled?: boolean;
|
|
29
|
+
readonly errors?: FormErrors;
|
|
30
|
+
readonly mode?: 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all';
|
|
31
|
+
readonly name?: string;
|
|
32
|
+
readonly onChange?: (data: unknown) => void;
|
|
33
|
+
readonly onSubmit: (data: T, event: BaseSyntheticEvent, setError: (field: string, error: {
|
|
34
|
+
type: string;
|
|
35
|
+
message: string;
|
|
36
|
+
}) => void) => void | Promise<void>;
|
|
37
|
+
readonly schema?: z.ZodSchema<T>;
|
|
38
|
+
readonly showErrors?: boolean;
|
|
39
|
+
readonly validate?: (data: unknown) => void;
|
|
40
|
+
readonly validateOnBlur?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare const Form: <T extends Record<string, unknown>>({ children, className, defaultValues, disabled, errors, name, schema, showErrors, onSubmit }: FormProps<T>) => import("react").JSX.Element;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2021-Present, Nitrogen Labs, Inc.
|
|
4
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
5
|
+
*/ import { startTransition, useActionState, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
6
|
+
import { GothamFormContext, GothamFormFieldContext, createFormFieldStore, getFormErrorMessage } from './FormContext.js';
|
|
7
|
+
const getFormDataValue = (formData, key)=>{
|
|
8
|
+
const values = formData.getAll(key);
|
|
9
|
+
if (values.length > 1) {
|
|
10
|
+
return values;
|
|
11
|
+
}
|
|
12
|
+
return values[0] ?? '';
|
|
13
|
+
};
|
|
14
|
+
const getValuesFromFormData = (formData)=>{
|
|
15
|
+
const values = {};
|
|
16
|
+
Array.from(new Set(Array.from(formData.keys()))).forEach((key)=>{
|
|
17
|
+
values[key] = getFormDataValue(formData, key);
|
|
18
|
+
});
|
|
19
|
+
return values;
|
|
20
|
+
};
|
|
21
|
+
const getErrorsFromZod = (error)=>Object.fromEntries(error.issues.map((issue)=>[
|
|
22
|
+
issue.path.join('.'),
|
|
23
|
+
{
|
|
24
|
+
message: issue.message,
|
|
25
|
+
type: issue.code
|
|
26
|
+
}
|
|
27
|
+
]));
|
|
28
|
+
const getErrorMessages = (errorObj)=>Object.values(errorObj).map(getFormErrorMessage).filter(Boolean);
|
|
29
|
+
const emptyValues = {};
|
|
30
|
+
const emptyErrors = {};
|
|
31
|
+
export const Form = ({ children, className, defaultValues = emptyValues, disabled = false, errors = emptyErrors, name = 'default', schema, showErrors = false, onSubmit })=>{
|
|
32
|
+
const [localErrors, setLocalErrors] = useState({});
|
|
33
|
+
const [localValues, setLocalValues] = useState(defaultValues);
|
|
34
|
+
const submitEventRef = useRef(null);
|
|
35
|
+
const [state, submitAction, isPending] = useActionState(async (_previousState, formData)=>{
|
|
36
|
+
if (disabled) {
|
|
37
|
+
return {
|
|
38
|
+
errors: localErrors,
|
|
39
|
+
values: localValues
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const formValues = {
|
|
43
|
+
...defaultValues,
|
|
44
|
+
...getValuesFromFormData(formData),
|
|
45
|
+
...localValues
|
|
46
|
+
};
|
|
47
|
+
const parsed = schema ? schema.safeParse(formValues) : {
|
|
48
|
+
data: formValues,
|
|
49
|
+
success: true
|
|
50
|
+
};
|
|
51
|
+
if (!parsed.success) {
|
|
52
|
+
const nextErrors = getErrorsFromZod(parsed.error);
|
|
53
|
+
setLocalErrors(nextErrors);
|
|
54
|
+
return {
|
|
55
|
+
errors: nextErrors,
|
|
56
|
+
values: formValues
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const nextErrors = {};
|
|
60
|
+
const setError = (field, error)=>{
|
|
61
|
+
nextErrors[field] = error;
|
|
62
|
+
};
|
|
63
|
+
await onSubmit(parsed.data, submitEventRef.current, setError);
|
|
64
|
+
setLocalErrors(nextErrors);
|
|
65
|
+
return {
|
|
66
|
+
errors: nextErrors,
|
|
67
|
+
values: formValues
|
|
68
|
+
};
|
|
69
|
+
}, {
|
|
70
|
+
errors: {},
|
|
71
|
+
values: defaultValues
|
|
72
|
+
});
|
|
73
|
+
const allErrors = useMemo(()=>({
|
|
74
|
+
...localErrors,
|
|
75
|
+
...errors
|
|
76
|
+
}), [
|
|
77
|
+
errors,
|
|
78
|
+
localErrors
|
|
79
|
+
]);
|
|
80
|
+
const values = useMemo(()=>({
|
|
81
|
+
...state.values,
|
|
82
|
+
...localValues
|
|
83
|
+
}), [
|
|
84
|
+
localValues,
|
|
85
|
+
state.values
|
|
86
|
+
]);
|
|
87
|
+
const setValue = useCallback((fieldName, value)=>{
|
|
88
|
+
setLocalValues((currentValues)=>{
|
|
89
|
+
if (Object.hasOwn(currentValues, fieldName) && Object.is(currentValues[fieldName], value)) {
|
|
90
|
+
return currentValues;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
...currentValues,
|
|
94
|
+
[fieldName]: value
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}, []);
|
|
98
|
+
const clearError = useCallback((fieldName)=>{
|
|
99
|
+
setLocalErrors((currentErrors)=>{
|
|
100
|
+
if (!Object.hasOwn(currentErrors, fieldName)) {
|
|
101
|
+
return currentErrors;
|
|
102
|
+
}
|
|
103
|
+
const nextErrors = {
|
|
104
|
+
...currentErrors
|
|
105
|
+
};
|
|
106
|
+
delete nextErrors[fieldName];
|
|
107
|
+
return nextErrors;
|
|
108
|
+
});
|
|
109
|
+
}, []);
|
|
110
|
+
const methods = useMemo(()=>({
|
|
111
|
+
formState: {
|
|
112
|
+
errors: allErrors,
|
|
113
|
+
isSubmitting: isPending
|
|
114
|
+
},
|
|
115
|
+
getValues: ()=>values,
|
|
116
|
+
register: (fieldName)=>({
|
|
117
|
+
defaultValue: values[fieldName] ?? defaultValues[fieldName] ?? '',
|
|
118
|
+
name: fieldName
|
|
119
|
+
}),
|
|
120
|
+
setError: (fieldName, error)=>{
|
|
121
|
+
setLocalErrors((currentErrors)=>({
|
|
122
|
+
...currentErrors,
|
|
123
|
+
[fieldName]: error
|
|
124
|
+
}));
|
|
125
|
+
},
|
|
126
|
+
setValue
|
|
127
|
+
}), [
|
|
128
|
+
allErrors,
|
|
129
|
+
defaultValues,
|
|
130
|
+
isPending,
|
|
131
|
+
setValue,
|
|
132
|
+
values
|
|
133
|
+
]);
|
|
134
|
+
const contextValue = useMemo(()=>({
|
|
135
|
+
clearError,
|
|
136
|
+
defaultValues,
|
|
137
|
+
errors: allErrors,
|
|
138
|
+
isSubmitting: isPending,
|
|
139
|
+
setValue,
|
|
140
|
+
values
|
|
141
|
+
}), [
|
|
142
|
+
allErrors,
|
|
143
|
+
clearError,
|
|
144
|
+
defaultValues,
|
|
145
|
+
isPending,
|
|
146
|
+
setValue,
|
|
147
|
+
values
|
|
148
|
+
]);
|
|
149
|
+
const [fieldStore] = useState(()=>createFormFieldStore(contextValue));
|
|
150
|
+
// Publish committed React state, never state from an abandoned render.
|
|
151
|
+
useLayoutEffect(()=>{
|
|
152
|
+
fieldStore.update(contextValue);
|
|
153
|
+
}, [
|
|
154
|
+
contextValue,
|
|
155
|
+
fieldStore
|
|
156
|
+
]);
|
|
157
|
+
const errorMessages = getErrorMessages(allErrors);
|
|
158
|
+
const handleFormSubmit = (event)=>{
|
|
159
|
+
event.preventDefault();
|
|
160
|
+
event.stopPropagation();
|
|
161
|
+
if (isPending || disabled) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
submitEventRef.current = event;
|
|
165
|
+
const formData = new FormData(event.currentTarget);
|
|
166
|
+
startTransition(()=>{
|
|
167
|
+
submitAction(formData);
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
return /*#__PURE__*/ _jsx(GothamFormFieldContext.Provider, {
|
|
171
|
+
value: fieldStore,
|
|
172
|
+
children: /*#__PURE__*/ _jsx(GothamFormContext.Provider, {
|
|
173
|
+
value: contextValue,
|
|
174
|
+
children: /*#__PURE__*/ _jsxs("form", {
|
|
175
|
+
className: className,
|
|
176
|
+
"data-testid": `form-${name}`,
|
|
177
|
+
noValidate: true,
|
|
178
|
+
onSubmit: handleFormSubmit,
|
|
179
|
+
children: [
|
|
180
|
+
showErrors && errorMessages.length > 0 && /*#__PURE__*/ _jsx("div", {
|
|
181
|
+
"aria-live": "polite",
|
|
182
|
+
className: "p-3 mb-4 text-sm text-red-700 bg-red-100 rounded-lg dark:bg-red-200 dark:text-red-800",
|
|
183
|
+
role: "alert",
|
|
184
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
185
|
+
className: "list-disc list-inside",
|
|
186
|
+
children: errorMessages.map((message, index)=>/*#__PURE__*/ _jsx("li", {
|
|
187
|
+
children: message
|
|
188
|
+
}, index))
|
|
189
|
+
})
|
|
190
|
+
}),
|
|
191
|
+
typeof children === 'function' ? children(methods) : children
|
|
192
|
+
]
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Zvcm0vRm9ybS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7c3RhcnRUcmFuc2l0aW9uLCB1c2VBY3Rpb25TdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge0dvdGhhbUZvcm1Db250ZXh0LCBHb3RoYW1Gb3JtRmllbGRDb250ZXh0LCBjcmVhdGVGb3JtRmllbGRTdG9yZSwgZ2V0Rm9ybUVycm9yTWVzc2FnZX0gZnJvbSAnLi9Gb3JtQ29udGV4dC5qcyc7XG5cbmltcG9ydCB0eXBlIHtCYXNlU3ludGhldGljRXZlbnQsIEZvcm1FdmVudCwgUmVhY3ROb2RlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7Rm9ybUVycm9ycywgRm9ybVZhbHVlc30gZnJvbSAnLi9Gb3JtQ29udGV4dC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR290aGFtRm9ybU1ldGhvZHMge1xuICByZWFkb25seSBmb3JtU3RhdGU6IHtcbiAgICByZWFkb25seSBlcnJvcnM6IEZvcm1FcnJvcnM7XG4gICAgcmVhZG9ubHkgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuICB9O1xuICByZWFkb25seSBnZXRWYWx1ZXM6ICgpID0+IEZvcm1WYWx1ZXM7XG4gIHJlYWRvbmx5IHJlZ2lzdGVyOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiB1bmtub3duO1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgc2V0RXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjoge3R5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nfSkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgc2V0VmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1BY3Rpb25TdGF0ZSB7XG4gIHJlYWRvbmx5IGVycm9yczogRm9ybUVycm9ycztcbiAgcmVhZG9ubHkgdmFsdWVzOiBGb3JtVmFsdWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Qcm9wczxUPiB7XG4gIHJlYWRvbmx5IGNoaWxkcmVuOiBSZWFjdE5vZGUgfCAoKG1ldGhvZHM6IEdvdGhhbUZvcm1NZXRob2RzKSA9PiBSZWFjdE5vZGUpO1xuICByZWFkb25seSBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZXM/OiBGb3JtVmFsdWVzO1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVycm9ycz86IEZvcm1FcnJvcnM7XG4gIHJlYWRvbmx5IG1vZGU/OiAnb25TdWJtaXQnIHwgJ29uQmx1cicgfCAnb25DaGFuZ2UnIHwgJ29uVG91Y2hlZCcgfCAnYWxsJztcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgb25DaGFuZ2U/OiAoZGF0YTogdW5rbm93bikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25TdWJtaXQ6IChcbiAgICBkYXRhOiBULFxuICAgIGV2ZW50OiBCYXNlU3ludGhldGljRXZlbnQsXG4gICAgc2V0RXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjoge3R5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nfSkgPT4gdm9pZFxuICApID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBzY2hlbWE/OiB6LlpvZFNjaGVtYTxUPjtcbiAgcmVhZG9ubHkgc2hvd0Vycm9ycz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhbGlkYXRlPzogKGRhdGE6IHVua25vd24pID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHZhbGlkYXRlT25CbHVyPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0Rm9ybURhdGFWYWx1ZSA9IChmb3JtRGF0YTogRm9ybURhdGEsIGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChrZXkpO1xuXG4gIGlmKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXNbMF0gPz8gJyc7XG59O1xuXG5jb25zdCBnZXRWYWx1ZXNGcm9tRm9ybURhdGEgPSAoZm9ybURhdGE6IEZvcm1EYXRhKTogRm9ybVZhbHVlcyA9PiB7XG4gIGNvbnN0IHZhbHVlczogRm9ybVZhbHVlcyA9IHt9O1xuXG4gIEFycmF5LmZyb20obmV3IFNldChBcnJheS5mcm9tKGZvcm1EYXRhLmtleXMoKSkpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICB2YWx1ZXNba2V5XSA9IGdldEZvcm1EYXRhVmFsdWUoZm9ybURhdGEsIGtleSk7XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZXM7XG59O1xuXG5jb25zdCBnZXRFcnJvcnNGcm9tWm9kID0gKGVycm9yOiB6LlpvZEVycm9yKTogRm9ybUVycm9ycyA9PiBPYmplY3QuZnJvbUVudHJpZXMoXG4gIGVycm9yLmlzc3Vlcy5tYXAoKGlzc3VlKSA9PiBbXG4gICAgaXNzdWUucGF0aC5qb2luKCcuJyksXG4gICAge1xuICAgICAgbWVzc2FnZTogaXNzdWUubWVzc2FnZSxcbiAgICAgIHR5cGU6IGlzc3VlLmNvZGVcbiAgICB9XG4gIF0pXG4pO1xuXG5jb25zdCBnZXRFcnJvck1lc3NhZ2VzID0gKGVycm9yT2JqOiBGb3JtRXJyb3JzKTogc3RyaW5nW10gPT4gT2JqZWN0LnZhbHVlcyhlcnJvck9iailcbiAgLm1hcChnZXRGb3JtRXJyb3JNZXNzYWdlKVxuICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG5jb25zdCBlbXB0eVZhbHVlczogRm9ybVZhbHVlcyA9IHt9O1xuY29uc3QgZW1wdHlFcnJvcnM6IEZvcm1FcnJvcnMgPSB7fTtcblxuZXhwb3J0IGNvbnN0IEZvcm0gPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG4gIGRlZmF1bHRWYWx1ZXMgPSBlbXB0eVZhbHVlcyxcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZXJyb3JzID0gZW1wdHlFcnJvcnMsXG4gIG5hbWUgPSAnZGVmYXVsdCcsXG4gIHNjaGVtYSxcbiAgc2hvd0Vycm9ycyA9IGZhbHNlLFxuICBvblN1Ym1pdFxufTogRm9ybVByb3BzPFQ+KSA9PiB7XG4gIGNvbnN0IFtsb2NhbEVycm9ycywgc2V0TG9jYWxFcnJvcnNdID0gdXNlU3RhdGU8Rm9ybUVycm9ycz4oe30pO1xuICBjb25zdCBbbG9jYWxWYWx1ZXMsIHNldExvY2FsVmFsdWVzXSA9IHVzZVN0YXRlPEZvcm1WYWx1ZXM+KGRlZmF1bHRWYWx1ZXMpO1xuICBjb25zdCBzdWJtaXRFdmVudFJlZiA9IHVzZVJlZjxCYXNlU3ludGhldGljRXZlbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3N0YXRlLCBzdWJtaXRBY3Rpb24sIGlzUGVuZGluZ10gPSB1c2VBY3Rpb25TdGF0ZShcbiAgICBhc3luYyAoX3ByZXZpb3VzU3RhdGU6IEZvcm1BY3Rpb25TdGF0ZSwgZm9ybURhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxGb3JtQWN0aW9uU3RhdGU+ID0+IHtcbiAgICAgIGlmKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBsb2NhbEVycm9ycyxcbiAgICAgICAgICB2YWx1ZXM6IGxvY2FsVmFsdWVzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRWYWx1ZXMsXG4gICAgICAgIC4uLmdldFZhbHVlc0Zyb21Gb3JtRGF0YShmb3JtRGF0YSksXG4gICAgICAgIC4uLmxvY2FsVmFsdWVzXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFyc2VkID0gc2NoZW1hID8gc2NoZW1hLnNhZmVQYXJzZShmb3JtVmFsdWVzKSA6IHtkYXRhOiBmb3JtVmFsdWVzIGFzIFQsIHN1Y2Nlc3M6IHRydWUgYXMgY29uc3R9O1xuXG4gICAgICBpZighcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgbmV4dEVycm9ycyA9IGdldEVycm9yc0Zyb21ab2QocGFyc2VkLmVycm9yKTtcbiAgICAgICAgc2V0TG9jYWxFcnJvcnMobmV4dEVycm9ycyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3JzOiBuZXh0RXJyb3JzLFxuICAgICAgICAgIHZhbHVlczogZm9ybVZhbHVlc1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0RXJyb3JzOiBGb3JtRXJyb3JzID0ge307XG4gICAgICBjb25zdCBzZXRFcnJvciA9IChmaWVsZDogc3RyaW5nLCBlcnJvcjoge3R5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nfSkgPT4ge1xuICAgICAgICBuZXh0RXJyb3JzW2ZpZWxkXSA9IGVycm9yO1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgb25TdWJtaXQocGFyc2VkLmRhdGEsIHN1Ym1pdEV2ZW50UmVmLmN1cnJlbnQgYXMgQmFzZVN5bnRoZXRpY0V2ZW50LCBzZXRFcnJvcik7XG4gICAgICBzZXRMb2NhbEVycm9ycyhuZXh0RXJyb3JzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzOiBuZXh0RXJyb3JzLFxuICAgICAgICB2YWx1ZXM6IGZvcm1WYWx1ZXNcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgdmFsdWVzOiBkZWZhdWx0VmFsdWVzXG4gICAgfVxuICApO1xuICBjb25zdCBhbGxFcnJvcnMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ubG9jYWxFcnJvcnMsXG4gICAgLi4uZXJyb3JzXG4gIH0pLCBbZXJyb3JzLCBsb2NhbEVycm9yc10pO1xuICBjb25zdCB2YWx1ZXMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLi4uc3RhdGUudmFsdWVzLFxuICAgIC4uLmxvY2FsVmFsdWVzXG4gIH0pLCBbbG9jYWxWYWx1ZXMsIHN0YXRlLnZhbHVlc10pO1xuICBjb25zdCBzZXRWYWx1ZSA9IHVzZUNhbGxiYWNrKChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICBzZXRMb2NhbFZhbHVlcygoY3VycmVudFZhbHVlcykgPT4ge1xuICAgICAgaWYoT2JqZWN0Lmhhc093bihjdXJyZW50VmFsdWVzLCBmaWVsZE5hbWUpICYmIE9iamVjdC5pcyhjdXJyZW50VmFsdWVzW2ZpZWxkTmFtZV0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlcztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7Li4uY3VycmVudFZhbHVlcywgW2ZpZWxkTmFtZV06IHZhbHVlfTtcbiAgICB9KTtcbiAgfSwgW10pO1xuICBjb25zdCBjbGVhckVycm9yID0gdXNlQ2FsbGJhY2soKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0TG9jYWxFcnJvcnMoKGN1cnJlbnRFcnJvcnMpID0+IHtcbiAgICAgIGlmKCFPYmplY3QuaGFzT3duKGN1cnJlbnRFcnJvcnMsIGZpZWxkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFcnJvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRFcnJvcnMgPSB7Li4uY3VycmVudEVycm9yc307XG4gICAgICBkZWxldGUgbmV4dEVycm9yc1tmaWVsZE5hbWVdO1xuICAgICAgcmV0dXJuIG5leHRFcnJvcnM7XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgbWV0aG9kczogR290aGFtRm9ybU1ldGhvZHMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgZm9ybVN0YXRlOiB7XG4gICAgICBlcnJvcnM6IGFsbEVycm9ycyxcbiAgICAgIGlzU3VibWl0dGluZzogaXNQZW5kaW5nXG4gICAgfSxcbiAgICBnZXRWYWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICByZWdpc3RlcjogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiAoe1xuICAgICAgZGVmYXVsdFZhbHVlOiB2YWx1ZXNbZmllbGROYW1lXSA/PyBkZWZhdWx0VmFsdWVzW2ZpZWxkTmFtZV0gPz8gJycsXG4gICAgICBuYW1lOiBmaWVsZE5hbWVcbiAgICB9KSxcbiAgICBzZXRFcnJvcjogKGZpZWxkTmFtZTogc3RyaW5nLCBlcnJvcjoge3R5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nfSkgPT4ge1xuICAgICAgc2V0TG9jYWxFcnJvcnMoKGN1cnJlbnRFcnJvcnMpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnRFcnJvcnMsXG4gICAgICAgIFtmaWVsZE5hbWVdOiBlcnJvclxuICAgICAgfSkpO1xuICAgIH0sXG4gICAgc2V0VmFsdWVcbiAgfSksIFthbGxFcnJvcnMsIGRlZmF1bHRWYWx1ZXMsIGlzUGVuZGluZywgc2V0VmFsdWUsIHZhbHVlc10pO1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgY2xlYXJFcnJvcixcbiAgICBkZWZhdWx0VmFsdWVzLFxuICAgIGVycm9yczogYWxsRXJyb3JzLFxuICAgIGlzU3VibWl0dGluZzogaXNQZW5kaW5nLFxuICAgIHNldFZhbHVlLFxuICAgIHZhbHVlc1xuICB9KSwgW2FsbEVycm9ycywgY2xlYXJFcnJvciwgZGVmYXVsdFZhbHVlcywgaXNQZW5kaW5nLCBzZXRWYWx1ZSwgdmFsdWVzXSk7XG4gIGNvbnN0IFtmaWVsZFN0b3JlXSA9IHVzZVN0YXRlKCgpID0+IGNyZWF0ZUZvcm1GaWVsZFN0b3JlKGNvbnRleHRWYWx1ZSkpO1xuXG4gIC8vIFB1Ymxpc2ggY29tbWl0dGVkIFJlYWN0IHN0YXRlLCBuZXZlciBzdGF0ZSBmcm9tIGFuIGFiYW5kb25lZCByZW5kZXIuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgZmllbGRTdG9yZS51cGRhdGUoY29udGV4dFZhbHVlKTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgZmllbGRTdG9yZV0pO1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZ2V0RXJyb3JNZXNzYWdlcyhhbGxFcnJvcnMpO1xuICBjb25zdCBoYW5kbGVGb3JtU3VibWl0ID0gKGV2ZW50OiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZihpc1BlbmRpbmcgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJtaXRFdmVudFJlZi5jdXJyZW50ID0gZXZlbnQgYXMgdW5rbm93biBhcyBCYXNlU3ludGhldGljRXZlbnQ7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgc3RhcnRUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgIHN1Ym1pdEFjdGlvbihmb3JtRGF0YSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8R290aGFtRm9ybUZpZWxkQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17ZmllbGRTdG9yZX0+XG4gICAgICA8R290aGFtRm9ybUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICAgIDxmb3JtXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9e2Bmb3JtLSR7bmFtZX1gfVxuICAgICAgICAgIG5vVmFsaWRhdGVcbiAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlRm9ybVN1Ym1pdH1cbiAgICAgICAgPlxuICAgICAgICAgIHtzaG93RXJyb3JzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInAtMyBtYi00IHRleHQtc20gdGV4dC1yZWQtNzAwIGJnLXJlZC0xMDAgcm91bmRlZC1sZyBkYXJrOmJnLXJlZC0yMDAgZGFyazp0ZXh0LXJlZC04MDBcIlxuICAgICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1kaXNjIGxpc3QtaW5zaWRlXCI+XG4gICAgICAgICAgICAgICAge2Vycm9yTWVzc2FnZXMubWFwKChtZXNzYWdlLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPGxpIGtleT17aW5kZXh9PnttZXNzYWdlfTwvbGk+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbihtZXRob2RzKSA6IGNoaWxkcmVufVxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L0dvdGhhbUZvcm1Db250ZXh0LlByb3ZpZGVyPlxuICAgIDwvR290aGFtRm9ybUZpZWxkQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG4iXSwibmFtZXMiOlsic3RhcnRUcmFuc2l0aW9uIiwidXNlQWN0aW9uU3RhdGUiLCJ1c2VDYWxsYmFjayIsInVzZUxheW91dEVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIkdvdGhhbUZvcm1Db250ZXh0IiwiR290aGFtRm9ybUZpZWxkQ29udGV4dCIsImNyZWF0ZUZvcm1GaWVsZFN0b3JlIiwiZ2V0Rm9ybUVycm9yTWVzc2FnZSIsImdldEZvcm1EYXRhVmFsdWUiLCJmb3JtRGF0YSIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImxlbmd0aCIsImdldFZhbHVlc0Zyb21Gb3JtRGF0YSIsIkFycmF5IiwiZnJvbSIsIlNldCIsImtleXMiLCJmb3JFYWNoIiwiZ2V0RXJyb3JzRnJvbVpvZCIsImVycm9yIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJpc3N1ZXMiLCJtYXAiLCJpc3N1ZSIsInBhdGgiLCJqb2luIiwibWVzc2FnZSIsInR5cGUiLCJjb2RlIiwiZ2V0RXJyb3JNZXNzYWdlcyIsImVycm9yT2JqIiwiZmlsdGVyIiwiQm9vbGVhbiIsImVtcHR5VmFsdWVzIiwiZW1wdHlFcnJvcnMiLCJGb3JtIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJkZWZhdWx0VmFsdWVzIiwiZGlzYWJsZWQiLCJlcnJvcnMiLCJuYW1lIiwic2NoZW1hIiwic2hvd0Vycm9ycyIsIm9uU3VibWl0IiwibG9jYWxFcnJvcnMiLCJzZXRMb2NhbEVycm9ycyIsImxvY2FsVmFsdWVzIiwic2V0TG9jYWxWYWx1ZXMiLCJzdWJtaXRFdmVudFJlZiIsInN0YXRlIiwic3VibWl0QWN0aW9uIiwiaXNQZW5kaW5nIiwiX3ByZXZpb3VzU3RhdGUiLCJmb3JtVmFsdWVzIiwicGFyc2VkIiwic2FmZVBhcnNlIiwiZGF0YSIsInN1Y2Nlc3MiLCJuZXh0RXJyb3JzIiwic2V0RXJyb3IiLCJmaWVsZCIsImN1cnJlbnQiLCJhbGxFcnJvcnMiLCJzZXRWYWx1ZSIsImZpZWxkTmFtZSIsInZhbHVlIiwiY3VycmVudFZhbHVlcyIsImhhc093biIsImlzIiwiY2xlYXJFcnJvciIsImN1cnJlbnRFcnJvcnMiLCJtZXRob2RzIiwiZm9ybVN0YXRlIiwiaXNTdWJtaXR0aW5nIiwiZ2V0VmFsdWVzIiwicmVnaXN0ZXIiLCJkZWZhdWx0VmFsdWUiLCJjb250ZXh0VmFsdWUiLCJmaWVsZFN0b3JlIiwidXBkYXRlIiwiZXJyb3JNZXNzYWdlcyIsImhhbmRsZUZvcm1TdWJtaXQiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiRm9ybURhdGEiLCJjdXJyZW50VGFyZ2V0IiwiUHJvdmlkZXIiLCJmb3JtIiwiZGF0YS10ZXN0aWQiLCJub1ZhbGlkYXRlIiwiZGl2IiwiYXJpYS1saXZlIiwicm9sZSIsInVsIiwiaW5kZXgiLCJsaSJdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGVBQWUsRUFBRUMsY0FBYyxFQUFFQyxXQUFXLEVBQUVDLGVBQWUsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBTyxRQUFRO0FBRy9HLFNBQVFDLGlCQUFpQixFQUFFQyxzQkFBc0IsRUFBRUMsb0JBQW9CLEVBQUVDLG1CQUFtQixRQUFPLG1CQUFtQjtBQTRDdEgsTUFBTUMsbUJBQW1CLENBQUNDLFVBQW9CQztJQUM1QyxNQUFNQyxTQUFTRixTQUFTRyxNQUFNLENBQUNGO0lBRS9CLElBQUdDLE9BQU9FLE1BQU0sR0FBRyxHQUFHO1FBQ3BCLE9BQU9GO0lBQ1Q7SUFFQSxPQUFPQSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQ3RCO0FBRUEsTUFBTUcsd0JBQXdCLENBQUNMO0lBQzdCLE1BQU1FLFNBQXFCLENBQUM7SUFFNUJJLE1BQU1DLElBQUksQ0FBQyxJQUFJQyxJQUFJRixNQUFNQyxJQUFJLENBQUNQLFNBQVNTLElBQUksTUFBTUMsT0FBTyxDQUFDLENBQUNUO1FBQ3hEQyxNQUFNLENBQUNELElBQUksR0FBR0YsaUJBQWlCQyxVQUFVQztJQUMzQztJQUVBLE9BQU9DO0FBQ1Q7QUFFQSxNQUFNUyxtQkFBbUIsQ0FBQ0MsUUFBa0NDLE9BQU9DLFdBQVcsQ0FDNUVGLE1BQU1HLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLENBQUNDLFFBQVU7WUFDMUJBLE1BQU1DLElBQUksQ0FBQ0MsSUFBSSxDQUFDO1lBQ2hCO2dCQUNFQyxTQUFTSCxNQUFNRyxPQUFPO2dCQUN0QkMsTUFBTUosTUFBTUssSUFBSTtZQUNsQjtT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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { interactWithCanvas } from '../../utils/storyInteractions.js';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { TextField } from '../TextField/TextField.js';
|
|
6
|
+
import { Form } from './Form.js';
|
|
7
|
+
const meta = {
|
|
8
|
+
argTypes: {
|
|
9
|
+
disabled: {
|
|
10
|
+
control: 'boolean'
|
|
11
|
+
},
|
|
12
|
+
mode: {
|
|
13
|
+
control: 'select',
|
|
14
|
+
options: [
|
|
15
|
+
'onSubmit',
|
|
16
|
+
'onBlur',
|
|
17
|
+
'onChange',
|
|
18
|
+
'onTouched',
|
|
19
|
+
'all'
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
name: {
|
|
23
|
+
control: 'text'
|
|
24
|
+
},
|
|
25
|
+
showErrors: {
|
|
26
|
+
control: 'boolean'
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
component: Form,
|
|
30
|
+
parameters: {
|
|
31
|
+
layout: 'centered'
|
|
32
|
+
},
|
|
33
|
+
title: 'Components/Form/Form'
|
|
34
|
+
};
|
|
35
|
+
export default meta;
|
|
36
|
+
export const Default = {
|
|
37
|
+
args: {
|
|
38
|
+
defaultValues: {
|
|
39
|
+
email: ''
|
|
40
|
+
},
|
|
41
|
+
disabled: false,
|
|
42
|
+
mode: 'onBlur',
|
|
43
|
+
name: 'storybook',
|
|
44
|
+
showErrors: false
|
|
45
|
+
},
|
|
46
|
+
play: interactWithCanvas,
|
|
47
|
+
render: (args)=>/*#__PURE__*/ _jsxs(Form, {
|
|
48
|
+
...args,
|
|
49
|
+
className: "flex w-80 flex-col gap-3",
|
|
50
|
+
onSubmit: ()=>undefined,
|
|
51
|
+
children: [
|
|
52
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
53
|
+
borderType: "rounded",
|
|
54
|
+
name: "email",
|
|
55
|
+
placeholder: "Email address"
|
|
56
|
+
}),
|
|
57
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
58
|
+
label: "Submit",
|
|
59
|
+
type: "submit"
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
})
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Zvcm0vRm9ybS5zdG9yaWVzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge2ludGVyYWN0V2l0aENhbnZhc30gZnJvbSAnLi4vLi4vdXRpbHMvc3RvcnlJbnRlcmFjdGlvbnMuanMnO1xuaW1wb3J0IHtCdXR0b259IGZyb20gJy4uL0J1dHRvbi9CdXR0b24uanMnO1xuaW1wb3J0IHtUZXh0RmllbGR9IGZyb20gJy4uL1RleHRGaWVsZC9UZXh0RmllbGQuanMnO1xuaW1wb3J0IHtGb3JtfSBmcm9tICcuL0Zvcm0uanMnO1xuXG5pbXBvcnQgdHlwZSB7TWV0YSwgU3RvcnlPYmp9IGZyb20gJ0BubGFicy9sZXgvc3Rvcnlib29rJztcblxuY29uc3QgbWV0YTogTWV0YTx0eXBlb2YgRm9ybT4gPSB7XG4gIGFyZ1R5cGVzOiB7XG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIGNvbnRyb2w6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgbW9kZToge1xuICAgICAgY29udHJvbDogJ3NlbGVjdCcsXG4gICAgICBvcHRpb25zOiBbJ29uU3VibWl0JywgJ29uQmx1cicsICdvbkNoYW5nZScsICdvblRvdWNoZWQnLCAnYWxsJ11cbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIGNvbnRyb2w6ICd0ZXh0J1xuICAgIH0sXG4gICAgc2hvd0Vycm9yczoge1xuICAgICAgY29udHJvbDogJ2Jvb2xlYW4nXG4gICAgfVxuICB9LFxuICBjb21wb25lbnQ6IEZvcm0sXG4gIHBhcmFtZXRlcnM6IHtcbiAgICBsYXlvdXQ6ICdjZW50ZXJlZCdcbiAgfSxcbiAgdGl0bGU6ICdDb21wb25lbnRzL0Zvcm0vRm9ybSdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGE7XG5cbnR5cGUgU3RvcnkgPSBTdG9yeU9iajx0eXBlb2YgRm9ybT47XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0OiBTdG9yeSA9IHtcbiAgYXJnczoge1xuICAgIGRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgIGVtYWlsOiAnJ1xuICAgIH0sXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIG1vZGU6ICdvbkJsdXInLFxuICAgIG5hbWU6ICdzdG9yeWJvb2snLFxuICAgIHNob3dFcnJvcnM6IGZhbHNlXG4gIH0sXG4gIHBsYXk6IGludGVyYWN0V2l0aENhbnZhcyxcbiAgcmVuZGVyOiAoYXJncykgPT4gKFxuICAgIDxGb3JtXG4gICAgICB7Li4uYXJnc31cbiAgICAgIGNsYXNzTmFtZT1cImZsZXggdy04MCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgICBvblN1Ym1pdD17KCkgPT4gdW5kZWZpbmVkfVxuICAgID5cbiAgICAgIDxUZXh0RmllbGQgYm9yZGVyVHlwZT1cInJvdW5kZWRcIiBuYW1lPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVtYWlsIGFkZHJlc3NcIiAvPlxuICAgICAgPEJ1dHRvbiBsYWJlbD1cIlN1Ym1pdFwiIHR5cGU9XCJzdWJtaXRcIiAvPlxuICAgIDwvRm9ybT5cbiAgKVxufTtcbiJdLCJuYW1lcyI6WyJSZWFjdCIsImludGVyYWN0V2l0aENhbnZhcyIsIkJ1dHRvbiIsIlRleHRGaWVsZCIsIkZvcm0iLCJtZXRhIiwiYXJnVHlwZXMiLCJkaXNhYmxlZCIsImNvbnRyb2wiLCJtb2RlIiwib3B0aW9ucyIsIm5hbWUiLCJzaG93RXJyb3JzIiwiY29tcG9uZW50IiwicGFyYW1ldGVycyIsImxheW91dCIsInRpdGxlIiwiRGVmYXVsdCIsImFyZ3MiLCJkZWZhdWx0VmFsdWVzIiwiZW1haWwiLCJwbGF5IiwicmVuZGVyIiwiY2xhc3NOYW1lIiwib25TdWJtaXQiLCJ1bmRlZmluZWQiLCJib3JkZXJUeXBlIiwicGxhY2Vob2xkZXIiLCJsYWJlbCIsInR5cGUiXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFFMUIsU0FBUUMsa0JBQWtCLFFBQU8sbUNBQW1DO0FBQ3BFLFNBQVFDLE1BQU0sUUFBTyxzQkFBc0I7QUFDM0MsU0FBUUMsU0FBUyxRQUFPLDRCQUE0QjtBQUNwRCxTQUFRQyxJQUFJLFFBQU8sWUFBWTtBQUkvQixNQUFNQyxPQUEwQjtJQUM5QkMsVUFBVTtRQUNSQyxVQUFVO1lBQ1JDLFNBQVM7UUFDWDtRQUNBQyxNQUFNO1lBQ0pELFNBQVM7WUFDVEUsU0FBUztnQkFBQztnQkFBWTtnQkFBVTtnQkFBWTtnQkFBYTthQUFNO1FBQ2pFO1FBQ0FDLE1BQU07WUFDSkgsU0FBUztRQUNYO1FBQ0FJLFlBQVk7WUFDVkosU0FBUztRQUNYO0lBQ0Y7SUFDQUssV0FBV1Q7SUFDWFUsWUFBWTtRQUNWQyxRQUFRO0lBQ1Y7SUFDQUMsT0FBTztBQUNUO0FBRUEsZUFBZVgsS0FBSztBQUlwQixPQUFPLE1BQU1ZLFVBQWlCO0lBQzVCQyxNQUFNO1FBQ0pDLGVBQWU7WUFDYkMsT0FBTztRQUNUO1FBQ0FiLFVBQVU7UUFDVkUsTUFBTTtRQUNORSxNQUFNO1FBQ05DLFlBQVk7SUFDZDtJQUNBUyxNQUFNcEI7SUFDTnFCLFFBQVEsQ0FBQ0oscUJBQ1AsTUFBQ2Q7WUFDRSxHQUFHYyxJQUFJO1lBQ1JLLFdBQVU7WUFDVkMsVUFBVSxJQUFNQzs7OEJBRWhCLEtBQUN0QjtvQkFBVXVCLFlBQVc7b0JBQVVmLE1BQUs7b0JBQVFnQixhQUFZOzs4QkFDekQsS0FBQ3pCO29CQUFPMEIsT0FBTTtvQkFBU0MsTUFBSzs7OztBQUdsQyxFQUFFIn0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type FormErrors = Record<string, {
|
|
2
|
+
readonly message?: string;
|
|
3
|
+
readonly type?: string;
|
|
4
|
+
} | string | undefined>;
|
|
5
|
+
export type FormValues = Record<string, unknown>;
|
|
6
|
+
export interface GothamFormContextValue {
|
|
7
|
+
readonly clearError: (name: string) => void;
|
|
8
|
+
readonly defaultValues: FormValues;
|
|
9
|
+
readonly errors: FormErrors;
|
|
10
|
+
readonly isSubmitting: boolean;
|
|
11
|
+
readonly setValue: (name: string, value: unknown) => void;
|
|
12
|
+
readonly values: FormValues;
|
|
13
|
+
}
|
|
14
|
+
export declare const GothamFormContext: import("react").Context<GothamFormContextValue | null>;
|
|
15
|
+
export declare const useGothamFormContext: () => GothamFormContextValue | null;
|
|
16
|
+
export declare const getFormErrorMessage: (error: FormErrors[string]) => string | undefined;
|
|
17
|
+
export interface GothamFormFieldValue {
|
|
18
|
+
readonly clearError: GothamFormContextValue['clearError'];
|
|
19
|
+
readonly defaultValue: unknown;
|
|
20
|
+
readonly error: FormErrors[string];
|
|
21
|
+
readonly setValue: GothamFormContextValue['setValue'];
|
|
22
|
+
readonly value: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare const createFormFieldStore: (initialValue: GothamFormContextValue) => {
|
|
25
|
+
getSnapshot: () => GothamFormContextValue;
|
|
26
|
+
subscribe: (listener: () => void) => () => void;
|
|
27
|
+
update: (value: GothamFormContextValue) => void;
|
|
28
|
+
};
|
|
29
|
+
export declare const GothamFormFieldContext: import("react").Context<{
|
|
30
|
+
getSnapshot: () => GothamFormContextValue;
|
|
31
|
+
subscribe: (listener: () => void) => () => void;
|
|
32
|
+
update: (value: GothamFormContextValue) => void;
|
|
33
|
+
} | null>;
|
|
34
|
+
/** Subscribe only to the named field. Use the full context for cross-field UI. */
|
|
35
|
+
export declare const useGothamFormField: (name: string) => GothamFormFieldValue | null;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createContext, use, useContext, useMemo, useSyncExternalStore } from 'react';
|
|
2
|
+
export const GothamFormContext = createContext(null);
|
|
3
|
+
export const useGothamFormContext = ()=>useContext(GothamFormContext);
|
|
4
|
+
export const getFormErrorMessage = (error)=>{
|
|
5
|
+
if (typeof error === 'string') {
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
return error?.message;
|
|
9
|
+
};
|
|
10
|
+
// This subscription adapter exposes committed form state at field granularity.
|
|
11
|
+
// React remains the owner of the form's values and validation state.
|
|
12
|
+
export const createFormFieldStore = (initialValue)=>{
|
|
13
|
+
let currentValue = initialValue;
|
|
14
|
+
const listeners = new Set();
|
|
15
|
+
return {
|
|
16
|
+
getSnapshot: ()=>currentValue,
|
|
17
|
+
subscribe: (listener)=>{
|
|
18
|
+
listeners.add(listener);
|
|
19
|
+
return ()=>{
|
|
20
|
+
listeners.delete(listener);
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
update: (value)=>{
|
|
24
|
+
if (currentValue === value) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
currentValue = value;
|
|
28
|
+
listeners.forEach((listener)=>listener());
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export const GothamFormFieldContext = createContext(null);
|
|
33
|
+
const subscribeWithoutForm = ()=>()=>{};
|
|
34
|
+
/** Subscribe only to the named field. Use the full context for cross-field UI. */ export const useGothamFormField = (name)=>{
|
|
35
|
+
const store = useContext(GothamFormFieldContext);
|
|
36
|
+
const legacyForm = store ? null : use(GothamFormContext);
|
|
37
|
+
const getSnapshot = useMemo(()=>{
|
|
38
|
+
let previous = null;
|
|
39
|
+
return ()=>{
|
|
40
|
+
if (!store) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const form = store.getSnapshot();
|
|
44
|
+
const next = {
|
|
45
|
+
clearError: form.clearError,
|
|
46
|
+
defaultValue: form.defaultValues[name],
|
|
47
|
+
error: form.errors[name],
|
|
48
|
+
setValue: form.setValue,
|
|
49
|
+
value: form.values[name]
|
|
50
|
+
};
|
|
51
|
+
if (previous && Object.is(previous.value, next.value) && Object.is(previous.defaultValue, next.defaultValue) && previous.error === next.error && previous.clearError === next.clearError && previous.setValue === next.setValue) {
|
|
52
|
+
return previous;
|
|
53
|
+
}
|
|
54
|
+
previous = next;
|
|
55
|
+
return next;
|
|
56
|
+
};
|
|
57
|
+
}, [
|
|
58
|
+
name,
|
|
59
|
+
store
|
|
60
|
+
]);
|
|
61
|
+
const field = useSyncExternalStore(store?.subscribe ?? subscribeWithoutForm, getSnapshot, getSnapshot);
|
|
62
|
+
return legacyForm ? {
|
|
63
|
+
clearError: legacyForm.clearError,
|
|
64
|
+
defaultValue: legacyForm.defaultValues[name],
|
|
65
|
+
error: legacyForm.errors[name],
|
|
66
|
+
setValue: legacyForm.setValue,
|
|
67
|
+
value: legacyForm.values[name]
|
|
68
|
+
} : field;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0Zvcm0vRm9ybUNvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVDb250ZXh0LCB1c2UsIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN5bmNFeHRlcm5hbFN0b3JlfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCB0eXBlIEZvcm1FcnJvcnMgPSBSZWNvcmQ8c3RyaW5nLCB7cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZzsgcmVhZG9ubHkgdHlwZT86IHN0cmluZ30gfCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuZXhwb3J0IHR5cGUgRm9ybVZhbHVlcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEdvdGhhbUZvcm1Db250ZXh0VmFsdWUge1xuICByZWFkb25seSBjbGVhckVycm9yOiAobmFtZTogc3RyaW5nKSA9PiB2b2lkO1xuICByZWFkb25seSBkZWZhdWx0VmFsdWVzOiBGb3JtVmFsdWVzO1xuICByZWFkb25seSBlcnJvcnM6IEZvcm1FcnJvcnM7XG4gIHJlYWRvbmx5IGlzU3VibWl0dGluZzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2V0VmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICByZWFkb25seSB2YWx1ZXM6IEZvcm1WYWx1ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBHb3RoYW1Gb3JtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8R290aGFtRm9ybUNvbnRleHRWYWx1ZSB8IG51bGw+KG51bGwpO1xuXG5leHBvcnQgY29uc3QgdXNlR290aGFtRm9ybUNvbnRleHQgPSAoKTogR290aGFtRm9ybUNvbnRleHRWYWx1ZSB8IG51bGwgPT4gdXNlQ29udGV4dChHb3RoYW1Gb3JtQ29udGV4dCk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb3JtRXJyb3JNZXNzYWdlID0gKGVycm9yOiBGb3JtRXJyb3JzW3N0cmluZ10pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZih0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIGVycm9yPy5tZXNzYWdlO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Gb3JtRmllbGRWYWx1ZSB7XG4gIHJlYWRvbmx5IGNsZWFyRXJyb3I6IEdvdGhhbUZvcm1Db250ZXh0VmFsdWVbJ2NsZWFyRXJyb3InXTtcbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiB1bmtub3duO1xuICByZWFkb25seSBlcnJvcjogRm9ybUVycm9yc1tzdHJpbmddO1xuICByZWFkb25seSBzZXRWYWx1ZTogR290aGFtRm9ybUNvbnRleHRWYWx1ZVsnc2V0VmFsdWUnXTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8vIFRoaXMgc3Vic2NyaXB0aW9uIGFkYXB0ZXIgZXhwb3NlcyBjb21taXR0ZWQgZm9ybSBzdGF0ZSBhdCBmaWVsZCBncmFudWxhcml0eS5cbi8vIFJlYWN0IHJlbWFpbnMgdGhlIG93bmVyIG9mIHRoZSBmb3JtJ3MgdmFsdWVzIGFuZCB2YWxpZGF0aW9uIHN0YXRlLlxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm1GaWVsZFN0b3JlID0gKGluaXRpYWxWYWx1ZTogR290aGFtRm9ybUNvbnRleHRWYWx1ZSkgPT4ge1xuICBsZXQgY3VycmVudFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRTbmFwc2hvdDogKCkgPT4gY3VycmVudFZhbHVlLFxuICAgIHN1YnNjcmliZTogKGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIHVwZGF0ZTogKHZhbHVlOiBHb3RoYW1Gb3JtQ29udGV4dFZhbHVlKSA9PiB7XG4gICAgICBpZihjdXJyZW50VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcigpKTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgR290aGFtRm9ybUZpZWxkQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRm9ybUZpZWxkU3RvcmU+IHwgbnVsbD4obnVsbCk7XG5jb25zdCBzdWJzY3JpYmVXaXRob3V0Rm9ybSA9ICgpID0+ICgpID0+IHt9O1xuXG4vKiogU3Vic2NyaWJlIG9ubHkgdG8gdGhlIG5hbWVkIGZpZWxkLiBVc2UgdGhlIGZ1bGwgY29udGV4dCBmb3IgY3Jvc3MtZmllbGQgVUkuICovXG5leHBvcnQgY29uc3QgdXNlR290aGFtRm9ybUZpZWxkID0gKG5hbWU6IHN0cmluZyk6IEdvdGhhbUZvcm1GaWVsZFZhbHVlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHN0b3JlID0gdXNlQ29udGV4dChHb3RoYW1Gb3JtRmllbGRDb250ZXh0KTtcbiAgY29uc3QgbGVnYWN5Rm9ybSA9IHN0b3JlID8gbnVsbCA6IHVzZShHb3RoYW1Gb3JtQ29udGV4dCk7XG4gIGNvbnN0IGdldFNuYXBzaG90ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHByZXZpb3VzOiBHb3RoYW1Gb3JtRmllbGRWYWx1ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmKCFzdG9yZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSBzdG9yZS5nZXRTbmFwc2hvdCgpO1xuICAgICAgY29uc3QgbmV4dDogR290aGFtRm9ybUZpZWxkVmFsdWUgPSB7XG4gICAgICAgIGNsZWFyRXJyb3I6IGZvcm0uY2xlYXJFcnJvcixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBmb3JtLmRlZmF1bHRWYWx1ZXNbbmFtZV0sXG4gICAgICAgIGVycm9yOiBmb3JtLmVycm9yc1tuYW1lXSxcbiAgICAgICAgc2V0VmFsdWU6IGZvcm0uc2V0VmFsdWUsXG4gICAgICAgIHZhbHVlOiBmb3JtLnZhbHVlc1tuYW1lXVxuICAgICAgfTtcbiAgICAgIGlmKHByZXZpb3VzICYmIE9iamVjdC5pcyhwcmV2aW91cy52YWx1ZSwgbmV4dC52YWx1ZSlcbiAgICAgICAgJiYgT2JqZWN0LmlzKHByZXZpb3VzLmRlZmF1bHRWYWx1ZSwgbmV4dC5kZWZhdWx0VmFsdWUpXG4gICAgICAgICYmIHByZXZpb3VzLmVycm9yID09PSBuZXh0LmVycm9yXG4gICAgICAgICYmIHByZXZpb3VzLmNsZWFyRXJyb3IgPT09IG5leHQuY2xlYXJFcnJvclxuICAgICAgICAmJiBwcmV2aW91cy5zZXRWYWx1ZSA9PT0gbmV4dC5zZXRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IG5leHQ7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9LCBbbmFtZSwgc3RvcmVdKTtcblxuICBjb25zdCBmaWVsZCA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN0b3JlPy5zdWJzY3JpYmUgPz8gc3Vic2NyaWJlV2l0aG91dEZvcm0sIGdldFNuYXBzaG90LCBnZXRTbmFwc2hvdCk7XG4gIHJldHVybiBsZWdhY3lGb3JtID8ge1xuICAgIGNsZWFyRXJyb3I6IGxlZ2FjeUZvcm0uY2xlYXJFcnJvcixcbiAgICBkZWZhdWx0VmFsdWU6IGxlZ2FjeUZvcm0uZGVmYXVsdFZhbHVlc1tuYW1lXSxcbiAgICBlcnJvcjogbGVnYWN5Rm9ybS5lcnJvcnNbbmFtZV0sXG4gICAgc2V0VmFsdWU6IGxlZ2FjeUZvcm0uc2V0VmFsdWUsXG4gICAgdmFsdWU6IGxlZ2FjeUZvcm0udmFsdWVzW25hbWVdXG4gIH0gOiBmaWVsZDtcbn07XG4iXSwibmFtZXMiOlsiY3JlYXRlQ29udGV4dCIsInVzZSIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJHb3RoYW1Gb3JtQ29udGV4dCIsInVzZUdvdGhhbUZvcm1Db250ZXh0IiwiZ2V0Rm9ybUVycm9yTWVzc2FnZSIsImVycm9yIiwibWVzc2FnZSIsImNyZWF0ZUZvcm1GaWVsZFN0b3JlIiwiaW5pdGlhbFZhbHVlIiwiY3VycmVudFZhbHVlIiwibGlzdGVuZXJzIiwiU2V0IiwiZ2V0U25hcHNob3QiLCJzdWJzY3JpYmUiLCJsaXN0ZW5lciIsImFkZCIsImRlbGV0ZSIsInVwZGF0ZSIsInZhbHVlIiwiZm9yRWFjaCIsIkdvdGhhbUZvcm1GaWVsZENvbnRleHQiLCJzdWJzY3JpYmVXaXRob3V0Rm9ybSIsInVzZUdvdGhhbUZvcm1GaWVsZCIsIm5hbWUiLCJzdG9yZSIsImxlZ2FjeUZvcm0iLCJwcmV2aW91cyIsImZvcm0iLCJuZXh0IiwiY2xlYXJFcnJvciIsImRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZXMiLCJlcnJvcnMiLCJzZXRWYWx1ZSIsInZhbHVlcyIsIk9iamVjdCIsImlzIiwiZmllbGQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLGFBQWEsRUFBRUMsR0FBRyxFQUFFQyxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsb0JBQW9CLFFBQU8sUUFBUTtBQWNwRixPQUFPLE1BQU1DLG9CQUFvQkwsY0FBNkMsTUFBTTtBQUVwRixPQUFPLE1BQU1NLHVCQUF1QixJQUFxQ0osV0FBV0csbUJBQW1CO0FBRXZHLE9BQU8sTUFBTUUsc0JBQXNCLENBQUNDO0lBQ2xDLElBQUcsT0FBT0EsVUFBVSxVQUFVO1FBQzVCLE9BQU9BO0lBQ1Q7SUFFQSxPQUFPQSxPQUFPQztBQUNoQixFQUFFO0FBVUYsK0VBQStFO0FBQy9FLHFFQUFxRTtBQUNyRSxPQUFPLE1BQU1DLHVCQUF1QixDQUFDQztJQUNuQyxJQUFJQyxlQUFlRDtJQUNuQixNQUFNRSxZQUFZLElBQUlDO0lBRXRCLE9BQU87UUFDTEMsYUFBYSxJQUFNSDtRQUNuQkksV0FBVyxDQUFDQztZQUNWSixVQUFVSyxHQUFHLENBQUNEO1lBQ2QsT0FBTztnQkFDTEosVUFBVU0sTUFBTSxDQUFDRjtZQUNuQjtRQUNGO1FBQ0FHLFFBQVEsQ0FBQ0M7WUFDUCxJQUFHVCxpQkFBaUJTLE9BQU87Z0JBQ3pCO1lBQ0Y7WUFDQVQsZUFBZVM7WUFDZlIsVUFBVVMsT0FBTyxDQUFDLENBQUNMLFdBQWFBO1FBQ2xDO0lBQ0Y7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNTSx5QkFBeUJ2QixjQUE4RCxNQUFNO0FBQzFHLE1BQU13Qix1QkFBdUIsSUFBTSxLQUFPO0FBRTFDLGdGQUFnRixHQUNoRixPQUFPLE1BQU1DLHFCQUFxQixDQUFDQztJQUNqQyxNQUFNQyxRQUFRekIsV0FBV3FCO0lBQ3pCLE1BQU1LLGFBQWFELFFBQVEsT0FBTzFCLElBQUlJO0lBQ3RDLE1BQU1VLGNBQWNaLFFBQVE7UUFDMUIsSUFBSTBCLFdBQXdDO1FBRTVDLE9BQU87WUFDTCxJQUFHLENBQUNGLE9BQU87Z0JBQ1QsT0FBTztZQUNUO1lBQ0EsTUFBTUcsT0FBT0gsTUFBTVosV0FBVztZQUM5QixNQUFNZ0IsT0FBNkI7Z0JBQ2pDQyxZQUFZRixLQUFLRSxVQUFVO2dCQUMzQkMsY0FBY0gsS0FBS0ksYUFBYSxDQUFDUixLQUFLO2dCQUN0Q2xCLE9BQU9zQixLQUFLSyxNQUFNLENBQUNULEtBQUs7Z0JBQ3hCVSxVQUFVTixLQUFLTSxRQUFRO2dCQUN2QmYsT0FBT1MsS0FBS08sTUFBTSxDQUFDWCxLQUFLO1lBQzFCO1lBQ0EsSUFBR0csWUFBWVMsT0FBT0MsRUFBRSxDQUFDVixTQUFTUixLQUFLLEVBQUVVLEtBQUtWLEtBQUssS0FDOUNpQixPQUFPQyxFQUFFLENBQUNWLFNBQVNJLFlBQVksRUFBRUYsS0FBS0UsWUFBWSxLQUNsREosU0FBU3JCLEtBQUssS0FBS3VCLEtBQUt2QixLQUFLLElBQzdCcUIsU0FBU0csVUFBVSxLQUFLRCxLQUFLQyxVQUFVLElBQ3ZDSCxTQUFTTyxRQUFRLEtBQUtMLEtBQUtLLFFBQVEsRUFBRTtnQkFDeEMsT0FBT1A7WUFDVDtZQUNBQSxXQUFXRTtZQUNYLE9BQU9BO1FBQ1Q7SUFDRixHQUFHO1FBQUNMO1FBQU1DO0tBQU07SUFFaEIsTUFBTWEsUUFBUXBDLHFCQUFxQnVCLE9BQU9YLGFBQWFRLHNCQUFzQlQsYUFBYUE7SUFDMUYsT0FBT2EsYUFBYTtRQUNsQkksWUFBWUosV0FBV0ksVUFBVTtRQUNqQ0MsY0FBY0wsV0FBV00sYUFBYSxDQUFDUixLQUFLO1FBQzVDbEIsT0FBT29CLFdBQVdPLE1BQU0sQ0FBQ1QsS0FBSztRQUM5QlUsVUFBVVIsV0FBV1EsUUFBUTtRQUM3QmYsT0FBT08sV0FBV1MsTUFBTSxDQUFDWCxLQUFLO0lBQ2hDLElBQUljO0FBQ04sRUFBRSJ9
|
|
File without changes
|