spry-theme-formal.css 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*!
  2. * Spry CSS theme — "Formal" — wedding-stationery suite, second fidelity
  3. * pass against the real wedding site: plum header/footer bands, mauve nav
  4. * band and mauve expanders (never white), berry buttons in thick pale-berry
  5. * mats, frosted panels with the double pressed shadow, script form labels,
  6. * ivory paper, serif ink. Light-only. Activated with <html data-theme=
  7. * "formal"> or the demo radio #spry-theme-formal. Load after spry.css.
  8. * No JavaScript or imports; stacks fall back to Georgia / cursive.
  9. */
  10. [data-theme="formal"],
  11. html:has(#spry-theme-formal:checked) {
  12. color-scheme: light;
  13. /* ---- Palette (the core derives soft tints automatically) ---- */
  14. --spry-bg: #fdfbf7; /* ivory paper */
  15. --spry-bg-alt: #f7f2ec; /* stationery bands, wells, titlebars */
  16. --spry-bg-inset: #f3ece2; /* disabled fills, code blocks */
  17. --spry-surface: #ffffff; /* popovers, menus, tables: kept opaque */
  18. --spry-surface-hover: #faf6ef;
  19. --spry-fg: #3f3a3c; /* ink */
  20. --spry-fg-muted: #7d7379;
  21. --spry-border: #e6dcd2; /* hairlines */
  22. --spry-border-strong: #b47e9a; /* berry mat hsl(329 26% 60%) */
  23. --spry-accent: #844d6a; /* berry — hsl(329 26% 41%), site buttons */
  24. --spry-accent-hover: #915574; /* site hover lightens to hsl(329 26% 45%) */
  25. --spry-accent-fg: #ffffff;
  26. --spry-danger: #a6304c; /* deep rose */
  27. --spry-success: #5e713d; /* sage green — hsl(82 30% 34%) */
  28. --spry-warning: #8f6824; /* antique gold */
  29. --spry-info: #6f5a7c; /* plum */
  30. --spry-link: var(--spry-success); /* sage links, as on the site */
  31. --spry-link-hover: #49582f;
  32. --spry-backdrop: rgb(63 58 60 / 0.5);
  33. --formal-gold: #b08d3e; /* gilded hairlines, fleurons, frames */
  34. --formal-plum: #854e6a; /* site header / footer plum */
  35. --formal-mauve: #80628f; /* hsl(280 19% 47%): nav band, expander edge */
  36. --formal-mauve-bar: #c3b3cb; /* hsl(280 19% 75%): expander summary bar */
  37. --formal-mauve-pale: #e7e1ea; /* hsl(280 19% 90%): expander body */
  38. --formal-berry-pale: #ecdfe6; /* hsl(329 26% 90%): secondary fill */
  39. --formal-berry-mat: #d0afc0; /* hsl(329 26% 75%): secondary mat */
  40. /* ---- Typography ---- */
  41. --spry-font: "Cormorant Garamond", "EB Garamond", Georgia, serif;
  42. --spry-font-heading: var(--spry-font);
  43. --spry-font-display: "Snell Roundhand", "Apple Chancery", "Segoe Script",
  44. "Brush Script MT", cursive; /* script: h1, hero, brand, form labels */
  45. --spry-font-mono: ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace;
  46. --spry-font-size: 1.125rem; /* generous: the site set p/form text to 1.2em */
  47. --spry-line-height: 1.65;
  48. --spry-heading-weight: 600;
  49. /* ---- Shape, depth, motion ---- */
  50. --spry-radius: 0.75rem; /* 12px — the site's only radius */
  51. --spry-radius-sm: 0.75rem; /* 12px here too: chips, menu items */
  52. --spry-radius-lg: 0.75rem;
  53. --spry-radius-pill: 999px;
  54. --spry-border-width: 1px;
  55. --spry-shadow: 0 1px 2px rgb(63 58 60 / 0.05), 0 6px 18px -6px rgb(63 58 60 / 0.07);
  56. --spry-shadow-lg: 0 24px 48px -16px rgb(63 58 60 / 0.24), 0 6px 16px rgb(63 58 60 / 0.08);
  57. --spry-glass: none;
  58. --spry-transition: 150ms ease;
  59. --spry-dialog-duration: 200ms;
  60. --spry-dialog-ease: cubic-bezier(0.2, 0.9, 0.3, 1);
  61. --spry-dialog-in: translateY(0.6rem) scale(0.98);
  62. --spry-focus-ring: 0 0 0 3px var(--spry-surface), 0 0 0 4px var(--spry-border),
  63. 0 0 0 6px color-mix(in srgb, var(--spry-accent) 30%, transparent);
  64. /* ---- Controls: transparent wells, berry hairline (site inputs) ---- */
  65. --spry-control-bg: transparent;
  66. --spry-control-fg: var(--spry-fg);
  67. --spry-control-border: var(--spry-border-strong);
  68. --spry-control-radius: 0.75rem; /* 12px */
  69. --spry-control-padding-x: 1.35rem; /* buttons: core adds .15rem = 24px */
  70. --spry-control-padding-y: 0.5rem; /* 8px, the site's control padding */
  71. /* ---- Buttons: the site's berry seals (color rides the vars) ---- */
  72. --spry-btn-bg: var(--spry-accent);
  73. --spry-btn-fg: #ffffff;
  74. --spry-btn-border: var(--spry-border-strong);
  75. --spry-btn-bg-hover: var(--spry-accent-hover);
  76. --spry-btn-bg-active: #74445d; /* hsl(329 26% 36%), pressed darker */
  77. /* ---- Cards: frosted panel on a 6px white mat (site form/#response) ---- */
  78. --spry-card-bg: rgb(255 255 255 / 0.5);
  79. --spry-card-border: #ffffff;
  80. --spry-card-padding: 2em; /* the site's 2em panel padding */
  81. --spry-card-shadow: 0 0 5px rgb(0 0 0 / 0.2), inset 0 0 5px rgb(0 0 0 / 0.2);
  82. --spry-table-header-bg: var(--formal-berry-pale);
  83. --spry-table-hover: color-mix(in srgb, var(--spry-accent) 5%, var(--spry-surface));
  84. --spry-progress-bg: var(--spry-bg-alt);
  85. --spry-progress-fg: var(--spry-accent);
  86. --spry-popover-bg: var(--spry-surface);
  87. --spry-popover-border: var(--spry-border);
  88. --spry-popover-shadow: var(--spry-shadow-lg);
  89. /* ---- Structural polish (looks the variables can't reach) ---- */
  90. /* Letterpress headings: small-caps, letter-spaced, debossed ink.
  91. h1 is the script display moment — swashes in berry. */
  92. & :is(h2, h3, h4, h5, .card-title) {
  93. font-variant-caps: all-small-caps; letter-spacing: 0.08em;
  94. text-shadow: 0 1px 0 #fff;
  95. }
  96. /* :where() keeps these at (0,1,0) — sibling themes use the same idiom —
  97. so container-scoped scales in the core (.prose h1, .prose h2) still
  98. win by load order instead of losing to a full (0,1,1) match. The size
  99. rules additionally opt out of .prose: the radio switcher route
  100. (html:has(#spry-theme-formal:checked)) carries an ID of specificity
  101. that would otherwise flatten the core's document scale even through
  102. :where(). */
  103. & :where(h2:not(.prose *)) { font-size: 2em; } /* the site's h2 scale */
  104. & :where(h1) {
  105. font-family: var(--spry-font-display); font-weight: 400;
  106. line-height: 1.25;
  107. color: var(--spry-accent); text-shadow: 0 1px 0 #fff;
  108. }
  109. & :where(h1:not(.prose *)) {
  110. font-size: clamp(2.3rem, 1.7rem + 2.4vw, 3.3rem);
  111. }
  112. & h6 { letter-spacing: 0.12em; text-shadow: 0 1px 0 #fff; }
  113. /* A card that opens on its title is a hero moment — script it */
  114. & .card > .card-title:first-child {
  115. font-family: var(--spry-font-display); font-variant-caps: normal;
  116. font-weight: 400; font-size: 1.5rem; color: var(--spry-accent); letter-spacing: 0;
  117. }
  118. & .card-subtitle { font-style: italic; }
  119. /* Form labels in script, as the site lettered its form text */
  120. & :is(.label, legend) {
  121. font-family: var(--spry-font-display); font-weight: 600;
  122. font-size: 1.15em; letter-spacing: 0;
  123. }
  124. /* Dividers as menu-card ornaments: hairline with a gold fleuron */
  125. & hr {
  126. position: relative; overflow: visible; border: 0;
  127. border-top: 1px solid color-mix(in srgb, var(--spry-border-strong) 55%, transparent);
  128. margin-block: 2.4rem;
  129. &::after {
  130. content: "❧"; position: absolute; left: 50%; top: 0;
  131. translate: -50% -55%; color: var(--formal-gold);
  132. font-size: 1.15rem; line-height: 1;
  133. }
  134. }
  135. /* Panels & generous spacing: thick stationery mats, 15px+ gutters */
  136. & .card { border-width: 6px; }
  137. & fieldset { padding: 1.25rem 1.5rem; }
  138. & :is(.popover-menu, .submenu) { padding: 0.6rem; }
  139. /* Topbar as the site header: plum band, white text, generous padding,
  140. pressed-in shade along the bottom edge */
  141. & .topbar {
  142. background: var(--formal-plum); color: #fff; border-bottom: 0;
  143. padding-block: clamp(1.1rem, 2.5vw, 2.5rem); /* up to the site's 40px */
  144. box-shadow: inset 0 -10px 6px rgb(0 0 0 / 0.2);
  145. }
  146. & footer.topbar { box-shadow: inset 0 10px 6px rgb(0 0 0 / 0.2); }
  147. /* Brand: script names in white on flanking gilt rules */
  148. & .topbar-brand {
  149. display: inline-flex; align-items: center; gap: 0.65rem;
  150. font-family: var(--spry-font-display); font-weight: 400;
  151. font-size: 1.6rem; letter-spacing: 0; color: #fff;
  152. &::before,
  153. &::after {
  154. content: ""; width: 1.4rem; height: 1px;
  155. background: color-mix(in srgb, var(--formal-gold) 70%, transparent);
  156. transition: width var(--spry-transition);
  157. }
  158. &:hover { color: #fff; }
  159. &:hover::before,
  160. &:hover::after { width: 2.2rem; background: var(--formal-gold); }
  161. }
  162. /* Nav links on paper: engraved small-caps, berry underline on hover */
  163. & .nav a {
  164. font-variant-caps: all-small-caps; font-weight: 500;
  165. letter-spacing: 0.14em; border-radius: 0;
  166. }
  167. & .nav a:hover,
  168. & .nav a.active {
  169. background: transparent; color: var(--spry-accent);
  170. text-decoration: underline; text-decoration-thickness: 1.5px;
  171. text-underline-offset: 0.4em;
  172. }
  173. & .nav a:hover { text-decoration-color: var(--spry-accent); }
  174. & .nav a.active { text-decoration-color: var(--formal-gold); }
  175. /* Nav in the topbar = the site's mauve band with white links */
  176. & .topbar .nav {
  177. background: var(--formal-mauve); border-radius: var(--spry-radius);
  178. padding: 0.35rem 0.65rem; box-shadow: inset 0 -4px 3px rgb(0 0 0 / 0.2);
  179. }
  180. & .topbar .nav a,
  181. & .topbar .nav a:hover,
  182. & .topbar .nav a.active {
  183. background: transparent; color: #fff; text-decoration-color: #fff;
  184. }
  185. /* Menus as menu cards: flat items, gold course marker on hover */
  186. & :is(.menu, .submenu) a { letter-spacing: 0.05em; border-radius: 0; }
  187. & .menu a:hover,
  188. & .menu a.active {
  189. background: color-mix(in srgb, var(--spry-accent) 7%, var(--spry-surface));
  190. box-shadow: inset 2px 0 0 var(--formal-gold);
  191. }
  192. & .submenu a:hover {
  193. background: color-mix(in srgb, var(--spry-accent) 10%, var(--spry-surface));
  194. color: var(--spry-accent);
  195. }
  196. /* Breadcrumbs: legible gold diamond separators */
  197. & .breadcrumb li + li::before {
  198. content: "◆"; font-size: 0.65em; vertical-align: 0.22em; color: var(--formal-gold);
  199. }
  200. /* Buttons: the site's berry seals — thick pale-berry mat border and the
  201. double (outer + inset) pressed shadow. Fill, text, hover and the
  202. 8px 24px padding ride the vars; :where keeps this light enough that
  203. core .btn-sm/.btn-lg sizing at (0,2,0) still wins. */
  204. & :where(.btn, button, input[type="submit"], input[type="reset"], input[type="button"]):not(.btn-link):not(.btn-ghost):not(.dialog-close):not(.popover-menu *) {
  205. border-width: 6px; font-weight: 700;
  206. box-shadow: 0 0 5px rgb(0 0 0 / 0.2), inset 0 0 5px rgb(0 0 0 / 0.2);
  207. }
  208. & :is(.btn-primary, .btn-danger) { border-color: var(--spry-border-strong); }
  209. /* Outline button = the site's secondary: pale berry, deeper mat */
  210. & .btn-outline {
  211. background: var(--formal-berry-pale); border-color: var(--formal-berry-mat);
  212. color: #444444;
  213. &:hover {
  214. background: #f4ecf0; border-color: var(--spry-border-strong); color: #444444;
  215. }
  216. }
  217. /* Inputs/selects/textareas: transparent wells, 2px berry hairline,
  218. 8px padding — exactly the site's recipe */
  219. & :where(input[type="text"], input[type="email"], input[type="password"],
  220. input[type="number"], input[type="search"], input[type="tel"],
  221. input[type="url"], input[type="date"], input[type="time"],
  222. input[type="datetime-local"], input[type="month"], input[type="week"],
  223. input[type="color"], select, textarea, .input) {
  224. border-width: 2px;
  225. padding: 8px;
  226. }
  227. /* Checkboxes & radios: 20px marks, dark-berry accent (site) */
  228. & :where(input[type="checkbox"], input[type="radio"]) {
  229. width: 1.25em; height: 1.25em; accent-color: #60394d;
  230. }
  231. & :is(input[type="checkbox"], input[type="radio"]):focus-visible {
  232. outline: 2px solid var(--spry-accent); outline-offset: 2px;
  233. }
  234. /* Choice labels as the site's check-labels: berry frame, 12px radius,
  235. 8px padding; hover deepens the frame */
  236. & .choice {
  237. border: 2px solid var(--spry-border-strong); border-radius: var(--spry-radius);
  238. padding: 8px;
  239. &:hover { border-color: var(--spry-accent); }
  240. }
  241. & .choices { gap: 12px; }
  242. /* Selects: swap the native arrow for a small berry serif caret */
  243. & select:not([size]):not([multiple]) {
  244. appearance: none; padding-right: 2.1rem;
  245. 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");
  246. background-repeat: no-repeat; background-position: right 0.75rem center;
  247. }
  248. /* Expanders as the site's details/summary — MAUVE, not white: pale-mauve
  249. body, deeper mauve summary bar, plum rule under the open summary */
  250. & details {
  251. background: var(--formal-mauve-pale); border: 2px solid var(--formal-mauve);
  252. border-radius: var(--spry-radius); margin-bottom: 18px; overflow: hidden;
  253. }
  254. & details + details { margin-top: 0; }
  255. & details > summary {
  256. background: var(--formal-mauve-bar); color: var(--spry-fg);
  257. font-family: var(--spry-font); font-size: 1.2em; font-weight: 700;
  258. padding: 8px 18px; border-radius: 0;
  259. &:hover { background: #bba9c4; }
  260. }
  261. & details > summary::before { border-color: #5d4766; }
  262. & details[open] > summary { border-bottom: 2px solid var(--formal-mauve); }
  263. & details > :not(summary):not(:last-child) { padding: 18px 18px 0; }
  264. & details > :not(summary):last-child { padding: 18px; }
  265. & .expander-group > details { margin-bottom: 0; }
  266. & .expander-group > details + details { margin-top: -2px; }
  267. /* Progress: an envelope window — ivory track in a thin gilt frame,
  268. berry fill with a paper highlight (engine rules kept separate) */
  269. & progress {
  270. background: var(--spry-bg-alt);
  271. box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 55%, transparent);
  272. }
  273. & progress::-webkit-progress-bar {
  274. background: var(--spry-bg-alt);
  275. box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 55%, transparent);
  276. }
  277. & progress::-webkit-progress-value {
  278. background: var(--spry-progress-fg);
  279. box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.3);
  280. }
  281. & progress::-moz-progress-bar {
  282. background: var(--spry-progress-fg);
  283. box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.3);
  284. }
  285. /* Indeterminate: theme-explicit so it can never be shadowed */
  286. & progress:indeterminate {
  287. --spry-pulse-cap: 0.4em;
  288. background:
  289. 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,
  290. 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,
  291. 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,
  292. var(--spry-bg-alt);
  293. animation: spry-pulse 1.4s linear infinite alternate;
  294. }
  295. /* Menu-style tables: no grid box, pale-berry header band, hairline courses */
  296. & table { border: 0; }
  297. & thead th {
  298. color: var(--spry-accent); font-size: 0.85em; text-transform: none;
  299. font-variant-caps: all-small-caps; letter-spacing: 0.14em;
  300. border-bottom: 2px solid var(--spry-border-strong);
  301. }
  302. & caption { font-style: italic; color: #717171; }
  303. /* Alerts as enclosure notes; danger = the site's solid .form-errors */
  304. & .alert {
  305. border-inline-start: 3px solid var(--spry-accent);
  306. & p:first-child { font-style: italic; }
  307. &.alert-success { border-inline-start-color: var(--spry-success); }
  308. &.alert-warning { border-inline-start-color: var(--spry-warning); color: #7a5719; }
  309. &.alert-info { border-inline-start-color: var(--spry-info); }
  310. }
  311. & .alert.alert-danger {
  312. background: #b21f1f; border: 0; color: #fff; font-weight: 700;
  313. & p { font-style: normal; }
  314. }
  315. /* Badges as place-card chips: ivory, berry text, berry pill edge */
  316. & .badge:not(.badge-danger):not(.badge-success):not(.badge-warning):not(.badge-info):not(.badge-muted) {
  317. background: var(--spry-bg-alt); color: var(--spry-accent);
  318. border: var(--spry-border-width) solid var(--spry-accent); letter-spacing: 0.03em;
  319. }
  320. /* Dialogs, as the suite's invite modal: borderless white card, 16px radius,
  321. one large soft shadow, roomy padding — and a blurred scrim behind it.
  322. Anchored popovers keep a clear backdrop (no blur on menus). */
  323. & dialog,
  324. & [popover]:has(> .dialog-titlebar, > .dialog-body, > .dialog-footer) {
  325. border-radius: 1rem;
  326. box-shadow: 0 15px 50px rgb(63 58 60 / 0.35);
  327. }
  328. & dialog { width: min(95vw, 42rem); }
  329. & dialog::backdrop,
  330. & [popover]:not(.popover-anchor):not(.drawer-left):not(.drawer-right)::backdrop {
  331. backdrop-filter: blur(2px);
  332. }
  333. & .dialog-body { padding: 1.5rem 2rem; }
  334. /* Titlebar: the suite's plum-tinted gradient header with a berry rule */
  335. & .dialog-titlebar {
  336. background: linear-gradient(135deg, rgb(133 78 106 / 0.16) 0%, rgb(133 78 106 / 0.07) 100%);
  337. border-bottom: 2px solid color-mix(in srgb, var(--spry-accent) 55%, transparent);
  338. padding: 1.1rem 1.75rem;
  339. & .dialog-title {
  340. font-family: var(--spry-font-heading); font-weight: 600;
  341. font-size: 1.35rem; color: #854e6a; letter-spacing: 0.01em;
  342. }
  343. & .dialog-close {
  344. border: 0; border-radius: var(--spry-radius-sm);
  345. background: rgb(133 78 106 / 0.12); color: #6d3e55; font-size: 1.3rem;
  346. &:hover { background: rgb(133 78 106 / 0.24); color: #53303f; }
  347. }
  348. }
  349. /* Switch: slim gold track, ivory knob */
  350. & .switch .track {
  351. width: 2.3rem; height: 1.15rem;
  352. background: color-mix(in srgb, var(--formal-gold) 28%, var(--spry-surface));
  353. box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--formal-gold) 50%, transparent);
  354. &::after {
  355. top: 0.15rem; left: 0.15rem; width: 0.85rem; height: 0.85rem;
  356. background: var(--spry-bg); box-shadow: 0 1px 2px rgb(63 58 60 / 0.3);
  357. }
  358. }
  359. & .switch input:checked + .track {
  360. background: var(--formal-gold);
  361. &::after { translate: 1.15rem 0; }
  362. }
  363. /* ---- Invitation-suite components (section 20) ---- */
  364. /* Hero as the site header band: plum, white centered text, 40px padding,
  365. pressed-in shade along the bottom */
  366. & .hero {
  367. background: var(--formal-plum); color: #fff; border-block: 0;
  368. padding-block: 2.5rem;
  369. box-shadow: inset 0 -10px 6px rgb(0 0 0 / 0.2);
  370. }
  371. & .hero-eyebrow {
  372. display: inline-flex; align-items: center; gap: 0.6rem;
  373. font-weight: 600; letter-spacing: 0.28em; text-transform: none;
  374. font-variant-caps: all-small-caps; color: #e4eed3;
  375. &::before,
  376. &::after { content: "◆"; color: var(--formal-gold); font-size: 0.45em; }
  377. }
  378. & .hero-title {
  379. font-family: var(--spry-font-display); font-weight: 400;
  380. color: #fff; letter-spacing: 0; text-shadow: 0 1px 0 rgb(0 0 0 / 0.25);
  381. }
  382. & .hero-sub { color: #e4eed3; font-style: italic; }
  383. /* Avatars: ivory cameos — berry initials in a paper mat, gilt on hover */
  384. & .avatar {
  385. background: var(--spry-bg-alt); color: var(--spry-accent);
  386. border: 1px solid color-mix(in srgb, var(--spry-accent) 30%, var(--spry-border));
  387. box-shadow: 0 0 0 2px var(--spry-surface), 0 0 0 3px var(--spry-border);
  388. }
  389. & .avatar:hover {
  390. box-shadow: 0 0 0 2px var(--spry-surface), 0 0 0 3px var(--formal-gold),
  391. 0 3px 8px rgb(63 58 60 / 0.15);
  392. }
  393. /* OTP: stationery wells, serif figures, gilded dash */
  394. & .otp input { background: var(--spry-bg-alt); font-family: var(--spry-font); font-size: 1.4rem; }
  395. & .otp-separator { color: var(--formal-gold); }
  396. /* Drawers: ivory panel, plum titlebar like the site's header band */
  397. & :is(.drawer-left, .drawer-right) {
  398. background: var(--spry-bg);
  399. border-color: color-mix(in srgb, var(--spry-accent) 30%, var(--spry-border));
  400. & .dialog-titlebar {
  401. background: var(--spry-info);
  402. border-bottom-color: color-mix(in srgb, var(--formal-gold) 70%, transparent);
  403. & .dialog-title { color: #fff; }
  404. & .dialog-close {
  405. color: #fff; border-color: rgb(255 255 255 / 0.55);
  406. &:hover { background: #fff; border-color: #fff; color: var(--spry-info); }
  407. }
  408. }
  409. }
  410. /* Pagination: hairline chips; the current page is a berry wax seal */
  411. & .pagination :is(a, span) {
  412. border-color: var(--spry-border); border-radius: var(--spry-radius-pill);
  413. font-variant-caps: all-small-caps; letter-spacing: 0.06em;
  414. }
  415. & .pagination a:hover {
  416. background: color-mix(in srgb, var(--spry-accent) 8%, var(--spry-surface));
  417. border-color: color-mix(in srgb, var(--spry-accent) 45%, var(--spry-border));
  418. }
  419. & .pagination [aria-current="page"] {
  420. background: var(--spry-accent); border-color: var(--spry-border-strong);
  421. color: #fff; box-shadow: 0 0 5px rgb(0 0 0 / 0.2);
  422. }
  423. }