From 3e93150c761cda2abf6feea7b9a12ac04e8b55b8 Mon Sep 17 00:00:00 2001 From: Pontoporeia Date: Sun, 5 Jul 2026 11:00:20 +0200 Subject: [PATCH] justfile: standardise test recipes to lint-php/lint-css/lint-js/test + add fix recipe - Removed ambiguous aliases: phpstan, cs-check, syntax - Split lint-biome into lint-css and lint-js with correct paths - Added lint meta-recipe and fix recipe (biome --unsafe + php-cs-fixer) - Fixed FormBootstrap dead null check, CSS shorthand override bug - Updated phpstan baseline, suppressed noDescendingSpecificity/noInnerDeclarations - Applied ~74 biome auto-fixes across CSS/JS --- .php-cs-fixer.cache | 2 +- TODO.md | 2 +- app/public/assets/css/admin.css | 2457 +++++++++-------- app/public/assets/css/base.css | 85 +- app/public/assets/css/colors.css | 132 +- app/public/assets/css/components/badges.css | 46 +- app/public/assets/css/components/buttons.css | 161 +- app/public/assets/css/components/details.css | 40 +- app/public/assets/css/components/dialog.css | 14 +- app/public/assets/css/components/focus.css | 8 +- app/public/assets/css/components/forms.css | 130 +- app/public/assets/css/components/header.css | 276 +- app/public/assets/css/components/links.css | 10 +- app/public/assets/css/components/media.css | 6 +- .../assets/css/components/pagination.css | 68 +- app/public/assets/css/components/search.css | 70 +- app/public/assets/css/components/tables.css | 42 +- app/public/assets/css/components/toast.css | 92 +- app/public/assets/css/components/toc.css | 146 +- app/public/assets/css/content-page.css | 280 +- app/public/assets/css/file-access.css | 246 +- app/public/assets/css/form-admin.css | 310 +-- app/public/assets/css/form-base.css | 1368 ++++----- app/public/assets/css/public.css | 344 +-- app/public/assets/css/repertoire.css | 1150 ++++---- app/public/assets/css/reset.css | 119 +- app/public/assets/css/system.css | 513 ++-- app/public/assets/css/tfe.css | 282 +- app/public/assets/css/typography.css | 116 +- app/public/assets/css/utilities.css | 58 +- .../assets/js/app/admin-acces-sharelink.js | 58 +- app/public/assets/js/app/admin-acces.js | 150 +- .../assets/js/app/admin-cleanup-bulk.js | 115 +- .../assets/js/app/admin-contacts-form.js | 147 +- .../assets/js/app/admin-contenus-langues.js | 191 +- .../assets/js/app/admin-contenus-motscles.js | 189 +- app/public/assets/js/app/admin-file-access.js | 12 +- app/public/assets/js/app/admin-index-bulk.js | 203 +- app/public/assets/js/app/admin-tags.js | 111 +- app/public/assets/js/app/admin-toc.js | 181 +- app/public/assets/js/app/autosave-handler.js | 2 - .../assets/js/app/file-upload-filepond.js | 18 +- .../assets/js/app/form-duration-toggle.js | 32 +- app/public/assets/js/app/form-jury-fields.js | 110 +- .../assets/js/app/form-language-asterisk.js | 44 +- app/public/assets/js/app/htmx-global-setup.js | 55 +- .../assets/js/app/repertoire-accordion.js | 142 +- .../js/app/repertoire-scroll-restore.js | 100 +- .../js/app/repertoire-student-popover.js | 90 +- .../assets/js/app/sidebar-links-editor.js | 73 +- app/public/assets/js/app/smtp-error-focus.js | 14 +- app/src/Form/FormBootstrap.php | 3 - biome.json | 8 +- justfile | 2 +- phpstan-baseline.neon | 12 + scripts/build-css.mjs | 7 +- scripts/build-js.mjs | 7 +- scripts/build.mjs | 2 +- scripts/check-build.mjs | 4 +- 59 files changed, 5459 insertions(+), 5196 deletions(-) diff --git a/.php-cs-fixer.cache b/.php-cs-fixer.cache index f228ce5..a281cfc 100644 --- a/.php-cs-fixer.cache +++ b/.php-cs-fixer.cache @@ -1 +1 @@ -{"php":"8.5.7","version":"3.95.2:v3.95.2#a28d88a5e172b27e78d0816992b15a9df3da20f1","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_anonymous_functions":false,"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"modifier_keywords":true,"new_with_parentheses":{"anonymous_class":true},"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"sort_algorithm":"alpha"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":{"closure_fn_spacing":"one"},"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"after_heredoc":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true,"clean_namespace":true,"no_unset_cast":true,"assign_null_coalescing_to_coalesce_equal":true,"normalize_index_brace":true,"heredoc_indentation":true,"no_whitespace_before_comma_in_array":{"after_heredoc":true},"trailing_comma_in_multiline":true,"list_syntax":true,"ternary_to_null_coalescing":true,"array_syntax":{"syntax":"short"},"no_unused_imports":true,"single_quote":true},"ruleCustomisationPolicyVersion":"null-policy","hashes":{"tests\/phpunit\/ErrorHandlerTest.php":"2005e176a105511fc19e853fb4799456","tests\/phpunit\/ShareLinkExtendedTest.php":"778d8cb9052714f36466d17ed8bf40e9","tests\/phpunit\/TfeControllerOgTest.php":"53eefeea18c8d25aec47d59a9c7565a3","tests\/TestDatabase.php":"7b8301cbfadb1a3c02ccfcef8edc1115","tests\/bootstrap.php":"f7b19885b338519f4439e9153ee008aa","app\/src\/DatabaseMigrations.php":"1d9b6a4acddc4fba345c3307577a3111","app\/src\/icon.php":"f46d6a51fb44870a6a8a0cd094ddbfa0","app\/src\/StudentEmail.php":"344309b5b3703b34e97cdeca38de7644","app\/src\/DuplicateThesisException.php":"52abe5f40ef48cfbfd44c119d91309e9","app\/src\/PeerTubeService.php":"e3d8346ff21d0291643466825371a6a0","app\/src\/AppLogger.php":"fe8435f658a74e88d4ffa6bbc83895d6","app\/src\/SmtpRelay.php":"58b659727976e5bafc99830b0ca6cb33","app\/src\/Form\/FormBootstrap.php":"6bafe26abd8ae7922c6edcc027cfa440","app\/src\/Audit.php":"aec9fbbe8d8eefa8fc657884e8df9b42","app\/src\/Crypto.php":"e72e65eeaf5b6fa8e41ba4501643440b","app\/src\/ErrorHandler.php":"e9407d408af265ae3d043f63a00d3724","app\/src\/AdminAuth.php":"824f497dfc2fcd360b6d82100fa98707","app\/src\/FragmentRenderer.php":"52083e1f2ff98f01e074a93bf6765366","app\/src\/Dispatcher.php":"e233ceb92678bffe6bb343174c7c58b5","app\/src\/EmailObfuscator.php":"ff946c10add222870223b9626990e75c","app\/src\/RateLimit.php":"2e1df734570cb3eb584682bed33a2636","app\/src\/MarkdownHelper.php":"6431d3fcc73e8719b3abb4d81808a90a","app\/src\/Logger.php":"97e8d68cbddef1c99e447952a59fb8b0","app\/src\/FilepondHandler.php":"ed599d08289d450b9188eb6888fdd7ee","app\/src\/ShareLink.php":"90a99787b3bb776f4355a01b9db4bf3b","tests\/phpunit\/RateLimitExtendedTest.php":"a5e76ed126b2d760436bffb6f1fad0a0","tests\/phpunit\/ThesisEditValidationTest.php":"06761c5109cc12fb0f17046b4bcd0814","tests\/phpunit\/DatabaseExtendedTest.php":"f1717a8b1a98bb899d3e1bb275569320","tests\/phpunit\/ThesisCreateValidationTest.php":"533fa660b77c6b2d616481d1b66c8967","tests\/phpunit\/SearchControllerTest.php":"4b3de46664ede0d065f93d6d7fdee145","tests\/phpunit\/SystemControllerHelpersTest.php":"d3fc100e6576fbf98517be3a55cad4d6","tests\/phpunit\/StudentEmailTest.php":"0fa0d2b1abd68b645e3287b234efb043","tests\/phpunit\/AutofocusFieldForErrorTest.php":"402a1258c9adafca7622eb2715162c84","tests\/phpunit\/CryptoTest.php":"4b4882a940fca3a2a169ef7941f1f413","tests\/phpunit\/EmailObfuscatorTest.php":"ba6fb4078a7e5459749b1402e5558cfb","app\/src\/Controllers\/validate-file-fragment-shared.php":"d572b9564076e22b6a3f9baddf7bdb46","app\/src\/Controllers\/TfeController.php":"8046fec4af163d2e48e8e82ca9602f2d","app\/src\/Controllers\/LicenceController.php":"773724ab6d49af09c3733551686d9342","app\/src\/Controllers\/ThesisFileHandler.php":"ca411226ac6722067002c0f5c686a47c","app\/src\/Controllers\/HomeController.php":"058644d92281d3f560c6e9cc46148996","app\/src\/Controllers\/SystemController.php":"a68816afc71e34004df7103c73e17596","app\/src\/Controllers\/MediaController.php":"6906cf552bb2cb6944ff0fa63bdf85be","app\/src\/SystemCache.php":"4ead28637fa3a9281bdad42cdb9e00c2","app\/src\/App.php":"b15f5c07a0be5b9bae32a9f140561409","tests\/phpunit\/PureLogicTest.php":"2aeaf72d083345356c3308760b355463","app\/src\/AdminLogger.php":"5d5078ebaba66c1492cbcb36ac57ea9d","app\/src\/Database.php":"f7562296469a832750bffac16e75756a","app\/src\/Controllers\/SearchController.php":"a61be84fd40ea61fac946a4cdaebb26f","app\/src\/Controllers\/ThesisEditController.php":"0ef745106736949e8365e614bbc0b421","app\/src\/Controllers\/LiveReloadController.php":"e2ff21e7155e769b2684a51accf1699d","app\/src\/Controllers\/ExportController.php":"b0985ea952cf79be625d89e69dd6a2a7","app\/src\/Controllers\/FileAccessController.php":"9665edaa0ab1fd7c94b9a3d9fad95c5f","app\/src\/Controllers\/AboutController.php":"2cfccb831b82024b94b2149204aef53a","app\/src\/Controllers\/ThesisCreateController.php":"c42de670b08ea6be6b622b2aa40a6e8e","app\/src\/Controllers\/CharteController.php":"d976ebd52306d2bc3f6a9797848a299f"}} \ No newline at end of file +{"php":"8.5.7","version":"3.95.2:v3.95.2#a28d88a5e172b27e78d0816992b15a9df3da20f1","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_anonymous_functions":false,"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"modifier_keywords":true,"new_with_parentheses":{"anonymous_class":true},"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"sort_algorithm":"alpha"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":{"closure_fn_spacing":"one"},"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"after_heredoc":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true,"clean_namespace":true,"no_unset_cast":true,"assign_null_coalescing_to_coalesce_equal":true,"normalize_index_brace":true,"heredoc_indentation":true,"no_whitespace_before_comma_in_array":{"after_heredoc":true},"trailing_comma_in_multiline":true,"list_syntax":true,"ternary_to_null_coalescing":true,"array_syntax":{"syntax":"short"},"no_unused_imports":true,"single_quote":true},"ruleCustomisationPolicyVersion":"null-policy","hashes":{"tests\/phpunit\/ErrorHandlerTest.php":"2005e176a105511fc19e853fb4799456","tests\/phpunit\/ShareLinkExtendedTest.php":"778d8cb9052714f36466d17ed8bf40e9","tests\/phpunit\/TfeControllerOgTest.php":"53eefeea18c8d25aec47d59a9c7565a3","tests\/TestDatabase.php":"7b8301cbfadb1a3c02ccfcef8edc1115","tests\/bootstrap.php":"f7b19885b338519f4439e9153ee008aa","app\/src\/DatabaseMigrations.php":"1d9b6a4acddc4fba345c3307577a3111","app\/src\/icon.php":"f46d6a51fb44870a6a8a0cd094ddbfa0","app\/src\/StudentEmail.php":"344309b5b3703b34e97cdeca38de7644","app\/src\/DuplicateThesisException.php":"52abe5f40ef48cfbfd44c119d91309e9","app\/src\/PeerTubeService.php":"e3d8346ff21d0291643466825371a6a0","app\/src\/AppLogger.php":"fe8435f658a74e88d4ffa6bbc83895d6","app\/src\/SmtpRelay.php":"58b659727976e5bafc99830b0ca6cb33","app\/src\/Audit.php":"aec9fbbe8d8eefa8fc657884e8df9b42","app\/src\/Crypto.php":"e72e65eeaf5b6fa8e41ba4501643440b","app\/src\/ErrorHandler.php":"e9407d408af265ae3d043f63a00d3724","app\/src\/AdminAuth.php":"824f497dfc2fcd360b6d82100fa98707","app\/src\/FragmentRenderer.php":"52083e1f2ff98f01e074a93bf6765366","app\/src\/Dispatcher.php":"e233ceb92678bffe6bb343174c7c58b5","app\/src\/EmailObfuscator.php":"ff946c10add222870223b9626990e75c","app\/src\/RateLimit.php":"2e1df734570cb3eb584682bed33a2636","app\/src\/MarkdownHelper.php":"6431d3fcc73e8719b3abb4d81808a90a","app\/src\/Logger.php":"97e8d68cbddef1c99e447952a59fb8b0","app\/src\/FilepondHandler.php":"ed599d08289d450b9188eb6888fdd7ee","app\/src\/ShareLink.php":"90a99787b3bb776f4355a01b9db4bf3b","tests\/phpunit\/RateLimitExtendedTest.php":"a5e76ed126b2d760436bffb6f1fad0a0","tests\/phpunit\/ThesisEditValidationTest.php":"06761c5109cc12fb0f17046b4bcd0814","tests\/phpunit\/DatabaseExtendedTest.php":"f1717a8b1a98bb899d3e1bb275569320","tests\/phpunit\/ThesisCreateValidationTest.php":"533fa660b77c6b2d616481d1b66c8967","tests\/phpunit\/SearchControllerTest.php":"4b3de46664ede0d065f93d6d7fdee145","tests\/phpunit\/SystemControllerHelpersTest.php":"d3fc100e6576fbf98517be3a55cad4d6","tests\/phpunit\/StudentEmailTest.php":"0fa0d2b1abd68b645e3287b234efb043","tests\/phpunit\/AutofocusFieldForErrorTest.php":"402a1258c9adafca7622eb2715162c84","tests\/phpunit\/CryptoTest.php":"4b4882a940fca3a2a169ef7941f1f413","tests\/phpunit\/EmailObfuscatorTest.php":"ba6fb4078a7e5459749b1402e5558cfb","app\/src\/Controllers\/validate-file-fragment-shared.php":"d572b9564076e22b6a3f9baddf7bdb46","app\/src\/Controllers\/TfeController.php":"8046fec4af163d2e48e8e82ca9602f2d","app\/src\/Controllers\/LicenceController.php":"773724ab6d49af09c3733551686d9342","app\/src\/Controllers\/ThesisFileHandler.php":"ca411226ac6722067002c0f5c686a47c","app\/src\/Controllers\/HomeController.php":"058644d92281d3f560c6e9cc46148996","app\/src\/Controllers\/SystemController.php":"a68816afc71e34004df7103c73e17596","app\/src\/Controllers\/MediaController.php":"6906cf552bb2cb6944ff0fa63bdf85be","app\/src\/SystemCache.php":"4ead28637fa3a9281bdad42cdb9e00c2","app\/src\/App.php":"b15f5c07a0be5b9bae32a9f140561409","tests\/phpunit\/PureLogicTest.php":"2aeaf72d083345356c3308760b355463","app\/src\/AdminLogger.php":"5d5078ebaba66c1492cbcb36ac57ea9d","app\/src\/Database.php":"f7562296469a832750bffac16e75756a","app\/src\/Controllers\/SearchController.php":"a61be84fd40ea61fac946a4cdaebb26f","app\/src\/Controllers\/ThesisEditController.php":"0ef745106736949e8365e614bbc0b421","app\/src\/Controllers\/LiveReloadController.php":"e2ff21e7155e769b2684a51accf1699d","app\/src\/Controllers\/ExportController.php":"b0985ea952cf79be625d89e69dd6a2a7","app\/src\/Controllers\/FileAccessController.php":"9665edaa0ab1fd7c94b9a3d9fad95c5f","app\/src\/Controllers\/AboutController.php":"2cfccb831b82024b94b2149204aef53a","app\/src\/Controllers\/ThesisCreateController.php":"c42de670b08ea6be6b622b2aa40a6e8e","app\/src\/Controllers\/CharteController.php":"d976ebd52306d2bc3f6a9797848a299f","app\/src\/Form\/FormBootstrap.php":"a04d42084baad24715e31cf4c481369e"}} \ No newline at end of file diff --git a/TODO.md b/TODO.md index 6f1cadf..129eedd 100644 --- a/TODO.md +++ b/TODO.md @@ -18,4 +18,4 @@ - [x] Add bulk select/delete to tmp cleanup dialog (like admin/index.php pattern) - [x] Move cleanup UI from modal to dedicated page (like add.php/edit.php) - [x] Replace
with
/ in cleanup fragments (like contenus.php) -- [x] Standardise test group recipes: lint-php, lint-css, lint-js, test + add fix recipe +- [x] Standardise test group recipes: lint-php, lint-css, lint-js, test + add fix recipe + make lint pass clean diff --git a/app/public/assets/css/admin.css b/app/public/assets/css/admin.css index 87146e7..51fc42d 100644 --- a/app/public/assets/css/admin.css +++ b/app/public/assets/css/admin.css @@ -4,65 +4,64 @@ /* ── Layout ────────────────────────────────────────────────────────────── */ .admin-body { - display: flex; - flex-direction: column; - height: 100%; - overflow: hidden; + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; } /* Keep admin header single-row like public header */ .admin-body header nav { - overflow-x: auto; - white-space: nowrap; - scrollbar-width: thin; + overflow-x: auto; + white-space: nowrap; + scrollbar-width: thin; } .admin-body header nav .nav-right-links { - flex-shrink: 0; + flex-shrink: 0; } .admin-body header nav ul [data-nav-logout] a { - opacity: 0.6; - display: flex; - align-items: center; + opacity: 0.6; + display: flex; + align-items: center; } .admin-body header nav ul [data-nav-logout] a:hover { - opacity: 1; + opacity: 1; } .admin-body header nav ul [data-nav-logout] a svg { - display: block; - width: 20px; - height: 20px; + display: block; + width: 20px; + height: 20px; } /* Public-site link icon in admin nav */ .admin-body header nav .nav-logo { - display: grid; - grid-auto-flow: column; - align-items: center; - column-gap: 0.4em; + display: grid; + grid-auto-flow: column; + align-items: center; + column-gap: 0.4em; } .admin-body header nav .nav-logo svg { - width: 16px; - height: 16px; + width: 16px; + height: 16px; } - .admin-body main { - flex: 1; - min-height: 0; - overflow-y: auto; - padding: var(--space-s) var(--space-m) var(--space-xl); - width: 100%; - background: linear-gradient( - 180deg, - rgba(149, 87, 181, 0.18) 0%, - rgba(0, 0, 0, 0) 6% - ); + flex: 1; + min-height: 0; + overflow-y: auto; + padding: var(--space-s) var(--space-m) var(--space-xl); + width: 100%; + background: linear-gradient( + 180deg, + rgba(149, 87, 181, 0.18) 0%, + rgba(0, 0, 0, 0) 6% + ); } .admin-main--list { - padding: 0 !important; + padding: 0; } .admin-main--list > form, @@ -70,292 +69,294 @@ .admin-main--list > .flash-success, .admin-main--list > .flash-error, .admin-main--list > .admin-empty { - margin-left: var(--space-m); - margin-right: var(--space-m); + margin-left: var(--space-m); + margin-right: var(--space-m); } #admin-table-wrap { - padding: 0 0 var(--space-2xl); + padding: 0 0 var(--space-2xl); } .admin-body main > table tbody tr:nth-child(even) { - background: var(--bg-secondary); + background: var(--bg-secondary); } .admin-table-row:hover { - background: var(--blue-muted-bg) !important; + background: var(--blue-muted-bg); } .admin-body main > h1, .admin-list-header > h1 { - text-transform: uppercase; - letter-spacing: 0.08em; - margin: 0 0 var(--space-l) 0; - display: flex; - align-items: center; - gap: var(--space-2xs); + text-transform: uppercase; + letter-spacing: 0.08em; + margin: 0 0 var(--space-l) 0; + display: flex; + align-items: center; + gap: var(--space-2xs); } .admin-back-btn { - display: inline-flex; - align-items: center; - justify-content: center; - width: 40px; - height: 40px; - border-radius: var(--radius); - color: var(--text-secondary); - text-decoration: none; - transition: background 0.15s, color 0.15s; - flex-shrink: 0; - vertical-align: middle; - margin-right: var(--space-2xs); + display: inline-flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border-radius: var(--radius); + color: var(--text-secondary); + text-decoration: none; + transition: + background 0.15s, + color 0.15s; + flex-shrink: 0; + vertical-align: middle; + margin-right: var(--space-2xs); } .admin-back-btn:hover { - background: var(--bg-secondary); - color: var(--accent-primary); + background: var(--bg-secondary); + color: var(--accent-primary); } .admin-back-btn svg { - width: 28px; - height: 28px; - fill: currentColor; + width: 28px; + height: 28px; + fill: currentColor; } /* ── Form styles → see form-base.css + form-admin.css ───────────────────── */ /* ── Buttons ────────────────────────────────────────────────────────────── */ .admin-form-footer { - margin-top: var(--space-l); + margin-top: var(--space-l); } /* ── Admin button aliases — see components/buttons.css .btn base class ─── */ .admin-btn { - /* deprecated alias for .btn--primary; kept for backward-compat */ + /* deprecated alias for .btn--primary; kept for backward-compat */ } .admin-btn-secondary { - /* deprecated alias for .btn--secondary; kept for backward-compat */ + /* deprecated alias for .btn--secondary; kept for backward-compat */ } .admin-btn--sm { - /* deprecated alias for .btn--sm; kept for backward-compat */ + /* deprecated alias for .btn--sm; kept for backward-compat */ } .admin-btn--warning { - /* deprecated alias for .btn--warning; kept for backward-compat */ + /* deprecated alias for .btn--warning; kept for backward-compat */ } .admin-btn--danger { - /* deprecated alias for .btn--danger; kept for backward-compat */ + /* deprecated alias for .btn--danger; kept for backward-compat */ } /* ── Toast messages — styles in components/toast.css ───────────────── */ /* ── Stats cards ────────────────────────────────────────────────────────── */ .admin-stats { - display: flex; - gap: var(--space-2xs); - flex-wrap: wrap; - margin: 0; + display: flex; + gap: var(--space-2xs); + flex-wrap: wrap; + margin: 0; } .admin-stat { - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-2xs) var(--space-xs); - min-width: 0; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - margin: 0; - gap: var(--space-3xs); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-2xs) var(--space-xs); + min-width: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin: 0; + gap: var(--space-3xs); } .admin-stat--pub .admin-stat__number { - color: var(--accent-green); + color: var(--accent-green); } .admin-stat--pub .admin-stat__number:empty::after, .admin-stat--pub .admin-stat__number[data-empty] { - color: var(--text-tertiary); + color: var(--text-tertiary); } .admin-stat--pend .admin-stat__number { - color: var(--accent-yellow); + color: var(--accent-yellow); } .admin-stat--pend .admin-stat__number:empty::after, .admin-stat--pend .admin-stat__number[data-empty] { - color: var(--text-tertiary); + color: var(--text-tertiary); } .admin-stat legend { - font-size: var(--step--2); - font-weight: 400; - text-transform: none; - letter-spacing: normal; - color: var(--text-secondary); - padding: 0; - float: none; - margin: 0; - width: auto; + font-size: var(--step--2); + font-weight: 400; + text-transform: none; + letter-spacing: normal; + color: var(--text-secondary); + padding: 0; + float: none; + margin: 0; + width: auto; } .admin-stat__number { - font-size: var(--step-1); - font-weight: 700; - color: var(--accent-primary); - line-height: 1; + font-size: var(--step-1); + font-weight: 700; + color: var(--accent-primary); + line-height: 1; } /* ── Stats (inline badge-like counters) ────────────────────────────── */ /* ── Maintenance bar ────────────────────────────────────────────────────── */ .admin-maintenance-bar { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-s); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-2xs) var(--space-s); - margin-bottom: var(--space-m); - font-size: var(--step--1); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-s); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-2xs) var(--space-s); + margin-bottom: var(--space-m); + font-size: var(--step--1); } .admin-maintenance-bar--active { - background: var(--warning-muted-bg); - border-color: var(--warning); - color: var(--text-primary); + background: var(--warning-muted-bg); + border-color: var(--warning); + color: var(--text-primary); } .admin-maintenance-bar form { - display: inline; + display: inline; } /* Result-count line above the thesis table */ .admin-list-meta { - color: var(--text-secondary); - font-size: var(--step--1); - margin-bottom: var(--space-2xs); + color: var(--text-secondary); + font-size: var(--step--1); + margin-bottom: var(--space-2xs); } /* Empty-state message below the thesis table */ .admin-empty { - color: var(--text-secondary); - padding: var(--space-s) var(--space-2xs); - text-align: center; + color: var(--text-secondary); + padding: var(--space-s) var(--space-2xs); + text-align: center; } /* Identifier column in the thesis table */ .admin-table-id { - color: var(--text-secondary); - font-size: var(--step--2); - white-space: nowrap; + color: var(--text-secondary); + font-size: var(--step--2); + white-space: nowrap; } /* ── Filters bar ────────────────────────────────────────────────────────── */ .admin-filters { - display: flex; - gap: var(--space-xs); - margin-bottom: var(--space-m); - flex-wrap: wrap; - align-items: center; + display: flex; + gap: var(--space-xs); + margin-bottom: var(--space-m); + flex-wrap: wrap; + align-items: center; } .admin-filters-btn { - /* deprecated alias for .btn--primary; kept for backward-compat */ + /* deprecated alias for .btn--primary; kept for backward-compat */ } .admin-filters-reset { - /* deprecated alias for .btn--secondary; kept for backward-compat */ + /* deprecated alias for .btn--secondary; kept for backward-compat */ } /* ── Bulk actions bar ───────────────────────────────────────────────────── */ .admin-bulk-actions { - display: none; - align-items: center; - gap: var(--space-s); - padding: var(--space-2xs) var(--space-s); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - margin-bottom: var(--space-s); - font-size: var(--step--1); - position: sticky; - top: 0; - z-index: 10; + display: none; + align-items: center; + gap: var(--space-s); + padding: var(--space-2xs) var(--space-s); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + margin-bottom: var(--space-s); + font-size: var(--step--1); + position: sticky; + top: 0; + z-index: 10; } .admin-bulk-btns { - display: flex; - gap: var(--space-2xs); + display: flex; + gap: var(--space-2xs); } .admin-stat--inline { - font-size: var(--step--1); - color: var(--text-secondary); - font-weight: 500; - white-space: nowrap; + font-size: var(--step--1); + color: var(--text-secondary); + font-weight: 500; + white-space: nowrap; } /* ── Table ──────────────────────────────────────────────────────────────── */ /* Base table/th/td styles live in components/tables.css */ .admin-body main > table { - margin-top: var(--space-m); + margin-top: var(--space-m); } .admin-body main > table th, .admin-body main > table td { - padding: var(--space-3xs); + padding: var(--space-3xs); } td.admin-ap-col, th.admin-ap-col { - white-space: nowrap; + white-space: nowrap; } .admin-na { - color: var(--text-tertiary); - font-style: italic; + color: var(--text-tertiary); + font-style: italic; } /* Sortable column headers */ .admin-sort-link { - color: inherit; - text-decoration: none; - display: inline-flex; - align-items: center; - gap: 2px; - transition: color 0.15s; + color: inherit; + text-decoration: none; + display: inline-flex; + align-items: center; + gap: 2px; + transition: color 0.15s; } .admin-sort-link:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .admin-body table tr:hover td { - background: var(--bg-secondary); + background: var(--bg-secondary); } .admin-body table .thesis-title { - font-weight: 500; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - word-break: break-word; + font-weight: 500; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + word-break: break-word; } .admin-body table .thesis-subtitle { - font-size: var(--step--1); - color: var(--text-secondary); - font-style: italic; + font-size: var(--step--1); + color: var(--text-secondary); + font-style: italic; } /* ── Status badges ──────────────────────────────────────────────────────── */ @@ -363,1481 +364,1496 @@ th.admin-ap-col { /* ── Compact table badges (admin-only override) ──────────────────── */ .admin-body .status-badge { - font-size: 0.7rem; - padding: 2px var(--space-3xs); + font-size: 0.7rem; + padding: 2px var(--space-3xs); } /* ── Compact icon buttons for table rows ──────────────────────────── */ .admin-icon-btn { - display: inline-flex; - align-items: center; - justify-content: center; - width: 28px; - height: 28px; - padding: 3px; - border-radius: var(--radius); - border: 1px solid transparent; - background: transparent; - color: var(--text-secondary); - cursor: pointer; - text-decoration: none; - transition: background 0.15s, color 0.15s, border-color 0.15s; - line-height: 1; + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + padding: 3px; + border-radius: var(--radius); + border: 1px solid transparent; + background: transparent; + color: var(--text-secondary); + cursor: pointer; + text-decoration: none; + transition: + background 0.15s, + color 0.15s, + border-color 0.15s; + line-height: 1; } .admin-icon-btn svg { - width: 16px; - height: 16px; - fill: currentColor; - flex-shrink: 0; + width: 16px; + height: 16px; + fill: currentColor; + flex-shrink: 0; } .admin-icon-btn:hover { - background: var(--bg-secondary); - color: var(--text-primary); - border-color: var(--border-primary); + background: var(--bg-secondary); + color: var(--text-primary); + border-color: var(--border-primary); } .admin-icon-btn--view:hover { - background: var(--blue-muted-bg); - color: var(--accent-blue); - border-color: var(--blue-muted-border); + background: var(--blue-muted-bg); + color: var(--accent-blue); + border-color: var(--blue-muted-border); } .admin-icon-btn--edit:hover { - background: var(--yellow-muted-bg); - color: var(--accent-yellow); - border-color: var(--yellow-muted-border); + background: var(--yellow-muted-bg); + color: var(--accent-yellow); + border-color: var(--yellow-muted-border); } .admin-icon-btn--publish:hover { - background: var(--green-muted-bg); - color: var(--accent-green); - border-color: var(--green-muted-border); + background: var(--green-muted-bg); + color: var(--accent-green); + border-color: var(--green-muted-border); } .admin-icon-btn--unpublish:hover { - background: var(--bg-secondary); - color: var(--text-secondary); - border-color: var(--border-primary); + background: var(--bg-secondary); + color: var(--text-secondary); + border-color: var(--border-primary); } .admin-icon-btn--delete:hover { - background: var(--error-muted-bg); - color: var(--error); - border-color: var(--danger-border-muted); + background: var(--error-muted-bg); + color: var(--error); + border-color: var(--danger-border-muted); } .admin-icon-btn--copy:hover { - background: var(--blue-muted-bg); - color: var(--accent-blue); - border-color: var(--blue-muted-border); + background: var(--blue-muted-bg); + color: var(--accent-blue); + border-color: var(--blue-muted-border); } .admin-icon-btn--key:hover { - background: var(--yellow-muted-bg); - color: var(--accent-yellow); - border-color: var(--yellow-muted-border); + background: var(--yellow-muted-bg); + color: var(--accent-yellow); + border-color: var(--yellow-muted-border); } .admin-icon-btn--archive:hover { - background: var(--bg-secondary); - color: var(--text-secondary); - border-color: var(--border-primary); + background: var(--bg-secondary); + color: var(--text-secondary); + border-color: var(--border-primary); } .admin-icon-btn--merge:hover { - background: var(--yellow-muted-bg); - color: var(--accent-yellow); - border-color: var(--yellow-muted-border); + background: var(--yellow-muted-bg); + color: var(--accent-yellow); + border-color: var(--yellow-muted-border); } /* ── Action buttons in table — see components/buttons.css .btn base class ─ */ .admin-actions { - display: flex; - gap: var(--space-3xs); - flex-wrap: nowrap; - white-space: nowrap; + display: flex; + gap: var(--space-3xs); + flex-wrap: nowrap; + white-space: nowrap; } .admin-actions-col { - white-space: nowrap; + white-space: nowrap; } /* Legacy table-action size — now just an alias */ .admin-btn-sm { - /* deprecated alias for .btn--sm; kept for backward-compat */ + /* deprecated alias for .btn--sm; kept for backward-compat */ } .admin-btn-view { - /* deprecated alias for .btn--sm .btn--blue */ + /* deprecated alias for .btn--sm .btn--blue */ } .admin-btn-visit { - /* deprecated alias for .btn--sm .btn--green */ + /* deprecated alias for .btn--sm .btn--green */ } .admin-btn-edit { - /* deprecated alias for .btn--sm .btn--yellow */ + /* deprecated alias for .btn--sm .btn--yellow */ } .admin-btn-publish { - /* deprecated alias for .btn--sm .btn--green */ + /* deprecated alias for .btn--sm .btn--green */ } .admin-btn-unpublish { - /* deprecated alias for .btn--sm .btn--muted */ + /* deprecated alias for .btn--sm .btn--muted */ } .admin-btn-delete { - /* deprecated alias for .btn--sm .btn--red */ + /* deprecated alias for .btn--sm .btn--red */ } .publish-form { - display: inline; - margin: 0; + display: inline; + margin: 0; } /* ── Thesis info sections (thanks page) ─────────────────────────────────── */ .admin-body main > section:not([aria-labelledby^="settings-"]) { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-m); - margin-bottom: var(--space-m); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-m); + margin-bottom: var(--space-m); } .admin-body main > section:not([aria-labelledby^="settings-"]) h2 { - margin: 0 0 var(--space-s); - border-bottom: 1px solid var(--border-primary); - padding-bottom: var(--space-2xs); + margin: 0 0 var(--space-s); + border-bottom: 1px solid var(--border-primary); + padding-bottom: var(--space-2xs); } .admin-body main > section:not([aria-labelledby^="settings-"]) dl { - display: grid; - grid-template-columns: 180px 1fr; - gap: var(--space-3xs) var(--space-s); + display: grid; + grid-template-columns: 180px 1fr; + gap: var(--space-3xs) var(--space-s); } .admin-body main > section:not([aria-labelledby^="settings-"]) dt { - font-weight: 600; - font-size: var(--step--1); - color: var(--text-secondary); + font-weight: 600; + font-size: var(--step--1); + color: var(--text-secondary); } .admin-body main > section:not([aria-labelledby^="settings-"]) dd { - margin: 0; - font-size: var(--step--1); + margin: 0; + font-size: var(--step--1); } /* ── Flat sections (no border card) — parametres + contenus ─────────────── */ .admin-body main > section[aria-labelledby^="settings-"], .admin-body main > section[aria-labelledby^="static-pages-"], .admin-body main > section[aria-labelledby^="form-settings-"] { - border: none; - border-radius: 0; - padding: 0; - margin-bottom: var(--space-xl); + border: none; + border-radius: 0; + padding: 0; + margin-bottom: var(--space-xl); } /* Fieldsets inside flat settings sections: no card border */ .admin-body main > section[aria-labelledby^="settings-"] fieldset { - border: none; - border-radius: 0; - padding: var(--space-m) 0; + border: none; + border-radius: 0; + padding: var(--space-m) 0; } .admin-body main > section[aria-labelledby^="settings-"] fieldset legend { - padding: 0; - font-weight: 400; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-secondary); + padding: 0; + font-weight: 400; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--text-secondary); } .admin-body main > section[aria-labelledby^="settings-"] > h2, .admin-body main > section[aria-labelledby^="static-pages-"] > h2 { - font-weight: 600; - letter-spacing: 0.06em; - text-transform: uppercase; - color: var(--text-secondary); - margin: 0 0 var(--space-m); - padding-bottom: var(--space-2xs); - border-bottom: 1px solid var(--border-primary); + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--text-secondary); + margin: 0 0 var(--space-m); + padding-bottom: var(--space-2xs); + border-bottom: 1px solid var(--border-primary); } .admin-action-bar { - margin-top: var(--space-m); - display: flex; - gap: var(--space-xs); - flex-wrap: wrap; + margin-top: var(--space-m); + display: flex; + gap: var(--space-xs); + flex-wrap: wrap; } .admin-muted { - color: var(--text-secondary); + color: var(--text-secondary); } /* ── Section titles (account, etc.) ─────────────────────────────────────── */ .admin-section-title { - font-size: var(--step-0); - font-weight: 600; - letter-spacing: 0.07em; - text-transform: uppercase; - color: var(--text-secondary); - margin: var(--space-l) 0 var(--space-s); - padding-bottom: var(--space-2xs); - border-bottom: 1px solid var(--border-primary); + font-size: var(--step-0); + font-weight: 600; + letter-spacing: 0.07em; + text-transform: uppercase; + color: var(--text-secondary); + margin: var(--space-l) 0 var(--space-s); + padding-bottom: var(--space-2xs); + border-bottom: 1px solid var(--border-primary); } .admin-section-title--danger { - color: var(--error); - border-color: var(--error); + color: var(--error); + border-color: var(--error); } /* ── Account status block ───────────────────────────────────────────────── */ .admin-account-status { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-s) var(--space-m); - margin-bottom: var(--space-l); - display: flex; - flex-direction: column; - gap: var(--space-xs); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-s) var(--space-m); + margin-bottom: var(--space-l); + display: flex; + flex-direction: column; + gap: var(--space-xs); } .admin-account-status__row { - display: flex; - align-items: center; - gap: var(--space-xs); - font-size: var(--step--1); + display: flex; + align-items: center; + gap: var(--space-xs); + font-size: var(--step--1); } .admin-account-status__label { - color: var(--text-secondary); - min-width: 220px; + color: var(--text-secondary); + min-width: 220px; } .admin-account-status__code { - font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; - font-size: var(--step--2); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-3xs) var(--space-3xs); - color: var(--text-secondary); - background: var(--bg-secondary); + font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; + font-size: var(--step--2); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-3xs) var(--space-3xs); + color: var(--text-secondary); + background: var(--bg-secondary); } .admin-account-status__note { - font-size: var(--step--1); - color: var(--text-secondary); - margin: 0; + font-size: var(--step--1); + color: var(--text-secondary); + margin: 0; } /* ── Danger zone (account page) ─────────────────────────────────────────── */ .admin-danger-zone { - border: 1px solid var(--danger-border-muted); - border-radius: var(--radius); - padding: var(--space-m) var(--space-m); - display: flex; - align-items: center; - gap: var(--space-m); - flex-wrap: wrap; + border: 1px solid var(--danger-border-muted); + border-radius: var(--radius); + padding: var(--space-m) var(--space-m); + display: flex; + align-items: center; + gap: var(--space-m); + flex-wrap: wrap; } .admin-danger-zone__description { - flex: 1; - font-size: var(--step--1); + flex: 1; + font-size: var(--step--1); } /* ── Login page ─────────────────────────────────────────────────────────── */ .admin-login-wrap { - display: flex; - align-items: center; - justify-content: center; - min-height: calc(100vh - 60px); + display: flex; + align-items: center; + justify-content: center; + min-height: calc(100vh - 60px); } .admin-login-box { - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-l); - width: 100%; - max-width: 420px; + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-l); + width: 100%; + max-width: 420px; } .admin-login-box h2 { - margin: 0 0 var(--space-m); - font-weight: 500; - text-align: center; - hyphens: none; - overflow-wrap: normal; - word-break: normal; + margin: 0 0 var(--space-m); + font-weight: 500; + text-align: center; + hyphens: none; + overflow-wrap: normal; + word-break: normal; } .admin-login-box .admin-form > div:not(.admin-form-footer) { - grid-template-columns: 1fr; - border: none; - padding: var(--space-3xs) 0; + grid-template-columns: 1fr; + border: none; + padding: var(--space-3xs) 0; } .admin-login-box .admin-form > div:not(.admin-form-footer) > label { - font-size: var(--step--1); - color: var(--text-secondary); - margin-bottom: var(--space-3xs); + font-size: var(--step--1); + color: var(--text-secondary); + margin-bottom: var(--space-3xs); } .admin-login-box .admin-form-footer { - margin-top: var(--space-s); - padding-top: var(--space-2xs); + margin-top: var(--space-s); + padding-top: var(--space-2xs); } .admin-login-box .btn { - width: 100%; + width: 100%; } /* ════ Import status card (dialog) ═══════════════════════════════════════ */ .admin-import-status-card { - margin: 0; - padding: var(--space-m) var(--space-l); + margin: 0; + padding: var(--space-m) var(--space-l); } .admin-import-status-card__success { - background: var(--success-muted-bg); - border: 1px solid var(--success); - border-left: 3px solid var(--success); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-s); - font-size: var(--step--1); - margin: 0; + background: var(--success-muted-bg); + border: 1px solid var(--success); + border-left: 3px solid var(--success); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-s); + font-size: var(--step--1); + margin: 0; } .admin-import-status-card__errors { - background: var(--accent-muted); - border: 1px solid var(--error); - border-left: 3px solid var(--error); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-s); - font-size: var(--step--1); - margin-bottom: var(--space-s); + background: var(--accent-muted); + border: 1px solid var(--error); + border-left: 3px solid var(--error); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-s); + font-size: var(--step--1); + margin-bottom: var(--space-s); } .admin-import-status-card__errors .admin-error-list { - margin: var(--space-2xs) 0 0; - padding-left: var(--space-s); + margin: var(--space-2xs) 0 0; + padding-left: var(--space-s); } /* Import log details/summary */ .admin-import-log-details { - margin: 0; - padding: 0 var(--space-l) var(--space-m); + margin: 0; + padding: 0 var(--space-l) var(--space-m); } .admin-import-log-details summary { - cursor: pointer; - font-size: var(--step--1); - font-weight: 600; - color: var(--text-secondary); - padding: var(--space-2xs) 0; - border-top: 1px solid var(--border-primary); + cursor: pointer; + font-size: var(--step--1); + font-weight: 600; + color: var(--text-secondary); + padding: var(--space-2xs) 0; + border-top: 1px solid var(--border-primary); } .admin-import-log-details summary:hover { - color: var(--text-primary); + color: var(--text-primary); } /* Hint text under the file input */ .admin-file-hint { - display: block; - margin-top: var(--space-2xs); + display: block; + margin-top: var(--space-2xs); } /* Error list inside role="alert" */ .admin-error-list { - margin: var(--space-2xs) 0 0; - padding-left: var(--space-s); + margin: var(--space-2xs) 0 0; + padding-left: var(--space-s); } /* Import results panel (legacy, kept for backward compat) */ .admin-import-results { - margin-top: var(--space-l); + margin-top: var(--space-l); } .admin-import-results__title { - font-size: var(--step-0); - font-weight: 600; - margin-bottom: var(--space-xs); - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.06em; - border: none; - padding: 0; + font-size: var(--step-0); + font-weight: 600; + margin-bottom: var(--space-xs); + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.06em; + border: none; + padding: 0; } /* ── Jury fieldset → see form-base.css ──────────────────────────────────── */ /* ── Inline form (tags page) ────────────────────────────────────────────── */ .admin-inline-form { - display: flex; - align-items: center; - gap: var(--space-3xs); - flex-wrap: wrap; + display: flex; + align-items: center; + gap: var(--space-3xs); + flex-wrap: wrap; } .admin-input--inline, .admin-inline-form input[type="text"] { - width: 160px; + width: 160px; } .admin-select--inline, .admin-inline-form select { - width: 160px; + width: 160px; } /* Stack secondary forms (merge, delete) below the rename form */ .admin-inline-form + .admin-inline-form { - margin-top: var(--space-3xs); + margin-top: var(--space-3xs); } /* Tags table column sizing */ .admin-body table:has(.admin-tags-count) th:nth-child(1) { - width: 40%; + width: 40%; } .admin-body table:has(.admin-tags-count) th:nth-child(2) { - width: 12%; + width: 12%; } .admin-body table:has(.admin-tags-count) th:nth-child(3) { - width: 48%; + width: 48%; } .admin-tags-count { - text-align: center; + text-align: center; } /* ── Banner preview ─────────────────────────────────────────────────────── */ .admin-banner-preview img { - max-width: 320px; - max-height: 100px; - object-fit: cover; - border: 1px solid var(--border-primary); - border-radius: var(--radius); - display: block; - margin-top: var(--space-2xs); + max-width: 320px; + max-height: 100px; + object-fit: cover; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + display: block; + margin-top: var(--space-2xs); } /* ── List page toolbar (generic grid header + right slot) ──────────────── */ .admin-list-toolbar { - display: grid; - grid-template-columns: 1fr auto; - gap: var(--space-m) var(--space-l); - margin-bottom: var(--space-m); - align-items: center; - padding: var(--space-m) 0 0; + display: grid; + grid-template-columns: 1fr auto; + gap: var(--space-m) var(--space-l); + margin-bottom: var(--space-m); + align-items: center; + padding: var(--space-m) 0 0; } .admin-list-toolbar h1 { - margin: 0; - white-space: nowrap; + margin: 0; + white-space: nowrap; } .admin-list-toolbar .admin-stats { - justify-self: end; + justify-self: end; } .admin-list-toolbar .admin-filters { - display: flex; - flex-direction: column; - gap: var(--space-xs); - margin-bottom: 0; - min-width: 0; + display: flex; + flex-direction: column; + gap: var(--space-xs); + margin-bottom: 0; + min-width: 0; } .admin-list-toolbar .admin-filters__search { - display: flex; - gap: var(--space-xs); - align-items: center; + display: flex; + gap: var(--space-xs); + align-items: center; } .admin-list-toolbar .admin-filters__search input[type="text"] { - min-width: 10rem; - flex: 1 1 10rem; + min-width: 10rem; + flex: 1 1 10rem; } .admin-list-toolbar .admin-filters__dropdowns { - display: flex; - gap: var(--space-xs); - flex-wrap: wrap; + display: flex; + gap: var(--space-xs); + flex-wrap: wrap; } .admin-list-toolbar .admin-filters__dropdowns select { - min-width: 7rem; - flex: 1 1 7rem; + min-width: 7rem; + flex: 1 1 7rem; } .admin-list-toolbar .admin-filters .btn { - flex-shrink: 0; + flex-shrink: 0; } .admin-list-toolbar__right { - display: flex; - flex-direction: column; - gap: var(--space-xs); + display: flex; + flex-direction: column; + gap: var(--space-xs); } /* ── List page toolbar (theses index — single-line search) ─────────────── */ .admin-list-toolbar--list { - display: flex; - flex-direction: column; - gap: var(--space-s); + display: flex; + flex-direction: column; + gap: var(--space-s); } .admin-list-toolbar--list .admin-toolbar-top { - display: flex; - justify-content: space-between; - align-items: center; - gap: var(--space-m); + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--space-m); } .admin-list-toolbar--list .admin-toolbar-title-row { - display: flex; - align-items: center; - gap: var(--space-m); + display: flex; + align-items: center; + gap: var(--space-m); } .admin-list-toolbar--list .admin-toolbar-title-row h1 { - margin: 0; - white-space: nowrap; + margin: 0; + white-space: nowrap; } .admin-list-toolbar--list .admin-toolbar-top .admin-btn-group { - display: flex; - gap: var(--space-2xs); - flex-wrap: wrap; - align-items: center; + display: flex; + gap: var(--space-2xs); + flex-wrap: wrap; + align-items: center; } .admin-list-toolbar--list .admin-filters { - display: flex; - flex-direction: row; - gap: var(--space-xs); - align-items: center; - margin-bottom: 0; + display: flex; + flex-direction: row; + gap: var(--space-xs); + align-items: center; + margin-bottom: 0; } .admin-list-toolbar--list .admin-filters input[type="text"] { - flex: 1 1 auto; - min-width: 8rem; + flex: 1 1 auto; + min-width: 8rem; } .admin-list-toolbar--list .admin-filters select { - min-width: 6rem; - flex-shrink: 0; + min-width: 6rem; + flex-shrink: 0; } .admin-list-toolbar--list .admin-filters .btn { - flex-shrink: 0; + flex-shrink: 0; } .admin-btn-group { - display: flex; - align-items: center; - gap: var(--space-xs); - flex-wrap: wrap; + display: flex; + align-items: center; + gap: var(--space-xs); + flex-wrap: wrap; } /* ── Dialog ───────────────────────────────────────────────────────────── */ /* Base dialog/::backdrop styles live in components/dialog.css */ .admin-dialog { - max-width: 680px; - width: 100%; + max-width: 680px; + width: 100%; } .admin-dialog__header { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-m) var(--space-l); - border-bottom: 1px solid var(--border-primary); + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-m) var(--space-l); + border-bottom: 1px solid var(--border-primary); } .admin-dialog__header h3 { - font-weight: 600; - letter-spacing: 0.06em; - text-transform: uppercase; - margin: 0; - color: var(--text-secondary); + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + margin: 0; + color: var(--text-secondary); } .admin-dialog__close { - background: none; - border: none; - cursor: pointer; - font-size: var(--step-0); - color: var(--text-tertiary); - padding: var(--space-3xs); - line-height: 1; - border-radius: var(--radius); - transition: color 0.15s; + background: none; + border: none; + cursor: pointer; + font-size: var(--step-0); + color: var(--text-tertiary); + padding: var(--space-3xs); + line-height: 1; + border-radius: var(--radius); + transition: color 0.15s; } .admin-dialog__close:hover { - color: var(--text-primary); + color: var(--text-primary); } .admin-dialog .admin-form, .admin-dialog .admin-import-results, .admin-dialog .toast, .admin-dialog__alert { - margin: 0; - padding: var(--space-m) var(--space-l); + margin: 0; + padding: var(--space-m) var(--space-l); } .admin-dialog .admin-form { - padding-top: var(--space-m); - padding-bottom: 0; + padding-top: var(--space-m); + padding-bottom: 0; } .admin-dialog .admin-form-footer { - display: flex; - gap: var(--space-xs); - padding: 0 var(--space-l) var(--space-m); + display: flex; + gap: var(--space-xs); + padding: 0 var(--space-l) var(--space-m); } /* Small/confirmation dialog variant */ .admin-dialog--sm { - max-width: 420px; + max-width: 420px; } .admin-dialog__alert { - padding: var(--space-m) var(--space-l); - font-size: var(--step--1); - line-height: 1.6; + padding: var(--space-m) var(--space-l); + font-size: var(--step--1); + line-height: 1.6; } .admin-dialog__alert p:not(:last-child) { - margin: 0 0 var(--space-xs) 0; + margin: 0 0 var(--space-xs) 0; } .admin-dialog__alert p:last-child { - margin: 0; + margin: 0; } .admin-dialog__body { - padding: var(--space-m) var(--space-l); - font-size: var(--step--1); - line-height: 1.6; - overflow-y: auto; - flex: 1; - min-height: 0; + padding: var(--space-m) var(--space-l); + font-size: var(--step--1); + line-height: 1.6; + overflow-y: auto; + flex: 1; + min-height: 0; } .admin-dialog__body > *:first-child { - margin-top: 0; + margin-top: 0; } .admin-dialog__body > *:last-child { - margin-bottom: 0; + margin-bottom: 0; } .admin-dialog__stats { - margin: var(--space-sm) 0; - padding: var(--space-sm); - background: var(--bg-secondary); - border-radius: 8px; - font-size: var(--step--1); - line-height: 1.6; + margin: var(--space-sm) 0; + padding: var(--space-sm); + background: var(--bg-secondary); + border-radius: 8px; + font-size: var(--step--1); + line-height: 1.6; } .admin-dialog__hint { - font-size: var(--step--2); - color: var(--text-secondary); - margin: var(--space-xs) 0 0 0; + font-size: var(--step--2); + color: var(--text-secondary); + margin: var(--space-xs) 0 0 0; } .admin-dialog__footer { - display: flex; - gap: var(--space-xs); - padding: 0 var(--space-l) var(--space-m); + display: flex; + gap: var(--space-xs); + padding: 0 var(--space-l) var(--space-m); } /* Side-panel variant: pinned to right, full height */ .admin-dialog--sheet { - max-width: 720px; - max-height: 100vh; - height: 100vh; - margin: 0 0 0 auto; - border-radius: 16px 0 0 16px; - animation: adminSheetIn 0.3s ease-out; - overflow: hidden; + max-width: 720px; + max-height: 100vh; + height: 100vh; + margin: 0 0 0 auto; + border-radius: 16px 0 0 16px; + animation: adminSheetIn 0.3s ease-out; + overflow: hidden; } .admin-dialog--sheet[open] { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } @keyframes adminSheetIn { - from { transform: translateX(100%); } - to { transform: translateX(0); } + from { + transform: translateX(100%); + } + to { + transform: translateX(0); + } } .admin-dialog--sheet::backdrop { - background: rgba(0,0,0,0.5); + background: rgba(0, 0, 0, 0.5); } /* Dialog table: replaces grey background box with flat table + heading */ .n-table { - width: 100%; - border-collapse: collapse; - font-size: 0.85em; + width: 100%; + border-collapse: collapse; + font-size: 0.85em; } .n-table thead th { - text-align: left; - padding: var(--space-3xs) var(--space-xs); - border-bottom: 1px solid var(--border-primary); - font-weight: 600; - color: var(--text-secondary); - font-size: 0.9em; + text-align: left; + padding: var(--space-3xs) var(--space-xs); + border-bottom: 1px solid var(--border-primary); + font-weight: 600; + color: var(--text-secondary); + font-size: 0.9em; } .n-table tbody td { - padding: var(--space-3xs) var(--space-xs); - border-bottom: 1px solid var(--border-secondary); - vertical-align: top; + padding: var(--space-3xs) var(--space-xs); + border-bottom: 1px solid var(--border-secondary); + vertical-align: top; } .n-table .n-table__info { - color: var(--text-tertiary); - font-size: 0.9em; + color: var(--text-tertiary); + font-size: 0.9em; } .n-heading { - display: inline-flex; - align-items: center; - gap: var(--space-2xs); - margin: 0 0 var(--space-xs) 0; - font-size: var(--step--1); - font-weight: 600; - color: var(--text-primary); - line-height: 1.4; + display: inline-flex; + align-items: center; + gap: var(--space-2xs); + margin: 0 0 var(--space-xs) 0; + font-size: var(--step--1); + font-weight: 600; + color: var(--text-primary); + line-height: 1.4; } .n-meta { - font-weight: 400; - font-size: 0.9em; - color: var(--text-secondary); - margin-left: var(--space-2xs); + font-weight: 400; + font-size: 0.9em; + color: var(--text-secondary); + margin-left: var(--space-2xs); } .n-grid { - display: block; + display: block; } .n-section, .n-grid > section, .n-grid > details { - margin: 2ch 0; - border: none; - border-radius: 0; - background: transparent; - overflow: visible; + margin: 2ch 0; + border: none; + border-radius: 0; + background: transparent; + overflow: visible; } .n-section:first-child, .n-grid > section:first-child, .n-grid > details:first-child { - margin-top: 0; + margin-top: 0; } .n-section:last-child, .n-grid > section:last-child, .n-grid > details:last-child { - margin-bottom: 0; + margin-bottom: 0; } .n-grid .n-heading { - margin-top: 0; + margin-top: 0; } /*
/ inside cleanup sections */ .n-grid > details > summary, .n-section > summary { - cursor: pointer; - font-weight: 600; - font-size: var(--step--1); - color: var(--text-primary); - padding: var(--space-xs); - list-style: none; - font-family: var(--font-body); - display: flex; - align-items: center; - gap: var(--space-2xs); + cursor: pointer; + font-weight: 600; + font-size: var(--step--1); + color: var(--text-primary); + padding: var(--space-xs); + list-style: none; + font-family: var(--font-body); + display: flex; + align-items: center; + gap: var(--space-2xs); } .n-grid > details > summary::-webkit-details-marker, .n-section > summary::-webkit-details-marker { - display: none; + display: none; } .n-section[open], .n-grid > details[open] { - padding-bottom: 0; + padding-bottom: 0; } .n-grid > details > summary:hover, .n-section > summary:hover { - background: transparent; + background: transparent; } .n-grid > details > summary::before, .n-section > summary::before { - content: ''; - display: inline-block; - width: 16px; - height: 16px; - flex-shrink: 0; - background: currentColor; - mask-image: url("/assets/icons/caret-right.svg"); - mask-size: contain; - mask-repeat: no-repeat; - mask-position: center; - transition: transform 0.15s; + content: ""; + display: inline-block; + width: 16px; + height: 16px; + flex-shrink: 0; + background: currentColor; + mask-image: url("/assets/icons/caret-right.svg"); + mask-size: contain; + mask-repeat: no-repeat; + mask-position: center; + transition: transform 0.15s; } .n-grid > details[open] > summary::before, .n-section[open] > summary::before { - transform: rotate(90deg); + transform: rotate(90deg); } .n-grid > details > :not(summary), .n-section > :not(summary) { - padding: 0 var(--space-s) var(--space-xs) var(--space-s); + padding: 0 var(--space-s) var(--space-xs) var(--space-s); } /* ── Import results log ─────────────────────────────────────────────── */ .admin-import-log { - list-style: none; - margin: 0; - display: flex; - flex-direction: column; - gap: var(--space-3xs); - max-height: 260px; - overflow-y: auto; - font-size: var(--step--2); - font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xs); - background: var(--bg-secondary); + list-style: none; + margin: 0; + display: flex; + flex-direction: column; + gap: var(--space-3xs); + max-height: 260px; + overflow-y: auto; + font-size: var(--step--2); + font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xs); + background: var(--bg-secondary); } .admin-import-log__item::before { - margin-right: var(--space-3xs); + margin-right: var(--space-3xs); } -.admin-import-log__item--ok::before { content: '✓'; color: var(--accent-green); } -.admin-import-log__item--skip::before { content: '⚠'; color: var(--warning); } -.admin-import-log__item--error::before { content: '✗'; color: var(--error); } +.admin-import-log__item--ok::before { + content: "✓"; + color: var(--accent-green); +} +.admin-import-log__item--skip::before { + content: "⚠"; + color: var(--warning); +} +.admin-import-log__item--error::before { + content: "✗"; + color: var(--error); +} /* ── Paramètres page (flat, semantic) ──────────────────────────────────── */ .param-access-table { - width: 100%; - border-collapse: separate; - border-spacing: 0; - margin-bottom: var(--space-m); - font-size: var(--step--1); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - overflow: hidden; + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin-bottom: var(--space-m); + font-size: var(--step--1); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + overflow: hidden; } .param-access-table caption { - caption-side: top; - font-weight: 600; - margin-bottom: var(--space-2xs); - text-align: left; + caption-side: top; + font-weight: 600; + margin-bottom: var(--space-2xs); + text-align: left; } .param-access-table th, .param-access-table td { - padding: var(--space-2xs) var(--space-s); - text-align: left; - border-bottom: 1px solid var(--border-primary); + padding: var(--space-2xs) var(--space-s); + text-align: left; + border-bottom: 1px solid var(--border-primary); } .param-access-table th:not(:last-child), .param-access-table td:not(:last-child) { - border-right: 1px solid var(--border-primary); + border-right: 1px solid var(--border-primary); } .param-access-table thead th { - background: var(--bg-secondary); - font-weight: 600; + background: var(--bg-secondary); + font-weight: 600; } .param-access-table thead tr:first-child th:first-child { - border-top-left-radius: var(--radius); + border-top-left-radius: var(--radius); } .param-access-table thead tr:first-child th:last-child { - border-top-right-radius: var(--radius); + border-top-right-radius: var(--radius); } .param-access-table tbody tr:last-child td:first-child { - border-bottom-left-radius: var(--radius); + border-bottom-left-radius: var(--radius); } .param-access-table tbody tr:last-child td:last-child { - border-bottom-right-radius: var(--radius); + border-bottom-right-radius: var(--radius); } .param-access-table tbody tr:last-child td { - border-bottom: none; + border-bottom: none; } .param-access-yes { - color: var(--accent-green); + color: var(--accent-green); } .param-access-no { - color: var(--text-secondary); + color: var(--text-secondary); } .param-maintenance-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-s); - padding: var(--space-xs) var(--space-m); - margin-bottom: var(--space-m); - font-size: var(--step--1); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - background: var(--bg-secondary); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-s); + padding: var(--space-xs) var(--space-m); + margin-bottom: var(--space-m); + font-size: var(--step--1); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: var(--bg-secondary); } -.param-maintenance-row:has( .btn--warning ) { - background: var(--warning-muted-bg); - border-color: var(--warning); +.param-maintenance-row:has(.btn--warning) { + background: var(--warning-muted-bg); + border-color: var(--warning); } .param-maintenance-row p { - margin: 0; + margin: 0; } .param-maintenance-row form { - flex-shrink: 0; + flex-shrink: 0; } .param-form { - display: flex; - flex-direction: column; - gap: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-m); } .param-form fieldset { - display: flex; - flex-direction: column; - gap: var(--space-xs); - padding-top: var(--space-s); + display: flex; + flex-direction: column; + gap: var(--space-xs); + padding-top: var(--space-s); } .param-form fieldset > * { - margin-bottom: 0; + margin-bottom: 0; } .param-checkbox { - display: flex; - align-items: flex-start; - gap: var(--space-xs); - cursor: pointer; + display: flex; + align-items: flex-start; + gap: var(--space-xs); + cursor: pointer; } .param-checkbox--disabled { - opacity: 0.6; - cursor: not-allowed; + opacity: 0.6; + cursor: not-allowed; } .param-checkbox input[type="checkbox"] { - margin-top: 2px; + margin-top: 2px; } .param-checkbox--disabled input[type="checkbox"] { - cursor: not-allowed; + cursor: not-allowed; } .param-note { - color: var(--text-secondary); - margin: 0; + color: var(--text-secondary); + margin: 0; } .param-account-status { - display: flex; - flex-direction: column; - gap: var(--space-xs); - margin-bottom: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-xs); + margin-bottom: var(--space-m); } .param-account-status > div { - display: flex; - align-items: center; - gap: var(--space-xs); + display: flex; + align-items: center; + gap: var(--space-xs); } .param-account-status dt { - color: var(--text-secondary); - min-width: 200px; + color: var(--text-secondary); + min-width: 200px; } .param-account-status dd { - margin: 0; - display: flex; - align-items: center; - gap: var(--space-xs); + margin: 0; + display: flex; + align-items: center; + gap: var(--space-xs); } .param-account-status code { - font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; - font-size: var(--step--2); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-3xs); - color: var(--text-secondary); - background: var(--bg-secondary); + font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; + font-size: var(--step--2); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-3xs); + color: var(--text-secondary); + background: var(--bg-secondary); } .param-form > div { - display: grid; - grid-template-columns: 1fr; - gap: var(--space-3xs); - border-top: 1px solid var(--border-primary); - padding: var(--space-xs) 0; + display: grid; + grid-template-columns: 1fr; + gap: var(--space-3xs); + border-top: 1px solid var(--border-primary); + padding: var(--space-xs) 0; } .param-form > div:first-of-type { - border-top: none; - padding-top: 0; + border-top: none; + padding-top: 0; } .param-form input[type="password"] { - width: 100%; - max-width: 380px; + width: 100%; + max-width: 380px; } .param-danger-zone { - border-color: var(--danger-border-muted); - margin-bottom: var(--space-m); + border-color: var(--danger-border-muted); + margin-bottom: var(--space-m); } .param-danger-zone legend { - color: var(--error); - font-size: var(--step-0); + color: var(--error); + font-size: var(--step-0); } .param-danger-zone p { - color: var(--text-secondary); - margin-bottom: var(--space-xs); + color: var(--text-secondary); + margin-bottom: var(--space-xs); } .param-danger-zone form { - margin-top: var(--space-xs); + margin-top: var(--space-xs); } /* ── Export zone (maintenance section) ───────────────────────────────── */ .param-export-zone { - margin-bottom: var(--space-m); + margin-bottom: var(--space-m); } .param-export-zone legend { - font-size: var(--step-0); + font-size: var(--step-0); } .param-export-zone p { - color: var(--text-secondary); - margin-bottom: var(--space-xs); + color: var(--text-secondary); + margin-bottom: var(--space-xs); } /* ── SMTP section ─────────────────────────────────────────────────────── */ .param-smtp-test { - margin-top: var(--space-m); + margin-top: var(--space-m); } .param-smtp-test-row { - display: flex; - align-items: flex-end; - gap: var(--space-s); - flex-wrap: wrap; + display: flex; + align-items: flex-end; + gap: var(--space-s); + flex-wrap: wrap; } .param-smtp-test-row > div { - flex: 1 1 260px; + flex: 1 1 260px; } .param-smtp-test-row label { - font-weight: 400; - margin-bottom: var(--space-2xs); - color: var(--text-secondary); + font-weight: 400; + margin-bottom: var(--space-2xs); + color: var(--text-secondary); } .param-smtp-test-row input[type="email"] { - width: 100%; - padding: var(--space-xs) var(--space-s); + width: 100%; + padding: var(--space-xs) var(--space-s); } .param-smtp-test-row input[type="email"]:focus { - outline: 2px solid var(--accent-primary); - outline-offset: 1px; + outline: 2px solid var(--accent-primary); + outline-offset: 1px; } .param-smtp-test-row > button { - white-space: nowrap; - flex-shrink: 0; + white-space: nowrap; + flex-shrink: 0; } .param-smtp-status { - display: flex; - align-items: center; - gap: var(--space-s); - margin: var(--space-xs) 0 var(--space-s); - color: var(--text-secondary); + display: flex; + align-items: center; + gap: var(--space-s); + margin: var(--space-xs) 0 var(--space-s); + color: var(--text-secondary); } .param-badge-ok { - color: var(--accent-green); - font-weight: 600; + color: var(--accent-green); + font-weight: 600; } .param-badge-warn { - color: var(--warning); - font-weight: 600; + color: var(--warning); + font-weight: 600; } .param-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: var(--space-s); + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: var(--space-s); } .param-grid label { - display: flex; - flex-direction: column; - gap: var(--space-3xs); - color: var(--text-secondary); + display: flex; + flex-direction: column; + gap: var(--space-3xs); + color: var(--text-secondary); } .param-grid input[type="text"], .param-grid input[type="number"], .param-grid input[type="email"], .param-grid select { - width: 100%; + width: 100%; } /* SMTP field validation error state */ .param-grid input[aria-invalid="true"], .param-grid select[aria-invalid="true"] { - border-color: var(--search-error-border, #c0392b); + border-color: var(--search-error-border, #c0392b); } .param-field-error { - display: block; - font-size: var(--step--2); - color: var(--search-error-border, #c0392b); - margin-top: var(--space-3xs); - line-height: 1.3; + display: block; + font-size: var(--step--2); + color: var(--search-error-border, #c0392b); + margin-top: var(--space-3xs); + line-height: 1.3; } /* ── Settings page sections — legacy aliases (kept for any remaining use) ─ */ .admin-settings-section { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-m) var(--space-l); - margin-bottom: var(--space-l); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-m) var(--space-l); + margin-bottom: var(--space-l); } .admin-settings-section__title { - font-size: var(--step-0); - font-weight: 600; - letter-spacing: 0.07em; - text-transform: uppercase; - color: var(--text-secondary); - margin: 0 0 var(--space-m); - padding-bottom: var(--space-2xs); - border-bottom: 1px solid var(--border-primary); + font-size: var(--step-0); + font-weight: 600; + letter-spacing: 0.07em; + text-transform: uppercase; + color: var(--text-secondary); + margin: 0 0 var(--space-m); + padding-bottom: var(--space-2xs); + border-bottom: 1px solid var(--border-primary); } .admin-maintenance-status { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-s); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-m); - font-size: var(--step--1); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-s); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-m); + font-size: var(--step--1); } .admin-maintenance-status--active { - background: var(--warning-muted-bg); - border-color: var(--warning); + background: var(--warning-muted-bg); + border-color: var(--warning); } .admin-maintenance-status__msg { - margin: 0; + margin: 0; } .admin-maintenance-status form { - display: inline; - flex-shrink: 0; + display: inline; + flex-shrink: 0; } .admin-account-status { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-s) var(--space-m); - margin-bottom: var(--space-l); - display: flex; - flex-direction: column; - gap: var(--space-xs); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-s) var(--space-m); + margin-bottom: var(--space-l); + display: flex; + flex-direction: column; + gap: var(--space-xs); } .admin-account-status__row { - display: flex; - align-items: center; - gap: var(--space-xs); - font-size: var(--step--1); + display: flex; + align-items: center; + gap: var(--space-xs); + font-size: var(--step--1); } .admin-account-status__label { - color: var(--text-secondary); - min-width: 220px; + color: var(--text-secondary); + min-width: 220px; } .admin-account-status__code { - font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; - font-size: var(--step--2); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-3xs) var(--space-3xs); - color: var(--text-secondary); - background: var(--bg-secondary); + font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; + font-size: var(--step--2); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-3xs) var(--space-3xs); + color: var(--text-secondary); + background: var(--bg-secondary); } .admin-account-status__note { - font-size: var(--step--1); - color: var(--text-secondary); - margin: 0; + font-size: var(--step--1); + color: var(--text-secondary); + margin: 0; } .admin-danger-zone { - border: 1px solid var(--danger-border-muted); - border-radius: var(--radius); - padding: var(--space-m) var(--space-m); - display: flex; - align-items: center; - gap: var(--space-m); - flex-wrap: wrap; + border: 1px solid var(--danger-border-muted); + border-radius: var(--radius); + padding: var(--space-m) var(--space-m); + display: flex; + align-items: center; + gap: var(--space-m); + flex-wrap: wrap; } .admin-danger-zone__description { - flex: 1; - font-size: var(--step--1); + flex: 1; + font-size: var(--step--1); } .admin-settings-toggles { - display: flex; - flex-direction: column; - gap: var(--space-xs); - margin-bottom: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-xs); + margin-bottom: var(--space-m); } .admin-toggle-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-m); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-m); - cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-m); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-m); + cursor: pointer; } .admin-toggle-row--disabled { - opacity: 0.6; + opacity: 0.6; } .admin-toggle-label { - display: flex; - flex-direction: column; - gap: 2px; + display: flex; + flex-direction: column; + gap: 2px; } .admin-toggle-label strong { - font-size: var(--step-0); + font-size: var(--step-0); } .admin-toggle-label small { - color: var(--text-secondary); - font-size: var(--step--2); + color: var(--text-secondary); + font-size: var(--step--2); } .admin-toggle { - appearance: none; - -webkit-appearance: none; - width: 40px; - height: 22px; - background: var(--border-primary); - border-radius: 11px; - position: relative; - cursor: pointer; - flex-shrink: 0; - transition: background 0.2s; + appearance: none; + -webkit-appearance: none; + width: 40px; + height: 22px; + background: var(--border-primary); + border-radius: 11px; + position: relative; + cursor: pointer; + flex-shrink: 0; + transition: background 0.2s; } .admin-toggle::after { - content: ''; - position: absolute; - top: 3px; - left: 3px; - width: 16px; - height: 16px; - border-radius: 50%; - background: #fff; - transition: transform 0.2s; + content: ""; + position: absolute; + top: 3px; + left: 3px; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + transition: transform 0.2s; } .admin-toggle:checked { - background: var(--accent-primary); + background: var(--accent-primary); } .admin-toggle:checked::after { - transform: translateX(18px); + transform: translateX(18px); } /* ── Cancel link ────────────────────────────────────────────────────────── */ .admin-cancel-link { - font-size: var(--step--1); - color: var(--text-secondary); - text-decoration: none; - font-weight: 400; + font-size: var(--step--1); + color: var(--text-secondary); + text-decoration: none; + font-weight: 400; } .admin-cancel-link:hover { - color: var(--accent-primary); + color: var(--accent-primary); } /* ── Pagination (admin list) ─────────────────────────────────────────────── */ .admin-body .pagination-wrap { - display: flex; - justify-content: center; - align-items: center; - gap: var(--space-2xs); - padding: var(--space-m) 0 var(--space-2xs); + display: flex; + justify-content: center; + align-items: center; + gap: var(--space-2xs); + padding: var(--space-m) 0 var(--space-2xs); } .admin-body .pagination-wrap ul { - display: flex; - gap: var(--space-3xs); - list-style: none; - margin: 0; - padding: 0; + display: flex; + gap: var(--space-3xs); + list-style: none; + margin: 0; + padding: 0; } .admin-body .pagination-btn { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 2.75rem; - min-height: 2.75rem; - padding: 0 var(--space-2xs); - border: 1px solid var(--border-secondary); - border-radius: var(--radius); - color: var(--text-primary); - font-size: var(--step--1); - font-weight: 400; - text-decoration: none; - transition: - border-color 0.15s, - color 0.15s; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2.75rem; + min-height: 2.75rem; + padding: 0 var(--space-2xs); + border: 1px solid var(--border-secondary); + border-radius: var(--radius); + color: var(--text-primary); + font-size: var(--step--1); + font-weight: 400; + text-decoration: none; + transition: + border-color 0.15s, + color 0.15s; } .admin-body .pagination-btn:hover:not(.disabled) { - border-color: var(--accent-primary); - color: var(--accent-primary); + border-color: var(--accent-primary); + color: var(--accent-primary); } .admin-body .pagination-btn.disabled { - opacity: 0.3; - cursor: not-allowed; - pointer-events: none; + opacity: 0.3; + cursor: not-allowed; + pointer-events: none; } .admin-body .pagination-info { - font-size: var(--step--1); - color: var(--text-secondary); - padding: 0 var(--space-2xs); + font-size: var(--step--1); + color: var(--text-secondary); + padding: 0 var(--space-2xs); } .admin-body #editor { - height: 50vh; - border: 1px solid var(--border-primary); + height: 50vh; + border: 1px solid var(--border-primary); } /* ── Settings: formulaire toggles ──────────────────────────────────────────── */ .admin-settings-toggles { - display: flex; - flex-direction: column; - gap: var(--space-xs); - margin-bottom: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-xs); + margin-bottom: var(--space-m); } .admin-toggle-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-m); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-m); - cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-m); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-m); + cursor: pointer; } .admin-toggle-row--disabled { - opacity: 0.6; + opacity: 0.6; } .admin-toggle-label { - display: flex; - flex-direction: column; - gap: 2px; + display: flex; + flex-direction: column; + gap: 2px; } .admin-toggle-label strong { - font-size: var(--step-0); + font-size: var(--step-0); } .admin-toggle-label small { - color: var(--text-secondary); - font-size: var(--step--2); + color: var(--text-secondary); + font-size: var(--step--2); } /* Native checkbox styled as toggle pill */ .admin-toggle { - appearance: none; - -webkit-appearance: none; - width: 40px; - height: 22px; - background: var(--border-primary); - border-radius: 11px; - position: relative; - cursor: pointer; - flex-shrink: 0; - transition: background 0.2s; + appearance: none; + -webkit-appearance: none; + width: 40px; + height: 22px; + background: var(--border-primary); + border-radius: 11px; + position: relative; + cursor: pointer; + flex-shrink: 0; + transition: background 0.2s; } .admin-toggle::after { - content: ''; - position: absolute; - top: 3px; - left: 3px; - width: 16px; - height: 16px; - border-radius: 50%; - background: #fff; - transition: transform 0.2s; + content: ""; + position: absolute; + top: 3px; + left: 3px; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + transition: transform 0.2s; } .admin-toggle:checked { - background: var(--accent-primary); + background: var(--accent-primary); } .admin-toggle:checked::after { - transform: translateX(18px); + transform: translateX(18px); } - /* ── Form group, student mode, thanks page → see form-base.css ──────────── */ /* ── Utility ─────────────────────────────────────────────────────────────── */ .muted { - color: var(--text-secondary); - font-style: italic; + color: var(--text-secondary); + font-style: italic; } /* ═══════════════════════════════════════════════════════════════════════════ @@ -1845,613 +1861,634 @@ th.admin-ap-col { ═══════════════════════════════════════════════════════════════════════════ */ .fhb-hint { - color: var(--text-secondary); - font-size: var(--step--1); - margin-bottom: var(--space-m); + color: var(--text-secondary); + font-size: var(--step--1); + margin-bottom: var(--space-m); } /* ── Structure container ───────────────────────────────────────────────────── */ .fhb-structure { - display: grid; - grid-template-columns: 1fr; - gap: var(--space-xs); - max-width: 100%; - margin-top: var(--space-m); + display: grid; + grid-template-columns: 1fr; + gap: var(--space-xs); + max-width: 100%; + margin-top: var(--space-m); } /* ── Fieldset cards (static reference) ─────────────────────────────────────── */ .fhb-fieldset-card { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-s); - background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-s); + background: var(--bg-secondary); } .fhb-fieldset-card-legend { - font-size: var(--step-0); - font-weight: 600; - color: var(--text-primary); - margin-bottom: var(--space-3xs); - padding-bottom: var(--space-3xs); - border-bottom: 1px solid var(--border-primary); + font-size: var(--step-0); + font-weight: 600; + color: var(--text-primary); + margin-bottom: var(--space-3xs); + padding-bottom: var(--space-3xs); + border-bottom: 1px solid var(--border-primary); } .fhb-fieldset-card-inputs { - margin: 0; - padding: 0 0 0 var(--space-s); - list-style: none; - display: flex; - flex-wrap: wrap; - gap: var(--space-3xs) var(--space-m); + margin: 0; + padding: 0 0 0 var(--space-s); + list-style: none; + display: flex; + flex-wrap: wrap; + gap: var(--space-3xs) var(--space-m); } .fhb-fieldset-card-inputs li { - font-size: var(--step--2); - color: var(--text-secondary); - line-height: 1.6; + font-size: var(--step--2); + color: var(--text-secondary); + line-height: 1.6; } .fhb-fieldset-card-inputs li::before { - content: '· '; - color: var(--text-tertiary); + content: "· "; + color: var(--text-tertiary); } /* ── Help block wrapper ────────────────────────────────────────────────────── */ .fhb-block-wrapper { - /* container for the fhb-inline, one per help block */ + /* container for the fhb-inline, one per help block */ } /* ── Inline help block (collapsed state) ───────────────────────────────────── */ .fhb-inline { - display: grid; - grid-template-columns: 1fr auto; - gap: var(--space-s); - align-items: center; - border: 1px solid var(--border-primary); - border-left: 4px solid var(--accent-primary); - border-radius: var(--radius); - padding: var(--space-xs) var(--space-s); - background: var(--bg-primary); - transition: opacity 0.15s; + display: grid; + grid-template-columns: 1fr auto; + gap: var(--space-s); + align-items: center; + border: 1px solid var(--border-primary); + border-left: 4px solid var(--accent-primary); + border-radius: var(--radius); + padding: var(--space-xs) var(--space-s); + background: var(--bg-primary); + transition: opacity 0.15s; } .fhb-inline:hover { - opacity: 0.85; + opacity: 0.85; } /* Disabled state — one line only, content hidden */ .fhb-inline--disabled { - border-left-color: var(--text-tertiary); - opacity: 0.55; + border-left-color: var(--text-tertiary); + opacity: 0.55; } .fhb-inline--disabled:hover { - opacity: 0.75; + opacity: 0.75; } .fhb-inline--disabled .fhb-md-preview, .fhb-inline--disabled .fhb-inline-empty { - display: none; + display: none; } /* Editing state */ .fhb-inline--editing { - display: grid; - grid-template-columns: 1fr; - grid-template-rows: auto 1fr auto; - border-color: var(--accent-primary); - box-shadow: 0 4px 16px rgba(149, 87, 181, 0.15); - padding: var(--space-s); - min-height: 50vh; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: auto 1fr auto; + border-color: var(--accent-primary); + box-shadow: 0 4px 16px rgba(149, 87, 181, 0.15); + padding: var(--space-s); + min-height: 50vh; } .fhb-inline--editing .fhb-inline-form { - display: grid; - grid-template-columns: 1fr; - grid-template-rows: auto auto 1fr auto; - height: 100%; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: auto auto 1fr auto; + height: 100%; } - /* ── Left side: name + content ─────────────────────────────────────────────── */ .fhb-inline-body { - min-width: 0; + min-width: 0; } .fhb-inline-name { - font-size: var(--step--1); - font-weight: 600; - color: var(--accent-secondary); - margin-bottom: var(--space-3xs); + font-size: var(--step--1); + font-weight: 600; + color: var(--accent-secondary); + margin-bottom: var(--space-3xs); } /* ── Small rendered Markdown preview ──────────────────────────────────────── */ .fhb-md-preview { - font-size: var(--step--2); - color: var(--text-secondary); - line-height: 1.45; - max-height: 6em; - overflow: hidden; + font-size: var(--step--2); + color: var(--text-secondary); + line-height: 1.45; + max-height: 6em; + overflow: hidden; } .fhb-md-preview p { - margin: 0; + margin: 0; } .fhb-md-preview p + p { - margin-top: var(--space-3xs); + margin-top: var(--space-3xs); } .fhb-md-preview ul, .fhb-md-preview ol { - margin: var(--space-3xs) 0; - padding-left: var(--space-s); + margin: var(--space-3xs) 0; + padding-left: var(--space-s); } .fhb-md-preview li { - margin-bottom: 0; + margin-bottom: 0; } -.fhb-md-preview strong { font-weight: 600; } -.fhb-md-preview em { font-style: italic; } +.fhb-md-preview strong { + font-weight: 600; +} +.fhb-md-preview em { + font-style: italic; +} .fhb-md-preview code { - font-size: 0.9em; - background: var(--bg-secondary); - padding: 0 var(--space-4xs); - border-radius: 3px; + font-size: 0.9em; + background: var(--bg-secondary); + padding: 0 var(--space-4xs); + border-radius: 3px; } .fhb-inline-empty { - font-size: var(--step--2); - color: var(--text-tertiary); - font-style: italic; + font-size: var(--step--2); + color: var(--text-tertiary); + font-style: italic; } /* ── Right side: edit button + live dot ───────────────────────────────────── */ .fhb-inline-actions { - display: flex; - flex-direction: column; - align-items: flex-end; - gap: var(--space-2xs); - flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: var(--space-2xs); + flex-shrink: 0; } .fhb-toggle-form { - margin: 0; - line-height: 0; + margin: 0; + line-height: 0; } /* Live dot — green when on, red when off */ .fhb-dot { - display: block; - width: 18px; - height: 18px; - border-radius: 50%; - border: none; - cursor: pointer; - padding: 0; - transition: opacity 0.15s; + display: block; + width: 18px; + height: 18px; + border-radius: 50%; + border: none; + cursor: pointer; + padding: 0; + transition: opacity 0.15s; } .fhb-dot:hover { - opacity: 0.7; + opacity: 0.7; } .fhb-dot--on { - background: #2d6a4f; + background: #2d6a4f; } .fhb-dot--off { - background: #c0392b; + background: #c0392b; } /* ── Editor form ──────────────────────────────────────────────────────────── */ .fhb-edit-name-row { - margin-bottom: var(--space-xs); + margin-bottom: var(--space-xs); } .fhb-edit-label { - display: block; - font-size: var(--step--2); - font-weight: 400; - color: var(--text-primary); - margin-bottom: var(--space-3xs); + display: block; + font-size: var(--step--2); + font-weight: 400; + color: var(--text-primary); + margin-bottom: var(--space-3xs); } .fhb-name-input { - width: 100%; - max-width: 400px; + width: 100%; + max-width: 400px; } .fhb-name-input:focus { - outline: none; - border-color: var(--accent-primary); - box-shadow: 0 0 0 2px var(--accent-muted); + outline: none; + border-color: var(--accent-primary); + box-shadow: 0 0 0 2px var(--accent-muted); } .fhb-overtype-editor .--type-container { - border-radius: var(--radius); + border-radius: var(--radius); } .fhb-edit-buttons { - display: grid; - grid-auto-flow: column; - grid-auto-columns: max-content; - gap: var(--space-xs); - margin-top: var(--space-xs); + display: grid; + grid-auto-flow: column; + grid-auto-columns: max-content; + gap: var(--space-xs); + margin-top: var(--space-xs); } .fhb-inline-form { - margin-top: var(--space-xs); + margin-top: var(--space-xs); } /* ── Mobile: admin unavailable ─────────────────────────────────────────── */ .admin-mobile-block { - display: none; + display: none; } @media screen and (max-width: 640px) { - .admin-body header { - display: none; - } + .admin-body header { + display: none; + } - .admin-body main { - display: none; - } + .admin-body main { + display: none; + } - .admin-mobile-block { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100vh; - padding: var(--space-l); - text-align: center; - color: var(--text-secondary); - } + .admin-mobile-block { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + padding: var(--space-l); + text-align: center; + color: var(--text-secondary); + } - .admin-mobile-block svg { - width: 48px; - height: 48px; - fill: var(--text-tertiary); - margin-bottom: var(--space-m); - } + .admin-mobile-block svg { + width: 48px; + height: 48px; + fill: var(--text-tertiary); + margin-bottom: var(--space-m); + } - .admin-mobile-block h2 { - font-size: var(--step-0); - font-weight: 600; - color: var(--text-primary); - margin: 0 0 var(--space-xs); - } + .admin-mobile-block h2 { + font-size: var(--step-0); + font-weight: 600; + color: var(--text-primary); + margin: 0 0 var(--space-xs); + } - .admin-mobile-block p { - font-size: var(--step--1); - margin: 0; - } + .admin-mobile-block p { + font-size: var(--step--1); + margin: 0; + } } /* ── Active search loading indicator ───────────────────────────────────── */ .admin-search-indicator { - display: block; - height: 2px; - background: var(--accent-primary); - opacity: 0; - transition: opacity 0.15s; - pointer-events: none; - margin-top: var(--space-2xs); + display: block; + height: 2px; + background: var(--accent-primary); + opacity: 0; + transition: opacity 0.15s; + pointer-events: none; + margin-top: var(--space-2xs); } .admin-search-indicator.htmx-request { - opacity: 1; - animation: admin-search-progress 1.2s ease-in-out infinite; + opacity: 1; + animation: admin-search-progress 1.2s ease-in-out infinite; } @keyframes admin-search-progress { - 0% { transform: scaleX(0); transform-origin: left; } - 50% { transform: scaleX(1); transform-origin: left; } - 50.01% { transform: scaleX(1); transform-origin: right; } - 100% { transform: scaleX(0); transform-origin: right; } + 0% { + transform: scaleX(0); + transform-origin: left; + } + 50% { + transform: scaleX(1); + transform-origin: left; + } + 50.01% { + transform: scaleX(1); + transform-origin: right; + } + 100% { + transform: scaleX(0); + transform-origin: right; + } } /* ── Sidebar TOC (matches public .page-content grid layout) ────────────── */ .admin-main--toc { - display: grid; - grid-template-columns: 180px 1fr; - gap: var(--space-2xl); - align-items: start; - padding: var(--space-xl) var(--space-m) var(--space-2xl); + display: grid; + grid-template-columns: 180px 1fr; + gap: var(--space-2xl); + align-items: start; + padding: var(--space-xl) var(--space-m) var(--space-2xl); } /* Desktop: article in second column */ @media (min-width: 768px) { - .admin-main--toc > article { - grid-column: 2; - min-width: 0; - max-width: 100%; - } + .admin-main--toc > article { + grid-column: 2; + min-width: 0; + max-width: 100%; + } } /* Mobile: single column */ @media (max-width: 767px) { - .admin-main--toc { - grid-template-columns: 1fr; - gap: var(--space-l); - padding: var(--space-m) var(--space-s) var(--space-xl); - } + .admin-main--toc { + grid-template-columns: 1fr; + gap: var(--space-l); + padding: var(--space-m) var(--space-s) var(--space-xl); + } - .admin-main--toc > article { - grid-column: 1; - } + .admin-main--toc > article { + grid-column: 1; + } } /* Align first child of article with TOC heading (same as public) */ .admin-main--toc > article > :first-child { - margin-top: 2.2rem; + margin-top: 2.2rem; } .admin-main--toc > article > section { - margin-bottom: var(--space-xl); + margin-bottom: var(--space-xl); } .admin-main--toc > article > section > fieldset { - margin-bottom: var(--space-m); + margin-bottom: var(--space-m); } /* Admin TOC: same
as public pages, positioned sticky */ #admin-toc .toc-list a { - font-size: var(--step--1); + font-size: var(--step--1); } /* ── Lazy-load transition ─────────────────────────────────────────────────── */ .htmx-settling img { - opacity: 0; + opacity: 0; } .htmx-indicator img { - transition: opacity 300ms ease-in; + transition: opacity 300ms ease-in; } /* ── Récapitulatif sections ───────────────────────────────── */ .admin-main--recap > fieldset { - margin-bottom: var(--space-l); + margin-bottom: var(--space-l); } .admin-main--recap > fieldset:last-of-type { - margin-bottom: 0; + margin-bottom: 0; } .recap-synopsis, .recap-long-text { - max-width: 70ch; - line-height: 1.6; + max-width: 70ch; + line-height: 1.6; } /* Two-column definition lists */ .recap-dl { - display: grid; - grid-template-columns: auto 1fr; - gap: var(--space-2xs) var(--space-m); - margin: 0; + display: grid; + grid-template-columns: auto 1fr; + gap: var(--space-2xs) var(--space-m); + margin: 0; } .recap-dl dt { - font-weight: 600; - color: var(--text-secondary); - font-size: var(--step--1); - white-space: nowrap; + font-weight: 600; + color: var(--text-secondary); + font-size: var(--step--1); + white-space: nowrap; } .recap-dl dd { - margin: 0 0 var(--space-xs) 0; - color: var(--text-primary); - font-size: var(--step--1); + margin: 0 0 var(--space-xs) 0; + color: var(--text-primary); + font-size: var(--step--1); } .recap-dl dd:last-of-type { - margin-bottom: 0; + margin-bottom: 0; } /* ── Apropos contacts grid ──────────────────────────────────────────────── */ .apropos-entry { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--space-s); - margin-bottom: var(--space-xs); + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-s); + margin-bottom: var(--space-xs); } .apropos-entry > div { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .apropos-entry label { - font-size: var(--step--1); - margin-bottom: var(--space-3xs); + font-size: var(--step--1); + margin-bottom: var(--space-3xs); } .apropos-entry input { - width: 100%; - box-sizing: border-box; + width: 100%; + box-sizing: border-box; } /* ── Sidebar links editor ──────────────────────────────────────────────── */ .sidebar-link-row { - display: flex; - align-items: flex-start; - gap: var(--space-xs); - margin-bottom: var(--space-s); + display: flex; + align-items: flex-start; + gap: var(--space-xs); + margin-bottom: var(--space-s); } .sidebar-link-fields { - display: grid; - grid-template-columns: 1fr 2fr; - gap: var(--space-s); - flex: 1; + display: grid; + grid-template-columns: 1fr 2fr; + gap: var(--space-s); + flex: 1; } .sidebar-link-fields > div { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .sidebar-link-fields label { - font-size: var(--step--1); - margin-bottom: var(--space-3xs); + font-size: var(--step--1); + margin-bottom: var(--space-3xs); } .sidebar-link-fields input { - width: 100%; - box-sizing: border-box; + width: 100%; + box-sizing: border-box; } .sidebar-link-row .admin-icon-btn--delete { - margin-top: calc(var(--step--1) + var(--space-3xs) + 0.3em); - flex-shrink: 0; + margin-top: calc(var(--step--1) + var(--space-3xs) + 0.3em); + flex-shrink: 0; } /* ── Auto-save status indicator ────────────────────────────────────────── */ .autosave-status { - font-size: var(--step--2); - min-height: 1.5em; - margin-top: var(--space-2xs); - color: var(--text-tertiary); - transition: color 0.2s; + font-size: var(--step--2); + min-height: 1.5em; + margin-top: var(--space-2xs); + color: var(--text-tertiary); + transition: color 0.2s; } .autosave-status--saving { - color: var(--accent-yellow); - font-style: italic; + color: var(--accent-yellow); + font-style: italic; } .autosave-status--saved { - color: var(--accent-green); + color: var(--accent-green); } .autosave-status--error { - color: var(--error); - font-weight: 500; + color: var(--error); + font-weight: 500; } /* ── Markdown Cheatsheet Dialog ──────────────────────────────────────── */ .md-cheatsheet-dialog { - border: 1px solid var(--border); - border-radius: var(--radius-m, 8px); - padding: 0 0 var(--space-m); - max-width: 640px; - width: 90vw; - box-shadow: 0 8px 32px rgba(0,0,0,0.18); + border: 1px solid var(--border); + border-radius: var(--radius-m, 8px); + padding: 0 0 var(--space-m); + max-width: 640px; + width: 90vw; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18); } .md-cheatsheet-dialog::backdrop { - background: rgba(0,0,0,0.35); + background: rgba(0, 0, 0, 0.35); } .md-cheatsheet-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: var(--space-s) var(--space-m); - border-bottom: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-s) var(--space-m); + border-bottom: 1px solid var(--border); } .md-cheatsheet-header h2 { - margin: 0; - font-size: var(--step-0); + margin: 0; + font-size: var(--step-0); } .md-cheatsheet-table { - width: 100%; - border-collapse: collapse; - font-size: var(--step--1); + width: 100%; + border-collapse: collapse; + font-size: var(--step--1); } .md-cheatsheet-table th { - text-align: left; - padding: var(--space-2xs) var(--space-s); - background: var(--surface2); - font-weight: 600; - border-bottom: 2px solid var(--border); + text-align: left; + padding: var(--space-2xs) var(--space-s); + background: var(--surface2); + font-weight: 600; + border-bottom: 2px solid var(--border); } .md-cheatsheet-table td { - padding: var(--space-2xs) var(--space-s); - border-bottom: 1px solid var(--border); - vertical-align: top; + padding: var(--space-2xs) var(--space-s); + border-bottom: 1px solid var(--border); + vertical-align: top; } .md-cheatsheet-syntax { - font-family: var(--font-mono, monospace); - white-space: nowrap; + font-family: var(--font-mono, monospace); + white-space: nowrap; } .md-cheatsheet-syntax code { - background: var(--surface2); - padding: 0.1em 0.35em; - border-radius: 3px; - font-size: inherit; + background: var(--surface2); + padding: 0.1em 0.35em; + border-radius: 3px; + font-size: inherit; } .md-cheatsheet-render { - min-width: 140px; + min-width: 140px; } .md-cheatsheet-render h1, .md-cheatsheet-render h2, .md-cheatsheet-render h3 { - margin: 0; - line-height: 1.3; + margin: 0; + line-height: 1.3; } -.md-cheatsheet-render h1 { font-size: var(--step-2); } -.md-cheatsheet-render h2 { font-size: var(--step-1); } -.md-cheatsheet-render h3 { font-size: var(--step-0); } +.md-cheatsheet-render h1 { + font-size: var(--step-2); +} +.md-cheatsheet-render h2 { + font-size: var(--step-1); +} +.md-cheatsheet-render h3 { + font-size: var(--step-0); +} .md-cheatsheet-render blockquote { - margin: 0; - padding-left: var(--space-2xs); - border-left: 3px solid var(--border); - color: var(--text-secondary); + margin: 0; + padding-left: var(--space-2xs); + border-left: 3px solid var(--border); + color: var(--text-secondary); } .md-cheatsheet-render ul, .md-cheatsheet-render ol { - margin: 0; - padding-left: var(--space-m); + margin: 0; + padding-left: var(--space-m); } .md-cheatsheet-render hr { - margin: var(--space-3xs) 0; - border: 0; - border-top: 1px solid var(--border); + margin: var(--space-3xs) 0; + border: 0; + border-top: 1px solid var(--border); } .md-cheatsheet-link { - color: var(--accent-blue, var(--link)); + color: var(--accent-blue, var(--link)); } .md-cheatsheet-img { - opacity: 0.7; + opacity: 0.7; } .md-cheatsheet-note { - color: var(--text-tertiary); - font-size: var(--step--2); + color: var(--text-tertiary); + font-size: var(--step--2); } .md-cheatsheet-separator td { - padding: var(--space-3xs) 0; - border: 0; + padding: var(--space-3xs) 0; + border: 0; } diff --git a/app/public/assets/css/base.css b/app/public/assets/css/base.css index aaf70f7..ca18cf2 100644 --- a/app/public/assets/css/base.css +++ b/app/public/assets/css/base.css @@ -5,72 +5,85 @@ ============================================================ */ /* Full-height flex layout: header → main → (optional footer) */ -html, body { - height: 100%; - overflow: hidden; +html, +body { + height: 100%; + overflow: hidden; } /* ── Discreet scrollbars ─────────────────────────────────────────── */ /* WebKit browsers */ ::-webkit-scrollbar { - width: 5px; - height: 5px; + width: 5px; + height: 5px; } ::-webkit-scrollbar-track { - background: transparent; + background: transparent; } ::-webkit-scrollbar-thumb { - background: var(--text-tertiary); - border-radius: 3px; + background: var(--text-tertiary); + border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { - background: var(--text-secondary); + background: var(--text-secondary); } /* Firefox */ * { - scrollbar-width: thin; - scrollbar-color: var(--text-tertiary) transparent; + scrollbar-width: thin; + scrollbar-color: var(--text-tertiary) transparent; } body { - font-family: var(--font-body); - font-weight: 300; - color: var(--text-primary); - background: linear-gradient( - 180deg, - rgba(0, 0, 0, 0) 92%, - rgba(149, 87, 181, 1) 100% - ); - display: flex; - flex-direction: column; + font-family: var(--font-body); + font-weight: 300; + color: var(--text-primary); + background: linear-gradient( + 180deg, + rgba(0, 0, 0, 0) 92%, + rgba(149, 87, 181, 1) 100% + ); + display: flex; + flex-direction: column; } main { - flex: 1; - min-height: 0; - overflow-wrap: anywhere; + flex: 1; + min-height: 0; + overflow-wrap: anywhere; } main * { - overflow-wrap: anywhere; - word-break: break-word; + overflow-wrap: anywhere; + word-break: break-word; } /* Global heading scale — used by admin + public pages */ -h1 { font-size: var(--step-4); } -h2 { font-size: var(--step-3); } -h3 { font-size: var(--step-2); } -h4 { font-size: var(--step-1); } -h5 { font-size: var(--step-0); } -h6 { font-size: var(--step--1); } +h1 { + font-size: var(--step-4); +} +h2 { + font-size: var(--step-3); +} +h3 { + font-size: var(--step-2); +} +h4 { + font-size: var(--step-1); +} +h5 { + font-size: var(--step-0); +} +h6 { + font-size: var(--step--1); +} :where(h1, h2, h3, h4, h5, h6) { - font-family: var(--font-display); - font-weight: 400; - margin: 0 0 var(--space-l) 0; - line-height: 1.15; + font-family: var(--font-display); + font-weight: 400; + margin: 0 0 var(--space-l) 0; + line-height: 1.15; } diff --git a/app/public/assets/css/colors.css b/app/public/assets/css/colors.css index 0c12034..a97dd98 100644 --- a/app/public/assets/css/colors.css +++ b/app/public/assets/css/colors.css @@ -4,80 +4,80 @@ ============================================================ */ :root { - /* Backgrounds */ - --bg-primary: #ffffff; - --bg-secondary: #f5f5f5; - --bg-tertiary: #e8e8e8; - --bg-active: #d0d0d0; + /* Backgrounds */ + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-tertiary: #e8e8e8; + --bg-active: #d0d0d0; - /* Text */ - --text-primary: #111111; - --text-secondary: #666666; - --text-tertiary: #999999; + /* Text */ + --text-primary: #111111; + --text-secondary: #666666; + --text-tertiary: #999999; - /* Borders */ - --border-primary: #dddddd; - --border-secondary: #cccccc; + /* Borders */ + --border-primary: #dddddd; + --border-secondary: #cccccc; - /* Border radius */ - --radius: 10px; + /* Border radius */ + --radius: 10px; - /* Status */ - --success: #5cd69d; - --error: #f25a5a; - --warning: #fbca51; + /* Status */ + --success: #5cd69d; + --error: #f25a5a; + --warning: #fbca51; - /* Accent */ - --accent-primary: #9557b5; - --accent-secondary: #683d7f; - --accent-foreground: #ffffff; - --accent-muted: rgba(149, 87, 181, 0.12); - --accent-blue: #41adff; - --accent-green: #4caf50; - --accent-yellow: #f39c12; - --accent-red: #f25a5a; + /* Accent */ + --accent-primary: #9557b5; + --accent-secondary: #683d7f; + --accent-foreground: #ffffff; + --accent-muted: rgba(149, 87, 181, 0.12); + --accent-blue: #41adff; + --accent-green: #4caf50; + --accent-yellow: #f39c12; + --accent-red: #f25a5a; - /* Gradient (header) */ - --gradient-1: #42963f; - --gradient-2: #65e478; - --gradient-3: #57abc7; - --gradient-4: #db53ed; + /* Gradient (header) */ + --gradient-1: #42963f; + --gradient-2: #65e478; + --gradient-3: #57abc7; + --gradient-4: #db53ed; - /* Header decorative */ - --header-gradient-fade: rgba(149, 87, 181, 0); - --header-shadow-strong: rgba(119, 70, 145, 1); - --header-shadow-soft: rgba(119, 70, 145, 0.8); - --header-nav-active-border: rgba(255, 255, 255, 0.6); + /* Header decorative */ + --header-gradient-fade: rgba(149, 87, 181, 0); + --header-shadow-strong: rgba(119, 70, 145, 1); + --header-shadow-soft: rgba(119, 70, 145, 0.8); + --header-nav-active-border: rgba(255, 255, 255, 0.6); - /* Search error block */ - --search-error-bg: #fff0f0; - --search-error-border: #cc0000; - --search-error-color: #cc0000; + /* Search error block */ + --search-error-bg: #fff0f0; + --search-error-border: #cc0000; + --search-error-color: #cc0000; - /* System page — log/config syntax highlight */ - --sys-syntax-comment: #999999; - --sys-syntax-directive: #1a6fb5; - --sys-syntax-block: #7a2fa0; - --sys-syntax-value: #a05c00; - --sys-syntax-location: #1a7a6b; - --sys-syntax-notice: #3a6ea8; - --sys-syntax-crit: #c0392b; + /* System page — log/config syntax highlight */ + --sys-syntax-comment: #999999; + --sys-syntax-directive: #1a6fb5; + --sys-syntax-block: #7a2fa0; + --sys-syntax-value: #a05c00; + --sys-syntax-location: #1a7a6b; + --sys-syntax-notice: #3a6ea8; + --sys-syntax-crit: #c0392b; - /* Muted alpha overlays — derived from semantic tokens */ - --success-muted-bg: rgba(92, 214, 157, 0.12); - --success-muted-border: rgba(92, 214, 157, 0.35); - --warning-muted-bg: rgba(251, 202, 81, 0.12); - --warning-muted-border: rgba(251, 202, 81, 0.35); - --error-muted-bg: rgba(242, 90, 90, 0.12); - --error-muted-border: rgba(242, 90, 90, 0.35); - --blue-muted-bg: rgba(65, 173, 255, 0.12); - --blue-muted-border: rgba(65, 173, 255, 0.3); - --blue-muted-bg-hover: rgba(65, 173, 255, 0.22); - --yellow-muted-bg: rgba(243, 156, 18, 0.12); - --yellow-muted-border: rgba(243, 156, 18, 0.3); - --yellow-muted-bg-hover: rgba(243, 156, 18, 0.22); - --green-muted-bg: rgba(76, 175, 80, 0.12); - --green-muted-border: rgba(76, 175, 80, 0.3); - --green-muted-bg-hover: rgba(76, 175, 80, 0.22); - --danger-border-muted: rgba(242, 90, 90, 0.35); + /* Muted alpha overlays — derived from semantic tokens */ + --success-muted-bg: rgba(92, 214, 157, 0.12); + --success-muted-border: rgba(92, 214, 157, 0.35); + --warning-muted-bg: rgba(251, 202, 81, 0.12); + --warning-muted-border: rgba(251, 202, 81, 0.35); + --error-muted-bg: rgba(242, 90, 90, 0.12); + --error-muted-border: rgba(242, 90, 90, 0.35); + --blue-muted-bg: rgba(65, 173, 255, 0.12); + --blue-muted-border: rgba(65, 173, 255, 0.3); + --blue-muted-bg-hover: rgba(65, 173, 255, 0.22); + --yellow-muted-bg: rgba(243, 156, 18, 0.12); + --yellow-muted-border: rgba(243, 156, 18, 0.3); + --yellow-muted-bg-hover: rgba(243, 156, 18, 0.22); + --green-muted-bg: rgba(76, 175, 80, 0.12); + --green-muted-border: rgba(76, 175, 80, 0.3); + --green-muted-bg-hover: rgba(76, 175, 80, 0.22); + --danger-border-muted: rgba(242, 90, 90, 0.35); } diff --git a/app/public/assets/css/components/badges.css b/app/public/assets/css/components/badges.css index 36cb2d3..ec79c18 100644 --- a/app/public/assets/css/components/badges.css +++ b/app/public/assets/css/components/badges.css @@ -4,45 +4,45 @@ ============================================================ */ .status-badge { - display: inline-block; - padding: var(--space-3xs) var(--space-2xs); - border-radius: var(--radius); - font-size: var(--step--2); - font-weight: 500; - letter-spacing: 0.04em; + display: inline-block; + padding: var(--space-3xs) var(--space-2xs); + border-radius: var(--radius); + font-size: var(--step--2); + font-weight: 500; + letter-spacing: 0.04em; } .status-published { - background: var(--green-muted-bg); - color: var(--accent-green); + background: var(--green-muted-bg); + color: var(--accent-green); } .status-pending { - background: var(--warning-muted-bg); - color: var(--warning); + background: var(--warning-muted-bg); + color: var(--warning); } .status-access { - display: inline-block; - font-size: var(--step--2); - padding: var(--space-3xs) var(--space-3xs); - border-radius: var(--radius); - background: var(--bg-tertiary); - color: var(--text-secondary); - letter-spacing: 0.03em; + display: inline-block; + font-size: var(--step--2); + padding: var(--space-3xs) var(--space-3xs); + border-radius: var(--radius); + background: var(--bg-tertiary); + color: var(--text-secondary); + letter-spacing: 0.03em; } .status-access--libre { - background: var(--green-muted-bg); - color: var(--accent-green); + background: var(--green-muted-bg); + color: var(--accent-green); } .status-access--interne { - background: var(--blue-muted-bg); - color: var(--accent-blue); + background: var(--blue-muted-bg); + color: var(--accent-blue); } .status-access--interdit { - background: var(--error-muted-bg); - color: var(--error); + background: var(--error-muted-bg); + color: var(--error); } diff --git a/app/public/assets/css/components/buttons.css b/app/public/assets/css/components/buttons.css index 40208f1..7cd7942 100644 --- a/app/public/assets/css/components/buttons.css +++ b/app/public/assets/css/components/buttons.css @@ -5,142 +5,165 @@ ============================================================ */ .btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-3xs); - padding: var(--space-xs); - border-radius: var(--radius); - font-size: var(--step--1); - font-family: inherit; - font-weight: 500; - letter-spacing: 0.04em; - cursor: pointer; - text-decoration: none; - line-height: 1.3; - border: none; - transition: background 0.15s, opacity 0.15s, box-shadow 0.15s, filter 0.15s; - width: fit-content; + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-3xs); + padding: var(--space-xs); + border-radius: var(--radius); + font-size: var(--step--1); + font-family: inherit; + font-weight: 500; + letter-spacing: 0.04em; + cursor: pointer; + text-decoration: none; + line-height: 1.3; + border: none; + transition: + background 0.15s, + opacity 0.15s, + box-shadow 0.15s, + filter 0.15s; + width: fit-content; } -.btn:hover { filter: brightness(0.92); } +.btn:hover { + filter: brightness(0.92); +} /* Primary: accent background, white text */ .btn--primary { - background: var(--accent-primary); - color: var(--accent-foreground); - border: 1px solid transparent; + background: var(--accent-primary); + color: var(--accent-foreground); + border: 1px solid transparent; } .btn--primary:hover { - background: var(--accent-secondary); - filter: none; + background: var(--accent-secondary); + filter: none; } /* Secondary: light background with border */ .btn--secondary { - background: var(--bg-primary); - color: var(--text-secondary); - border: 1px solid var(--border-primary); + background: var(--bg-primary); + color: var(--text-secondary); + border: 1px solid var(--border-primary); } .btn--secondary:hover { - border-color: var(--text-secondary); - color: var(--text-primary); - filter: none; + border-color: var(--text-secondary); + color: var(--text-primary); + filter: none; } /* Muted secondary: bg-secondary background */ .btn--muted { - background: var(--bg-secondary); - color: var(--text-secondary); - border: 1px solid var(--border-primary); + background: var(--bg-secondary); + color: var(--text-secondary); + border: 1px solid var(--border-primary); } .btn--muted:hover { - background: var(--bg-tertiary); - color: var(--text-primary); - filter: none; + background: var(--bg-tertiary); + color: var(--text-primary); + filter: none; } /* Ghost: transparent bg, border, for links styled as buttons */ .btn--ghost { - background: transparent; - color: var(--text-secondary); - border: 1px solid var(--border-primary); + background: transparent; + color: var(--text-secondary); + border: 1px solid var(--border-primary); } .btn--ghost:hover { - border-color: var(--text-secondary); - color: var(--text-primary); - filter: none; + border-color: var(--text-secondary); + color: var(--text-primary); + filter: none; } /* Danger: red background */ .btn--danger { - background: var(--accent-red); - color: var(--accent-foreground); + background: var(--accent-red); + color: var(--accent-foreground); } -.btn--danger:hover { filter: brightness(0.9); } +.btn--danger:hover { + filter: brightness(0.9); +} /* Warning: yellow background */ .btn--warning { - background: var(--accent-yellow); - color: var(--text-primary); + background: var(--accent-yellow); + color: var(--text-primary); } -.btn--warning:hover { filter: brightness(0.9); } +.btn--warning:hover { + filter: brightness(0.9); +} /* Success: green background */ .btn--success { - background: var(--accent-green); - color: var(--accent-foreground); + background: var(--accent-green); + color: var(--accent-foreground); } -.btn--success:hover { filter: brightness(0.9); } +.btn--success:hover { + filter: brightness(0.9); +} /* Small size modifier */ .btn--sm { - padding: var(--space-2xs) var(--space-xs); - font-size: var(--step--2); + padding: var(--space-2xs) var(--space-xs); + font-size: var(--step--2); } /* Large size modifier */ .btn--lg { - padding: var(--space-s) var(--space-m); - font-size: var(--step-0); + padding: var(--space-s) var(--space-m); + font-size: var(--step-0); } /* Semantic colour modifiers on muted base (for table/action buttons) */ .btn--blue { - background: var(--blue-muted-bg); - color: var(--accent-blue); - border: 1px solid var(--blue-muted-border); + background: var(--blue-muted-bg); + color: var(--accent-blue); + border: 1px solid var(--blue-muted-border); } -.btn--blue:hover { background: var(--blue-muted-bg-hover); filter: none; } +.btn--blue:hover { + background: var(--blue-muted-bg-hover); + filter: none; +} .btn--yellow { - background: var(--yellow-muted-bg); - color: var(--accent-yellow); - border: 1px solid var(--yellow-muted-border); + background: var(--yellow-muted-bg); + color: var(--accent-yellow); + border: 1px solid var(--yellow-muted-border); } -.btn--yellow:hover { background: var(--yellow-muted-bg-hover); filter: none; } +.btn--yellow:hover { + background: var(--yellow-muted-bg-hover); + filter: none; +} .btn--green { - background: var(--green-muted-bg); - color: var(--accent-green); - border: 1px solid var(--green-muted-border); + background: var(--green-muted-bg); + color: var(--accent-green); + border: 1px solid var(--green-muted-border); } -.btn--green:hover { background: var(--green-muted-bg-hover); filter: none; } +.btn--green:hover { + background: var(--green-muted-bg-hover); + filter: none; +} .btn--red { - background: var(--error-muted-bg); - color: var(--error); - border: 1px solid var(--danger-border-muted); + background: var(--error-muted-bg); + color: var(--error); + border: 1px solid var(--danger-border-muted); } -.btn--red:hover { filter: brightness(0.9); } +.btn--red:hover { + filter: brightness(0.9); +} diff --git a/app/public/assets/css/components/details.css b/app/public/assets/css/components/details.css index d77de55..39b499d 100644 --- a/app/public/assets/css/components/details.css +++ b/app/public/assets/css/components/details.css @@ -4,41 +4,43 @@ ============================================================ */ details > summary { - cursor: pointer; - list-style: none; + cursor: pointer; + list-style: none; } details > summary::-webkit-details-marker { - display: none; + display: none; } details { - border: 1px solid var(--border-color); - border-radius: var(--radius, 6px); - background: var(--bg-secondary, var(--surface)); - overflow: hidden; + border: 1px solid var(--border-color); + border-radius: var(--radius, 6px); + background: var(--bg-secondary, var(--surface)); + overflow: hidden; } details[open] { - padding-bottom: var(--space-s); + padding-bottom: var(--space-s); } details > :not(summary) { - padding-left: var(--space-s); - padding-right: var(--space-s); + padding-left: var(--space-s); + padding-right: var(--space-s); } summary { - font-family: var(--font-display); - font-weight: 600; - text-decoration: none; - color: var(--text-primary); - transition: color 0.15s, background 0.15s; - padding: var(--space-s); - cursor: pointer; + font-family: var(--font-display); + font-weight: 600; + text-decoration: none; + color: var(--text-primary); + transition: + color 0.15s, + background 0.15s; + padding: var(--space-s); + cursor: pointer; } summary:hover { - color: var(--accent-primary); - background: var(--hover-bg, rgba(0, 0, 0, 0.03)); + color: var(--accent-primary); + background: var(--hover-bg, rgba(0, 0, 0, 0.03)); } diff --git a/app/public/assets/css/components/dialog.css b/app/public/assets/css/components/dialog.css index 44764ce..18ea5ee 100644 --- a/app/public/assets/css/components/dialog.css +++ b/app/public/assets/css/components/dialog.css @@ -4,14 +4,14 @@ ============================================================ */ dialog { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - background: var(--bg-primary); - color: var(--text-primary); - padding: 0; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: var(--bg-primary); + color: var(--text-primary); + padding: 0; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18); } dialog::backdrop { - background: rgba(0, 0, 0, 0.45); + background: rgba(0, 0, 0, 0.45); } diff --git a/app/public/assets/css/components/focus.css b/app/public/assets/css/components/focus.css index e7f83d4..8056409 100644 --- a/app/public/assets/css/components/focus.css +++ b/app/public/assets/css/components/focus.css @@ -4,8 +4,8 @@ ============================================================ */ :focus-visible { - outline: none; - box-shadow: 0 0 0 2px var(--accent-primary); - border-radius: var(--radius); - padding: var(--space-3xs) var(--space-xs); + outline: none; + box-shadow: 0 0 0 2px var(--accent-primary); + border-radius: var(--radius); + padding: var(--space-3xs) var(--space-xs); } diff --git a/app/public/assets/css/components/forms.css b/app/public/assets/css/components/forms.css index ebbc4e1..5b78761 100644 --- a/app/public/assets/css/components/forms.css +++ b/app/public/assets/css/components/forms.css @@ -7,107 +7,119 @@ /* ── Labels ─────────────────────────────────────────────────────────── */ label { - display: block; - margin-bottom: var(--space-3xs); - font-weight: 400; + display: block; + margin-bottom: var(--space-3xs); + font-weight: 400; } /* ── Text inputs, selects, textareas ────────────────────────────────── */ -input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]), +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( + [type="hidden"] +):not([type="submit"]):not([type="button"]):not([type="reset"]):not( + [type="color"] +), textarea { - font-family: inherit; - font-size: var(--step--1); - padding: var(--space-2xs) var(--space-xs); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - background: transparent; - color: var(--text-primary); - transition: border-color 0.15s; + font-family: inherit; + font-size: var(--step--1); + padding: var(--space-2xs) var(--space-xs); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: transparent; + color: var(--text-primary); + transition: border-color 0.15s; } -input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]):focus, +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( + [type="hidden"] +):not([type="submit"]):not([type="button"]):not([type="reset"]):not( + [type="color"] +):focus, textarea:focus { - outline: none; - border: 2px solid var(--accent-primary); + outline: none; + border: 2px solid var(--accent-primary); } input::placeholder, textarea::placeholder { - color: var(--text-tertiary); - font-size: var(--step--1); + color: var(--text-tertiary); + font-size: var(--step--1); } textarea { - resize: vertical; - min-height: 80px; - line-height: 1.5; + resize: vertical; + min-height: 80px; + line-height: 1.5; } /* ── Select ─────────────────────────────────────────────────────────── */ select { - font-family: inherit; - font-size: var(--step--1); - padding: var(--space-2xs) var(--space-xs); - padding-right: 1.75rem; - border: 1px solid var(--border-primary); - border-radius: var(--radius); - background: transparent; - color: var(--text-primary); - cursor: pointer; - background-image: url("/assets/icons/select-chevron.svg"); - background-repeat: no-repeat; - background-position: right 0.55rem center; - -webkit-appearance: none; - appearance: none; - transition: border-color 0.15s; + font-family: inherit; + font-size: var(--step--1); + padding: var(--space-2xs) var(--space-xs); + padding-right: 1.75rem; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: transparent; + color: var(--text-primary); + cursor: pointer; + background-image: url("/assets/icons/select-chevron.svg"); + background-repeat: no-repeat; + background-position: right 0.55rem center; + -webkit-appearance: none; + appearance: none; + transition: border-color 0.15s; } select:focus { - outline: none; - border: 2px solid var(--accent-primary); + outline: none; + border: 2px solid var(--accent-primary); } /* ── Checkboxes & radios ────────────────────────────────────────────── */ input[type="checkbox"], input[type="radio"] { - accent-color: var(--accent-primary); - width: 16px; - height: 16px; - cursor: pointer; - flex-shrink: 0; - margin: 0; + accent-color: var(--accent-primary); + width: 16px; + height: 16px; + cursor: pointer; + flex-shrink: 0; + margin: 0; } -input[type="radio"] { border-radius: 50%; } +input[type="radio"] { + border-radius: 50%; +} /* ── Fieldsets & legends ──────────────────────────────────────────────── */ fieldset { - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: 0 var(--space-m) var(--space-m) var(--space-m); - margin: 0; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: 0 var(--space-m) var(--space-m) var(--space-m); + margin: 0; } -fieldset > *:not(:last-child) { margin-bottom: var(--space-xs); } +fieldset > *:not(:last-child) { + margin-bottom: var(--space-xs); +} legend { - font-size: var(--step--1); - font-weight: 400; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-secondary); - padding: 0 var(--space-2xs); + font-size: var(--step--1); + font-weight: 400; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--text-secondary); + padding: 0 var(--space-2xs); } /* ── Small / help text ──────────────────────────────────────────────────── */ small { - font-size: var(--step--2); - color: var(--text-secondary); - display: block; - margin-top: var(--space-3xs); + font-size: var(--step--2); + color: var(--text-secondary); + display: block; + margin-top: var(--space-3xs); } diff --git a/app/public/assets/css/components/header.css b/app/public/assets/css/components/header.css index b1ab464..18207a2 100644 --- a/app/public/assets/css/components/header.css +++ b/app/public/assets/css/components/header.css @@ -6,81 +6,81 @@ /* ── Header bar ─────────────────────────────────────────────────────── */ header { - vertical-align: center; - flex-shrink: 0; - background: linear-gradient( - 0deg, - rgba(192, 93, 225, 1) 0%, - rgba(51, 191, 135, 1) 66%, - rgba(60, 133, 108, 1) 100% - ); + vertical-align: center; + flex-shrink: 0; + background: linear-gradient( + 0deg, + rgba(192, 93, 225, 1) 0%, + rgba(51, 191, 135, 1) 66%, + rgba(60, 133, 108, 1) 100% + ); } /* ── Navigation ────────────────────────────────────────────────────── */ header nav { - padding: var(--space-s) var(--space-s); - display: flex; - align-items: center; - justify-content: space-between; - font-size: var(--step-0); + padding: var(--space-s) var(--space-s); + display: flex; + align-items: center; + justify-content: space-between; + font-size: var(--step-0); } header nav ul { - display: flex; - gap: var(--space-l); - align-items: center; - list-style: none; - margin: 0; - padding: 0; + display: flex; + gap: var(--space-l); + align-items: center; + list-style: none; + margin: 0; + padding: 0; } header nav ul a { - font-family: var(--font-display); - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--accent-foreground); - text-decoration: none; - padding: var(--space-3xs) var(--space-xs); - text-shadow: - 0 0 16px var(--header-shadow-strong), - 0 0 32px var(--header-shadow-soft); - transition: opacity 0.15s; + font-family: var(--font-display); + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--accent-foreground); + text-decoration: none; + padding: var(--space-3xs) var(--space-xs); + text-shadow: + 0 0 16px var(--header-shadow-strong), + 0 0 32px var(--header-shadow-soft); + transition: opacity 0.15s; } header nav ul a:hover { - color: var(--accent-primary); + color: var(--accent-primary); } header nav ul a[aria-current="page"] { - color: var(--accent-primary); - border-radius: 0; - border-bottom: 2px solid currentColor; - padding-bottom: 1px; + color: var(--accent-primary); + border-radius: 0; + border-bottom: 2px solid currentColor; + padding-bottom: 1px; } /* ── Logo ───────────────────────────────────────────────────────────── */ .nav-logo { - text-decoration: none; + text-decoration: none; } .nav-left-links, .nav-right-links { - display: flex; - gap: var(--space-l); - align-items: center; - list-style: none; - margin: 0; - padding: 0; + display: flex; + gap: var(--space-l); + align-items: center; + list-style: none; + margin: 0; + padding: 0; } .nav-top-row { - display: contents; + display: contents; } .nav-mobile-links { - display: none; + display: none; } /* ── Hamburger menu (pure CSS, checkbox trick) ──────────────────────── */ @@ -94,132 +94,132 @@ header nav ul a[aria-current="page"] { ul.nav-mobile-links ← full dropdown (hidden by default) */ .menu-btn { - position: absolute; - top: -9999px; - left: -9999px; + position: absolute; + top: -9999px; + left: -9999px; } .menu-icon { - display: none; - cursor: pointer; - padding: var(--space-2xs) var(--space-s); - align-items: center; - justify-content: center; + display: none; + cursor: pointer; + padding: var(--space-2xs) var(--space-s); + align-items: center; + justify-content: center; } /* Middle bar of the burger icon */ .navicon { - background: var(--accent-foreground); - display: block; - height: 2px; - width: 24px; - position: relative; - transition: all 0.3s ease-out; + background: var(--accent-foreground); + display: block; + height: 2px; + width: 24px; + position: relative; + transition: all 0.3s ease-out; } .navicon::before, .navicon::after { - content: ""; - background: var(--accent-foreground); - display: block; - height: 2px; - width: 100%; - position: absolute; - transition: all 0.3s ease-out; + content: ""; + background: var(--accent-foreground); + display: block; + height: 2px; + width: 100%; + position: absolute; + transition: all 0.3s ease-out; } .navicon::before { - top: -7px; + top: -7px; } .navicon::after { - bottom: -7px; + bottom: -7px; } /* ── Mobile (≤ 640px) ───────────────────────────────────────────────── */ @media screen and (max-width: 640px) { - header nav[aria-label="Navigation principale"] { - display: flex; - flex-direction: column; - align-items: stretch; - padding: 0; - } + header nav[aria-label="Navigation principale"] { + display: flex; + flex-direction: column; + align-items: stretch; + padding: 0; + } - header nav[aria-label="Navigation principale"] .nav-top-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-s); - } + header nav[aria-label="Navigation principale"] .nav-top-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-s); + } - header nav[aria-label="Navigation principale"] .nav-right-links { - display: none; - } + header nav[aria-label="Navigation principale"] .nav-right-links { + display: none; + } - header nav[aria-label="Navigation principale"] .nav-left-links { - display: flex; - gap: 0; - } + header nav[aria-label="Navigation principale"] .nav-left-links { + display: flex; + gap: 0; + } - header nav[aria-label="Navigation principale"] - .nav-left-links - li:not(:first-child) { - display: none; - } + header + nav[aria-label="Navigation principale"] + .nav-left-links + li:not(:first-child) { + display: none; + } - .menu-icon { - display: flex; - } + .menu-icon { + display: flex; + } - header nav[aria-label="Navigation principale"] .nav-mobile-links { - display: block; - list-style: none; - margin: 0; - padding: 0; - max-height: 0; - overflow: hidden; - transition: max-height 0.2s ease-out; - } + header nav[aria-label="Navigation principale"] .nav-mobile-links { + display: block; + list-style: none; + margin: 0; + padding: 0; + max-height: 0; + overflow: hidden; + transition: max-height 0.2s ease-out; + } - .menu-btn:checked - ~ nav[aria-label="Navigation principale"] - .nav-mobile-links { - max-height: 300px; - } + .menu-btn:checked + ~ nav[aria-label="Navigation principale"] + .nav-mobile-links { + max-height: 300px; + } - header nav[aria-label="Navigation principale"] .nav-mobile-links li { - border-top: 1px solid var(--header-nav-active-border); - text-align: left; - } + header nav[aria-label="Navigation principale"] .nav-mobile-links li { + border-top: 1px solid var(--header-nav-active-border); + text-align: left; + } - header nav[aria-label="Navigation principale"] .nav-mobile-links li a { - display: block; - width: 100%; - padding: var(--space-s) var(--space-s); - text-align: left; - } + header nav[aria-label="Navigation principale"] .nav-mobile-links li a { + display: block; + width: 100%; + padding: var(--space-s) var(--space-s); + text-align: left; + } - /* Animate burger → X */ - .menu-btn:checked - ~ nav[aria-label="Navigation principale"] - .menu-icon - .navicon { - background: transparent; - } + /* Animate burger → X */ + .menu-btn:checked ~ nav[aria-label="Navigation principale"] + .menu-icon + .navicon { + background: transparent; + } - .menu-btn:checked - ~ nav[aria-label="Navigation principale"] - .menu-icon - .navicon::before { - transform: rotate(-45deg); - top: 0; - } + .menu-btn:checked + ~ nav[aria-label="Navigation principale"] + .menu-icon + .navicon::before { + transform: rotate(-45deg); + top: 0; + } - .menu-btn:checked - ~ nav[aria-label="Navigation principale"] - .menu-icon - .navicon::after { - transform: rotate(45deg); - bottom: 0; - } + .menu-btn:checked + ~ nav[aria-label="Navigation principale"] + .menu-icon + .navicon::after { + transform: rotate(45deg); + bottom: 0; + } } diff --git a/app/public/assets/css/components/links.css b/app/public/assets/css/components/links.css index 1971237..fe4476d 100644 --- a/app/public/assets/css/components/links.css +++ b/app/public/assets/css/components/links.css @@ -4,12 +4,12 @@ ============================================================ */ a { - color: inherit; - text-decoration: none; - font-weight: 400; + color: inherit; + text-decoration: none; + font-weight: 400; } a:hover { - color: var(--accent-primary); - text-decoration: none; + color: var(--accent-primary); + text-decoration: none; } diff --git a/app/public/assets/css/components/media.css b/app/public/assets/css/components/media.css index 9b5d038..fd84638 100644 --- a/app/public/assets/css/components/media.css +++ b/app/public/assets/css/components/media.css @@ -4,10 +4,10 @@ ============================================================ */ :where(video, audio, iframe) { - border: 1px solid var(--bg-primary); - border-radius: 15px; + border: 1px solid var(--bg-primary); + border-radius: 15px; } audio::-webkit-media-controls-enclosure { - border-radius: var(--radius); + border-radius: var(--radius); } diff --git a/app/public/assets/css/components/pagination.css b/app/public/assets/css/components/pagination.css index ef5ca63..28b5442 100644 --- a/app/public/assets/css/components/pagination.css +++ b/app/public/assets/css/components/pagination.css @@ -4,55 +4,57 @@ ============================================================ */ .pagination-wrap { - display: flex; - justify-content: center; - align-items: center; - gap: var(--space-2xs); - padding: var(--space-m) 0 var(--space-2xs); + display: flex; + justify-content: center; + align-items: center; + gap: var(--space-2xs); + padding: var(--space-m) 0 var(--space-2xs); } .pagination-wrap ul { - display: flex; - gap: var(--space-3xs); - list-style: none; - margin: 0; - padding: 0; + display: flex; + gap: var(--space-3xs); + list-style: none; + margin: 0; + padding: 0; } .pagination-btn { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 2.75rem; - min-height: 2.75rem; - padding: 0 var(--space-2xs); - border: 1px solid var(--border-secondary); - border-radius: var(--radius); - color: var(--text-primary); - font-size: var(--step--1); - font-weight: 400; - text-decoration: none; - transition: border-color 0.15s, color 0.15s; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2.75rem; + min-height: 2.75rem; + padding: 0 var(--space-2xs); + border: 1px solid var(--border-secondary); + border-radius: var(--radius); + color: var(--text-primary); + font-size: var(--step--1); + font-weight: 400; + text-decoration: none; + transition: + border-color 0.15s, + color 0.15s; } .pagination-btn:hover:not(.disabled) { - border-color: var(--accent-primary); - color: var(--accent-primary); + border-color: var(--accent-primary); + color: var(--accent-primary); } .pagination-btn.disabled { - opacity: 0.3; - cursor: not-allowed; - pointer-events: none; + opacity: 0.3; + cursor: not-allowed; + pointer-events: none; } .pagination-info { - font-size: var(--step--1); - color: var(--text-secondary); - padding: 0 var(--space-2xs); + font-size: var(--step--1); + color: var(--text-secondary); + padding: 0 var(--space-2xs); } .page-current { - font-weight: 600; - color: var(--text-primary); + font-weight: 600; + color: var(--text-primary); } diff --git a/app/public/assets/css/components/search.css b/app/public/assets/css/components/search.css index 5da6c48..f727473 100644 --- a/app/public/assets/css/components/search.css +++ b/app/public/assets/css/components/search.css @@ -6,55 +6,61 @@ /* Public search bar icon (in partials/search-bar.php) */ /* Scoped to forms that are NOT inside .header-search-wrap */ .search-bar-icon { - width: 20px; - height: 20px; - flex-shrink: 0; - fill: var(--accent-primary); - margin-right: var(--space-2xs); + width: 20px; + height: 20px; + flex-shrink: 0; + fill: var(--accent-primary); + margin-right: var(--space-2xs); } form[role="search"]:not(.header-search-form) { - display: flex; - align-items: center; + display: flex; + align-items: center; } .header-search-wrap { - padding: 0; - flex-shrink: 0; - background: linear-gradient(180deg, rgba(192, 93, 225, 1) 0%, rgba(255, 255, 255, 1) 100%); + padding: 0; + flex-shrink: 0; + background: linear-gradient( + 180deg, + rgba(192, 93, 225, 1) 0%, + rgba(255, 255, 255, 1) 100% + ); } -.header-search-form { width: 100%; } +.header-search-form { + width: 100%; +} .header-search-input-wrap { - position: relative; - display: flex; - align-items: center; + position: relative; + display: flex; + align-items: center; } .header-search-icon { - position: absolute; - left: var(--space-s); - width: 18px; - height: 18px; - fill: var(--accent-primary); - pointer-events: none; + position: absolute; + left: var(--space-s); + width: 18px; + height: 18px; + fill: var(--accent-primary); + pointer-events: none; } .header-search-input-wrap input { - width: 100%; - padding: var(--space-2xs) var(--space-s) !important; - padding-left: calc(18px + var(--space-l)) !important; - border: 1px solid var(--accent-primary) !important; - border-radius: var(--radius) !important; - background: var(--bg-primary) !important; - font-size: var(--step-0) !important; - color: var(--text-primary) !important; - font-family: inherit !important; + width: 100%; + padding: var(--space-2xs) var(--space-s); + padding-left: calc(18px + var(--space-l)); + border: 1px solid var(--accent-primary); + border-radius: var(--radius); + background: var(--bg-primary); + font-size: var(--step-0); + color: var(--text-primary); + font-family: inherit; } .header-search-input-wrap input::placeholder { - color: var(--accent-primary) !important; - font-family: var(--font-body); - font-weight: 300; + color: var(--accent-primary); + font-family: var(--font-body); + font-weight: 300; } diff --git a/app/public/assets/css/components/tables.css b/app/public/assets/css/components/tables.css index 2767526..3f86549 100644 --- a/app/public/assets/css/components/tables.css +++ b/app/public/assets/css/components/tables.css @@ -4,39 +4,39 @@ ============================================================ */ table { - width: 100%; - border-collapse: collapse; - font-size: var(--step--1); + width: 100%; + border-collapse: collapse; + font-size: var(--step--1); } th { - text-align: left; - font-size: var(--step--2); - letter-spacing: 0.08em; - text-transform: uppercase; - padding: var(--space-3xs) var(--space-xs); - border-bottom: 1px solid var(--border-primary); - color: var(--text-secondary); - font-weight: 400; - white-space: nowrap; + text-align: left; + font-size: var(--step--2); + letter-spacing: 0.08em; + text-transform: uppercase; + padding: var(--space-3xs) var(--space-xs); + border-bottom: 1px solid var(--border-primary); + color: var(--text-secondary); + font-weight: 400; + white-space: nowrap; } td { - padding: var(--space-2xs) var(--space-xs); - border-bottom: 1px solid var(--border-primary); - vertical-align: top; + padding: var(--space-2xs) var(--space-xs); + border-bottom: 1px solid var(--border-primary); + vertical-align: top; } /* Sticky header — border-collapse:collapse blocks position:sticky in Chrome. --sticky-top is set by JS when a bulk actions bar appears above the table. */ .admin-table--sticky { - border-collapse: separate; - border-spacing: 0; + border-collapse: separate; + border-spacing: 0; } .admin-table--sticky thead th { - position: sticky; - top: var(--sticky-top, 0px); - z-index: 5; - background: var(--bg-primary); + position: sticky; + top: var(--sticky-top, 0px); + z-index: 5; + background: var(--bg-primary); } diff --git a/app/public/assets/css/components/toast.css b/app/public/assets/css/components/toast.css index 4503aac..a2e6cff 100644 --- a/app/public/assets/css/components/toast.css +++ b/app/public/assets/css/components/toast.css @@ -4,68 +4,80 @@ ============================================================ */ #toast-region { - position: fixed; - bottom: var(--space-l); - left: 50%; - transform: translateX(-50%); - z-index: 10000; - display: flex; - flex-direction: column; - align-items: center; - gap: var(--space-xs); - pointer-events: none; - width: max-content; - max-width: min(560px, calc(100vw - 2 * var(--space-l))); + position: fixed; + bottom: var(--space-l); + left: 50%; + transform: translateX(-50%); + z-index: 10000; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-xs); + pointer-events: none; + width: max-content; + max-width: min(560px, calc(100vw - 2 * var(--space-l))); } .toast { - padding: var(--space-s) var(--space-m); - border-radius: var(--radius); - font-size: var(--step-0); - border-left: 4px solid; - box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25); - pointer-events: auto; - /* enter then fade out — total visible ~6.35s */ - animation: toast-enter 0.35s ease-out, - toast-exit 0.5s ease-in 6s forwards; + padding: var(--space-s) var(--space-m); + border-radius: var(--radius); + font-size: var(--step-0); + border-left: 4px solid; + box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25); + pointer-events: auto; + /* enter then fade out — total visible ~6.35s */ + animation: + toast-enter 0.35s ease-out, + toast-exit 0.5s ease-in 6s forwards; } .toast--error { - background: var(--bg-secondary); - border-color: var(--error); - color: var(--text-primary); + background: var(--bg-secondary); + border-color: var(--error); + color: var(--text-primary); } .toast--success { - background: var(--bg-secondary); - border-color: var(--success); - color: var(--text-primary); + background: var(--bg-secondary); + border-color: var(--success); + color: var(--text-primary); } .toast--warning { - background: var(--bg-secondary); - border-color: var(--warning); - color: var(--text-primary); - animation: toast-enter 0.35s ease-out; + background: var(--bg-secondary); + border-color: var(--warning); + color: var(--text-primary); + animation: toast-enter 0.35s ease-out; } .toast--warning a { - color: inherit; - font-weight: 400; - text-decoration: none; - transition: color 0.15s; + color: inherit; + font-weight: 400; + text-decoration: none; + transition: color 0.15s; } .toast--warning a:hover { - color: var(--accent-primary); + color: var(--accent-primary); } @keyframes toast-enter { - from { opacity: 0; transform: translateY(12px); } - to { opacity: 1; transform: translateY(0); } + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } } @keyframes toast-exit { - from { opacity: 1; } - to { opacity: 0; pointer-events: none; } + from { + opacity: 1; + } + to { + opacity: 0; + pointer-events: none; + } } diff --git a/app/public/assets/css/components/toc.css b/app/public/assets/css/components/toc.css index ab19f9a..409ebe1 100644 --- a/app/public/assets/css/components/toc.css +++ b/app/public/assets/css/components/toc.css @@ -8,138 +8,138 @@ /* ── Shared list styles (.toc-list) ─────────────────────────────────────── */ .toc-list, .toc ul { - list-style: none; - margin: 0; - padding: 0; - display: flex; - flex-direction: column; - gap: var(--space-3xs); + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: var(--space-3xs); } .toc-list a, .toc ul a { - display: block; - font-family: var(--font-body); - font-size: var(--step-0); - font-weight: 300; - color: var(--text-primary); - text-decoration: none; - padding: var(--space-3xs) 0; - transition: color 0.15s; + display: block; + font-family: var(--font-body); + font-size: var(--step-0); + font-weight: 300; + color: var(--text-primary); + text-decoration: none; + padding: var(--space-3xs) 0; + transition: color 0.15s; } .toc-list a:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .toc-list a.toc-active, .toc ul a.toc-active { - color: var(--accent-primary); - font-weight: 400; + color: var(--accent-primary); + font-weight: 400; } /* ── Public TOC (details/summary block) ─────────────────────────────────── */ .toc { - border: none; - border-radius: 0; - background: transparent; - overflow: visible; + border: none; + border-radius: 0; + background: transparent; + overflow: visible; } .toc[open] { - padding-bottom: 0; + padding-bottom: 0; } .toc > :not(summary) { - padding-left: 0; - padding-right: 0; + padding-left: 0; + padding-right: 0; } .toc summary { - font-family: var(--font-display); - font-size: var(--step-1); - font-weight: 400; - color: var(--text-primary); - padding: 0 0 var(--space-2xs) 0; - border-bottom: 1px solid var(--text-primary); - display: flex; - align-items: center; - gap: var(--space-2xs); - background: transparent; - cursor: pointer; - list-style: none; + font-family: var(--font-display); + font-size: var(--step-1); + font-weight: 400; + color: var(--text-primary); + padding: 0 0 var(--space-2xs) 0; + border-bottom: 1px solid var(--text-primary); + display: flex; + align-items: center; + gap: var(--space-2xs); + background: transparent; + cursor: pointer; + list-style: none; } .toc summary::-webkit-details-marker { - display: none; + display: none; } .toc summary:hover { - color: inherit; - background: transparent; + color: inherit; + background: transparent; } /* Caret icon inside summary — visible only on mobile */ .toc-caret { - flex-shrink: 0; - transition: transform 0.2s ease; + flex-shrink: 0; + transition: transform 0.2s ease; } .toc[open] > summary .toc-caret { - transform: rotate(180deg); + transform: rotate(180deg); } /* Sidebar links (about page — custom links below TOC) */ .toc-sidebar-link:first-of-type { - padding-top: var(--space-s); - border-top: 1px solid var(--border-primary); + padding-top: var(--space-s); + border-top: 1px solid var(--border-primary); } .toc-sidebar-link + .toc-sidebar-link { - padding-top: var(--space-xs); + padding-top: var(--space-xs); } .toc-sidebar-link a { - font-size: var(--step--2); - color: var(--accent-primary); - text-decoration: none; - transition: opacity 0.15s; + font-size: var(--step--2); + color: var(--accent-primary); + text-decoration: none; + transition: opacity 0.15s; } .toc-sidebar-link a:hover { - opacity: 0.8; + opacity: 0.8; } /* ── Desktop: sticky sidebar with independent scroll ──────────────────── */ @media (min-width: 768px) { - .toc { - position: sticky; - top: var(--space-l); - grid-column: 1; - max-height: calc(100vh - var(--space-xl) - var(--space-2xl)); - overflow-y: auto; - overscroll-behavior: contain; - scrollbar-width: thin; - } + .toc { + position: sticky; + top: var(--space-l); + grid-column: 1; + max-height: calc(100vh - var(--space-xl) - var(--space-2xl)); + overflow-y: auto; + overscroll-behavior: contain; + scrollbar-width: thin; + } - .toc summary { - pointer-events: none; - } + .toc summary { + pointer-events: none; + } - .toc-caret { - display: none; - } + .toc-caret { + display: none; + } } /* ── Mobile: collapsible TOC ────────────────────────────────────────────── */ @media (max-width: 767px) { - .toc { - position: static; - grid-column: 1; - } + .toc { + position: static; + grid-column: 1; + } - .toc summary { - cursor: pointer; - list-style: revert; - } + .toc summary { + cursor: pointer; + list-style: revert; + } } diff --git a/app/public/assets/css/content-page.css b/app/public/assets/css/content-page.css index d850332..e31de40 100644 --- a/app/public/assets/css/content-page.css +++ b/app/public/assets/css/content-page.css @@ -5,52 +5,52 @@ /* Override inherited padding on main-content */ #main-content { - padding-top: 0; + padding-top: 0; } .page-content { - flex: 1; - min-height: 0; - overflow-y: auto; - overflow-x: hidden; - scroll-behavior: smooth; - padding: var(--space-xl) var(--space-l) var(--space-2xl); - display: grid; - grid-template-columns: 180px 1fr; - gap: var(--space-2xl); - align-items: start; + flex: 1; + min-height: 0; + overflow-y: auto; + overflow-x: hidden; + scroll-behavior: smooth; + padding: var(--space-xl) var(--space-l) var(--space-2xl); + display: grid; + grid-template-columns: 180px 1fr; + gap: var(--space-2xl); + align-items: start; } /* ── TOC styles → components/toc.css (shared with admin) ───────────────── */ /* Grid column positioning for content pages with sidebar TOC */ @media (min-width: 768px) { - .page-content > article { - grid-column: 2; - min-width: 0; - max-width: 100%; - } + .page-content > article { + grid-column: 2; + min-width: 0; + max-width: 100%; + } } @media (max-width: 767px) { - .page-content { - grid-template-columns: 1fr; - gap: var(--space-l); - padding: var(--space-m) var(--space-s) var(--space-xl); - } + .page-content { + grid-template-columns: 1fr; + gap: var(--space-l); + padding: var(--space-m) var(--space-s) var(--space-xl); + } - .page-content > article { - grid-column: 1; - } + .page-content > article { + grid-column: 1; + } - .toc { - margin-top: var(--space-s); - } + .toc { + margin-top: var(--space-s); + } } /* ── First content child aligns with TOC heading top ───────────────────── */ .page-content > article > :first-child { - margin-top: 2.2rem; + margin-top: 2.2rem; } /* ------------------------------------------------------------------ */ @@ -58,107 +58,107 @@ /* ------------------------------------------------------------------ */ .page-content > article { - display: block; - max-width: 100%; - font-family: var(--font-body); - font-size: var(--step-0); - line-height: 1.6; - color: var(--text-primary); - font-weight: 300; - padding-bottom: var(--space-xl); + display: block; + max-width: 100%; + font-family: var(--font-body); + font-size: var(--step-0); + line-height: 1.6; + color: var(--text-primary); + font-weight: 300; + padding-bottom: var(--space-xl); } .page-content > article * { - max-width: 100%; - overflow-wrap: anywhere; - word-break: break-word; + max-width: 100%; + overflow-wrap: anywhere; + word-break: break-word; } .page-content > article p { - margin: 0 0 1em 0; + margin: 0 0 1em 0; } .page-content > article p:last-child { - margin-bottom: 0; + margin-bottom: 0; } .page-content > article :where(h1, h2, h3) { - margin: 1.5em 0 0.5em 0; + margin: 1.5em 0 0.5em 0; } .page-content > article a { - color: inherit; - text-decoration: none; - font-weight: 700; + color: inherit; + text-decoration: none; + font-weight: 700; } .page-content > article a:hover { - color: var(--accent-primary); - text-decoration: none; + color: var(--accent-primary); + text-decoration: none; } .page-content > article ul, .page-content > article ol { - padding-left: var(--space-m); - margin-bottom: var(--space-s); + padding-left: var(--space-m); + margin-bottom: var(--space-s); } .page-content > article li { - margin-bottom: 0.3em; + margin-bottom: 0.3em; } .page-content > article strong { - font-weight: 700; + font-weight: 700; } .page-content > article em { - font-style: italic; + font-style: italic; } .page-content > article :where(pre, pre code, code) { - display: block; - max-width: 100%; - overflow-x: auto; - overflow-wrap: normal; - word-break: normal; - font-family: "Courier New", Courier, monospace; - font-size: 0.88em; - background: color-mix(in srgb, var(--bg-tertiary) 50%, transparent); - padding: 0.5em 0.75em; - border-radius: var(--radius); - white-space: pre-wrap; - word-wrap: break-word; + display: block; + max-width: 100%; + overflow-x: auto; + overflow-wrap: normal; + word-break: normal; + font-family: "Courier New", Courier, monospace; + font-size: 0.88em; + background: color-mix(in srgb, var(--bg-tertiary) 50%, transparent); + padding: 0.5em 0.75em; + border-radius: var(--radius); + white-space: pre-wrap; + word-wrap: break-word; } #apropos-intro *, #apropos-contacts *, #apropos-credits * { - overflow-wrap: anywhere; - word-break: break-word; - max-width: 100%; + overflow-wrap: anywhere; + word-break: break-word; + max-width: 100%; } /* Section separators (about page only) */ .page-content > article > section { - padding-bottom: var(--space-xl); - border-bottom: 1px solid var(--border-primary); - margin-bottom: var(--space-xl); + padding-bottom: var(--space-xl); + border-bottom: 1px solid var(--border-primary); + margin-bottom: var(--space-xl); } .page-content > article > section:last-child { - border-bottom: none; - margin-bottom: 0; - padding-bottom: var(--space-xl); + border-bottom: none; + margin-bottom: 0; + padding-bottom: var(--space-xl); } /* Scroll margin so anchor links account for the sticky header */ .page-content > article :where(h1, h2, h3) { - scroll-margin-top: var(--space-l); + scroll-margin-top: var(--space-l); } /* Hide CommonMark heading permalink anchors */ .heading-permalink { - display: none; + display: none; } /* ------------------------------------------------------------------ */ @@ -166,12 +166,12 @@ /* ------------------------------------------------------------------ */ .content-section-title { - font-family: var(--font-display); - font-size: var(--step-3); - font-weight: 400; - color: var(--text-primary); - margin: 0 0 var(--space-m) 0; - line-height: 1.1; + font-family: var(--font-display); + font-size: var(--step-3); + font-weight: 400; + color: var(--text-primary); + margin: 0 0 var(--space-m) 0; + line-height: 1.1; } /* ------------------------------------------------------------------ */ @@ -179,48 +179,48 @@ /* ------------------------------------------------------------------ */ .apropos-contacts-grid { - display: flex; - flex-direction: column; - gap: 0; + display: flex; + flex-direction: column; + gap: 0; } .apropos-contact-card { - font-style: normal; - padding: var(--space-s) 0; - border-bottom: 1px solid var(--border-primary); + font-style: normal; + padding: var(--space-s) 0; + border-bottom: 1px solid var(--border-primary); } .apropos-contact-card:first-child { - border-top: 1px solid var(--border-primary); + border-top: 1px solid var(--border-primary); } .apropos-contact-card strong { - display: block; - font-size: var(--step-0); - font-weight: 600; - color: var(--text-primary); - margin-bottom: var(--space-3xs); + display: block; + font-size: var(--step-0); + font-weight: 600; + color: var(--text-primary); + margin-bottom: var(--space-3xs); } .apropos-contact-card span { - display: block; - font-size: var(--step--1); - color: var(--text-secondary); - line-height: 1.4; - margin-bottom: var(--space-3xs); + display: block; + font-size: var(--step--1); + color: var(--text-secondary); + line-height: 1.4; + margin-bottom: var(--space-3xs); } .apropos-contact-card a { - font-size: var(--step--1); - color: inherit; - text-decoration: none; - font-weight: 700; - transition: color 0.15s; + font-size: var(--step--1); + color: inherit; + text-decoration: none; + font-weight: 700; + transition: color 0.15s; } .apropos-contact-card a:hover { - color: var(--accent-primary); - text-decoration: none; + color: var(--accent-primary); + text-decoration: none; } /* ------------------------------------------------------------------ */ @@ -228,39 +228,39 @@ /* ------------------------------------------------------------------ */ .apropos-credits-list { - margin: 0; - padding: 0; - display: flex; - flex-direction: column; - gap: 0; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 0; } .apropos-credit-row { - display: grid; - grid-template-columns: 1fr 1.6fr; - gap: var(--space-s); - padding: var(--space-s) 0; - border-bottom: 1px solid var(--border-primary); - align-items: baseline; + display: grid; + grid-template-columns: 1fr 1.6fr; + gap: var(--space-s); + padding: var(--space-s) 0; + border-bottom: 1px solid var(--border-primary); + align-items: baseline; } .apropos-credit-row:first-child { - border-top: 1px solid var(--border-primary); + border-top: 1px solid var(--border-primary); } .apropos-credits-list dt { - font-size: var(--step--2); - font-weight: 600; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-tertiary); + font-size: var(--step--2); + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--text-tertiary); } .apropos-credits-list dd { - font-size: var(--step--1); - color: var(--text-primary); - margin: 0; - line-height: 1.5; + font-size: var(--step--1); + color: var(--text-primary); + margin: 0; + line-height: 1.5; } /* ------------------------------------------------------------------ */ @@ -268,7 +268,7 @@ /* ------------------------------------------------------------------ */ .apropos-single { - max-width: 720px; + max-width: 720px; } /* ------------------------------------------------------------------ */ @@ -276,20 +276,20 @@ /* ------------------------------------------------------------------ */ @media (max-width: 600px) { - .page-content { - padding: var(--space-m) var(--space-s) var(--space-xl); - } + .page-content { + padding: var(--space-m) var(--space-s) var(--space-xl); + } - .page-content > article { - font-size: var(--step-0); - } + .page-content > article { + font-size: var(--step-0); + } - .content-section-title { - font-size: var(--step-2); - } + .content-section-title { + font-size: var(--step-2); + } - .apropos-credit-row { - grid-template-columns: 1fr; - gap: var(--space-3xs); - } + .apropos-credit-row { + grid-template-columns: 1fr; + gap: var(--space-3xs); + } } diff --git a/app/public/assets/css/file-access.css b/app/public/assets/css/file-access.css index c605b73..eb38631 100644 --- a/app/public/assets/css/file-access.css +++ b/app/public/assets/css/file-access.css @@ -3,245 +3,247 @@ ============================================================ */ .access-req-stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: var(--space-m); - margin-bottom: var(--space-l); + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: var(--space-m); + margin-bottom: var(--space-l); } .access-req-stat-card { - display: flex; - flex-direction: column; - align-items: center; - padding: var(--space-m); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); + display: flex; + flex-direction: column; + align-items: center; + padding: var(--space-m); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); } .access-req-stat-number { - font-size: var(--step-2); - font-weight: 700; - color: var(--text-primary); - line-height: 1; + font-size: var(--step-2); + font-weight: 700; + color: var(--text-primary); + line-height: 1; } .access-req-stat-label { - font-size: var(--step--1); - color: var(--text-secondary); - margin-top: var(--space-3xs); + font-size: var(--step--1); + color: var(--text-secondary); + margin-top: var(--space-3xs); } /* Tab navigation */ .access-req-tabs { - display: flex; - gap: var(--space-xs); - margin-bottom: var(--space-l); - border-bottom: 2px solid var(--border-primary); + display: flex; + gap: var(--space-xs); + margin-bottom: var(--space-l); + border-bottom: 2px solid var(--border-primary); } .access-req-tab { - padding: var(--space-2xs) var(--space-s); - color: var(--text-secondary); - text-decoration: none; - border-bottom: 2px solid transparent; - margin-bottom: -2px; - transition: color 0.2s, border-color 0.2s; + padding: var(--space-2xs) var(--space-s); + color: var(--text-secondary); + text-decoration: none; + border-bottom: 2px solid transparent; + margin-bottom: -2px; + transition: + color 0.2s, + border-color 0.2s; } .access-req-tab:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .access-req-tab.active { - color: var(--accent-primary); - border-bottom-color: var(--accent-primary); - font-weight: 600; + color: var(--accent-primary); + border-bottom-color: var(--accent-primary); + font-weight: 600; } /* Empty state */ .access-req-empty { - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-xl); - text-align: center; - color: var(--text-secondary); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-xl); + text-align: center; + color: var(--text-secondary); } /* Request list */ .access-req-list { - display: flex; - flex-direction: column; - gap: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-m); } .access-req-card { - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-m); - transition: box-shadow 0.2s; + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-m); + transition: box-shadow 0.2s; } .access-req-card:hover { - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .access-req-card__header { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: var(--space-m); - margin-bottom: var(--space-s); + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: var(--space-m); + margin-bottom: var(--space-s); } .access-req-card__thesis h3 { - font-weight: 600; - color: var(--text-primary); - margin: 0 0 var(--space-3xs) 0; - line-height: 1.3; + font-weight: 600; + color: var(--text-primary); + margin: 0 0 var(--space-3xs) 0; + line-height: 1.3; } .access-req-card__authors { - font-size: var(--step--1); - color: var(--text-secondary); - margin: 0; + font-size: var(--step--1); + color: var(--text-secondary); + margin: 0; } .access-req-card__meta { - flex-shrink: 0; + flex-shrink: 0; } .access-req-badge { - display: inline-block; - padding: var(--space-3xs) var(--space-2xs); - border-radius: 12px; - font-size: var(--step--2); - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.05em; + display: inline-block; + padding: var(--space-3xs) var(--space-2xs); + border-radius: 12px; + font-size: var(--step--2); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; } .access-req-badge--pending { - background: #fef3c7; - color: #92400e; + background: #fef3c7; + color: #92400e; } .access-req-badge--approved { - background: #d1fae5; - color: #065f46; + background: #d1fae5; + color: #065f46; } .access-req-badge--rejected { - background: #fee2e2; - color: #991b1b; + background: #fee2e2; + color: #991b1b; } .access-req-card__body { - display: flex; - flex-direction: column; - gap: var(--space-s); + display: flex; + flex-direction: column; + gap: var(--space-s); } .access-req-card__info { - display: flex; - flex-wrap: wrap; - gap: var(--space-m); - font-size: var(--step--1); - color: var(--text-secondary); + display: flex; + flex-wrap: wrap; + gap: var(--space-m); + font-size: var(--step--1); + color: var(--text-secondary); } .access-req-card__info strong { - color: var(--text-primary); - margin-right: var(--space-3xs); + color: var(--text-primary); + margin-right: var(--space-3xs); } .access-req-card__info a { - color: var(--accent-primary); - text-decoration: none; + color: var(--accent-primary); + text-decoration: none; } .access-req-card__info a:hover { - color: var(--accent-primary); - text-decoration: none; + color: var(--accent-primary); + text-decoration: none; } .access-req-card__justification, .access-req-card__admin-notes { - background: var(--bg-primary); - padding: var(--space-s); - border-radius: var(--radius); - font-size: var(--step--1); - line-height: 1.6; + background: var(--bg-primary); + padding: var(--space-s); + border-radius: var(--radius); + font-size: var(--step--1); + line-height: 1.6; } .access-req-card__justification strong, .access-req-card__admin-notes strong { - display: block; - margin-bottom: var(--space-3xs); - color: var(--text-primary); + display: block; + margin-bottom: var(--space-3xs); + color: var(--text-primary); } .access-req-card__justification p, .access-req-card__admin-notes p { - margin: 0; + margin: 0; } .access-req-card__actions { - display: flex; - gap: var(--space-s); - margin-top: var(--space-s); + display: flex; + gap: var(--space-s); + margin-top: var(--space-s); } .access-req-btn { - /* deprecated alias for .btn; kept for backward-compat */ + /* deprecated alias for .btn; kept for backward-compat */ } .access-req-btn--approve { - /* deprecated alias for .btn--primary */ + /* deprecated alias for .btn--primary */ } .access-req-btn--reject { - /* deprecated alias for .btn--danger */ + /* deprecated alias for .btn--danger */ } /* Pagination */ .access-req-pagination { - display: flex; - justify-content: center; - align-items: center; - gap: var(--space-m); - margin-top: var(--space-l); - padding: var(--space-s) 0; + display: flex; + justify-content: center; + align-items: center; + gap: var(--space-m); + margin-top: var(--space-l); + padding: var(--space-s) 0; } .access-req-pagination__link { - padding: var(--space-2xs) var(--space-s); - color: var(--accent-primary); - text-decoration: none; - font-weight: 600; - transition: color 0.2s; + padding: var(--space-2xs) var(--space-s); + color: var(--accent-primary); + text-decoration: none; + font-weight: 600; + transition: color 0.2s; } .access-req-pagination__link:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .access-req-pagination__info { - font-size: var(--step--1); - color: var(--text-secondary); + font-size: var(--step--1); + color: var(--text-secondary); } /* Dialog textarea/label enhancements */ .admin-dialog textarea { - width: 100%; - padding: var(--space-2xs); - margin: var(--space-s) 0; + width: 100%; + padding: var(--space-2xs); + margin: var(--space-s) 0; } .admin-dialog label { - display: block; - font-weight: 400; - margin-bottom: var(--space-3xs); + display: block; + font-weight: 400; + margin-bottom: var(--space-3xs); } diff --git a/app/public/assets/css/form-admin.css b/app/public/assets/css/form-admin.css index b8c1c84..56fa0f7 100644 --- a/app/public/assets/css/form-admin.css +++ b/app/public/assets/css/form-admin.css @@ -7,293 +7,293 @@ /* ── Recap files table ─────────────────────────────────────────── */ .recap-files-table { - width: 100%; - border-collapse: collapse; - font-size: var(--step--1); + width: 100%; + border-collapse: collapse; + font-size: var(--step--1); } .recap-files-table thead th { - text-align: left; - font-weight: 600; - color: var(--text-secondary); - font-size: var(--step--2); - text-transform: uppercase; - letter-spacing: 0.05em; - padding: var(--space-xs) var(--space-s); - border-bottom: 2px solid var(--border-primary); + text-align: left; + font-weight: 600; + color: var(--text-secondary); + font-size: var(--step--2); + text-transform: uppercase; + letter-spacing: 0.05em; + padding: var(--space-xs) var(--space-s); + border-bottom: 2px solid var(--border-primary); } .recap-files-table tbody td { - padding: var(--space-xs) var(--space-s); - border-bottom: 1px solid var(--border-secondary); - vertical-align: middle; + padding: var(--space-xs) var(--space-s); + border-bottom: 1px solid var(--border-secondary); + vertical-align: middle; } .recap-files-table tbody tr:last-child td { - border-bottom: none; + border-bottom: none; } .recap-files-icon { - width: 1px; - white-space: nowrap; + width: 1px; + white-space: nowrap; } .recap-files-icon-emoji { - font-size: 1.3rem; - display: inline-flex; - align-items: center; - justify-content: center; - width: 2.2rem; - height: 2.2rem; - background: var(--accent-muted); - border-radius: var(--radius); + font-size: 1.3rem; + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.2rem; + height: 2.2rem; + background: var(--accent-muted); + border-radius: var(--radius); } .recap-files-thumb { - max-width: 80px; - max-height: 60px; - object-fit: cover; - border-radius: var(--radius); + max-width: 80px; + max-height: 60px; + object-fit: cover; + border-radius: var(--radius); } .recap-files-name { - font-weight: 500; + font-weight: 500; } .recap-files-name a { - color: var(--text-primary); - text-decoration: none; + color: var(--text-primary); + text-decoration: none; } .recap-files-name a:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .recap-files-peertube-id { - display: block; - font-size: var(--step--2); - color: var(--text-tertiary); - font-family: monospace; + display: block; + font-size: var(--step--2); + color: var(--text-tertiary); + font-family: monospace; } .recap-files-label { - display: block; - font-size: var(--step--2); - color: var(--text-secondary); - font-style: italic; + display: block; + font-size: var(--step--2); + color: var(--text-secondary); + font-style: italic; } .recap-files-type { - font-size: var(--step--2); - color: var(--text-tertiary); - white-space: nowrap; + font-size: var(--step--2); + color: var(--text-tertiary); + white-space: nowrap; } .recap-files-size { - font-size: var(--step--2); - color: var(--text-tertiary); - white-space: nowrap; - font-variant-numeric: tabular-nums; + font-size: var(--step--2); + color: var(--text-tertiary); + white-space: nowrap; + font-variant-numeric: tabular-nums; } .recap-files-date { - font-size: var(--step--2); - color: var(--text-tertiary); - white-space: nowrap; + font-size: var(--step--2); + color: var(--text-tertiary); + white-space: nowrap; } /* ── File browser (relink) ──────────────────────────────────────── */ .file-browser-trigger { - margin-top: var(--space-2xs); - font-size: var(--step--2); + margin-top: var(--space-2xs); + font-size: var(--step--2); } .relink-modal { - width: min(90vw, 700px); - max-height: 80vh; - border: 1px solid var(--border); - border-radius: var(--radius); - background: var(--bg-primary); - padding: 0; - overflow: hidden; - color: var(--text-primary); + width: min(90vw, 700px); + max-height: 80vh; + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--bg-primary); + padding: 0; + overflow: hidden; + color: var(--text-primary); } .relink-modal::backdrop { - background: rgba(0,0,0,0.5); + background: rgba(0, 0, 0, 0.5); } .relink-modal-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-s) var(--space-m); - border-bottom: 1px solid var(--border); - background: var(--bg-secondary); + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-s) var(--space-m); + border-bottom: 1px solid var(--border); + background: var(--bg-secondary); } .relink-modal-header h3 { - margin: 0; - font-size: var(--step-0); + margin: 0; + font-size: var(--step-0); } .relink-modal-footer { - padding: var(--space-xs) var(--space-m); - border-top: 1px solid var(--border); - background: var(--bg-secondary); + padding: var(--space-xs) var(--space-m); + border-top: 1px solid var(--border); + background: var(--bg-secondary); } #relink-modal-body { - padding: var(--space-s) var(--space-m); - overflow-y: auto; - max-height: 60vh; + padding: var(--space-s) var(--space-m); + overflow-y: auto; + max-height: 60vh; } /* ── File browser tree ─────────────────────────────────────────── */ .file-browser { - font-size: var(--step--1); + font-size: var(--step--1); } .file-browser-hint, .file-browser-empty, .file-browser-loading, .file-browser-error { - color: var(--text-secondary); - text-align: center; - padding: var(--space-m); + color: var(--text-secondary); + text-align: center; + padding: var(--space-m); } .file-browser-error { - color: var(--error); + color: var(--error); } .file-browser-breadcrumb { - display: flex; - align-items: center; - gap: var(--space-2xs); - flex-wrap: wrap; - padding-bottom: var(--space-s); - margin-bottom: var(--space-s); - border-bottom: 1px solid var(--border); - font-size: var(--step--2); + display: flex; + align-items: center; + gap: var(--space-2xs); + flex-wrap: wrap; + padding-bottom: var(--space-s); + margin-bottom: var(--space-s); + border-bottom: 1px solid var(--border); + font-size: var(--step--2); } .file-browser-breadcrumb a { - color: var(--accent-blue, var(--link)); - text-decoration: none; + color: var(--accent-blue, var(--link)); + text-decoration: none; } .file-browser-breadcrumb a:hover { - color: var(--accent-primary); + color: var(--accent-primary); } .file-browser-sep { - color: var(--text-tertiary); + color: var(--text-tertiary); } .file-browser-list { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } .file-browser-entry { - border-bottom: 1px solid var(--border-subtle); + border-bottom: 1px solid var(--border-subtle); } .file-browser-entry a, .file-browser-select-btn { - display: flex; - align-items: center; - gap: var(--space-xs); - width: 100%; - padding: var(--space-xs) var(--space-2xs); - text-decoration: none; - color: var(--text-primary); - background: none; - border: none; - cursor: pointer; - font-size: var(--step--1); - text-align: left; - transition: background 0.15s; + display: flex; + align-items: center; + gap: var(--space-xs); + width: 100%; + padding: var(--space-xs) var(--space-2xs); + text-decoration: none; + color: var(--text-primary); + background: none; + border: none; + cursor: pointer; + font-size: var(--step--1); + text-align: left; + transition: background 0.15s; } .file-browser-entry a:hover, .file-browser-select-btn:hover { - background: var(--bg-secondary); + background: var(--bg-secondary); } .file-browser-icon { - flex-shrink: 0; - font-size: var(--step-0); + flex-shrink: 0; + font-size: var(--step-0); } .file-browser-name { - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .file-browser-size { - flex-shrink: 0; - color: var(--text-tertiary); - font-size: var(--step--2); - font-variant-numeric: tabular-nums; + flex-shrink: 0; + color: var(--text-tertiary); + font-size: var(--step--2); + font-variant-numeric: tabular-nums; } .file-browser-file .file-browser-select-btn { - color: var(--accent-green, var(--success)); + color: var(--accent-green, var(--success)); } .file-browser-file .file-browser-select-btn:hover { - background: var(--bg-secondary); + background: var(--bg-secondary); } /* ── Full-page editor (contenus-edit overtype) ─────────────────────── */ /* Make the main content area a flex column so the form fills remaining height */ .admin-body .full-editor-page { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .admin-form--full-editor { - display: flex; - flex-direction: column; - flex: 1; - min-height: 0; + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; } .admin-form--full-editor #editor { - flex: 1; - min-height: 0; - display: flex; - flex-direction: column; + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; } .admin-form--full-editor #editor .n-container { - flex: 1; - min-height: 0; - display: flex; - flex-direction: column; + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; } .admin-form--full-editor #editor .n-wrapper { - flex: 1; - min-height: 0; - overflow: hidden; + flex: 1; + min-height: 0; + overflow: hidden; } .admin-form--full-editor #editor .n-input { - height: 100% !important; - overflow-y: auto !important; + height: 100%; + overflow-y: auto; } .admin-form--full-editor #editor .n-preview { - height: 100% !important; - overflow-y: auto !important; + height: 100%; + overflow-y: auto; } .full-editor-toolbar { - display: flex; - align-items: center; - gap: var(--space-s); - padding-bottom: var(--space-s); - border-bottom: 1px solid var(--border-primary); - margin-bottom: var(--space-s); - flex-shrink: 0; + display: flex; + align-items: center; + gap: var(--space-s); + padding-bottom: var(--space-s); + border-bottom: 1px solid var(--border-primary); + margin-bottom: var(--space-s); + flex-shrink: 0; } .full-editor-label { - font-size: var(--step--1); - font-weight: 600; - color: var(--text-secondary); + font-size: var(--step--1); + font-weight: 600; + color: var(--text-secondary); } .full-editor-toolbar .btn--primary { - margin-left: auto; + margin-left: auto; } diff --git a/app/public/assets/css/form-base.css b/app/public/assets/css/form-base.css index 6fc6f1f..b9abc38 100644 --- a/app/public/assets/css/form-base.css +++ b/app/public/assets/css/form-base.css @@ -7,108 +7,108 @@ /* ── Field rows & layout ────────────────────────────────────────────────── */ .admin-form { - display: flex; - flex-direction: column; - gap: 0; + display: flex; + flex-direction: column; + gap: 0; } .admin-form > div:not(.admin-form-footer):not(.student-help-block) { - display: grid; - grid-template-columns: 260px 1fr; - align-items: start; - padding: var(--space-xs) 0; - gap: var(--space-s); + display: grid; + grid-template-columns: 260px 1fr; + align-items: start; + padding: var(--space-xs) 0; + gap: var(--space-s); } .admin-form > div:not(.admin-form-footer):last-of-type { - border-bottom: 1px solid var(--border-primary); + border-bottom: 1px solid var(--border-primary); } .admin-form > div:not(.admin-form-footer) > label, .admin-form > div:not(.admin-form-footer) > span.admin-row-label { - font-size: var(--step--1); - padding-top: var(--space-2xs); - font-weight: 400; + font-size: var(--step--1); + padding-top: var(--space-2xs); + font-weight: 400; } /* ── Inputs, selects, textareas ──────────────────────────────────────────── */ .admin-form - input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( - [type="hidden"] - ):not([type="submit"]), +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( + [type="hidden"] +):not([type="submit"]), .admin-form select, .admin-form textarea, .admin-inline-form input[type="text"], .admin-inline-form input[type="number"], .admin-inline-form select { - width: 100%; + width: 100%; } .admin-form textarea { - min-height: 100px; + min-height: 100px; } /* ── Required-field indicators ──────────────────────────────────────────── */ .admin-form - input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( - [type="hidden"] - ):not([type="submit"]):required, +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( + [type="hidden"] +):not([type="submit"]):required, .admin-form select:required, .admin-form textarea:required { - border-style: dashed; + border-style: dashed; } .admin-form - div:has( - input:required:not([type="checkbox"]):not([type="radio"]):not( - [type="file"] - ):not([type="hidden"]) - ) - > label, + div:has( + input:required:not([type="checkbox"]):not([type="radio"]):not( + [type="file"] + ):not([type="hidden"]) + ) + > label, .admin-form div:has(select:required) > label, .admin-form div:has(textarea:required) > label { - font-weight: 400; + font-weight: 400; } /* Asterisk on required field labels */ .asterisk { - color: var(--error, #c00); + color: var(--error, #c00); } /* "* Champs obligatoires" note */ .required-note { - font-size: var(--step--2); - color: var(--text-secondary); - margin-bottom: var(--space-xs); + font-size: var(--step--2); + color: var(--text-secondary); + margin-bottom: var(--space-xs); } .required-note .asterisk { - color: var(--error, #c00); + color: var(--error, #c00); } /* ── File inputs ────────────────────────────────────────────────────────── */ .admin-file-input { - display: flex; - flex-direction: column; - gap: var(--space-3xs); + display: flex; + flex-direction: column; + gap: var(--space-3xs); } .admin-file-input input[type="file"] { - font-size: var(--step--1); - background: transparent; - border: 1px dashed var(--border-primary); - padding: var(--space-3xs) var(--space-2xs); - border-radius: var(--radius); - cursor: pointer; - font-family: inherit; + font-size: var(--step--1); + background: transparent; + border: 1px dashed var(--border-primary); + padding: var(--space-3xs) var(--space-2xs); + border-radius: var(--radius); + cursor: pointer; + font-family: inherit; } .admin-file-input input[type="file"]:hover { - border-color: var(--accent-primary); + border-color: var(--accent-primary); } .admin-file-hint { - display: block; - margin-top: var(--space-2xs); + display: block; + margin-top: var(--space-2xs); } /* small base styles live in components/forms.css */ @@ -116,61 +116,61 @@ /* ── Checkbox groups (languages, formats) ───────────────────────────────── */ .admin-body fieldset.admin-checkbox-group, .student-body fieldset.admin-checkbox-group { - border: none; - padding: 0; - margin: 0; - background: transparent; - border-radius: 0; + border: none; + padding: 0; + margin: 0; + background: transparent; + border-radius: 0; } .admin-body fieldset.admin-checkbox-group > ul, .student-body fieldset.admin-checkbox-group > ul { - list-style: none; - margin: 0; - padding-top: var(--space-3xs); - display: flex; - flex-direction: column; - gap: var(--space-3xs); + list-style: none; + margin: 0; + padding-top: var(--space-3xs); + display: flex; + flex-direction: column; + gap: var(--space-3xs); } .admin-body fieldset.admin-checkbox-group > ul > li, .student-body fieldset.admin-checkbox-group > ul > li { - display: contents; + display: contents; } .admin-checkbox-label { - display: flex; - align-items: center; - gap: var(--space-2xs); - font-size: var(--step--1); - cursor: pointer; + display: flex; + align-items: center; + gap: var(--space-2xs); + font-size: var(--step--1); + cursor: pointer; } /* ── Fieldsets & legends ────────────────────────────────────────────────── */ /* Base fieldset/legend styles live in components/forms.css */ .admin-body fieldset, .student-body fieldset { - margin: var(--space-2xs) 0 var(--space-s); + margin: var(--space-2xs) 0 var(--space-s); } /* ── Form group (checkbox inline inside .admin-form) ────────────────────── */ .admin-form-group { - display: flex; - flex-direction: column; - gap: var(--space-3xs); + display: flex; + flex-direction: column; + gap: var(--space-3xs); } .admin-form-group--inline { - flex-direction: row; - align-items: end; - gap: var(--space-xs); - flex-wrap: wrap; + flex-direction: row; + align-items: end; + gap: var(--space-xs); + flex-wrap: wrap; } .admin-form-group--inline > div { - display: flex; - flex-direction: column; - gap: var(--space-3xs); + display: flex; + flex-direction: column; + gap: var(--space-3xs); } /* ── Jury fieldset ──────────────────────────────────────────────────────── */ @@ -181,230 +181,232 @@ /* ── Jury fieldset (continued) ──────────────────────────────────────────── */ .admin-body fieldset fieldset.admin-jury-lecteurs, .student-body fieldset fieldset.admin-jury-lecteurs { - border: none; - padding: 0; - margin: var(--space-xs) 0 0; - background: transparent; + border: none; + padding: 0; + margin: var(--space-xs) 0 0; + background: transparent; } .admin-body fieldset fieldset.admin-jury-lecteurs > legend, .student-body fieldset fieldset.admin-jury-lecteurs > legend { - font-size: var(--step--2); - font-weight: 400; - letter-spacing: 0.03em; - text-transform: uppercase; - color: var(--text-tertiary); - padding: 0; - margin-bottom: var(--space-2xs); + font-size: var(--step--2); + font-weight: 400; + letter-spacing: 0.03em; + text-transform: uppercase; + color: var(--text-tertiary); + padding: 0; + margin-bottom: var(--space-2xs); } .admin-jury-row { - display: flex; - gap: var(--space-xs); - flex-wrap: wrap; + display: flex; + gap: var(--space-xs); + flex-wrap: wrap; } .admin-jury-list { - display: flex; - flex-direction: column; - gap: var(--space-2xs); + display: flex; + flex-direction: column; + gap: var(--space-2xs); } .admin-jury-entry { - display: flex; - align-items: center; - gap: var(--space-xs); + display: flex; + align-items: center; + gap: var(--space-xs); } .admin-jury-ext { - white-space: nowrap; + white-space: nowrap; } .admin-btn-remove { - /* deprecated alias for .btn--sm .btn--ghost; kept for backward-compat */ + /* deprecated alias for .btn--sm .btn--ghost; kept for backward-compat */ } .admin-btn-remove:hover { - border-color: var(--error); - color: var(--error); + border-color: var(--error); + color: var(--error); } /* ── Add / edit page header ─────────────────────────────────────────────── */ .thesis-add-header { - display: grid; - grid-template-columns: 1fr auto; - align-items: baseline; - gap: var(--space-2xs) var(--space-m); - margin-bottom: var(--space-xs); - padding-bottom: var(--space-xs); + display: grid; + grid-template-columns: 1fr auto; + align-items: baseline; + gap: var(--space-2xs) var(--space-m); + margin-bottom: var(--space-xs); + padding-bottom: var(--space-xs); } .thesis-add-header h1 { - margin: 0; + margin: 0; } .thesis-add-subtitle { - grid-column: 1 / -1; - margin: 0; - font-family: var(--font-body); - font-size: var(--step--1); - color: var(--text-secondary); + grid-column: 1 / -1; + margin: 0; + font-family: var(--font-body); + font-size: var(--step--1); + color: var(--text-secondary); } .thesis-add-subtitle a { - font-family: var(--font-display); - color: var(--accent-primary); + font-family: var(--font-display); + color: var(--accent-primary); } .mode-toggle { - font-size: var(--step--1); - color: var(--text-secondary); - text-decoration: none; - white-space: nowrap; - border: 1px solid var(--border-primary); - border-radius: var(--radius); - padding: var(--space-3xs) var(--space-xs); - transition: color 0.15s, border-color 0.15s; + font-size: var(--step--1); + color: var(--text-secondary); + text-decoration: none; + white-space: nowrap; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + padding: var(--space-3xs) var(--space-xs); + transition: + color 0.15s, + border-color 0.15s; } .mode-toggle:hover { - color: var(--accent-primary); - border-color: var(--accent-primary); + color: var(--accent-primary); + border-color: var(--accent-primary); } .mode-toggle--back { - color: var(--accent-blue); - border-color: var(--blue-muted-border, var(--border-primary)); + color: var(--accent-blue); + border-color: var(--blue-muted-border, var(--border-primary)); } /* ── Submit / form footer ───────────────────────────────────────────────── */ .form-footer { - margin-top: var(--space-l); - margin-bottom: var(--space-l); - display: flex; - gap: var(--space-s); - align-items: center; + margin-top: var(--space-l); + margin-bottom: var(--space-l); + display: flex; + gap: var(--space-s); + align-items: center; } .form-footer button { - /* deprecated alias for .btn--primary; kept for backward-compat */ + /* deprecated alias for .btn--primary; kept for backward-compat */ } /* ── Flash messages ─────────────────────────────────────────────────────── */ .flash-error, .flash-warning, .flash-success { - padding: var(--space-xs) var(--space-s); - border-radius: var(--radius); - font-size: var(--step--1); - margin-bottom: var(--space-s); - border-left: 3px solid; + padding: var(--space-xs) var(--space-s); + border-radius: var(--radius); + font-size: var(--step--1); + margin-bottom: var(--space-s); + border-left: 3px solid; } .flash-error { - background: var(--accent-muted); - border-color: var(--error); - color: var(--text-primary); + background: var(--accent-muted); + border-color: var(--error); + color: var(--text-primary); } .flash-success { - background: var(--success-muted-bg); - border-color: var(--success); - color: var(--text-primary); + background: var(--success-muted-bg); + border-color: var(--success); + color: var(--text-primary); } .flash-warning { - background: var(--warning-muted-bg, rgba(251, 202, 81, 0.12)); - border-color: var(--warning-muted-border, rgba(251, 202, 81, 0.35)); - color: var(--text-primary); - white-space: pre-line; + background: var(--warning-muted-bg, rgba(251, 202, 81, 0.12)); + border-color: var(--warning-muted-border, rgba(251, 202, 81, 0.35)); + color: var(--text-primary); + white-space: pre-line; } /* ── Share link badge ───────────────────────────────────────────────────── */ .share-badge { - display: inline-block; - padding: var(--space-3xs) var(--space-xs); - background: var(--blue-muted-bg); - border: 1px solid var(--blue-muted-border, var(--border-primary)); - border-radius: var(--radius); - font-size: var(--step--2); - margin-bottom: var(--space-xs); + display: inline-block; + padding: var(--space-3xs) var(--space-xs); + background: var(--blue-muted-bg); + border: 1px solid var(--blue-muted-border, var(--border-primary)); + border-radius: var(--radius); + font-size: var(--step--2); + margin-bottom: var(--space-xs); } /* ── Licence / degrees-of-openness block ────────────────────────────────── */ .licence-explanation { - background: var(--bg-secondary); - border-left: 4px solid var(--border-secondary, var(--border-primary)); - /* padding: var(--space-m); */ - margin: 0; + background: var(--bg-secondary); + border-left: 4px solid var(--border-secondary, var(--border-primary)); + /* padding: var(--space-m); */ + margin: 0; } .licence-info h3 { - margin-top: var(--space-m); + margin-top: var(--space-m); } .licence-degree { - margin: var(--space-s) 0; - padding: var(--space-s); - background: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); + margin: var(--space-s) 0; + padding: var(--space-s); + background: var(--bg-primary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); } .duration-field { - margin-bottom: var(--space-xs); + margin-bottom: var(--space-xs); } .duration-time-field { - display: flex; - align-items: flex-end; - gap: var(--space-xs); + display: flex; + align-items: flex-end; + gap: var(--space-xs); } .duration-time-fields { - display: inline-flex; - align-items: center; - gap: var(--space-3xs); + display: inline-flex; + align-items: center; + gap: var(--space-3xs); } .duration-time-fields input[type="number"] { - width: 6ch; - min-width: 6ch; + width: 6ch; + min-width: 6ch; } .duration-time-fields span { - font-size: var(--step--1); - color: var(--text-secondary); + font-size: var(--step--1); + color: var(--text-secondary); } .licence-details { - display: inline-flex; + display: inline-flex; } .licence-summary { - display: inline-flex; - align-items: center; - gap: var(--space-3xs); - cursor: pointer; + display: inline-flex; + align-items: center; + gap: var(--space-3xs); + cursor: pointer; } .licence-degree h4 { - margin: 0 0 var(--space-2xs); - font-weight: 600; + margin: 0 0 var(--space-2xs); + font-weight: 600; } .licence-note { - color: var(--text-secondary); - font-size: var(--step--2); - margin-top: var(--space-2xs); + color: var(--text-secondary); + font-size: var(--step--2); + margin-top: var(--space-2xs); } .licence-generalites { - margin-top: var(--space-m); + margin-top: var(--space-m); } .licence-generalites h3 { - margin-bottom: var(--space-xs); + margin-bottom: var(--space-xs); } /* ── Student-mode layout ────────────────────────────────────────────────── */ @@ -412,512 +414,512 @@ /* Standalone page (no admin header/footer): restore scrollability that base.css removes via overflow:hidden on html,body. */ .student-body { - display: flex; - flex-direction: column; - min-height: 100%; - overflow-y: auto; + display: flex; + flex-direction: column; + min-height: 100%; + overflow-y: auto; } .student-body main { - padding: var(--space-l) var(--space-l) var(--space-2xl); - width: 100%; - position: relative; + padding: var(--space-l) var(--space-l) var(--space-2xl); + width: 100%; + position: relative; } /* Fixed top gradient, mirror of body's bottom gradient */ .student-body main::before { - content: ""; - position: fixed; - top: 0; - left: 0; - right: 0; - height: 8vh; - background: linear-gradient( - 180deg, - rgba(149, 87, 181, 1) 0%, - rgba(0, 0, 0, 0) 100% - ); - pointer-events: none; - z-index: 1; + content: ""; + position: fixed; + top: 0; + left: 0; + right: 0; + height: 8vh; + background: linear-gradient( + 180deg, + rgba(149, 87, 181, 1) 0%, + rgba(0, 0, 0, 0) 100% + ); + pointer-events: none; + z-index: 1; } /* ── Share-link error page ──────────────────────────────────────────────── */ .share-error { - max-width: 500px; - margin: 5rem auto; - padding: var(--space-xl); - text-align: center; - background: var(--bg-primary); - border: 2px solid var(--error); - border-radius: var(--radius); + max-width: 500px; + margin: 5rem auto; + padding: var(--space-xl); + text-align: center; + background: var(--bg-primary); + border: 2px solid var(--error); + border-radius: var(--radius); } .share-error h1 { - color: var(--error); - margin-bottom: var(--space-s); + color: var(--error); + margin-bottom: var(--space-s); } .share-error p { - font-size: var(--step-0); - color: var(--text-secondary); - margin-bottom: var(--space-m); + font-size: var(--step-0); + color: var(--text-secondary); + margin-bottom: var(--space-m); } .share-error a { - display: inline-block; - padding: var(--space-2xs) var(--space-m); - background: var(--text-primary); - color: var(--bg-primary); - text-decoration: none; - font-weight: 400; - border-radius: var(--radius); - transition: opacity 0.15s; + display: inline-block; + padding: var(--space-2xs) var(--space-m); + background: var(--text-primary); + color: var(--bg-primary); + text-decoration: none; + font-weight: 400; + border-radius: var(--radius); + transition: opacity 0.15s; } .share-error a:hover { - color: var(--accent-primary); - opacity: 1; + color: var(--accent-primary); + opacity: 1; } /* ── Password gate page ─────────────────────────────────────────────────── */ .password-gate { - max-width: 400px; - margin: 4rem auto; - padding: var(--space-l); - text-align: center; + max-width: 400px; + margin: 4rem auto; + padding: var(--space-l); + text-align: center; } .password-gate h1 { - margin-bottom: var(--space-m); + margin-bottom: var(--space-m); } .password-gate input[type="password"] { - width: 100%; - margin: var(--space-2xs) 0 var(--space-s); + width: 100%; + margin: var(--space-2xs) 0 var(--space-s); } .password-gate button { - /* deprecated alias for .btn--primary; kept for backward-compat */ + /* deprecated alias for .btn--primary; kept for backward-compat */ } .password-error { - color: var(--error); - margin-bottom: var(--space-s); - font-size: var(--step--1); + color: var(--error); + margin-bottom: var(--space-s); + font-size: var(--step--1); } /* ── Live file-input preview (.file-preview-list) ──────────────────────── */ .file-preview-list { - display: flex; - flex-wrap: wrap; - gap: var(--space-xs); - margin-top: var(--space-2xs); + display: flex; + flex-wrap: wrap; + gap: var(--space-xs); + margin-top: var(--space-2xs); } .file-preview-list:empty { - display: none; + display: none; } .fp-item { - display: flex; - align-items: center; - gap: var(--space-2xs); - padding: var(--space-3xs) var(--space-xs); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - min-width: 0; - max-width: 260px; + display: flex; + align-items: center; + gap: var(--space-2xs); + padding: var(--space-3xs) var(--space-xs); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + min-width: 0; + max-width: 260px; } .fp-thumb { - width: 48px; - height: 48px; - object-fit: cover; - border-radius: var(--radius); - flex-shrink: 0; + width: 48px; + height: 48px; + object-fit: cover; + border-radius: var(--radius); + flex-shrink: 0; } .fp-icon { - font-size: 1.6rem; - line-height: 1; - flex-shrink: 0; - width: 48px; - text-align: center; + font-size: 1.6rem; + line-height: 1; + flex-shrink: 0; + width: 48px; + text-align: center; } .fp-meta { - display: flex; - flex-direction: column; - gap: 2px; - min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; } .fp-name { - font-size: var(--step--2); - font-weight: 500; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 180px; - display: block; + font-size: var(--step--2); + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 180px; + display: block; } .fp-size { - font-size: var(--step--2); - color: var(--text-tertiary); + font-size: var(--step--2); + color: var(--text-tertiary); } /* ── Inline file validation messages (HTMX) ──────────────────────────────── */ .file-validation-msg { - margin-top: var(--space-3xs); - font-size: var(--step--2); - line-height: 1.5; + margin-top: var(--space-3xs); + font-size: var(--step--2); + line-height: 1.5; } .fv-ok { - color: var(--success, #2d6a4f); + color: var(--success, #2d6a4f); } .fv-error { - color: var(--danger, #c1121f); + color: var(--danger, #c1121f); } /* ── TFE file upload (FilePond) ────────────────────────────────────────── */ .admin-files-fieldgroup { - display: flex; - flex-direction: column; - gap: var(--space-3xs); + display: flex; + flex-direction: column; + gap: var(--space-3xs); } /* FilePond overrides to match xamxam theme */ .filepond--root { - font-family: var(--font-body, inherit); - margin-bottom: 0; + font-family: var(--font-body, inherit); + margin-bottom: 0; } /* Drop area panel */ .filepond--panel-root { - background: var(--bg-secondary); - border: 2px dashed var(--border-primary); - border-radius: var(--radius); + background: var(--bg-secondary); + border: 2px dashed var(--border-primary); + border-radius: var(--radius); } /* Drop label text */ .filepond--drop-label { - color: var(--text-secondary); - font-size: var(--step--1); + color: var(--text-secondary); + font-size: var(--step--1); } /* "Browse" link */ .filepond--label-action { - color: var(--accent-primary); - text-decoration-color: var(--accent-primary); + color: var(--accent-primary); + text-decoration-color: var(--accent-primary); } /* File item — keep white for contrast against drop area */ .filepond--item-panel { - background-color: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); + background-color: var(--bg-primary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); } /* File item text — dark on white */ .filepond--file { - color: var(--text-primary); - background-color: var(--bg-tertiary); - border: 1px solid var(--accent-green); + color: var(--text-primary); + background-color: var(--bg-tertiary); + border: 1px solid var(--accent-green); } .filepond--file .filepond--file-status { - color: var(--text-secondary); + color: var(--text-secondary); } .filepond--file-info-main { - color: var(--text-primary); + color: var(--text-primary); } .filepond--file-info-sub { - color: var(--text-tertiary); + color: var(--text-tertiary); } /* Action buttons — dark background, white icons */ .filepond--file-action-button { - cursor: pointer; - color: #ffffff; - background-color: rgba(0, 0, 0, 0.45); + cursor: pointer; + color: #ffffff; + background-color: rgba(0, 0, 0, 0.45); } .filepond--file-action-button:hover, .filepond--file-action-button:focus { - color: #ffffff; - background-color: rgba(0, 0, 0, 0.65); - box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.2); + color: #ffffff; + background-color: rgba(0, 0, 0, 0.65); + box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.2); } /* Progress indicator */ .filepond--progress-indicator { - color: #ffffff; + color: #ffffff; } /* Drag-over highlight */ .filepond--hopper[data-hopper-state="drag-over"] .filepond--panel-root { - border-color: var(--accent-primary); - background: var(--accent-muted); + border-color: var(--accent-primary); + background: var(--accent-muted); } /* Error state */ [data-filepond-item-state*="error"] .filepond--item-panel, [data-filepond-item-state*="invalid"] .filepond--item-panel { - background-color: var(--error-muted-bg); - border-color: var(--error); + background-color: var(--error-muted-bg); + border-color: var(--error); } /* Processing complete */ [data-filepond-item-state="processing-complete"] .filepond--item-panel { - background-color: var(--bg-primary); - border-color: var(--accent-green); + background-color: var(--bg-primary); + border-color: var(--accent-green); } [data-filepond-item-state="processing-complete"] .filepond--file { - border-color: var(--accent-green); + border-color: var(--accent-green); } /* FilePond image preview: use site light colors instead of dark defaults */ .filepond--image-preview { - background: var(--bg-secondary); + background: var(--bg-secondary); } .filepond--image-preview-overlay-idle { - color: var(--text-secondary); + color: var(--text-secondary); } .filepond--image-preview-overlay-success { - color: var(--accent-green); + color: var(--accent-green); } .filepond--image-preview-overlay-failure { - color: var(--error); + color: var(--error); } /* ── Partage recap page ─────────────────────────────────────────────────── */ .partage-recap { - display: flex; - flex-direction: column; - align-items: center; - gap: var(--space-l); - padding-bottom: var(--space-3xl); - margin-bottom: var(--space-2xl); + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-l); + padding-bottom: var(--space-3xl); + margin-bottom: var(--space-2xl); } .partage-recap .thanks-success { - text-align: center; + text-align: center; } .recap-validate-notice { - text-align: center; - font-size: var(--step--1); - color: var(--text-secondary); - background: color-mix(in srgb, var(--accent-primary) 8%, transparent); - border: 1px solid color-mix(in srgb, var(--accent-primary) 20%, transparent); - border-radius: 8px; - padding: var(--space-s) var(--space-m); - max-width: 560px; + text-align: center; + font-size: var(--step--1); + color: var(--text-secondary); + background: color-mix(in srgb, var(--accent-primary) 8%, transparent); + border: 1px solid color-mix(in srgb, var(--accent-primary) 20%, transparent); + border-radius: 8px; + padding: var(--space-s) var(--space-m); + max-width: 560px; } .recap-validate-notice p { - margin: 0; + margin: 0; } .recap-validate-notice a { - color: var(--accent-primary); - font-weight: 600; + color: var(--accent-primary); + font-weight: 600; } .recap-section { - border-top: 1px solid var(--border-primary); - padding-top: var(--space-m); - width: 100%; - max-width: 620px; - /* margin-bottom: var(--space-l); */ - padding-bottom: var(--space-xl); + border-top: 1px solid var(--border-primary); + padding-top: var(--space-m); + width: 100%; + max-width: 620px; + /* margin-bottom: var(--space-l); */ + padding-bottom: var(--space-xl); } .recap-section h2 { - font-weight: 600; - margin: 0 0 var(--space-s); - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-secondary); + font-weight: 600; + margin: 0 0 var(--space-s); + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--text-secondary); } .recap-dl { - display: grid; - grid-template-columns: 180px 1fr; - gap: var(--space-2xs) var(--space-s); - margin: 0; + display: grid; + grid-template-columns: 180px 1fr; + gap: var(--space-2xs) var(--space-s); + margin: 0; } .recap-dl dt { - font-size: var(--step--1); - font-weight: 600; - color: var(--text-secondary); - padding-top: 2px; + font-size: var(--step--1); + font-weight: 600; + color: var(--text-secondary); + padding-top: 2px; } .recap-dl dd { - font-size: var(--step--1); - margin: 0; - color: var(--text-primary); + font-size: var(--step--1); + margin: 0; + color: var(--text-primary); } /* ── Thanks page ────────────────────────────────────────────────────────── */ .thanks-student-page { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - min-height: 60vh; - text-align: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 60vh; + text-align: center; } .thanks-success, .thanks-error { - display: flex; - flex-direction: column; - align-items: center; - gap: var(--space-m); - max-width: 520px; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-m); + max-width: 520px; } .thanks-success h1, .thanks-error h1 { - margin: 0; - letter-spacing: 0.06em; + margin: 0; + letter-spacing: 0.06em; } .thanks-message { - font-size: var(--step-0); - color: var(--text-primary); - margin: 0; - line-height: 1.6; + font-size: var(--step-0); + color: var(--text-primary); + margin: 0; + line-height: 1.6; } .thanks-error p { - font-size: var(--step-0); - color: var(--text-secondary); - margin: 0; + font-size: var(--step-0); + color: var(--text-secondary); + margin: 0; } .btn-new-form { - /* deprecated alias for .btn--primary .btn--lg; kept for backward-compat */ + /* deprecated alias for .btn--primary .btn--lg; kept for backward-compat */ } /* ── Form help blocks ────────────────────────────────────────────────────── */ .student-help-block { - background: color-mix(in srgb, var(--accent-primary) 8%, transparent); - border-left: 3px solid var(--accent-primary); - border-radius: 0 6px 6px 0; - padding: var(--space-m); - margin: var(--space-s) 0; - font-size: var(--step--1); - color: var(--text-primary); - line-height: 1.6; + background: color-mix(in srgb, var(--accent-primary) 8%, transparent); + border-left: 3px solid var(--accent-primary); + border-radius: 0 6px 6px 0; + padding: var(--space-m); + margin: var(--space-s) 0; + font-size: var(--step--1); + color: var(--text-primary); + line-height: 1.6; } .student-help-block > *:first-child { - margin-top: 0; + margin-top: 0; } .student-help-block > *:last-child { - margin-bottom: 0; + margin-bottom: 0; } .student-help-block p { - margin: 0 0 var(--space-xs); + margin: 0 0 var(--space-xs); } .student-help-block ul, .student-help-block ol { - margin: 0 0 var(--space-xs); - padding-left: var(--space-m); + margin: 0 0 var(--space-xs); + padding-left: var(--space-m); } .student-help-block li { - margin-bottom: var(--space-3xs); + margin-bottom: var(--space-3xs); } .student-help-block a { - color: var(--accent-primary); + color: var(--accent-primary); } /* ── E-mail retry page ───────────────────────────────────────────────────── */ .partage-retry-email { - display: flex; - flex-direction: column; - gap: var(--space-l); - max-width: 600px; - margin: 0 auto; + display: flex; + flex-direction: column; + gap: var(--space-l); + max-width: 600px; + margin: 0 auto; } .retry-email-section { - border-top: 1px solid var(--border-primary); - padding-top: var(--space-m); - display: flex; - flex-direction: column; - gap: var(--space-m); + border-top: 1px solid var(--border-primary); + padding-top: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-m); } .retry-email-section h2 { - font-weight: 600; - margin: 0; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-secondary); + font-weight: 600; + margin: 0; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--text-secondary); } .retry-smtp-detail { - display: block; - margin-top: var(--space-2xs); - font-size: var(--step--2); - color: var(--text-secondary); - word-break: break-all; + display: block; + margin-top: var(--space-2xs); + font-size: var(--step--2); + color: var(--text-secondary); + word-break: break-all; } .retry-email-form { - display: flex; - flex-direction: column; - gap: var(--space-m); + display: flex; + flex-direction: column; + gap: var(--space-m); } .retry-email-form .field-wrap { - display: flex; - flex-direction: column; - gap: var(--space-2xs); + display: flex; + flex-direction: column; + gap: var(--space-2xs); } .retry-email-form label { - font-size: var(--step--1); - font-weight: 400; + font-size: var(--step--1); + font-weight: 400; } .retry-email-form input[type="email"] { - font-size: var(--step-0); - width: 100%; + font-size: var(--step-0); + width: 100%; } .retry-email-form input.input-error { - border-color: var(--error, #c00); + border-color: var(--error, #c00); } .retry-email-actions { - display: flex; - gap: var(--space-s); - flex-wrap: wrap; + display: flex; + gap: var(--space-s); + flex-wrap: wrap; } .btn-primary { - /* deprecated alias for .btn--primary; kept for backward-compat */ + /* deprecated alias for .btn--primary; kept for backward-compat */ } .btn-secondary { - /* deprecated alias for .btn--secondary; kept for backward-compat */ + /* deprecated alias for .btn--secondary; kept for backward-compat */ } /* ── Tag search (mots-clés interactive component) ──────────────────────── */ @@ -925,426 +927,428 @@ /* The outer container may be placed inside a fieldset or as a direct child of .admin-form. Use a generic vertical layout that works in both contexts. */ [id$="-search-container"] { - display: flex; - flex-direction: column; - gap: var(--space-2xs); + display: flex; + flex-direction: column; + gap: var(--space-2xs); } [id$="-search-container"] > .admin-row-label { - font-size: var(--step--1); - padding-top: 0; - font-weight: 400; + font-size: var(--step--1); + padding-top: 0; + font-weight: 400; } .tag-search-wrapper { - display: flex; - flex-direction: column; - gap: var(--space-2xs); - position: relative; + display: flex; + flex-direction: column; + gap: var(--space-2xs); + position: relative; } /* Hint text above input */ .tag-search-hint { - display: block; - font-size: var(--step--2); - color: var(--text-secondary); - margin-bottom: var(--space-3xs); + display: block; + font-size: var(--step--2); + color: var(--text-secondary); + margin-bottom: var(--space-3xs); } /* Counter (e.g. "3/10") */ .tag-search-counter { - display: flex; - align-items: center; - gap: var(--space-2xs); - font-size: var(--step--2); + display: flex; + align-items: center; + gap: var(--space-2xs); + font-size: var(--step--2); } .tag-search-count { - font-weight: 600; - color: var(--accent-primary); - background: var(--accent-muted, rgba(149, 87, 181, 0.1)); - padding: 1px var(--space-2xs); - border-radius: var(--radius); + font-weight: 600; + color: var(--accent-primary); + background: var(--accent-muted, rgba(149, 87, 181, 0.1)); + padding: 1px var(--space-2xs); + border-radius: var(--radius); } .tag-search-max-msg { - color: var(--text-tertiary); - font-style: italic; + color: var(--text-tertiary); + font-style: italic; } /* Pill row — spacing around selected tags area */ .tag-search-pills { - display: flex; - flex-wrap: wrap; - gap: var(--space-2xs); - min-height: 0; - padding: var(--space-2xs) 0; + display: flex; + flex-wrap: wrap; + gap: var(--space-2xs); + min-height: 0; + padding: var(--space-2xs) 0; } .tag-search-pills:empty { - padding: 0; - display: none; + padding: 0; + display: none; } /* Individual pill */ .tag-pill { - display: inline-flex; - align-items: center; - gap: var(--space-3xs); - padding: 2px 2px 2px var(--space-2xs); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: 999px; - font-size: var(--step--1); - line-height: 1.4; - white-space: nowrap; - transition: border-color 0.15s; + display: inline-flex; + align-items: center; + gap: var(--space-3xs); + padding: 2px 2px 2px var(--space-2xs); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: 999px; + font-size: var(--step--1); + line-height: 1.4; + white-space: nowrap; + transition: border-color 0.15s; } .tag-pill:hover { - border-color: var(--accent-primary); + border-color: var(--accent-primary); } .tag-pill-name { - color: var(--text-primary); + color: var(--text-primary); } /* Round remove button */ .tag-pill-remove { - display: inline-flex; - align-items: center; - justify-content: center; - width: 22px; - height: 22px; - padding: 0; - border: none; - border-radius: 50%; - background: transparent; - color: var(--text-tertiary); - cursor: pointer; - flex-shrink: 0; - transition: background 0.15s, color 0.15s; + display: inline-flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + padding: 0; + border: none; + border-radius: 50%; + background: transparent; + color: var(--text-tertiary); + cursor: pointer; + flex-shrink: 0; + transition: + background 0.15s, + color 0.15s; } .tag-pill-remove:hover { - background: var(--error); - color: #fff; + background: var(--error); + color: #fff; } .tag-pill-remove svg { - width: 14px; - height: 14px; + width: 14px; + height: 14px; } /* Search input */ .tag-search-input-wrap { - display: flex; + display: flex; } .tag-search-input { - width: 100%; - font-size: var(--step--1); - font-family: inherit; + width: 100%; + font-size: var(--step--1); + font-family: inherit; } /* Suggestions dropdown — absolute positioned to hover above content */ .tag-search-suggestions { - position: absolute; - top: 100%; - left: 0; - right: 0; - z-index: 100; - background: var(--bg-primary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); - max-height: 220px; - overflow-y: auto; - display: none; - margin-top: 2px; + position: absolute; + top: 100%; + left: 0; + right: 0; + z-index: 100; + background: var(--bg-primary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); + max-height: 220px; + overflow-y: auto; + display: none; + margin-top: 2px; } .tag-search-suggestions:not(:empty) { - display: block; + display: block; } .tag-search-empty { - padding: var(--space-2xs) var(--space-xs); - font-size: var(--step--2); - color: var(--text-tertiary); - pointer-events: none; + padding: var(--space-2xs) var(--space-xs); + font-size: var(--step--2); + color: var(--text-tertiary); + pointer-events: none; } /* ── Jury autocomplete dropdown (positioned within .admin-jury-lecteurs) ──── */ .admin-jury-lecteurs[data-jury-autocomplete] { - position: relative; + position: relative; } .admin-jury-lecteurs .jury-suggestions { - position: absolute; - top: auto; - left: 0; - right: 0; - margin-top: 2px; + position: absolute; + top: auto; + left: 0; + right: 0; + margin-top: 2px; } /* Individual suggestion item */ .tag-search-item { - display: flex; - align-items: center; - gap: var(--space-2xs); - width: 100%; - padding: var(--space-2xs) var(--space-xs); - background: transparent; - border: none; - border-bottom: 1px solid var(--border-primary); - font-family: inherit; - font-size: var(--step--1); - cursor: pointer; - text-align: left; - color: var(--text-primary); - transition: background 0.1s; + display: flex; + align-items: center; + gap: var(--space-2xs); + width: 100%; + padding: var(--space-2xs) var(--space-xs); + background: transparent; + border: none; + border-bottom: 1px solid var(--border-primary); + font-family: inherit; + font-size: var(--step--1); + cursor: pointer; + text-align: left; + color: var(--text-primary); + transition: background 0.1s; } .tag-search-item:last-child { - border-bottom: none; + border-bottom: none; } .tag-search-item:hover, .tag-search-item:focus, .tag-search-item--highlight { - background: var(--bg-secondary); - outline: none; + background: var(--bg-secondary); + outline: none; } .tag-search-item--highlight { - background: var(--accent-muted, rgba(149, 87, 181, 0.1)); + background: var(--accent-muted, rgba(149, 87, 181, 0.1)); } .tag-search-item-name { - flex: 1; - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + flex: 1; + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .tag-search-item-count { - font-size: var(--step--2); - color: var(--text-tertiary); - flex-shrink: 0; + font-size: var(--step--2); + color: var(--text-tertiary); + flex-shrink: 0; } .tag-search-item--create { - color: var(--accent-primary); - font-weight: 500; - border-bottom-style: dashed; + color: var(--accent-primary); + font-weight: 500; + border-bottom-style: dashed; } .tag-search-item--create:hover, .tag-search-item--create.tag-search-item--highlight { - background: var(--accent-muted, rgba(149, 87, 181, 0.08)); + background: var(--accent-muted, rgba(149, 87, 181, 0.08)); } /* ── File preview list (couverture, note d'intention, annexes) ───────────── */ .file-preview-list { - list-style: none; - margin: var(--space-3xs) 0 0; - padding: 0; - display: flex; - flex-direction: column; - gap: var(--space-3xs); + list-style: none; + margin: var(--space-3xs) 0 0; + padding: 0; + display: flex; + flex-direction: column; + gap: var(--space-3xs); } .fp-item { - display: flex; - align-items: center; - gap: var(--space-xs); - padding: var(--space-3xs) var(--space-xs); - background: var(--bg-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--radius); - min-width: 0; - max-width: 100%; + display: flex; + align-items: center; + gap: var(--space-xs); + padding: var(--space-3xs) var(--space-xs); + background: var(--bg-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + min-width: 0; + max-width: 100%; } .fp-thumb { - width: 48px; - height: 36px; - object-fit: cover; - border-radius: 3px; - flex-shrink: 0; + width: 48px; + height: 36px; + object-fit: cover; + border-radius: 3px; + flex-shrink: 0; } .fp-icon { - font-size: 1.3rem; - line-height: 1; - flex-shrink: 0; - width: 2rem; - text-align: center; + font-size: 1.3rem; + line-height: 1; + flex-shrink: 0; + width: 2rem; + text-align: center; } .fp-meta { - display: flex; - flex-direction: column; - gap: 2px; - flex: 1; - min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; + min-width: 0; } .fp-name { - font-size: var(--step--1); - font-weight: 500; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + font-size: var(--step--1); + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .fp-size { - font-size: var(--step--2); - color: var(--text-tertiary); + font-size: var(--step--2); + color: var(--text-tertiary); } - - /* ── Sticky formats fieldset ──────────────────────────────── */ #fieldset-formats { - position: sticky; - top: var(--space-s); - z-index: 10; - /* background: var(--bg-primary); */ - border-radius: var(--radius); + position: sticky; + top: var(--space-s); + z-index: 10; + /* background: var(--bg-primary); */ + border-radius: var(--radius); } legend { - text-shadow: var(--bg-primary) 0px 0px 2px; + text-shadow: var(--bg-primary) 0px 0px 2px; } /* Stickiness is scoped to the parent container */ #format-fichiers-block { - container-type: inline-size; + container-type: inline-size; } /* ── Licence choice or-separator ─────────────────────────── */ .licence-or-separator { - display: flex; - align-items: center; - gap: var(--space-xs); - margin: var(--space-xs) 0; - color: var(--text-tertiary); - font-size: var(--step--1); + display: flex; + align-items: center; + gap: var(--space-xs); + margin: var(--space-xs) 0; + color: var(--text-tertiary); + font-size: var(--step--1); } .licence-or-separator::before, .licence-or-separator::after { - content: ''; - flex: 1; - height: 1px; - background: var(--accent-muted); + content: ""; + flex: 1; + height: 1px; + background: var(--accent-muted); } /* ── Nested licence fieldset ─────────────────────────────── */ .licence-options-fieldset { - border: 1px solid var(--accent-muted); - border-radius: var(--radius); - padding: var(--space-s); - margin-top: var(--space-xs); + border: 1px solid var(--accent-muted); + border-radius: var(--radius); + padding: var(--space-s); + margin-top: var(--space-xs); } .licence-options-fieldset legend { - font-weight: 400; - font-size: var(--step--1); - color: var(--text-secondary); - padding: 0 var(--space-2xs); + font-weight: 400; + font-size: var(--step--1); + color: var(--text-secondary); + padding: 0 var(--space-2xs); } - /* ── Mobile-responsive layout ──────────────────────────────────────────── */ /* Below 600px: labels stack above inputs, single-column form layout. Touch targets meet WCAG 2.5.5 minimum (44×44px). */ @media (max-width: 600px) { - /* ── Form rows: stack label above input ── */ - .admin-form > div:not(.admin-form-footer):not(.student-help-block) { - grid-template-columns: 1fr; - gap: var(--space-3xs); - } + /* ── Form rows: stack label above input ── */ + .admin-form > div:not(.admin-form-footer):not(.student-help-block) { + grid-template-columns: 1fr; + gap: var(--space-3xs); + } - .admin-form > div:not(.admin-form-footer) > label, - .admin-form > div:not(.admin-form-footer) > span.admin-row-label { - padding-top: 0; - font-weight: 400; - } + .admin-form > div:not(.admin-form-footer) > label, + .admin-form > div:not(.admin-form-footer) > span.admin-row-label { + padding-top: 0; + font-weight: 400; + } - /* Labels inside fieldsets (checkbox/radio groups) */ - .admin-form-group > label.admin-checkbox-label { - padding: var(--space-2xs) 0; - } + /* Labels inside fieldsets (checkbox/radio groups) */ + .admin-form-group > label.admin-checkbox-label { + padding: var(--space-2xs) 0; + } - /* ── Touch targets: WCAG 2.5.5 minimum 44×44px ── */ - .admin-form input[type="checkbox"], - .admin-form input[type="radio"] { - min-width: 44px; - min-height: 44px; - } + /* ── Touch targets: WCAG 2.5.5 minimum 44×44px ── */ + .admin-form input[type="checkbox"], + .admin-form input[type="radio"] { + min-width: 44px; + min-height: 44px; + } - .admin-form select, - .admin-form textarea, - .admin-form input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]) { - min-height: 44px; - } + .admin-form select, + .admin-form textarea, + .admin-form + input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not( + [type="hidden"] + ):not([type="submit"]) { + min-height: 44px; + } - .btn { - min-height: 44px; - padding: var(--space-2xs-xs); - } + .btn { + min-height: 44px; + padding: var(--space-2xs-xs); + } - .btn--sm { - min-height: 44px; - } + .btn--sm { + min-height: 44px; + } - /* ── FilePond: ensure drop area is spacious ── */ - .filepond--root { - min-height: 44px; - } + /* ── FilePond: ensure drop area is spacious ── */ + .filepond--root { + min-height: 44px; + } - /* ── Thesis-add header: stack on narrow screens ── */ - .thesis-add-header { - grid-template-columns: 1fr; - gap: var(--space-2xs); - } + /* ── Thesis-add header: stack on narrow screens ── */ + .thesis-add-header { + grid-template-columns: 1fr; + gap: var(--space-2xs); + } - /* ── Recapitulatif dl: single column ── */ - .recap-dl { - grid-template-columns: 1fr; - } + /* ── Recapitulatif dl: single column ── */ + .recap-dl { + grid-template-columns: 1fr; + } - .recap-dl dt { - padding-top: var(--space-2xs); - } + .recap-dl dt { + padding-top: var(--space-2xs); + } - /* ── Form footer: stack buttons ── */ - .form-footer { - flex-direction: column; - align-items: stretch; - } + /* ── Form footer: stack buttons ── */ + .form-footer { + flex-direction: column; + align-items: stretch; + } - .form-footer button, - .form-footer .btn { - width: 100%; - } + .form-footer button, + .form-footer .btn { + width: 100%; + } - /* ── Fieldset margin tightening ── */ - .admin-body fieldset, - .student-body fieldset { - margin: var(--space-2xs) 0 var(--space-xs); - } + /* ── Fieldset margin tightening ── */ + .admin-body fieldset, + .student-body fieldset { + margin: var(--space-2xs) 0 var(--space-xs); + } - /* ── sticky formats fieldset: unstick on mobile ── */ - #fieldset-formats { - position: static; - } + /* ── sticky formats fieldset: unstick on mobile ── */ + #fieldset-formats { + position: static; + } } diff --git a/app/public/assets/css/public.css b/app/public/assets/css/public.css index 1178235..8d28f0c 100644 --- a/app/public/assets/css/public.css +++ b/app/public/assets/css/public.css @@ -5,267 +5,267 @@ /* Cards grid — scrollable main area */ .home-main { - flex: 1; - min-height: 0; - overflow-y: auto; - overflow-x: hidden; - padding: 0; + flex: 1; + min-height: 0; + overflow-y: auto; + overflow-x: hidden; + padding: 0; } .cards-container { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--space-s); - list-style: none; - margin: 0; - padding: var(--space-xs) var(--space-s) var(--space-m); + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-s); + list-style: none; + margin: 0; + padding: var(--space-xs) var(--space-s) var(--space-m); } @media (max-width: 768px) { - .cards-container { - grid-template-columns: repeat(2, 1fr); - } + .cards-container { + grid-template-columns: repeat(2, 1fr); + } } @media (max-width: 480px) { - .cards-container { - grid-template-columns: 1fr; - } + .cards-container { + grid-template-columns: 1fr; + } } /* Each card = list item containing a block link */ .card { - display: flex; - flex-direction: column; - cursor: pointer; - border: 1px solid var(--border-primary); - border-radius: var(--radius); - background: var(--bg-primary); - overflow: hidden; - transition: - box-shadow 0.2s ease, - transform 0.2s ease; + display: flex; + flex-direction: column; + cursor: pointer; + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: var(--bg-primary); + overflow: hidden; + transition: + box-shadow 0.2s ease, + transform 0.2s ease; } .card:hover { - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); - transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); + transform: translateY(-2px); } .card > a { - text-decoration: none; - color: inherit; - display: flex; - flex-direction: column; - flex: 1; - border-radius: inherit; + text-decoration: none; + color: inherit; + display: flex; + flex-direction: column; + flex: 1; + border-radius: inherit; } /* Media wrapper:
for real images/video,
for placeholders */ .home-body figure { - width: 100%; - aspect-ratio: 4/3; - overflow: hidden; - background: var(--bg-tertiary); - position: relative; - margin: 0; /* reset
default margin */ - border-radius: 7px 7px 0 0; + width: 100%; + aspect-ratio: 4 / 3; + overflow: hidden; + background: var(--bg-tertiary); + position: relative; + margin: 0; /* reset
default margin */ + border-radius: 7px 7px 0 0; } .home-body figure img, .home-body figure video { - width: 100%; - height: 100%; - object-fit: cover; - display: block; - transition: transform 0.3s ease; + width: 100%; + height: 100%; + object-fit: cover; + display: block; + transition: transform 0.3s ease; } .card:hover figure img, .card:hover figure video { - transform: scale(1.02); + transform: scale(1.02); } .card__media--placeholder { - width: 100%; - height: 100%; - background: linear-gradient(135deg, var(--bg-tertiary), var(--bg-active)); - display: flex; - align-items: center; - justify-content: center; - color: var(--text-tertiary); - font-size: var(--step-3); + width: 100%; + height: 100%; + background: linear-gradient(135deg, var(--bg-tertiary), var(--bg-active)); + display: flex; + align-items: center; + justify-content: center; + color: var(--text-tertiary); + font-size: var(--step-3); } .card__media--gradient { - width: 100%; - aspect-ratio: 4/3; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: var(--space-s); - text-align: center; - box-sizing: border-box; - border-radius: 7px 7px 0 0; - background: linear-gradient( - 180deg, - rgba(60, 133, 108, 1) 0%, - rgba(51, 191, 135, 1) 25%, - rgba(192, 93, 225, 1) 75%, - rgba(149, 87, 181, 1) 100% - ); + width: 100%; + aspect-ratio: 4 / 3; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--space-s); + text-align: center; + box-sizing: border-box; + border-radius: 7px 7px 0 0; + background: linear-gradient( + 180deg, + rgba(60, 133, 108, 1) 0%, + rgba(51, 191, 135, 1) 25%, + rgba(192, 93, 225, 1) 75%, + rgba(149, 87, 181, 1) 100% + ); } .card__gradient-author { - color: var(--accent-foreground); - font-size: var(--step--2); - opacity: 0.85; - margin-bottom: 0.25rem; - display: block; + color: var(--accent-foreground); + font-size: var(--step--2); + opacity: 0.85; + margin-bottom: 0.25rem; + display: block; } .card__gradient-title { - color: var(--accent-foreground); - font-size: var(--step--1); - font-weight: 600; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; + color: var(--accent-foreground); + font-size: var(--step--1); + font-weight: 600; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; } /* Section label */ .home-section-label { - font-style: normal; - background: transparent; - color: var(--text-primary); - font-size: var(--step--2); - font-weight: 600; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: var(--space-s) var(--space-s) var(--space-xs); - border-bottom: 1px solid var(--border-primary); - margin: 0; + font-style: normal; + background: transparent; + color: var(--text-primary); + font-size: var(--step--2); + font-weight: 600; + letter-spacing: 0.1em; + text-transform: uppercase; + padding: var(--space-s) var(--space-s) var(--space-xs); + border-bottom: 1px solid var(--border-primary); + margin: 0; } /* Card caption —

directly inside the card link, below the media */ .home-body li > a > p { - padding: var(--space-2xs) var(--space-xs) var(--space-xs); - font-size: var(--step--1); - line-height: 1.35; - color: var(--text-primary); - margin: 0; - font-weight: 400; - border-top: 1px solid var(--border-primary); + padding: var(--space-2xs) var(--space-xs) var(--space-xs); + font-size: var(--step--1); + line-height: 1.35; + color: var(--text-primary); + margin: 0; + font-weight: 400; + border-top: 1px solid var(--border-primary); } /* Empty-state message shown when no cards exist */ .cards-empty { - padding: var(--space-l); - color: var(--text-tertiary); - font-size: var(--step--1); - list-style: none; + padding: var(--space-l); + color: var(--text-tertiary); + font-size: var(--step--1); + list-style: none; } /* Filter info */ .filter-info { - background: var(--accent-muted); - color: var(--accent-secondary); - padding: var(--space-3xs) var(--space-s); - font-size: var(--step--1); - display: flex; - align-items: center; - gap: var(--space-s); - flex-shrink: 0; + background: var(--accent-muted); + color: var(--accent-secondary); + padding: var(--space-3xs) var(--space-s); + font-size: var(--step--1); + display: flex; + align-items: center; + gap: var(--space-s); + flex-shrink: 0; } .clear-filter { - color: var(--accent-secondary); - text-decoration: none; - padding: var(--space-3xs) var(--space-2xs); - background: var(--accent-muted); - border-radius: var(--radius); - font-size: var(--step--1); + color: var(--accent-secondary); + text-decoration: none; + padding: var(--space-3xs) var(--space-2xs); + background: var(--accent-muted); + border-radius: var(--radius); + font-size: var(--step--1); } .clear-filter:hover { - background: var(--accent-secondary); - color: var(--accent-foreground); + background: var(--accent-secondary); + color: var(--accent-foreground); } /* Pagination */ .pagination-wrap { - border-top: 1px solid var(--border-secondary); - background: var(--bg-primary); - flex-shrink: 0; + border-top: 1px solid var(--border-secondary); + background: var(--bg-primary); + flex-shrink: 0; } .pagination-wrap ul { - display: flex; - justify-content: center; - align-items: center; - gap: var(--space-2xs); - padding: var(--space-s); - list-style: none; - margin: 0; + display: flex; + justify-content: center; + align-items: center; + gap: var(--space-2xs); + padding: var(--space-s); + list-style: none; + margin: 0; } .pagination-btn { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 2.75rem; - min-height: 2.75rem; - padding: 0 var(--space-2xs); - border: 1px solid var(--border-secondary); - border-radius: var(--radius); - color: var(--text-primary); - font-size: var(--step--1); - text-decoration: none; - font-weight: 400; - transition: all 0.15s; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2.75rem; + min-height: 2.75rem; + padding: 0 var(--space-2xs); + border: 1px solid var(--border-secondary); + border-radius: var(--radius); + color: var(--text-primary); + font-size: var(--step--1); + text-decoration: none; + font-weight: 400; + transition: all 0.15s; } .pagination-btn:hover:not(.disabled) { - border-color: var(--accent-primary); - color: var(--accent-primary); + border-color: var(--accent-primary); + color: var(--accent-primary); } .pagination-btn.disabled { - opacity: 0.3; - cursor: not-allowed; - pointer-events: none; + opacity: 0.3; + cursor: not-allowed; + pointer-events: none; } .pagination-info { - font-size: var(--step--1); - color: var(--text-secondary); - padding: 0 var(--space-2xs); + font-size: var(--step--1); + color: var(--text-secondary); + padding: 0 var(--space-2xs); } .page-current { - font-weight: 600; - color: var(--text-primary); + font-weight: 600; + color: var(--text-primary); } /* Suppress card hover scale for users who prefer reduced motion */ @media (prefers-reduced-motion: reduce) { - .home-body figure img, - .home-body figure video { - transition: none; - } - .card:hover figure img, - .card:hover figure video { - transform: none; - } - .card__media--gradient { - transition: none; - } - .card { - transition: none; - } - .card:hover { - transform: none; - } + .home-body figure img, + .home-body figure video { + transition: none; + } + .card:hover figure img, + .card:hover figure video { + transform: none; + } + .card__media--gradient { + transition: none; + } + .card { + transition: none; + } + .card:hover { + transform: none; + } } diff --git a/app/public/assets/css/repertoire.css b/app/public/assets/css/repertoire.css index ce871db..f02fb08 100644 --- a/app/public/assets/css/repertoire.css +++ b/app/public/assets/css/repertoire.css @@ -4,844 +4,852 @@ ============================================================ */ .search-main { - flex: 1; - min-height: 0; - overflow: hidden; - padding: 0; - display: flex; - flex-direction: column; + flex: 1; + min-height: 0; + overflow: hidden; + padding: 0; + display: flex; + flex-direction: column; } /* ── Scrollable results area with sticky pagination ──────────────── */ #search-results { - flex: 1; - min-height: 0; - overflow-y: auto; - display: flex; - flex-direction: column; + flex: 1; + min-height: 0; + overflow-y: auto; + display: flex; + flex-direction: column; } .search-results-header { - flex-shrink: 0; + flex-shrink: 0; } .search-results-range--compact { - display: none; + display: none; } .search-empty { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - padding: var(--space-xl) var(--space-m); - color: var(--text-secondary); - font-size: var(--step-0); - text-align: center; + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: var(--space-xl) var(--space-m); + color: var(--text-secondary); + font-size: var(--step-0); + text-align: center; } /* ---- 6-column index layout ---- */ /* Equal-width columns except Années (years) = narrower */ .repertoire-index { - display: grid; - grid-template-columns: - minmax(3rem, 0.45fr) - minmax(16rem, 1.2fr) - minmax(9rem, 1fr) - minmax(7rem, 1fr) - minmax(8rem, 1fr) - minmax(3rem, 0.45fr); - grid-template-rows: auto minmax(0, 1fr); - gap: var(--space-s); - justify-content: space-between; - padding: 0; - margin: 0 var(--space-s); - height: 100%; + display: grid; + grid-template-columns: + minmax(3rem, 0.45fr) + minmax(16rem, 1.2fr) + minmax(9rem, 1fr) + minmax(7rem, 1fr) + minmax(8rem, 1fr) + minmax(3rem, 0.45fr); + grid-template-rows: auto minmax(0, 1fr); + gap: var(--space-s); + justify-content: space-between; + padding: 0; + margin: 0 var(--space-s); + height: 100%; } /* ---- Accordion: visible only on mobile (≤ 640px) ---- */ /* Desktop: heading-text visible, toggle hidden */ .rep-accordion__heading-text { - /* visible — inherits the h2 styling above */ + /* visible — inherits the h2 styling above */ } .rep-accordion__toggle, .rep-accordion__chevron, .rep-accordion__badge { - display: none; + display: none; } .rep-accordion__panel { - display: contents; + display: contents; } /* Each section becomes transparent to the grid so h2+ul sit in the 2-row layout */ .repertoire-col { - display: contents; + display: contents; } .repertoire-col > h2 { - grid-row: 1; - font-family: var(--font-display); - font-size: var(--step--1); - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--text-primary); - font-weight: 398; - line-height: 1.3; - margin: 0; - padding: var(--space-xs) 0 var(--space-3xs) 0; - border-bottom: 1px solid var(--text-primary); - align-self: end; - hyphens: auto; - word-break: normal; - overflow-wrap: break-word; + grid-row: 1; + font-family: var(--font-display); + font-size: var(--step--1); + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text-primary); + font-weight: 398; + line-height: 1.3; + margin: 0; + padding: var(--space-xs) 0 var(--space-3xs) 0; + border-bottom: 1px solid var(--text-primary); + align-self: end; + hyphens: auto; + word-break: normal; + overflow-wrap: break-word; } .repertoire-col .rep-accordion__panel > ul { - grid-row: 2; - overflow-y: auto; - overflow-x: hidden; - min-height: 0; - padding-top: var(--space-2xs); - padding-bottom: var(--space-l); - padding-left: 0; - padding-right: 0; + grid-row: 2; + overflow-y: auto; + overflow-x: hidden; + min-height: 0; + padding-top: var(--space-2xs); + padding-bottom: var(--space-l); + padding-left: 0; + padding-right: 0; } /* Strip list chrome inside repertoire columns */ .repertoire-col ul { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } /* ---- Responsive (≤ 1025px): accordion mode, students as results ---- */ @media (max-width: 1025px) { - .repertoire-index { - display: flex; - flex-direction: column; - min-height: 0; - height: 100%; - overflow-y: hidden; - gap: 0; - margin: 0; - } + .repertoire-index { + display: flex; + flex-direction: column; + min-height: 0; + height: 100%; + overflow-y: hidden; + gap: 0; + margin: 0; + } - /* Each column becomes a block-level accordion section */ - .repertoire-col { - display: block; - border-bottom: 1px solid var(--text-primary); - } + /* Each column becomes a block-level accordion section */ + .repertoire-col { + display: block; + border-bottom: 1px solid var(--text-primary); + } - .repertoire-col[data-col="students"] { - border-bottom: none; - } + .repertoire-col[data-col="students"] { + border-bottom: none; + } - /* Flex order: years/ap/or/fi first, then keywords, students last */ - .repertoire-col[data-col="years"] { order: 0; } - .repertoire-col[data-col="ap"] { order: 1; } - .repertoire-col[data-col="or"] { order: 2; } - .repertoire-col[data-col="fi"] { order: 3; } - .repertoire-col[data-col="kw"] { order: 4; } - .repertoire-col[data-col="students"] { order: 5; } + /* Flex order: years/ap/or/fi first, then keywords, students last */ + .repertoire-col[data-col="years"] { + order: 0; + } + .repertoire-col[data-col="ap"] { + order: 1; + } + .repertoire-col[data-col="or"] { + order: 2; + } + .repertoire-col[data-col="fi"] { + order: 3; + } + .repertoire-col[data-col="kw"] { + order: 4; + } + .repertoire-col[data-col="students"] { + order: 5; + } - /* Students column: not an accordion — open results list below filters */ - .repertoire-col[data-col="students"] { - border-bottom: none; - border-top: none; - margin-top: 0; - padding-top: 0; - flex: 1; - min-height: 0; - display: flex; - flex-direction: column; - } + /* Students column: not an accordion — open results list below filters */ + .repertoire-col[data-col="students"] { + border-bottom: none; + border-top: none; + margin-top: 0; + padding-top: 0; + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + } - .repertoire-col[data-col="students"] .rep-accordion__toggle { - display: none; - } + .repertoire-col[data-col="students"] .rep-accordion__toggle { + display: none; + } - .repertoire-col[data-col="students"] .rep-accordion__heading-text { - display: none; - } + .repertoire-col[data-col="students"] .rep-accordion__heading-text { + display: none; + } - .repertoire-col[data-col="students"] .rep-accordion__panel { - display: block; - max-height: none; - overflow-y: auto; - flex: 1; - } + .repertoire-col[data-col="students"] .rep-accordion__panel { + display: block; + max-height: none; + overflow-y: auto; + flex: 1; + } - /* Hide the plain h2 — the toggle button replaces it */ - .repertoire-col > h2 { - display: block; - grid-row: unset; - align-self: unset; - border-bottom: none; - padding: 0; - margin: 0; - font-size: inherit; - line-height: inherit; - } + /* Hide the plain h2 — the toggle button replaces it */ + .repertoire-col > h2 { + display: block; + grid-row: unset; + align-self: unset; + border-bottom: none; + padding: 0; + margin: 0; + font-size: inherit; + line-height: inherit; + } - /* Hide heading text on mobile (toggle button replaces it) */ - .rep-accordion__heading-text { - display: none; - } + /* Hide heading text on mobile (toggle button replaces it) */ + .rep-accordion__heading-text { + display: none; + } - /* Accordion toggle: full-width touch target */ - .rep-accordion__toggle { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - min-height: 48px; - padding: var(--space-xs) var(--space-s); - background: none; - border: none; - font-family: var(--font-display); - font-size: var(--step--2); - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--text-primary); - font-weight: 398; - text-align: left; - cursor: pointer; - } + /* Accordion toggle: full-width touch target */ + .rep-accordion__toggle { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + min-height: 48px; + padding: var(--space-xs) var(--space-s); + background: none; + border: none; + font-family: var(--font-display); + font-size: var(--step--2); + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text-primary); + font-weight: 398; + text-align: left; + cursor: pointer; + } - .rep-accordion__toggle:active { - background: var(--bg-secondary); - } + .rep-accordion__toggle:active { + background: var(--bg-secondary); + } - /* Badge: active filter count */ - .rep-accordion__badge { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 1.4em; - height: 1.4em; - padding: 0 0.35em; - margin-left: var(--space-2xs); - background: var(--accent-primary); - color: var(--accent-foreground); - border-radius: 99px; - font-family: var(--font-body); - font-size: var(--step--2); - font-weight: 500; - letter-spacing: 0; - text-transform: none; - } + /* Badge: active filter count */ + .rep-accordion__badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.4em; + height: 1.4em; + padding: 0 0.35em; + margin-left: var(--space-2xs); + background: var(--accent-primary); + color: var(--accent-foreground); + border-radius: 99px; + font-family: var(--font-body); + font-size: var(--step--2); + font-weight: 500; + letter-spacing: 0; + text-transform: none; + } - /* Chevron: CSS triangle */ - .rep-accordion__chevron { - display: inline-block; - width: 10px; - height: 10px; - flex-shrink: 0; - margin-left: var(--space-2xs); - border-right: 2px solid var(--text-secondary); - border-bottom: 2px solid var(--text-secondary); - transform: rotate(45deg); - transition: transform 0.2s; - } + /* Chevron: CSS triangle */ + .rep-accordion__chevron { + display: inline-block; + width: 10px; + height: 10px; + flex-shrink: 0; + margin-left: var(--space-2xs); + border-right: 2px solid var(--text-secondary); + border-bottom: 2px solid var(--text-secondary); + transform: rotate(45deg); + transition: transform 0.2s; + } - .rep-accordion__toggle[aria-expanded="true"] .rep-accordion__chevron { - transform: rotate(-135deg); - } + .rep-accordion__toggle[aria-expanded="true"] .rep-accordion__chevron { + transform: rotate(-135deg); + } - /* Panel: collapsed by default */ - .rep-accordion__panel { - display: block; - max-height: 0; - overflow: hidden; - transition: max-height 0.3s ease; - } + /* Panel: collapsed by default */ + .rep-accordion__panel { + display: block; + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease; + } - .rep-accordion__panel.is-open { - max-height: 60vh; - overflow-y: auto; - } + .rep-accordion__panel.is-open { + max-height: 60vh; + overflow-y: auto; + } - /* Reposition the