@exakt/ui 0.0.34 → 0.0.36

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/dist/module.d.ts CHANGED
@@ -7,6 +7,7 @@ interface ModuleOptions {
7
7
  light?: string;
8
8
  red?: string;
9
9
  blue?: string;
10
+ yellow?: string;
10
11
  };
11
12
  breakpoints: {
12
13
  sm?: string;
package/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "exakt-ui",
3
3
  "configKey": "exakt",
4
- "version": "0.0.34"
4
+ "version": "0.0.36"
5
5
  }
package/dist/module.mjs CHANGED
@@ -7,7 +7,8 @@ const defaults = {
7
7
  dark: "#212121",
8
8
  light: "#ffffff",
9
9
  red: "#f44336",
10
- blue: "#2196f3"
10
+ blue: "#2196f3",
11
+ yellow: "#FFA000"
11
12
  },
12
13
  breakpoints: {
13
14
  sm: "16em",
@@ -14,33 +14,25 @@
14
14
  'my-2': solid,
15
15
  loading,
16
16
  fab,
17
- loadingGradient,
18
17
  colored: background !== 'transparent' || color || solid,
19
18
  }"
20
19
  >
21
- <e-progress-gradient
22
- v-if="loading && loadingGradient"
23
- class="prog-grad"
24
- color="primary"
25
- />
26
-
27
20
  <div
28
21
  ref="content"
29
22
  class="e-btn-content"
30
- :style="contentStyles"
31
23
  >
32
24
  <div
33
- v-if="loading && !loadingGradient"
25
+ v-if="loading"
34
26
  class="load-overlay"
35
27
  >
36
28
  <e-loading-spinner />
37
29
  </div>
38
30
  <span
39
- class="actual-content d-flex"
40
- :class="{ fullwidth: props.justify == 'space-between' }"
31
+ class="actual-content d-flex fullwidth"
41
32
  :style="{
42
- justifyContent:
43
- justify, alignContent: props.align, alignItems: props.align
33
+ justifyContent: justify,
34
+ alignContent: props.align,
35
+ alignItems: props.align,
44
36
  }"
45
37
  >
46
38
  <slot />
@@ -63,7 +55,6 @@ const props = withDefaults(
63
55
  background?: string;
64
56
  block?: boolean;
65
57
  loading?: boolean;
66
- loadingGradient?: boolean;
67
58
  fab?: boolean;
68
59
  disabled?: boolean;
69
60
  align?: string;
@@ -80,15 +71,6 @@ const props = withDefaults(
80
71
  }
81
72
  );
82
73
 
