Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@
CustomLoginView,
CustomSignupView,
CustomSocialSignupViewView,
V3LoginView,
V3SignupView,
UserViewSet,
UserAvatar,
DeleteUserView,
Expand Down Expand Up @@ -257,6 +259,16 @@
staff_member_required(LearnPageView.as_view()),
name="v3-learn-page",
),
path(
Comment thread
julhoang marked this conversation as resolved.
"v3/accounts/signup/",
V3SignupView.as_view(),
name="v3-signup",
),
path(
"v3/accounts/login/",
V3LoginView.as_view(),
name="v3-login",
),
path("libraries/", LibraryListDispatcher.as_view(), name="libraries"),
path(
"libraries/<boostversionslug:version_slug>/<str:library_view_str>/",
Expand Down
213 changes: 213 additions & 0 deletions static/css/v3/auth-page.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
/*
Auth Page
Two-column layout for sign-up and sign-in pages.
Left: illustration image. Right: centered form content.
Dependencies: foundations, forms, buttons.
*/

/* ── Header overlay on auth pages ─────────── */
body:has(.auth-page) .header {
position: absolute;
z-index: 10;
left: 0;
right: 0;
}

/* ── Page-level flex column ───────────────── */
.auth-page {
display: flex;
flex-direction: column;
min-height: 100vh;
}

/* ── Reset base.html intermediate wrappers ──── */
.auth-page .w-full,
Comment thread
julhoang marked this conversation as resolved.
.auth-page .md\:px-0 {
min-height: auto;
padding: 0;
width: 100%;
}

.auth-page .min-vh-110 {
min-height: auto;
padding: 0;
width: 100%;
flex: 1;
display: flex;
flex-direction: column;
}

.auth-page p {
margin: 0;
padding: 0;
}

/* ── Two-column grid layout ───────────────── */
.auth-page__wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
width: 100%;
max-width: 1440px;
flex: 1;
min-height: 0;
overflow: hidden;
margin: 0 auto;
}

/* ── Illustration Panel ────────────────────── */
.auth-page__illustration {
position: relative;
overflow: hidden;
}

.auth-page__illustration-background {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
}

.auth-page__illustration-foreground {
margin-top: 80px; /* This is the size of the header navbar, added so that the content will not be hidden behind it */
position: absolute;
inset: 0;
width: 100%;
object-fit: contain;
z-index: 1;
align-self: center;
}

/* ── Content Panel ─────────────────────────── */
.auth-page__content {
display: flex;
justify-content: center;
align-items: center;
padding: var(--space-xlarge);
margin-top: 80px; /* This is the size of the header navbar, added so that the content will not be hidden behind it */
}

.auth-page__content-inner {
max-width: 458px;
width: 100%;
display: flex;
flex-direction: column;
gap: var(--space-large);
}

/* ── Header ────────────────────────────────── */
.auth-page__header {
display: flex;
flex-direction: column;
gap: var(--space-medium);
}

.auth-page__title {
font-family: var(--font-display);
font-size: var(--font-size-large);
font-weight: var(--font-weight-medium);
line-height: var(--line-height-tight);
letter-spacing: -0.01em;
color: var(--color-text-primary);
margin: 0;
}

.auth-page__subtitle {
font-family: var(--font-sans);
font-size: var(--font-size-base);
font-weight: var(--font-weight-regular);
line-height: var(--line-height-default);
letter-spacing: -0.01em;
color: var(--color-text-secondary);
margin: 0;
}

/* ── Card ──────────────────────────────────── */
.auth-page__card {
display: flex;
flex-direction: column;
gap: var(--space-large);
padding: var(--space-large);
border: 1px solid var(--color-stroke-weak);
border-radius: var(--border-radius-xxl);
background: var(--color-surface-weak);
}

/* ── Forgot Password Link ──────────────────── */
.auth-page__forgot-link {
font-family: var(--font-sans);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-regular);
line-height: 120%;
letter-spacing: -0.12px;
color: var(--color-text-primary);
text-decoration: underline;
text-decoration-skip-ink: auto;
text-underline-offset: auto;
width: fit-content;
}

.auth-page__forgot-link:hover {
color: var(--color-text-link-accent);
}

/* ── Divider ───────────────────────────────── */
.auth-page__divider {
font-family: var(--font-display);
font-size: 18px;
font-weight: var(--font-weight-medium);
line-height: var(--line-height-tight);
letter-spacing: -0.01em;
color: var(--color-text-primary);
text-align: center;
margin: 0;
}

