├── .env.development ├── .env.production ├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── job_opening.md │ └── new-contributor.md ├── PULL_REQUEST_TEMPLATE │ └── pull_request_template.md └── workflows │ ├── linting.yml │ ├── main.yml │ └── testing.yml ├── .gitignore ├── .prettierrc ├── .stylelintrc.json ├── LICENSE ├── README.md ├── buildspec.yml ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── fonts.css ├── fonts │ └── Inter │ │ ├── LICENSE.txt │ │ ├── ttf │ │ ├── Inter-Black.ttf │ │ ├── Inter-BlackItalic.ttf │ │ ├── Inter-Bold.ttf │ │ ├── Inter-BoldItalic.ttf │ │ ├── Inter-ExtraBold.ttf │ │ ├── Inter-ExtraBoldItalic.ttf │ │ ├── Inter-ExtraLight.ttf │ │ ├── Inter-ExtraLightItalic.ttf │ │ ├── Inter-Italic.ttf │ │ ├── Inter-Light.ttf │ │ ├── Inter-LightItalic.ttf │ │ ├── Inter-Medium.ttf │ │ ├── Inter-MediumItalic.ttf │ │ ├── Inter-Regular.ttf │ │ ├── Inter-SemiBold.ttf │ │ ├── Inter-SemiBoldItalic.ttf │ │ ├── Inter-Thin.ttf │ │ └── Inter-ThinItalic.ttf │ │ └── web │ │ ├── woff │ │ ├── Inter-Black.woff │ │ ├── Inter-BlackItalic.woff │ │ ├── Inter-Bold.woff │ │ ├── Inter-BoldItalic.woff │ │ ├── Inter-ExtraBold.woff │ │ ├── Inter-ExtraBoldItalic.woff │ │ ├── Inter-ExtraLight.woff │ │ ├── Inter-ExtraLightItalic.woff │ │ ├── Inter-Italic.woff │ │ ├── Inter-Light.woff │ │ ├── Inter-LightItalic.woff │ │ ├── Inter-Medium.woff │ │ ├── Inter-MediumItalic.woff │ │ ├── Inter-Regular.woff │ │ ├── Inter-SemiBold.woff │ │ ├── Inter-SemiBoldItalic.woff │ │ ├── Inter-Thin.woff │ │ └── Inter-ThinItalic.woff │ │ └── woff2 │ │ ├── Inter-Black.woff2 │ │ ├── Inter-BlackItalic.woff2 │ │ ├── Inter-Bold.woff2 │ │ ├── Inter-BoldItalic.woff2 │ │ ├── Inter-ExtraBold.woff2 │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ ├── Inter-ExtraLight.woff2 │ │ ├── Inter-ExtraLightItalic.woff2 │ │ ├── Inter-Italic.woff2 │ │ ├── Inter-Light.woff2 │ │ ├── Inter-LightItalic.woff2 │ │ ├── Inter-Medium.woff2 │ │ ├── Inter-MediumItalic.woff2 │ │ ├── Inter-Regular.woff2 │ │ ├── Inter-SemiBold.woff2 │ │ ├── Inter-SemiBoldItalic.woff2 │ │ ├── Inter-Thin.woff2 │ │ └── Inter-ThinItalic.woff2 ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json ├── robots.txt └── tnb-og.jpg ├── src ├── apis │ ├── projects │ │ └── index.ts │ └── tutorials │ │ └── index.ts ├── assets │ ├── images │ │ ├── TNB-Logo.png │ │ ├── TNB-LogoAndWordmark.png │ │ ├── TNB-LogoAndWordmarkWhite.png │ │ ├── bitcoin.png │ │ ├── default-avatar.png │ │ ├── ethereum.png │ │ ├── logo.png │ │ └── thenewboston.png │ └── svgs │ │ ├── DiscordLogo.tsx │ │ ├── slider-arrow-left.svg │ │ ├── slider-arrow-right.svg │ │ ├── thenewboston-primary.svg │ │ └── thenewboston-white.svg ├── components │ ├── A │ │ ├── A.test.tsx │ │ ├── Styles.ts │ │ └── index.tsx │ ├── Avatar │ │ ├── Avatar.test.tsx │ │ ├── Styles.ts │ │ └── index.tsx │ ├── BreadcrumbMenu │ │ ├── BreadcrumbMenu.scss │ │ ├── BreadcrumbMenu.test.tsx │ │ └── index.tsx │ ├── BreadcrumbSection │ │ ├── BreadcrumbSection.scss │ │ └── index.tsx │ ├── CodeSnippet │ │ ├── BaseCodeSnippet │ │ │ ├── BaseCodeSnippet.test.tsx │ │ │ └── index.tsx │ │ ├── CodeSnippet │ │ │ ├── CodeSnippet.scss │ │ │ ├── CodeSnippet.test.tsx │ │ │ └── index.tsx │ │ ├── RequestResponseSnippet │ │ │ ├── RequestResponseSnippet.scss │ │ │ ├── RequestResponseSnippet.test.tsx │ │ │ └── index.tsx │ │ └── index.ts │ ├── Container │ │ ├── Container.scss │ │ └── index.tsx │ ├── DashboardLayout │ │ ├── DashboardLayout.scss │ │ ├── DashboardLayout.test.tsx │ │ └── index.tsx │ ├── DataTable │ │ ├── DataTable.scss │ │ └── index.tsx │ ├── Divider │ │ ├── Divider.scss │ │ └── index.tsx │ ├── DocWrapper │ │ ├── DocCallout │ │ │ ├── DocCallout.scss │ │ │ ├── DocCallout.test.tsx │ │ │ └── index.tsx │ │ ├── DocContainer │ │ │ ├── DocContainer.scss │ │ │ ├── DocContainer.test.tsx │ │ │ └── index.tsx │ │ ├── DocEndpoint │ │ │ ├── DocEndpoint.scss │ │ │ ├── DocEndpoint.test.tsx │ │ │ └── index.tsx │ │ ├── DocImage │ │ │ ├── DocImage.scss │ │ │ ├── DocImage.test.tsx │ │ │ └── index.tsx │ │ ├── DocInlineCode │ │ │ ├── DocInlineCode.scss │ │ │ ├── DocInlineCode.test.tsx │ │ │ └── index.tsx │ │ ├── DocList │ │ │ ├── DocList.scss │ │ │ ├── DocList.test.tsx │ │ │ └── index.tsx │ │ ├── DocSubHeader │ │ │ ├── DocSubHeader.scss │ │ │ ├── DocSubHeader.test.tsx │ │ │ └── index.tsx │ │ ├── DocSubSection │ │ │ ├── DocSubSection.scss │ │ │ ├── DocSubSection.test.tsx │ │ │ └── index.tsx │ │ └── index.ts │ ├── DocsMenuItems │ │ └── index.tsx │ ├── EmojiIcon │ │ ├── Styles.ts │ │ ├── components │ │ │ ├── Bulb.tsx │ │ │ ├── Discord.tsx │ │ │ ├── Gear.tsx │ │ │ ├── Paper.tsx │ │ │ ├── Wrench.tsx │ │ │ └── index.ts │ │ └── index.tsx │ ├── EmptyPage │ │ ├── EmptyPage.scss │ │ ├── EmptyPage.test.tsx │ │ └── index.tsx │ ├── ErrorMessage │ │ ├── index.tsx │ │ └── styles.ts │ ├── FaqDropdownCard │ │ ├── Styles.ts │ │ └── index.tsx │ ├── FlatNavLinks │ │ ├── FlatNavLinks.test.tsx │ │ ├── Styles.ts │ │ └── index.tsx │ ├── Footer │ │ ├── Footer.test.tsx │ │ ├── FooterNavList │ │ │ ├── FooterNavList.test.tsx │ │ │ ├── Styles.ts │ │ │ └── index.tsx │ │ ├── Styles.ts │ │ └── index.tsx │ ├── FormElements │ │ ├── Button │ │ │ ├── Button.scss │ │ │ └── index.tsx │ │ ├── Checkbox │ │ │ ├── Checkbox.scss │ │ │ └── index.tsx │ │ └── index.ts │ ├── GoToTop │ │ ├── GoToTop.scss │ │ ├── GoToTop.test.tsx │ │ └── index.tsx │ ├── HashLink │ │ ├── HashLink.scss │ │ ├── HashLink.test.tsx │ │ └── index.tsx │ ├── Label │ │ ├── Label.scss │ │ ├── Label.test.tsx │ │ └── index.tsx │ ├── Layout │ │ ├── Layout.scss │ │ └── index.tsx │ ├── Loader │ │ ├── Loader.scss │ │ ├── Loader.test.tsx │ │ └── index.tsx │ ├── MenuGroup │ │ ├── MenuGroup.scss │ │ ├── MenuGroup.test.tsx │ │ └── index.tsx │ ├── Navigation │ │ ├── Navigation.scss │ │ └── index.tsx │ ├── Note │ │ ├── Note.scss │ │ └── index.tsx │ ├── PageTitle │ │ ├── PageTitle.test.tsx │ │ └── index.tsx │ ├── Pagination │ │ ├── Pagination.scss │ │ ├── Pagination.test.tsx │ │ └── index.tsx │ ├── Popover │ │ ├── Popover.scss │ │ ├── Popover.test.tsx │ │ └── index.tsx │ ├── ProgressiveImage │ │ ├── ProgressiveImage.scss │ │ └── index.tsx │ ├── QueryParams │ │ ├── QueryParamsOffsetAndLimit │ │ │ ├── QueryParamsOffsetAndLimit.test.tsx │ │ │ └── index.tsx │ │ └── index.tsx │ ├── ReactScrollLink │ │ └── index.tsx │ ├── RequiredAsterisk │ │ ├── RequiredAsterisk.scss │ │ ├── RequiredAsterisk.test.tsx │ │ └── index.tsx │ ├── Shadow │ │ ├── Shadow.scss │ │ ├── Shadow.test.tsx │ │ └── index.tsx │ ├── SocialMediaIcon │ │ ├── SocialMediaIcon.test.tsx │ │ └── index.tsx │ ├── Spacer │ │ ├── index.tsx │ │ └── styles.ts │ ├── Table │ │ ├── TableBorderGrid │ │ │ ├── TableBorderGrid.scss │ │ │ ├── TableBorderGrid.test.tsx │ │ │ └── index.tsx │ │ ├── TableParams │ │ │ ├── TableParams.scss │ │ │ ├── TableParams.test.tsx │ │ │ └── index.tsx │ │ ├── TableVertical │ │ │ ├── TableVertical.scss │ │ │ ├── TableVertical.test.tsx │ │ │ └── index.tsx │ │ └── index.ts │ ├── Toast │ │ ├── Toast.scss │ │ └── index.tsx │ ├── VideoPlayer │ │ ├── VideoPlayer.scss │ │ └── index.tsx │ └── index.ts ├── constants │ ├── offsets.ts │ ├── routes.ts │ └── tutorials.ts ├── containers │ ├── App.tsx │ ├── DeveloperPortal │ │ ├── DeveloperPortal.scss │ │ ├── DeveloperPortalCards │ │ │ ├── DeveloperPortalCards.scss │ │ │ └── index.tsx │ │ ├── DeveloperPortalHero │ │ │ ├── DeveloperPortalHero.scss │ │ │ └── index.tsx │ │ ├── Tools │ │ │ ├── Tools.scss │ │ │ ├── background-pattern.webp │ │ │ └── index.tsx │ │ └── index.tsx │ ├── DeveloperTools │ │ ├── Api │ │ │ ├── BankApi │ │ │ │ ├── BankApiAccounts │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiBankTransactions │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiBanks │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiConfig │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiConfirmationBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiInvalidBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiUpgradeNotice │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiValidatorConfirmationServices │ │ │ │ │ └── index.tsx │ │ │ │ ├── BankApiValidators │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── ConfirmationValidatorApi │ │ │ │ ├── ConfirmationValidatorApiAccounts │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiBankConfirmationServices │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiBanks │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiConfig │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiConfirmationBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiPrimaryValidatorUpdated │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiUpgradeRequest │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationValidatorApiValidators │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── NodeApi │ │ │ │ ├── NodeApiClean │ │ │ │ │ └── index.tsx │ │ │ │ ├── NodeApiConnectionRequests │ │ │ │ │ ├── ConnectionRequest.png │ │ │ │ │ └── index.tsx │ │ │ │ └── NodeApiCrawl │ │ │ │ │ └── index.tsx │ │ │ ├── PrimaryValidatorApi │ │ │ │ ├── PrimaryValidatorApiAccounts │ │ │ │ │ └── index.tsx │ │ │ │ ├── PrimaryValidatorApiBankBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── PrimaryValidatorApiBanks │ │ │ │ │ └── index.tsx │ │ │ │ ├── PrimaryValidatorApiConfig │ │ │ │ │ └── index.tsx │ │ │ │ ├── PrimaryValidatorApiConfirmationBlocks │ │ │ │ │ └── index.tsx │ │ │ │ ├── PrimaryValidatorApiValidators │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── components │ │ │ │ ├── Breadcrumb │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Layout │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── SideMenu │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ └── constants.ts │ │ ├── NodeDeployment │ │ │ ├── CeleryBank │ │ │ │ └── index.tsx │ │ │ ├── CeleryValidator │ │ │ │ └── index.tsx │ │ │ ├── DeploymentGuideBank │ │ │ │ └── index.tsx │ │ │ ├── DeploymentGuideValidator │ │ │ │ └── index.tsx │ │ │ ├── Firewall │ │ │ │ └── index.tsx │ │ │ ├── GatewayInterface │ │ │ │ └── index.tsx │ │ │ ├── InstallDependencies │ │ │ │ └── index.tsx │ │ │ ├── KeyGeneration │ │ │ │ └── index.tsx │ │ │ ├── Nginx │ │ │ │ └── index.tsx │ │ │ ├── ProjectSetup │ │ │ │ └── index.tsx │ │ │ ├── Redis │ │ │ │ └── index.tsx │ │ │ ├── StaticFilesAndApplicationConfiguration │ │ │ │ └── index.tsx │ │ │ ├── SystemServices │ │ │ │ └── index.tsx │ │ │ ├── Troubleshooting │ │ │ │ └── index.tsx │ │ │ ├── components │ │ │ │ ├── Breadcrumb │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Layout │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── SideMenu │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ ├── constants.ts │ │ │ └── index.tsx │ │ ├── SDKsAndLibraries │ │ │ ├── SDKsAndLibraries.scss │ │ │ ├── components │ │ │ │ ├── Breadcrumb │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Filters │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Layout │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── SideMenu │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── Utilities │ │ │ ├── Utilities.scss │ │ │ ├── components │ │ │ │ ├── Breadcrumb │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── Layout │ │ │ │ │ ├── Styles.ts │ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── _shared.scss │ │ ├── assets │ │ │ ├── hero-bg.webp │ │ │ ├── hero-img.svg │ │ │ ├── leave-site.svg │ │ │ ├── tile-bg-dotnet.svg │ │ │ ├── tile-bg-javascript.svg │ │ │ ├── tile-bg-kotlin.svg │ │ │ ├── tile-bg-python.svg │ │ │ └── tile-bg.svg │ │ ├── components │ │ │ └── ConfirmationModal │ │ │ │ ├── ConfirmationModal.scss │ │ │ │ └── index.tsx │ │ └── constants.ts │ ├── Guidelines │ │ ├── Guidelines.scss │ │ └── index.tsx │ ├── LivingWhitepaper │ │ ├── LivingWhitepaper.scss │ │ ├── _shared.scss │ │ ├── assets │ │ │ ├── AccountLock.svg │ │ │ ├── BlockChange.svg │ │ │ ├── BlockStructure.svg │ │ │ ├── BlockchainHalted.svg │ │ │ ├── GenesisBlock.svg │ │ │ ├── GenesisBlockComposition.svg │ │ │ ├── HaltRequested.svg │ │ │ ├── LastStep.svg │ │ │ ├── LivingWhitepaperBg.webp │ │ │ ├── LivingWhitepaperCover.webp │ │ │ ├── LivingWhitepaperIcon.webp │ │ │ ├── LongestBlockchain.svg │ │ │ ├── NodeIdentifiers.svg │ │ │ ├── PVInitializationProcess.svg │ │ │ ├── PVInitializationProcessMultipleCandidates.svg │ │ │ ├── Round.svg │ │ │ ├── Schedule Adjustments.svg │ │ │ ├── ScheduleGeneration.svg │ │ │ ├── SyncingBlockchains.svg │ │ │ ├── TokenDistributionApps.webp │ │ │ ├── accounts.svg │ │ │ ├── budgets.svg │ │ │ ├── confirmation-process.svg │ │ │ ├── dream-art.png │ │ │ ├── election-process.svg │ │ │ ├── fork-prevention-1.svg │ │ │ ├── fork-prevention-2.svg │ │ │ ├── fork-prevention-3.svg │ │ │ ├── fork-prevention-alt-3.svg │ │ │ ├── gold.png │ │ │ ├── governance-overview.svg │ │ │ ├── keys.svg │ │ │ ├── magic-axe.png │ │ │ ├── network-flow.svg │ │ │ ├── node-boosting.svg │ │ │ ├── nodes.svg │ │ │ └── schedule-adjustment.svg │ │ ├── components │ │ │ ├── Breadcrumb │ │ │ │ ├── Breadcrumb.scss │ │ │ │ └── index.tsx │ │ │ ├── DeveloperPortalLayout │ │ │ │ ├── DeveloperPortalLayout.scss │ │ │ │ └── index.tsx │ │ │ └── SideMenu │ │ │ │ ├── SideMenu.scss │ │ │ │ └── index.tsx │ │ ├── constants.ts │ │ ├── containers │ │ │ ├── AdditionalFeatures │ │ │ │ ├── AdditionalFeatures.scss │ │ │ │ ├── CollectionManagersVsTokenOwners │ │ │ │ │ ├── CollectionManagersVsTokenOwners.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Collections │ │ │ │ │ ├── Collections.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── TokenDistributionApps │ │ │ │ │ ├── TokenDistributionApps.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── TokenDistributionExchange │ │ │ │ │ ├── TokenDistributionExchange.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── TokenMinting │ │ │ │ │ ├── TokenMinting.scss │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── ArchitectureDeepDive │ │ │ │ ├── AccountLock │ │ │ │ │ ├── AccountLock.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── AddingValidators │ │ │ │ │ ├── AddingValidators.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── ArchitectureDeepDive.scss │ │ │ │ ├── BlockStructure │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConsensusCV │ │ │ │ │ └── index.tsx │ │ │ │ ├── FAQ │ │ │ │ │ ├── FAQ.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── NetworkInitialization │ │ │ │ │ └── index.tsx │ │ │ │ ├── NodeIdentifier │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── PrincipalEntities │ │ │ │ ├── PrincipalEntities.scss │ │ │ │ └── index.tsx │ │ │ └── PrincipalEventsAndProcesses │ │ │ │ ├── DataFlows │ │ │ │ └── index.tsx │ │ │ │ ├── ElectionProcess │ │ │ │ └── index.tsx │ │ │ │ ├── ForkPrevention │ │ │ │ └── index.tsx │ │ │ │ ├── Overview │ │ │ │ ├── Overview.scss │ │ │ │ └── index.tsx │ │ │ │ ├── PVNonResponsiveness │ │ │ │ └── index.tsx │ │ │ │ ├── PointsRefilling │ │ │ │ ├── PointsRefilling.scss │ │ │ │ └── index.tsx │ │ │ │ ├── PrincipalEventsAndProcesses.scss │ │ │ │ ├── RatesAndAmount │ │ │ │ └── index.tsx │ │ │ │ ├── ScheduleAdjustment │ │ │ │ └── index.tsx │ │ │ │ ├── Scheduling │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ └── index.tsx │ ├── PrivacyPolicy │ │ ├── PrivacyPolicy.scss │ │ └── index.tsx │ ├── Projects │ │ ├── Projects.scss │ │ ├── _shared.scss │ │ ├── assets │ │ │ ├── ProjectReviewers.png │ │ │ ├── ProjectsBg.webp │ │ │ ├── ProjectsIcon.webp │ │ │ └── roadmap.png │ │ ├── components │ │ │ ├── Breadcrumb │ │ │ │ ├── Breadcrumb.scss │ │ │ │ └── index.tsx │ │ │ ├── DeveloperPortalLayout │ │ │ │ ├── DeveloperPortalLayout.scss │ │ │ │ └── index.tsx │ │ │ ├── SideMenu │ │ │ │ ├── SideMenu.scss │ │ │ │ └── index.tsx │ │ │ └── Step │ │ │ │ ├── Styles.ts │ │ │ │ └── index.tsx │ │ ├── constants.ts │ │ ├── containers │ │ │ ├── AppSubmissionGuide │ │ │ │ ├── AppSubmissionFaq │ │ │ │ │ ├── ProjectReviewers.png │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.ts │ │ │ │ ├── AppSubmissionHero │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.ts │ │ │ │ ├── AppSubmissionMessage │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.ts │ │ │ │ ├── AppSubmissionSteps │ │ │ │ │ ├── NavigationArrow.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.ts │ │ │ │ └── index.tsx │ │ │ ├── ProjectDetails │ │ │ │ ├── ProjectDetails.scss │ │ │ │ ├── ProjectDetailsHeader │ │ │ │ │ ├── ProjectDetailsHeader.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── ProjectDetailsTopic │ │ │ │ │ ├── ProjectDetailsTopic.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ └── index.tsx │ │ │ └── ProjectRulesAndGuidelines │ │ │ │ ├── EligibleMilestonePayments │ │ │ │ ├── EligibleMilestonePayments.scss │ │ │ │ └── index.tsx │ │ │ │ ├── HowProposalsWork │ │ │ │ ├── HowProposalsWork.scss │ │ │ │ └── index.tsx │ │ │ │ ├── MilestonesAndPayouts │ │ │ │ ├── MilestonesAndPayouts.scss │ │ │ │ └── index.tsx │ │ │ │ ├── ProjectRulesAndGuidelines.scss │ │ │ │ ├── ProposalSubmissionProcess │ │ │ │ ├── ProposalSubmissionProcess.scss │ │ │ │ └── index.tsx │ │ │ │ ├── Rules │ │ │ │ ├── Rules.scss │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ └── index.tsx │ ├── TermsOfUse │ │ ├── TermsOfUse.scss │ │ └── index.tsx │ ├── TopNav │ │ ├── TopNav.scss │ │ ├── TopNavDesktopItems │ │ │ ├── TopNavDesktopItems.scss │ │ │ └── index.tsx │ │ ├── TopNavLink │ │ │ ├── TopNavLink.scss │ │ │ └── index.tsx │ │ ├── TopNavLogo │ │ │ ├── Styles.ts │ │ │ └── index.tsx │ │ ├── TopNavMobileMenu │ │ │ ├── TopNavMobileMenu.scss │ │ │ └── index.tsx │ │ ├── TopNavPopover │ │ │ ├── TopNavPopover.scss │ │ │ ├── TopNavPopoverItem │ │ │ │ ├── TopNavPopoverItem.scss │ │ │ │ └── index.tsx │ │ │ ├── TopNavPopoverItemSimple │ │ │ │ ├── TopNavPopoverItemSimple.scss │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ └── index.tsx │ └── Tutorials │ │ ├── DiscordBanner │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── Playlists │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── PlaylistsSection │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── RelatedTutorials │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── TutorialsHero │ │ ├── index.tsx │ │ └── styles.ts │ │ ├── WatchPlaylist │ │ ├── index.tsx │ │ └── styles.ts │ │ └── components │ │ ├── CategoryDropdown │ │ ├── index.tsx │ │ └── styles.ts │ │ └── PlaylistCard │ │ ├── index.tsx │ │ └── styles.ts ├── data │ ├── openings.json │ ├── tasks.json │ └── teams.json ├── hoc │ └── withSuspense │ │ ├── index.tsx │ │ └── withSuspense.scss ├── hooks │ ├── index.ts │ ├── useBooleanState.ts │ ├── useEventListener.ts │ └── useWindowDimensions.ts ├── index.tsx ├── react-app-env.d.ts ├── setupTests.ts ├── styles │ ├── _code.scss │ ├── _colors.scss │ ├── _core.scss │ ├── _font-mixins.scss │ ├── _font.scss │ ├── _forms.scss │ ├── _mixins.scss │ ├── _tables.scss │ ├── _toastify.scss │ ├── _z-index.scss │ ├── breakpoints │ │ └── index.ts │ ├── colors │ │ └── index.ts │ ├── fonts │ │ ├── base.ts │ │ ├── fontFamilies.ts │ │ ├── fontSizes.ts │ │ ├── fontWeights.ts │ │ └── index.ts │ ├── main.scss │ ├── mixins │ │ └── index.ts │ └── zIndex │ │ └── index.ts ├── types │ ├── api.ts │ ├── developer-tools.ts │ ├── forms.ts │ ├── generic.ts │ ├── navigation.ts │ ├── option.ts │ ├── page-data.ts │ ├── projects.ts │ ├── social-media.ts │ └── tutorials.ts └── utils │ ├── colors.ts │ ├── requests.ts │ ├── social-media.ts │ ├── sort.ts │ ├── time.ts │ ├── toast.tsx │ └── urls.ts └── tsconfig.json /.env.development: -------------------------------------------------------------------------------- 1 | REACT_APP_BACKEND_API=https://api-dev.thenewboston.com 2 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | REACT_APP_BACKEND_API=https://api.thenewboston.com 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a bug report to help us improve 4 | title: '' 5 | labels: 'bug, Not Ready' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Bug Description** 11 | A clear and concise description of what the bug is. 12 | 13 | **Steps to Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Actual behavior** 24 | A clear and concise description of what actually happened. 25 | 26 | **Screenshots/Recordings** 27 | If applicable, add screenshots to help explain your problem. 28 | 29 | **OS and Browser** 30 | - OS: [e.g. Windows 10] 31 | - Browser [e.g. Chrome, Safari] 32 | 33 | **Additional context** 34 | Add any other context about the problem here. 35 | 36 | **Account Number** 37 | Your account number where the reward coins for this bug bounty will be sent (pending review and approval). 38 | 39 | [How to Create an Account](https://thenewboston.com/wallet/create-an-account) 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/job_opening.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Job description 3 | about: Post a job description 4 | title: '' 5 | labels: 1000, Job Description, engineering 6 | assignees: '' 7 | 8 | --- 9 | 10 | Add the following job opening to the website. 11 | 12 | *** 13 | 14 | #### Job Title 15 | Sample Job Title 16 | 17 | #### Job Description 18 | Write a few sentences describing the position here. 19 | 20 | #### Responsibilities 21 | - a 22 | - b 23 | - c 24 | 25 | #### Requirements 26 | - a 27 | - b 28 | - c 29 | 30 | #### Reports To 31 | - First Name: [FIRST NAME HERE] 32 | - Discord Username: [DISCORD USERNAME HERE] 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new-contributor.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New Contributor 3 | about: Add a new contributor. 4 | title: New Contributor 5 | labels: engineering, 500 6 | assignees: '' 7 | 8 | --- 9 | 10 | Team: [TEAM NAME] 11 | 12 | { 13 | "title": [JOB TITLE], 14 | "isLead": [true OR false], 15 | "hourlyRate": [HOURLY RATE], 16 | "contributor": { 17 | "discordUsername": [DISCORD USERNAME], 18 | "displayName": [DISPLAY NAME], 19 | "githubUsername": [GITHUB USERNAME], 20 | "profileImage": [PROFILE IMAGE URL (GitHub URL)] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.github/workflows/linting.yml: -------------------------------------------------------------------------------- 1 | name: Lint Action 2 | 3 | on: 4 | pull_request: 5 | branches: [development] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Install dependencies 14 | run: npm ci 15 | - name: Run linters 16 | run: npm run lint 17 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build And Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build-dev: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Setup Node 14 | uses: actions/setup-node@v2 15 | with: 16 | node-version: 12.x 17 | - run: npm install && npm run build 18 | - name: Archive artifacts 19 | uses: actions/upload-artifact@v2 20 | with: 21 | name: dist 22 | path: | 23 | build 24 | env: 25 | NODE_ENV: development 26 | deploy-dev: 27 | runs-on: ubuntu-latest 28 | environment: Development 29 | env: 30 | BUCKET: developer.thenewboston.com 31 | needs: 32 | - build-dev 33 | steps: 34 | - name: Download a single artifact 35 | uses: actions/download-artifact@v2 36 | with: 37 | name: dist 38 | - name: Configure AWS credentials 39 | uses: aws-actions/configure-aws-credentials@v1 40 | with: 41 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 42 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 43 | aws-region: us-west-2 44 | - run: ls -al -R . 45 | - run: aws s3 sync . s3://$BUCKET --delete 46 | -------------------------------------------------------------------------------- /.github/workflows/testing.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | pull_request: 4 | branches: [development] 5 | jobs: 6 | build: 7 | name: Running test on Node ${{ matrix.node }} and ${{ matrix.os }} 8 | 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | matrix: 12 | node: ['12.x', '14.x'] 13 | os: [ubuntu-latest, windows-latest, macOS-latest] 14 | 15 | steps: 16 | - name: Checkout repo 17 | uses: actions/checkout@v2 18 | 19 | - name: Use Node ${{ matrix.node }} 20 | uses: actions/setup-node@v1 21 | with: 22 | node-version: ${{ matrix.node }} 23 | 24 | - name: Cache node modules 25 | uses: actions/cache@v2 26 | env: 27 | cache-name: cache-node-modules 28 | with: 29 | # npm cache files are stored in `~/.npm` on Linux/macOS 30 | path: ~/.npm 31 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} 32 | restore-keys: | 33 | ${{ runner.os }}-build-${{ env.cache-name }}- 34 | ${{ runner.os }}-build- 35 | ${{ runner.os }}- 36 | 37 | - name: Install dependencies 38 | run: yarn install --network-timeout 1000000 39 | 40 | - name: Test 41 | run: yarn test --ci --coverage --maxWorkers=2 42 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": false, 3 | "endOfLine": "auto", 4 | "printWidth": 120, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "all" 8 | } 9 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["stylelint-order"], 3 | "rules": { 4 | "block-no-empty": true, 5 | "color-no-invalid-hex": true, 6 | "comment-no-empty": true, 7 | "declaration-block-single-line-max-declarations": 1, 8 | "declaration-colon-space-after": "always", 9 | "declaration-no-important": true, 10 | "function-comma-space-before": "never", 11 | "function-comma-space-after": "always", 12 | "indentation": 2, 13 | "max-empty-lines": 2, 14 | "no-eol-whitespace": true, 15 | "no-extra-semicolons": true, 16 | "no-invalid-double-slash-comments": true, 17 | "order/properties-alphabetical-order": true, 18 | "number-no-trailing-zeros": true, 19 | "property-case": "lower", 20 | "property-no-unknown": true, 21 | "selector-list-comma-newline-after": "always", 22 | "string-no-newline": true, 23 | "string-quotes": "single", 24 | "unit-no-unknown": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 thenewboston-developers 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /buildspec.yml: -------------------------------------------------------------------------------- 1 | version: 0.2 2 | 3 | phases: 4 | build: 5 | commands: 6 | - npm install 7 | - CI=true npm test 8 | - npm run build 9 | artifacts: 10 | files: 11 | - "**/*" 12 | discards-paths: no 13 | base-directory: build 14 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: Inter; 3 | font-weight: 300; 4 | src: url('./fonts/Inter/web/woff2/Inter-Light.woff2') format('woff2'), 5 | url('./fonts/Inter/web/woff/Inter-Light.woff') format('woff'); 6 | } 7 | 8 | @font-face { 9 | font-family: Inter; 10 | font-weight: 400; 11 | src: url('./fonts/Inter/web/woff2/Inter-Regular.woff2') format('woff2'), 12 | url('./fonts/Inter/web/woff/Inter-Regular.woff') format('woff'); 13 | } 14 | 15 | @font-face { 16 | font-family: Inter; 17 | font-weight: 500; 18 | src: url('./fonts/Inter/web/woff2/Inter-Medium.woff2') format('woff2'), 19 | url('./fonts/Inter/web/woff/Inter-Medium.woff') format('woff'); 20 | } 21 | 22 | @font-face { 23 | font-family: Inter; 24 | font-weight: 600; 25 | src: url('./fonts/Inter/web/woff2/Inter-SemiBold.woff2') format('woff2'), 26 | url('./fonts/Inter/web/woff/Inter-SemiBold.woff') format('woff'); 27 | } 28 | 29 | @font-face { 30 | font-family: Inter; 31 | font-weight: 700; 32 | src: url('./fonts/Inter/web/woff2/Inter-Bold.woff2') format('woff2'), 33 | url('./fonts/Inter/web/woff/Inter-Bold.woff') format('woff'); 34 | } 35 | -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Black.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-BlackItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Bold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-BoldItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-ExtraBold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-ExtraLight.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Italic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Light.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-LightItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Medium.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-MediumItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-Thin.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/ttf/Inter-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/ttf/Inter-ThinItalic.ttf -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Black.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-BlackItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Bold.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-BoldItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-ExtraBold.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-ExtraLight.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-ExtraLightItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Italic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Light.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-LightItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Medium.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-MediumItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Regular.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-SemiBold.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-SemiBoldItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-Thin.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff/Inter-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff/Inter-ThinItalic.woff -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Black.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Bold.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Italic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Regular.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-Thin.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter/web/woff2/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/fonts/Inter/web/woff2/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/logo512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "thenewboston", 3 | "name": "thenewboston", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/tnb-og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/public/tnb-og.jpg -------------------------------------------------------------------------------- /src/apis/projects/index.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import {PaginatedResponse} from 'types/api'; 4 | import {Project} from 'types/projects'; 5 | 6 | export async function getProjects(): Promise { 7 | const response = await axios.get>(`${process.env.REACT_APP_BACKEND_API}/projects`); 8 | 9 | if (!response.data) { 10 | throw new Error('Error while fetching projects, please try again.'); 11 | } 12 | return response.data.results; 13 | } 14 | -------------------------------------------------------------------------------- /src/assets/images/TNB-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/TNB-Logo.png -------------------------------------------------------------------------------- /src/assets/images/TNB-LogoAndWordmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/TNB-LogoAndWordmark.png -------------------------------------------------------------------------------- /src/assets/images/TNB-LogoAndWordmarkWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/TNB-LogoAndWordmarkWhite.png -------------------------------------------------------------------------------- /src/assets/images/bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/bitcoin.png -------------------------------------------------------------------------------- /src/assets/images/default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/default-avatar.png -------------------------------------------------------------------------------- /src/assets/images/ethereum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/ethereum.png -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/images/thenewboston.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thenewboston-blockchain/Developer-Portal/44907bda7d63486825a7199cfe2e3cc6c0dccb50/src/assets/images/thenewboston.png -------------------------------------------------------------------------------- /src/assets/svgs/slider-arrow-left.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svgs/slider-arrow-right.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/A/Styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import {Icon} from '@thenewboston/ui'; 4 | 5 | export const NewWindowIcon = styled(Icon)` 6 | display: inline-flex; 7 | margin-left: 1px; 8 | margin-right: 3px; 9 | `; 10 | -------------------------------------------------------------------------------- /src/components/A/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {ReactNode} from 'react'; 2 | import clsx from 'clsx'; 3 | import {IconType} from '@thenewboston/ui'; 4 | import {SFC} from 'types/generic'; 5 | 6 | import * as S from './Styles'; 7 | 8 | interface ComponentProps { 9 | children?: ReactNode; 10 | dataTestId?: string; 11 | href: string; 12 | newWindow?: boolean; 13 | iconTotalSize?: number; 14 | iconSize?: number; 15 | showNewWindowIcon?: boolean; 16 | } 17 | 18 | const A: SFC = ({ 19 | children, 20 | className, 21 | dataTestId = 'A', 22 | href, 23 | iconSize = 16, 24 | iconTotalSize = 20, 25 | newWindow = true, 26 | showNewWindowIcon = true, 27 | }) => { 28 | const renderIcon = newWindow && typeof children === 'string' && showNewWindowIcon; 29 | const rel = newWindow ? 'noreferrer' : undefined; 30 | const target = newWindow ? '_blank' : '_self'; 31 | 32 | return ( 33 | 34 | {children} 35 | {renderIcon && ( 36 | 42 | )} 43 | 44 | ); 45 | }; 46 | 47 | export default A; 48 | -------------------------------------------------------------------------------- /src/components/Avatar/Styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import colors from 'styles/colors'; 3 | 4 | interface AvatarProps { 5 | bordered?: boolean; 6 | clickable?: boolean; 7 | } 8 | 9 | export const Avatar = styled.img` 10 | border-radius: 50%; 11 | border: ${(props) => (props.bordered ? `2px solid ${colors.white}` : 'none')}; 12 | cursor: ${(props) => (props.clickable ? 'pointer' : 'none')}; 13 | `; 14 | 15 | export const Placeholder = styled.div` 16 | background: ${colors.palette.gray['100']}; 17 | border-radius: 50%; 18 | `; 19 | -------------------------------------------------------------------------------- /src/components/CodeSnippet/CodeSnippet/CodeSnippet.scss: -------------------------------------------------------------------------------- 1 | .Commands { 2 | &__heading { 3 | font-size: 13px; 4 | font-weight: var(--font-weight-light); 5 | margin-bottom: 2px; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/components/CodeSnippet/CodeSnippet/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import BaseCodeSnippet, {SnippetLang} from '../BaseCodeSnippet'; 6 | import './CodeSnippet.scss'; 7 | 8 | interface ComponentProps { 9 | className?: string; 10 | code: string; 11 | heading?: string; 12 | language?: SnippetLang; 13 | } 14 | 15 | const CodeSnippet: FC = ({className, code, heading, language = SnippetLang.bash}) => { 16 | return ( 17 |
18 | {heading ? ( 19 |
25 | {heading}: 26 |
27 | ) : null} 28 | 29 |
30 | ); 31 | }; 32 | 33 | export default CodeSnippet; 34 | -------------------------------------------------------------------------------- /src/components/CodeSnippet/RequestResponseSnippet/RequestResponseSnippet.scss: -------------------------------------------------------------------------------- 1 | .RequestResponseSnippet { 2 | &__heading { 3 | font-family: var(--font-family-mono); 4 | font-weight: var(--font-weight-semibold); 5 | margin-bottom: 4px; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/components/CodeSnippet/RequestResponseSnippet/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import BaseCodeSnippet, {SnippetLang} from '../BaseCodeSnippet'; 6 | import './RequestResponseSnippet.scss'; 7 | 8 | export interface RequestResponseSnippetProps { 9 | className?: string; 10 | code: string; 11 | heading?: string; 12 | } 13 | 14 | const RequestResponse: FC = ({className, code, heading}) => { 15 | return ( 16 |
17 | {heading ? ( 18 |
22 | {heading}: 23 |
24 | ) : null} 25 | 26 |
27 | ); 28 | }; 29 | 30 | export default RequestResponse; 31 | -------------------------------------------------------------------------------- /src/components/CodeSnippet/index.ts: -------------------------------------------------------------------------------- 1 | import {SnippetLang} from './BaseCodeSnippet'; 2 | import CodeSnippet from './CodeSnippet'; 3 | import RequestResponseSnippet from './RequestResponseSnippet'; 4 | 5 | export {SnippetLang, CodeSnippet, RequestResponseSnippet}; 6 | -------------------------------------------------------------------------------- /src/components/Container/Container.scss: -------------------------------------------------------------------------------- 1 | .Container { 2 | margin-left: auto; 3 | margin-right: auto; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/Container/index.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react/jsx-props-no-spreading */ 2 | 3 | import React, {FC, useMemo} from 'react'; 4 | import clsx from 'clsx'; 5 | 6 | import './Container.scss'; 7 | 8 | type ContainerElement = 'div' | 'header' | 'main'; 9 | 10 | interface ContainerProps { 11 | className?: string; 12 | element?: ContainerElement; 13 | dataTestId?: string; 14 | maxWidth?: number; 15 | } 16 | 17 | const Container: FC = ({children, className, dataTestId, element = 'div', maxWidth = 1366}) => { 18 | const props = useMemo( 19 | () => ({ 20 | className: clsx('Container', className), 21 | 'data-testid': dataTestId, 22 | style: { 23 | maxWidth, 24 | }, 25 | }), 26 | [className, dataTestId, maxWidth], 27 | ); 28 | 29 | switch (element) { 30 | case 'header': { 31 | return
{children}
; 32 | } 33 | case 'main': { 34 | return
{children}
; 35 | } 36 | default: { 37 | return
{children}
; 38 | } 39 | } 40 | }; 41 | 42 | export default Container; 43 | -------------------------------------------------------------------------------- /src/components/DashboardLayout/DashboardLayout.scss: -------------------------------------------------------------------------------- 1 | .DashboardLayout { 2 | display: grid; 3 | grid-template-columns: 300px auto; 4 | height: 100%; 5 | overflow: hidden; 6 | 7 | &__BreadcrumbMenu { 8 | display: none; 9 | } 10 | 11 | &__left-menu { 12 | grid-column: 1 / span 1; 13 | overflow-y: auto; 14 | } 15 | 16 | &__main-content { 17 | grid-column: 2 / span 1; 18 | overflow-y: auto; 19 | padding-bottom: 120px; 20 | } 21 | 22 | @media (max-width: 768px) { 23 | grid-template-columns: auto; 24 | grid-template-rows: fit-content(0) auto; 25 | 26 | &__BreadcrumbMenu { 27 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06); 28 | display: block; 29 | grid-column: 1 / span 1; 30 | grid-row: 1 / span 1; 31 | } 32 | 33 | &__left-menu { 34 | display: none; 35 | } 36 | 37 | &__main-content { 38 | grid-column: 1 / span 1; 39 | grid-row: 2 / span 1; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/components/DashboardLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC, ReactNode} from 'react'; 2 | 3 | import {BreadcrumbMenu, Container, PageTitle} from 'components'; 4 | import './DashboardLayout.scss'; 5 | 6 | export interface DashboardLayoutProps { 7 | children?: ReactNode; 8 | menuItems: ReactNode; 9 | pageName: string; 10 | sectionName: string; 11 | } 12 | 13 | const DashboardLayout: FC = ({children, menuItems, pageName, sectionName}) => { 14 | return ( 15 | <> 16 | 17 | 18 | 24 |
25 | {menuItems} 26 |
27 |
28 | {children} 29 |
30 |
31 | 32 | ); 33 | }; 34 | 35 | export default DashboardLayout; 36 | -------------------------------------------------------------------------------- /src/components/Divider/Divider.scss: -------------------------------------------------------------------------------- 1 | .Divider { 2 | border-bottom: 1px solid var(--color-gray-075); 3 | width: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/Divider/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import clsx from 'clsx'; 4 | import './Divider.scss'; 5 | 6 | const Divider = ({className}: {className?: string}) => { 7 | return
; 8 | }; 9 | 10 | export default Divider; 11 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocCallout/DocCallout.scss: -------------------------------------------------------------------------------- 1 | .DocCallout { 2 | border-left: 4px solid; 3 | margin: 40px 0; 4 | padding: 16px 24px; 5 | 6 | &--important { 7 | border-color: var(--color-yellow-400); 8 | } 9 | 10 | &--note { 11 | border-color: var(--color-secondary); 12 | } 13 | 14 | &--warning { 15 | border-color: var(--color-danger); 16 | } 17 | 18 | &__header { 19 | align-items: center; 20 | display: flex; 21 | font-weight: bold; 22 | margin-bottom: 18px; 23 | 24 | &--important { 25 | color: var(--color-yellow-400); 26 | } 27 | 28 | &--note { 29 | color: var(--color-secondary); 30 | } 31 | 32 | &--warning { 33 | color: var(--color-danger); 34 | } 35 | } 36 | 37 | &__icon { 38 | margin-right: 9px; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocContainer/DocContainer.scss: -------------------------------------------------------------------------------- 1 | .DocContainer { 2 | $self: &; 3 | padding: 32px 32px 16px; 4 | 5 | > *:not(.DocImage) { 6 | margin-left: auto; 7 | margin-right: auto; 8 | max-width: 720px; 9 | } 10 | 11 | &__divider { 12 | height: 12px; 13 | } 14 | 15 | &__HashLink { 16 | display: none; 17 | padding-left: 8px; 18 | } 19 | 20 | &__last-updated { 21 | color: var(--color-sail-gray-500); 22 | font-size: 14px; 23 | font-weight: var(--font-weight-light); 24 | } 25 | 26 | &__page-title { 27 | font-size: 36px; 28 | font-weight: var(--font-weight-light); 29 | line-height: 1.2; 30 | 31 | &:hover { 32 | #{$self}__HashLink { 33 | display: inline; 34 | } 35 | } 36 | } 37 | 38 | &__wrapper { 39 | align-items: center; 40 | display: flex; 41 | justify-content: space-between; 42 | margin-bottom: 24px; 43 | } 44 | 45 | @media (max-width: 992px) { 46 | &__wrapper { 47 | align-items: flex-start; 48 | flex-direction: column; 49 | justify-content: start; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocContainer/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC, ReactNode} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import {HashLink} from 'components'; 6 | 7 | import './DocContainer.scss'; 8 | 9 | export interface DocContainerProps { 10 | className?: string; 11 | id?: string; 12 | lastUpdated?: string; 13 | title: ReactNode; 14 | } 15 | 16 | const DocContainer: FC = ({children, className, id, lastUpdated, title}) => { 17 | return ( 18 |
19 |
25 |

32 | {title} 33 | {id ? : null} 34 |

35 | {Boolean(lastUpdated) && Updated on {lastUpdated}} 36 |
37 | {children} 38 |
39 | ); 40 | }; 41 | 42 | export default DocContainer; 43 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocEndpoint/DocEndpoint.scss: -------------------------------------------------------------------------------- 1 | .DocEndpoint { 2 | font-family: var(--font-family-mono); 3 | font-size: var(--font-size-h2); 4 | font-weight: var(--font-weight-semibold); 5 | margin: 32px 0 12px; 6 | 7 | @media (max-width: 1440px) { 8 | word-break: break-all; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocEndpoint/DocEndpoint.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {render, screen} from '@testing-library/react'; 3 | import '@testing-library/jest-dom/extend-expect'; 4 | 5 | import DocEndpoint, {DocEndpointProps} from '.'; 6 | 7 | describe('DocEndpoint', () => { 8 | let props: DocEndpointProps; 9 | 10 | beforeEach(() => { 11 | props = { 12 | endpoint: '/bank', 13 | method: 'GET', 14 | }; 15 | }); 16 | 17 | it('renders without crashing', () => { 18 | render(); 19 | 20 | expect(screen.getByTestId('DocEndpoint')).toBeTruthy(); 21 | }); 22 | 23 | it('renders with default className', () => { 24 | render(); 25 | const docEndpoint = screen.getByTestId('DocEndpoint'); 26 | 27 | expect(docEndpoint).toHaveClass('DocEndpoint'); 28 | }); 29 | 30 | it('renders with passed in className', () => { 31 | render(); 32 | const docEndpoint = screen.getByTestId('DocEndpoint'); 33 | 34 | expect(docEndpoint).toHaveClass('test'); 35 | }); 36 | 37 | it('renders with correct text', () => { 38 | render(); 39 | const {method, endpoint} = props; 40 | const docEndpoint = screen.getByText(`${method} ${endpoint}`); 41 | 42 | expect(docEndpoint).toBeTruthy(); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocEndpoint/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | 4 | import './DocEndpoint.scss'; 5 | 6 | export interface DocEndpointProps { 7 | className?: string; 8 | endpoint: string; 9 | method: 'GET' | 'POST' | 'PATCH' | 'DELETE'; 10 | } 11 | 12 | const DocEndpoint: FC = ({className, endpoint, method}) => { 13 | return ( 14 |

15 | {method} {endpoint} 16 |

17 | ); 18 | }; 19 | 20 | export default DocEndpoint; 21 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocImage/DocImage.scss: -------------------------------------------------------------------------------- 1 | .DocImage { 2 | text-align: center; 3 | 4 | &__bordered { 5 | border-radius: 2px; 6 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 7 | } 8 | 9 | &__img { 10 | margin-bottom: 20px; 11 | width: 100%; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocImage/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import './DocImage.scss'; 6 | 7 | export interface DocImageProps { 8 | alt: string; 9 | bordered?: boolean; 10 | className?: string; 11 | maxWidth: number; 12 | width?: number; 13 | src: string; 14 | } 15 | 16 | const DocImage: FC = ({alt, bordered, className, maxWidth, src, width}) => { 17 | return ( 18 |
19 | {alt} 29 |
30 | ); 31 | }; 32 | 33 | export default DocImage; 34 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocInlineCode/DocInlineCode.scss: -------------------------------------------------------------------------------- 1 | .DocInlineCode { 2 | background: var(--color-blue-gray-50); 3 | padding: 0 3px; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocInlineCode/DocInlineCode.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {render, screen} from '@testing-library/react'; 3 | import '@testing-library/jest-dom/extend-expect'; 4 | 5 | import DocInlineCode from './index'; 6 | 7 | describe('DocInlineCode', () => { 8 | it('renders with default className', () => { 9 | render(); 10 | const docInlineCode = screen.getByTestId('DocInlineCode'); 11 | expect(docInlineCode).toBeTruthy(); 12 | expect(docInlineCode).toHaveClass('DocInlineCode'); 13 | }); 14 | 15 | it('renders with className Test', () => { 16 | render(); 17 | const docInlineCode = screen.getByTestId('DocInlineCode'); 18 | expect(docInlineCode).toBeTruthy(); 19 | expect(docInlineCode).toHaveClass('Test'); 20 | }); 21 | 22 | it('renders with inner child component', () => { 23 | render(1+1=2); 24 | 25 | const text = screen.getByText('1+1=2'); 26 | expect(text).toBeTruthy(); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocInlineCode/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | 4 | import './DocInlineCode.scss'; 5 | 6 | interface ComponentProps { 7 | className?: string; 8 | } 9 | 10 | const DocInlineCode: FC = ({children, className}) => { 11 | return ( 12 | 13 | {children} 14 | 15 | ); 16 | }; 17 | 18 | export default DocInlineCode; 19 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocList/DocList.scss: -------------------------------------------------------------------------------- 1 | .DocList { 2 | margin-bottom: 20px; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocList/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC, useMemo} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import './DocList.scss'; 6 | 7 | export interface DocListProps { 8 | className?: string; 9 | variant: 'ul' | 'ol'; 10 | } 11 | 12 | const DocList: FC = ({children, className, variant}) => { 13 | const mainClassName = useMemo( 14 | () => 15 | clsx('DocList', className, { 16 | [`DocList--${variant}`]: true, 17 | ...bemify(className, `--${variant}`), 18 | }), 19 | [className, variant], 20 | ); 21 | 22 | if (variant === 'ul') { 23 | return ( 24 |
    25 | {children} 26 |
27 | ); 28 | } 29 | 30 | return ( 31 |
    32 | {children} 33 |
34 | ); 35 | }; 36 | 37 | export default DocList; 38 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocSubHeader/DocSubHeader.scss: -------------------------------------------------------------------------------- 1 | .DocSubHeader { 2 | margin-bottom: 12px; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocSubHeader/DocSubHeader.test.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {render, screen} from '@testing-library/react'; 3 | import '@testing-library/jest-dom/extend-expect'; 4 | 5 | import DocSubHeader from '.'; 6 | 7 | describe('DocSubHeader component', () => { 8 | test('renders with text passed in', () => { 9 | render(Hello World!); 10 | 11 | expect(screen.getByText('Hello World!')).toBeTruthy(); 12 | }); 13 | 14 | test('renders proper default className', () => { 15 | render(Hello World!); 16 | const el = screen.getByTestId('DocSubHeader'); 17 | expect(el.className).toBe('DocSubHeader'); 18 | }); 19 | 20 | test('renders with classNames passed in', () => { 21 | render(Hello World!); 22 | const docSubHeader = screen.getByTestId('DocSubHeader'); 23 | 24 | expect(docSubHeader.className).toContain('test'); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocSubHeader/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC} from 'react'; 2 | import clsx from 'clsx'; 3 | 4 | import './DocSubHeader.scss'; 5 | 6 | interface ComponentProps { 7 | className?: string; 8 | } 9 | 10 | const DocSubHeader: FC = ({children, className}) => { 11 | return ( 12 |

13 | {children} 14 |

15 | ); 16 | }; 17 | 18 | export default DocSubHeader; 19 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocSubSection/DocSubSection.scss: -------------------------------------------------------------------------------- 1 | .DocSubSection { 2 | $self: &; 3 | 4 | &__h2 { 5 | font-size: var(--font-size-h2); 6 | font-weight: 800; 7 | margin: 36px 0 18px; 8 | 9 | &::before { 10 | content: ' '; 11 | display: block; 12 | height: 60px; 13 | margin-top: -60px; 14 | pointer-events: none; 15 | visibility: hidden; 16 | } 17 | 18 | &:hover { 19 | #{$self}__HashLink { 20 | display: inline; 21 | } 22 | } 23 | } 24 | 25 | &__HashLink { 26 | display: none; 27 | padding-left: 4px; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/components/DocWrapper/DocSubSection/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC, ReactNode} from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import {HashLink} from 'components'; 6 | 7 | import './DocSubSection.scss'; 8 | 9 | export interface DocSubSectionProps { 10 | className?: string; 11 | id?: string; 12 | title: ReactNode; 13 | } 14 | 15 | const DocSubSection: FC = ({children, className, id, title}) => { 16 | return ( 17 | <> 18 |

19 | {title} 20 | {id ? : null} 21 |

22 | {children} 23 | 24 | ); 25 | }; 26 | 27 | export default DocSubSection; 28 | -------------------------------------------------------------------------------- /src/components/DocWrapper/index.ts: -------------------------------------------------------------------------------- 1 | import DocCallout, {CalloutType} from './DocCallout'; 2 | import DocContainer from './DocContainer'; 3 | import DocEndpoint from './DocEndpoint'; 4 | import DocImage from './DocImage'; 5 | import DocInlineCode from './DocInlineCode'; 6 | import DocList from './DocList'; 7 | import DocSubHeader from './DocSubHeader'; 8 | import DocSubSection from './DocSubSection'; 9 | 10 | export { 11 | CalloutType, 12 | DocCallout, 13 | DocContainer, 14 | DocEndpoint, 15 | DocImage, 16 | DocInlineCode, 17 | DocList, 18 | DocSubHeader, 19 | DocSubSection, 20 | }; 21 | -------------------------------------------------------------------------------- /src/components/DocsMenuItems/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {NavLink} from 'react-router-dom'; 3 | 4 | import {MenuGroup} from 'components'; 5 | import {SFC} from 'types/generic'; 6 | 7 | const DocsMenuItems: SFC = () => { 8 | return ( 9 | <> 10 | 11 | Bank 12 | Validator 13 | 14 | 15 | ); 16 | }; 17 | 18 | export default DocsMenuItems; 19 | -------------------------------------------------------------------------------- /src/components/EmojiIcon/Styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | type Props = { 4 | color: string; 5 | emojiSize: number; 6 | marginBottom: number; 7 | size: number; 8 | }; 9 | 10 | export const Container = styled.div` 11 | align-items: center; 12 | background-color: ${(props) => props.color}; 13 | border-radius: 50%; 14 | display: flex; 15 | font-size: ${(props) => props.emojiSize}px; 16 | height: ${(props) => props.size}px; 17 | justify-content: center; 18 | margin-bottom: ${(props) => props.marginBottom}px; 19 | width: ${(props) => props.size}px; 20 | `; 21 | -------------------------------------------------------------------------------- /src/components/EmojiIcon/components/index.ts: -------------------------------------------------------------------------------- 1 | export {default as BulbEmoji} from './Bulb'; 2 | export {default as GearEmoji} from './Gear'; 3 | export {default as PaperEmoji} from './Paper'; 4 | export {default as WrenchEmoji} from './Wrench'; 5 | export {default as DiscordEmoji} from './Discord'; 6 | -------------------------------------------------------------------------------- /src/components/EmptyPage/EmptyPage.scss: -------------------------------------------------------------------------------- 1 | .EmptyPage { 2 | display: flex; 3 | font-weight: var(--font-weight-light); 4 | justify-content: center; 5 | margin-top: 64px; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/EmptyPage/EmptyPage.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {render, screen} from '@testing-library/react'; 3 | import '@testing-library/jest-dom/extend-expect'; 4 | 5 | import EmptyPage from '.'; 6 | 7 | describe('EmptyPage', () => { 8 | it('renders without crashing', () => { 9 | render(); 10 | }); 11 | 12 | it('renders an correct text', () => { 13 | render(); 14 | 15 | expect(screen.getByText('No items to display')).toBeTruthy(); 16 | }); 17 | 18 | it('renders proper default className', () => { 19 | render(); 20 | const emptyPage = screen.getByTestId('EmptyPage'); 21 | 22 | expect(emptyPage.className).toBe('EmptyPage'); 23 | }); 24 | 25 | it('renders with passed in className', () => { 26 | render(); 27 | const emptyPage = screen.getByTestId('EmptyPage'); 28 | 29 | expect(emptyPage).toHaveClass('test'); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /src/components/EmptyPage/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import {SFC} from 'types/generic'; 4 | 5 | import './EmptyPage.scss'; 6 | 7 | const EmptyPage: SFC = ({className}) => { 8 | return ( 9 |
10 |

No items to display

11 |
12 | ); 13 | }; 14 | 15 | export default EmptyPage; 16 | -------------------------------------------------------------------------------- /src/components/ErrorMessage/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import * as S from './styles'; 4 | 5 | type Props = { 6 | message?: string; 7 | }; 8 | 9 | const ErrorMessage = ({message}: Props) => { 10 | return {message || 'Something went wrong!'}; 11 | }; 12 | 13 | export default ErrorMessage; 14 | -------------------------------------------------------------------------------- /src/components/ErrorMessage/styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import colors from 'styles/colors'; 4 | 5 | export const ErrorMessage = styled.p` 6 | color: ${colors.palette.red['300']}; 7 | text-align: center; 8 | `; 9 | -------------------------------------------------------------------------------- /src/components/FaqDropdownCard/index.tsx: -------------------------------------------------------------------------------- 1 | import React, {ReactNode} from 'react'; 2 | import {IconType} from '@thenewboston/ui'; 3 | 4 | import {useBooleanState} from 'hooks'; 5 | import {SFC} from 'types/generic'; 6 | import * as S from './Styles'; 7 | 8 | type Props = { 9 | answer: ReactNode; 10 | question: ReactNode; 11 | }; 12 | 13 | const FaqDropdownCard: SFC = ({answer, className, question}) => { 14 | const [expanded, toggleExpanded] = useBooleanState(false); 15 | 16 | return ( 17 | 18 | 19 | 20 | {question} 21 | 22 | 27 | 28 | {expanded && {answer}} 29 | 30 | ); 31 | }; 32 | 33 | export default FaqDropdownCard; 34 | -------------------------------------------------------------------------------- /src/components/FlatNavLinks/Styles.ts: -------------------------------------------------------------------------------- 1 | import styled, {css} from 'styled-components'; 2 | 3 | import colors from 'styles/colors'; 4 | import {h3} from 'styles/fonts'; 5 | 6 | export const Container = styled.div` 7 | margin-top: 30px; 8 | padding: 1px; 9 | 10 | @media (max-width: 992px) { 11 | margin-top: 16px; 12 | } 13 | `; 14 | 15 | export const OptionButton = styled.button<{isActive?: boolean}>` 16 | ${h3.regular} 17 | align-items: center; 18 | background: transparent; 19 | border: none; 20 | color: ${colors.palette.gray['600']}; 21 | cursor: pointer; 22 | display: flex; 23 | height: 40px; 24 | line-height: 1.5; 25 | margin-bottom: 4px; 26 | transition: background-color 0.1s; 27 | 28 | &:hover { 29 | color: ${colors.palette.blue['800']}; 30 | } 31 | 32 | ${(props) => 33 | props.isActive && 34 | css` 35 | ${h3.bold} 36 | border-bottom: 2px solid ${colors.quaternary}; 37 | color: ${colors.palette.blue['800']}; 38 | `} 39 | `; 40 | -------------------------------------------------------------------------------- /src/components/FlatNavLinks/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import {bemify} from '@thenewboston/utils'; 4 | 5 | import {SFC} from 'types/generic'; 6 | import {NavOption} from 'types/option'; 7 | 8 | import * as S from './Styles'; 9 | 10 | export interface FlatNavLinksProps { 11 | handleOptionClick(option: string): () => void; 12 | options: NavOption[]; 13 | selectedOption: string; 14 | } 15 | 16 | const FlatNavLinks: SFC = ({className, handleOptionClick, options, selectedOption}) => { 17 | const renderOptions = () => { 18 | return options.map((option: NavOption) => ( 19 | 27 | {option.title} 28 | 29 | )); 30 | }; 31 | 32 | return ( 33 | 34 | {renderOptions()} 35 | 36 | ); 37 | }; 38 | 39 | export default FlatNavLinks; 40 | -------------------------------------------------------------------------------- /src/components/Footer/Footer.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {render, screen} from '@testing-library/react'; 3 | import {BrowserRouter as Router} from 'react-router-dom'; 4 | import '@testing-library/jest-dom/extend-expect'; 5 | 6 | import Footer from '.'; 7 | 8 | interface Props { 9 | className?: string; 10 | } 11 | 12 | const WrappedComponent = ({className}: Props) => { 13 | return ( 14 | 15 |