Files
unsupervised-scheduler/assets/css/frontend.css
T
thatguygriffandClaude Opus 5 3a954bac57
CI / Tests (PHP 8.1) (pull_request) Successful in 50s
CI / Tests (PHP 8.2) (pull_request) Successful in 1m12s
CI / No Debug Code (pull_request) Successful in 3s
CI / Coding Standards (pull_request) Successful in 2m50s
CI / PHPStan (pull_request) Successful in 3m4s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m42s
CI / Build Plugin Zip (pull_request) Skipped
View a policy version's content, and make policy text readable
The Policies admin page listed versions but never showed what any of them
said, so revising a policy meant retyping it blind into an empty draft box.
Each version row now has a View action that renders that version's text on
the page, editable in place. A draft is saved back to itself; editing a
published or archived version branches a new draft and leaves the original
alone, because acceptances are recorded against policy_version_id and text a
student agreed to must stay exactly as they saw it.

That viewer also exposed why a studio reported the acceptance box as
unreadable — one squashed line, overlapping words, a horizontal scrollbar.
Bodies are typed into a bare textarea, so most carry no markup, and the raw
text was emitted with its blank lines intact but nothing to turn them into
paragraphs. PolicyVersion::bodyHtml() now renders every body the way
WordPress renders post content (kses, then wpautop) and feeds all three
consumers: the booking/enrolment JSON, the signup form, and the new viewer.
Bodies written with markup are unaffected.

The other half was that .us-policy-body had no CSS whatsoever and inherited
whatever the theme did with an unstyled block in a form. It is now a bounded
reading box that scrolls vertically and breaks long tokens, so a pasted URL
cannot force the page sideways and a long policy cannot push the accept
checkbox out of view. RegistrationPage was also never enqueueing the plugin
stylesheet, which is why the signup gate looked worst of all.

Closes #126
Closes #127

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-07-28 17:05:00 -03:00

356 lines
6.0 KiB
CSS

