├── .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 |
2 | {{#each this.featureMarkdownList as |feature|}} 3 | 4 | {{/each}} 5 |
-------------------------------------------------------------------------------- /app/components/affiliate-page/create-payout-modal/form-section.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
{{@title}}
4 |
{{@description}}
5 |
6 | 7 |
8 | {{yield}} 9 |
10 |
-------------------------------------------------------------------------------- /app/components/alert.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{yield}} 3 |
-------------------------------------------------------------------------------- /app/components/ansi-stream.hbs: -------------------------------------------------------------------------------- 1 |
{{html-safe this.displayHTML}}
-------------------------------------------------------------------------------- /app/components/avatar-image.hbs: -------------------------------------------------------------------------------- 1 | avatar -------------------------------------------------------------------------------- /app/components/badges-page/badge-preview.hbs: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /app/components/badges-page/earned-badge-preview.hbs: -------------------------------------------------------------------------------- 1 |
2 | locked badge preview 3 |
-------------------------------------------------------------------------------- /app/components/badges-page/locked-badge-preview.hbs: -------------------------------------------------------------------------------- 1 |
2 | locked badge preview 3 |
-------------------------------------------------------------------------------- /app/components/blocks/markdown-block.hbs: -------------------------------------------------------------------------------- 1 |
7 | {{markdown-to-html (or @model.markdown "**_(!! empty markdown block !!)_**")}} 8 |
-------------------------------------------------------------------------------- /app/components/blurred-overlay.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{yield to="content"}} 3 | 4 | {{#if @isBlurred}} 5 |
6 | {{yield to="overlay"}} 7 |
8 | {{/if}} 9 |
-------------------------------------------------------------------------------- /app/components/code-walkthrough-page/metadata-item.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{svg-jar @icon class="w-4 mr-2 fill-current text-gray-300"}} 3 | 4 | {{yield}} 5 | 6 |
-------------------------------------------------------------------------------- /app/components/comment-card/reply-button.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class ReplyButtonComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/comment-form/tab-header.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class TabHeaderComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/contest-page/contest-status-pill.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{yield}} 3 | 4 | {{#if @tooltipCopy}} 5 | 6 | {{/if}} 7 |
-------------------------------------------------------------------------------- /app/components/contributor-avatar.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class ContributorAvatarComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-admin/code-example-insights/metadata-container.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{markdown-to-html this.markdownContent}} 3 |
-------------------------------------------------------------------------------- /app/components/course-admin/submissions-page/submission-details/header-container-row.hbs: -------------------------------------------------------------------------------- 1 | 2 | {{@title}} 3 | 4 | {{yield}} 5 | 6 | -------------------------------------------------------------------------------- /app/components/course-card/difficulty-label.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class DifficultyLabelComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-logo.hbs: -------------------------------------------------------------------------------- 1 | {{@course.name}} -------------------------------------------------------------------------------- /app/components/course-overview-page/stage-list-item-avatar.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/components/course-overview-page/stage-list.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/course-overview-page/testimonial-list.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{#each @course.testimonials as |testimonial|}} 3 | 4 | {{/each}} 5 |
-------------------------------------------------------------------------------- /app/components/course-page/configure-github-integration-modal/create-github-repository-step.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class CreateGithubRepositoryStepComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-page/configure-github-integration-modal/step.hbs: -------------------------------------------------------------------------------- 1 | {{! @glint-nocheck: not typesafe yet }} 2 |
3 |
{{@title}}
4 | 5 | {{yield}} 6 |
-------------------------------------------------------------------------------- /app/components/course-page/configure-github-integration-modal/step.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class StepComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-page/course-stage-item/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if this.shouldShowPublishToGitHubPrompt}} 2 | 3 | {{/if}} -------------------------------------------------------------------------------- /app/components/course-page/course-stage-item/publish-to-github-prompt.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class PublishToGithubPromptComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-page/course-stage-step/prerequisites-card.hbs: -------------------------------------------------------------------------------- 1 | 2 | <:content> 3 |
4 | {{markdown-to-html this.prerequisiteInstructionsMarkdown}} 5 |
6 | 7 |
-------------------------------------------------------------------------------- /app/components/course-page/course-stage-step/second-stage-tutorial-card/run-tests-step.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/course-page/progress-banner-modal.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class ProgressBannerModalComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-page/sidebar/mobile-backdrop.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/course-page/solution-language-dropdown-link.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class SolutionLanguageDropdownLinkComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/course-stage-screencast-player.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{html-safe @screencast.embedHtml}} 3 |
-------------------------------------------------------------------------------- /app/components/create-team-page/features-list-item.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class FeaturesListItemComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/create-team-page/features-list.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{#each this.features as |feature|}} 3 | 4 | {{/each}} 5 |
-------------------------------------------------------------------------------- /app/components/danger-button.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/discuss-on-hn-button.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class DiscussOnHnButtonComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/expand-or-collapse-button.hbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codecrafters-io/frontend/5f368200a9880c0429eb09c2997cd7ede8e9e0fb/app/components/expand-or-collapse-button.hbs -------------------------------------------------------------------------------- /app/components/external-contributor-card.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class ExternalContributorCardComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/faq-list.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{#each this.faqs as |faq|}} 4 | 5 | {{/each}} 6 |
7 |
-------------------------------------------------------------------------------- /app/components/feedback-button/sentiment-option.js: -------------------------------------------------------------------------------- 1 | import Component from '@glimmer/component'; 2 | 3 | export default class SentimentOptionComponent extends Component {} 4 | -------------------------------------------------------------------------------- /app/components/head-layout.hbs: -------------------------------------------------------------------------------- 1 | {{#in-element this.headElement insertBefore=null}} 2 | {{! template-lint-disable no-forbidden-elements }} 3 | 4 | 5 | 6 | {{/in-element}} -------------------------------------------------------------------------------- /app/components/helpscout-beacon.hbs: -------------------------------------------------------------------------------- 1 | {{! End to end tests are not working for the beacon }} 2 |
3 | {{!--
--}} 4 |
-------------------------------------------------------------------------------- /app/components/language-logo.hbs: -------------------------------------------------------------------------------- 1 | {{#if (eq @variant "color")}} 2 | {{@language.name}} 3 | {{else if (eq @variant "gray")}} 4 | {{@language.name}} 5 | {{else}} 6 | {{@language.name}} 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 |
2 |
3 | 4 |
5 |
-------------------------------------------------------------------------------- /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 |
4 | 5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /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 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/annotation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/archive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-circle-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-circle-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-circle-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-circle-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-narrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-narrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-narrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-narrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/arrows-expand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/at-symbol.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/backspace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/ban.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/bookmark-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chart-square-bar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chat-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/check-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-double-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-double-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-double-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-double-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chevron-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/chip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/clipboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cloud-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cloud-upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/code.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/credit-card.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cube.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/currency-bangladeshi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/currency-pound.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/currency-rupee.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/currency-yen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/cursor-click.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/database.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/desktop-computer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/device-mobile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/device-tablet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document-report.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/document.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/dots-circle-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/dots-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/dots-vertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/duplicate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/emoji-happy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/emoji-sad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/exclamation-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/exclamation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/external-link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/film.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/flag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/folder-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/folder-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/folder-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/folder-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/gift.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/hashtag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/information-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/library.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/lightning-bolt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/lock-closed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/lock-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/login.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/mail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/menu-alt-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/menu-alt-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/menu-alt-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/menu-alt-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/microphone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/minus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/minus-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/moon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/newspaper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/paper-airplane.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/paper-clip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/pencil-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/plus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/plus-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/presentation-chart-bar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/presentation-chart-line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/receipt-refund.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/refresh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/reply.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/rss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/search-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/selector.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/shopping-bag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/sort-ascending.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/sort-descending.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/sparkles.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/switch-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/switch-vertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/table.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/terminal-outline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/terminal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/ticket.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/translate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/trending-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/trending-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/user-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/user-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/user-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/users.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/video-camera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/view-list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/wifi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/x-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/zoom-in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/outline/zoom-out.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/annotation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/archive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-circle-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-circle-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-circle-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-circle-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-narrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-narrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-narrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-narrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/arrows-expand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/at-symbol.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/ban.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/bell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/bookmark-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/cash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chart-bar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chart-pie.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chart-square-bar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chat-alt-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chat-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/check-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/chevron-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/clipboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/cloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/collection.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/currency-bangladeshi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/desktop-computer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/device-mobile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/device-tablet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/document-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/document-duplicate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/document-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/document.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/dots-circle-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/dots-horizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/dots-vertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/duplicate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/exclamation-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/external-link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/fast-forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/film.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/flag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/folder-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/folder-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/folder-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/folder-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/hand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/inbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/information-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/lightning-bolt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/location-marker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/lock-closed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/lock-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/login.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/mail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/map.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/menu-alt-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/menu-alt-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/menu-alt-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/menu-alt-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/microphone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/minus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/minus-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/moon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/music-note.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/newspaper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/paper-airplane.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/paper-clip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/phone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/photograph.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/plus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/plus-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/printer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/reply.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/rewind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/rss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/search-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/speakerphone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/stop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/table.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/template.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/ticket.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/trending-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/trending-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/user-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/user-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/user-remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/users.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/video-camera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/images/heroicons/solid/view-boards.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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 | 2 | 3 | 4 | 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 | --------------------------------------------------------------------------------