summaryrefslogtreecommitdiff
path: root/public/stylesheets
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-30 19:52:09 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-30 19:52:09 +0200
commitbc116a2acfe2450d85229379d54c3344e485db6a (patch)
treebd49c465f45bcec6251325d406c7de3cd6733ddf /public/stylesheets
parent6a1102e69230ed62138b8e6aec8a6348e8571b23 (diff)
Replaces the grey slab and filled-box handle with the house card idiom,
a tabler grip and icon-only edit and delete actions. Shows each item's non-default translations muted below the title, read from the translation rows rather than the accessor so the fallback chain cannot disguise a missing label as a translated one. Adds move up/down buttons via acts_as_list, the single-pointer alternative WCAG 2.5.7 requires: the jQuery UI sortable binds mouse events only, so dragging works neither on touch nor from the keyboard. The grip is hidden below the desktop breakpoint for the same reason. The sort handler dropped dataType: "json" against a head :ok response, which sent every success down the error path, and now reloads so the disabled chevron states match the stored order after a drag.
Diffstat (limited to 'public/stylesheets')
-rw-r--r--public/stylesheets/admin.css144
1 files changed, 123 insertions, 21 deletions
diff --git a/public/stylesheets/admin.css b/public/stylesheets/admin.css
index 49e2362b..1d39dd6c 100644
--- a/public/stylesheets/admin.css
+++ b/public/stylesheets/admin.css
@@ -9,7 +9,6 @@
9 --hairline: color-mix(in srgb, CanvasText, Canvas 91%); /* #e8e8e8 */ 9 --hairline: color-mix(in srgb, CanvasText, Canvas 91%); /* #e8e8e8 */
10 --hairline-faint: color-mix(in srgb, CanvasText, Canvas 94%); /* #f1f1f1 */ 10 --hairline-faint: color-mix(in srgb, CanvasText, Canvas 94%); /* #f1f1f1 */
11 --border: color-mix(in srgb, CanvasText, Canvas 87%); /* #ddd */ 11 --border: color-mix(in srgb, CanvasText, Canvas 87%); /* #ddd */
12 --frame-fill: color-mix(in srgb, CanvasText, Canvas 83%); /* lightgrey */
13 --field-border: color-mix(in srgb, CanvasText, Canvas 60%); /* #989898 */ 12 --field-border: color-mix(in srgb, CanvasText, Canvas 60%); /* #989898 */
14 --handle-fill: color-mix(in srgb, CanvasText, Canvas 60%); /* #989898 as fill */ 13 --handle-fill: color-mix(in srgb, CanvasText, Canvas 60%); /* #989898 as fill */
15 --link-underline: color-mix(in srgb, CanvasText, Canvas 69%); /* #b0b0b0 */ 14 --link-underline: color-mix(in srgb, CanvasText, Canvas 69%); /* #b0b0b0 */
@@ -1295,11 +1294,15 @@ input#menu_item_title {
1295 ============================================================ */ 1294 ============================================================ */
1296 1295
1297#menu_item_list { 1296#menu_item_list {
1298 border-collapse: collapse; 1297 border-collapse: separate;
1299 padding: 5px 5px 5px 5px; 1298 border-spacing: 0;
1300 border: solid 5px var(--frame-fill); 1299 width: 100%;
1301 background-color: var(--frame-fill); 1300 max-width: 44rem;
1302 border-radius: 5px; 1301
1302 border: 1px solid var(--hairline);
1303 border-radius: var(--radius);
1304
1305 padding: 0.5rem;
1303} 1306}
1304 1307
1305#menu_item_list tr:hover { 1308#menu_item_list tr:hover {
@@ -1307,33 +1310,132 @@ input#menu_item_title {
1307} 1310}
1308 1311
1309#menu_item_list td { 1312#menu_item_list td {
1310 height: 20px; 1313 padding: 0.4rem 0.5rem;
1314 border-bottom: 1px solid var(--hairline);
1315}
1316
1317#menu_item_list tr:last-child td {
1318 border-bottom: none;
1311} 1319}
1312 1320
1313#menu_item_list td.menu_item_title { 1321#menu_item_list td.menu_item_title {
1314 width: 200px; 1322 width: 100%;
1323}
1324
1325.menu_item_translation {
1326 display: block;
1327 font-size: 0.85rem;
1328 color: var(--text-muted);
1315} 1329}
1316 1330
1317#menu_item_list td.menu_sort_handle div { 1331.menu_item_translation_locale {
1318 background-color: var(--handle-fill); 1332 font-variant: all-small-caps;
1319 height: 26px; 1333 letter-spacing: 0.04em;
1320 width: 26px; 1334 margin-right: 0.35rem;
1321} 1335}
1322 1336
1323#menu_item_list td.menu_sort_handle div:before { 1337.menu_item_translation_absent {
1324 content: "⇳"; 1338 font-style: italic;
1325 font-size: 20px; 1339}
1326 font-weight: bold; 1340
1341#menu_item_list td.menu_item_action {
1342 width: 1px;
1343 white-space: nowrap;
1327 text-align: center; 1344 text-align: center;
1328 vertical-align: center;
1329} 1345}
1330 1346
1331#menu_item_list td.menu_sort_handle div:hover { 1347#menu_item_list td.menu_item_action a {
1332 cursor: grab; 1348 text-decoration: none;
1333} 1349}
1334 1350
1335.ui-state-highlight td { 1351#menu_item_list td.menu_item_action svg {
1336 height: 20px; 1352 width: 1.25rem;
1353 height: 1.25rem;
1354 vertical-align: middle;
1355}
1356
1357#menu_item_list td.menu_sort_handle {
1358 width: 1px;
1359 white-space: nowrap;
1360 color: var(--text-muted);
1361}
1362
1363/* jQuery UI sortable binds mouse events, so drag never works on touch.
1364 Below the desktop breakpoint the grip would advertise something that
1365 cannot happen, and the width is better spent on the chevrons. */
1366#menu_item_list .menu_grip {
1367 display: none;
1368}
1369
1370@media (min-width: 1016px) {
1371 #menu_item_list .menu_grip {
1372 display: inline-block;
1373 cursor: grab;
1374 vertical-align: middle;
1375 }
1376
1377 #menu_item_list td.menu_sort_handle:active .menu_grip {
1378 cursor: grabbing;
1379 }
1380}
1381
1382#menu_item_list form.menu_move {
1383 display: inline-block;
1384 margin: 0;
1385}
1386
1387#menu_item_list form.menu_move button[type="submit"] {
1388 padding: 0.15rem 0.2rem;
1389 border: 1px solid transparent;
1390 background-color: transparent;
1391 color: var(--text-muted);
1392 line-height: 1;
1393}
1394
1395#menu_item_list form.menu_move button[type="submit"]:hover {
1396 color: var(--text);
1397 background-color: var(--surface-tint);
1398}
1399
1400#menu_item_list form.menu_move button[type="submit"]:disabled {
1401 opacity: 0.35;
1402 cursor: default;
1403 background-color: transparent;
1404 color: var(--text-muted);
1405}
1406
1407#menu_item_list td.menu_sort_handle svg {
1408 width: 1.1rem;
1409 height: 1.1rem;
1410 vertical-align: middle;
1411}
1412
1413#menu_item_list td.menu_sort_handle:active {
1414 cursor: grabbing;
1415}
1416
1417#menu_item_list td.menu_sort_handle svg {
1418 width: 1.25rem;
1419 height: 1.25rem;
1420 vertical-align: middle;
1421}
1422
1423#menu_item_list tr.ui-state-highlight td {
1424 height: 2.5rem;
1425 background-color: var(--accent-surface);
1426 border: 1px dashed var(--accent);
1427}
1428
1429#menu_item_list form.button_to.destructive input[type="submit"],
1430#menu_item_list form.button_to.destructive button[type="submit"] {
1431 color: var(--danger);
1432 background-color: transparent;
1433}
1434
1435#menu_item_list form.button_to.destructive input[type="submit"]:hover,
1436#menu_item_list form.button_to.destructive button[type="submit"]:hover {
1437 color: var(--on-solid);
1438 background-color: var(--danger-solid);
1337} 1439}
1338 1440
1339/* ============================================================ 1441/* ============================================================