Skip to content

Commit 84b65b6

Browse files
committed
feat: Enable disabling ligatures in code
1 parent 0164064 commit 84b65b6

File tree

7 files changed

+86
-2
lines changed

7 files changed

+86
-2
lines changed

app/assets/main.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,11 @@ html.light .shiki {
287287
}
288288
}
289289

290+
/* Settings-based configuration for code ligatures. On by default. */
291+
:root[data-code-ligatures='false'] code {
292+
font-variant-ligatures: none;
293+
}
294+
290295
/* Inline code in package descriptions */
291296
p > span > code,
292297
.line-clamp-2 code {

app/composables/useSettings.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ export interface AppSettings {
3939
autoOpenURL: boolean
4040
}
4141
codeContainerFull: boolean
42+
/** Enable/disable ligatures in code */
43+
codeLigatures: boolean
4244
sidebar: {
4345
collapsed: string[]
4446
}
@@ -65,6 +67,7 @@ const DEFAULT_SETTINGS: AppSettings = {
6567
autoOpenURL: false,
6668
},
6769
codeContainerFull: false,
70+
codeLigatures: true,
6871
sidebar: {
6972
collapsed: [],
7073
},
@@ -253,3 +256,33 @@ export function useCodeContainer() {
253256
toggleCodeContainer,
254257
}
255258
}
259+
260+
export function useCodeLigatures() {
261+
const { settings } = useSettings()
262+
263+
const codeLigatures = computed(() => settings.value.codeLigatures)
264+
265+
if (import.meta.client) {
266+
// Sync the data attribute on root to the setting
267+
watch(
268+
codeLigatures,
269+
value => {
270+
if (value) {
271+
delete document.documentElement.dataset.codeLigatures
272+
} else {
273+
document.documentElement.dataset.codeLigatures = 'false'
274+
}
275+
},
276+
{ immediate: true },
277+
)
278+
}
279+
280+
function toggleCodeLigatures() {
281+
settings.value.codeLigatures = !settings.value.codeLigatures
282+
}
283+
284+
return {
285+
codeLigatures,
286+
toggleCodeLigatures,
287+
}
288+
}

app/pages/settings.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const { locale: currentLocale, locales, setLocale: setNuxti18nLocale } = useI18n
55
const colorMode = useColorMode()
66
const { currentLocaleStatus, isSourceLocale } = useI18nStatus()
77
const keyboardShortcutsEnabled = useKeyboardShortcuts()
8+
const { toggleCodeLigatures } = useCodeLigatures()
89
910
// Escape to go back (but not when focused on form elements or modal is open)
1011
onKeyStroke(
@@ -143,6 +144,16 @@ const setLocale: typeof setNuxti18nLocale = newLocale => {
143144
:description="$t('settings.enable_graph_pulse_loop_description')"
144145
v-model="settings.enableGraphPulseLooping"
145146
/>
147+
148+
<!-- Divider -->
149+
<div class="border-t border-border my-4" />
150+
151+
<!-- Code ligatures toggle -->
152+
<SettingsToggle
153+
:label="$t('settings.enable_code_ligatures')"
154+
:modelValue="settings.codeLigatures"
155+
@update:modelValue="() => toggleCodeLigatures()"
156+
/>
146157
</div>
147158
</section>
148159

app/utils/prehydrate.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,10 @@ export function initPreferencesOnPrehydrate() {
6666
if (settings.keyboardShortcuts === false) {
6767
document.documentElement.dataset.kbdShortcuts = 'false'
6868
}
69+
70+
// Code font ligatures (default: true)
71+
if (settings.codeLigatures === false) {
72+
document.documentElement.dataset.codeLigatures = 'false'
73+
}
6974
})
7075
}

i18n/locales/cs-CZ.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,8 @@
280280
"black": "Černá"
281281
},
282282
"keyboard_shortcuts_enabled": "Povolit klávesové zkratky",
283-
"keyboard_shortcuts_enabled_description": "Klávesové zkratky lze zakázat, pokud se střetávají s jinými zkratkami prohlížeče nebo systému"
283+
"keyboard_shortcuts_enabled_description": "Klávesové zkratky lze zakázat, pokud se střetávají s jinými zkratkami prohlížeče nebo systému",
284+
"enable_code_ligatures": "Zapnout ligatury v kódu"
284285
},
285286
"i18n": {
286287
"missing_keys": "{count} chybějící překlad | {count} chybějící překlady | {count} chybějících překladů",

i18n/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,8 @@
280280
"black": "Black"
281281
},
282282
"keyboard_shortcuts_enabled": "Enable keyboard shortcuts",
283-
"keyboard_shortcuts_enabled_description": "Keyboard shortcuts can be disabled if they conflict with other browser or system shortcuts"
283+
"keyboard_shortcuts_enabled_description": "Keyboard shortcuts can be disabled if they conflict with other browser or system shortcuts",
284+
"enable_code_ligatures": "Enable ligatures in code"
284285
},
285286
"i18n": {
286287
"missing_keys": "{count} missing translation | {count} missing translations",

test/nuxt/composables/use-settings.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,31 @@ describe('useSettings - keyboardShortcuts', () => {
4646
})
4747
})
4848
})
49+
50+
describe('useSettings - codeLigatures', () => {
51+
beforeEach(() => {
52+
vi.resetModules()
53+
})
54+
55+
it('has a default value of true', async () => {
56+
const { useSettings } = await import('~/composables/useSettings')
57+
const codeLigatures = useSettings().settings.value.codeLigatures
58+
expect(codeLigatures).toBe(true)
59+
})
60+
61+
describe('useCodeLigatures', () => {
62+
it('has a default value of true', async () => {
63+
const { useCodeLigatures } = await import('~/composables/useSettings')
64+
const codeLigatures = useCodeLigatures().codeLigatures
65+
expect(codeLigatures.value).toBe(true)
66+
})
67+
68+
it('updates after toggle', async () => {
69+
const { useCodeLigatures } = await import('~/composables/useSettings')
70+
const { codeLigatures, toggleCodeLigatures } = useCodeLigatures()
71+
expect(codeLigatures.value).toBe(true)
72+
toggleCodeLigatures()
73+
expect(codeLigatures.value).toBe(false)
74+
})
75+
})
76+
})

0 commit comments

Comments
 (0)