zenquality.css 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. /*
  2. * ZenQuality — client handover stylesheet
  3. * Used to render LIVRAISON.md / HANDOVER.md as a branded HTML/PDF.
  4. * Source brand tokens: zenquality.fr (CSS custom properties extracted from
  5. * the live site) — Inter (body) + Playfair Display (headings), green palette.
  6. */
  7. @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:wght@400;600;700&display=swap');
  8. :root {
  9. --green-dark: #1A3A25;
  10. --green-forest: #2D5A3D;
  11. --green-moss: #4A7C59;
  12. --green-sage: #87A878;
  13. --black-deep: #0A0A0A;
  14. --black-soft: #1A1A1A;
  15. --gray-dark: #2A2A2A;
  16. --gray-mid: #666666;
  17. --gray-light: #B0B0B0;
  18. --white-cream: #F5F0EB;
  19. --white-pure: #FFFFFF;
  20. --status-ok: #2D5A3D;
  21. --status-warn: #b58900;
  22. --status-fail: #a83232;
  23. }
  24. @page {
  25. size: A4;
  26. margin: 22mm 18mm 22mm 18mm;
  27. @top-right {
  28. content: string(doctitle);
  29. font-family: 'Inter', sans-serif;
  30. font-size: 8.5pt;
  31. color: var(--green-moss);
  32. }
  33. @bottom-right {
  34. content: counter(page) " / " counter(pages);
  35. font-family: 'Inter', sans-serif;
  36. font-size: 8.5pt;
  37. color: var(--gray-mid);
  38. }
  39. @bottom-left {
  40. content: "ZenQuality — zenquality.fr";
  41. font-family: 'Inter', sans-serif;
  42. font-size: 8.5pt;
  43. color: var(--gray-mid);
  44. }
  45. }
  46. @page :first {
  47. margin: 0;
  48. @top-right { content: ""; }
  49. @bottom-right { content: ""; }
  50. @bottom-left { content: ""; }
  51. }
  52. * { box-sizing: border-box; }
  53. html, body {
  54. margin: 0;
  55. padding: 0;
  56. font-family: 'Inter', system-ui, -apple-system, sans-serif;
  57. font-size: 10.5pt;
  58. line-height: 1.6;
  59. color: var(--black-deep);
  60. background: var(--white-pure);
  61. }
  62. /* ============ COVER PAGE ============ */
  63. .cover {
  64. page-break-after: always;
  65. height: 297mm;
  66. width: 210mm;
  67. padding: 35mm 22mm 22mm 22mm;
  68. background:
  69. radial-gradient(ellipse at top right, rgba(135, 168, 120, 0.18) 0%, transparent 55%),
  70. radial-gradient(ellipse at bottom left, rgba(74, 124, 89, 0.10) 0%, transparent 55%),
  71. var(--white-cream);
  72. position: relative;
  73. display: flex;
  74. flex-direction: column;
  75. justify-content: space-between;
  76. page: cover;
  77. }
  78. .cover::before {
  79. content: "";
  80. position: absolute;
  81. top: 0;
  82. left: 0;
  83. right: 0;
  84. height: 8mm;
  85. background: linear-gradient(90deg, var(--green-dark), var(--green-forest), var(--green-moss));
  86. }
  87. .cover-header {
  88. display: flex;
  89. align-items: flex-start;
  90. justify-content: space-between;
  91. }
  92. .cover-logo {
  93. width: 55mm;
  94. height: auto;
  95. max-height: 30mm;
  96. object-fit: contain;
  97. }
  98. .cover-tagline {
  99. font-family: 'Playfair Display', Georgia, serif;
  100. font-size: 10pt;
  101. font-style: italic;
  102. color: var(--green-forest);
  103. text-align: right;
  104. max-width: 70mm;
  105. margin-top: 6mm;
  106. }
  107. .cover-body {
  108. flex: 1;
  109. display: flex;
  110. flex-direction: column;
  111. justify-content: center;
  112. margin: -10mm 0 0 0;
  113. }
  114. .cover-eyebrow {
  115. font-family: 'Inter', sans-serif;
  116. font-size: 9pt;
  117. font-weight: 600;
  118. text-transform: uppercase;
  119. letter-spacing: 0.18em;
  120. color: var(--green-moss);
  121. margin-bottom: 6mm;
  122. }
  123. .cover-title {
  124. font-family: 'Playfair Display', Georgia, serif;
  125. font-size: 34pt;
  126. font-weight: 700;
  127. color: var(--green-dark);
  128. line-height: 1.1;
  129. margin: 0 0 6mm 0;
  130. letter-spacing: -0.015em;
  131. }
  132. .cover-subtitle {
  133. font-family: 'Playfair Display', Georgia, serif;
  134. font-size: 16pt;
  135. font-weight: 400;
  136. font-style: italic;
  137. color: var(--green-forest);
  138. margin: 0 0 18mm 0;
  139. max-width: 140mm;
  140. }
  141. .cover-meta {
  142. font-family: 'Inter', sans-serif;
  143. font-size: 10.5pt;
  144. color: var(--black-soft);
  145. line-height: 1.9;
  146. border-left: 2px solid var(--green-moss);
  147. padding-left: 5mm;
  148. }
  149. .cover-meta strong {
  150. color: var(--green-dark);
  151. font-weight: 600;
  152. display: inline-block;
  153. min-width: 25mm;
  154. }
  155. .cover-footer {
  156. font-family: 'Inter', sans-serif;
  157. font-size: 9pt;
  158. color: var(--gray-mid);
  159. border-top: 1px solid var(--green-sage);
  160. padding-top: 5mm;
  161. display: flex;
  162. justify-content: space-between;
  163. }
  164. .cover-footer a {
  165. color: var(--green-forest);
  166. text-decoration: none;
  167. font-weight: 500;
  168. }
  169. .cover-footer a:hover { color: var(--green-dark); }
  170. /* ============ DOCUMENT BODY ============ */
  171. .content {
  172. string-set: doctitle attr(data-title);
  173. }
  174. h1 {
  175. font-family: 'Playfair Display', Georgia, serif;
  176. font-size: 22pt;
  177. font-weight: 700;
  178. color: var(--green-dark);
  179. margin: 0 0 6mm 0;
  180. page-break-after: avoid;
  181. string-set: doctitle content();
  182. }
  183. h2 {
  184. font-family: 'Playfair Display', Georgia, serif;
  185. font-size: 17pt;
  186. font-weight: 600;
  187. color: var(--green-forest);
  188. margin: 12mm 0 4mm 0;
  189. padding-bottom: 2.5mm;
  190. border-bottom: 2px solid var(--green-sage);
  191. page-break-before: always;
  192. page-break-after: avoid;
  193. }
  194. .content > h2:first-of-type,
  195. h2.no-break,
  196. h2.continue {
  197. page-break-before: auto;
  198. }
  199. h3 {
  200. font-family: 'Playfair Display', Georgia, serif;
  201. font-size: 13.5pt;
  202. font-weight: 600;
  203. color: var(--green-forest);
  204. margin: 8mm 0 3mm 0;
  205. page-break-after: avoid;
  206. }
  207. h4 {
  208. font-family: 'Inter', sans-serif;
  209. font-size: 10pt;
  210. font-weight: 600;
  211. color: var(--green-moss);
  212. margin: 6mm 0 2mm 0;
  213. text-transform: uppercase;
  214. letter-spacing: 0.06em;
  215. page-break-after: avoid;
  216. }
  217. p { margin: 0 0 3mm 0; }
  218. p, li { orphans: 3; widows: 3; }
  219. ul, ol { margin: 0 0 3mm 0; padding-left: 6mm; }
  220. ul li, ol li { margin: 0 0 1.5mm 0; }
  221. ul li::marker { color: var(--green-moss); }
  222. ol li::marker { color: var(--green-moss); font-weight: 600; }
  223. strong { color: var(--green-dark); font-weight: 600; }
  224. em { color: var(--green-forest); font-style: italic; }
  225. blockquote {
  226. border-left: 3px solid var(--green-moss);
  227. padding: 3mm 5mm;
  228. margin: 4mm 0;
  229. background: var(--white-cream);
  230. color: var(--gray-dark);
  231. font-style: italic;
  232. page-break-inside: avoid;
  233. }
  234. blockquote p:last-child { margin-bottom: 0; }
  235. a { color: var(--green-forest); text-decoration: underline; text-decoration-thickness: 0.5pt; text-underline-offset: 1.5pt; }
  236. a:hover { color: var(--green-dark); }
  237. code {
  238. font-family: 'JetBrains Mono', 'Fira Code', Menlo, monospace;
  239. font-size: 9pt;
  240. background: var(--white-cream);
  241. padding: 0.5mm 1.5mm;
  242. border-radius: 1mm;
  243. color: var(--green-dark);
  244. }
  245. pre {
  246. background: var(--white-cream);
  247. padding: 4mm 5mm;
  248. border-radius: 1.5mm;
  249. border-left: 3px solid var(--green-moss);
  250. font-size: 8.5pt;
  251. line-height: 1.45;
  252. white-space: pre-wrap;
  253. word-wrap: break-word;
  254. page-break-inside: avoid;
  255. margin: 4mm 0;
  256. }
  257. pre code { background: none; padding: 0; color: var(--black-deep); font-size: inherit; }
  258. /* ============ TABLES ============ */
  259. table {
  260. width: 100%;
  261. border-collapse: collapse;
  262. margin: 4mm 0;
  263. font-size: 9.5pt;
  264. page-break-inside: avoid;
  265. }
  266. th {
  267. font-family: 'Inter', sans-serif;
  268. background: var(--green-forest);
  269. color: var(--white-pure);
  270. text-align: left;
  271. padding: 2.5mm 3mm;
  272. font-weight: 600;
  273. font-size: 9pt;
  274. text-transform: uppercase;
  275. letter-spacing: 0.04em;
  276. border-bottom: 0;
  277. }
  278. td {
  279. padding: 2.5mm 3mm;
  280. border-bottom: 1px solid var(--green-sage);
  281. vertical-align: top;
  282. }
  283. tr:nth-child(even) td { background: rgba(245, 240, 235, 0.55); }
  284. /* Numeric / status cols of score tables auto-detected via header text */
  285. table th:nth-child(2),
  286. table th:nth-child(3),
  287. table th:nth-child(4),
  288. table td:nth-child(2),
  289. table td:nth-child(3),
  290. table td:nth-child(4) {
  291. text-align: right;
  292. font-variant-numeric: tabular-nums;
  293. }
  294. table th:last-child,
  295. table td:last-child {
  296. text-align: center;
  297. }
  298. /* ============ CHECKLISTS ============ */
  299. ul.checklist,
  300. ul.task-list {
  301. list-style: none;
  302. padding-left: 0;
  303. }
  304. ul.checklist li,
  305. ul.task-list li {
  306. padding-left: 8mm;
  307. position: relative;
  308. margin-bottom: 2.5mm;
  309. }
  310. ul.checklist li::before,
  311. ul.task-list li::before,
  312. li input[type="checkbox"] + *,
  313. li.task-list-item::before {
  314. content: "☐";
  315. position: absolute;
  316. left: 0;
  317. color: var(--green-moss);
  318. font-size: 12pt;
  319. line-height: 1;
  320. }
  321. input[type="checkbox"] {
  322. display: none;
  323. }
  324. input[type="checkbox"]:checked + label::before {
  325. content: "☑";
  326. color: var(--green-forest);
  327. }
  328. /* ============ CALLOUTS ============ */
  329. .callout {
  330. padding: 4mm 6mm;
  331. margin: 4mm 0;
  332. border-radius: 2mm;
  333. page-break-inside: avoid;
  334. font-size: 10pt;
  335. }
  336. .callout.info {
  337. background: var(--white-cream);
  338. border-left: 4px solid var(--green-moss);
  339. }
  340. .callout.warn {
  341. background: #fdf6e3;
  342. border-left: 4px solid var(--status-warn);
  343. }
  344. .callout.success {
  345. background: rgba(135, 168, 120, 0.14);
  346. border-left: 4px solid var(--green-forest);
  347. }
  348. .callout-title {
  349. font-family: 'Inter', sans-serif;
  350. font-weight: 600;
  351. font-size: 10pt;
  352. color: var(--green-dark);
  353. margin-bottom: 2mm;
  354. text-transform: uppercase;
  355. letter-spacing: 0.04em;
  356. }
  357. /* ============ SECTION DIVIDERS ============ */
  358. hr {
  359. border: none;
  360. border-top: 1px solid var(--green-sage);
  361. margin: 8mm 0;
  362. }
  363. /* ============ STATUS PILLS (used by text replacement) ============ */
  364. .status-ok { color: var(--status-ok); font-weight: 600; }
  365. .status-warn { color: var(--status-warn); font-weight: 600; }
  366. .status-fail { color: var(--status-fail); font-weight: 600; }
  367. /* ============ LINK BEHAVIOR IN PRINT ============ */
  368. @media print {
  369. a[href^="http"]::after {
  370. content: " (" attr(href) ")";
  371. font-size: 7.5pt;
  372. color: var(--gray-mid);
  373. font-style: italic;
  374. font-weight: 400;
  375. }
  376. a[href^="#"]::after,
  377. a[href^="mailto:"]::after,
  378. a[href^="tel:"]::after,
  379. .cover a::after,
  380. table a::after { content: ""; }
  381. }