๐Ÿ“ฆ directus / website

๐Ÿ“„ ThemeProvider.vue ยท 117 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117<script lang="ts" setup>
export interface ThemeProviderProps {
	variant?: 'light' | 'dark' | null;
	on?: 'background' | 'colorful';
}

const props = withDefaults(defineProps<ThemeProviderProps>(), {
	on: 'background',
});

const { variant } = toRefs(props);

const parentTheme = inject('theme', null);

const currentTheme = computed(() => unref(variant) ?? unref(parentTheme));

provide('theme', currentTheme);
</script>

<template>
	<div v-if="variant" class="theme-provider" :class="[variant, `on-${on}`]"><slot /></div>
	<slot v-else />
</template>

<style lang="scss" scoped>
.theme-provider {
	color: var(--foreground);
}

.light {
	--primary: var(--primary-400);
	--secondary: #fe97dc;
	--danger: #dd3f53;
	--background: var(--white);
	--foreground: var(--black);

	--primary-50: #f0ecff;
	--primary-100: #d1c7ff;
	--primary-200: #a38fff;
	--primary-300: #7557ff;
	--primary-400: #6644ff;
	--primary-500: #5c3de6;
	--primary-600: #4730b3;
	--primary-700: #332280;
	--primary-800: #1f144c;
	--primary-900: #0a0719;

	--white: #ffffff;
	--gray-50: #f8fafc;
	--gray-100: #f1f5f9;
	--gray-200: #e2e8f0;
	--gray-300: #cbd5e1;
	--gray-400: #94a3b8;
	--gray-500: #64748b;
	--gray-600: #475569;
	--gray-700: #334155;
	--gray-800: #1e293b;
	--gray-900: #0f172a;
	--black: #0e1c2f;

	--shadow-base:
		0px 30px 30px -30px rgba(30, 41, 59, 0.1), 0px 2px 4px 0px rgba(30, 41, 59, 0.05),
		0px -2px 5px 0px rgba(30, 41, 59, 0.05);
	--shadow-lg: 0px 10px 40px -10px rgba(14, 28, 47, 0.25), 0px 2px 4px 0px rgba(14, 28, 47, 0.05);

	&.on-colorful {
		--gray-50: #f2eaf0;
		--gray-100: #f6e9f2;
		--gray-200: #efd6e7;
		--gray-300: #d3b2c8;
		--gray-400: #b796ac;
		--gray-500: #8f647f;
		--gray-600: #7f526d;
		--gray-700: #6f415a;
		--gray-800: #51283a;
		--gray-900: #331621;
	}
}

.dark {
	--primary: var(--primary-700);
	--secondary: #fe97dc;
	--danger: #dd3f53;
	--background: var(--gray-50);
	--foreground: var(--white);

	--primary-50: #0a0719;
	--primary-100: #1f144c;
	--primary-200: #332280;
	--primary-300: #4730b3;
	--primary-400: #5c3de6;
	--primary-500: #6644ff;
	--primary-600: #7557ff;
	--primary-700: #a38fff;
	--primary-800: #d1c7ff;
	--primary-900: #f0ecff;

	--black: #0e1c2f;
	--gray-50: #0f172a;
	--gray-100: #1e293b;
	--gray-200: #334155;
	--gray-300: #475569;
	--gray-400: #64748b;
	--gray-500: #94a3b8;
	--gray-600: #cbd5e1;
	--gray-700: #e2e8f0;
	--gray-800: #f1f5f9;
	--gray-900: #f8fafc;
	--white: #ffffff;

	--shadow-base:
		0px 30px 30px -30px rgba(30, 41, 59, 0.1), 0px 2px 4px 0px rgba(30, 41, 59, 0.05),
		0px -2px 5px 0px rgba(30, 41, 59, 0.05);
	--shadow-lg: 0px 10px 40px -10px rgba(14, 28, 47, 0.25), 0px 2px 4px 0px rgba(14, 28, 47, 0.05);
}
</style>