.us-login-form label {
display: block;
margin-bottom: 4px;
font-weight: 600;
}
.us-login-form input[type="text"],
.us-login-form input[type="password"] {
width: 100%;
max-width: 340px;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
.us-error {
color: #c00;
border-left: 4px solid #c00;
padding-left: 8px;
}
#us-booking-app .us-slot {
border: 1px solid #ddd;
border-radius: 4px;
padding: 12px 16px;
margin-bottom: 8px;
display: flex;
justify-content: space-between;
align-items: center;
}
#us-booking-error {
color: #c00;
margin-top: 8px;
}
.us-my-lessons {
margin-bottom: 24px;
}
.us-my-lesson {
border: 1px solid #ddd;
border-radius: 4px;
padding: 12px 16px;
margin-bottom: 8px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
}
.us-my-lesson-info {
display: flex;
flex-direction: column;
gap: 2px;
}
.us-my-lesson-title {
font-size: 1.05em;
}
.us-my-lesson-duration {
font-weight: normal;
color: #666;
}
.us-my-lesson-when {
color: #555;
}
.us-my-lesson-actions {
display: flex;
gap: 12px;
align-items: center;
}
.us-show-all-lessons {
background: transparent;
border: 1px solid #ccc;
border-radius: 4px;
padding: 6px 14px;
cursor: pointer;
}
.us-show-all-lessons:hover {
border-color: #888;
}
.us-cancel-lesson {
background: transparent;
border: 1px solid #ccc;
border-radius: 4px;
padding: 4px 12px;
cursor: pointer;
color: #c00;
}
.us-cancel-lesson:hover {
border-color: #c00;
}
.us-lesson-status {
font-size: 0.85em;
font-weight: 600;
padding: 2px 10px;
border-radius: 10px;
background: #eee;
}
.us-lesson-status-confirmed {
background: #e2f5e5;
color: #1a7d2e;
}
.us-lesson-status-pending {
background: #fdf3d7;
color: #8a6d1a;
}
.us-calendar-controls {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: 8px;
margin-bottom: 12px;
}
.us-filter-toggle {
padding: 6px 16px;
border: 1px solid #ccc;
border-radius: 4px;
background: transparent;
cursor: pointer;
}
.us-filter-toggle.us-active {
background: #333;
border-color: #333;
color: #fff;
}
.us-type-filter {
margin-bottom: 12px;
padding: 8px 12px;
border: 1px solid #eee;
border-radius: 4px;
}
.us-type-filter-heading {
display: block;
margin-bottom: 6px;
font-weight: 600;
}
.us-type-filter-choices {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px 16px;
}
.us-type-filter-choice {
display: inline-flex;
align-items: center;
gap: 6px;
}
.us-type-filter-clear {
margin-left: auto;
padding: 4px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background: transparent;
cursor: pointer;
}
.us-view-toggle {
display: flex;
gap: 8px;
}
.us-view-toggle button {
padding: 6px 16px;
border: 1px solid #ccc;
border-radius: 4px;
background: transparent;
cursor: pointer;
}
.us-view-toggle button.us-active {
background: #333;
border-color: #333;
color: #fff;
}
.us-week-nav {
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
margin-bottom: 12px;
}
.us-week-nav button {
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background: transparent;
cursor: pointer;
}
.us-week-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 8px;
}
.us-week-day {
border: 1px solid #ddd;
border-radius: 4px;
padding: 8px;
min-height: 90px;
}
.us-week-day-heading {
margin: 0 0 8px;
font-size: 0.85em;
text-align: center;
}
.us-week-slot {
display: block;
width: 100%;
margin-bottom: 6px;
}
.us-week-empty {
display: block;
text-align: center;
opacity: 0.4;
}
/* The price and pay agreement on a booking / enrolment form. */
.us-price {
border: 1px solid #ddd;
border-radius: 4px;
padding: 12px 16px;
margin: 16px 0;
}
.us-price h4 {
margin: 0 0 8px;
}
.us-price p {
margin: 0 0 4px;
}
.us-price-amount strong {
font-size: 1.15em;
}
.us-price-cadence {
margin-left: 4px;
}
.us-price-tax,
.us-price-note {
font-size: 0.9em;
opacity: 0.8;
}
.us-price-agree {
display: block;
margin-top: 12px;
font-weight: 600;
}
/* The cadence-carrying price on a group-class card. */
.us-class-price {
font-weight: 600;
}
/* Policy acceptance — booking, enrolment, and signup all render this markup. */
.us-policy {
margin: 16px 0;
}
.us-policy h4 {
margin: 0 0 6px;
}
/*
* The body is admin-authored HTML sitting inside whatever layout the theme
* provides, so it gets an explicit reading box rather than inheriting one.
* `overflow-wrap` breaks pasted URLs instead of letting one long token force
* the horizontal scrollbar, and the bounded height keeps a long policy from
* pushing the accept checkbox off the screen.
*/
.us-policy-body {
box-sizing: border-box;
max-width: 100%;
max-height: 260px;
overflow-y: auto;
overflow-x: hidden;
padding: 12px 14px;
margin-bottom: 8px;
border: 1px solid #ddd;
border-radius: 4px;
background: #fafafa;
white-space: normal;
overflow-wrap: break-word;
word-break: break-word;
line-height: 1.5;
text-align: left;
}
.us-policy-body p,
.us-policy-body ul,
.us-policy-body ol {
margin: 0 0 0.75em;
max-width: 100%;
}
.us-policy-body ul,
.us-policy-body ol {
padding-left: 1.5em;
}
.us-policy-body > :last-child {
margin-bottom: 0;
}
.us-policy-accept,
.us-policies input[type="checkbox"] {
margin-right: 6px;
}
@media (max-width: 640px) {
.us-week-grid {
grid-template-columns: 1fr;
}
.us-week-day {
min-height: 0;
}
}
/* Shown only in block-editor previews (see BlockPreview). */
.us-editor-note {
font-size: 0.85em;
font-style: italic;
opacity: 0.7;
}