/* ── Social Card ───────────────────────────── */
.auth-page__social-card {
display: flex;
flex-direction: column;
gap: var(--space-default);
padding: var(--space-large);
border: 1px solid var(--color-stroke-weak);
border-radius: var(--border-radius-xxl);
background: var(--color-surface-weak);
}

/* ── Responsive (Tablet) ────────────────────────────── */
@media (max-width: 1279px) {
.auth-page {
min-height: auto;
}

.auth-page__wrapper {
grid-template-columns: 1fr;
flex: none;
}

.auth-page__illustration {
height: 592px;
}

.auth-page__illustration-foreground {
height: 500px;
}

.auth-page__content {
padding: var(--space-medium);
align-items: flex-start;
margin-top: 0;
}
}

/* ── Responsive (Mobile) ────────────────────────────── */
@media (max-width: 767px) {
.auth-page__illustration {
height: 368px;
}

.auth-page__illustration-foreground {
height: 280px;
}
}
6 changes: 6 additions & 0 deletions static/css/v3/buttons.css
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
color 0.15s ease;
}

.btn:disabled {
opacity: 0.5;
pointer-events: none;
cursor: default;
}

.btn-row {
display: flex;
flex-wrap: wrap;
Expand Down
79 changes: 79 additions & 0 deletions static/css/v3/forms.css
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,7 @@
font-size: var(--font-size-small, 14px);
font-weight: var(--font-weight-regular, 400);
line-height: var(--line-height-relaxed, 1.24);
letter-spacing: var(--letter-spacing-tight);
color: var(--color-text-primary, #050816);
}

Expand Down Expand Up @@ -723,3 +724,81 @@
background-color: var(--color-surface-error-weak, #fdf2f2);
border-color: var(--color-stroke-error, #d53f3f33);
}

/* ── Password Toggle ───────────────────────── */
.field__toggle {
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
cursor: pointer;
padding: 0;
color: var(--color-icon-secondary);
flex-shrink: 0;
}

.field__toggle:hover {
color: var(--color-icon-primary);
}

.field__toggle .icon {
width: 16px;
height: 16px;
}

/* ── Password Checklist ────────────────────── */
.field__checklist {
display: flex;
flex-direction: column;
gap: var(--space-default);
}

.field__checklist-heading {
font-family: var(--font-sans);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-regular);
line-height: var(--line-height-default);
letter-spacing: -0.01em;
color: var(--color-text-tertiary);
margin: 0;
}

.field__checklist-list {
display: flex;
flex-direction: column;
gap: var(--space-s);
list-style: none;
margin: 0;
padding: 0;
flex-shrink: 0;
}

.field__checklist-item {
display: flex;
flex-direction: row;
align-items: center;
gap: var(--space-s);
font-family: var(--font-sans);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-regular);
line-height: var(--line-height-default);
letter-spacing: -0.01em;
color: var(--color-text-primary);
}

.field__checklist-item .icon {
width: 16px;
min-width: 16px;
height: 16px;
flex-shrink: 0;
color: var(--color-text-tertiary);
}

.field__checklist-item--pass .icon {
color: var(--color-syntax-green);
}

