11<script setup lang="ts">
22import { computed , ref , useId } from ' vue'
3+ import { CheckBox } from ' @munet/ui'
34import { locale } from ' @/locales'
45import type { ManifestSection , ModConfigSection } from ' @/client/mod'
56import ModEntry from ' ./ModEntry.vue'
@@ -13,64 +14,74 @@ const props = defineProps<{
1314const language = computed (() => locale .value .startsWith (' zh' ) ? ' zh' : ' en' )
1415const label = computed (() => props .section .label ?.[language .value ] || props .section .id )
1516const description = computed (() => props .section .description ?.[language .value ] || ' ' )
16- const entries = computed (() => props .section .entries ?.filter (entry => ! entry .hidden ) ?? [])
17+ const entries = computed (() => props .section .entries ?.filter (entry =>
18+ ! entry .hidden && entry .key .replaceAll (' _' , ' ' ).toLowerCase () !== ' enable' ) ?? [])
1719const basicEntries = computed (() => entries .value .filter (entry => ! entry .advanced ))
1820const advancedEntries = computed (() => entries .value .filter (entry => entry .advanced ))
1921const advancedExpanded = ref (false )
2022const advancedOpen = computed (() => props .revealAdvanced || advancedExpanded .value )
2123const advancedContentId = ` advanced-${useId ()} `
24+ const enabled = computed ({
25+ get : () => props .section .always_enabled ? true : props .state .enabled ,
26+ set : value => { props .state .enabled = props .section .always_enabled ? true : value },
27+ })
2228 </script >
2329
2430<template >
25- <div class =" mod-section" >
31+ <div class =" mod-section" :class = " { 'section-disabled': !enabled, 'always-enabled': section.always_enabled } " >
2632 <div class =" section-header" >
27- <div class =" section-label" >{{ label }}</div >
33+ <CheckBox v-if =" ! section .always_enabled " v-model :value =" enabled " class="section-switch">
34+ <span class =" section-label" >{{ label }}</span >
35+ </CheckBox >
36+ <div v-else class =" section-label" >{{ label }}</div >
2837 <div v-if =" description" class =" text-sm op-80 min-w-0" >{{ description }}</div >
2938 </div >
3039
31- <div v-if =" basicEntries.length" class =" flex flex-col gap-2 mt-2" >
32- <ModEntry
33- v-for =" entry in basicEntries "
34- :key =" entry .key "
35- :entry =" entry "
36- :section-state =" state "
37- />
38- </div >
39-
40- <template v-if =" advancedEntries .length " >
41- <button
42- v-if =" !revealAdvanced"
43- type =" button"
44- class =" advanced-toggle"
45- :aria-expanded =" advancedOpen"
46- :aria-controls =" advancedContentId"
47- @click =" advancedExpanded = !advancedExpanded"
48- >
49- <span
50- class =" i-mdi-chevron-down advanced-chevron"
51- :class =" { expanded: advancedOpen }"
52- aria-hidden =" true"
53- />
54- <span >{{ $t('mods.advancedOptions') }}</span >
55- <span class =" op-55" >{{ advancedEntries.length }}</span >
56- </button >
57- <div v-else class =" advanced-label" >
58- <span class =" i-mdi-tune-variant text-4" aria-hidden =" true" />
59- <span >{{ $t('mods.advancedOptions') }}</span >
60- </div >
61- <div
62- v-show =" advancedOpen"
63- :id =" advancedContentId"
64- class =" flex flex-col gap-2 mt-2"
65- >
40+ <div class =" section-options" >
41+ <div v-if =" basicEntries.length" class =" flex flex-col gap-2 mt-2" >
6642 <ModEntry
67- v-for =" entry in advancedEntries "
43+ v-for =" entry in basicEntries "
6844 :key =" entry .key "
6945 :entry =" entry "
7046 :section-state =" state "
7147 />
7248 </div >
73- </template >
49+
50+ <template v-if =" advancedEntries .length " >
51+ <button
52+ v-if =" !revealAdvanced"
53+ type =" button"
54+ class =" advanced-toggle"
55+ :aria-expanded =" advancedOpen"
56+ :aria-controls =" advancedContentId"
57+ @click =" advancedExpanded = !advancedExpanded"
58+ >
59+ <span
60+ class =" i-mdi-chevron-down advanced-chevron"
61+ :class =" { expanded: advancedOpen }"
62+ aria-hidden =" true"
63+ />
64+ <span >{{ $t('mods.advancedOptions') }}</span >
65+ <span class =" op-55" >{{ advancedEntries.length }}</span >
66+ </button >
67+ <div v-else class =" advanced-label" >
68+ <span class =" i-mdi-tune-variant text-4" aria-hidden =" true" />
69+ <span >{{ $t('mods.advancedOptions') }}</span >
70+ </div >
71+ <div
72+ v-show =" advancedOpen"
73+ :id =" advancedContentId"
74+ class =" flex flex-col gap-2 mt-2"
75+ >
76+ <ModEntry
77+ v-for =" entry in advancedEntries "
78+ :key =" entry .key "
79+ :entry =" entry "
80+ :section-state =" state "
81+ />
82+ </div >
83+ </template >
84+ </div >
7485 </div >
7586</template >
7687
@@ -86,6 +97,15 @@ const advancedContentId = `advanced-${useId()}`
8697 & :hover
8798 border-color : oklch(0.68 0.17 var(-- hue) / 0.45 )
8899
100+ & .always-enabled
101+ background : oklch(0.68 0.17 var(-- hue) / 0.05 )
102+
103+ & .section-disabled .section-options
104+ opacity : 0.48
105+
106+ .section-options
107+ transition : opacity 0.2s ease
108+
89109.section-header
90110 display : grid
91111 grid-template-columns : min max(8rem , 12rem ) min max(0 , 1fr )
@@ -97,6 +117,9 @@ const advancedContentId = `advanced-${useId()}`
97117 font-size : 1rem
98118 overflow-wrap : anywhere
99119
120+ .section-switch
121+ min-width : 0
122+
100123.advanced-toggle ,
101124.advanced-label
102125 display : flex
0 commit comments