@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfasim-ui/components",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "Vue 3 UI components for cfasim-ui",
6
6
  "license": "Apache-2.0",
@@ -8,7 +8,7 @@ import {
8
8
  const open = defineModel<boolean>("open", { default: false });
9
9
 
10
10
  defineProps<{
11
- label: string;
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";