| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- /*!
- * Spry CSS theme — "Formal" — wedding-stationery suite, second fidelity
- * pass against the real wedding site: plum header/footer bands, mauve nav
- * band and mauve expanders (never white), berry buttons in thick pale-berry
- * mats, frosted panels with the double pressed shadow, script form labels,
- * ivory paper, serif ink. Light-only. Activated with <html data-theme=
- * "formal"> or the demo radio #spry-theme-formal. Load after spry.css.
- * No JavaScript or imports; stacks fall back to Georgia / cursive.
- */
- [data-theme="formal"],
- html:has(#spry-theme-formal:checked) {
- color-scheme: light;
- /* ---- Palette (the core derives soft tints automatically) ---- */
- --spry-bg: #fdfbf7; /* ivory paper */
- --spry-bg-alt: #f7f2ec; /* stationery bands, wells, titlebars */
- --spry-bg-inset: #f3ece2; /* disabled fills, code blocks */
- --spry-surface: #ffffff; /* popovers, menus, tables: kept opaque */
- --spry-surface-hover: #faf6ef;
- --spry-fg: #3f3a3c; /* ink */
- --spry-fg-muted: #7d7379;
- --spry-border: #e6dcd2; /* hairlines */
- --spry-border-strong: #b47e9a; /* berry mat hsl(329 26% 60%) */
- --spry-accent: #844d6a; /* berry — hsl(329 26% 41%), site buttons */
- --spry-accent-hover: #915574; /* site hover lightens to hsl(329 26% 45%) */
- --spry-accent-fg: #ffffff;
- --spry-danger: #a6304c; /* deep rose */
- --spry-success: #5e713d; /* sage green — hsl(82 30% 34%) */
- --spry-warning: #8f6824; /* antique gold */
- --spry-info: #6f5a7c; /* plum */
- --spry-link: var(--spry-success); /* sage links, as on the site */
- --spry-link-hover: #49582f;
- --spry-backdrop: rgb(63 58 60 / 0.5);
- --formal-gold: #b08d3e; /* gilded hairlines, fleurons, frames */
- --formal-plum: #854e6a; /* site header / footer plum */
- --formal-mauve: #80628f; /* hsl(280 19% 47%): nav band, expander edge */
- --formal-mauve-bar: #c3b3cb; /* hsl(280 19% 75%): expander summary bar */
- --formal-mauve-pale: #e7e1ea; /* hsl(280 19% 90%): expander body */
- --formal-berry-pale: #ecdfe6; /* hsl(329 26% 90%): secondary fill */
- --formal-berry-mat: #d0afc0; /* hsl(329 26% 75%): secondary mat */
- /* ---- Typography ---- */
- --spry-font: "Cormorant Garamond", "EB Garamond", Georgia, serif;
- --spry-font-heading: var(--spry-font);
- --spry-font-display: "Snell Roundhand", "Apple Chancery", "Segoe Script",
- "Brush Script MT", cursive; /* script: h1, hero, brand, form labels */
- --spry-font-mono: ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace;
- --spry-font-size: 1.125rem; /* generous: the site set p/form text to 1.2em */
- --spry-line-height: 1.65;
- --spry-heading-weight: 600;
- /* ---- Shape, depth, motion ---- */
- --spry-radius: 0.75rem; /* 12px — the site's only radius */
- --spry-radius-sm: 0.75rem; /* 12px here too: chips, menu items */
- --spry-radius-lg: 0.75rem;
- --spry-radius-pill: 999px;
- --spry-border-width: 1px;
- --spry-shadow: 0 1px 2px rgb(63 58 60 / 0.05), 0 6px 18px -6px rgb(63 58 60 / 0.07);
- --spry-shadow-lg: 0 24px 48px -16px rgb(63 58 60 / 0.24), 0 6px 16px rgb(63 58 60 / 0.08);
- --spry-glass: none;
- --spry-transition: 150ms ease;
- --spry-dialog-duration: 200ms;
- --spry-dialog-ease: cubic-bezier(0.2, 0.9, 0.3, 1);
- --spry-dialog-in: translateY(0.6rem) scale(0.98);
- --spry-focus-ring: 0 0 0 3px var(--spry-surface), 0 0 0 4px var(--spry-border),
- 0 0 0 6px color-mix(in srgb, var(--spry-accent) 30%, transparent);
- /* ---- Controls: transparent wells, berry hairline (site inputs) ---- */
- --spry-control-bg: transparent;
- --spry-control-fg: var(--spry-fg);
- --spry-control-border: var(--spry-border-strong);
- --spry-control-radius: 0.75rem; /* 12px */
- --spry-control-padding-x: 1.35rem; /* buttons: core adds .15rem = 24px */
- --spry-control-padding-y: 0.5rem; /* 8px, the site's control padding */
- /* ---- Buttons: the site's berry seals (color rides the vars) ---- */
- --spry-btn-bg: var(--spry-accent);
- --spry-btn-fg: #ffffff;
- --spry-btn-border: var(--spry-border-strong);
- --spry-btn-bg-hover: var(--spry-accent-hover);
- --spry-btn-bg-active: #74445d; /* hsl(329 26% 36%), pressed darker */
- /* ---- Cards: frosted panel on a 6px white mat (site form/#response) ---- */
- --spry-card-bg: rgb(255 255 255 / 0.5);
- --spry-card-border: #ffffff;
- --spry-card-padding: 2em; /* the site's 2em panel padding */
- --spry-card-shadow: 0 0 5px rgb(0 0 0 / 0.2), inset 0 0 5px rgb(0 0 0 / 0.2);
- --spry-table-header-bg: var(--formal-berry-pale);
- --spry-table-hover: color-mix(in srgb, var(--spry-accent) 5%, var(--spry-surface));
- --spry-progress-bg: var(--spry-bg-alt);
- --spry-progress-fg: var(--spry-accent);
- --spry-popover-bg: var(--spry-surface);
- --spry-popover-border: var(--spry-border);
- --spry-popover-shadow: var(--spry-shadow-lg);
- /* ---- Structural polish (looks the variables can't reach) ---- */
- /* Letterpress headings: small-caps, letter-spaced, debossed ink.
- h1 is the script display moment — swashes in berry. */
- & :is(h2, h3, h4, h5, .card-title) {
- font-variant-caps: all-small-caps; letter-spacing: 0.08em;
- text-shadow: 0 1px 0 #fff;
- }
- /* :where() keeps these at (0,1,0) — sibling themes use the same idiom —
- so container-scoped scales in the core (.prose h1, .prose h2) still
- win by load order instead of losing to a full (0,1,1) match. The size
- rules additionally opt out of .prose: the radio switcher route
- (html:has(#spry-theme-formal:checked)) carries an ID of specificity
- that would otherwise flatten the core's document scale even through
- :where(). */
- & :where(h2:not(.prose *)) { font-size: 2em; } /* the site's h2 scale */
- & :where(h1) {
- font-family: var(--spry-font-display); font-weight: 400;
- line-height: 1.25;
- color: var(--spry-accent); text-shadow: 0 1px 0 #fff;
- }
- & :where(h1:not(.prose *)) {
- font-size: clamp(2.3rem, 1.7rem + 2.4vw, 3.3rem);
- }
- & h6 { letter-spacing: 0.12em; text-shadow: 0 1px 0 #fff; }
- /* A card that opens on its title is a hero moment — script it */
- & .card > .card-title:first-child {
- font-family: var(--spry-font-display); font-variant-caps: normal;
- font-weight: 400; font-size: 1.5rem; color: var(--spry-accent); letter-spacing: 0;
- }
- & .card-subtitle { font-style: italic; }
- /* Form labels in script, as the site lettered its form text */
- & :is(.label, legend) {
- font-family: var(--spry-font-display); font-weight: 600;
- font-size: 1.15em; letter-spacing: 0;
- }
- /* Dividers as menu-card ornaments: hairline with a gold fleuron */
- & hr {
- position: relative; overflow: visible; border: 0;
- border-top: 1px solid color-mix(in srgb, var(--spry-border-strong) 55%, transparent);
- margin-block: 2.4rem;
- &::after {
- content: "❧"; position: absolute; left: 50%; top: 0;
- translate: -50% -55%; color: var(--formal-gold);
- font-size: 1.15rem; line-height: 1;
- }
- }
- /* Panels & generous spacing: thick stationery mats, 15px+ gutters */
- & .card { border-width: 6px; }
- & fieldset { padding: 1.25rem 1.5rem; }
- & :is(.popover-menu, .submenu) { padding: 0.6rem; }
- /* Topbar as the site header: plum band, white text, generous padding,
- pressed-in shade along the bottom edge */
- & .topbar {
- background: var(--formal-plum); color: #fff; border-bottom: 0;
- padding-block: clamp(1.1rem, 2.5vw, 2.5rem); /* up to the site's 40px */
- box-shadow: inset 0 -10px 6px rgb(0 0 0 / 0.2);
- }
- & footer.topbar { box-shadow: inset 0 10px 6px rgb(0 0 0 / 0.2); }
- /* Brand: script names in white on flanking gilt rules */
- & .topbar-brand {
- display: inline-flex; align-items: center; gap: 0.65rem;
- font-family: var(--spry-font-display); font-weight: 400;
- font-size: 1.6rem; letter-spacing: 0; color: #fff;
- &::before,
- &::after {
- content: ""; width: 1.4rem; height: 1px;
- background: color-mix(in srgb, var(--formal-gold) 70%, transparent);
- transition: width var(--spry-transition);
- }
- &:hover { color: #fff; }
- &:hover::before,
- &:hover::after { width: 2.2rem; background: var(--formal-gold); }
- }
- /* Nav links on paper: engraved small-caps, berry underline on hover */
- & .nav a {
- font-variant-caps: all-small-caps; font-weight: 500;
- letter-spacing: 0.14em; border-radius: 0;
- }
- & .nav a:hover,
- & .nav a.active {
- background: transparent; color: var(--spry-accent);
- text-decoration: underline; text-decoration-thickness: 1.5px;
- text-underline-offset: 0.4em;
- }
- & .nav a:hover { text-decoration-color: var(--spry-accent); }
- & .nav a.active { text-decoration-color: var(--formal-gold); }
- /* Nav in the topbar = the site's mauve band with white links */
- & .topbar .nav {
- background: var(--formal-mauve); border-radius: var(--spry-radius);
- padding: 0.35rem 0.65rem; box-shadow: inset 0 -4px 3px rgb(0 0 0 / 0.2);
- }
- & .topbar .nav a,
- & .topbar .nav a:hover,
- & .topbar .nav a.active {
- background: transparent; color: #fff; text-decoration-color: #fff;
- }
- /* Menus as menu cards: flat items, gold course marker on hover */
- & :is(.menu, .submenu) a { letter-spacing: 0.05em; border-radius: 0; }
- & .menu a:hover,
- & .menu a.active {
- background: color-mix(in srgb, var(--spry-accent) 7%, var(--spry-surface));
- box-shadow: inset 2px 0 0 var(--formal-gold);
- }
- & .submenu a:hover {
- background: color-mix(in srgb, var(--spry-accent) 10%, var(--spry-surface));
- color: var(--spry-accent);
- }
- /* Breadcrumbs: legible gold diamond separators */
- & .breadcrumb li + li::before {
- content: "◆"; font-size: 0.65em; vertical-align: 0.22em; color: var(--formal-gold);
- }
- /* Buttons: the site's berry seals — thick pale-berry mat border and the
- double (outer + inset) pressed shadow. Fill, text, hover and the
- 8px 24px padding ride the vars; :where keeps this light enough that
- core .btn-sm/.btn-lg sizing at (0,2,0) still wins. */
- & :where(.btn, button, input[type="submit"], input[type="reset"], input[type="button"]):not(.btn-link):not(.btn-ghost):not(.dialog-close):not(.popover-menu *) {
- border-width: 6px; font-weight: 700;
- box-shadow: 0 0 5px rgb(0 0 0 / 0.2), inset 0 0 5px rgb(0 0 0 / 0.2);
- }
- & :is(.btn-primary, .btn-danger) { border-color: var(--spry-border-strong); }
- /* Outline button = the site's secondary: pale berry, deeper mat */
- & .btn-outline {
- background: var(--formal-berry-pale); border-color: var(--formal-berry-mat);
- color: #444444;
- &:hover {
- background: #f4ecf0; border-color: var(--spry-border-strong); color: #444444;
- }
- }
- /* Inputs/selects/textareas: transparent wells, 2px berry hairline,
- 8px padding — exactly the site's recipe */
- & :where(input[type="text"], input[type="email"], input[type="password"],
- input[type="number"], input[type="search"], input[type="tel"],
- input[type="url"], input[type="date"], input[type="time"],
- input[type="datetime-local"], input[type="month"], input[type="week"],
- input[type="color"], select, textarea, .input) {
- border-width: 2px;
- padding: 8px;
- }
- /* Checkboxes & radios: 20px marks, dark-berry accent (site) */
- & :where(input[type="checkbox"], input[type="radio"]) {
- width: 1.25em; height: 1.25em; accent-color: #60394d;
- }
- & :is(input[type="checkbox"], input[type="radio"]):focus-visible {
- outline: 2px solid var(--spry-accent); outline-offset: 2px;
- }
- /* Choice labels as the site's check-labels: berry frame, 12px radius,
- 8px padding; hover deepens the frame */
- & .choice {
- border: 2px solid var(--spry-border-strong); border-radius: var(--spry-radius);
- padding: 8px;
- &:hover { border-color: var(--spry-accent); }
- }
- & .choices { gap: 12px; }
- /* Selects: swap the native arrow for a small berry serif caret */
- & select:not([size]):not([multiple]) {
- appearance: none; padding-right: 2.1rem;
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1.5 1.5 6 6 10.5 1.5' fill='none' stroke='%23844d6a' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
- background-repeat: no-repeat; background-position: right 0.75rem center;
- }
- /* Expanders as the site's details/summary — MAUVE, not white: pale-mauve
- body, deeper mauve summary bar, plum rule under the open summary */
- & details {
- background: var(--formal-mauve-pale); border: 2px solid var(--formal-mauve);
- border-radius: var(--spry-radius); margin-bottom: 18px; overflow: hidden;
- }
- & details + details { margin-top: 0; }
- & details > summary {
- background: var(--formal-mauve-bar); color: var(--spry-fg);
- font-family: var(--spry-font); font-size: 1.2em; font-weight: 700;
- padding: 8px 18px; border-radius: 0;
- &:hover { background: #bba9c4; }
- }
- & details > summary::before { border-color: #5d4766; }
- & details[open] > summary { border-bottom: 2px solid var(--formal-mauve); }
- & details > :not(summary):not(:last-child) { padding: 18px 18px 0; }
- & details > :not(summary):last-child { padding: 18px; }
- & .expander-group > details { margin-bottom: 0; }
- & .expander-group > details + details { margin-top: -2px; }
- /* Progress: an envelope window — ivory track in a thin gilt frame,
- berry fill with a paper highlight (engine rules kept separate) */
- & progress {
- background: var(--spry-bg-alt);
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 55%, transparent);
- }
- & progress::-webkit-progress-bar {
- background: var(--spry-bg-alt);
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 55%, transparent);
- }
- & progress::-webkit-progress-value {
- background: var(--spry-progress-fg);
- box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.3);
- }
- & progress::-moz-progress-bar {
- background: var(--spry-progress-fg);
- box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.3);
- }
- /* Indeterminate: theme-explicit so it can never be shadowed */
- & progress:indeterminate {
- --spry-pulse-cap: 0.4em;
- background:
- radial-gradient(var(--spry-pulse-cap) var(--spry-pulse-cap) at var(--spry-pulse-cap) 50%, var(--spry-accent) 97%, transparent 100%) 0% 50% / 25% 100% no-repeat,
- radial-gradient(var(--spry-pulse-cap) var(--spry-pulse-cap) at calc(100% - var(--spry-pulse-cap)) 50%, var(--spry-accent) 97%, transparent 100%) 0% 50% / 25% 100% no-repeat,
- linear-gradient(90deg, transparent 0 var(--spry-pulse-cap), var(--spry-accent) var(--spry-pulse-cap) calc(100% - var(--spry-pulse-cap)), transparent calc(100% - var(--spry-pulse-cap))) 0% 50% / 25% 100% no-repeat,
- var(--spry-bg-alt);
- animation: spry-pulse 1.4s linear infinite alternate;
- }
- /* Menu-style tables: no grid box, pale-berry header band, hairline courses */
- & table { border: 0; }
- & thead th {
- color: var(--spry-accent); font-size: 0.85em; text-transform: none;
- font-variant-caps: all-small-caps; letter-spacing: 0.14em;
- border-bottom: 2px solid var(--spry-border-strong);
- }
- & caption { font-style: italic; color: #717171; }
- /* Alerts as enclosure notes; danger = the site's solid .form-errors */
- & .alert {
- border-inline-start: 3px solid var(--spry-accent);
- & p:first-child { font-style: italic; }
- &.alert-success { border-inline-start-color: var(--spry-success); }
- &.alert-warning { border-inline-start-color: var(--spry-warning); color: #7a5719; }
- &.alert-info { border-inline-start-color: var(--spry-info); }
- }
- & .alert.alert-danger {
- background: #b21f1f; border: 0; color: #fff; font-weight: 700;
- & p { font-style: normal; }
- }
- /* Badges as place-card chips: ivory, berry text, berry pill edge */
- & .badge:not(.badge-danger):not(.badge-success):not(.badge-warning):not(.badge-info):not(.badge-muted) {
- background: var(--spry-bg-alt); color: var(--spry-accent);
- border: var(--spry-border-width) solid var(--spry-accent); letter-spacing: 0.03em;
- }
- /* Dialogs, as the suite's invite modal: borderless white card, 16px radius,
- one large soft shadow, roomy padding — and a blurred scrim behind it.
- Anchored popovers keep a clear backdrop (no blur on menus). */
- & dialog,
- & [popover]:has(> .dialog-titlebar, > .dialog-body, > .dialog-footer) {
- border-radius: 1rem;
- box-shadow: 0 15px 50px rgb(63 58 60 / 0.35);
- }
- & dialog { width: min(95vw, 42rem); }
- & dialog::backdrop,
- & [popover]:not(.popover-anchor):not(.drawer-left):not(.drawer-right)::backdrop {
- backdrop-filter: blur(2px);
- }
- & .dialog-body { padding: 1.5rem 2rem; }
- /* Titlebar: the suite's plum-tinted gradient header with a berry rule */
- & .dialog-titlebar {
- background: linear-gradient(135deg, rgb(133 78 106 / 0.16) 0%, rgb(133 78 106 / 0.07) 100%);
- border-bottom: 2px solid color-mix(in srgb, var(--spry-accent) 55%, transparent);
- padding: 1.1rem 1.75rem;
- & .dialog-title {
- font-family: var(--spry-font-heading); font-weight: 600;
- font-size: 1.35rem; color: #854e6a; letter-spacing: 0.01em;
- }
- & .dialog-close {
- border: 0; border-radius: var(--spry-radius-sm);
- background: rgb(133 78 106 / 0.12); color: #6d3e55; font-size: 1.3rem;
- &:hover { background: rgb(133 78 106 / 0.24); color: #53303f; }
- }
- }
- /* Switch: slim gold track, ivory knob */
- & .switch .track {
- width: 2.3rem; height: 1.15rem;
- background: color-mix(in srgb, var(--formal-gold) 28%, var(--spry-surface));
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 50%, transparent);
- &::after {
- top: 0.15rem; left: 0.15rem; width: 0.85rem; height: 0.85rem;
- background: var(--spry-bg); box-shadow: 0 1px 2px rgb(63 58 60 / 0.3);
- }
- }
- & .switch input:checked + .track {
- background: var(--formal-gold);
- &::after { translate: 1.15rem 0; }
- }
- /* ---- Invitation-suite components (section 20) ---- */
- /* Hero as the site header band: plum, white centered text, 40px padding,
- pressed-in shade along the bottom */
- & .hero {
- background: var(--formal-plum); color: #fff; border-block: 0;
- padding-block: 2.5rem;
- box-shadow: inset 0 -10px 6px rgb(0 0 0 / 0.2);
- }
- & .hero-eyebrow {
- display: inline-flex; align-items: center; gap: 0.6rem;
- font-weight: 600; letter-spacing: 0.28em; text-transform: none;
- font-variant-caps: all-small-caps; color: #e4eed3;
- &::before,
- &::after { content: "◆"; color: var(--formal-gold); font-size: 0.45em; }
- }
- & .hero-title {
- font-family: var(--spry-font-display); font-weight: 400;
- color: #fff; letter-spacing: 0; text-shadow: 0 1px 0 rgb(0 0 0 / 0.25);
- }
- & .hero-sub { color: #e4eed3; font-style: italic; }
- /* Avatars: ivory cameos — berry initials in a paper mat, gilt on hover */
- & .avatar {
- background: var(--spry-bg-alt); color: var(--spry-accent);
- border: 1px solid color-mix(in srgb, var(--spry-accent) 30%, var(--spry-border));
- box-shadow: 0 0 0 2px var(--spry-surface), 0 0 0 3px var(--spry-border);
- }
- & .avatar:hover {
- box-shadow: 0 0 0 2px var(--spry-surface), 0 0 0 3px var(--formal-gold),
- 0 3px 8px rgb(63 58 60 / 0.15);
- }
- /* OTP: stationery wells, serif figures, gilded dash */
- & .otp input { background: var(--spry-bg-alt); font-family: var(--spry-font); font-size: 1.4rem; }
- & .otp-separator { color: var(--formal-gold); }
- /* Drawers: ivory panel, plum titlebar like the site's header band */
- & :is(.drawer-left, .drawer-right) {
- background: var(--spry-bg);
- border-color: color-mix(in srgb, var(--spry-accent) 30%, var(--spry-border));
- & .dialog-titlebar {
- background: var(--spry-info);
- border-bottom-color: color-mix(in srgb, var(--formal-gold) 70%, transparent);
- & .dialog-title { color: #fff; }
- & .dialog-close {
- color: #fff; border-color: rgb(255 255 255 / 0.55);
- &:hover { background: #fff; border-color: #fff; color: var(--spry-info); }
- }
- }
- }
- /* Pagination: hairline chips; the current page is a berry wax seal */
- & .pagination :is(a, span) {
- border-color: var(--spry-border); border-radius: var(--spry-radius-pill);
- font-variant-caps: all-small-caps; letter-spacing: 0.06em;
- }
- & .pagination a:hover {
- background: color-mix(in srgb, var(--spry-accent) 8%, var(--spry-surface));
- border-color: color-mix(in srgb, var(--spry-accent) 45%, var(--spry-border));
- }
- & .pagination [aria-current="page"] {
- background: var(--spry-accent); border-color: var(--spry-border-strong);
- color: #fff; box-shadow: 0 0 5px rgb(0 0 0 / 0.2);
- }
- }
|