11<!--
2- - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
2+ - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
33 - SPDX-License-Identifier: AGPL-3.0-or-later
44-->
55
2828 <!-- Submit mode -->
2929 <div
3030 v-if =" readOnly"
31- class =" question__content"
31+ class =" question__content ranking-columns "
3232 role =" list"
3333 :aria-labelledby =" titleId"
3434 :aria-describedby =" description ? descriptionId : undefined" >
35- <!-- Unranked pool (visible when items remain) -->
36- <div v-if = " unrankedOptions.length > 0 " class =" ranking-unranked" >
37- <p class =" ranking-unranked__label " >
38- {{ t('forms', 'Tap to rank ') }}
35+ <!-- Left: Unranked pool -->
36+ <div class =" ranking-unranked" >
37+ <p class =" ranking-column__label " >
38+ {{ t('forms', 'Options ') }}
3939 </p >
40- <button
41- v-for =" option in unrankedOptions"
42- :key =" option.id"
43- class =" ranking-unranked__item"
44- @click =" rankOption(option)" >
45- {{ option.text }}
46- </button >
40+ <div class =" ranking-unranked__pool" >
41+ <button
42+ v-for =" option in unrankedOptions"
43+ :key =" option.id"
44+ class =" ranking-unranked__item"
45+ @click =" rankOption(option)" >
46+ {{ option.text }}
47+ </button >
48+ <p
49+ v-if =" unrankedOptions.length === 0"
50+ class =" ranking-unranked__empty" >
51+ {{ t('forms', 'All options ranked') }}
52+ </p >
53+ </div >
4754 </div >
4855
49- <!-- Empty state when nothing ranked yet -->
50- <p v-if =" rankedOptions.length === 0" class =" ranking-empty" >
51- {{ t('forms', 'Tap items above to rank them') }}
52- </p >
53-
54- <!-- Ranked list header (to separate from pool) -->
55- <p v-if =" rankedOptions.length > 0" class =" ranking-ranked__label" >
56- {{ t('forms', 'Your ranking') }}
57- </p >
58-
59- <!-- Ranked list -->
60- <Draggable
61- v-model =" rankedOptions"
62- :animation =" 200"
63- direction =" vertical"
64- handle =" .ranking-item__drag-handle"
65- @end =" onRankingEnd" >
66- <div
67- v-for =" (option, index) in rankedOptions"
68- :key =" option.id"
69- class =" ranking-item"
70- role =" listitem" >
71- <span class =" ranking-item__position" >{{ index + 1 }}.</span >
72- <span class =" ranking-item__text" >{{ option.text }}</span >
73- <div class =" ranking-item__actions" >
56+ <!-- Right: Ranked list -->
57+ <div class =" ranking-ranked" >
58+ <p class =" ranking-column__label" >
59+ {{ t('forms', 'Your ranking') }}
60+ </p >
61+ <Draggable
62+ v-model =" rankedOptions"
63+ class =" ranking-ranked__list"
64+ :animation =" 200"
65+ direction =" vertical"
66+ handle =" .ranking-item__drag-handle"
67+ @end =" onRankingEnd" >
68+ <div
69+ v-for =" (option, index) in rankedOptions"
70+ :key =" option.id"
71+ class =" ranking-item"
72+ role =" listitem" >
73+ <span class =" ranking-item__position" >{{ index + 1 }}.</span >
7474 <NcActions
7575 :aria-label =" t('forms', 'Move option actions')"
7676 class =" ranking-item__drag-handle"
9797 {{ t('forms', 'Move option down') }}
9898 </NcActionButton >
9999 </NcActions >
100+ <span class =" ranking-item__text" >{{ option.text }}</span >
100101 <NcButton
101102 variant =" tertiary"
102103 :ariaLabel =" t('forms', 'Remove from ranking')"
106107 </template >
107108 </NcButton >
108109 </div >
109- </div >
110- </Draggable >
110+ </Draggable >
111+ <p v-if =" rankedOptions.length === 0" class =" ranking-ranked__empty" >
112+ {{ t('forms', 'Tap options to rank them') }}
113+ </p >
114+ </div >
111115 </div >
112116
113117 <!-- Edit mode: manage options -->
@@ -351,25 +355,41 @@ export default {
351355 gap : var (--default-grid-baseline );
352356}
353357
354- .ranking-unranked {
355- margin-block-end : 12px ;
358+ .ranking-columns {
359+ display : grid ;
360+ grid-template-columns : 1fr 1fr ;
361+ gap : calc (2 * var (--default-grid-baseline ));
362+ align-items : start ;
363+ }
356364
357- & __label {
358- font-weight : bold ;
359- color : var (--color-text-maxcontrast );
360- margin-block-end : 8px ;
365+ .ranking-column__label {
366+ color : var (--color-text-maxcontrast );
367+ margin-block-end : var (--default-grid-baseline );
368+ font-size : small ;
369+ }
370+
371+ .ranking-unranked {
372+ & __pool {
373+ display : flex ;
374+ flex-direction : column ;
375+ gap : var (--default-grid-baseline );
361376 }
362377
363378 & __item {
364- display : inline-block ;
365- padding : 8px 16px ;
366- margin : 0 8px 8px 0 ;
379+ display : block ;
380+ width : 100% ;
381+ padding : var (--default-grid-baseline ) calc (2 * var (--default-grid-baseline ));
382+ min-height : var (--default-clickable-area );
383+ line-height : calc (
384+ var (--default-clickable-area ) - 2 * var (--default-grid-baseline )
385+ );
367386 background-color : var (--color-background-dark );
368387 border : 1px solid var (--color-border );
369388 border-radius : var (--border-radius-large );
370389 cursor : pointer ;
371390 font-size : inherit ;
372391 color : var (--color-main-text );
392+ text-align : start ;
373393 transition : background-color var (--animation-quick );
374394
375395 & :hover ,
@@ -378,27 +398,33 @@ export default {
378398 border-color : var (--color-primary-element );
379399 }
380400 }
381- }
382401
383- .ranking-empty {
384- color : var (--color-text-maxcontrast );
385- font-style : italic ;
386- padding : 12px 0 ;
402+ & __empty {
403+ color : var (--color-text-maxcontrast );
404+ font-style : italic ;
405+ padding : var (--default-grid-baseline ) 0 ;
406+ }
387407}
388408
389- .ranking-ranked__label {
390- font-weight : bold ;
391- color : var (--color-text-maxcontrast );
392- margin-block-end : 4px ;
409+ .ranking-ranked {
410+ & __list {
411+ display : flex ;
412+ flex-direction : column ;
413+ gap : var (--default-grid-baseline );
414+ }
415+
416+ & __empty {
417+ color : var (--color-text-maxcontrast );
418+ font-style : italic ;
419+ padding : var (--default-grid-baseline ) 0 ;
420+ }
393421}
394422
395423.ranking-item {
396424 display : flex ;
397425 align-items : center ;
398- gap : 12px ;
399- padding : 12px 16px ;
400- min-height : 44px ;
401- margin-block-end : 8px ;
426+ gap : var (--default-grid-baseline );
427+ min-height : var (--default-clickable-area );
402428 background-color : var (--color-background-dark );
403429 border-radius : var (--border-radius-large );
404430 user-select : none ;
@@ -414,12 +440,6 @@ export default {
414440 flex : 1 ;
415441 }
416442
417- & __actions {
418- display : flex ;
419- gap : var (--default-grid-baseline );
420- margin-inline-start : auto ;
421- }
422-
423443 & __drag-handle {
424444 color : var (--color-text-maxcontrast );
425445 cursor : grab ;
@@ -445,7 +465,7 @@ export default {
445465.options-list-transition-enter-from ,
446466.options-list-transition-leave-to {
447467 opacity : 0 ;
448- transform : translateX (44 px );
468+ transform : translateX (var ( --default-clickable-area ) );
449469}
450470
451471.options-list-transition-leave-active {
0 commit comments