@nightshadeui/core 2.0.0-dev.3

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/src/Tab.vue ADDED
@@ -0,0 +1,113 @@
1
+ <template>
2
+ <div
3
+ class="Tab"
4
+ :class="[
5
+ `Tab-${dir}`,
6
+ `Tab-${orientation}`,
7
+ ]">
8
+ <TabCap
9
+ class="TabCap"
10
+ :dir="dir"
11
+ type="start" />
12
+ <div class="Content">
13
+ <slot>
14
+ <div
15
+ v-if="label"
16
+ class="TabLabel"
17
+ :title="label">
18
+ {{ label }}
19
+ </div>
20
+ </slot>
21
+ </div>
22
+ <TabCap
23
+ class="TabCap"
24
+ :dir="dir"
25
+ type="end" />
26
+ </div>
27
+ </template>
28
+
29
+ <script>
30
+ export default {
31
+
32
+ props: {
33
+ dir: { type: String, default: 'top' },
34
+ label: { type: String },
35
+ },
36
+
37
+ computed: {
38
+
39
+ orientation() {
40
+ return this.dir === 'top' || this.dir === 'bottom' ? 'h' : 'v';
41
+ },
42
+
43
+ },
44
+
45
+ };
46
+ </script>
47
+
48
+ <style scoped>
49
+ .Tab {
50
+ --Tab-size: var(--sp3);
51
+ --Tab-cap-size: var(--sp4);
52
+ --Tab-surface: var(--color-base-1);
53
+ --Tab-color: var(--color-text-0);
54
+ --Tab-shadow-size: 0.5px;
55
+ --Tab-shadow-color: var(--shadow-color-medium);
56
+ --Tab-shadow-offset-x: 0;
57
+ --Tab-shadow-offset-y: 0;
58
+
59
+ display: flex;
60
+ cursor: pointer;
61
+ position: relative;
62
+ filter: drop-shadow(var(--Tab-shadow-offset-x) var(--Tab-shadow-offset-y) var(--Tab-shadow-size) var(--Tab-shadow-color));
63
+ }
64
+
65
+ .TabCap, .Content {
66
+ position: relative;
67
+ z-index: 2;
68
+ }
69
+
70
+ .Content {
71
+ min-width: 0;
72
+ display: flex;
73
+ align-items: center;
74
+ background: var(--Tab-surface);
75
+ color: var(--Tab-color);
76
+ }
77
+
78
+ .TabLabel {
79
+ white-space: nowrap;
80
+ overflow: hidden;
81
+ text-overflow: ellipsis;
82
+ }
83
+
84
+ .Tab-h {
85
+ flex-flow: row;
86
+ height: var(--Tab-size);
87
+ }
88
+
89
+ .Tab-v {
90
+ flex-flow: column;
91
+ width: var(--Tab-size);
92
+ }
93
+
94
+ .Tab-v .Content {
95
+ writing-mode: vertical-lr;
96
+ text-orientation: sideways-right;
97
+ transform: rotate(180deg);
98
+ transform-origin: 50% 50%;
99
+ }
100
+
101
+ .TabCap {
102
+ flex: 0 0 var(--Tab-cap-size);
103
+ fill: var(--Tab-surface);
104
+ }
105
+
106
+ .Tab-h .TabCap {
107
+ width: var(--Tab-cap-size);
108
+ }
109
+
110
+ .Tab-v .TabCap {
111
+ height: var(--Tab-cap-size);
112
+ }
113
+ </style>
package/src/TabCap.vue ADDED
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <svg
3
+ class="TabCap"
4
+ :class="[
5
+ `TabCap-${dir}`,
6
+ `TabCap-${type}`,
7
+ ]"
8
+ viewBox="0 0 32 32"
9
+ preserveAspectRatio="none">
10
+ <path d="M0 32 C 16 32 16 0 32 0 L 32 32 z" />
11
+ </svg>
12
+ </template>
13
+
14
+ <script>
15
+ export default {
16
+
17
+ props: {
18
+ dir: { type: String, default: 'top' },
19
+ type: { type: String, default: 'start' },
20
+ },
21
+
22
+ };
23
+ </script>
24
+
25
+ <style scoped>
26
+ .TabCap {}
27
+
28
+ path {
29
+ transform-origin: 50% 50%;
30
+ stroke: none;
31
+ }
32
+
33
+ .TabCap-top.TabCap-start path { transform: scale(1, 1) }
34
+ .TabCap-top.TabCap-end path { transform: scale(-1, 1) }
35
+ .TabCap-bottom.TabCap-start path { transform: scale(1, -1) }
36
+ .TabCap-bottom.TabCap-end path { transform: scale(-1, -1) }
37
+
38
+ .TabCap-right.TabCap-start path { transform: scale(1, 1) rotate(90deg) }
39
+ .TabCap-right.TabCap-end path { transform: scale(-1, 1) rotate(-90deg) }
40
+ .TabCap-left.TabCap-start path { transform: scale(1, -1) rotate(-90deg) }
41
+ .TabCap-left.TabCap-end path { transform: scale(-1, -1) rotate(90deg) }
42
+ </style>
package/src/Toggle.vue ADDED
@@ -0,0 +1,228 @@
1
+ <template>
2
+ <label
3
+ class="Toggle InputElement"
4
+ :class="[
5
+ `Toggle-${effectiveStyle.kind}`,
6
+ `input-kind-${effectiveStyle.kind}`,
7
+ `Toggle-${effectiveStyle.size}`,
8
+ {
9
+ 'Toggle-active': !!modelValue,
10
+ 'Toggle-outline': effectiveStyle.outline,
11
+ 'Toggle-round': effectiveStyle.round,
12
+ 'Toggle-flat': effectiveStyle.flat,
13
+ 'Toggle-disabled': disabled,
14
+ 'Toggle-force-focus': forceFocus,
15
+ 'Toggle-force-hover': forceHover,
16
+ }
17
+ ]"
18
+ tabindex="0"
19
+ @mouseenter="hover = true"
20
+ @mouseleave="hover = false"
21
+ @focusin="focus = true"
22
+ @focusout="focus = false">
23
+ <input
24
+ type="checkbox"
25
+ :checked="modelValue"
26
+ :disabled="disabled"
27
+ @change="onChange" />
28
+ </label>
29
+ </template>
30
+
31
+ <script>
32
+ export default {
33
+
34
+ props: {
35
+ modelValue: { type: Boolean },
36
+ disabled: { type: Boolean },
37
+ kind: { type: String, default: 'base' },
38
+ activeKind: { type: String },
39
+ size: { type: String, default: 'normal' },
40
+ round: { type: Boolean, default: false },
41
+ flat: { type: Boolean, default: false },
42
+ outline: { type: Boolean, default: false },
43
+ forceFocus: { type: Boolean, default: false },
44
+ forceHover: { type: Boolean, default: false },
45
+ focusOverrides: { type: Object },
46
+ hoverOverrides: { type: Object },
47
+ },
48
+
49
+ emits: [
50
+ 'update:modelValue',
51
+ ],
52
+
53
+ data() {
54
+ return {
55
+ hover: false,
56
+ focus: false,
57
+ };
58
+ },
59
+
60
+ computed: {
61
+
62
+ isActive() {
63
+ return !!this.modelValue;
64
+ },
65
+
66
+ baseStyle() {
67
+ return {
68
+ kind: (this.isActive ? this.activeKind : this.kind) ?? this.kind,
69
+ size: this.size,
70
+ round: this.round,
71
+ outline: this.outline,
72
+ flat: this.flat,
73
+ };
74
+ },
75
+
76
+ effectiveStyle() {
77
+ const {
78
+ baseStyle,
79
+ hoverOverrides = {},
80
+ focusOverrides = {},
81
+ hover,
82
+ focus,
83
+ forceHover,
84
+ forceFocus,
85
+ } = this;
86
+ const style = Object.assign({}, baseStyle);
87
+ if (hover || forceHover) {
88
+ Object.assign(style, hoverOverrides);
89
+ }
90
+ if (focus || forceFocus) {
91
+ Object.assign(style, focusOverrides);
92
+ }
93
+ return style;
94
+ },
95
+
96
+ },
97
+
98
+ methods: {
99
+
100
+ onChange(ev) {
101
+ this.$emit('update:modelValue', ev.target.checked);
102
+ }
103
+
104
+ }
105
+
106
+ };
107
+ </script>
108
+
109
+ <style scoped>
110
+ .Toggle {
111
+ --Toggle-size: var(--input-size);
112
+ --Toggle-width: calc(1.618 * var(--Toggle-size));
113
+ --Toggle-knob-offset: 4px;
114
+ --Toggle-knob-size: calc(var(--Toggle-size) - 2 * var(--Toggle-knob-offset));
115
+ --Toggle-knob-outline-offset: -2px;
116
+ --Toggle-knob-radius: calc(var(--Toggle-border-radius) - 0.5 * var(--Toggle-knob-offset));
117
+
118
+ --Toggle-outline-color: transparent;
119
+
120
+ --Toggle-surface: var(--color-base-200);
121
+ --Toggle-knob-surface: var(--input-text-color);
122
+ --Toggle-knob-surface: light-dark(var(--color-base-0), var(--color-base-800));
123
+
124
+ --Toggle-border-size: 0px;
125
+ --Toggle-border-color: transparent;
126
+ --Toggle-border-radius: var(--border-radius);
127
+
128
+ --Toggle-shadow-color: var(--shadow-color-light);
129
+
130
+ display: block;
131
+ position: relative;
132
+ width: var(--Toggle-width);
133
+ height: var(--Toggle-size);
134
+
135
+ border: var(--Toggle-border-size) solid var(--Toggle-border-color);
136
+ border-radius: var(--Toggle-border-radius);
137
+
138
+ background: var(--Toggle-surface);
139
+ outline: var(--input-outline-size) solid var(--Toggle-outline-color);
140
+ outline-offset: var(--input-outline-offset);
141
+ background-clip: border-box;
142
+
143
+ cursor: pointer;
144
+ user-select: none;
145
+
146
+ box-shadow:
147
+ 0 1px 3px var(--Toggle-shadow-color) inset,
148
+ 0 0 5px -1px var(--Toggle-shadow-color) inset;
149
+
150
+ transition: background-color .3s, border-radius .3s;
151
+ }
152
+
153
+ .Toggle input {
154
+ display: none;
155
+ }
156
+
157
+ .Toggle::before {
158
+ content: '';
159
+ position: absolute;
160
+ top: 50%;
161
+ left: 0;
162
+ width: var(--Toggle-knob-size);
163
+ height: var(--Toggle-knob-size);
164
+ border-radius: var(--Toggle-knob-radius);
165
+ background: var(--Toggle-knob-surface);
166
+ box-shadow: 0 1px 3px var(--Toggle-shadow-color);
167
+
168
+ transform: translate(calc(var(--Toggle-knob-offset) - var(--Toggle-border-size)), -50%);
169
+ transition: transform .3s, border-radius .3s;
170
+ }
171
+
172
+ .Toggle-knob-outline::before {
173
+ outline: var(--input-outline-size) solid var(--Toggle-outline-color);
174
+ outline-offset: var(--input-outline-offset);
175
+ }
176
+
177
+ /* States */
178
+
179
+ .Toggle-disabled {
180
+ cursor: not-allowed;
181
+ opacity: .5;
182
+ }
183
+
184
+ .Toggle:not(:disabled):hover, .Toggle.Toggle-force-hover {
185
+ filter: brightness(.96);
186
+ }
187
+
188
+ .Toggle:not(:disabled):focus, .Toggle.Toggle-force-focus {
189
+ z-index: 10;
190
+ --Toggle-outline-color: var(--input-focus-light-color);
191
+ --Toggle-border-color: var(--input-focus-medium-color);
192
+ }
193
+
194
+ .Toggle-active {
195
+ --Toggle-surface: var(--input-surface-color);
196
+ --Toggle-knob-surface: var(--input-surface-color-text);
197
+ }
198
+
199
+ .Toggle-active::before {
200
+ transform: translate(calc(var(--Toggle-width) - var(--Toggle-knob-size) - var(--Toggle-knob-offset) - var(--Toggle-border-size)), -50%);
201
+ }
202
+
203
+ /* Styles */
204
+
205
+ .Toggle-round {
206
+ --Toggle-border-radius: var(--border-radius-m);
207
+ }
208
+
209
+ .Toggle-outline {
210
+ --Toggle-border-color: var(--input-border-color);
211
+ --Toggle-border-size: var(--input-border-size);
212
+ }
213
+
214
+ .Toggle-flat {
215
+ --Toggle-shadow-color: none;
216
+ box-shadow: none;
217
+ }
218
+
219
+ /* Sizes */
220
+
221
+ .Toggle-small {
222
+ --Toggle-size: var(--input-size-s);
223
+ }
224
+
225
+ .Toggle-large {
226
+ --Toggle-size: var(--input-size-l);
227
+ }
228
+ </style>
package/src/VGroup.vue ADDED
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <component
3
+ :is="tagName"
4
+ class="VGroup"
5
+ :class="[
6
+ `VGroup-align-${align}`,
7
+ `VGroup-justify-${justify}`,
8
+ `VGroup-gap-${gap}`,
9
+ ]">
10
+ <slot />
11
+ </component>
12
+ </template>
13
+
14
+ <script>
15
+ export default {
16
+
17
+ props: {
18
+ tagName: { type: String, default: 'div' },
19
+ align: { type: String, default: 'stretch' },
20
+ justify: { type: String },
21
+ gap: { type: String, default: 'm' },
22
+ }
23
+
24
+ };
25
+ </script>
26
+
27
+ <style scoped>
28
+ .VGroup {
29
+ display: flex;
30
+ flex-flow: column nowrap;
31
+ }
32
+
33
+ .VGroup-align-stretch { align-items: stretch; }
34
+ .VGroup-align-baseline { align-items: baseline; }
35
+ .VGroup-align-center { align-items: center; }
36
+ .VGroup-align-start { align-items: flex-start; }
37
+ .VGroup-align-end { align-items: flex-end; }
38
+
39
+ .VGroup-justify-center { justify-content: center; }
40
+ .VGroup-justify-start { justify-content: flex-start; }
41
+ .VGroup-justify-end { justify-content: flex-end; }
42
+ .VGroup-justify-space-around { justify-content: space-around; }
43
+ .VGroup-justify-space-between { justify-content: space-between; }
44
+
45
+ .VGroup-gap-xxs { gap: var(--sp-xxs) }
46
+ .VGroup-gap-xs { gap: var(--sp-xs) }
47
+ .VGroup-gap-s { gap: var(--sp-s) }
48
+ .VGroup-gap-m { gap: var(--sp-m) }
49
+ .VGroup-gap-l { gap: var(--sp-l) }
50
+ .VGroup-gap-xl { gap: var(--sp-xl) }
51
+ .VGroup-gap-xxl { gap: var(--sp-xxl) }
52
+
53
+ .VGroup-gap-0 { gap: 0 }
54
+ .VGroup-gap-0-25 { gap: var(--sp0-25) }
55
+ .VGroup-gap-0-5 { gap: var(--sp0-5) }
56
+ .VGroup-gap-1 { gap: var(--sp1) }
57
+ .VGroup-gap-1-5 { gap: var(--sp1-5) }
58
+ .VGroup-gap-2 { gap: var(--sp2) }
59
+ .VGroup-gap-2-5 { gap: var(--sp2-5) }
60
+ .VGroup-gap-3 { gap: var(--sp3) }
61
+ .VGroup-gap-4 { gap: var(--sp4) }
62
+ .VGroup-gap-5 { gap: var(--sp5) }
63
+ .VGroup-gap-6 { gap: var(--sp6) }
64
+ .VGroup-gap-7 { gap: var(--sp7) }
65
+ .VGroup-gap-8 { gap: var(--sp8) }
66
+ .VGroup-gap-9 { gap: var(--sp9) }
67
+ .VGroup-gap-10 { gap: var(--sp10) }
68
+ .VGroup-gap-12 { gap: var(--sp12) }
69
+ .VGroup-gap-16 { gap: var(--sp16) }
70
+ .VGroup-gap-24 { gap: var(--sp24) }
71
+ .VGroup-gap-32 { gap: var(--sp32) }
72
+ </style>
package/src/index.ts ADDED
@@ -0,0 +1,27 @@
1
+ import Btn from './Btn.vue';
2
+ import HGroup from './HGroup.vue';
3
+ import InputBase from './InputBase.vue';
4
+ import InputGroup from './InputGroup.vue';
5
+ import InputSelect from './InputSelect.vue';
6
+ import InputText from './InputText.vue';
7
+ import InputTextarea from './InputTextarea.vue';
8
+ import Sizer from './Sizer.vue';
9
+ import Tab from './Tab.vue';
10
+ import TabCap from './TabCap.vue';
11
+ import Toggle from './Toggle.vue';
12
+ import VGroup from './VGroup.vue';
13
+
14
+ export {
15
+ Btn,
16
+ HGroup,
17
+ InputBase,
18
+ InputGroup,
19
+ InputSelect,
20
+ InputText,
21
+ InputTextarea,
22
+ Sizer,
23
+ Tab,
24
+ TabCap,
25
+ Toggle,
26
+ VGroup,
27
+ };
package/src/types.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ declare module '*.vue' {
2
+ import type { DefineComponent } from 'vue';
3
+
4
+ const component: DefineComponent<{}, {}, any>;
5
+ export default component;
6
+ }