diff --git a/client/src/components/main/home/HomeText.spec.ts b/client/src/components/main/home/HomeText.spec.ts index a63121f..463dc3e 100644 --- a/client/src/components/main/home/HomeText.spec.ts +++ b/client/src/components/main/home/HomeText.spec.ts @@ -9,8 +9,9 @@ import _ from 'lodash'; import { ExistingDomWrapper } from '@/types/tests'; import { buildCreateWrapper, getTestingSelector } from '@/utils/test'; import { MockInstance } from 'vitest'; +import HomeTextCursor from '@/components/main/home/HomeTextCursor.vue'; -const CURSOR_SELECTOR = getTestingSelector('cursor'); +const LOCALES_SELECTOR = getTestingSelector('locales'); const MARKED_TEXT_SELECTOR = getTestingSelector('marked-text'); const NON_MARKED_TEXT_SELECTOR = getTestingSelector('non-marked-text'); const PROGRAMMING_LANGUAGE_SELECTOR = getTestingSelector('programming-language'); @@ -111,6 +112,17 @@ describe('HomeText', () => { } } + describe('structure', () => { + it('displays correct structure', () => { + const wrapper = createWrapper(); + + expect(wrapper.find(LOCALES_SELECTOR).exists()).toBe(true); + expect(wrapper.find(NON_MARKED_TEXT_SELECTOR).exists()).toBe(true); + expect(wrapper.find(MARKED_TEXT_SELECTOR).exists()).toBe(true); + expect(wrapper.findComponent(HomeTextCursor).exists()).toBe(true); + }); + }); + describe('site language change', () => { it("instantly toggles 'an' prefix", async () => { function expectLanguageToBePrefixed(languageElement: ExistingDomWrapper, value: boolean): void { @@ -180,21 +192,15 @@ describe('HomeText', () => { }); describe('cursor', () => { - function getCursorElement(wrapper: VueWrapper) { - return wrapper.get(CURSOR_SELECTOR); - } - it('stops blinking on text removing', async () => { const wrapper = createWrapper(); const markedTextElement = getMarkedTextElement(wrapper); - const cursorElement = getCursorElement(wrapper); - await awaitLanguageMarkingStart(markedTextElement); await awaitTextRemovingStart(markedTextElement); - expect(cursorElement.classes()).not.toContain('blinking'); + expect(wrapper.findComponent(HomeTextCursor).props('blinking')).toBe(false); }); it('stops blinking on text writing', async () => { @@ -202,13 +208,11 @@ describe('HomeText', () => { const markedTextElement = getMarkedTextElement(wrapper); - const cursorElement = getCursorElement(wrapper); - await awaitLanguageMarkingStart(markedTextElement); await awaitTextRemovingStart(markedTextElement); await awaitNewLanguageWritingStart(markedTextElement); - expect(cursorElement.classes()).not.toContain('blinking'); + expect(wrapper.findComponent(HomeTextCursor).props('blinking')).toBe(false); }); it('stops blinking on text marking', async () => { @@ -216,11 +220,9 @@ describe('HomeText', () => { const markedTextElement = getMarkedTextElement(wrapper); - const cursorElement = getCursorElement(wrapper); - await awaitLanguageMarkingStart(markedTextElement); - expect(cursorElement.classes()).not.toContain('blinking'); + expect(wrapper.findComponent(HomeTextCursor).props('blinking')).toBe(false); }); it('starts blinking on written text idle', async () => { @@ -229,15 +231,13 @@ describe('HomeText', () => { const markedTextElement = getMarkedTextElement(wrapper); const nonMarkedTextElement = getNonMarkedTextElement(wrapper); - const cursorElement = getCursorElement(wrapper); - - expect(cursorElement.classes()).toContain('blinking'); + expect(wrapper.findComponent(HomeTextCursor).props('blinking')).toBe(true); await awaitLanguageMarkingStart(markedTextElement); await awaitTextRemovingStart(markedTextElement); await awaitNewLanguageWritingEnd(nonMarkedTextElement); - expect(cursorElement.classes()).not.toContain('blinking'); + expect(wrapper.findComponent(HomeTextCursor).props('blinking')).toBe(false); }); }); }); diff --git a/client/src/components/main/home/HomeText.vue b/client/src/components/main/home/HomeText.vue index 580e984..69b2ee4 100644 --- a/client/src/components/main/home/HomeText.vue +++ b/client/src/components/main/home/HomeText.vue @@ -18,13 +18,9 @@ - + {{ ' ' }} - {{ locales.developer }}. + {{ locales.developer }}.

@@ -37,6 +33,7 @@ import HomeTextProgrammingLanguage from '@/components/main/home/HomeTextProgrammingLanguage.vue'; import { ProgrammingLanguage } from '@/store/ProgrammingLanguage'; import { SiteLanguage } from '@/store/types'; + import HomeTextCursor from '@/components/main/home/HomeTextCursor.vue'; const store = useStore(); @@ -252,25 +249,4 @@ font-size: 9vw; } } - - .home-text-cursor { - background-color: currentColor; - display: inline-flex; - height: var(--home-text-line-height); - width: 2px; - - &.blinking { - animation: blinking 1.06s infinite step-end; - } - - @keyframes blinking { - 0% { - opacity: 1; - } - - 50% { - opacity: 0; - } - } - } diff --git a/client/src/components/main/home/HomeTextCursor.spec.ts b/client/src/components/main/home/HomeTextCursor.spec.ts new file mode 100644 index 0000000..04c7878 --- /dev/null +++ b/client/src/components/main/home/HomeTextCursor.spec.ts @@ -0,0 +1,25 @@ +import { VueWrapper } from '@vue/test-utils'; +import { buildCreateWrapper, getTestingSelector } from '@/utils/test'; +import HomeTextCursor from '@/components/main/home/HomeTextCursor.vue'; + +const CURSOR_SELECTOR = getTestingSelector('cursor'); + +const createWrapper = buildCreateWrapper(HomeTextCursor); + +describe('HomeTextCursor', () => { + function getCursorElement(wrapper: VueWrapper) { + return wrapper.get(CURSOR_SELECTOR); + } + + it("blinks by the 'blinking' property", async () => { + const wrapper = createWrapper({ + blinking: false, + }); + + expect(getCursorElement(wrapper).classes('animate-blinking')).toBe(false); + + await wrapper.setProps({ blinking: true }); + + expect(getCursorElement(wrapper).classes('animate-blinking')).toBe(true); + }); +}); diff --git a/client/src/components/main/home/HomeTextCursor.vue b/client/src/components/main/home/HomeTextCursor.vue new file mode 100644 index 0000000..deb319b --- /dev/null +++ b/client/src/components/main/home/HomeTextCursor.vue @@ -0,0 +1,13 @@ + + + diff --git a/client/tailwind.config.ts b/client/tailwind.config.ts index f7b6bd8..f73766d 100644 --- a/client/tailwind.config.ts +++ b/client/tailwind.config.ts @@ -4,6 +4,9 @@ const config: Config = { content: ['./index.html', './src/**/*.{js,ts,jsx,tsx,vue}'], theme: { extend: { + animation: { + blinking: 'blinking 1.06s infinite step-end', + }, colors: { 'error-bg': '#3e2d2d', 'error-text': '#cc0000', @@ -13,6 +16,16 @@ const config: Config = { fontFamily: { contact: 'Montserrat, sans-serif', }, + keyframes: { + blinking: { + '0%': { + opacity: '1', + }, + '50%': { + opacity: '0', + }, + }, + }, spacing: { label: '6rem', },