@cfasim-ui/components 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
const open = defineModel<boolean>("open", { default: false });
|
|
9
9
|
|
|
10
10
|
defineProps<{
|
|
11
|
-
label
|
|
11
|
+
label?: string;
|
|
12
12
|
}>();
|
|
13
13
|
</script>
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ defineProps<{
|
|
|
16
16
|
<CollapsibleRoot v-model:open="open" class="expander">
|
|
17
17
|
<CollapsibleTrigger class="expander-trigger">
|
|
18
18
|
<span class="expander-caret" :class="{ open }" />
|
|
19
|
-
{{ label }}
|
|
19
|
+
<slot name="label">{{ label }}</slot>
|
|
20
20
|
</CollapsibleTrigger>
|
|
21
21
|
<CollapsibleContent class="expander-content">
|
|
22
22
|
<slot />
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref, watch } from "vue";
|
|
3
|
+
import Icon from "../Icon/Icon.vue";
|
|
4
|
+
|
|
5
|
+
const isDark = ref(window.matchMedia("(prefers-color-scheme: dark)").matches);
|
|
6
|
+
|
|
7
|
+
function apply(dark: boolean) {
|
|
8
|
+
document.documentElement.classList.toggle("dark", dark);
|
|
9
|
+
document.documentElement.classList.toggle("light", !dark);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
apply(isDark.value);
|
|
13
|
+
|
|
14
|
+
watch(isDark, apply);
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<button
|
|
19
|
+
class="light-dark-toggle"
|
|
20
|
+
type="button"
|
|
21
|
+
:aria-label="isDark ? 'Switch to light mode' : 'Switch to dark mode'"
|
|
22
|
+
@click="isDark = !isDark"
|
|
23
|
+
>
|
|
24
|
+
<Icon :icon="isDark ? 'dark_mode' : 'light_mode'" size="sm" />
|
|
25
|
+
</button>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<style scoped>
|
|
29
|
+
.light-dark-toggle {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
justify-content: center;
|
|
33
|
+
width: 32px;
|
|
34
|
+
height: 32px;
|
|
35
|
+
border: 1px solid var(--color-border);
|
|
36
|
+
border-radius: 0.25em;
|
|
37
|
+
background: var(--color-bg-0);
|
|
38
|
+
color: var(--color-text-secondary);
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
transition:
|
|
41
|
+
color var(--transition-fast),
|
|
42
|
+
background-color var(--transition-fast);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.light-dark-toggle:hover {
|
|
46
|
+
color: var(--color-text);
|
|
47
|
+
background: var(--color-bg-1);
|
|
48
|
+
}
|
|
49
|
+
</style>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { ref, onMounted, onUnmounted } from "vue";
|
|
3
3
|
import Icon from "../Icon/Icon.vue";
|
|
4
|
+
import LightDarkToggle from "../LightDarkToggle/LightDarkToggle.vue";
|
|
4
5
|
|
|
5
6
|
const mql = window.matchMedia("(max-width: 767px)");
|
|
6
7
|
const isMobile = ref(mql.matches);
|
|
@@ -65,6 +66,11 @@ function toggle() {
|
|
|
65
66
|
</aside>
|
|
66
67
|
</div>
|
|
67
68
|
<main class="Main">
|
|
69
|
+
<div class="Topbar">
|
|
70
|
+
<slot name="topbar">
|
|
71
|
+
<LightDarkToggle />
|
|
72
|
+
</slot>
|
|
73
|
+
</div>
|
|
68
74
|
<div class="MainScroll">
|
|
69
75
|
<div class="MainContent">
|
|
70
76
|
<slot />
|
|
@@ -187,6 +193,20 @@ function toggle() {
|
|
|
187
193
|
font-size: var(--font-size-md);
|
|
188
194
|
}
|
|
189
195
|
|
|
196
|
+
.Topbar {
|
|
197
|
+
display: flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
justify-content: flex-end;
|
|
200
|
+
padding: var(--space-2) var(--space-4);
|
|
201
|
+
flex-shrink: 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
@media (min-width: 768px) {
|
|
205
|
+
.Topbar {
|
|
206
|
+
padding: var(--space-2) var(--space-4) var(--space-2) var(--space-20);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
190
210
|
.MainScroll {
|
|
191
211
|
flex: 1;
|
|
192
212
|
min-height: 0;
|
|
@@ -212,7 +232,7 @@ function toggle() {
|
|
|
212
232
|
|
|
213
233
|
@media (min-width: 768px) {
|
|
214
234
|
.MainContent {
|
|
215
|
-
padding: 0 var(--space-20);
|
|
235
|
+
padding: 0 var(--space-4) 0 var(--space-20);
|
|
216
236
|
}
|
|
217
237
|
}
|
|
218
238
|
|
package/src/index.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { default as Button } from "./Button/Button.vue";
|
|
|
4
4
|
export { default as Expander } from "./Expander/Expander.vue";
|
|
5
5
|
export { default as Hint } from "./Hint/Hint.vue";
|
|
6
6
|
export { default as Icon } from "./Icon/Icon.vue";
|
|
7
|
+
export { default as LightDarkToggle } from "./LightDarkToggle/LightDarkToggle.vue";
|
|
7
8
|
export { default as NumberInput } from "./NumberInput/NumberInput.vue";
|
|
8
9
|
export { default as SelectBox } from "./SelectBox/SelectBox.vue";
|
|
9
10
|
export type { SelectOption } from "./SelectBox/SelectBox.vue";
|