orio-ui 1.0.1 → 1.0.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/README.md +9 -7
- package/dist/module.cjs +5 -0
- package/dist/module.d.mts +3 -0
- package/dist/module.d.ts +3 -0
- package/dist/module.json +12 -0
- package/dist/module.mjs +24 -0
- package/dist/runtime/assets/css/animation.css +1 -0
- package/dist/runtime/assets/css/colors.css +1 -0
- package/{src/runtime/assets/css/cool-gradient-hover.scss → dist/runtime/assets/css/cool-gradient-hover.css} +4 -14
- package/dist/runtime/assets/css/main.css +1 -0
- package/dist/runtime/assets/css/scroll.css +1 -0
- package/{src → dist}/runtime/components/Button.vue +38 -46
- package/dist/runtime/components/CheckBox.vue +93 -0
- package/{src → dist}/runtime/components/ControlElement.vue +13 -16
- package/{src → dist}/runtime/components/DashedContainer.vue +6 -7
- package/dist/runtime/components/DatePicker.vue +30 -0
- package/{src → dist}/runtime/components/DateRangePicker.vue +14 -15
- package/{src → dist}/runtime/components/EmptyState.vue +22 -28
- package/{src → dist}/runtime/components/Icon.vue +1 -12
- package/{src → dist}/runtime/components/Input.vue +18 -24
- package/{src → dist}/runtime/components/Modal.vue +1 -43
- package/{src → dist}/runtime/components/Popover.vue +1 -1
- package/{src → dist}/runtime/components/Selector.vue +36 -52
- package/dist/runtime/components/Tag.vue +21 -0
- package/{src → dist}/runtime/components/Textarea.vue +18 -24
- package/{src → dist}/runtime/components/view/Dates.vue +1 -3
- package/{src → dist}/runtime/components/view/Separator.vue +1 -5
- package/{src → dist}/runtime/components/view/Text.vue +38 -42
- package/dist/runtime/composables/index.d.ts +4 -0
- package/dist/runtime/composables/index.js +6 -0
- package/dist/runtime/composables/useApi.d.ts +10 -0
- package/dist/runtime/composables/useApi.js +9 -0
- package/dist/runtime/composables/useFuzzySearch.d.ts +10 -0
- package/dist/runtime/composables/useFuzzySearch.js +22 -0
- package/dist/runtime/composables/useModal.d.ts +15 -0
- package/dist/runtime/composables/useModal.js +28 -0
- package/dist/runtime/composables/useTheme.d.ts +6 -0
- package/dist/runtime/composables/useTheme.js +23 -0
- package/dist/runtime/index.d.ts +20 -0
- package/dist/runtime/index.js +20 -0
- package/dist/runtime/utils/icon-registry.d.ts +2 -0
- package/{src/runtime/utils/icon-registry.ts → dist/runtime/utils/icon-registry.js} +5 -20
- package/dist/types.d.mts +7 -0
- package/dist/types.d.ts +7 -0
- package/package.json +11 -15
- package/nuxt.config.ts +0 -38
- package/src/module.ts +0 -16
- package/src/runtime/assets/css/animation.css +0 -88
- package/src/runtime/assets/css/colors.css +0 -142
- package/src/runtime/assets/css/main.css +0 -11
- package/src/runtime/assets/css/scroll.css +0 -46
- package/src/runtime/components/CheckBox.vue +0 -103
- package/src/runtime/components/DatePicker.vue +0 -84
- package/src/runtime/components/Tag.vue +0 -49
- package/src/runtime/composables/index.ts +0 -9
- package/src/runtime/composables/useApi.ts +0 -32
- package/src/runtime/composables/useFuzzySearch.ts +0 -51
- package/src/runtime/composables/useModal.ts +0 -47
- package/src/runtime/composables/useTheme.ts +0 -31
- package/src/runtime/index.ts +0 -25
- /package/{src → dist}/runtime/components/LoadingSpinner.vue +0 -0
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ Add Orio UI to your `nuxt.config.ts`:
|
|
|
30
30
|
|
|
31
31
|
```typescript
|
|
32
32
|
export default defineNuxtConfig({
|
|
33
|
-
|
|
33
|
+
modules: ["orio-ui"],
|
|
34
34
|
});
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -164,14 +164,16 @@ npm run docs:dev
|
|
|
164
164
|
|
|
165
165
|
```
|
|
166
166
|
orio-ui/
|
|
167
|
-
├── src/
|
|
168
|
-
│ ├──
|
|
169
|
-
│ ├──
|
|
170
|
-
│ ├──
|
|
171
|
-
│
|
|
167
|
+
├── src/
|
|
168
|
+
│ ├── runtime/
|
|
169
|
+
│ │ ├── components/ # 18 Vue components
|
|
170
|
+
│ │ ├── composables/ # 4 composables
|
|
171
|
+
│ │ ├── assets/css/ # Theme CSS files
|
|
172
|
+
│ │ └── utils/ # Icon registry
|
|
173
|
+
│ └── module.ts # Nuxt Module definition
|
|
172
174
|
├── tests/ # Vitest unit tests
|
|
173
175
|
├── docs/ # VitePress documentation
|
|
174
|
-
└──
|
|
176
|
+
└── build.config.ts # Module build configuration
|
|
175
177
|
```
|
|
176
178
|
|
|
177
179
|
### Running Tests
|
package/dist/module.cjs
ADDED
package/dist/module.d.ts
ADDED
package/dist/module.json
ADDED
package/dist/module.mjs
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineNuxtModule, createResolver, addComponentsDir, addImportsDir } from '@nuxt/kit';
|
|
2
|
+
|
|
3
|
+
const module = defineNuxtModule({
|
|
4
|
+
meta: {
|
|
5
|
+
name: "orio-ui",
|
|
6
|
+
configKey: "orioUi",
|
|
7
|
+
compatibility: {
|
|
8
|
+
nuxt: "^3.0.0 || ^4.0.0"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
defaults: {},
|
|
12
|
+
setup(_options, nuxt) {
|
|
13
|
+
const resolver = createResolver(import.meta.url);
|
|
14
|
+
nuxt.options.css.push(resolver.resolve("./runtime/assets/css/main.css"));
|
|
15
|
+
addComponentsDir({
|
|
16
|
+
path: resolver.resolve("./runtime/components"),
|
|
17
|
+
prefix: "Orio",
|
|
18
|
+
pathPrefix: false
|
|
19
|
+
});
|
|
20
|
+
addImportsDir(resolver.resolve("./runtime/composables"));
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export { module as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--motion-duration-short:0.05s;--motion-duration-medium:0.15s;--motion-distance-small:0.15rem;--motion-distance-medium:2rem;--motion-distance-large:1rem;--motion-ease-default:ease-in;--motion-ease-smooth:cubic-bezier(0.22,1,0.36,1)}.animate-fade-enter-active,.animate-fade-leave-active{transition:opacity var(--motion-duration-short) var(--motion-ease-default),transform var(--motion-duration-short) var(--motion-ease-default)}.animate-fade-enter-from,.animate-fade-leave-to{opacity:0;transform:translateY(calc(var(--motion-distance-small)*-1))}.animate-fade-slide-appear-active,.animate-fade-slide-enter-active,.animate-fade-slide-leave-active{transition:opacity var(--motion-duration-medium) var(--motion-ease-smooth),transform var(--motion-duration-medium) var(--motion-ease-smooth);transition-delay:calc(var(--index, 0)*.08s)}.animate-fade-slide-appear-from,.animate-fade-slide-enter-from{opacity:0;transform:translateY(var(--motion-distance-medium))}.animate-fade-slide-leave-to{opacity:0;transform:translateY(calc(var(--motion-distance-large)*-1))}.animate-fade-slide-move{transition:transform var(--motion-duration-medium) ease}.animate-fade-reverse-enter-active,.animate-fade-reverse-leave-active{transition:opacity var(--motion-duration-short) var(--motion-ease-default),transform var(--motion-duration-short) var(--motion-ease-default)}.animate-fade-reverse-enter-from,.animate-fade-reverse-leave-to{opacity:0;transform:translateY(var(--motion-distance-small))}.animate-fade-slide-reverse-appear-active,.animate-fade-slide-reverse-enter-active,.animate-fade-slide-reverse-leave-active{transition:opacity var(--motion-duration-medium) var(--motion-ease-smooth),transform var(--motion-duration-medium) var(--motion-ease-smooth);transition-delay:calc(var(--index, 0)*.08s)}.animate-fade-slide-reverse-appear-from,.animate-fade-slide-reverse-enter-from{opacity:0;transform:translateY(calc(var(--motion-distance-medium)*-1))}.animate-fade-slide-reverse-leave-to{opacity:0;transform:translateY(var(--motion-distance-large))}.animate-fade-slide-reverse-move{transition:transform var(--motion-duration-medium) ease}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2;--color-accent:#1f3a8a;--color-accent-ink:#fff;--color-accent-soft:#eef2ff;--color-accent-border:#c7d2fe;--color-accent-hover:color-mix(in srgb,var(--color-accent) 85%,#000 15%);--color-accent-active:color-mix(in srgb,var(--color-accent) 75%,#000 25%)}:root[data-mode=light]{--color-bg:#fff;--color-surface:#f7f8fa;--color-text:#0e1116;--color-muted:#626a78;--color-border:#bfbfc2}:root[data-mode=dark]{--color-bg:#0e1116;--color-surface:#1a1d23;--color-text:#fff;--color-muted:#a0a7b5;--color-border:#2e333d;--color-accent-ink:#fff;--color-accent-soft:color-mix(in srgb,var(--color-accent) 12%,#0e1116);--color-accent-border:color-mix(in srgb,var(--color-accent) 40%,#0e1116);--color-accent-hover:color-mix(in srgb,var(--color-accent) 30%,#fff 70%);--color-accent-active:color-mix(in srgb,var(--color-accent) 80%,#fff 25%)}:root[data-theme=navy]{--color-accent:#333c4d;--color-accent-soft:#f0f5ff;--color-accent-border:#bdcdef}:root[data-theme=teal]{--color-accent:#147b71;--color-accent-soft:#e7f8f6;--color-accent-border:#a6d9d4}:root[data-theme=forest]{--color-accent:#235c42;--color-accent-soft:#e9f7f0;--color-accent-border:#a2cdb9}:root[data-theme=wine]{--color-accent:#862737;--color-accent-soft:#fbeff1;--color-accent-border:#dbb3ba}:root[data-theme=royal]{--color-accent:#293da3;--color-accent-soft:#eef0fb;--color-accent-border:#b3badb}:root{--color-red:#dc2626;--color-red-ink:#fff;--color-red-soft:#fef2f2;--color-red-border:#fecaca;--color-red-hover:color-mix(in srgb,var(--color-red) 85%,#000 15%);--color-red-active:color-mix(in srgb,var(--color-red) 75%,#000 25%);--color-orange:#ea580c;--color-orange-ink:#fff;--color-orange-soft:#fff7ed;--color-orange-border:#fed7aa;--color-orange-hover:color-mix(in srgb,var(--color-orange) 85%,#000 15%);--color-orange-active:color-mix(in srgb,var(--color-orange) 75%,#000 25%);--color-yellow:#ca8a04;--color-yellow-ink:#fff;--color-yellow-soft:#fefce8;--color-yellow-border:#fef08a;--color-yellow-hover:color-mix(in srgb,var(--color-yellow) 85%,#000 15%);--color-yellow-active:color-mix(in srgb,var(--color-yellow) 75%,#000 25%);--color-green:#15803d;--color-green-ink:#fff;--color-green-soft:#f0fdf4;--color-green-border:#bbf7d0;--color-green-hover:color-mix(in srgb,var(--color-green) 85%,#000 15%);--color-green-active:color-mix(in srgb,var(--color-green) 75%,#000 25%);--color-teal:#0d9488;--color-teal-ink:#fff;--color-teal-soft:#f0fdfa;--color-teal-border:#99f6e4;--color-teal-hover:color-mix(in srgb,var(--color-teal) 85%,#000 15%);--color-teal-active:color-mix(in srgb,var(--color-teal) 75%,#000 25%);--color-blue:#2563eb;--color-blue-ink:#fff;--color-blue-soft:#eff6ff;--color-blue-border:#bfdbfe;--color-blue-hover:color-mix(in srgb,var(--color-blue) 85%,#000 15%);--color-blue-active:color-mix(in srgb,var(--color-blue) 75%,#000 25%);--color-purple:#7e22ce;--color-purple-ink:#fff;--color-purple-soft:#faf5ff;--color-purple-border:#e9d5ff;--color-purple-hover:color-mix(in srgb,var(--color-purple) 85%,#000 15%);--color-purple-active:color-mix(in srgb,var(--color-purple) 75%,#000 25%);--color-pink:#db2777;--color-pink-ink:#fff;--color-pink-soft:#fdf2f8;--color-pink-border:#fbcfe8;--color-pink-hover:color-mix(in srgb,var(--color-pink) 85%,#000 15%);--color-pink-active:color-mix(in srgb,var(--color-pink) 75%,#000 25%)}
|
|
@@ -3,21 +3,11 @@
|
|
|
3
3
|
--gh-angle: 120deg;
|
|
4
4
|
--gh-peek-x: 95%;
|
|
5
5
|
--gh-mix-base: black;
|
|
6
|
-
|
|
7
|
-
background-image: linear-gradient(
|
|
8
|
-
var(--gh-angle),
|
|
9
|
-
color-mix(in srgb, var(--gh-color) 90%, var(--gh-mix-base)) 0%,
|
|
10
|
-
var(--gh-color) 40%,
|
|
11
|
-
color-mix(in srgb, var(--gh-color) 90%, var(--gh-mix-base)) 80%
|
|
12
|
-
);
|
|
6
|
+
background-image: linear-gradient(var(--gh-angle), color-mix(in srgb, var(--gh-color) 90%, var(--gh-mix-base)) 0%, var(--gh-color) 40%, color-mix(in srgb, var(--gh-color) 90%, var(--gh-mix-base)) 80%);
|
|
13
7
|
background-repeat: no-repeat;
|
|
14
|
-
|
|
15
8
|
background-size: 0% 0%;
|
|
16
9
|
background-position: 0% 0%;
|
|
17
|
-
|
|
18
|
-
transition:
|
|
19
|
-
background-position 0.8s ease,
|
|
20
|
-
border-color 0.2s ease;
|
|
10
|
+
transition: background-position 0.8s ease, border-color 0.2s ease;
|
|
21
11
|
will-change: background-size, background-position;
|
|
22
12
|
}
|
|
23
13
|
|
|
@@ -27,7 +17,7 @@
|
|
|
27
17
|
}
|
|
28
18
|
|
|
29
19
|
/* Dark mode: now theme-aware */
|
|
30
|
-
:root[data-mode=
|
|
20
|
+
:root[data-mode=dark] .gradient-hover {
|
|
31
21
|
--gh-color: var(--color-accent); /* switch from static white to theme accent */
|
|
32
22
|
--gh-mix-base: var(--color-bg); /* blend into dark background */
|
|
33
|
-
}
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "./colors.css";@import "./animation.css";@import "./scroll.css";*,:after,:before{box-sizing:border-box}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
::-webkit-scrollbar{height:12px;width:12px}::-webkit-scrollbar-track{background:var(--color-surface);border-left:1px solid var(--color-border)}::-webkit-scrollbar-thumb{background-color:var(--color-accent-border);border:3px solid var(--color-surface);border-radius:8px;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}::-webkit-scrollbar-thumb:hover{background-color:var(--color-accent)}::-webkit-scrollbar-corner{background:var(--color-surface)}*{scrollbar-color:var(--color-accent-border) var(--color-surface);scrollbar-width:thin}:root[data-mode=dark] ::-webkit-scrollbar-track{background:var(--color-bg);border-left:1px solid var(--color-border)}:root[data-mode=dark] ::-webkit-scrollbar-thumb{background-color:var(--color-accent-border);border:3px solid var(--color-bg)}:root[data-mode=dark] *{scrollbar-color:var(--color-accent-border) var(--color-bg)}
|
|
@@ -49,7 +49,7 @@ function click(event: PointerEvent) {
|
|
|
49
49
|
</orio-control-element>
|
|
50
50
|
</template>
|
|
51
51
|
|
|
52
|
-
<style
|
|
52
|
+
<style scoped>
|
|
53
53
|
button {
|
|
54
54
|
background-color: var(--color-accent);
|
|
55
55
|
color: var(--color-accent-ink);
|
|
@@ -61,50 +61,42 @@ button {
|
|
|
61
61
|
align-items: center;
|
|
62
62
|
gap: 0.5rem;
|
|
63
63
|
user-select: none;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
&:active {
|
|
103
|
-
border-color: var(--color-accent-border) !important;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
&:hover {
|
|
107
|
-
color: var(--color-accent-ink);
|
|
108
|
-
}
|
|
64
|
+
}
|
|
65
|
+
button.icon-only {
|
|
66
|
+
padding: 0;
|
|
67
|
+
border-radius: 50%;
|
|
68
|
+
}
|
|
69
|
+
button:disabled {
|
|
70
|
+
background-color: var(--color-accent-soft);
|
|
71
|
+
color: var(--color-muted);
|
|
72
|
+
border-color: var(--color-accent-border);
|
|
73
|
+
cursor: not-allowed;
|
|
74
|
+
}
|
|
75
|
+
button:active {
|
|
76
|
+
border: 1px solid var(--color-accent-border);
|
|
77
|
+
}
|
|
78
|
+
button.primary {
|
|
79
|
+
--gh-color: var(--color-accent);
|
|
80
|
+
}
|
|
81
|
+
button.secondary {
|
|
82
|
+
background-color: transparent;
|
|
83
|
+
border: 1px solid var(--color-accent);
|
|
84
|
+
color: var(--color-accent);
|
|
85
|
+
}
|
|
86
|
+
button.secondary:hover {
|
|
87
|
+
color: var(--color-accent-hover);
|
|
88
|
+
}
|
|
89
|
+
button.subdued {
|
|
90
|
+
background-color: transparent;
|
|
91
|
+
color: var(--color-accent);
|
|
92
|
+
}
|
|
93
|
+
button.subdued:hover {
|
|
94
|
+
color: var(--color-accent-hover);
|
|
95
|
+
}
|
|
96
|
+
button:active {
|
|
97
|
+
border-color: var(--color-accent-border) !important;
|
|
98
|
+
}
|
|
99
|
+
button:hover {
|
|
100
|
+
color: var(--color-accent-ink);
|
|
109
101
|
}
|
|
110
102
|
</style>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const modelValue = defineModel<boolean>({ required: false });
|
|
3
|
+
|
|
4
|
+
defineProps<{
|
|
5
|
+
checkedIcon?: string; // optional: pass icon name for checked state
|
|
6
|
+
uncheckedIcon?: string; // optional: pass icon name for unchecked state
|
|
7
|
+
}>();
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<orio-control-element class="checkbox">
|
|
12
|
+
<label class="checkbox-label">
|
|
13
|
+
<input
|
|
14
|
+
v-model="modelValue"
|
|
15
|
+
type="checkbox"
|
|
16
|
+
class="checkbox-input"
|
|
17
|
+
tabindex="-1"
|
|
18
|
+
/>
|
|
19
|
+
<span
|
|
20
|
+
class="checkbox-box"
|
|
21
|
+
:class="{
|
|
22
|
+
defaultChecked: !checkedIcon,
|
|
23
|
+
defaultUnchecked: !uncheckedIcon,
|
|
24
|
+
}"
|
|
25
|
+
>
|
|
26
|
+
<slot name="icon" :checked="modelValue">
|
|
27
|
+
<orio-icon v-if="modelValue && checkedIcon" :name="checkedIcon" />
|
|
28
|
+
<orio-icon
|
|
29
|
+
v-else-if="!modelValue && uncheckedIcon"
|
|
30
|
+
:name="uncheckedIcon"
|
|
31
|
+
/>
|
|
32
|
+
</slot>
|
|
33
|
+
</span>
|
|
34
|
+
<slot />
|
|
35
|
+
</label>
|
|
36
|
+
</orio-control-element>
|
|
37
|
+
</template>
|
|
38
|
+
|
|
39
|
+
<style scoped>
|
|
40
|
+
.checkbox {
|
|
41
|
+
--box-size: 1rem;
|
|
42
|
+
}
|
|
43
|
+
.checkbox-label {
|
|
44
|
+
position: relative;
|
|
45
|
+
user-select: none;
|
|
46
|
+
display: inline-flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
gap: 0.4rem;
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
font-size: 0.9rem;
|
|
51
|
+
color: var(--color-text);
|
|
52
|
+
}
|
|
53
|
+
.checkbox-input {
|
|
54
|
+
position: absolute;
|
|
55
|
+
inset: 0;
|
|
56
|
+
width: var(--box-size);
|
|
57
|
+
height: 1rem;
|
|
58
|
+
margin: 0;
|
|
59
|
+
opacity: 0;
|
|
60
|
+
}
|
|
61
|
+
.checkbox-box {
|
|
62
|
+
width: var(--box-size);
|
|
63
|
+
height: var(--box-size);
|
|
64
|
+
border: 2px solid var(--color-border);
|
|
65
|
+
border-radius: 4px;
|
|
66
|
+
background-color: var(--color-bg);
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: center;
|
|
70
|
+
transition: background-color 0.2s ease, border-color 0.2s ease;
|
|
71
|
+
}
|
|
72
|
+
.checkbox .checkbox-input:checked + .checkbox-box {
|
|
73
|
+
background-color: var(--color-accent);
|
|
74
|
+
border-color: var(--color-accent);
|
|
75
|
+
}
|
|
76
|
+
.checkbox .checkbox-input:checked + .checkbox-box.defaultChecked::after {
|
|
77
|
+
content: "";
|
|
78
|
+
width: 0.3rem;
|
|
79
|
+
height: 0.6rem;
|
|
80
|
+
position: relative;
|
|
81
|
+
bottom: 0.1rem;
|
|
82
|
+
border: solid var(--color-accent-ink);
|
|
83
|
+
border-width: 0 2px 2px 0;
|
|
84
|
+
transform: rotate(45deg);
|
|
85
|
+
}
|
|
86
|
+
.checkbox-label:hover .checkbox-box {
|
|
87
|
+
border-color: var(--color-accent);
|
|
88
|
+
}
|
|
89
|
+
.checkbox .checkbox-input:focus-visible + .checkbox-box {
|
|
90
|
+
outline: 2px solid var(--color-accent);
|
|
91
|
+
outline-offset: 2px;
|
|
92
|
+
}
|
|
93
|
+
</style>
|
|
@@ -20,23 +20,20 @@ withDefaults(defineProps<ControlProps>(), {
|
|
|
20
20
|
</div>
|
|
21
21
|
</template>
|
|
22
22
|
|
|
23
|
-
<style
|
|
23
|
+
<style scoped>
|
|
24
24
|
.control {
|
|
25
25
|
margin: 0.5rem;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
26
|
+
}
|
|
27
|
+
.control .control-label {
|
|
28
|
+
user-select: none;
|
|
29
|
+
}
|
|
30
|
+
.control.minimal {
|
|
31
|
+
margin: 0;
|
|
32
|
+
}
|
|
33
|
+
.control.minimal .slot-wrapper :first-child {
|
|
34
|
+
border: 0;
|
|
35
|
+
}
|
|
36
|
+
.control.minimal .slot-wrapper :first-child:focus {
|
|
37
|
+
box-shadow: none;
|
|
41
38
|
}
|
|
42
39
|
</style>
|
|
@@ -29,7 +29,7 @@ const iconSize = computed(() => {
|
|
|
29
29
|
</div>
|
|
30
30
|
</template>
|
|
31
31
|
|
|
32
|
-
<style scoped
|
|
32
|
+
<style scoped>
|
|
33
33
|
.dashed-container {
|
|
34
34
|
cursor: pointer;
|
|
35
35
|
border: 3px dashed var(--color-border);
|
|
@@ -39,16 +39,15 @@ const iconSize = computed(() => {
|
|
|
39
39
|
flex-direction: column;
|
|
40
40
|
justify-content: center;
|
|
41
41
|
align-items: center;
|
|
42
|
-
|
|
43
|
-
&:hover {
|
|
44
|
-
.text-class {
|
|
45
|
-
color: var(--color-accent-hover);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
42
|
}
|
|
43
|
+
.dashed-container:hover .text-class {
|
|
44
|
+
color: var(--color-accent-hover);
|
|
45
|
+
}
|
|
46
|
+
|
|
49
47
|
.icon-class {
|
|
50
48
|
color: var(--color-muted);
|
|
51
49
|
}
|
|
50
|
+
|
|
52
51
|
.text-class {
|
|
53
52
|
color: var(--color-accent);
|
|
54
53
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import { nanoid } from 'nanoid';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
month?: boolean;
|
|
7
|
+
}
|
|
8
|
+
defineProps<Props>();
|
|
9
|
+
|
|
10
|
+
const date = defineModel<string | null | undefined>('date', {
|
|
11
|
+
required: true,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const randomName = computed(() => `date-${nanoid(8)}`);
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<orio-control-element class="date-picker" v-bind="$attrs">
|
|
19
|
+
<input
|
|
20
|
+
v-model="date"
|
|
21
|
+
:type="month ? 'month' : 'date'"
|
|
22
|
+
class="date-input"
|
|
23
|
+
:name="randomName"
|
|
24
|
+
/>
|
|
25
|
+
</orio-control-element>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<style scoped>
|
|
29
|
+
.date-picker *{cursor:pointer;width:100%}.date-picker-label{color:var(--color-text);display:inline-flex;flex-direction:column;font-size:.9rem;gap:.25rem}.date-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;box-sizing:border-box;color:var(--color-text);font-size:.95rem;padding:.4rem .6rem;transition:border-color .2s ease,box-shadow .2s ease}.date-input:focus,.date-input:hover{border-color:var(--color-accent)}.date-input:focus{box-shadow:0 0 0 2px var(--color-accent-soft);outline:none}.date-input:disabled{background-color:var(--color-surface);color:var(--color-muted);cursor:not-allowed}.date-input::-webkit-calendar-picker-indicator{cursor:pointer;filter:invert(36%) sepia(65%) saturate(325%) hue-rotate(180deg);opacity:.7;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.date-input::-webkit-calendar-picker-indicator:hover{opacity:1}
|
|
30
|
+
</style>
|
|
@@ -46,26 +46,25 @@ defineExpose({ dateIsCorrect });
|
|
|
46
46
|
</div>
|
|
47
47
|
</template>
|
|
48
48
|
|
|
49
|
-
<style
|
|
49
|
+
<style scoped>
|
|
50
50
|
.date-range-picker {
|
|
51
51
|
display: flex;
|
|
52
52
|
align-items: center;
|
|
53
53
|
flex-wrap: wrap;
|
|
54
|
-
|
|
55
|
-
& > * {
|
|
56
|
-
min-width: 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.date-picker {
|
|
60
|
-
margin-inline: 0;
|
|
61
|
-
}
|
|
62
|
-
.date-picker:first-child {
|
|
63
|
-
margin-inline-end: 0.5rem;
|
|
64
|
-
}
|
|
65
|
-
.checkbox {
|
|
66
|
-
margin-inline-start: 0.25rem;
|
|
67
|
-
}
|
|
68
54
|
}
|
|
55
|
+
.date-range-picker > * {
|
|
56
|
+
min-width: 0;
|
|
57
|
+
}
|
|
58
|
+
.date-range-picker .date-picker {
|
|
59
|
+
margin-inline: 0;
|
|
60
|
+
}
|
|
61
|
+
.date-range-picker .date-picker:first-child {
|
|
62
|
+
margin-inline-end: 0.5rem;
|
|
63
|
+
}
|
|
64
|
+
.date-range-picker .checkbox {
|
|
65
|
+
margin-inline-start: 0.25rem;
|
|
66
|
+
}
|
|
67
|
+
|
|
69
68
|
.error-message {
|
|
70
69
|
color: red;
|
|
71
70
|
font-size: 0.875rem;
|
|
@@ -32,7 +32,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
32
32
|
</div>
|
|
33
33
|
</template>
|
|
34
34
|
|
|
35
|
-
<style scoped
|
|
35
|
+
<style scoped>
|
|
36
36
|
.empty-state {
|
|
37
37
|
display: flex;
|
|
38
38
|
flex-direction: column;
|
|
@@ -42,33 +42,27 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
42
42
|
gap: 0.5rem;
|
|
43
43
|
padding: 2rem;
|
|
44
44
|
color: var(--color-text-secondary);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
gap: 1rem;
|
|
67
|
-
|
|
68
|
-
.empty-state-icon {
|
|
69
|
-
font-size: 4rem;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
45
|
+
}
|
|
46
|
+
.empty-state.small {
|
|
47
|
+
padding: 1rem;
|
|
48
|
+
gap: 0.25rem;
|
|
49
|
+
}
|
|
50
|
+
.empty-state.small .empty-state-icon {
|
|
51
|
+
font-size: 2rem;
|
|
52
|
+
}
|
|
53
|
+
.empty-state.medium {
|
|
54
|
+
padding: 2rem;
|
|
55
|
+
gap: 0.5rem;
|
|
56
|
+
}
|
|
57
|
+
.empty-state.medium .empty-state-icon {
|
|
58
|
+
font-size: 3rem;
|
|
59
|
+
}
|
|
60
|
+
.empty-state.large {
|
|
61
|
+
padding: 3rem;
|
|
62
|
+
gap: 1rem;
|
|
63
|
+
}
|
|
64
|
+
.empty-state.large .empty-state-icon {
|
|
65
|
+
font-size: 4rem;
|
|
72
66
|
}
|
|
73
67
|
|
|
74
68
|
.empty-state-icon {
|
|
@@ -36,16 +36,5 @@ const sizeValue = computed(() =>
|
|
|
36
36
|
</template>
|
|
37
37
|
|
|
38
38
|
<style scoped>
|
|
39
|
-
.orio-icon {
|
|
40
|
-
display: inline-flex;
|
|
41
|
-
align-items: center;
|
|
42
|
-
justify-content: center;
|
|
43
|
-
flex-shrink: 0;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.orio-icon :deep(svg) {
|
|
47
|
-
width: 100%;
|
|
48
|
-
height: 100%;
|
|
49
|
-
fill: currentColor;
|
|
50
|
-
}
|
|
39
|
+
.orio-icon{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center}.orio-icon :deep(svg){fill:currentColor;height:100%;width:100%}
|
|
51
40
|
</style>
|
|
@@ -12,7 +12,7 @@ const text = defineModel<string>({ default: '' });
|
|
|
12
12
|
</orio-control-element>
|
|
13
13
|
</template>
|
|
14
14
|
|
|
15
|
-
<style
|
|
15
|
+
<style scoped>
|
|
16
16
|
.text-input {
|
|
17
17
|
width: 100%;
|
|
18
18
|
padding: 0.5rem 0.75rem;
|
|
@@ -22,28 +22,22 @@ const text = defineModel<string>({ default: '' });
|
|
|
22
22
|
color: var(--color-text);
|
|
23
23
|
background-color: var(--color-bg);
|
|
24
24
|
box-sizing: border-box;
|
|
25
|
-
transition:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
&:disabled {
|
|
44
|
-
background-color: var(--color-surface);
|
|
45
|
-
color: var(--color-muted);
|
|
46
|
-
cursor: not-allowed;
|
|
47
|
-
}
|
|
25
|
+
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
26
|
+
}
|
|
27
|
+
.text-input::placeholder {
|
|
28
|
+
color: var(--color-muted);
|
|
29
|
+
}
|
|
30
|
+
.text-input:hover {
|
|
31
|
+
border-color: var(--color-accent);
|
|
32
|
+
}
|
|
33
|
+
.text-input:focus {
|
|
34
|
+
border-color: var(--color-accent);
|
|
35
|
+
box-shadow: 0 0 0 2px var(--color-accent-soft);
|
|
36
|
+
outline: none;
|
|
37
|
+
}
|
|
38
|
+
.text-input:disabled {
|
|
39
|
+
background-color: var(--color-surface);
|
|
40
|
+
color: var(--color-muted);
|
|
41
|
+
cursor: not-allowed;
|
|
48
42
|
}
|
|
49
43
|
</style>
|
|
@@ -65,47 +65,5 @@ watch(show, (open) => {
|
|
|
65
65
|
</template>
|
|
66
66
|
|
|
67
67
|
<style scoped>
|
|
68
|
-
.overlay {
|
|
69
|
-
position: fixed;
|
|
70
|
-
inset: 0;
|
|
71
|
-
background: rgba(0, 0, 0, 0.45);
|
|
72
|
-
backdrop-filter: blur(6px);
|
|
73
|
-
|
|
74
|
-
display: flex;
|
|
75
|
-
justify-content: center;
|
|
76
|
-
align-items: center;
|
|
77
|
-
|
|
78
|
-
transition: opacity 0.25s ease;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.modal {
|
|
82
|
-
position: absolute;
|
|
83
|
-
|
|
84
|
-
width: 380px;
|
|
85
|
-
max-width: 90vw;
|
|
86
|
-
max-height: 90vh;
|
|
87
|
-
|
|
88
|
-
background: white;
|
|
89
|
-
border-radius: 1rem;
|
|
90
|
-
padding: 24px;
|
|
91
|
-
|
|
92
|
-
transform-origin: top left;
|
|
93
|
-
box-shadow: 0 25px 60px rgba(0, 0, 0, 0.25);
|
|
94
|
-
|
|
95
|
-
transition:
|
|
96
|
-
transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1),
|
|
97
|
-
opacity 0.3s ease;
|
|
98
|
-
|
|
99
|
-
color: var(--color-muted);
|
|
100
|
-
opacity: 0;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
.overlay-fade-enter-from,
|
|
104
|
-
.overlay-fade-leave-to {
|
|
105
|
-
opacity: 0;
|
|
106
|
-
}
|
|
107
|
-
.overlay-fade-enter-active,
|
|
108
|
-
.overlay-fade-leave-active {
|
|
109
|
-
transition: opacity 0.25s ease;
|
|
110
|
-
}
|
|
68
|
+
.overlay{align-items:center;backdrop-filter:blur(6px);background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;transition:opacity .25s ease}.modal{background:#fff;border-radius:1rem;box-shadow:0 25px 60px rgba(0,0,0,.25);color:var(--color-muted);max-height:90vh;max-width:90vw;padding:24px;position:absolute;transform-origin:top left;transition:transform .35s cubic-bezier(.2,.8,.2,1),opacity .3s ease;width:380px}.modal,.overlay-fade-enter-from,.overlay-fade-leave-to{opacity:0}.overlay-fade-enter-active,.overlay-fade-leave-active{transition:opacity .25s ease}
|
|
111
69
|
</style>
|