├── .cursor
└── rules
│ └── formatting-component-files.mdc
├── .deepsource.toml
├── .editorconfig
├── .ember-cli
├── .env.example
├── .eslintignore
├── .eslintrc.js
├── .github
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ ├── publish_bundle.yml
│ └── test.yml
├── .gitignore
├── .percy.yml
├── .prettierignore
├── .prettierrc.js
├── .prompts
└── js-to-ts-component.md
├── .rules
└── no-bugs.md
├── .stylelintignore
├── .stylelintrc.js
├── .template-lintrc.js
├── .vscode
└── settings.json
├── .watchmanconfig
├── LICENSE.md
├── Makefile
├── README.md
├── app
├── adapters
│ ├── application.ts
│ ├── community-course-stage-solution.ts
│ └── leaderboard-entry.ts
├── app.js
├── components
│ ├── .gitkeep
│ ├── affiliate-link-page
│ │ ├── accept-referral-button.hbs
│ │ ├── accept-referral-button.ts
│ │ ├── accept-referral-container.hbs
│ │ ├── accept-referral-container.ts
│ │ ├── hero-section.hbs
│ │ ├── hero-section.ts
│ │ ├── logo-cloud.hbs
│ │ ├── logo-cloud.ts
│ │ ├── testimonial-list-item.hbs
│ │ └── testimonial-list-item.ts
│ ├── affiliate-page
│ │ ├── affiliate-feature-cards.hbs
│ │ ├── affiliate-feature-cards.ts
│ │ ├── affiliate-link-stat-container.hbs
│ │ ├── affiliate-link-stat-container.ts
│ │ ├── affiliate-link-stats-container.hbs
│ │ ├── affiliate-link-stats-container.ts
│ │ ├── affiliate-links-container.hbs
│ │ ├── affiliate-links-container.ts
│ │ ├── affiliate-referred-user-item.hbs
│ │ ├── affiliate-referred-user-item.ts
│ │ ├── affiliate-referred-users-container.hbs
│ │ ├── affiliate-referred-users-container.ts
│ │ ├── create-payout-modal
│ │ │ ├── form-section.hbs
│ │ │ ├── form-section.ts
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── payout-method-card.hbs
│ │ │ ├── payout-method-card.ts
│ │ │ ├── paypal-payout-form.hbs
│ │ │ └── paypal-payout-form.ts
│ │ ├── earnings-container
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── line-item.hbs
│ │ │ └── line-item.ts
│ │ ├── join-affiliate-program-container.hbs
│ │ └── join-affiliate-program-container.ts
│ ├── alert-with-icon.hbs
│ ├── alert-with-icon.ts
│ ├── alert.hbs
│ ├── alert.ts
│ ├── all-languages-dropdown-link.hbs
│ ├── all-languages-dropdown-link.ts
│ ├── ansi-stream.hbs
│ ├── ansi-stream.ts
│ ├── avatar-image.hbs
│ ├── avatar-image.ts
│ ├── badges-page
│ │ ├── badge-card.hbs
│ │ ├── badge-card.ts
│ │ ├── badge-earned-modal.hbs
│ │ ├── badge-earned-modal.ts
│ │ ├── badge-preview.hbs
│ │ ├── badge-preview.ts
│ │ ├── earned-badge-preview.hbs
│ │ ├── earned-badge-preview.ts
│ │ ├── locked-badge-preview.hbs
│ │ └── locked-badge-preview.ts
│ ├── base-button.hbs
│ ├── base-button.ts
│ ├── base-link-button.hbs
│ ├── base-link-button.ts
│ ├── beta-course-extension-label.hbs
│ ├── beta-course-extension-label.ts
│ ├── beta-course-label.hbs
│ ├── beta-course-label.ts
│ ├── billing-status-badge
│ │ ├── discount-timer-badge.hbs
│ │ ├── discount-timer-badge.ts
│ │ ├── free-weeks-left-button.hbs
│ │ ├── free-weeks-left-button.ts
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── indirect-member-badge.hbs
│ │ ├── indirect-member-badge.ts
│ │ ├── member-badge.hbs
│ │ ├── member-badge.ts
│ │ ├── vip-badge.hbs
│ │ └── vip-badge.ts
│ ├── blinking-dot.hbs
│ ├── blinking-dot.ts
│ ├── blocks
│ │ ├── concept-animation-block.hbs
│ │ ├── concept-animation-block.ts
│ │ ├── concept-question-block.hbs
│ │ ├── concept-question-block.ts
│ │ ├── markdown-block.hbs
│ │ └── markdown-block.ts
│ ├── blurred-overlay.hbs
│ ├── blurred-overlay.ts
│ ├── button-with-spinner.hbs
│ ├── button-with-spinner.ts
│ ├── code-mirror.hbs
│ ├── code-mirror.ts
│ ├── code-walkthrough-page
│ │ ├── content.hbs
│ │ ├── content.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── metadata-item.hbs
│ │ └── metadata-item.ts
│ ├── code-walkthrough-snippet.hbs
│ ├── code-walkthrough-snippet.ts
│ ├── code-walkthrough.hbs
│ ├── code-walkthrough.js
│ ├── comment-card
│ │ ├── downvote-button.hbs
│ │ ├── downvote-button.js
│ │ ├── index.hbs
│ │ ├── index.js
│ │ ├── more-dropdown.hbs
│ │ ├── more-dropdown.js
│ │ ├── reply-button.hbs
│ │ ├── reply-button.js
│ │ ├── upvote-button.hbs
│ │ └── upvote-button.js
│ ├── comment-form
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── tab-header.hbs
│ │ └── tab-header.js
│ ├── concept-admin
│ │ ├── blocks-page
│ │ │ ├── block-preview.hbs
│ │ │ ├── block-preview.ts
│ │ │ ├── click-to-continue-block-editor.hbs
│ │ │ ├── click-to-continue-block-editor.ts
│ │ │ ├── concept-question-block-editor.hbs
│ │ │ ├── concept-question-block-editor.ts
│ │ │ ├── editable-block.hbs
│ │ │ ├── editable-block.ts
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── insert-block-marker-dropdown-item.hbs
│ │ │ ├── insert-block-marker-dropdown-item.ts
│ │ │ ├── insert-block-marker.hbs
│ │ │ ├── insert-block-marker.ts
│ │ │ ├── markdown-block-editor.hbs
│ │ │ └── markdown-block-editor.ts
│ │ ├── delete-concept-modal.hbs
│ │ ├── delete-concept-modal.ts
│ │ ├── form-section.hbs
│ │ ├── form-section.ts
│ │ ├── form-subsection.hbs
│ │ ├── form-subsection.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ └── questions-page
│ │ │ ├── question-card.hbs
│ │ │ ├── question-card.ts
│ │ │ ├── question-form.hbs
│ │ │ └── question-form.ts
│ ├── concept-card
│ │ ├── progress-bar.hbs
│ │ └── progress-bar.ts
│ ├── concept-group-page
│ │ ├── content.hbs
│ │ ├── content.ts
│ │ ├── header.hbs
│ │ └── header.ts
│ ├── concept-page
│ │ ├── concept-completed-modal.hbs
│ │ ├── concept-completed-modal.ts
│ │ ├── content.hbs
│ │ ├── content.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── question-card-option.hbs
│ │ ├── question-card-option.ts
│ │ ├── question-card.hbs
│ │ ├── question-card.ts
│ │ ├── share-concept-container.hbs
│ │ └── share-concept-container.ts
│ ├── concept-progress.hbs
│ ├── concept-progress.ts
│ ├── concept
│ │ ├── continue-or-step-back.hbs
│ │ ├── continue-or-step-back.ts
│ │ ├── index.hbs
│ │ └── index.ts
│ ├── concepts-page
│ │ ├── concept-card.hbs
│ │ └── concept-card.ts
│ ├── contest-page
│ │ ├── contest-status-pill.hbs
│ │ ├── contest-status-pill.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── how-it-works-card.hbs
│ │ ├── how-it-works-card.ts
│ │ ├── leaderboard-card.hbs
│ │ ├── leaderboard-card.ts
│ │ ├── leaderboard-entry.hbs
│ │ ├── leaderboard-entry.ts
│ │ ├── navigation.hbs
│ │ ├── navigation.ts
│ │ ├── prize-details-card.hbs
│ │ └── prize-details-card.ts
│ ├── contributor-avatar.hbs
│ ├── contributor-avatar.js
│ ├── copyable-code.hbs
│ ├── copyable-code.ts
│ ├── copyable-terminal-command-with-variants.hbs
│ ├── copyable-terminal-command-with-variants.ts
│ ├── copyable-terminal-command.hbs
│ ├── copyable-terminal-command.ts
│ ├── course-admin
│ │ ├── buildpacks-page
│ │ │ ├── buildpack-item.hbs
│ │ │ └── buildpack-item.ts
│ │ ├── code-example-evaluator-page
│ │ │ ├── accuracy-section.hbs
│ │ │ ├── accuracy-section.ts
│ │ │ ├── evaluations-section.hbs
│ │ │ ├── evaluations-section.ts
│ │ │ ├── prompt-template-section.hbs
│ │ │ └── prompt-template-section.ts
│ │ ├── code-example-insights-index-page
│ │ │ └── stage-list-item
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── statistic.hbs
│ │ │ │ └── statistic.ts
│ │ ├── code-example-insights
│ │ │ ├── metadata-container.hbs
│ │ │ └── metadata-container.ts
│ │ ├── code-example-page
│ │ │ ├── comparison-card.hbs
│ │ │ ├── comparison-card.ts
│ │ │ └── evaluation-card
│ │ │ │ ├── evaluation-tab.hbs
│ │ │ │ ├── evaluation-tab.ts
│ │ │ │ ├── header.hbs
│ │ │ │ ├── header.ts
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── prompt-tab.hbs
│ │ │ │ ├── prompt-tab.ts
│ │ │ │ ├── trusted-evaluation-tab.hbs
│ │ │ │ └── trusted-evaluation-tab.ts
│ │ ├── feedback-page
│ │ │ ├── feedback-submission-list-item.hbs
│ │ │ └── feedback-submission-list-item.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── stage-insights-index-page
│ │ │ └── stage-list-item
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── statistic.hbs
│ │ │ │ └── statistic.ts
│ │ ├── stage-insights-page
│ │ │ ├── header.hbs
│ │ │ ├── header.ts
│ │ │ ├── participation-list-item.hbs
│ │ │ ├── participation-list-item.ts
│ │ │ ├── participation-list-section.hbs
│ │ │ ├── participation-list-section.ts
│ │ │ ├── participation-list.hbs
│ │ │ ├── participation-list.ts
│ │ │ ├── statistic-card.hbs
│ │ │ └── statistic-card.ts
│ │ ├── submissions-page
│ │ │ ├── index.hbs
│ │ │ ├── index.js
│ │ │ ├── submission-details-container.hbs
│ │ │ ├── submission-details-container.ts
│ │ │ ├── submission-details
│ │ │ │ ├── community-solution-container.hbs
│ │ │ │ ├── community-solution-container.ts
│ │ │ │ ├── diff-container.hbs
│ │ │ │ ├── diff-container.ts
│ │ │ │ ├── header-container-row.hbs
│ │ │ │ ├── header-container-row.ts
│ │ │ │ ├── header-container.hbs
│ │ │ │ └── header-container.ts
│ │ │ ├── timeline-container.hbs
│ │ │ ├── timeline-container.ts
│ │ │ ├── timeline-entry-container.hbs
│ │ │ └── timeline-entry-container.ts
│ │ ├── tester-versions-page
│ │ │ ├── version-list-item.hbs
│ │ │ └── version-list-item.ts
│ │ └── updates-page
│ │ │ ├── update-list-item.hbs
│ │ │ └── update-list-item.ts
│ ├── course-card
│ │ ├── difficulty-label.hbs
│ │ ├── difficulty-label.js
│ │ ├── index.hbs
│ │ ├── index.js
│ │ ├── progress-bar.hbs
│ │ └── progress-bar.ts
│ ├── course-leaderboard-entry.hbs
│ ├── course-leaderboard-entry.js
│ ├── course-leaderboard-team-dropdown.hbs
│ ├── course-leaderboard-team-dropdown.ts
│ ├── course-leaderboard
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── invite-button-entry.hbs
│ │ └── invite-button-entry.ts
│ ├── course-logo.hbs
│ ├── course-logo.ts
│ ├── course-overview-page
│ │ ├── admin-section.hbs
│ │ ├── admin-section.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── introduction-and-stages.hbs
│ │ ├── introduction-and-stages.ts
│ │ ├── notices.hbs
│ │ ├── notices.ts
│ │ ├── sidebar-alpha-notice.hbs
│ │ ├── sidebar-alpha-notice.ts
│ │ ├── stage-list-item-avatar.hbs
│ │ ├── stage-list-item-avatar.ts
│ │ ├── stage-list.hbs
│ │ ├── stage-list.ts
│ │ ├── start-course-button.hbs
│ │ ├── start-course-button.ts
│ │ ├── start-stage-button.hbs
│ │ ├── start-stage-button.ts
│ │ ├── testimonial-list-item.hbs
│ │ ├── testimonial-list-item.ts
│ │ ├── testimonial-list.hbs
│ │ └── testimonial-list.ts
│ ├── course-page
│ │ ├── base-stages-completed-card.hbs
│ │ ├── base-stages-completed-card.ts
│ │ ├── collapse-leaderboard-button.hbs
│ │ ├── collapse-leaderboard-button.ts
│ │ ├── collapse-sidebar-button.hbs
│ │ ├── collapse-sidebar-button.ts
│ │ ├── comment-list.hbs
│ │ ├── comment-list.ts
│ │ ├── comment-timeline-item.hbs
│ │ ├── comment-timeline-item.ts
│ │ ├── completed-step-notice.hbs
│ │ ├── completed-step-notice.ts
│ │ ├── configure-extensions-modal
│ │ │ ├── extension-card.hbs
│ │ │ ├── extension-card.ts
│ │ │ ├── index.hbs
│ │ │ └── index.ts
│ │ ├── configure-github-integration-modal
│ │ │ ├── create-github-repository-step.hbs
│ │ │ ├── create-github-repository-step.js
│ │ │ ├── fix-github-app-installation-prompt.hbs
│ │ │ ├── fix-github-app-installation-prompt.js
│ │ │ ├── index.hbs
│ │ │ ├── index.js
│ │ │ ├── install-github-app-step.hbs
│ │ │ ├── install-github-app-step.ts
│ │ │ ├── step.hbs
│ │ │ └── step.js
│ │ ├── course-completed-card.hbs
│ │ ├── course-completed-card.ts
│ │ ├── course-stage-item
│ │ │ ├── index.hbs
│ │ │ ├── index.js
│ │ │ ├── publish-to-github-prompt.hbs
│ │ │ └── publish-to-github-prompt.js
│ │ ├── course-stage-step
│ │ │ ├── community-solution-card
│ │ │ │ ├── changed-file-card.hbs
│ │ │ │ ├── changed-file-card.ts
│ │ │ │ ├── content.hbs
│ │ │ │ ├── content.ts
│ │ │ │ ├── feedback-section.hbs
│ │ │ │ ├── feedback-section.ts
│ │ │ │ ├── header-label.hbs
│ │ │ │ ├── header-label.ts
│ │ │ │ ├── header.hbs
│ │ │ │ ├── header.ts
│ │ │ │ ├── highlighted-file-card.hbs
│ │ │ │ ├── highlighted-file-card.ts
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── more-dropdown.hbs
│ │ │ │ └── more-dropdown.ts
│ │ │ ├── community-solutions-language-dropdown.hbs
│ │ │ ├── community-solutions-language-dropdown.js
│ │ │ ├── community-solutions-list.hbs
│ │ │ ├── community-solutions-list.ts
│ │ │ ├── earned-badge-notice.hbs
│ │ │ ├── earned-badge-notice.ts
│ │ │ ├── feedback-prompt-option.hbs
│ │ │ ├── feedback-prompt-option.ts
│ │ │ ├── feedback-prompt.hbs
│ │ │ ├── feedback-prompt.ts
│ │ │ ├── first-stage-tutorial-card
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── navigate-to-file-step.hbs
│ │ │ │ ├── navigate-to-file-step.ts
│ │ │ │ ├── submit-code-step.hbs
│ │ │ │ ├── submit-code-step.ts
│ │ │ │ ├── uncomment-code-step.hbs
│ │ │ │ └── uncomment-code-step.ts
│ │ │ ├── inaccessible-community-solutions-list.hbs
│ │ │ ├── inaccessible-community-solutions-list.ts
│ │ │ ├── language-guide-card.hbs
│ │ │ ├── language-guide-card.ts
│ │ │ ├── mark-stage-as-complete-button.hbs
│ │ │ ├── mark-stage-as-complete-button.ts
│ │ │ ├── prerequisites-card.hbs
│ │ │ ├── prerequisites-card.ts
│ │ │ ├── second-stage-tutorial-card
│ │ │ │ ├── implement-solution-step.hbs
│ │ │ │ ├── implement-solution-step.ts
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── read-instructions-step.hbs
│ │ │ │ ├── read-instructions-step.ts
│ │ │ │ ├── run-tests-step.hbs
│ │ │ │ └── run-tests-step.ts
│ │ │ ├── simple-language-guide-card.hbs
│ │ │ ├── simple-language-guide-card.ts
│ │ │ ├── stage-incomplete-modal.hbs
│ │ │ ├── stage-incomplete-modal.ts
│ │ │ ├── test-runner-card
│ │ │ │ ├── header.hbs
│ │ │ │ ├── header.ts
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── run-tests-instructions.hbs
│ │ │ │ └── run-tests-instructions.ts
│ │ │ ├── tests-passed-modal
│ │ │ │ ├── action-button.hbs
│ │ │ │ ├── action-button.ts
│ │ │ │ ├── choose-action-step.hbs
│ │ │ │ ├── choose-action-step.ts
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── refactor-code-step.hbs
│ │ │ │ ├── refactor-code-step.ts
│ │ │ │ ├── submit-code-step.hbs
│ │ │ │ └── submit-code-step.ts
│ │ │ ├── tests-passed-notice.hbs
│ │ │ ├── tests-passed-notice.ts
│ │ │ ├── tests-passed-overlay.hbs
│ │ │ ├── tests-passed-overlay.ts
│ │ │ └── your-task-card
│ │ │ │ ├── action-button-list.hbs
│ │ │ │ ├── action-button-list.ts
│ │ │ │ ├── action-button.hbs
│ │ │ │ ├── action-button.ts
│ │ │ │ ├── index.hbs
│ │ │ │ └── index.ts
│ │ ├── current-step-complete-modal.hbs
│ │ ├── current-step-complete-modal.ts
│ │ ├── current-step-complete-overlay.hbs
│ │ ├── current-step-complete-overlay.ts
│ │ ├── delete-repository-modal.hbs
│ │ ├── delete-repository-modal.ts
│ │ ├── expand-leaderboard-button.hbs
│ │ ├── expand-leaderboard-button.ts
│ │ ├── expand-sidebar-button.hbs
│ │ ├── expand-sidebar-button.ts
│ │ ├── extension-completed-card.hbs
│ │ ├── extension-completed-card.ts
│ │ ├── header
│ │ │ ├── main-section.hbs
│ │ │ ├── main-section.ts
│ │ │ ├── navigation-controls.hbs
│ │ │ ├── navigation-controls.ts
│ │ │ ├── sticky-section.hbs
│ │ │ ├── sticky-section.ts
│ │ │ ├── tab-link.hbs
│ │ │ ├── tab-link.ts
│ │ │ ├── tab-list.hbs
│ │ │ └── tab-list.ts
│ │ ├── instructions-card.hbs
│ │ ├── instructions-card.ts
│ │ ├── introduction-step
│ │ │ ├── create-repository-card
│ │ │ │ ├── index.hbs
│ │ │ │ ├── index.ts
│ │ │ │ ├── language-button.hbs
│ │ │ │ ├── language-button.ts
│ │ │ │ ├── request-language-button.hbs
│ │ │ │ ├── request-language-button.ts
│ │ │ │ ├── request-language-dropdown.hbs
│ │ │ │ ├── request-language-dropdown.ts
│ │ │ │ ├── requested-languages-prompt.hbs
│ │ │ │ ├── requested-languages-prompt.ts
│ │ │ │ ├── select-expected-activity-frequency-section.hbs
│ │ │ │ ├── select-expected-activity-frequency-section.ts
│ │ │ │ ├── select-language-proficiency-level-section.hbs
│ │ │ │ ├── select-language-proficiency-level-section.ts
│ │ │ │ ├── select-language-section.hbs
│ │ │ │ ├── select-language-section.ts
│ │ │ │ ├── select-reminders-preference-section.hbs
│ │ │ │ ├── select-reminders-preference-section.ts
│ │ │ │ ├── show-other-languages-button.hbs
│ │ │ │ └── show-other-languages-button.ts
│ │ │ ├── welcome-card.hbs
│ │ │ └── welcome-card.ts
│ │ ├── multi-section-card.hbs
│ │ ├── multi-section-card.ts
│ │ ├── previous-steps-incomplete-modal.hbs
│ │ ├── previous-steps-incomplete-modal.ts
│ │ ├── previous-steps-incomplete-overlay.hbs
│ │ ├── previous-steps-incomplete-overlay.ts
│ │ ├── progress-banner-modal.hbs
│ │ ├── progress-banner-modal.js
│ │ ├── repository-dropdown-action.hbs
│ │ ├── repository-dropdown-action.ts
│ │ ├── repository-dropdown
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── non-active-repository-link.hbs
│ │ │ └── non-active-repository-link.ts
│ │ ├── setup-step
│ │ │ └── repository-setup-card
│ │ │ │ ├── clone-repository-step.hbs
│ │ │ │ ├── clone-repository-step.ts
│ │ │ │ ├── index.hbs
│ │ │ │ └── index.ts
│ │ ├── share-progress-modal
│ │ │ ├── icon.hbs
│ │ │ ├── icon.ts
│ │ │ ├── index.hbs
│ │ │ └── index.ts
│ │ ├── sidebar
│ │ │ ├── button.hbs
│ │ │ ├── button.ts
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── mobile-backdrop.hbs
│ │ │ ├── mobile-backdrop.ts
│ │ │ ├── mobile-close-button.hbs
│ │ │ ├── mobile-close-button.ts
│ │ │ ├── monthly-challenge-banner.hbs
│ │ │ └── monthly-challenge-banner.ts
│ │ ├── solution-language-dropdown-link.hbs
│ │ ├── solution-language-dropdown-link.js
│ │ ├── step-list-item.hbs
│ │ ├── step-list-item.ts
│ │ ├── step-list.hbs
│ │ ├── step-list.ts
│ │ ├── step-progress-indicator.hbs
│ │ ├── step-progress-indicator.ts
│ │ ├── step-status-pill.hbs
│ │ ├── step-status-pill.ts
│ │ ├── step-switcher-container.hbs
│ │ ├── step-switcher-container.ts
│ │ ├── test-results-bar
│ │ │ ├── autofix-section
│ │ │ │ ├── autofix-result.hbs
│ │ │ │ ├── autofix-result.ts
│ │ │ │ ├── create-autofix-prompt.hbs
│ │ │ │ ├── create-autofix-prompt.ts
│ │ │ │ ├── index.hbs
│ │ │ │ └── index.ts
│ │ │ ├── bottom-section
│ │ │ │ ├── expand-or-collapse-indicator.hbs
│ │ │ │ ├── expand-or-collapse-indicator.ts
│ │ │ │ ├── index.hbs
│ │ │ │ └── index.ts
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── logs-section.hbs
│ │ │ ├── logs-section.ts
│ │ │ ├── top-section.hbs
│ │ │ └── top-section.ts
│ │ ├── upgrade-prompt.hbs
│ │ └── upgrade-prompt.ts
│ ├── course-stage-difficulty-label.hbs
│ ├── course-stage-difficulty-label.ts
│ ├── course-stage-dropdown.hbs
│ ├── course-stage-dropdown.ts
│ ├── course-stage-screencast-player.hbs
│ ├── course-stage-screencast-player.ts
│ ├── course-stage-screencast-preview.hbs
│ ├── course-stage-screencast-preview.ts
│ ├── create-team-page
│ │ ├── features-list-item.hbs
│ │ ├── features-list-item.js
│ │ ├── features-list.hbs
│ │ ├── features-list.js
│ │ ├── form.hbs
│ │ └── form.js
│ ├── danger-button-with-timed-confirmation.hbs
│ ├── danger-button-with-timed-confirmation.ts
│ ├── danger-button.hbs
│ ├── danger-button.ts
│ ├── dark-mode-toggle-option.hbs
│ ├── dark-mode-toggle-option.ts
│ ├── dark-mode-toggle-with-upgrade-prompt.hbs
│ ├── dark-mode-toggle-with-upgrade-prompt.ts
│ ├── dark-mode-toggle.hbs
│ ├── dark-mode-toggle.ts
│ ├── discuss-on-hn-button.hbs
│ ├── discuss-on-hn-button.js
│ ├── dropdown-link.hbs
│ ├── dropdown-link.ts
│ ├── expand-or-collapse-button.hbs
│ ├── expandable-step-list
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── non-expandable-step.hbs
│ │ ├── non-expandable-step.ts
│ │ ├── step.hbs
│ │ └── step.ts
│ ├── external-contributor-card.hbs
│ ├── external-contributor-card.js
│ ├── fake-data-toolbar.hbs
│ ├── fake-data-toolbar.ts
│ ├── faq-item.hbs
│ ├── faq-item.ts
│ ├── faq-list.hbs
│ ├── faq-list.ts
│ ├── feature-card.hbs
│ ├── feature-card.ts
│ ├── feedback-button
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── sentiment-option.hbs
│ │ └── sentiment-option.js
│ ├── file-contents-card.hbs
│ ├── file-contents-card.ts
│ ├── file-diff-card.hbs
│ ├── file-diff-card.ts
│ ├── footer.hbs
│ ├── footer.ts
│ ├── free-course-label.hbs
│ ├── free-course-label.ts
│ ├── head-layout.hbs
│ ├── head-layout.js
│ ├── header
│ │ ├── account-dropdown.hbs
│ │ ├── account-dropdown.ts
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── link.hbs
│ │ ├── link.ts
│ │ ├── sign-in-with-github-button.hbs
│ │ └── sign-in-with-github-button.js
│ ├── helpscout-beacon.hbs
│ ├── helpscout-beacon.js
│ ├── instructions-card
│ │ ├── expand-or-collapse-button.hbs
│ │ └── expand-or-collapse-button.ts
│ ├── language-dropdown-link.hbs
│ ├── language-dropdown-link.ts
│ ├── language-dropdown.hbs
│ ├── language-dropdown.ts
│ ├── language-logo.hbs
│ ├── language-logo.ts
│ ├── leaderboard-entry.hbs
│ ├── leaderboard-entry.ts
│ ├── loading-indicator-remover.hbs
│ ├── loading-indicator-remover.js
│ ├── loading-indicator.hbs
│ ├── loading-indicator.ts
│ ├── loading-skeleton.hbs
│ ├── loading-skeleton.ts
│ ├── markdown-stream.hbs
│ ├── markdown-stream.ts
│ ├── modal-backdrop.hbs
│ ├── modal-backdrop.ts
│ ├── modal-body.hbs
│ ├── modal-body.ts
│ ├── outdated-client-badge.hbs
│ ├── outdated-client-badge.ts
│ ├── page-section.hbs
│ ├── page-section.ts
│ ├── pay-page
│ │ ├── backer-card-list.hbs
│ │ ├── backer-card-list.ts
│ │ ├── configure-checkout-session-modal.hbs
│ │ ├── configure-checkout-session-modal.ts
│ │ ├── monthly-challenge-banner.hbs
│ │ ├── monthly-challenge-banner.ts
│ │ ├── pricing-card.hbs
│ │ ├── pricing-card.ts
│ │ ├── referral-discount-notice.hbs
│ │ ├── referral-discount-notice.ts
│ │ ├── regional-discount-notice.hbs
│ │ ├── regional-discount-notice.ts
│ │ ├── signup-discount-notice.hbs
│ │ ├── signup-discount-notice.ts
│ │ ├── stage2-completion-discount-notice.hbs
│ │ └── stage2-completion-discount-notice.ts
│ ├── pill.hbs
│ ├── pill.ts
│ ├── primary-button-with-spinner.hbs
│ ├── primary-button-with-spinner.ts
│ ├── primary-button.hbs
│ ├── primary-button.ts
│ ├── primary-link-button.hbs
│ ├── primary-link-button.ts
│ ├── private-leaderboard-feature-suggestion.hbs
│ ├── private-leaderboard-feature-suggestion.js
│ ├── product-walkthrough-feature-suggestion.hbs
│ ├── product-walkthrough-feature-suggestion.ts
│ ├── referral-link-page
│ │ ├── accept-referral-container.hbs
│ │ ├── accept-referral-container.ts
│ │ ├── testimonial-list-item.hbs
│ │ └── testimonial-list-item.ts
│ ├── referrals-page
│ │ ├── join-referral-program-container.hbs
│ │ ├── join-referral-program-container.ts
│ │ ├── referral-feature-cards.hbs
│ │ ├── referral-feature-cards.ts
│ │ ├── referral-link-stat-container.hbs
│ │ ├── referral-link-stat-container.ts
│ │ ├── referral-link-stats-container.hbs
│ │ ├── referral-link-stats-container.ts
│ │ ├── referral-links-container.hbs
│ │ ├── referral-links-container.ts
│ │ ├── referral-referred-user-item.hbs
│ │ ├── referral-referred-user-item.ts
│ │ ├── referral-referred-users-container.hbs
│ │ └── referral-referred-users-container.ts
│ ├── rive-animation.hbs
│ ├── rive-animation.ts
│ ├── scrolling-logo-list.hbs
│ ├── scrolling-logo-list.ts
│ ├── secondary-button.hbs
│ ├── secondary-button.ts
│ ├── settings
│ │ ├── billing-page
│ │ │ ├── membership-section.hbs
│ │ │ ├── membership-section.ts
│ │ │ ├── payment-history-section.hbs
│ │ │ ├── payment-history-section.ts
│ │ │ ├── renewal-section.hbs
│ │ │ ├── renewal-section.ts
│ │ │ ├── status-pill.hbs
│ │ │ ├── status-pill.ts
│ │ │ ├── support-section.hbs
│ │ │ └── support-section.ts
│ │ ├── delete-account-modal.hbs
│ │ ├── delete-account-modal.ts
│ │ ├── form-divider.hbs
│ │ ├── form-divider.ts
│ │ ├── form-section.hbs
│ │ ├── form-section.ts
│ │ └── profile-page
│ │ │ ├── about-section.hbs
│ │ │ ├── about-section.ts
│ │ │ ├── anonymous-mode-section.hbs
│ │ │ ├── anonymous-mode-section.ts
│ │ │ ├── avatar-section.hbs
│ │ │ ├── avatar-section.ts
│ │ │ ├── username-section.hbs
│ │ │ └── username-section.ts
│ ├── static-dot.hbs
│ ├── static-dot.ts
│ ├── submission-logs-preview.hbs
│ ├── submission-logs-preview.ts
│ ├── syntax-highlighted-code.hbs
│ ├── syntax-highlighted-code.ts
│ ├── syntax-highlighted-diff
│ │ ├── expandable-chunk.hbs
│ │ ├── expandable-chunk.js
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── toggle-comments-button.hbs
│ │ └── toggle-comments-button.js
│ ├── tab-header.hbs
│ ├── tab-header.ts
│ ├── tabs.hbs
│ ├── tabs.ts
│ ├── team-page
│ │ ├── contact-for-team-billing-container.hbs
│ │ ├── contact-for-team-billing-container.js
│ │ ├── members-container.hbs
│ │ ├── members-container.js
│ │ ├── members-list-item.hbs
│ │ ├── members-list-item.js
│ │ ├── section.hbs
│ │ ├── section.js
│ │ ├── setup-subscription-container.hbs
│ │ ├── setup-subscription-container.js
│ │ ├── slack-integration-settings-container.hbs
│ │ ├── slack-integration-settings-container.js
│ │ ├── subscription-settings-container.hbs
│ │ ├── subscription-settings-container.js
│ │ ├── team-selection-dropdown.hbs
│ │ ├── team-selection-dropdown.js
│ │ ├── uninstall-slack-integration-button.hbs
│ │ └── uninstall-slack-integration-button.js
│ ├── team-payment-page
│ │ ├── navigation-container-item.hbs
│ │ ├── navigation-container-item.js
│ │ ├── navigation-container.hbs
│ │ ├── navigation-container.js
│ │ ├── payment-details-step-container.hbs
│ │ ├── payment-details-step-container.js
│ │ ├── payment-preview.hbs
│ │ ├── payment-preview.js
│ │ ├── review-payment-step-container.hbs
│ │ ├── review-payment-step-container.ts
│ │ ├── step-container.hbs
│ │ ├── step-container.js
│ │ ├── team-details-form
│ │ │ ├── pricing-plan-option.hbs
│ │ │ ├── pricing-plan-option.js
│ │ │ ├── section.hbs
│ │ │ └── section.js
│ │ ├── team-details-step-container.hbs
│ │ └── team-details-step-container.js
│ ├── tertiary-button-with-spinner.hbs
│ ├── tertiary-button-with-spinner.ts
│ ├── tertiary-button.hbs
│ ├── tertiary-button.ts
│ ├── tertiary-link-button.hbs
│ ├── tertiary-link-button.ts
│ ├── testimonial-card.hbs
│ ├── testimonial-card.ts
│ ├── testimonial-list-item.hbs
│ ├── testimonial-list-item.ts
│ ├── testimonial-list.hbs
│ ├── testimonial-list.ts
│ ├── toggle.hbs
│ ├── toggle.ts
│ ├── track-leaderboard-entry.hbs
│ ├── track-leaderboard-entry.ts
│ ├── track-leaderboard.hbs
│ ├── track-leaderboard.ts
│ ├── track-page
│ │ ├── card.hbs
│ │ ├── card.ts
│ │ ├── course-card-list.hbs
│ │ ├── course-card-list.ts
│ │ ├── course-card.hbs
│ │ ├── course-card.ts
│ │ ├── course-card
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── progress-bar.hbs
│ │ │ ├── progress-bar.ts
│ │ │ ├── signup-to-preview-button.hbs
│ │ │ ├── signup-to-preview-button.ts
│ │ │ ├── stage-list-item.hbs
│ │ │ ├── stage-list-item.ts
│ │ │ ├── stage-list.hbs
│ │ │ └── stage-list.ts
│ │ ├── header
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── statistic.hbs
│ │ │ ├── statistic.ts
│ │ │ ├── top-participant-avatar.hbs
│ │ │ └── top-participant-avatar.ts
│ │ ├── primer-concept-group-section
│ │ │ ├── concept-list-item.hbs
│ │ │ ├── concept-list-item.ts
│ │ │ ├── concept-list.hbs
│ │ │ ├── concept-list.ts
│ │ │ ├── index.hbs
│ │ │ └── index.ts
│ │ ├── resume-track-button.hbs
│ │ ├── resume-track-button.ts
│ │ ├── start-track-button.hbs
│ │ ├── start-track-button.ts
│ │ ├── upcoming-courses-card.hbs
│ │ └── upcoming-courses-card.ts
│ ├── tracks-page
│ │ └── track-card
│ │ │ ├── index.hbs
│ │ │ ├── index.ts
│ │ │ ├── progress-bar.hbs
│ │ │ └── progress-bar.ts
│ ├── upgrade-modal.hbs
│ ├── upgrade-modal.ts
│ ├── user-label.hbs
│ ├── user-label.ts
│ ├── user-page
│ │ ├── activity-container.hbs
│ │ ├── activity-container.js
│ │ ├── course-progress-list-item
│ │ │ ├── index.hbs
│ │ │ ├── index.js
│ │ │ ├── progress-bar.hbs
│ │ │ └── progress-bar.js
│ │ ├── course-progress-list.hbs
│ │ ├── course-progress-list.ts
│ │ ├── sidebar-container.hbs
│ │ └── sidebar-container.ts
│ ├── vertical-tab-list
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── item.hbs
│ │ └── item.ts
│ ├── vote-page
│ │ ├── course-extension-idea-card.hbs
│ │ ├── course-extension-idea-card.ts
│ │ ├── course-idea-card.gts
│ │ ├── course-pill.hbs
│ │ ├── course-pill.ts
│ │ ├── header.hbs
│ │ ├── header.ts
│ │ ├── idea-card
│ │ │ ├── unvote-button.gts
│ │ │ └── vote-button.gts
│ │ ├── submit-course-extension-idea-card.hbs
│ │ ├── submit-course-extension-idea-card.ts
│ │ ├── submit-course-idea-card.gts
│ │ ├── tab-link.hbs
│ │ └── tab-link.ts
│ └── welcome-page
│ │ └── onboarding-survey-wizard
│ │ ├── index.hbs
│ │ ├── index.ts
│ │ ├── selectable-item.hbs
│ │ ├── selectable-item.ts
│ │ ├── step.hbs
│ │ ├── step.ts
│ │ ├── step1.hbs
│ │ ├── step1.ts
│ │ ├── step2.hbs
│ │ └── step2.ts
├── config
│ └── environment.d.ts
├── controllers
│ ├── .gitkeep
│ ├── application.js
│ ├── badges.ts
│ ├── catalog.ts
│ ├── concept-admin.ts
│ ├── concept-admin
│ │ ├── basic-details.ts
│ │ ├── blocks.ts
│ │ ├── question.ts
│ │ └── questions.ts
│ ├── concept.ts
│ ├── concepts.ts
│ ├── contest.ts
│ ├── course-admin
│ │ ├── buildpack.ts
│ │ ├── buildpacks.ts
│ │ ├── code-example-evaluator.ts
│ │ ├── code-example-insights-index.ts
│ │ ├── code-example-insights.ts
│ │ ├── code-example.ts
│ │ ├── feedback.ts
│ │ ├── insights.ts
│ │ ├── stage-insights-index.ts
│ │ ├── stage-insights.ts
│ │ ├── submissions.js
│ │ ├── tester-version.ts
│ │ ├── tester-versions.ts
│ │ ├── update.ts
│ │ └── updates.ts
│ ├── course-overview.ts
│ ├── course.ts
│ ├── course
│ │ ├── base-stages-completed.ts
│ │ ├── completed.js
│ │ ├── extension-completed.ts
│ │ ├── introduction.ts
│ │ ├── setup.ts
│ │ └── stage
│ │ │ ├── code-examples.ts
│ │ │ ├── instructions.ts
│ │ │ └── screencasts.ts
│ ├── debug.ts
│ ├── demo.ts
│ ├── demo
│ │ ├── code-mirror.ts
│ │ ├── dark-mode-toggle.ts
│ │ ├── file-contents-card.ts
│ │ └── file-diff-card.ts
│ ├── join-course.ts
│ ├── join-track.ts
│ ├── join.ts
│ ├── loading.ts
│ ├── membership.js
│ ├── partner.ts
│ ├── pay.ts
│ ├── refer.ts
│ ├── referral-link.ts
│ ├── settings.ts
│ ├── settings
│ │ ├── account.ts
│ │ ├── billing.ts
│ │ └── profile.ts
│ ├── teams
│ │ └── pay.js
│ ├── track.ts
│ ├── update-required.ts
│ ├── user.ts
│ ├── vote.js
│ ├── vote.ts
│ ├── vote
│ │ ├── course-extension-ideas.ts
│ │ └── course-ideas.ts
│ └── welcome.ts
├── helpers
│ ├── .gitkeep
│ ├── ansi-to-html.ts
│ ├── asset-url.js
│ ├── bool.ts
│ ├── current-user-is-concept-author.ts
│ ├── current-user-is-course-author.ts
│ ├── current-user-is-staff.ts
│ ├── date-format.ts
│ ├── date-from-now.ts
│ ├── diff-to-document.ts
│ ├── format-duration.ts
│ ├── format-number.ts
│ ├── is-fastboot.ts
│ ├── log-fn.js
│ ├── markdown-to-html.ts
│ ├── noop.js
│ ├── pluralize.ts
│ └── set-has.js
├── index.html
├── instance-initializers
│ ├── current-user.ts
│ ├── feature-flag-syncer.ts
│ ├── force-update.ts
│ ├── page-view-tracker.ts
│ ├── posthog.ts
│ ├── preload-highlighter.ts
│ ├── sentry.ts
│ ├── time.ts
│ ├── user-syncer.ts
│ └── web-vitals.ts
├── mixins
│ ├── is-comment.js
│ ├── viewable.js
│ └── votable.ts
├── models
│ ├── .gitkeep
│ ├── affiliate-earnings-payout.ts
│ ├── affiliate-link.ts
│ ├── affiliate-referral.ts
│ ├── analytics-event.ts
│ ├── autofix-request.ts
│ ├── badge-award.ts
│ ├── badge.ts
│ ├── buildpack.ts
│ ├── charge.ts
│ ├── code-walkthrough.ts
│ ├── community-course-stage-solution-comment.ts
│ ├── community-course-stage-solution.ts
│ ├── community-solution-evaluation.ts
│ ├── community-solution-evaluator.ts
│ ├── community-solutions-analysis.ts
│ ├── concept-engagement.ts
│ ├── concept-group.ts
│ ├── concept-question.ts
│ ├── concept.ts
│ ├── contest.ts
│ ├── course-definition-update.ts
│ ├── course-extension-activation.ts
│ ├── course-extension-idea-vote.ts
│ ├── course-extension-idea.ts
│ ├── course-extension.ts
│ ├── course-idea-vote.ts
│ ├── course-idea.ts
│ ├── course-insights-dashboard.ts
│ ├── course-language-configuration.ts
│ ├── course-language-request.ts
│ ├── course-leaderboard-entry.ts
│ ├── course-participation.ts
│ ├── course-stage-comment.ts
│ ├── course-stage-completion.ts
│ ├── course-stage-feedback-submission.ts
│ ├── course-stage-language-guide.ts
│ ├── course-stage-participation-analysis.ts
│ ├── course-stage-participation.ts
│ ├── course-stage-screencast.ts
│ ├── course-stage-solution.ts
│ ├── course-stage.ts
│ ├── course-tester-version.ts
│ ├── course.ts
│ ├── downvote.ts
│ ├── feature-suggestion.ts
│ ├── free-usage-grant.ts
│ ├── github-app-installation.ts
│ ├── github-repository-sync-configuration.ts
│ ├── individual-checkout-session.ts
│ ├── individual-payment-method-update-request.ts
│ ├── invoice.ts
│ ├── language.ts
│ ├── leaderboard-entry.ts
│ ├── leaderboard.ts
│ ├── onboarding-survey.ts
│ ├── perk.ts
│ ├── promotional-discount.ts
│ ├── referral-activation.ts
│ ├── referral-link.ts
│ ├── regional-discount.ts
│ ├── repository-stage-list-item.ts
│ ├── repository-stage-list.ts
│ ├── repository.ts
│ ├── session.ts
│ ├── site-feedback-submission.ts
│ ├── slack-integration.ts
│ ├── solution-comparison.ts
│ ├── submission-evaluation.ts
│ ├── submission.ts
│ ├── subscription.ts
│ ├── team-membership.ts
│ ├── team-payment-flow.ts
│ ├── team-payment-method-update-request.ts
│ ├── team-payment-method.ts
│ ├── team-pilot.ts
│ ├── team-subscription.ts
│ ├── team.ts
│ ├── track-leaderboard-entry.ts
│ ├── trusted-community-solution-evaluation.ts
│ ├── upvote.ts
│ ├── user-profile-event.ts
│ ├── user.ts
│ └── view.ts
├── modifiers
│ ├── focus-on-insert.ts
│ ├── highlight-code-blocks.ts
│ ├── in-viewport-did-change.ts
│ ├── markdown-input.ts
│ ├── model-did-update.ts
│ ├── route-will-change.ts
│ ├── scroll-into-view.ts
│ └── upscroll-on-insert.ts
├── router.ts
├── routes
│ ├── .gitkeep
│ ├── application.js
│ ├── badges.ts
│ ├── catalog.ts
│ ├── code-walkthrough.ts
│ ├── concept-admin.ts
│ ├── concept-admin
│ │ ├── index.ts
│ │ └── question.ts
│ ├── concept-group.ts
│ ├── concept.ts
│ ├── concepts.js
│ ├── contest.ts
│ ├── contests.ts
│ ├── course-admin.ts
│ ├── course-admin
│ │ ├── buildpack.ts
│ │ ├── buildpacks.ts
│ │ ├── code-example-evaluator.ts
│ │ ├── code-example-evaluators.ts
│ │ ├── code-example-insights-index.ts
│ │ ├── code-example-insights.ts
│ │ ├── code-example.ts
│ │ ├── feedback.js
│ │ ├── insights.js
│ │ ├── stage-insights-index.ts
│ │ ├── stage-insights.ts
│ │ ├── submissions.js
│ │ ├── tester-version.ts
│ │ ├── tester-versions.ts
│ │ ├── update.ts
│ │ └── updates.js
│ ├── course-overview.ts
│ ├── course.ts
│ ├── course
│ │ ├── base-stages-completed.ts
│ │ ├── extension-completed.ts
│ │ ├── setup.ts
│ │ ├── stage.js
│ │ └── stage
│ │ │ └── concepts.js
│ ├── courses.js
│ ├── debug.ts
│ ├── demo.ts
│ ├── demo
│ │ ├── code-mirror.ts
│ │ ├── dark-mode-toggle.ts
│ │ ├── file-contents-card.ts
│ │ ├── file-diff-card.ts
│ │ ├── index.ts
│ │ └── rive-animation.ts
│ ├── index.js
│ ├── join-course.ts
│ ├── join-track.ts
│ ├── join.ts
│ ├── logged-in.js
│ ├── login.js
│ ├── not-found.ts
│ ├── partner.ts
│ ├── pay.ts
│ ├── perk.ts
│ ├── perk
│ │ └── claim.ts
│ ├── refer.ts
│ ├── referral-link.ts
│ ├── settings.ts
│ ├── settings
│ │ └── index.ts
│ ├── team.js
│ ├── teams
│ │ ├── create.js
│ │ └── pay.ts
│ ├── track.ts
│ ├── tracks.js
│ ├── update-required.ts
│ ├── user.ts
│ ├── vote.ts
│ ├── vote
│ │ └── course-extension-ideas.js
│ └── welcome.ts
├── serializers
│ ├── application.js
│ └── repository.js
├── services
│ ├── action-cable-consumer.ts
│ ├── analytics-event-tracker.ts
│ ├── authenticator.ts
│ ├── beacon.ts
│ ├── confetti.ts
│ ├── container-width.ts
│ ├── course-page-state.ts
│ ├── course-stage-completion.ts
│ ├── current-user-cache-storage.ts
│ ├── dark-mode.ts
│ ├── date.ts
│ ├── feature-flag-syncer.ts
│ ├── feature-flags.ts
│ ├── focus.ts
│ ├── force-update.ts
│ ├── layout.ts
│ ├── local-storage.ts
│ ├── meta-data.ts
│ ├── monthly-challenge-banner.ts
│ ├── page-view-tracker.ts
│ ├── sentry.ts
│ ├── session-token-storage.ts
│ ├── store.ts
│ ├── time.ts
│ ├── user-syncer.ts
│ ├── utm-campaign-id-tracker.ts
│ ├── version-tracker.ts
│ ├── visibility.ts
│ └── web-vitals.ts
├── styles
│ ├── app.css
│ ├── modals.css
│ ├── pages
│ │ ├── affiliate-link-page.css
│ │ ├── code-walkthrough-page.css
│ │ └── course-stage-solution-page.css
│ ├── prism-dark-theme.css
│ ├── prism-light-theme.css
│ └── utilities.css
├── tailwind-input.css
├── templates
│ ├── account-deleted.hbs
│ ├── application.hbs
│ ├── badges.hbs
│ ├── catalog-loading.hbs
│ ├── catalog.hbs
│ ├── code-walkthrough.hbs
│ ├── concept-admin.hbs
│ ├── concept-admin
│ │ ├── basic-details.hbs
│ │ ├── blocks.hbs
│ │ ├── question.hbs
│ │ └── questions.hbs
│ ├── concept-group.hbs
│ ├── concept.hbs
│ ├── concepts.hbs
│ ├── contest.hbs
│ ├── course-admin.hbs
│ ├── course-admin
│ │ ├── buildpack.hbs
│ │ ├── buildpacks.hbs
│ │ ├── code-example-evaluator.hbs
│ │ ├── code-example-evaluators.hbs
│ │ ├── code-example-insights-index.hbs
│ │ ├── code-example-insights.hbs
│ │ ├── code-example.hbs
│ │ ├── feedback.hbs
│ │ ├── insights.hbs
│ │ ├── loading.hbs
│ │ ├── stage-insights-index.hbs
│ │ ├── stage-insights.hbs
│ │ ├── submissions.hbs
│ │ ├── tester-version.hbs
│ │ ├── tester-versions.hbs
│ │ ├── update.hbs
│ │ └── updates.hbs
│ ├── course-overview.hbs
│ ├── course.hbs
│ ├── course
│ │ ├── base-stages-completed.hbs
│ │ ├── completed.hbs
│ │ ├── extension-completed.hbs
│ │ ├── introduction.hbs
│ │ ├── setup.hbs
│ │ └── stage
│ │ │ ├── code-examples.hbs
│ │ │ ├── concepts.hbs
│ │ │ ├── instructions.hbs
│ │ │ └── screencasts.hbs
│ ├── debug.hbs
│ ├── demo.hbs
│ ├── demo
│ │ ├── code-mirror.hbs
│ │ ├── dark-mode-toggle.hbs
│ │ ├── file-contents-card.hbs
│ │ ├── file-diff-card.hbs
│ │ └── rive-animation.hbs
│ ├── head.hbs
│ ├── join-course.hbs
│ ├── join-track.hbs
│ ├── join.hbs
│ ├── loading.hbs
│ ├── not-found.hbs
│ ├── partner.hbs
│ ├── pay.hbs
│ ├── refer.hbs
│ ├── referral-link.hbs
│ ├── settings.hbs
│ ├── settings
│ │ ├── account.hbs
│ │ ├── billing.hbs
│ │ └── profile.hbs
│ ├── team.hbs
│ ├── teams
│ │ ├── create.hbs
│ │ └── pay.hbs
│ ├── track.hbs
│ ├── update-required.hbs
│ ├── user.hbs
│ ├── vote-loading.hbs
│ ├── vote.hbs
│ ├── vote
│ │ ├── course-extension-ideas.hbs
│ │ └── course-ideas.hbs
│ └── welcome.hbs
├── transforms
│ ├── boolean.js
│ ├── date.js
│ ├── number.js
│ └── string.js
└── utils
│ ├── base-route.ts
│ ├── blend-colors.ts
│ ├── blocks.ts
│ ├── code-mirror-collapse-ranges-gutter.ts
│ ├── code-mirror-collapse-ranges.ts
│ ├── code-mirror-collapse-unchanged-gutter.ts
│ ├── code-mirror-documents.ts
│ ├── code-mirror-gutter-rs.ts
│ ├── code-mirror-highlight-newlines.ts
│ ├── code-mirror-highlight-ranges.ts
│ ├── code-mirror-themes.ts
│ ├── course-leaderboard-entry.js
│ ├── course-page-step-list.ts
│ ├── course-page-step-list
│ ├── base-stages-completed-step.ts
│ ├── base-stages-step-group.ts
│ ├── course-completed-step-group.ts
│ ├── course-completed-step.ts
│ ├── course-stage-step.ts
│ ├── extension-completed-step.ts
│ ├── extension-step-group.ts
│ ├── introduction-step.ts
│ ├── progress-indicator.ts
│ ├── setup-step.ts
│ ├── step-group.ts
│ └── step.ts
│ ├── fetch-file-contents-if-needed.ts
│ ├── file-comparison.ts
│ ├── group-diff-lines-into-chunks.ts
│ ├── highlighter-cache.ts
│ ├── leaderboard-poller.ts
│ ├── lodash-utils.js
│ ├── logstream.ts
│ ├── params-from-route-info.ts
│ ├── parse-diff-as-document.ts
│ ├── poller.ts
│ ├── pre-challenge-assessment-section-list.ts
│ ├── repository-poller.ts
│ ├── route-info-metadata.ts
│ ├── scroll-to-top.js
│ ├── testimonials-data.ts
│ ├── time-formatting.ts
│ └── track-leaderboard-entry.js
├── config
├── deprecation-workflow.js
├── ember-cli-update.json
├── environment.js
├── fastboot.js
├── optional-features.json
└── targets.js
├── ember-cli-build.js
├── lib
├── custom-file-plugin.js
└── default-meta-tags
│ ├── index.js
│ └── package.json
├── mirage
├── concept-fixtures
│ ├── dummy.js
│ ├── network-protocols.js
│ └── tcp-overview.js
├── config.js
├── course-fixtures
│ ├── docker.js
│ ├── dummy.js
│ ├── git.js
│ ├── grep.js
│ ├── redis.js
│ ├── refresh_course_fixtures.sh
│ └── sqlite.js
├── data
│ ├── course-extension-ideas.js
│ └── course-ideas.js
├── factories
│ ├── affiliate-link.js
│ ├── affiliate-referral.js
│ ├── autofix-request.js
│ ├── community-course-stage-solution-comment.js
│ ├── community-course-stage-solution.js
│ ├── community-solution-evaluation.js
│ ├── concept-engagement.js
│ ├── contest.js
│ ├── course-stage-comment.js
│ ├── course-stage-completion.js
│ ├── onboarding-survey.js
│ ├── repository.js
│ ├── submission.js
│ ├── subscription.js
│ └── team.js
├── handlers
│ ├── affiliate-earnings-payouts.js
│ ├── affiliate-links.js
│ ├── affiliate-referrals.js
│ ├── analytics-events.js
│ ├── autofix-requests.js
│ ├── badges.js
│ ├── community-course-stage-solution-comments.js
│ ├── community-course-stage-solutions.js
│ ├── community-solution-evaluations.js
│ ├── community-solutions-analyses.js
│ ├── concept-engagements.js
│ ├── concept-groups.js
│ ├── concept-questions.js
│ ├── concepts.js
│ ├── contests.js
│ ├── course-leaderboard-entries.js
│ ├── course-stage-comments.js
│ ├── course-stage-completions.js
│ ├── course-stage-feedback-submissions.js
│ ├── courses.js
│ ├── downvotes.js
│ ├── fake-submission-logs.js
│ ├── github-app-installations.js
│ ├── github-repository-sync-configurations.js
│ ├── individual-checkout-sessions.js
│ ├── individual-payment-method-update-requests.js
│ ├── languages.js
│ ├── leaderboard-entries.js
│ ├── logstreams.js
│ ├── onboarding-surveys.js
│ ├── perks.js
│ ├── promotional-discounts.js
│ ├── referral-activations.js
│ ├── referral-links.js
│ ├── regional-discounts.js
│ ├── repositories.js
│ ├── sessions.js
│ ├── site-feedback-submissions.js
│ ├── slack-integrations.js
│ ├── solution-comparisons.js
│ ├── submissions.js
│ ├── subscriptions.js
│ ├── team-memberships.js
│ ├── team-payment-flows.js
│ ├── team-payment-method-update-requests.js
│ ├── team-subscriptions.js
│ ├── teams.js
│ ├── track-leaderboard-entries.js
│ ├── trusted-community-solution-evaluations.js
│ ├── upvotes.js
│ ├── users.js
│ └── views.js
├── scenarios
│ ├── default.js
│ └── test.js
├── serializers
│ └── application.js
└── utils
│ ├── create-code-walkthrough.js
│ ├── create-community-course-stage-solution.js
│ ├── create-community-solution-comment.js
│ ├── create-community-solutions-analysis.js
│ ├── create-concept-from-fixture.js
│ ├── create-course-extension-activations.js
│ ├── create-course-extension-ideas.js
│ ├── create-course-from-data.js
│ ├── create-course-ideas.js
│ ├── create-course-stage-comment.js
│ ├── create-course-stage-solution.js
│ ├── create-languages.js
│ ├── create-leaderboard-entries.js
│ ├── create-track-leaderboard-entries.js
│ └── sync-repository-stage-lists.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── .well-known
│ └── apple-developer-merchantid-domain-association
├── assets
│ ├── animations
│ │ ├── capy_walking.riv
│ │ ├── gleam_logo_animation.riv
│ │ └── pig_cuddly.riv
│ ├── concept-animations
│ │ ├── network-protocols
│ │ │ ├── layer-1.lottie.json
│ │ │ ├── layer-2.lottie.json
│ │ │ ├── layer-3.lottie.json
│ │ │ ├── layer-4.lottie.json
│ │ │ ├── layers-with-examples.lottie.json
│ │ │ └── layers.lottie.json
│ │ └── tcp-overview
│ │ │ ├── connection-identifiers.lottie.json
│ │ │ ├── handshake-1.lottie.json
│ │ │ ├── handshake-2.lottie.json
│ │ │ ├── handshake-3.lottie.json
│ │ │ ├── ordered-delivery.lottie.json
│ │ │ ├── packet.lottie.json
│ │ │ ├── reliable-delivery.lottie.json
│ │ │ └── server-client.lottie.json
│ ├── favicon.ico
│ ├── images
│ │ ├── Screenshot 2024-02-16 at 21.26.47.png
│ │ ├── affiliate-program-features
│ │ │ ├── byox-banner-mobile.svg
│ │ │ ├── byox-banner.svg
│ │ │ ├── cc-profile-image.png
│ │ │ ├── free-for-friend.jpg
│ │ │ ├── lifetime-earnings.jpg
│ │ │ └── simple-payout.jpg
│ │ ├── backer-headshots
│ │ │ ├── arash-ferdowsi.png
│ │ │ ├── jitendra-vaidya.png
│ │ │ ├── jj-kasper.png
│ │ │ ├── mike-krieger.png
│ │ │ └── paul-copplestone.png
│ │ ├── badges
│ │ │ ├── curie-badge.svg
│ │ │ ├── hamilton-badge.svg
│ │ │ ├── hopper-badge.svg
│ │ │ ├── locked-badge-preview.svg
│ │ │ ├── tesla-badge.svg
│ │ │ └── turing-badge.svg
│ │ ├── challenge-logos
│ │ │ ├── challenge-logo-bittorrent.svg
│ │ │ ├── challenge-logo-dns-server.svg
│ │ │ ├── challenge-logo-docker.svg
│ │ │ ├── challenge-logo-git.svg
│ │ │ ├── challenge-logo-gleam-chess-bot.svg
│ │ │ ├── challenge-logo-grep.svg
│ │ │ ├── challenge-logo-http-server.svg
│ │ │ ├── challenge-logo-interpreter.svg
│ │ │ ├── challenge-logo-kafka.svg
│ │ │ ├── challenge-logo-react.svg
│ │ │ ├── challenge-logo-redis.svg
│ │ │ ├── challenge-logo-shell.svg
│ │ │ └── challenge-logo-sqlite.svg
│ │ ├── codemirror
│ │ │ ├── expand-diff-bottom-dark.svg
│ │ │ ├── expand-diff-bottom.svg
│ │ │ ├── expand-diff-middle-dark.svg
│ │ │ ├── expand-diff-middle.svg
│ │ │ ├── expand-diff-top-dark.svg
│ │ │ └── expand-diff-top.svg
│ │ ├── company-logos
│ │ │ ├── adobe-company-logo.svg
│ │ │ ├── amazon-company-logo.svg
│ │ │ ├── apple-company-logo.svg
│ │ │ ├── aws-company-logo.svg
│ │ │ ├── bookingcom-company-logo.svg
│ │ │ ├── cloudflare-company-logo.svg
│ │ │ ├── coinbase-company-logo.svg
│ │ │ ├── deliveroo-company-logo.png
│ │ │ ├── docker-company-logo.svg
│ │ │ ├── dropbox-company-logo.svg
│ │ │ ├── figma-company-logo.svg
│ │ │ ├── google-company-logo.svg
│ │ │ ├── grab-company-logo.svg
│ │ │ ├── harvard-logo.svg
│ │ │ ├── hashicorp-company-logo.svg
│ │ │ ├── instagram-company-logo.svg
│ │ │ ├── jpmorgan-company-logo.svg
│ │ │ ├── linear-company-logo.svg
│ │ │ ├── mapbox-company-logo.svg
│ │ │ ├── meta-company-logo.svg
│ │ │ ├── mit-logo.svg
│ │ │ ├── nextjs-company-logo.svg
│ │ │ ├── nvidia-company-logo.svg
│ │ │ ├── planetscale-company-logo.svg
│ │ │ ├── porsche-company-logo.png
│ │ │ ├── roblox-company-logo.svg
│ │ │ ├── salesforce-company-logo.png
│ │ │ ├── slack-company-logo.svg
│ │ │ ├── sourcegraph-company-logo.svg
│ │ │ ├── stripe-company-logo.svg
│ │ │ ├── substack-company-logo.png
│ │ │ ├── supabase-company-logo.svg
│ │ │ ├── tencent-company-logo.svg
│ │ │ ├── vercel-company-logo.svg
│ │ │ └── visa-company-logo.svg
│ │ ├── contest-og-images
│ │ │ ├── og-amazon-contest-1.png
│ │ │ └── og-amazon-contest-2.png
│ │ ├── contest-prize-gif
│ │ │ └── amazon-contest-2-360.gif
│ │ ├── feature-previews
│ │ │ └── challenge-voting.png
│ │ ├── heroicons
│ │ │ ├── outline
│ │ │ │ ├── academic-cap.svg
│ │ │ │ ├── adjustments.svg
│ │ │ │ ├── annotation.svg
│ │ │ │ ├── archive.svg
│ │ │ │ ├── arrow-circle-down.svg
│ │ │ │ ├── arrow-circle-left.svg
│ │ │ │ ├── arrow-circle-right.svg
│ │ │ │ ├── arrow-circle-up.svg
│ │ │ │ ├── arrow-down.svg
│ │ │ │ ├── arrow-left.svg
│ │ │ │ ├── arrow-narrow-down.svg
│ │ │ │ ├── arrow-narrow-left.svg
│ │ │ │ ├── arrow-narrow-right.svg
│ │ │ │ ├── arrow-narrow-up.svg
│ │ │ │ ├── arrow-right.svg
│ │ │ │ ├── arrow-up.svg
│ │ │ │ ├── arrows-expand.svg
│ │ │ │ ├── at-symbol.svg
│ │ │ │ ├── backspace.svg
│ │ │ │ ├── badge-check.svg
│ │ │ │ ├── ban.svg
│ │ │ │ ├── beaker.svg
│ │ │ │ ├── bell.svg
│ │ │ │ ├── book-open-outline.svg
│ │ │ │ ├── bookmark-alt.svg
│ │ │ │ ├── bookmark.svg
│ │ │ │ ├── briefcase.svg
│ │ │ │ ├── cake.svg
│ │ │ │ ├── calculator.svg
│ │ │ │ ├── calendar.svg
│ │ │ │ ├── camera.svg
│ │ │ │ ├── cash.svg
│ │ │ │ ├── chart-bar.svg
│ │ │ │ ├── chart-pie.svg
│ │ │ │ ├── chart-square-bar.svg
│ │ │ │ ├── chat-alt-2.svg
│ │ │ │ ├── chat-alt.svg
│ │ │ │ ├── chat.svg
│ │ │ │ ├── check-circle.svg
│ │ │ │ ├── check.svg
│ │ │ │ ├── chevron-double-down.svg
│ │ │ │ ├── chevron-double-left.svg
│ │ │ │ ├── chevron-double-right.svg
│ │ │ │ ├── chevron-double-up.svg
│ │ │ │ ├── chevron-down.svg
│ │ │ │ ├── chevron-left.svg
│ │ │ │ ├── chevron-right.svg
│ │ │ │ ├── chevron-up.svg
│ │ │ │ ├── chip.svg
│ │ │ │ ├── clipboard-check.svg
│ │ │ │ ├── clipboard-copy.svg
│ │ │ │ ├── clipboard-list.svg
│ │ │ │ ├── clipboard.svg
│ │ │ │ ├── clock.svg
│ │ │ │ ├── cloud-download.svg
│ │ │ │ ├── cloud-upload.svg
│ │ │ │ ├── cloud.svg
│ │ │ │ ├── code.svg
│ │ │ │ ├── cog.svg
│ │ │ │ ├── collection.svg
│ │ │ │ ├── color-swatch.svg
│ │ │ │ ├── command-line.svg
│ │ │ │ ├── credit-card.svg
│ │ │ │ ├── cube-transparent.svg
│ │ │ │ ├── cube.svg
│ │ │ │ ├── currency-bangladeshi.svg
│ │ │ │ ├── currency-dollar.svg
│ │ │ │ ├── currency-euro.svg
│ │ │ │ ├── currency-pound.svg
│ │ │ │ ├── currency-rupee.svg
│ │ │ │ ├── currency-yen.svg
│ │ │ │ ├── cursor-click.svg
│ │ │ │ ├── database.svg
│ │ │ │ ├── desktop-computer.svg
│ │ │ │ ├── device-mobile.svg
│ │ │ │ ├── device-tablet.svg
│ │ │ │ ├── document-add.svg
│ │ │ │ ├── document-download.svg
│ │ │ │ ├── document-duplicate.svg
│ │ │ │ ├── document-remove.svg
│ │ │ │ ├── document-report.svg
│ │ │ │ ├── document-search.svg
│ │ │ │ ├── document-text.svg
│ │ │ │ ├── document.svg
│ │ │ │ ├── dots-circle-horizontal.svg
│ │ │ │ ├── dots-horizontal.svg
│ │ │ │ ├── dots-vertical.svg
│ │ │ │ ├── download.svg
│ │ │ │ ├── duplicate.svg
│ │ │ │ ├── emoji-happy.svg
│ │ │ │ ├── emoji-sad.svg
│ │ │ │ ├── exclamation-circle.svg
│ │ │ │ ├── exclamation.svg
│ │ │ │ ├── external-link.svg
│ │ │ │ ├── eye-off.svg
│ │ │ │ ├── eye.svg
│ │ │ │ ├── fast-forward.svg
│ │ │ │ ├── film.svg
│ │ │ │ ├── filter.svg
│ │ │ │ ├── finger-print.svg
│ │ │ │ ├── fire.svg
│ │ │ │ ├── flag.svg
│ │ │ │ ├── folder-add.svg
│ │ │ │ ├── folder-download.svg
│ │ │ │ ├── folder-open.svg
│ │ │ │ ├── folder-remove.svg
│ │ │ │ ├── folder.svg
│ │ │ │ ├── gift.svg
│ │ │ │ ├── globe-alt.svg
│ │ │ │ ├── globe.svg
│ │ │ │ ├── hand.svg
│ │ │ │ ├── hashtag.svg
│ │ │ │ ├── heart.svg
│ │ │ │ ├── home.svg
│ │ │ │ ├── identification.svg
│ │ │ │ ├── inbox-in.svg
│ │ │ │ ├── inbox.svg
│ │ │ │ ├── information-circle.svg
│ │ │ │ ├── key.svg
│ │ │ │ ├── library.svg
│ │ │ │ ├── light-bulb.svg
│ │ │ │ ├── lightning-bolt.svg
│ │ │ │ ├── link.svg
│ │ │ │ ├── location-marker.svg
│ │ │ │ ├── lock-closed.svg
│ │ │ │ ├── lock-open.svg
│ │ │ │ ├── login.svg
│ │ │ │ ├── logout.svg
│ │ │ │ ├── mail-open.svg
│ │ │ │ ├── mail.svg
│ │ │ │ ├── map.svg
│ │ │ │ ├── menu-alt-1.svg
│ │ │ │ ├── menu-alt-2.svg
│ │ │ │ ├── menu-alt-3.svg
│ │ │ │ ├── menu-alt-4.svg
│ │ │ │ ├── menu.svg
│ │ │ │ ├── microphone.svg
│ │ │ │ ├── minus-circle.svg
│ │ │ │ ├── minus-sm.svg
│ │ │ │ ├── minus.svg
│ │ │ │ ├── moon.svg
│ │ │ │ ├── music-note.svg
│ │ │ │ ├── newspaper.svg
│ │ │ │ ├── office-building.svg
│ │ │ │ ├── paper-airplane.svg
│ │ │ │ ├── paper-clip.svg
│ │ │ │ ├── pause.svg
│ │ │ │ ├── pencil-alt.svg
│ │ │ │ ├── pencil.svg
│ │ │ │ ├── phone-incoming.svg
│ │ │ │ ├── phone-missed-call.svg
│ │ │ │ ├── phone-outgoing.svg
│ │ │ │ ├── phone.svg
│ │ │ │ ├── photograph.svg
│ │ │ │ ├── play.svg
│ │ │ │ ├── plus-circle.svg
│ │ │ │ ├── plus-sm.svg
│ │ │ │ ├── plus.svg
│ │ │ │ ├── presentation-chart-bar.svg
│ │ │ │ ├── presentation-chart-line.svg
│ │ │ │ ├── printer.svg
│ │ │ │ ├── puzzle.svg
│ │ │ │ ├── qrcode.svg
│ │ │ │ ├── question-mark-circle.svg
│ │ │ │ ├── receipt-refund.svg
│ │ │ │ ├── receipt-tax.svg
│ │ │ │ ├── refresh.svg
│ │ │ │ ├── reply.svg
│ │ │ │ ├── rewind.svg
│ │ │ │ ├── rss.svg
│ │ │ │ ├── save-as.svg
│ │ │ │ ├── save.svg
│ │ │ │ ├── scale.svg
│ │ │ │ ├── scissors.svg
│ │ │ │ ├── search-circle.svg
│ │ │ │ ├── search.svg
│ │ │ │ ├── selector.svg
│ │ │ │ ├── server.svg
│ │ │ │ ├── share.svg
│ │ │ │ ├── shield-check.svg
│ │ │ │ ├── shield-exclamation.svg
│ │ │ │ ├── shopping-bag.svg
│ │ │ │ ├── shopping-cart.svg
│ │ │ │ ├── sort-ascending.svg
│ │ │ │ ├── sort-descending.svg
│ │ │ │ ├── sparkles.svg
│ │ │ │ ├── speakerphone.svg
│ │ │ │ ├── star.svg
│ │ │ │ ├── status-offline.svg
│ │ │ │ ├── status-online.svg
│ │ │ │ ├── stop.svg
│ │ │ │ ├── sun.svg
│ │ │ │ ├── support.svg
│ │ │ │ ├── switch-horizontal.svg
│ │ │ │ ├── switch-vertical.svg
│ │ │ │ ├── table.svg
│ │ │ │ ├── tag.svg
│ │ │ │ ├── template.svg
│ │ │ │ ├── terminal-outline.svg
│ │ │ │ ├── terminal.svg
│ │ │ │ ├── thumb-down.svg
│ │ │ │ ├── thumb-up.svg
│ │ │ │ ├── ticket.svg
│ │ │ │ ├── translate.svg
│ │ │ │ ├── trash.svg
│ │ │ │ ├── trending-down.svg
│ │ │ │ ├── trending-up.svg
│ │ │ │ ├── truck.svg
│ │ │ │ ├── upload.svg
│ │ │ │ ├── user-add.svg
│ │ │ │ ├── user-circle.svg
│ │ │ │ ├── user-group.svg
│ │ │ │ ├── user-remove.svg
│ │ │ │ ├── user.svg
│ │ │ │ ├── users.svg
│ │ │ │ ├── variable.svg
│ │ │ │ ├── video-camera.svg
│ │ │ │ ├── view-boards.svg
│ │ │ │ ├── view-grid-add.svg
│ │ │ │ ├── view-grid.svg
│ │ │ │ ├── view-list.svg
│ │ │ │ ├── volume-off.svg
│ │ │ │ ├── volume-up.svg
│ │ │ │ ├── wifi.svg
│ │ │ │ ├── x-circle.svg
│ │ │ │ ├── x.svg
│ │ │ │ ├── zoom-in.svg
│ │ │ │ └── zoom-out.svg
│ │ │ └── solid
│ │ │ │ ├── academic-cap.svg
│ │ │ │ ├── adjustments.svg
│ │ │ │ ├── annotation.svg
│ │ │ │ ├── archive.svg
│ │ │ │ ├── arrow-circle-down.svg
│ │ │ │ ├── arrow-circle-left.svg
│ │ │ │ ├── arrow-circle-right.svg
│ │ │ │ ├── arrow-circle-up.svg
│ │ │ │ ├── arrow-down.svg
│ │ │ │ ├── arrow-left.svg
│ │ │ │ ├── arrow-narrow-down.svg
│ │ │ │ ├── arrow-narrow-left.svg
│ │ │ │ ├── arrow-narrow-right.svg
│ │ │ │ ├── arrow-narrow-up.svg
│ │ │ │ ├── arrow-right.svg
│ │ │ │ ├── arrow-up.svg
│ │ │ │ ├── arrows-expand.svg
│ │ │ │ ├── at-symbol.svg
│ │ │ │ ├── backspace.svg
│ │ │ │ ├── badge-check.svg
│ │ │ │ ├── ban.svg
│ │ │ │ ├── beaker.svg
│ │ │ │ ├── bell.svg
│ │ │ │ ├── book-open.svg
│ │ │ │ ├── bookmark-alt.svg
│ │ │ │ ├── bookmark.svg
│ │ │ │ ├── briefcase.svg
│ │ │ │ ├── cake.svg
│ │ │ │ ├── calculator.svg
│ │ │ │ ├── calendar.svg
│ │ │ │ ├── camera.svg
│ │ │ │ ├── cash.svg
│ │ │ │ ├── chart-bar.svg
│ │ │ │ ├── chart-pie.svg
│ │ │ │ ├── chart-square-bar.svg
│ │ │ │ ├── chat-alt-2.svg
│ │ │ │ ├── chat-alt.svg
│ │ │ │ ├── chat.svg
│ │ │ │ ├── check-circle.svg
│ │ │ │ ├── check.svg
│ │ │ │ ├── chevron-double-down.svg
│ │ │ │ ├── chevron-double-left.svg
│ │ │ │ ├── chevron-double-right.svg
│ │ │ │ ├── chevron-double-up.svg
│ │ │ │ ├── chevron-down.svg
│ │ │ │ ├── chevron-left.svg
│ │ │ │ ├── chevron-right.svg
│ │ │ │ ├── chevron-up.svg
│ │ │ │ ├── chip.svg
│ │ │ │ ├── clipboard-check.svg
│ │ │ │ ├── clipboard-copy.svg
│ │ │ │ ├── clipboard-list.svg
│ │ │ │ ├── clipboard.svg
│ │ │ │ ├── clock.svg
│ │ │ │ ├── cloud-download.svg
│ │ │ │ ├── cloud-upload.svg
│ │ │ │ ├── cloud.svg
│ │ │ │ ├── code.svg
│ │ │ │ ├── cog.svg
│ │ │ │ ├── collection.svg
│ │ │ │ ├── color-swatch.svg
│ │ │ │ ├── credit-card.svg
│ │ │ │ ├── cube-transparent.svg
│ │ │ │ ├── cube.svg
│ │ │ │ ├── currency-bangladeshi.svg
│ │ │ │ ├── currency-dollar.svg
│ │ │ │ ├── currency-euro.svg
│ │ │ │ ├── currency-pound.svg
│ │ │ │ ├── currency-rupee.svg
│ │ │ │ ├── currency-yen.svg
│ │ │ │ ├── cursor-click.svg
│ │ │ │ ├── database.svg
│ │ │ │ ├── desktop-computer.svg
│ │ │ │ ├── device-mobile.svg
│ │ │ │ ├── device-tablet.svg
│ │ │ │ ├── document-add.svg
│ │ │ │ ├── document-download.svg
│ │ │ │ ├── document-duplicate.svg
│ │ │ │ ├── document-remove.svg
│ │ │ │ ├── document-report.svg
│ │ │ │ ├── document-search.svg
│ │ │ │ ├── document-text.svg
│ │ │ │ ├── document.svg
│ │ │ │ ├── dots-circle-horizontal.svg
│ │ │ │ ├── dots-horizontal.svg
│ │ │ │ ├── dots-vertical.svg
│ │ │ │ ├── download.svg
│ │ │ │ ├── duplicate.svg
│ │ │ │ ├── emoji-happy.svg
│ │ │ │ ├── emoji-sad.svg
│ │ │ │ ├── exclamation-circle.svg
│ │ │ │ ├── exclamation.svg
│ │ │ │ ├── external-link.svg
│ │ │ │ ├── eye-off.svg
│ │ │ │ ├── eye.svg
│ │ │ │ ├── fast-forward.svg
│ │ │ │ ├── film.svg
│ │ │ │ ├── filter.svg
│ │ │ │ ├── finger-print.svg
│ │ │ │ ├── fire.svg
│ │ │ │ ├── flag.svg
│ │ │ │ ├── folder-add.svg
│ │ │ │ ├── folder-download.svg
│ │ │ │ ├── folder-open.svg
│ │ │ │ ├── folder-remove.svg
│ │ │ │ ├── folder.svg
│ │ │ │ ├── gift.svg
│ │ │ │ ├── globe-alt.svg
│ │ │ │ ├── globe.svg
│ │ │ │ ├── hand.svg
│ │ │ │ ├── hashtag.svg
│ │ │ │ ├── heart.svg
│ │ │ │ ├── home.svg
│ │ │ │ ├── identification.svg
│ │ │ │ ├── inbox-in.svg
│ │ │ │ ├── inbox.svg
│ │ │ │ ├── information-circle.svg
│ │ │ │ ├── key.svg
│ │ │ │ ├── library.svg
│ │ │ │ ├── light-bulb.svg
│ │ │ │ ├── lightning-bolt.svg
│ │ │ │ ├── link.svg
│ │ │ │ ├── location-marker.svg
│ │ │ │ ├── lock-closed.svg
│ │ │ │ ├── lock-open.svg
│ │ │ │ ├── login.svg
│ │ │ │ ├── logout.svg
│ │ │ │ ├── mail-open.svg
│ │ │ │ ├── mail.svg
│ │ │ │ ├── map.svg
│ │ │ │ ├── menu-alt-1.svg
│ │ │ │ ├── menu-alt-2.svg
│ │ │ │ ├── menu-alt-3.svg
│ │ │ │ ├── menu-alt-4.svg
│ │ │ │ ├── menu.svg
│ │ │ │ ├── microphone.svg
│ │ │ │ ├── minus-circle.svg
│ │ │ │ ├── minus-sm.svg
│ │ │ │ ├── minus.svg
│ │ │ │ ├── moon.svg
│ │ │ │ ├── music-note.svg
│ │ │ │ ├── newspaper.svg
│ │ │ │ ├── office-building.svg
│ │ │ │ ├── paper-airplane.svg
│ │ │ │ ├── paper-clip.svg
│ │ │ │ ├── pause.svg
│ │ │ │ ├── pencil-alt.svg
│ │ │ │ ├── pencil.svg
│ │ │ │ ├── phone-incoming.svg
│ │ │ │ ├── phone-missed-call.svg
│ │ │ │ ├── phone-outgoing.svg
│ │ │ │ ├── phone.svg
│ │ │ │ ├── photograph.svg
│ │ │ │ ├── play.svg
│ │ │ │ ├── plus-circle.svg
│ │ │ │ ├── plus-sm.svg
│ │ │ │ ├── plus.svg
│ │ │ │ ├── presentation-chart-bar.svg
│ │ │ │ ├── presentation-chart-line.svg
│ │ │ │ ├── printer.svg
│ │ │ │ ├── puzzle.svg
│ │ │ │ ├── qrcode.svg
│ │ │ │ ├── question-mark-circle.svg
│ │ │ │ ├── receipt-refund.svg
│ │ │ │ ├── receipt-tax.svg
│ │ │ │ ├── refresh.svg
│ │ │ │ ├── reply.svg
│ │ │ │ ├── rewind.svg
│ │ │ │ ├── rss.svg
│ │ │ │ ├── save-as.svg
│ │ │ │ ├── save.svg
│ │ │ │ ├── scale.svg
│ │ │ │ ├── scissors.svg
│ │ │ │ ├── search-circle.svg
│ │ │ │ ├── search.svg
│ │ │ │ ├── selector.svg
│ │ │ │ ├── server.svg
│ │ │ │ ├── share.svg
│ │ │ │ ├── shield-check.svg
│ │ │ │ ├── shield-exclamation.svg
│ │ │ │ ├── shopping-bag.svg
│ │ │ │ ├── shopping-cart.svg
│ │ │ │ ├── sort-ascending.svg
│ │ │ │ ├── sort-descending.svg
│ │ │ │ ├── sparkles.svg
│ │ │ │ ├── speakerphone.svg
│ │ │ │ ├── star.svg
│ │ │ │ ├── status-offline.svg
│ │ │ │ ├── status-online.svg
│ │ │ │ ├── stop.svg
│ │ │ │ ├── sun.svg
│ │ │ │ ├── support.svg
│ │ │ │ ├── switch-horizontal.svg
│ │ │ │ ├── switch-vertical.svg
│ │ │ │ ├── table.svg
│ │ │ │ ├── tag.svg
│ │ │ │ ├── template.svg
│ │ │ │ ├── terminal.svg
│ │ │ │ ├── thumb-down.svg
│ │ │ │ ├── thumb-up.svg
│ │ │ │ ├── ticket.svg
│ │ │ │ ├── translate.svg
│ │ │ │ ├── trash.svg
│ │ │ │ ├── trending-down.svg
│ │ │ │ ├── trending-up.svg
│ │ │ │ ├── truck.svg
│ │ │ │ ├── upload.svg
│ │ │ │ ├── user-add.svg
│ │ │ │ ├── user-circle.svg
│ │ │ │ ├── user-group.svg
│ │ │ │ ├── user-remove.svg
│ │ │ │ ├── user.svg
│ │ │ │ ├── users.svg
│ │ │ │ ├── variable.svg
│ │ │ │ ├── video-camera.svg
│ │ │ │ ├── view-boards.svg
│ │ │ │ ├── view-grid-add.svg
│ │ │ │ ├── view-grid.svg
│ │ │ │ ├── view-list.svg
│ │ │ │ ├── volume-off.svg
│ │ │ │ ├── volume-up.svg
│ │ │ │ ├── wifi.svg
│ │ │ │ ├── x-circle.svg
│ │ │ │ ├── x.svg
│ │ │ │ ├── zoom-in.svg
│ │ │ │ └── zoom-out.svg
│ │ ├── icons
│ │ │ ├── coming-soon.png
│ │ │ ├── congratulations.png
│ │ │ ├── live.svg
│ │ │ ├── lock4.svg
│ │ │ ├── money.svg
│ │ │ ├── right-arrow.svg
│ │ │ ├── ripple-spinner.svg
│ │ │ └── tick3.png
│ │ ├── language-logos
│ │ │ ├── c-black.svg
│ │ │ ├── c-color.svg
│ │ │ ├── c-gray-500.svg
│ │ │ ├── c-teal-500.svg
│ │ │ ├── c-white.svg
│ │ │ ├── clojure-black.svg
│ │ │ ├── clojure-color.svg
│ │ │ ├── clojure-gray-500.svg
│ │ │ ├── clojure-teal-500.svg
│ │ │ ├── clojure-white.svg
│ │ │ ├── cpp-black.svg
│ │ │ ├── cpp-color.svg
│ │ │ ├── cpp-gray-500.svg
│ │ │ ├── cpp-teal-500.svg
│ │ │ ├── cpp-white.svg
│ │ │ ├── crystal-black.svg
│ │ │ ├── crystal-color.svg
│ │ │ ├── crystal-gray-500.svg
│ │ │ ├── crystal-teal-500.svg
│ │ │ ├── crystal-white.svg
│ │ │ ├── csharp-black.svg
│ │ │ ├── csharp-color.svg
│ │ │ ├── csharp-gray-500.svg
│ │ │ ├── csharp-teal-500.svg
│ │ │ ├── csharp-white.svg
│ │ │ ├── dart-color.svg
│ │ │ ├── dart-gray-500.svg
│ │ │ ├── dart-teal-500.svg
│ │ │ ├── elixir-black.svg
│ │ │ ├── elixir-color.svg
│ │ │ ├── elixir-gray-500.svg
│ │ │ ├── elixir-teal-500.svg
│ │ │ ├── elixir-white.svg
│ │ │ ├── gleam-color.svg
│ │ │ ├── gleam-gray-500.svg
│ │ │ ├── gleam-teal-500.svg
│ │ │ ├── go-black.svg
│ │ │ ├── go-color.svg
│ │ │ ├── go-gray-500.svg
│ │ │ ├── go-teal-500.svg
│ │ │ ├── go-white.svg
│ │ │ ├── gopher-black.svg
│ │ │ ├── gopher-color.svg
│ │ │ ├── gopher-gray-500.svg
│ │ │ ├── gopher-teal-500.svg
│ │ │ ├── gopher-white.svg
│ │ │ ├── haskell-black.svg
│ │ │ ├── haskell-color.svg
│ │ │ ├── haskell-gray-500.svg
│ │ │ ├── haskell-teal-500.svg
│ │ │ ├── haskell-white.svg
│ │ │ ├── java-black.svg
│ │ │ ├── java-color.svg
│ │ │ ├── java-gray-500.svg
│ │ │ ├── java-teal-500.svg
│ │ │ ├── java-white.svg
│ │ │ ├── javascript-black.svg
│ │ │ ├── javascript-color.svg
│ │ │ ├── javascript-gray-500.svg
│ │ │ ├── javascript-teal-500.svg
│ │ │ ├── javascript-white.svg
│ │ │ ├── kotlin-black.svg
│ │ │ ├── kotlin-color.svg
│ │ │ ├── kotlin-gray-500.svg
│ │ │ ├── kotlin-teal-500.svg
│ │ │ ├── kotlin-white.svg
│ │ │ ├── nim-black.svg
│ │ │ ├── nim-color.svg
│ │ │ ├── nim-gray-500.svg
│ │ │ ├── nim-teal-500.svg
│ │ │ ├── nim-white.svg
│ │ │ ├── ocaml-color.svg
│ │ │ ├── ocaml-gray-500.svg
│ │ │ ├── ocaml-teal-500.svg
│ │ │ ├── odin-black.svg
│ │ │ ├── odin-color.svg
│ │ │ ├── odin-gray-500.svg
│ │ │ ├── odin-teal-500.svg
│ │ │ ├── odin-white.svg
│ │ │ ├── php-black.svg
│ │ │ ├── php-color.svg
│ │ │ ├── php-gray-500.svg
│ │ │ ├── php-teal-500.svg
│ │ │ ├── php-white.svg
│ │ │ ├── python-black.svg
│ │ │ ├── python-color.svg
│ │ │ ├── python-gray-500.svg
│ │ │ ├── python-teal-500.svg
│ │ │ ├── python-white.svg
│ │ │ ├── reasonml-black.svg
│ │ │ ├── reasonml-color.svg
│ │ │ ├── reasonml-gray-500.svg
│ │ │ ├── reasonml-teal-500.svg
│ │ │ ├── reasonml-white.svg
│ │ │ ├── ruby-black.svg
│ │ │ ├── ruby-color.svg
│ │ │ ├── ruby-gray-500.svg
│ │ │ ├── ruby-teal-500.svg
│ │ │ ├── ruby-white.svg
│ │ │ ├── rust-black.svg
│ │ │ ├── rust-color.svg
│ │ │ ├── rust-gray-500.svg
│ │ │ ├── rust-teal-500.svg
│ │ │ ├── rust-white.svg
│ │ │ ├── scala-color.svg
│ │ │ ├── scala-gray-500.svg
│ │ │ ├── scala-teal-500.svg
│ │ │ ├── swift-color.svg
│ │ │ ├── swift-gray-500.svg
│ │ │ ├── swift-teal-500.svg
│ │ │ ├── typescript-black.svg
│ │ │ ├── typescript-color.svg
│ │ │ ├── typescript-gray-500.svg
│ │ │ ├── typescript-teal-500.svg
│ │ │ ├── typescript-white.svg
│ │ │ ├── zig-color.svg
│ │ │ ├── zig-gray-500.svg
│ │ │ └── zig-teal-500.svg
│ │ ├── logo
│ │ │ ├── logomark-color.svg
│ │ │ └── outline-color.svg
│ │ ├── monthly-challenges
│ │ │ ├── airpods.png
│ │ │ ├── large.png
│ │ │ ├── opal-c1.png
│ │ │ ├── oura-ring-horizon.png
│ │ │ ├── petoirobotdog.png
│ │ │ └── small.png
│ │ ├── pages
│ │ │ └── affiliate-link-page
│ │ │ │ └── green-dot-wall.svg
│ │ ├── payout-method-logos
│ │ │ ├── bank-transfer.svg
│ │ │ └── paypal.svg
│ │ ├── referral-program-features
│ │ │ ├── generate-link.png
│ │ │ ├── get-one-year-free.png
│ │ │ └── gift-one-week-free.png
│ │ ├── svg-icons
│ │ │ ├── dark-modal-back-button.svg
│ │ │ ├── git.svg
│ │ │ ├── github.svg
│ │ │ ├── gold-badge-icon.svg
│ │ │ ├── gold-badge.svg
│ │ │ ├── markdown.svg
│ │ │ └── spinner.svg
│ │ ├── team-features
│ │ │ ├── private-leaderboard.png
│ │ │ ├── slack-integration.png
│ │ │ └── team-billing.png
│ │ └── user-avatars
│ │ │ ├── akshata-mohan.jpg
│ │ │ ├── ananthalakshmi-sankar.jpg
│ │ │ ├── avatar-1.jpg
│ │ │ ├── avatar-2.jpg
│ │ │ ├── avatar-3.jpg
│ │ │ ├── avatar-4.jpg
│ │ │ ├── beyang-liu.jpg
│ │ │ ├── charles-guo.png
│ │ │ ├── cindy-wu.jpg
│ │ │ ├── djorde-lukic.jpg
│ │ │ ├── jj-kasper.png
│ │ │ ├── jj.png
│ │ │ ├── jonathan.jpg
│ │ │ ├── juan-campa.png
│ │ │ ├── juan.png
│ │ │ ├── kangming.jpg
│ │ │ ├── marcos-nils.png
│ │ │ ├── marcos.png
│ │ │ ├── maya-farber-brodsky.png
│ │ │ ├── patrick-burris.jpg
│ │ │ ├── paul.jpg
│ │ │ ├── paul.png
│ │ │ ├── pranjal-paliwal.jpg
│ │ │ ├── raghav-dua.jpg
│ │ │ ├── rahul-tarak.jpg
│ │ │ ├── sarup.png
│ │ │ ├── stan-lo.png
│ │ │ ├── stan.png
│ │ │ └── vladislav-ten.jpeg
│ └── models
│ │ ├── engine.glb
│ │ └── test_badge.glb
├── images
│ └── social-icons
│ │ ├── discord.svg
│ │ ├── linkedin.svg
│ │ ├── slack.svg
│ │ ├── twitter-white.svg
│ │ └── twitter.svg
└── robots.txt
├── scripts
├── add-empty-components.py
└── build-vercel-output.sh
├── sweep.yaml
├── tailwind.config.js
├── testem.js
├── tests
├── acceptance
│ ├── affiliate-course-link-page
│ │ ├── accept-offer-test.js
│ │ └── view-test.js
│ ├── affiliate-link-page
│ │ ├── accept-referral-offer-test.js
│ │ └── view-affiliate-link-test.js
│ ├── affiliate-page
│ │ ├── initiate-payout-test.js
│ │ ├── join-affiliate-program-test.js
│ │ ├── view-affiliate-referrals-test.js
│ │ └── view-payouts-test.js
│ ├── concept-admin
│ │ ├── delete-concept-test.js
│ │ ├── edit-basic-details-test.js
│ │ ├── edit-blocks-test.js
│ │ ├── edit-questions-test.js
│ │ ├── view-basic-details-test.js
│ │ └── view-questions-test.js
│ ├── concept-groups-test.js
│ ├── concepts-test.js
│ ├── contests-test.js
│ ├── course-admin
│ │ ├── apply-update-test.js
│ │ ├── code-example-insights-index-test.js
│ │ ├── code-examples
│ │ │ └── pin-test.js
│ │ ├── tester-versions-page
│ │ │ ├── activate-test.js
│ │ │ └── deprovision-test-runners-test.js
│ │ ├── view-code-example-evaluator-test.js
│ │ ├── view-code-example-evaluators-test.js
│ │ ├── view-diffs-test.js
│ │ ├── view-feedback-test.js
│ │ ├── view-submissions-test.js
│ │ ├── view-tester-version-test.js
│ │ ├── view-tester-versions-test.js
│ │ ├── view-update-test.js
│ │ └── view-updates-test.js
│ ├── course-page
│ │ ├── attempt-course-stage-test.js
│ │ ├── autofix-test.js
│ │ ├── code-examples
│ │ │ ├── expand-collapse-test.js
│ │ │ ├── publish-to-github-test.js
│ │ │ ├── toggle-diff-source-test.js
│ │ │ ├── view-test.js
│ │ │ └── vote-test.js
│ │ ├── complete-challenge-test.js
│ │ ├── complete-first-stage-test.js
│ │ ├── complete-second-stage-test.js
│ │ ├── complete-stage-without-changes-test.js
│ │ ├── course-stage-comments-test.js
│ │ ├── course-stage-solutions-test.js
│ │ ├── dark-mode-test.js
│ │ ├── delete-repository-test.js
│ │ ├── earn-badge-test.js
│ │ ├── edit-course-stage-feedback-test.js
│ │ ├── extensions
│ │ │ ├── disable-extensions-test.js
│ │ │ ├── enable-extensions-after-completion-test.js
│ │ │ ├── enable-extensions-test.js
│ │ │ └── view-extension-stages-test.js
│ │ ├── language-guides-test.js
│ │ ├── publish-to-github-test.js
│ │ ├── repository-poller-test.js
│ │ ├── request-language-test.js
│ │ ├── resume-course-test.js
│ │ ├── share-progress-test.js
│ │ ├── start-course-test.js
│ │ ├── submit-course-stage-feedback-test.js
│ │ ├── switch-repository-test.js
│ │ ├── switch-routes-test.js
│ │ ├── test-runner-card-test.js
│ │ ├── try-other-language-test.js
│ │ ├── view-course-stages-test.js
│ │ ├── view-leaderboard-test.js
│ │ ├── view-progress-banner-test.js
│ │ ├── view-screencasts-test.js
│ │ ├── view-test-results-test.js
│ │ └── view-upgrade-prompt-test.js
│ ├── create-team-test.js
│ ├── demo-page-test.js
│ ├── demo-page
│ │ ├── code-mirror-test.js
│ │ ├── dark-mode-toggle-test.js
│ │ └── file-contents-card-test.js
│ ├── forum-link-test.js
│ ├── header-test.js
│ ├── helpscount-beacon-test.js
│ ├── meta-tags-test.js
│ ├── onboarding-survey-test.js
│ ├── pay-test.js
│ ├── perks-page
│ │ └── claim-test.js
│ ├── referral-link-page
│ │ ├── accept-referral-offer-test.js
│ │ └── view-referral-link-test.js
│ ├── referrals-page
│ │ ├── join-referral-program-test.js
│ │ └── view-referrals-test.js
│ ├── settings-page
│ │ ├── billing-test.js
│ │ ├── delete-account-test.js
│ │ └── profile-test.js
│ ├── submit-site-feedback-test.js
│ ├── team-page
│ │ ├── manage-team-billing-test.js
│ │ ├── manage-team-members-test.js
│ │ ├── manage-team-test.js
│ │ └── view-team-test.js
│ ├── team-payment-test.js
│ ├── track-page
│ │ ├── resume-track-test.js
│ │ ├── start-track-test.js
│ │ └── view-track-test.js
│ ├── utm-campaign-test.js
│ ├── view-badges-test.js
│ ├── view-code-walkthrough-test.js
│ ├── view-course-overview-test.js
│ ├── view-courses-test.js
│ ├── view-discount-countdown-test.js
│ ├── view-index-test.js
│ ├── view-join-track-page-test.js
│ ├── view-product-walkthrough-suggestion-test.js
│ ├── view-tracks-test.js
│ ├── view-user-profile-test.js
│ └── vote-page
│ │ ├── course-extension-ideas-test.js
│ │ └── course-ideas-test.js
├── helpers
│ ├── index.js
│ └── setup-fullscreen-test.ts
├── index.html
├── integration
│ ├── .gitkeep
│ ├── components
│ │ ├── code-mirror-test.js
│ │ ├── course-page
│ │ │ └── course-stage-step
│ │ │ │ └── your-task-card-test.js
│ │ └── rive-animation-test.js
│ └── helpers
│ │ ├── date-format-test.js
│ │ ├── date-from-now-test.js
│ │ └── diff-to-document-test.ts
├── pages
│ ├── admin
│ │ └── courses-page.js
│ ├── affiliate-course-link-page.ts
│ ├── affiliate-link-page.js
│ ├── affiliate-page.js
│ ├── application-page.ts
│ ├── badges-page.js
│ ├── catalog-page.js
│ ├── components
│ │ ├── account-dropdown.js
│ │ ├── billing-status-badge.js
│ │ ├── checkout-session-successful-modal.js
│ │ ├── code-mirror.ts
│ │ ├── comment-card.js
│ │ ├── comment-form.ts
│ │ ├── copyable-terminal-command.ts
│ │ ├── course-admin
│ │ │ ├── code-examples-page
│ │ │ │ └── evaluation-card.ts
│ │ │ ├── course-stage-dropdown.ts
│ │ │ └── language-dropdown.ts
│ │ ├── course-card.js
│ │ ├── course-page
│ │ │ ├── comment-list.js
│ │ │ ├── configure-extensions-modal.js
│ │ │ ├── course-stage-step
│ │ │ │ ├── feedback-prompt.ts
│ │ │ │ ├── first-stage-tutorial-card.ts
│ │ │ │ ├── second-stage-tutorial-card.ts
│ │ │ │ └── your-task-card.js
│ │ │ ├── create-repository-card.js
│ │ │ ├── header.js
│ │ │ ├── leaderboard-entry.js
│ │ │ ├── leaderboard.js
│ │ │ ├── repository-dropdown.js
│ │ │ ├── repository-setup-card.js
│ │ │ ├── repository-setup-card
│ │ │ │ └── request-language-dropdown.js
│ │ │ ├── sidebar.js
│ │ │ ├── step-list
│ │ │ │ └── collapsed-item.js
│ │ │ └── test-results-bar.ts
│ │ ├── course-progress-list-item.js
│ │ ├── dark-mode-toggle.ts
│ │ ├── feedback-dropdown.ts
│ │ ├── file-contents-card.ts
│ │ ├── header.js
│ │ ├── helpscout-beacon.js
│ │ ├── language-dropdown.js
│ │ ├── private-leaderboard-feature-suggestion.js
│ │ ├── submission-logs-preview.ts
│ │ └── tracks-page
│ │ │ └── track-card.js
│ ├── concept-admin
│ │ ├── basic-details-page.ts
│ │ ├── blocks-page.ts
│ │ ├── question-page.ts
│ │ └── questions-page.ts
│ ├── concept-groups-page.ts
│ ├── concept-page.js
│ ├── concepts-page.ts
│ ├── contests-page.ts
│ ├── course-admin
│ │ ├── code-example-evaluator-page.ts
│ │ ├── code-example-evaluators-page.js
│ │ ├── code-example-insights-index-page.js
│ │ ├── code-example-page.js
│ │ ├── feedback-page.js
│ │ ├── submissions-page.js
│ │ ├── tester-version-page.js
│ │ ├── tester-versions-page.js
│ │ ├── update-page.js
│ │ └── updates-page.js
│ ├── course-overview-page.js
│ ├── course-page.ts
│ ├── course
│ │ ├── base-stages-complete-page.ts
│ │ └── code-examples-page.ts
│ ├── create-team-page.js
│ ├── demo-page.ts
│ ├── join-track-page.ts
│ ├── pay-page.js
│ ├── referral-link-page.ts
│ ├── referral-page.ts
│ ├── screencasts-page.js
│ ├── settings
│ │ ├── account-page.ts
│ │ ├── billing-page.ts
│ │ └── profile-page.ts
│ ├── team-page.js
│ ├── team-payment-page.js
│ ├── track-page.js
│ ├── user-page.js
│ ├── vote-page.js
│ └── welcome-page.ts
├── support
│ ├── api-requests-count.js
│ ├── authentication-helpers.js
│ ├── create-page.js
│ ├── fake-action-cable-consumer.ts
│ ├── fake-date-service.ts
│ ├── finish-render.js
│ ├── setup-fake-date-service.js
│ ├── stub-clipboard.ts
│ ├── stub-local-storage.ts
│ └── verify-api-requests.js
├── test-helper.js
└── unit
│ ├── .gitkeep
│ ├── adapters
│ └── application-test.js
│ ├── models
│ ├── concept-test.js
│ ├── course-stage-test.js
│ ├── course-test.js
│ ├── language-test.js
│ ├── repository-test.js
│ └── submission-test.js
│ ├── routes
│ └── application-test.js
│ ├── serializers
│ ├── application-test.js
│ └── repository-test.js
│ ├── services
│ ├── dark-mode-test.ts
│ ├── local-storage-test.js
│ ├── meta-data-test.js
│ └── store-test.ts
│ ├── transforms
│ ├── boolean-test.js
│ ├── date-test.js
│ ├── number-test.js
│ └── string-test.js
│ └── utils
│ ├── blend-colors-test.ts
│ ├── parse-diff-as-document-test.ts
│ ├── route-info-metadata-test.ts
│ ├── scroll-to-top-test.js
│ ├── sync-repository-stage-list-test.js
│ └── time-formatting-test.ts
├── tsconfig.json
├── types
├── codecrafters-frontend
│ └── index.d.ts
├── ember-animated
│ ├── motions
│ │ ├── move.ts
│ │ └── opacity.d.ts
│ └── transitions
│ │ └── fade.d.ts
├── ember-data
│ └── types
│ │ └── registries
│ │ └── model.d.ts
├── glint.d.ts
├── global.d.ts
├── images.d.ts
└── playerjs.d.ts
├── vercel-functions
└── prerender
│ ├── _prerender-ember-route.func
│ ├── .gitignore
│ ├── .vc-config.json
│ ├── index.js
│ ├── package-lock.json
│ ├── package.json
│ └── parse-prerender-path.js
│ ├── concepts
│ ├── [concept].func
│ └── [concept].prerender-config.json
│ ├── contests
│ ├── [contest].func
│ └── [contest].prerender-config.json
│ └── users
│ ├── [user].func
│ └── [user].prerender-config.json
└── vercel.json
/.deepsource.toml:
--------------------------------------------------------------------------------
1 | version = 1
2 |
3 | [[analyzers]]
4 | name = "javascript"
5 | enabled = true
6 |
7 | [analyzers.meta]
8 | plugins = ["ember"]
9 |
10 | [[analyzers]]
11 | name = "test-coverage"
12 | enabled = true
13 |
--------------------------------------------------------------------------------
/.ember-cli:
--------------------------------------------------------------------------------
1 | {
2 | /**
3 | Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript
4 | rather than JavaScript by default, when a TypeScript version of a given blueprint is available.
5 | */
6 | "isTypeScriptProject": true
7 | }
8 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | # unconventional js
2 | /blueprints/*/files/
3 |
4 | # compiled output
5 | /declarations/
6 | /dist/
7 |
8 | # misc
9 | /coverage/
10 | !.*
11 | .*/
12 |
13 | # ember-try
14 | /.node_modules.ember-try/
15 |
16 | # ember-cli-mirage
17 | /mirage/course-fixtures/
18 | /mirage/mirage
19 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | **Checklist**:
2 |
3 | - [ ] I've thoroughly self-reviewed my changes
4 | - [ ] I've added tests for my changes, unless they affect admin-only areas (or are otherwise not worth testing)
5 | - [ ] I've verified any visual changes using Percy (add a commit with `[percy]` in the message to trigger)
6 |
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = {
4 | printWidth: 150,
5 | singleQuote: true,
6 | plugins: ['prettier-plugin-ember-template-tag'],
7 | overrides: [
8 | {
9 | files: '*.hbs',
10 | options: {
11 | singleQuote: false,
12 | },
13 | },
14 | ],
15 | };
16 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | # unconventional files
2 | /blueprints/*/files/
3 |
4 | # compiled output
5 | /dist/
6 |
7 | # addons
8 | /.node_modules.ember-try/
9 |
10 | /app/styles/prism-*.css
11 | /coverage
12 |
--------------------------------------------------------------------------------
/.stylelintrc.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = {
4 | extends: ['stylelint-config-standard', 'stylelint-prettier/recommended'],
5 | };
6 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "eslint.validate": [
3 | "glimmer-ts",
4 | "glimmer-js"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {
2 | "ignore_dirs": ["dist"]
3 | }
4 |
--------------------------------------------------------------------------------
/app/components/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/components/.gitkeep
--------------------------------------------------------------------------------
/app/components/affiliate-page/affiliate-feature-cards.hbs:
--------------------------------------------------------------------------------
1 |
7 | {{markdown-to-html (or @model.markdown "**_(!! empty markdown block !!)_**")}}
8 |
--------------------------------------------------------------------------------
/app/components/blurred-overlay.hbs:
--------------------------------------------------------------------------------
1 |
3 | {{!--
--}}
4 |
--------------------------------------------------------------------------------
/app/components/language-logo.hbs:
--------------------------------------------------------------------------------
1 | {{#if (eq @variant "color")}}
2 |

3 | {{else if (eq @variant "gray")}}
4 |

5 | {{else}}
6 |

7 | {{/if}}
--------------------------------------------------------------------------------
/app/components/loading-indicator-remover.hbs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/components/loading-skeleton.hbs:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/components/markdown-stream.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{markdown-to-html @markdown}}
3 |
--------------------------------------------------------------------------------
/app/components/page-section.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{@title}}
5 |
6 |
7 |
8 | {{yield}}
9 |
--------------------------------------------------------------------------------
/app/components/pill.hbs:
--------------------------------------------------------------------------------
1 |
{{yield}}
--------------------------------------------------------------------------------
/app/components/referrals-page/referral-links-container.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | Your referral link is:
4 |
5 |
6 |
7 | {{! @glint-expect-error: not ts-ified yet }}
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/components/rive-animation.hbs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/components/secondary-button.hbs:
--------------------------------------------------------------------------------
1 |
7 | {{yield}}
8 |
--------------------------------------------------------------------------------
/app/components/settings/form-divider.hbs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/components/syntax-highlighted-code.hbs:
--------------------------------------------------------------------------------
1 |
7 | {{html-safe this.highlightedHtml}}
8 |
--------------------------------------------------------------------------------
/app/components/syntax-highlighted-diff/toggle-comments-button.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class ToggleCommentsButtonComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-page/contact-for-team-billing-container.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class ContactForTeamBillingContainerComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-page/section.hbs:
--------------------------------------------------------------------------------
1 | {{! @glint-nocheck: not typesafe yet }}
2 |
3 |
4 |
5 | {{@title}}
6 |
7 |
8 |
9 | {{yield}}
10 |
--------------------------------------------------------------------------------
/app/components/team-page/section.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class SectionComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-page/uninstall-slack-integration-button.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class UninstallSlackIntegrationButtonComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/navigation-container-item.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class NavigationContainerItemComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/navigation-container.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class NavigationContainerComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/step-container.hbs:
--------------------------------------------------------------------------------
1 | {{! @glint-nocheck: not typesafe yet }}
2 |
3 |
{{@title}}
4 |
5 |
6 | {{yield}}
7 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/step-container.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class StepContainerComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/team-details-form/pricing-plan-option.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class PricingPlanOptionComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/team-payment-page/team-details-form/section.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class SectionComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/track-page/header/statistic.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{svg-jar @icon class="w-5 fill-current text-gray-400 dark:text-gray-500"}}
3 | {{@description}}
4 |
--------------------------------------------------------------------------------
/app/components/track-page/header/top-participant-avatar.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/components/track-page/primer-concept-group-section/concept-list.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#each this.sortedConcepts as |concept|}}
3 |
4 | {{/each}}
5 |
--------------------------------------------------------------------------------
/app/components/track-page/resume-track-button.hbs:
--------------------------------------------------------------------------------
1 |
2 | Resume Track
3 |
4 | {{svg-jar "arrow-right" class="w-4 ml-2 fill-current"}}
5 |
--------------------------------------------------------------------------------
/app/components/user-label.hbs:
--------------------------------------------------------------------------------
1 | {{#if this.label}}
2 |
3 | {{this.label.text}}
4 |
5 |
6 | {{/if}}
--------------------------------------------------------------------------------
/app/components/user-page/course-progress-list-item/progress-bar.js:
--------------------------------------------------------------------------------
1 | import Component from '@glimmer/component';
2 |
3 | export default class ProgressBarComponent extends Component {}
4 |
--------------------------------------------------------------------------------
/app/components/vertical-tab-list/index.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{! This is very minimal at the moment, keep an eye on future use-cases and see what we can pull in here. }}
3 | {{yield}}
4 |
--------------------------------------------------------------------------------
/app/controllers/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/controllers/.gitkeep
--------------------------------------------------------------------------------
/app/controllers/concept-admin.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import ConceptModel from 'codecrafters-frontend/models/concept';
3 |
4 | export default class ConceptAdminController extends Controller {
5 | declare model: {
6 | concept: ConceptModel;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/app/controllers/concept-admin/blocks.ts:
--------------------------------------------------------------------------------
1 | import ConceptModel from 'codecrafters-frontend/models/concept';
2 | import Controller from '@ember/controller';
3 |
4 | export default class BlocksController extends Controller {
5 | declare model: {
6 | concept: ConceptModel;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/app/controllers/course-admin/buildpack.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import BuildpackModel from 'codecrafters-frontend/models/buildpack';
3 |
4 | export default class BuildpackController extends Controller {
5 | declare model: {
6 | buildpack: BuildpackModel;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/app/controllers/course-admin/insights.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import CourseInsightsDashboardModel from 'codecrafters-frontend/models/course-insights-dashboard';
3 |
4 | export default class CourseAdminInsightsController extends Controller {
5 | declare model: {
6 | courseInsightsDashboard: CourseInsightsDashboardModel;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/app/controllers/course-admin/stage-insights-index.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/course-admin/stage-insights-index';
3 |
4 | export default class CourseTesterVersionsController extends Controller {
5 | declare model: ModelType;
6 | }
7 |
--------------------------------------------------------------------------------
/app/controllers/course/base-stages-completed.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/course/base-stages-completed';
3 |
4 | export default class BaseStagesCompletedController extends Controller {
5 | declare model: ModelType;
6 | }
7 |
--------------------------------------------------------------------------------
/app/controllers/course/completed.js:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 |
3 | export default class CourseSetupController extends Controller {
4 | get currentStep() {
5 | return this.model.stepList.steps[this.model.stepList.steps.length - 1];
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/app/controllers/course/extension-completed.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/course/extension-completed';
3 |
4 | export default class ExtensionCompletedController extends Controller {
5 | declare model: ModelType;
6 | }
7 |
--------------------------------------------------------------------------------
/app/controllers/demo.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import RouterService from '@ember/routing/router-service';
3 | import { inject as service } from '@ember/service';
4 |
5 | export default class DemoController extends Controller {
6 | @service declare router: RouterService;
7 | }
8 |
--------------------------------------------------------------------------------
/app/controllers/demo/dark-mode-toggle.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import { service } from '@ember/service';
3 | import DarkModeService from 'codecrafters-frontend/services/dark-mode';
4 |
5 | export default class DemoDarkModeToggleController extends Controller {
6 | @service declare darkMode: DarkModeService;
7 | }
8 |
--------------------------------------------------------------------------------
/app/controllers/join-course.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/join-course';
3 |
4 | export default class JoinCourseController extends Controller {
5 | declare model: ModelType;
6 |
7 | queryParams = [{ affiliateLinkSlug: 'via' }];
8 | }
9 |
--------------------------------------------------------------------------------
/app/controllers/settings/account.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import { tracked } from '@glimmer/tracking';
3 |
4 | export default class AccountController extends Controller {
5 | @tracked deleteAccountModalIsOpen = false;
6 | }
7 |
--------------------------------------------------------------------------------
/app/controllers/settings/profile.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/settings';
3 |
4 | export default class ProfileController extends Controller {
5 | declare model: ModelType;
6 | }
7 |
--------------------------------------------------------------------------------
/app/controllers/vote.ts:
--------------------------------------------------------------------------------
1 | import Controller from '@ember/controller';
2 | import type { ModelType } from 'codecrafters-frontend/routes/vote';
3 |
4 | export default class VoteController extends Controller {
5 | declare model: ModelType;
6 | }
7 |
--------------------------------------------------------------------------------
/app/helpers/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/helpers/.gitkeep
--------------------------------------------------------------------------------
/app/helpers/asset-url.js:
--------------------------------------------------------------------------------
1 | import Helper from '@ember/component/helper';
2 | import config from 'codecrafters-frontend/config/environment';
3 |
4 | export default class AssetURLHelper extends Helper {
5 | compute([relativeURL]) {
6 | return config.assetsHostURL + relativeURL;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/helpers/bool.ts:
--------------------------------------------------------------------------------
1 | import { helper } from '@ember/component/helper';
2 |
3 | const boolHelper = helper(function bool([value]) {
4 | return !!value;
5 | });
6 |
7 | declare module '@glint/environment-ember-loose/registry' {
8 | export default interface Registry {
9 | bool: typeof boolHelper;
10 | }
11 | }
12 |
13 | export default boolHelper;
14 |
--------------------------------------------------------------------------------
/app/helpers/log-fn.js:
--------------------------------------------------------------------------------
1 | import Helper from '@ember/component/helper';
2 |
3 | export default class LogFnHelper extends Helper {
4 | compute([logMessage]) {
5 | return () => {
6 | console.log(logMessage);
7 | };
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/app/helpers/noop.js:
--------------------------------------------------------------------------------
1 | import { helper } from '@ember/component/helper';
2 |
3 | export function noop() {
4 | return function () {
5 | // This is a noop function that does nothing
6 | };
7 | }
8 |
9 | export default helper(noop);
10 |
--------------------------------------------------------------------------------
/app/helpers/set-has.js:
--------------------------------------------------------------------------------
1 | import { helper } from '@ember/component/helper';
2 |
3 | export default helper(function setIncludes([set, value]) {
4 | return set.has(value);
5 | });
6 |
--------------------------------------------------------------------------------
/app/instance-initializers/preload-highlighter.ts:
--------------------------------------------------------------------------------
1 | import SyntaxHighlightedDiffComponent from '../components/syntax-highlighted-diff';
2 |
3 | export function initialize() {
4 | SyntaxHighlightedDiffComponent.preloadHighlighter();
5 | }
6 |
7 | export default {
8 | initialize,
9 | };
10 |
--------------------------------------------------------------------------------
/app/models/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/models/.gitkeep
--------------------------------------------------------------------------------
/app/models/analytics-event.ts:
--------------------------------------------------------------------------------
1 | import Model, { attr } from '@ember-data/model';
2 |
3 | export default class AnalyticsEvent extends Model {
4 | @attr('string') declare name: string;
5 | @attr() declare properties: Record
;
6 | }
7 |
--------------------------------------------------------------------------------
/app/models/course-insights-dashboard.ts:
--------------------------------------------------------------------------------
1 | import Model, { attr, belongsTo } from '@ember-data/model';
2 |
3 | export default class CourseInsightsDashboardModel extends Model {
4 | @belongsTo('course', { async: false, inverse: null }) declare course: { slug: string };
5 |
6 | @attr('string') declare embedUrl: string;
7 | }
8 |
--------------------------------------------------------------------------------
/app/models/individual-payment-method-update-request.ts:
--------------------------------------------------------------------------------
1 | import Model, { attr } from '@ember-data/model';
2 |
3 | export default class IndividualPaymentMethodUpdateRequestModel extends Model {
4 | @attr('string') declare url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/app/models/team-payment-method-update-request.ts:
--------------------------------------------------------------------------------
1 | import Model, { attr, belongsTo } from '@ember-data/model';
2 | import type TeamModel from './team';
3 |
4 | export default class TeamPaymentMethodUpdateRequestModel extends Model {
5 | @belongsTo('team', { async: false, inverse: null }) declare team: TeamModel;
6 | @attr('string') declare url: string;
7 | }
8 |
--------------------------------------------------------------------------------
/app/routes/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/routes/.gitkeep
--------------------------------------------------------------------------------
/app/routes/course/base-stages-completed.ts:
--------------------------------------------------------------------------------
1 | import type { ModelType as CourseModelType } from 'codecrafters-frontend/routes/course';
2 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
3 |
4 | export type ModelType = CourseModelType;
5 |
6 | export default class BaseStagesCompletedRoute extends BaseRoute {}
7 |
--------------------------------------------------------------------------------
/app/routes/courses.js:
--------------------------------------------------------------------------------
1 | import { inject as service } from '@ember/service';
2 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
3 |
4 | export default class CoursesRoute extends BaseRoute {
5 | @service router;
6 |
7 | beforeModel() {
8 | this.router.transitionTo('catalog');
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/routes/debug.ts:
--------------------------------------------------------------------------------
1 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
2 | import RouteInfoMetadata from 'codecrafters-frontend/utils/route-info-metadata';
3 |
4 | export default class DebugRoute extends BaseRoute {
5 | buildRouteInfoMetadata() {
6 | return new RouteInfoMetadata({ allowsAnonymousAccess: true });
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/routes/demo.ts:
--------------------------------------------------------------------------------
1 | import Route from '@ember/routing/route';
2 | import RouteInfoMetadata, { RouteColorScheme } from 'codecrafters-frontend/utils/route-info-metadata';
3 |
4 | export default class DemoRoute extends Route {
5 | buildRouteInfoMetadata() {
6 | return new RouteInfoMetadata({ colorScheme: RouteColorScheme.Both });
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/routes/demo/dark-mode-toggle.ts:
--------------------------------------------------------------------------------
1 | import Route from '@ember/routing/route';
2 |
3 | export default class DemoDarkModeToggleRoute extends Route {}
4 |
--------------------------------------------------------------------------------
/app/routes/demo/rive-animation.ts:
--------------------------------------------------------------------------------
1 | import Route from '@ember/routing/route';
2 | import RouteInfoMetadata, { RouteColorScheme } from 'codecrafters-frontend/utils/route-info-metadata';
3 |
4 | export default class DemoRiveAnimationRoute extends Route {
5 | buildRouteInfoMetadata() {
6 | return new RouteInfoMetadata({ colorScheme: RouteColorScheme.Both });
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/routes/index.js:
--------------------------------------------------------------------------------
1 | import { inject as service } from '@ember/service';
2 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
3 |
4 | export default class IndexRoute extends BaseRoute {
5 | @service router;
6 |
7 | beforeModel() {
8 | this.router.transitionTo('catalog');
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/routes/not-found.ts:
--------------------------------------------------------------------------------
1 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
2 | import RouteInfoMetadata from 'codecrafters-frontend/utils/route-info-metadata';
3 |
4 | export default class NotFoundRoute extends BaseRoute {
5 | buildRouteInfoMetadata() {
6 | return new RouteInfoMetadata({ allowsAnonymousAccess: true });
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/routes/tracks.js:
--------------------------------------------------------------------------------
1 | import { inject as service } from '@ember/service';
2 | import BaseRoute from 'codecrafters-frontend/utils/base-route';
3 |
4 | export default class TracksRoute extends BaseRoute {
5 | @service router;
6 |
7 | beforeModel() {
8 | this.router.transitionTo('catalog');
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/serializers/repository.js:
--------------------------------------------------------------------------------
1 | import ApplicationSerializer from './application';
2 |
3 | export default class RepositorySerializer extends ApplicationSerializer {
4 | serialize() {
5 | let json = super.serialize(...arguments);
6 |
7 | delete json.data.attributes['clone-url'];
8 |
9 | return json;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/app/services/date.ts:
--------------------------------------------------------------------------------
1 | import Service from '@ember/service';
2 |
3 | export default class DateService extends Service {
4 | now(): number {
5 | return Date.now();
6 | }
7 | }
8 |
9 | declare module '@ember/service' {
10 | interface Registry {
11 | date: DateService;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/services/store.ts:
--------------------------------------------------------------------------------
1 | export { default } from 'ember-data/store';
2 |
--------------------------------------------------------------------------------
/app/styles/modals.css:
--------------------------------------------------------------------------------
1 | .modal-backdrop {
2 | z-index: 990;
3 | }
4 |
--------------------------------------------------------------------------------
/app/styles/pages/affiliate-link-page.css:
--------------------------------------------------------------------------------
1 | .bg-github-green-dot-wall {
2 | background-blend-mode: multiply;
3 | background-image: url('/assets/images/pages/affiliate-link-page/green-dot-wall.svg');
4 | background-position: top;
5 | background-repeat: no-repeat;
6 | background-size: max(1024px, 100vw) auto;
7 | }
8 |
--------------------------------------------------------------------------------
/app/styles/pages/code-walkthrough-page.css:
--------------------------------------------------------------------------------
1 | .code-walkthrough-header-background {
2 | background: linear-gradient(180deg, #eff6ff 0%, rgb(239 246 255 / 50%) 100%);
3 | }
4 |
5 | .code-walkthrough-prose pre[class*='language-'] {
6 | background-color: #f1f5f9;
7 | }
8 |
--------------------------------------------------------------------------------
/app/styles/pages/course-stage-solution-page.css:
--------------------------------------------------------------------------------
1 | .solution-explanation pre[class*='language-'] {
2 | background-color: #f1f5f9;
3 | }
4 |
--------------------------------------------------------------------------------
/app/styles/utilities.css:
--------------------------------------------------------------------------------
1 | .h-2px {
2 | height: 2px;
3 | }
4 |
5 | /* https://bengammon.co.uk/css-repeatable-linear-gradients-on-multiple-lines-of-text/ */
6 | .bg-repeating-gradient-to-b {
7 | background-image: repeating-linear-gradient(to bottom, var(--tw-gradient-stops) 1.75rem);
8 | }
9 |
10 | .animate-spin-once {
11 | animation: spin 1s 1;
12 | }
13 |
--------------------------------------------------------------------------------
/app/tailwind-input.css:
--------------------------------------------------------------------------------
1 | /* stylelint-disable */
2 | @tailwind base;
3 | @tailwind components;
4 | @tailwind utilities;
5 |
--------------------------------------------------------------------------------
/app/templates/code-walkthrough.hbs:
--------------------------------------------------------------------------------
1 | {{page-title (concat "Code Walkthrough: " @model.title)}}
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/templates/concept-admin.hbs:
--------------------------------------------------------------------------------
1 | {{page-title (concat "Edit Concept: " (or @model.concept.title "Unknown"))}}
2 |
3 |
4 |
5 | {{outlet}}
--------------------------------------------------------------------------------
/app/templates/concept-admin/blocks.hbs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/templates/concept-group.hbs:
--------------------------------------------------------------------------------
1 | {{page-title "Collections"}}
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/templates/concept.hbs:
--------------------------------------------------------------------------------
1 | {{page-title @model.concept.title}}
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/templates/course-admin.hbs:
--------------------------------------------------------------------------------
1 | {{page-title "Courses Admin"}}
2 |
3 |
4 |
5 | {{outlet}}
--------------------------------------------------------------------------------
/app/templates/course-admin/loading.hbs:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/templates/course/base-stages-completed.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/templates/course/completed.hbs:
--------------------------------------------------------------------------------
1 | {{! @glint-nocheck: not typesafe yet !}}
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/templates/course/extension-completed.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/templates/not-found.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 | Whoops!
4 |
5 |
6 |
7 | The page you're looking for doesn't exist.
8 |
9 |
--------------------------------------------------------------------------------
/app/templates/settings/billing.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/templates/vote-loading.hbs:
--------------------------------------------------------------------------------
1 | {{page-title "Vote"}}
2 |
3 |
--------------------------------------------------------------------------------
/app/templates/vote.hbs:
--------------------------------------------------------------------------------
1 | {{page-title "Vote"}}
2 |
3 |
4 |
5 |
6 | {{outlet}}
7 |
--------------------------------------------------------------------------------
/app/transforms/boolean.js:
--------------------------------------------------------------------------------
1 | export { BooleanTransform as default } from '@ember-data/serializer/transform';
2 |
--------------------------------------------------------------------------------
/app/transforms/date.js:
--------------------------------------------------------------------------------
1 | export { DateTransform as default } from '@ember-data/serializer/transform';
2 |
--------------------------------------------------------------------------------
/app/transforms/number.js:
--------------------------------------------------------------------------------
1 | export { NumberTransform as default } from '@ember-data/serializer/transform';
2 |
--------------------------------------------------------------------------------
/app/transforms/string.js:
--------------------------------------------------------------------------------
1 | export { StringTransform as default } from '@ember-data/serializer/transform';
2 |
--------------------------------------------------------------------------------
/app/utils/course-page-step-list/base-stages-step-group.ts:
--------------------------------------------------------------------------------
1 | import StepGroup from './step-group';
2 |
3 | export default class BaseStagesStepGroup extends StepGroup {
4 | get title() {
5 | return null;
6 | }
7 |
8 | get type(): 'BaseStagesStepGroup' | 'ExtensionStepGroup' {
9 | return 'BaseStagesStepGroup';
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/config/optional-features.json:
--------------------------------------------------------------------------------
1 | {
2 | "application-template-wrapper": false,
3 | "default-async-observers": true,
4 | "jquery-integration": false,
5 | "template-only-glimmer-components": true,
6 | "no-implicit-route-model": true
7 | }
8 |
--------------------------------------------------------------------------------
/config/targets.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions'];
4 |
5 | module.exports = {
6 | browsers,
7 | node: 'current',
8 | };
9 |
--------------------------------------------------------------------------------
/lib/default-meta-tags/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "default-meta-tags",
3 | "keywords": [
4 | "ember-addon"
5 | ],
6 | "dependencies": {
7 | "html-entities": "*"
8 | },
9 | "ember-addon": {
10 | "main": "index.js",
11 | "after": [
12 | "prember"
13 | ]
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/mirage/factories/affiliate-link.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | url: () => `https://app.codecrafters.io/join?via=test`,
5 | });
6 |
--------------------------------------------------------------------------------
/mirage/factories/affiliate-referral.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | withdrawableEarningsAmountInCents: () => 0,
5 | withheldEarningsAmountInCents: () => 0,
6 | });
7 |
--------------------------------------------------------------------------------
/mirage/factories/autofix-request.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | createdAt: () => new Date(),
5 | });
6 |
--------------------------------------------------------------------------------
/mirage/factories/concept-engagement.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | currentProgressPercentage: 0,
5 | lastActivityAt: () => new Date(),
6 | startedAt: () => new Date(),
7 | });
8 |
--------------------------------------------------------------------------------
/mirage/factories/contest.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | afterCreate(contest, server) {
5 | server.schema.leaderboards.create({
6 | contest,
7 | });
8 | },
9 | });
10 |
--------------------------------------------------------------------------------
/mirage/factories/onboarding-survey.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | selectedOptionsForUsagePurpose: () => [],
5 | selectedOptionsForReferralSource: () => [],
6 | freeFormAnswerForUsagePurpose: '',
7 | freeFormAnswerForReferralSource: '',
8 | });
9 |
--------------------------------------------------------------------------------
/mirage/factories/subscription.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | startDate: () => new Date(),
5 | });
6 |
--------------------------------------------------------------------------------
/mirage/factories/team.js:
--------------------------------------------------------------------------------
1 | import { Factory } from 'miragejs';
2 |
3 | export default Factory.extend({
4 | slackAppInstallationUrl: () => 'https://dummy.com',
5 | });
6 |
--------------------------------------------------------------------------------
/mirage/handlers/affiliate-earnings-payouts.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/affiliate-earnings-payouts');
3 | server.post('/affiliate-earnings-payouts');
4 | }
5 |
--------------------------------------------------------------------------------
/mirage/handlers/affiliate-links.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/affiliate-links');
3 |
4 | server.post('/affiliate-links', function (schema) {
5 | const attrs = this.normalizedRequestAttrs();
6 | attrs.url = `https://app.codecrafters.io/join?via=${attrs.slug}`;
7 |
8 | return schema.affiliateLinks.create(attrs);
9 | });
10 | }
11 |
--------------------------------------------------------------------------------
/mirage/handlers/affiliate-referrals.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/affiliate-referrals', function (schema) {
3 | const attrs = this.normalizedRequestAttrs();
4 | attrs.activatedAt = new Date();
5 |
6 | return schema.affiliateReferrals.create(attrs);
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/mirage/handlers/analytics-events.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/analytics-events');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/badges.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/badges');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/community-solutions-analyses.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/community-solutions-analyses');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/concept-engagements.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/concept-engagements', function (schema) {
3 | return schema.conceptEngagements.all().filter((engagement) => engagement.user.id === '63c51e91-e448-4ea9-821b-a80415f266d3');
4 | });
5 |
6 | server.patch('/concept-engagements/:id');
7 | server.post('/concept-engagements');
8 | }
9 |
--------------------------------------------------------------------------------
/mirage/handlers/contests.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/contests');
3 |
4 | server.get('/contests/:slug', function (schema, request) {
5 | return schema.contests.where({ slug: request.params.slug }).models[0];
6 | });
7 | }
8 |
--------------------------------------------------------------------------------
/mirage/handlers/course-stage-completions.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/course-stage-completions', function (schema) {
3 | const attrs = this.normalizedRequestAttrs();
4 | attrs.completedAt = new Date();
5 |
6 | return schema.courseStageCompletions.create(attrs);
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/mirage/handlers/downvotes.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/downvotes');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/github-repository-sync-configurations.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/github-repository-sync-configurations');
3 | server.post('/github-repository-sync-configurations');
4 | server.delete('/github-repository-sync-configurations/:id');
5 | }
6 |
--------------------------------------------------------------------------------
/mirage/handlers/individual-checkout-sessions.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/individual-checkout-sessions', function (schema) {
3 | const attrs = this.normalizedRequestAttrs();
4 | attrs.url = 'https://test.com/checkout_session';
5 |
6 | return schema.individualCheckoutSessions.create(attrs);
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/mirage/handlers/individual-payment-method-update-requests.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/individual-payment-method-update-requests', function (schema) {
3 | return schema.individualPaymentMethodUpdateRequests.create({ url: 'https://test.com/checkout_session' });
4 | });
5 | }
6 |
--------------------------------------------------------------------------------
/mirage/handlers/languages.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/languages', function (schema) {
3 | return schema.languages.all();
4 | });
5 | }
6 |
--------------------------------------------------------------------------------
/mirage/handlers/onboarding-surveys.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/onboarding-surveys', function (schema, request) {
3 | return schema.onboardingSurveys.where({ userId: request.queryParams.user_id });
4 | });
5 |
6 | server.patch('/onboarding-surveys/:id');
7 | }
8 |
--------------------------------------------------------------------------------
/mirage/handlers/promotional-discounts.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/promotional-discounts', function (schema) {
3 | return schema.promotionalDiscounts.all();
4 | });
5 | }
6 |
--------------------------------------------------------------------------------
/mirage/handlers/sessions.js:
--------------------------------------------------------------------------------
1 | import { Response } from 'miragejs';
2 |
3 | export default function (server) {
4 | server.post('/sessions/logout', function () {
5 | return new Response(200, {}, {});
6 | });
7 | }
8 |
--------------------------------------------------------------------------------
/mirage/handlers/slack-integrations.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.delete('/slack-integrations/:id');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/solution-comparisons.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/solution-comparisons');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/team-memberships.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.delete('team-memberships/:id');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/team-payment-method-update-requests.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/team-payment-method-update-requests', function (schema) {
3 | return schema.teamPaymentMethodUpdateRequests.create({ url: 'https://test.com/team_payment_method_update_request' });
4 | });
5 | }
6 |
--------------------------------------------------------------------------------
/mirage/handlers/team-subscriptions.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/team-subscriptions');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/trusted-community-solution-evaluations.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.get('/trusted-community-solution-evaluations');
3 | server.post('/trusted-community-solution-evaluations');
4 | server.patch('/trusted-community-solution-evaluations/:id');
5 | server.delete('/trusted-community-solution-evaluations/:id');
6 | }
7 |
--------------------------------------------------------------------------------
/mirage/handlers/upvotes.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/upvotes');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/handlers/views.js:
--------------------------------------------------------------------------------
1 | export default function (server) {
2 | server.post('/views');
3 | }
4 |
--------------------------------------------------------------------------------
/mirage/serializers/application.js:
--------------------------------------------------------------------------------
1 | import { JSONAPISerializer } from 'miragejs';
2 |
3 | export default JSONAPISerializer.extend({});
4 |
--------------------------------------------------------------------------------
/mirage/utils/create-course-extension-activations.js:
--------------------------------------------------------------------------------
1 | export default function createCourseExtensionActivations(server, repository) {
2 | repository.course.extensions.models.forEach((extension) => {
3 | server.create('course-extension-activation', {
4 | extension,
5 | repository,
6 | });
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = {
4 | plugins: {
5 | tailwindcss: {},
6 | autoprefixer: {},
7 | },
8 | };
9 |
--------------------------------------------------------------------------------
/public/assets/animations/capy_walking.riv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/animations/capy_walking.riv
--------------------------------------------------------------------------------
/public/assets/animations/gleam_logo_animation.riv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/animations/gleam_logo_animation.riv
--------------------------------------------------------------------------------
/public/assets/animations/pig_cuddly.riv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/animations/pig_cuddly.riv
--------------------------------------------------------------------------------
/public/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/favicon.ico
--------------------------------------------------------------------------------
/public/assets/images/Screenshot 2024-02-16 at 21.26.47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/Screenshot 2024-02-16 at 21.26.47.png
--------------------------------------------------------------------------------
/public/assets/images/affiliate-program-features/cc-profile-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/affiliate-program-features/cc-profile-image.png
--------------------------------------------------------------------------------
/public/assets/images/affiliate-program-features/free-for-friend.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/affiliate-program-features/free-for-friend.jpg
--------------------------------------------------------------------------------
/public/assets/images/affiliate-program-features/lifetime-earnings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/affiliate-program-features/lifetime-earnings.jpg
--------------------------------------------------------------------------------
/public/assets/images/affiliate-program-features/simple-payout.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/affiliate-program-features/simple-payout.jpg
--------------------------------------------------------------------------------
/public/assets/images/backer-headshots/arash-ferdowsi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/backer-headshots/arash-ferdowsi.png
--------------------------------------------------------------------------------
/public/assets/images/backer-headshots/jitendra-vaidya.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/backer-headshots/jitendra-vaidya.png
--------------------------------------------------------------------------------
/public/assets/images/backer-headshots/jj-kasper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/backer-headshots/jj-kasper.png
--------------------------------------------------------------------------------
/public/assets/images/backer-headshots/mike-krieger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/backer-headshots/mike-krieger.png
--------------------------------------------------------------------------------
/public/assets/images/backer-headshots/paul-copplestone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/backer-headshots/paul-copplestone.png
--------------------------------------------------------------------------------
/public/assets/images/codemirror/expand-diff-bottom.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/public/assets/images/codemirror/expand-diff-top.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/public/assets/images/company-logos/deliveroo-company-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/company-logos/deliveroo-company-logo.png
--------------------------------------------------------------------------------
/public/assets/images/company-logos/porsche-company-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/company-logos/porsche-company-logo.png
--------------------------------------------------------------------------------
/public/assets/images/company-logos/salesforce-company-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/company-logos/salesforce-company-logo.png
--------------------------------------------------------------------------------
/public/assets/images/company-logos/substack-company-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/company-logos/substack-company-logo.png
--------------------------------------------------------------------------------
/public/assets/images/contest-og-images/og-amazon-contest-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/contest-og-images/og-amazon-contest-1.png
--------------------------------------------------------------------------------
/public/assets/images/contest-og-images/og-amazon-contest-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/contest-og-images/og-amazon-contest-2.png
--------------------------------------------------------------------------------
/public/assets/images/contest-prize-gif/amazon-contest-2-360.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/contest-prize-gif/amazon-contest-2-360.gif
--------------------------------------------------------------------------------
/public/assets/images/feature-previews/challenge-voting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/feature-previews/challenge-voting.png
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/adjustments.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/annotation.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/archive.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-circle-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-circle-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-circle-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-circle-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-narrow-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-narrow-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-narrow-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-narrow-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrow-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/arrows-expand.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/at-symbol.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/backspace.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/ban.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/bookmark-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/bookmark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/calendar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cash.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chart-square-bar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chat-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/check-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-double-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-double-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-double-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-double-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chevron-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/chip.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/clipboard.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/clock.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cloud-download.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cloud-upload.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cloud.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/code.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/credit-card.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cube.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/currency-bangladeshi.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/currency-pound.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/currency-rupee.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/currency-yen.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/cursor-click.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/database.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/desktop-computer.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/device-mobile.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/device-tablet.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document-download.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document-remove.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document-report.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document-text.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/document.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/dots-circle-horizontal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/dots-horizontal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/dots-vertical.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/download.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/duplicate.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/emoji-happy.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/emoji-sad.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/exclamation-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/exclamation.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/external-link.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/film.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/flag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/folder-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/folder-download.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/folder-open.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/folder-remove.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/folder.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/gift.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/hashtag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/heart.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/information-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/key.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/library.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/lightning-bolt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/link.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/lock-closed.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/lock-open.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/login.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/logout.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/mail.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/menu-alt-1.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/menu-alt-2.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/menu-alt-3.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/menu-alt-4.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/menu.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/microphone.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/minus-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/minus-sm.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/minus.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/moon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/newspaper.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/paper-airplane.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/paper-clip.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/pause.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/pencil-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/pencil.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/plus-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/plus-sm.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/plus.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/presentation-chart-bar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/presentation-chart-line.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/receipt-refund.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/refresh.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/reply.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/rss.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/save.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/search-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/selector.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/shopping-bag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/sort-ascending.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/sort-descending.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/sparkles.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/switch-horizontal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/switch-vertical.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/table.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/tag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/terminal-outline.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/terminal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/ticket.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/translate.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/trash.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/trending-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/trending-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/upload.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/user-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/user-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/user-remove.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/user.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/users.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/video-camera.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/view-list.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/wifi.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/x-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/x.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/zoom-in.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/outline/zoom-out.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/annotation.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/archive.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-circle-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-circle-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-circle-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-circle-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-narrow-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-narrow-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-narrow-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-narrow-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrow-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/arrows-expand.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/at-symbol.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/ban.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/bell.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/bookmark-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/bookmark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/calendar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/cash.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chart-bar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chart-pie.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chart-square-bar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chat-alt-2.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chat-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chat.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/check-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/chevron-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/clipboard.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/clock.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/cloud.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/collection.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/currency-bangladeshi.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/desktop-computer.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/device-mobile.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/device-tablet.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/document-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/document-duplicate.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/document-remove.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/document.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/dots-circle-horizontal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/dots-horizontal.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/dots-vertical.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/duplicate.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/exclamation-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/external-link.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/fast-forward.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/film.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/filter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/flag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/folder-add.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/folder-download.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/folder-open.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/folder-remove.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/folder.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/hand.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/heart.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/home.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/inbox.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/information-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/key.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/lightning-bolt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/location-marker.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/lock-closed.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/lock-open.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/login.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/logout.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/mail.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/map.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/menu-alt-1.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/menu-alt-2.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/menu-alt-3.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/menu-alt-4.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/menu.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/microphone.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/minus-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/minus-sm.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/minus.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/moon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/music-note.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/newspaper.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/paper-airplane.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/paper-clip.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/pause.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/pencil.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/phone.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/photograph.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/play.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/plus-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/plus-sm.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/plus.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/printer.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/reply.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/rewind.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/rss.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/save.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/search-circle.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/share.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/speakerphone.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/stop.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/table.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/tag.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/template.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/ticket.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/trending-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/trending-up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/user-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/user-circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/user-remove.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/user.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/users.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/video-camera.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/heroicons/solid/view-boards.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/public/assets/images/icons/coming-soon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/icons/coming-soon.png
--------------------------------------------------------------------------------
/public/assets/images/icons/congratulations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/icons/congratulations.png
--------------------------------------------------------------------------------
/public/assets/images/icons/tick3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/icons/tick3.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/airpods.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/airpods.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/large.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/opal-c1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/opal-c1.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/oura-ring-horizon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/oura-ring-horizon.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/petoirobotdog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/petoirobotdog.png
--------------------------------------------------------------------------------
/public/assets/images/monthly-challenges/small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/monthly-challenges/small.png
--------------------------------------------------------------------------------
/public/assets/images/referral-program-features/generate-link.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/referral-program-features/generate-link.png
--------------------------------------------------------------------------------
/public/assets/images/referral-program-features/get-one-year-free.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/referral-program-features/get-one-year-free.png
--------------------------------------------------------------------------------
/public/assets/images/referral-program-features/gift-one-week-free.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/referral-program-features/gift-one-week-free.png
--------------------------------------------------------------------------------
/public/assets/images/svg-icons/markdown.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/public/assets/images/team-features/private-leaderboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/team-features/private-leaderboard.png
--------------------------------------------------------------------------------
/public/assets/images/team-features/slack-integration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/team-features/slack-integration.png
--------------------------------------------------------------------------------
/public/assets/images/team-features/team-billing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/team-features/team-billing.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/akshata-mohan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/akshata-mohan.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/ananthalakshmi-sankar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/ananthalakshmi-sankar.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/avatar-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/avatar-1.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/avatar-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/avatar-2.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/avatar-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/avatar-3.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/avatar-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/avatar-4.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/beyang-liu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/beyang-liu.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/charles-guo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/charles-guo.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/cindy-wu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/cindy-wu.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/djorde-lukic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/djorde-lukic.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/jj-kasper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/jj-kasper.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/jj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/jj.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/jonathan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/jonathan.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/juan-campa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/juan-campa.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/juan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/juan.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/kangming.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/kangming.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/marcos-nils.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/marcos-nils.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/marcos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/marcos.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/maya-farber-brodsky.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/maya-farber-brodsky.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/patrick-burris.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/patrick-burris.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/paul.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/paul.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/paul.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/paul.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/pranjal-paliwal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/pranjal-paliwal.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/raghav-dua.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/raghav-dua.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/rahul-tarak.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/rahul-tarak.jpg
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/sarup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/sarup.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/stan-lo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/stan-lo.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/stan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/stan.png
--------------------------------------------------------------------------------
/public/assets/images/user-avatars/vladislav-ten.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/images/user-avatars/vladislav-ten.jpeg
--------------------------------------------------------------------------------
/public/assets/models/engine.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/models/engine.glb
--------------------------------------------------------------------------------
/public/assets/models/test_badge.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/public/assets/models/test_badge.glb
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # http://www.robotstxt.org
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/tests/integration/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/tests/integration/.gitkeep
--------------------------------------------------------------------------------
/tests/pages/admin/courses-page.js:
--------------------------------------------------------------------------------
1 | import { clickOnText, create, visitable } from 'ember-cli-page-object';
2 |
3 | export default create({
4 | clickOnLink: clickOnText(),
5 | visit: visitable('/admin/courses'),
6 | });
7 |
--------------------------------------------------------------------------------
/tests/pages/affiliate-course-link-page.ts:
--------------------------------------------------------------------------------
1 | import { collection, visitable } from 'ember-cli-page-object';
2 | import createPage from 'codecrafters-frontend/tests/support/create-page';
3 |
4 | export default createPage({
5 | acceptReferralButtons: collection('[data-test-accept-referral-button]'),
6 |
7 | visit: visitable('/join/:course_slug'),
8 | });
9 |
--------------------------------------------------------------------------------
/tests/pages/affiliate-link-page.js:
--------------------------------------------------------------------------------
1 | import { collection, visitable } from 'ember-cli-page-object';
2 | import createPage from 'codecrafters-frontend/tests/support/create-page';
3 |
4 | export default createPage({
5 | acceptReferralButtons: collection('[data-test-accept-referral-button]'),
6 |
7 | visit: visitable('/join'),
8 | });
9 |
--------------------------------------------------------------------------------
/tests/pages/application-page.ts:
--------------------------------------------------------------------------------
1 | import { create, hasClass } from 'ember-cli-page-object';
2 |
3 | export default create({
4 | scope: '[data-test-application-container]',
5 | hasDarkClass: hasClass('dark'),
6 | });
7 |
--------------------------------------------------------------------------------
/tests/pages/components/checkout-session-successful-modal.js:
--------------------------------------------------------------------------------
1 | export default {
2 | scope: '[data-test-checkout-session-successful-modal]',
3 | };
4 |
--------------------------------------------------------------------------------
/tests/pages/components/copyable-terminal-command.ts:
--------------------------------------------------------------------------------
1 | import { clickOnText, text } from 'ember-cli-page-object';
2 |
3 | export default {
4 | clickOnVariantButton: clickOnText('[data-test-variant-button]'),
5 | copyableText: text('[data-test-copyable-text]'),
6 | scope: '[data-test-copyable-terminal-command]',
7 | };
8 |
--------------------------------------------------------------------------------
/tests/pages/components/course-page/step-list/collapsed-item.js:
--------------------------------------------------------------------------------
1 | import { text } from 'ember-cli-page-object';
2 |
3 | export default {
4 | scope: '[data-test-course-collapsed-item]',
5 | title: text('[data-test-collapsed-item-title]'),
6 | };
7 |
--------------------------------------------------------------------------------
/tests/pages/components/course-progress-list-item.js:
--------------------------------------------------------------------------------
1 | import { text } from 'ember-cli-page-object';
2 |
3 | export default {
4 | name: text('[data-test-course-name]'),
5 | description: text('[data-test-course-description]'),
6 | };
7 |
--------------------------------------------------------------------------------
/tests/pages/components/helpscout-beacon.js:
--------------------------------------------------------------------------------
1 | export default {
2 | scope: '[data-test-helpscout-beacon]',
3 | };
4 |
--------------------------------------------------------------------------------
/tests/pages/components/private-leaderboard-feature-suggestion.js:
--------------------------------------------------------------------------------
1 | import { clickable } from 'ember-cli-page-object';
2 |
3 | export default {
4 | clickOnTeamsLink: clickable('a'),
5 | clickOnDismissButton: clickable('[data-test-dismiss-button]'),
6 | scope: '[data-test-private-leaderboard-feature-suggestion]',
7 | };
8 |
--------------------------------------------------------------------------------
/tests/pages/components/submission-logs-preview.ts:
--------------------------------------------------------------------------------
1 | import { collection } from 'ember-cli-page-object';
2 |
3 | export default {
4 | get logs() {
5 | return this.logLines.map((line) => line.text).join('\n');
6 | },
7 |
8 | logLines: collection('[data-test-log-line]'),
9 | scope: '[data-test-submission-logs-preview]',
10 | };
11 |
--------------------------------------------------------------------------------
/tests/pages/course-admin/code-example-page.js:
--------------------------------------------------------------------------------
1 | import { clickable, create, visitable } from 'ember-cli-page-object';
2 |
3 | export default create({
4 | clickOnPinCodeExampleToggle: clickable('[data-test-pin-code-example-toggle]'),
5 | visit: visitable('/courses/:course_slug/admin/code-examples/:code_example_id'),
6 | });
7 |
--------------------------------------------------------------------------------
/tests/pages/course-admin/feedback-page.js:
--------------------------------------------------------------------------------
1 | import { collection, create, visitable } from 'ember-cli-page-object';
2 |
3 | export default create({
4 | feedbackListItems: collection('[data-test-feedback-list-item]'),
5 | visit: visitable('/courses/:course_slug/admin/feedback'),
6 | });
7 |
--------------------------------------------------------------------------------
/tests/pages/join-track-page.ts:
--------------------------------------------------------------------------------
1 | import { collection, visitable } from 'ember-cli-page-object';
2 | import createPage from 'codecrafters-frontend/tests/support/create-page';
3 |
4 | export default createPage({
5 | acceptReferralButtons: collection('[data-test-accept-referral-button]'),
6 |
7 | visit: visitable('/join-track/:track_slug'),
8 | });
9 |
--------------------------------------------------------------------------------
/tests/pages/screencasts-page.js:
--------------------------------------------------------------------------------
1 | import { collection, create, text } from 'ember-cli-page-object';
2 |
3 | export default create({
4 | screencastPreviews: collection('[data-test-screencasts-previews]', {
5 | titleText: text('[data-test-screencasts-previews-title]'),
6 | formattedDurationText: text('[data-test-screencasts-formatted-duration]'),
7 | }),
8 | });
9 |
--------------------------------------------------------------------------------
/tests/support/setup-fake-date-service.js:
--------------------------------------------------------------------------------
1 | import FakeDateService from './fake-date-service';
2 |
3 | export default function setupFakeDateService(hooks = self) {
4 | hooks.beforeEach(function () {
5 | this.owner.register('service:date', FakeDateService);
6 | });
7 | }
8 |
--------------------------------------------------------------------------------
/tests/unit/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/tests/unit/.gitkeep
--------------------------------------------------------------------------------
/tests/unit/utils/scroll-to-top-test.js:
--------------------------------------------------------------------------------
1 | import scrollToTop from 'codecrafters-frontend/utils/scroll-to-top';
2 | import { module, test } from 'qunit';
3 |
4 | module('Unit | Utility | scroll-to-top', function () {
5 | test('it exists', function (assert) {
6 | assert.strictEqual(typeof scrollToTop, 'function');
7 | });
8 | });
9 |
--------------------------------------------------------------------------------
/types/ember-animated/motions/move.ts:
--------------------------------------------------------------------------------
1 | declare module 'ember-animated/motions/move';
2 |
--------------------------------------------------------------------------------
/types/ember-animated/motions/opacity.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'ember-animated/motions/opacity';
2 |
--------------------------------------------------------------------------------
/types/ember-animated/transitions/fade.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'ember-animated/transitions/fade';
2 |
--------------------------------------------------------------------------------
/types/ember-data/types/registries/model.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Catch-all for ember-data.
3 | */
4 | export default interface ModelRegistry {
5 | [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any
6 | }
7 |
--------------------------------------------------------------------------------
/types/global.d.ts:
--------------------------------------------------------------------------------
1 | import '@glint/environment-ember-loose';
2 |
3 | // https://github.com/typed-ember/ember-cli-typescript/issues/1482, https://github.com/glimmerjs/glimmer.js/issues/408
4 | declare module '@glimmer/tracking' {
5 | export const cached: PropertyDecorator;
6 | }
7 |
--------------------------------------------------------------------------------
/types/playerjs.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'player.js';
2 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/_prerender-ember-route.func/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /dist
3 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/_prerender-ember-route.func/.vc-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "handler": "index.js",
3 | "runtime": "nodejs22.x",
4 | "memory": 3009,
5 | "maxDuration": 15,
6 | "launcherType": "Nodejs",
7 | "shouldAddHelpers": true,
8 | "shouldAddSourcemapSupport": true
9 | }
10 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/_prerender-ember-route.func/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prerender-ember-route",
3 | "dependencies": {
4 | "abortcontroller-polyfill": "^1.7.8",
5 | "fastboot": "^4.1.5",
6 | "node-fetch": "^2.7.0"
7 | },
8 | "type": "module"
9 | }
10 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/concepts/[concept].func:
--------------------------------------------------------------------------------
1 | ../_prerender-ember-route.func
--------------------------------------------------------------------------------
/vercel-functions/prerender/concepts/[concept].prerender-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "expiration": 86400,
3 | "allowQuery": ["concept"],
4 | "passQuery": true
5 | }
6 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/contests/[contest].func:
--------------------------------------------------------------------------------
1 | ../_prerender-ember-route.func
--------------------------------------------------------------------------------
/vercel-functions/prerender/contests/[contest].prerender-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "expiration": 86400,
3 | "allowQuery": ["contest"],
4 | "passQuery": true
5 | }
6 |
--------------------------------------------------------------------------------
/vercel-functions/prerender/users/[user].func:
--------------------------------------------------------------------------------
1 | ../_prerender-ember-route.func
--------------------------------------------------------------------------------
/vercel-functions/prerender/users/[user].prerender-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "expiration": 86400,
3 | "allowQuery": ["user"],
4 | "passQuery": true
5 | }
6 |
--------------------------------------------------------------------------------