.field__checklist-item--fail .icon {
color: var(--color-text-error);
}
Binary file added static/img/v3/auth-page/auth-page-background.png
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While my PR has not yet been accepted, these particular files should be converted to S3 content once it is.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added static/img/v3/auth-page/auth-page-foreground.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions templates/includes/icon.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@
<path d="M2.92 7.94c-.13-.4-.21-.83-.21-1.27 0-.44.08-.87.21-1.28L.71 3.67C.26 4.57 0 5.59 0 6.67c0 1.08.26 2.09.71 2.99l2.21-1.72z"/>
<path d="M6.67 13.33c1.8 0 3.31-.59 4.41-1.61l-2.15-1.67c-.6.4-1.37.64-2.27.64-1.74 0-3.21-1.17-3.74-2.75L.71 9.66c1.1 2.18 3.35 3.67 5.96 3.67z"/>
</svg>
{% elif icon_name == "google-colored" %}
<svg xmlns="http://www.w3.org/2000/svg" width="{{ icon_size|default:24 }}" height="{{ icon_size|default:24 }}" viewBox="0 0 16 16" fill="none">
<path d="M15.04 8.16602C15.04 7.64602 14.9933 7.14602 14.9067 6.66602H8V9.50602H11.9467C11.7733 10.4193 11.2533 11.1927 10.4733 11.7127V13.5593H12.8533C14.24 12.2793 15.04 10.3993 15.04 8.16602Z" fill="#4285F4"/>
<path d="M7.99979 15.3337C9.97979 15.3337 11.6398 14.6804 12.8531 13.5604L10.4731 11.7137C9.81979 12.1537 8.98646 12.4204 7.99979 12.4204C6.09312 12.4204 4.47312 11.1337 3.89312 9.40039H1.45312V11.2937C2.65979 13.6871 5.13312 15.3337 7.99979 15.3337Z" fill="#34A853"/>
<path d="M3.8939 9.39289C3.74724 8.95289 3.66057 8.48622 3.66057 7.99956C3.66057 7.51289 3.74724 7.04622 3.8939 6.60622V4.71289H1.4539C0.953903 5.69956 0.667236 6.81289 0.667236 7.99956C0.667236 9.18622 0.953903 10.2996 1.4539 11.2862L3.3539 9.80622L3.8939 9.39289Z" fill="#FBBC05"/>
<path d="M7.99979 3.58602C9.07979 3.58602 10.0398 3.95935 10.8065 4.67935L12.9065 2.57935C11.6331 1.39268 9.97979 0.666016 7.99979 0.666016C5.13312 0.666016 2.65979 2.31268 1.45312 4.71268L3.89312 6.60602C4.47312 4.87268 6.09312 3.58602 7.99979 3.58602Z" fill="#EA4335"/>
</svg>
{% elif icon_name == "alert" %}
<svg class="{{ icon_class|default:'icon' }}" width="{{ icon_size|default:24 }}" height="{{ icon_size|default:24 }}" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M8.6665 0.666687H7.33317V2.00002H5.99984V3.33335H4.6665V4.66669H3.33317V6.00002H1.99984V7.33335H0.666504V8.66669H1.99984V10H3.33317V11.3334H4.6665V12.6667H5.99984V14H7.33317V15.3334H8.6665V14H9.99984V12.6667H11.3332V11.3334H12.6665V10H13.9998V8.66669H15.3332V7.33335H13.9998V6.00002H12.6665V4.66669H11.3332V3.33335H9.99984V2.00002H8.6665V0.666687ZM8.6665 2.00002V3.33335H9.99984V4.66669H11.3332V6.00002H12.6665V7.33335H13.9998V8.66669H12.6665V10H11.3332V11.3334H9.99984V12.6667H8.6665V14H7.33317V12.6667H5.99984V11.3334H4.6665V10H3.33317V8.66669H1.99984V7.33335H3.33317V6.00002H4.6665V4.66669H5.99984V3.33335H7.33317V2.00002H8.6665ZM8.6665 4.66669H7.33317V8.66669H8.6665V4.66669ZM8.6665 10H7.33317V11.3334H8.6665V10Z"/>
Expand Down Expand Up @@ -70,6 +77,10 @@
<path d="M10 2h6v2h4v18H4V4h4V2h2zm6 4v2H8V6H6v14h12V6h-2zm-2 0V4h-4v2h4z" />
{% elif icon_name == "get-help" %}
<path d="M6 2h10v2H6V2zM4 6V4h2v2H4zm0 12H2V6h2v12zm2 2H4v-2h2v2zm12 0H6v2h12v-2zm2-2v2h-2v-2h2zm0 0h2V8h-2v10zM12 6H8v2H6v8h2v2h8v-2h2v-4h-2v4H8V8h4V6zm2 8v-4h2V8h2V6h4V4h-2V2h-2v4h-2v2h-2v2h-4v4h4z" />
{% elif icon_name == "eye" %}
<path d="M8 6H16V8H8V6ZM4 10V8H8V10H4ZM2 12V10H4V12H2ZM2 14V12H0V14H2ZM4 16H2V14H4V16ZM8 18H4V16H8V18ZM16 18V20H8V18H16ZM20 16V18H16V16H20ZM22 14V16H20V14H22ZM22 12H24V14H22V12ZM20 10H22V12H20V10ZM20 10V8H16V10H20ZM10 11H14V15H10V11Z" />
{% elif icon_name == "eye-off" %}
<path d="M0 7H2V9H0V7ZM4 11H2V9H4V11ZM8 13V11H4V13H2V15H4V13H8ZM16 13H8V15H6V17H8V15H16V17H18V15H16V13ZM20 11H16V13H20V15H22V13H20V11ZM22 9V11H20V9H22ZM22 9V7H24V9H22Z"/>
{% elif icon_name == "device-tv" %}
<path d="M20 2H2v20h2V4h16v12H6v2H4v2h2v-2h16V2h-2z" />
{% elif icon_name == "documentation" %}
Expand Down
Loading
Loading