feat(портал-мобилка): composable useLayoutTier — ярус телефон/планшет/десктоп

This commit is contained in:
Дмитрий
2026-07-07 17:45:37 +03:00
parent 94cfc7ced6
commit 63eb0a6b84
2 changed files with 58 additions and 0 deletions
@@ -0,0 +1,31 @@
import { computed, type ComputedRef } from 'vue';
import { useDisplay } from 'vuetify';
export type LayoutTier = 'phone' | 'tablet' | 'desktop';
/**
* Единый источник «яруса» экрана для адаптива портала.
* phone < 600px (нижнее меню-вкладки)
* tablet 600..1279px (узкая колонка-иконки / rail)
* desktop >= 1280px (полный сайдбар 232px, как сейчас)
*/
export function useLayoutTier(): {
tier: ComputedRef<LayoutTier>;
isPhone: ComputedRef<boolean>;
isTablet: ComputedRef<boolean>;
isDesktop: ComputedRef<boolean>;
} {
const display = useDisplay();
const tier = computed<LayoutTier>(() => {
const w = display.width.value;
if (w < 600) return 'phone';
if (w < 1280) return 'tablet';
return 'desktop';
});
return {
tier,
isPhone: computed(() => tier.value === 'phone'),
isTablet: computed(() => tier.value === 'tablet'),
isDesktop: computed(() => tier.value === 'desktop'),
};
}
+27
View File
@@ -0,0 +1,27 @@
import { describe, it, expect } from 'vitest';
import { defineComponent } from 'vue';
import { mount } from '@vue/test-utils';
import { createVuetify } from 'vuetify';
import { useLayoutTier } from '../../resources/js/composables/useLayoutTier';
function tierAtWidth(width: number): string {
Object.defineProperty(window, 'innerWidth', { configurable: true, value: width });
window.dispatchEvent(new Event('resize'));
const vuetify = createVuetify();
let captured = '';
const Harness = defineComponent({
setup() {
const { tier } = useLayoutTier();
captured = tier.value;
return () => null;
},
});
mount(Harness, { global: { plugins: [vuetify] } });
return captured;
}
describe('useLayoutTier', () => {
it('телефон при ширине < 600', () => { expect(tierAtWidth(390)).toBe('phone'); });
it('планшет при 600..1279', () => { expect(tierAtWidth(820)).toBe('tablet'); });
it('десктоп при >= 1280', () => { expect(tierAtWidth(1440)).toBe('desktop'); });
});