@1001-digital/components 2.0.3 → 2.0.5
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 +2 -2
- package/src/base/components/Combobox.vue +17 -7
- package/src/base/components/Dialog.vue +1 -0
- package/src/base/components/Dropdown.vue +80 -78
- package/src/base/components/Popover.vue +2 -0
- package/src/base/components/Toasts.vue +5 -0
- package/src/base/components/Tooltip.vue +29 -27
- package/src/base/utils/time.ts +3 -1
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1001-digital/components",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"vue": "^3.5.0",
|
|
21
|
-
"@1001-digital/styles": "^2.1.
|
|
21
|
+
"@1001-digital/styles": "^2.1.1"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@iconify/vue": "^5.0.0",
|
|
@@ -94,22 +94,32 @@ const props = withDefaults(
|
|
|
94
94
|
)
|
|
95
95
|
|
|
96
96
|
const resolveLabel = (v: any) => {
|
|
97
|
-
|
|
97
|
+
if (v == null) return ''
|
|
98
|
+
const option = props.options.find((o) => o[props.valueKey] === v)
|
|
98
99
|
return option ? String(option[props.labelKey]) : String(v)
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
const resolveDisplayValue = (val: any) => {
|
|
103
|
+
if (val == null) return ''
|
|
104
|
+
if (Array.isArray(val) && val.length === 0) return ''
|
|
102
105
|
if (Array.isArray(val)) return val.map(resolveLabel).join(', ')
|
|
103
106
|
return resolveLabel(val)
|
|
104
107
|
}
|
|
105
108
|
</script>
|
|
106
109
|
|
|
107
110
|
<style scoped>
|
|
111
|
+
/* &:has(> .combobox-root) { */
|
|
112
|
+
/* } */
|
|
113
|
+
|
|
108
114
|
@layer components {
|
|
115
|
+
:global(.form-item:has(> .combobox-root)) {
|
|
116
|
+
inline-size: max-content !important;
|
|
117
|
+
max-inline-size: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
109
120
|
.combobox-root {
|
|
110
121
|
inline-size: 100%;
|
|
111
122
|
}
|
|
112
|
-
|
|
113
123
|
.combobox-anchor {
|
|
114
124
|
display: flex;
|
|
115
125
|
align-items: center;
|
|
@@ -166,7 +176,7 @@ const resolveDisplayValue = (val: any) => {
|
|
|
166
176
|
}
|
|
167
177
|
}
|
|
168
178
|
|
|
169
|
-
.combobox-content {
|
|
179
|
+
:deep(.combobox-content) {
|
|
170
180
|
background: var(--combobox-background);
|
|
171
181
|
border: var(--combobox-border);
|
|
172
182
|
border-radius: var(--combobox-border-radius);
|
|
@@ -198,11 +208,11 @@ const resolveDisplayValue = (val: any) => {
|
|
|
198
208
|
}
|
|
199
209
|
}
|
|
200
210
|
|
|
201
|
-
.combobox-viewport {
|
|
211
|
+
:deep(.combobox-viewport) {
|
|
202
212
|
padding: var(--combobox-padding);
|
|
203
213
|
}
|
|
204
214
|
|
|
205
|
-
.combobox-empty {
|
|
215
|
+
:deep(.combobox-empty) {
|
|
206
216
|
padding: var(--size-2) var(--size-3);
|
|
207
217
|
color: var(--muted);
|
|
208
218
|
font-family: var(--font-family);
|
|
@@ -210,7 +220,7 @@ const resolveDisplayValue = (val: any) => {
|
|
|
210
220
|
user-select: none;
|
|
211
221
|
}
|
|
212
222
|
|
|
213
|
-
.combobox-item {
|
|
223
|
+
:deep(.combobox-item) {
|
|
214
224
|
padding: var(--size-2) var(--size-3);
|
|
215
225
|
border-radius: calc(var(--combobox-border-radius) / 2);
|
|
216
226
|
display: flex;
|
|
@@ -237,7 +247,7 @@ const resolveDisplayValue = (val: any) => {
|
|
|
237
247
|
}
|
|
238
248
|
}
|
|
239
249
|
|
|
240
|
-
.combobox-indicator {
|
|
250
|
+
:deep(.combobox-indicator) {
|
|
241
251
|
color: var(--accent);
|
|
242
252
|
}
|
|
243
253
|
}
|
|
@@ -161,6 +161,7 @@ onBeforeUnmount(() => {
|
|
|
161
161
|
display: flex;
|
|
162
162
|
align-items: center;
|
|
163
163
|
block-size: calc(var(--spacer) * 2);
|
|
164
|
+
background: var(--dialog-header-background);
|
|
164
165
|
box-shadow: var(--border-shadow);
|
|
165
166
|
padding-inline-start: var(--spacer);
|
|
166
167
|
font-family: var(--font-family);
|
|
@@ -73,98 +73,100 @@ const open = defineModel<boolean>('open', { required: true })
|
|
|
73
73
|
|
|
74
74
|
<style scoped>
|
|
75
75
|
@layer components {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
76
|
+
:deep() {
|
|
77
|
+
.dropdown {
|
|
78
|
+
background: var(--dropdown-background);
|
|
79
|
+
color: var(--color);
|
|
80
|
+
border: var(--dropdown-border);
|
|
81
|
+
border-radius: var(--dropdown-border-radius);
|
|
82
|
+
padding: 0;
|
|
83
|
+
font-family: var(--font-family);
|
|
84
|
+
font-size: var(--ui-font-size);
|
|
85
|
+
z-index: var(--z-index-ui);
|
|
86
|
+
min-inline-size: var(--reka-dropdown-menu-trigger-width);
|
|
87
|
+
max-block-size: var(--reka-dropdown-menu-content-available-height);
|
|
88
|
+
transform-origin: var(--reka-dropdown-menu-content-transform-origin);
|
|
89
|
+
|
|
90
|
+
/* Entry/exit animations */
|
|
91
|
+
opacity: 1;
|
|
92
|
+
scale: 1;
|
|
93
|
+
transition:
|
|
94
|
+
opacity var(--speed) ease,
|
|
95
|
+
scale var(--speed) ease;
|
|
96
|
+
|
|
97
|
+
@starting-style {
|
|
98
|
+
opacity: 0;
|
|
99
|
+
scale: 0.95;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
&[data-state='closed'] {
|
|
103
|
+
opacity: 0;
|
|
104
|
+
scale: 0.95;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&:focus {
|
|
108
|
+
outline: none;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.dropdown-arrow {
|
|
112
|
+
fill: var(--dropdown-arrow-fill);
|
|
113
|
+
stroke: var(--border-color);
|
|
114
|
+
}
|
|
99
115
|
}
|
|
100
116
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
117
|
+
.dropdown-items {
|
|
118
|
+
padding: var(--dropdown-padding);
|
|
119
|
+
overflow-y: auto;
|
|
120
|
+
overscroll-behavior: contain;
|
|
104
121
|
}
|
|
105
122
|
|
|
106
|
-
|
|
123
|
+
.dropdown-item {
|
|
124
|
+
padding: var(--size-2) var(--size-3);
|
|
125
|
+
border-radius: calc(var(--dropdown-border-radius) / 2);
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: var(--size-2);
|
|
129
|
+
cursor: pointer;
|
|
107
130
|
outline: none;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
.dropdown-arrow {
|
|
111
|
-
fill: var(--dropdown-arrow-fill);
|
|
112
|
-
stroke: var(--border-color);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
131
|
+
user-select: none;
|
|
115
132
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
overscroll-behavior: contain;
|
|
120
|
-
}
|
|
133
|
+
&[data-highlighted] {
|
|
134
|
+
background: var(--button-background-highlight);
|
|
135
|
+
}
|
|
121
136
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
align-items: center;
|
|
127
|
-
gap: var(--size-2);
|
|
128
|
-
cursor: pointer;
|
|
129
|
-
outline: none;
|
|
130
|
-
user-select: none;
|
|
131
|
-
|
|
132
|
-
&[data-highlighted] {
|
|
133
|
-
background: var(--button-background-highlight);
|
|
137
|
+
&[data-disabled] {
|
|
138
|
+
opacity: 0.5;
|
|
139
|
+
cursor: not-allowed;
|
|
140
|
+
}
|
|
134
141
|
}
|
|
135
142
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
143
|
+
.dropdown-label {
|
|
144
|
+
padding: var(--size-2) var(--size-3);
|
|
145
|
+
color: var(--muted);
|
|
146
|
+
font-weight: 500;
|
|
147
|
+
user-select: none;
|
|
139
148
|
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
.dropdown-label {
|
|
143
|
-
padding: var(--size-2) var(--size-3);
|
|
144
|
-
color: var(--muted);
|
|
145
|
-
font-weight: 500;
|
|
146
|
-
user-select: none;
|
|
147
|
-
}
|
|
148
149
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
.dropdown-separator {
|
|
151
|
+
block-size: 1px;
|
|
152
|
+
background: var(--border-color);
|
|
153
|
+
margin-block: var(--size-1);
|
|
154
|
+
}
|
|
154
155
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
.dropdown-item-indicator {
|
|
157
|
+
display: inline-flex;
|
|
158
|
+
align-items: center;
|
|
159
|
+
justify-content: center;
|
|
160
|
+
}
|
|
160
161
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
.dropdown-sub-trigger {
|
|
163
|
+
justify-content: space-between;
|
|
164
|
+
}
|
|
164
165
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
.dropdown-sub-icon {
|
|
167
|
+
color: var(--muted);
|
|
168
|
+
margin-inline-start: auto;
|
|
169
|
+
}
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
172
|
</style>
|
|
@@ -148,6 +148,7 @@ const onInteractOutside = (e: Event) => {
|
|
|
148
148
|
display: flex;
|
|
149
149
|
align-items: center;
|
|
150
150
|
block-size: calc(var(--spacer) * 2);
|
|
151
|
+
background: var(--popover-header-background);
|
|
151
152
|
border-start-start-radius: var(--popover-border-radius);
|
|
152
153
|
border-start-end-radius: var(--popover-border-radius);
|
|
153
154
|
box-shadow: var(--border-shadow);
|
|
@@ -171,6 +172,7 @@ const onInteractOutside = (e: Event) => {
|
|
|
171
172
|
position: absolute !important;
|
|
172
173
|
top: 0;
|
|
173
174
|
right: 0;
|
|
175
|
+
background: var(--popover-header-background) !important;
|
|
174
176
|
box-shadow: var(--border-shadow) !important;
|
|
175
177
|
border-radius: 0 !important;
|
|
176
178
|
border-start-end-radius: var(--popover-border-radius) !important;
|
|
@@ -171,6 +171,7 @@ const onClose = (id: string) => {
|
|
|
171
171
|
|
|
172
172
|
/* Variants */
|
|
173
173
|
&.info {
|
|
174
|
+
--toast-header-background: var(--toast-info-header-background);
|
|
174
175
|
--border-color: var(--toast-info-border-color);
|
|
175
176
|
color: var(--toast-info-color);
|
|
176
177
|
background: var(--toast-info-background);
|
|
@@ -183,6 +184,7 @@ const onClose = (id: string) => {
|
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
&.success {
|
|
187
|
+
--toast-header-background: var(--toast-success-header-background);
|
|
186
188
|
--border-color: var(--toast-success-border-color);
|
|
187
189
|
color: var(--toast-success-color);
|
|
188
190
|
background: var(--toast-success-background);
|
|
@@ -195,6 +197,7 @@ const onClose = (id: string) => {
|
|
|
195
197
|
}
|
|
196
198
|
|
|
197
199
|
&.error {
|
|
200
|
+
--toast-header-background: var(--toast-error-header-background);
|
|
198
201
|
--border-color: var(--toast-error-border-color);
|
|
199
202
|
color: var(--toast-error-color);
|
|
200
203
|
background: var(--toast-error-background);
|
|
@@ -211,6 +214,7 @@ const onClose = (id: string) => {
|
|
|
211
214
|
align-items: center;
|
|
212
215
|
gap: var(--spacer-sm);
|
|
213
216
|
block-size: calc(var(--spacer) * 2);
|
|
217
|
+
background: var(--toast-header-background);
|
|
214
218
|
box-shadow: var(--border-shadow);
|
|
215
219
|
padding-inline-start: var(--ui-padding-inline);
|
|
216
220
|
padding-right: calc(var(--spacer) * 3);
|
|
@@ -246,6 +250,7 @@ const onClose = (id: string) => {
|
|
|
246
250
|
position: absolute !important;
|
|
247
251
|
top: 0;
|
|
248
252
|
right: 0;
|
|
253
|
+
background: var(--toast-header-background) !important;
|
|
249
254
|
box-shadow: var(--border-shadow) !important;
|
|
250
255
|
border-radius: 0 !important;
|
|
251
256
|
border-start-end-radius: var(--toast-border-radius) !important;
|
|
@@ -66,37 +66,39 @@ const props = withDefaults(
|
|
|
66
66
|
|
|
67
67
|
<style scoped>
|
|
68
68
|
@layer components {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
69
|
+
:deep() {
|
|
70
|
+
.tooltip {
|
|
71
|
+
background: var(--tooltip-background);
|
|
72
|
+
color: var(--color);
|
|
73
|
+
border: var(--tooltip-border);
|
|
74
|
+
border-radius: var(--tooltip-border-radius);
|
|
75
|
+
padding: var(--tooltip-padding);
|
|
76
|
+
font-family: var(--font-family);
|
|
77
|
+
font-size: var(--ui-font-size);
|
|
78
|
+
z-index: var(--z-index-ui);
|
|
79
|
+
transform-origin: var(--reka-tooltip-content-transform-origin);
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
/* Entry/exit animations */
|
|
82
|
+
opacity: 1;
|
|
83
|
+
scale: 1;
|
|
84
|
+
transition:
|
|
85
|
+
opacity var(--speed) ease,
|
|
86
|
+
scale var(--speed) ease;
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
@starting-style {
|
|
89
|
+
opacity: 0;
|
|
90
|
+
scale: 0.95;
|
|
91
|
+
}
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
&[data-state='closed'] {
|
|
94
|
+
opacity: 0;
|
|
95
|
+
scale: 0.95;
|
|
96
|
+
}
|
|
96
97
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
.tooltip-arrow {
|
|
99
|
+
fill: var(--tooltip-arrow-fill);
|
|
100
|
+
stroke: var(--border-color);
|
|
101
|
+
}
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
}
|
package/src/base/utils/time.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { DateTime } from 'luxon'
|
|
2
2
|
|
|
3
|
+
export type UTCDateTime = DateTime<true>
|
|
4
|
+
|
|
3
5
|
export const delay = (ms: number): Promise<void> =>
|
|
4
6
|
new Promise((resolve) => setTimeout(resolve, ms))
|
|
5
7
|
|
|
@@ -7,7 +9,7 @@ export const daysInSeconds = (days: number): number => days * 60 * 60 * 24
|
|
|
7
9
|
|
|
8
10
|
export const nowInSeconds = (): number => Math.floor(Date.now() / 1000)
|
|
9
11
|
|
|
10
|
-
export const asUTCDate = (date: Date | null) =>
|
|
12
|
+
export const asUTCDate = (date: Date | null): UTCDateTime | null =>
|
|
11
13
|
date
|
|
12
14
|
? DateTime.utc(
|
|
13
15
|
date.getFullYear(),
|