83
-
84
- const contentStyles = computed(() => {
85
- if (props.justify === "space-between") {
86
- return "justify-content:stretch; flex-grow: 1";
87
- }
88
-
89
- return "";
90
- });
91
-
92
74
  function parseColor(input: string) {
93
75
  const div = document.createElement("div");
94
76
  document.body.appendChild(div);
@@ -115,8 +97,8 @@ const textColor = computed(() => {
115
97
  if (props.color) {
116
98
  return props.color;
117
99
  }
118
- if (props.background == 'transparent') {
119
- return 'var(--e-color-dark)'
100
+ if (props.background == "transparent") {
101
+ return "var(--e-color-dark)";
120
102
  }
121
103
  const rgb = backgroundColorRgb.value;
122
104
 
@@ -140,12 +122,6 @@ const hoverColor = computed(() => {
140
122
  });
141
123
  </script>
142
124
  <style lang="scss" scoped>
143
- .prog-grad {
144
- position: absolute;
145
- top: 0;
146
- left: 0;
147
- }
148
-
149
125
  .e-btn-content {
150
126
  transition: transform 0.1s ease-in-out;
151
127
  flex-direction: row;
@@ -153,7 +129,8 @@ const hoverColor = computed(() => {
153
129
  position: relative;
154
130
  align-content: center;
155
131
  align-items: center;
156
- justify-content: center;
132
+ justify-content: stretch;
133
+ flex-grow: 1;
157
134
  }
158
135
 
159
136
  .e-btn {
@@ -162,7 +139,7 @@ const hoverColor = computed(() => {
162
139
  display: flex;
163
140
  font-size: 1rem;
164
141
 
165
- justify-content: center;
142
+ justify-content: stretch;
166
143
  align-content: center;
167
144
  align-items: center;
168
145
  padding: 0.3rem var(--e-core-padding-x);
@@ -190,17 +167,6 @@ const hoverColor = computed(() => {
190
167
  &.loading {
191
168
  pointer-events: none;
192
169
 
193
- &.loadingGradient {
194
- background: rgba(0, 0, 0, 0) !important;
195
- color: var(--e-color-dark) !important;
196
- transition: background 0.8s, color 0.5s, opacity 0.4s;
197
-
198
- .actual-content {
199
- opacity: 0.8;
200
- transition: opacity 0.5s;
201
- }
202
- }
203
-
204
170
  .actual-content {
205
171
  opacity: 0;
206
172
  }
@@ -37,7 +37,7 @@ const emit = defineEmits(["update:modelValue"]);
37
37
  .dialog-wrap {
38
38
  position: fixed;
39
39
  pointer-events: none;
40
- z-index: 4;
40
+ z-index: 6;
41
41
  width: 100%;
42
42
  height: 100%;
43
43
  top: 0px;
@@ -69,7 +69,7 @@ const emit = defineEmits(["update:modelValue"]);
69
69
  .button-bar {
70
70
  display: flex;
71
71
  align-items: stretch;
72
- justify-content: space-between;
72
+ justify-content: flex-end;
73
73
  width: 100%;
74
74
  }
75
75
  </style>
@@ -197,7 +197,7 @@ const onActivatorClick = () => {
197
197
 
198
198
  background-color: var(--e-color-elev-2);
199
199
  color: var(--e-color-dark);
200
- z-index: 4;
200
+ z-index: 6;
201
201
 
202
202
  flex-shrink: 1;
203
203
  flex-direction: column;
@@ -25,7 +25,7 @@ const emit = defineEmits(["update:modelValue"]);
25
25
  height: 100%;
26
26
  left: 0px;
27
27
  top: 0px;
28
- z-index: 3;
28
+ z-index: 5;
29
29
  //background-color: red;
30
30
 
31
31
  &.opaque-on-desktop {
@@ -2,8 +2,8 @@
2
2
  <nuxt-link :to="to">
3
3
  <e-btn
4
4
  :solid="false"
5
- justify="stretch"
6
- block
5
+ justify="start"
6
+ :block="true"
7
7
  background="transparent"
8
8
  class="pa-0 ma-0 e-sidebar-btn"
9
9
  >
@@ -49,9 +49,6 @@ defineProps<{
49
49
  position: relative;
50
50
  }
51
51
  .e-sidebar-btn {
52
- width: 100%;
53
- flex-grow: 0;
54
- flex-shrink: 0;
55
52
  min-height: 5rem;
56
53
  }
57
54
 
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <nuxt-link to="/sidebar">
3
+ <e-btn
4
+ :solid="false"
5
+ justify="center"
6
+ :block="true"
7
+ background="transparent"
8
+ class="pa-0 ma-0 e-sidebar-icon"
9
+ >
10
+ <e-icon
11
+ :icon="mdiHome"
12
+ size="22"
13
+ />
14
+ </e-btn>
15
+ </nuxt-link>
16
+ </template>
17
+ <script lang="ts" setup>
18
+ import { mdiHome } from '@mdi/js';
19
+ </script>
20
+ <style lang="scss">
21
+
22
+ .router-link-active .e-sidebar-icon, .router-link-exact-active .e-sidebar-icon {
23
+ background-color: rgba(var(--e-color-primary-rgb), 0.25);
24
+ }
25
+
26
+ .e-sidebar-icon {
27
+ min-height: 5rem;
28
+ }
29
+ </style>
@@ -1,76 +1,202 @@
1
1
  <template>
2
- <div
3
- class="e-sidebar d-flex flex-column justify-start"
4
- @mouseenter="state.hover = true"
5
- @mouseleave="state.hover = false"
6
- >
7
- <slot />
8
- </div>
9
- <div class="e-sidebar-app-content">
10
- <slot name="app" />
2
+ <div>
3
+ <div class="e-sidebar collapsed d-flex flex-column justify-start">
4
+ <slot name="collapsed" />
5
+
6
+ <nuxt-link
7
+ v-for="(item, i) in props.items"
8
+ :key="i"
9
+ :to="item.to"
10
+ >
11
+ <e-btn
12
+ :solid="false"
13
+ justify="center"
14
+ :block="true"
15
+ background="transparent"
16
+ class="pa-0 ma-0 e-sidebar-btn"
17
+ >
18
+ <e-icon
19
+ :icon="item.icon"
20
+ size="22"
21
+ />
22
+ </e-btn>
23
+ </nuxt-link>
24
+ </div>
25
+ <div class="extended e-sidebar">
26
+ <slot name="extension" />
27
+
28
+ <nuxt-link
29
+ v-for="(item, i) in props.items"
30
+ :key="i"
31
+ :to="item.to"
32
+ >
33
+ <e-btn
34
+ :solid="false"
35
+ justify="start"
36
+ :block="true"
37
+ background="transparent"
38
+ class="pa-0 ma-0 e-sidebar-btn"
39
+ >
40
+ <div
41
+ v-if="item.icon"
42
+ class="icon"
43
+ >
44
+ <e-icon
45
+ :icon="item.icon"
46
+ size="22"
47
+ />
48
+ </div>
49
+ <div class="ml-4 d-flex flex-column text">
50
+ <div :class="{ 'mb-1': item.subtitle }">
51
+ {{ item.title }}
52
+ </div>
53
+ <div
54
+ v-if="item.subtitle"
55
+ class="text-secondary"
56
+ >
57
+ {{ item.subtitle }}
58
+ </div>
59
+ </div>
60
+ </e-btn>
61
+ </nuxt-link>
62
+ </div>
63
+
64
+ <div class="app-content">
65
+ <slot name="app" />
66
+ </div>
11
67
  </div>
12
68
  </template>
13
69
  <script setup lang="ts">
14
- import { reactive } from "#imports";
70
+ import { computed, reactive } from "#imports";
15
71
  const props = withDefaults(
16
72
  defineProps<{
17
73
  collapsedWidth?: number | string;
18
- width?: number | string;
74
+ expandedWidth?: number | string;
75
+ buttonHeight: string;
76
+ items: {
77
+ title: string;
78
+ icon: string;
79
+ subtitle?: string;
80
+ to: string;
81
+ position?: "top" | "bottom";
82
+ }[];
83
+ elev: 1 | 2 | 3 | "1" | "2" | "3";
84
+ moveContent: number;
85
+ nestingLevel: number;
19
86
  }>(),
20
- { width: "3.5rem" }
87
+ {
88
+ collapsedWidth: "3.5rem",
89
+ expandedWidth: "20rem",
90
+ buttonHeight: "3.5rem",
91
+ elev: 2,
92
+ moveContent: 0.5,
93
+ nestingLevel: 0,
94
+ }
21
95
  );
22
96
  const state = reactive({
23
97
  hover: false,
24
98
  });
99
+
100
+ const background = computed(() =>
101
+ Number(props.elev) == 1
102
+ ? "var(--e-color-elev)"
103
+ : `var(--e-color-elev-${props.elev})`
104
+ );
25
105
  </script>
26
106
  <style lang="scss" scoped>
27
107
  .e-sidebar,
28
- .e-sidebar-app-content {
108
+ .app-content {
29
109
  --collapsed-sidebar-width: v-bind(collapsedWidth);
30
- --expanded-sidebar-width: 20rem; //v-bind(width);
31
- --expansion-amount: calc(
32
- var(--expanded-sidebar-width) - var(--collapsed-sidebar-width)
33
- );
34
-
110
+ --expanded-sidebar-width: v-bind(expandedWidth);
111
+ --btn-height: v-bind(buttonHeight);
35
112
 
113
+ --expansion-amount: calc(
114
+ var(--expanded-sidebar-width) - var(--collapsed-sidebar-width)
115
+ );
116
+ --reveal-duration: 0.25s;
36
117
  }
37
118
  .e-sidebar {
38
-
39
- height: 100vh;
40
- width: var(--collapsed-sidebar-width);
41
- z-index: 5;
119
+ height: 100%;
42
120
  position: fixed;
43
121
  left: 0;
44
- top: 0;
45
- background-color: var(--e-color-elev-2);
46
- overflow-x: hidden;
47
- transition: width 0.25s ease-in-out;
122
+
123
+ background-color: v-bind("background");
124
+ overflow: clip;
125
+ top: calc(var(--btn-height) * v-bind("props.nestingLevel"));
48
126
 
127
+ &:hover ~ .app-content {
128
+ transform: translateX(
129
+ calc(var(--expansion-amount) * v-bind("props.moveContent"))
130
+ );
131
+ }
49
132
 
50
- &:hover ~ .e-sidebar-app-content {
133
+ &.collapsed {
134
+ width: var(--collapsed-sidebar-width);
135
+ z-index: 6;
136
+ padding-left: calc(
137
+ var(--collapsed-sidebar-width) * v-bind("props.nestingLevel")
138
+ );
51
139
 
52
- // transform: translateX(var(--expansion-amount));
140
+ &:hover ~ .extended {
141
+ transform: translateX(
142
+ calc(var(--collapsed-sidebar-width) * v-bind("props.nestingLevel"))
143
+ );
144
+ }
53
145
  }
54
- &:hover {
146
+
147
+ &.extended {
148
+ z-index: 5;
55
149
  width: var(--expanded-sidebar-width);
150
+ position: fixed;
151
+ // transform: translateX(calc(-1 * var(--expanded-sidebar-width)));
152
+ transform: translateX(-100%);
153
+ transition: transform var(--reveal-duration) ease-in-out;
56
154
 
155
+ &:hover {
156
+ transform: translateX(
157
+ calc(var(--collapsed-sidebar-width) * v-bind("props.nestingLevel"))
158
+ );
159
+ }
57
160
  }
58
-
59
-
60
161
  }
61
162
 
62
- .e-sidebar-app-content {
63
- transition: transform 0.25s ease-in-out;
163
+ .app-content {
164
+ transition: transform var(--reveal-duration) ease-in-out;
64
165
  background-color: var(--e-color-light);
65
166
  width: 100%;
66
- width: -moz-available; /* WebKit-based browsers will ignore this. */
67
- width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
68
- width: fill-available;
167
+ width: fill-available;
69
168
  height: 100%;
70
- left: 3.5rem;
169
+ left: 0;
170
+ padding-left: var(--collapsed-sidebar-width);
71
171
  top: 0rem;
72
- position: absolute;
172
+ position: absolute;
173
+ transform: translateX(0);
73
174
  }
74
175
 
176
+ .e-sidebar-btn {
177
+ min-height: var(--btn-height);
178
+
179
+ .icon {
180
+ min-width: calc(
181
+ var(--collapsed-sidebar-width) - 0.1rem * 2
182
+ ); // Compensate the btn's accessibility border
75
183
 
184
+ display: block;
185
+ }
186
+
187
+ .text {
188
+ text-align: left;
189
+ max-width: calc(var(--expansion-amount) - 0.1rem * 2);
190
+
191
+ display: block;
192
+ flex-grow: 0;
193
+ flex-shrink: 0;
194
+ position: relative;
195
+ }
196
+ }
197
+
198
+ .router-link-active .e-sidebar-btn,
199
+ .router-link-exact-active .e-sidebar-btn {
200
+ background-color: rgba(var(--e-color-primary-rgb), 0.25);
201
+ }
76
202
  </style>
@@ -0,0 +1,17 @@
1
+
2
+
3
+ <template>
4
+ <div class="titlebar d-flex flex-align-center">
5
+ <h4>Title</h4>
6
+ </div>
7
+ </template>
8
+ <style lang="scss" scoped>
9
+ .titlebar{
10
+ position: sticky;
11
+ top:0;
12
+ left:0;
13
+ height:3.5rem;
14
+ padding-left: 3.5rem;
15
+ background-color: var(--e-color-elev-2);
16
+ }
17
+ </style>
@@ -6,10 +6,12 @@ $root-light-rgb: red($root-light), green($root-light), blue($root-light);
6
6
  $root-primary-rgb: red($root-primary), green($root-primary), blue($root-primary);
7
7
  $root-red-rgb: red($root-red), green($root-red), blue($root-red);
8
8
  $root-blue-rgb: red($root-blue), green($root-blue), blue($root-blue);
9
+ $root-yellow-rgb: red($root-yellow), green($root-yellow), blue($root-yellow);
9
10
 
10
11
  .rounded {
11
12
  border-radius: var(--e-rounded-border-radius);
12
13
  }
14
+
13
15
  .rounded-top {
14
16
  border-top-left-radius: var(--e-rounded-border-radius);
15
17
  border-top-right-radius: var(--e-rounded-border-radius);
@@ -30,15 +32,18 @@ $color-map: (
30
32
  "primary": $root-primary,
31
33
  "dark": $root-dark,
32
34
  "light": $root-light,
35
+ "yellow": $root-yellow,
33
36
  );
34
37
 
35
38
  @each $name, $color in $color-map {
36
39
  :root {
37
40
  #{'--e-color-'+$name}: $color;
38
41
  }
42
+
39
43
  .bg-#{$name} {
40
44
  background: $color;
41
45
  }
46
+
42
47
  .color-#{$name} {
43
48
  color: $color;
44
49
  }
@@ -51,6 +56,7 @@ a,
51
56
  &:visited {
52
57
  color: color.scale($root-blue, $lightness: -10%);
53
58
  }
59
+
54
60
  &:active,
55
61
  .e-link-active {
56
62
  color: color.scale($root-blue, $lightness: 10%);
@@ -59,7 +65,9 @@ a,
59
65
 
60
66
  @mixin elev($source, $lightness) {
61
67
  $root-elev: color.scale($source, $lightness: $lightness);
62
- $root-elev-2: color.scale($source, $lightness: $lightness * 2);
68
+ $root-elev-2: color.scale($source, $lightness: $lightness * 1.5);
69
+ $root-elev-3: color.scale($source, $lightness: $lightness * 2);
70
+
63
71
 
64
72
  --e-color-elev: #{$root-elev};
65
73
  --e-color-elev-rgb: #{red($root-elev), green($root-elev), blue($root-elev)};
@@ -67,6 +75,10 @@ a,
67
75
  --e-color-elev-2: #{$root-elev-2};
68
76
  --e-color-elev-2-rgb: #{red($root-elev-2), green($root-elev-2),
69
77
  blue($root-elev-2)};
78
+
79
+ --e-color-elev-3: #{$root-elev-3};
80
+ --e-color-elev-3-rgb: #{red($root-elev-3), green($root-elev-3),
81
+ blue($root-elev-3)};
70
82
  }
71
83
 
72
84
  :root {
@@ -88,7 +100,7 @@ a,
88
100
 
89
101
  --e-color-dark: #{$root-light};
90
102
  --e-color-dark-rgb: #{$root-light-rgb};
91
- color-scheme: dark;
103
+ color-scheme: dark;
92
104
  @include elev($root-dark, 5%);
93
105
  }
94
106
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exakt/ui",
3
- "version": "0.0.34",
3
+ "version": "0.0.36",
4
4
  "description": "A UI library for Nuxt.js",
5
5
  "license": "MIT",
6
6
  "type": "module",