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',
},