orio-ui 1.0.1 → 1.0.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.
Files changed (61) hide show
  1. package/README.md +9 -7
  2. package/dist/module.cjs +5 -0
  3. package/dist/module.d.mts +3 -0
  4. package/dist/module.d.ts +3 -0
  5. package/dist/module.json +12 -0
  6. package/dist/module.mjs +24 -0
  7. package/dist/runtime/assets/css/animation.css +1 -0
  8. package/dist/runtime/assets/css/colors.css +1 -0
  9. package/{src/runtime/assets/css/cool-gradient-hover.scss → dist/runtime/assets/css/cool-gradient-hover.css} +4 -14
  10. package/dist/runtime/assets/css/main.css +1 -0
  11. package/dist/runtime/assets/css/scroll.css +1 -0
  12. package/{src → dist}/runtime/components/Button.vue +38 -46
  13. package/dist/runtime/components/CheckBox.vue +93 -0
  14. package/{src → dist}/runtime/components/ControlElement.vue +13 -16
  15. package/{src → dist}/runtime/components/DashedContainer.vue +6 -7
  16. package/dist/runtime/components/DatePicker.vue +30 -0
  17. package/{src → dist}/runtime/components/DateRangePicker.vue +14 -15
  18. package/{src → dist}/runtime/components/EmptyState.vue +22 -28
  19. package/{src → dist}/runtime/components/Icon.vue +1 -12
  20. package/{src → dist}/runtime/components/Input.vue +18 -24
  21. package/{src → dist}/runtime/components/Modal.vue +1 -43
  22. package/{src → dist}/runtime/components/Popover.vue +1 -1
  23. package/{src → dist}/runtime/components/Selector.vue +36 -52
  24. package/dist/runtime/components/Tag.vue +21 -0
  25. package/{src → dist}/runtime/components/Textarea.vue +18 -24
  26. package/{src → dist}/runtime/components/view/Dates.vue +1 -3
  27. package/{src → dist}/runtime/components/view/Separator.vue +1 -5
  28. package/{src → dist}/runtime/components/view/Text.vue +38 -42
  29. package/dist/runtime/composables/index.d.ts +4 -0
  30. package/dist/runtime/composables/index.js +6 -0
  31. package/dist/runtime/composables/useApi.d.ts +10 -0
  32. package/dist/runtime/composables/useApi.js +9 -0
  33. package/dist/runtime/composables/useFuzzySearch.d.ts +10 -0
  34. package/dist/runtime/composables/useFuzzySearch.js +22 -0
  35. package/dist/runtime/composables/useModal.d.ts +15 -0
  36. package/dist/runtime/composables/useModal.js +28 -0
  37. package/dist/runtime/composables/useTheme.d.ts +6 -0
  38. package/dist/runtime/composables/useTheme.js +23 -0
  39. package/dist/runtime/index.d.ts +20 -0
  40. package/dist/runtime/index.js +20 -0
  41. package/dist/runtime/utils/icon-registry.d.ts +2 -0
  42. package/{src/runtime/utils/icon-registry.ts → dist/runtime/utils/icon-registry.js} +5 -20
  43. package/dist/types.d.mts +7 -0
  44. package/dist/types.d.ts +7 -0
  45. package/package.json +11 -15
  46. package/nuxt.config.ts +0 -38
  47. package/src/module.ts +0 -16
  48. package/src/runtime/assets/css/animation.css +0 -88
  49. package/src/runtime/assets/css/colors.css +0 -142
  50. package/src/runtime/assets/css/main.css +0 -11
  51. package/src/runtime/assets/css/scroll.css +0 -46
  52. package/src/runtime/components/CheckBox.vue +0 -103
  53. package/src/runtime/components/DatePicker.vue +0 -84
  54. package/src/runtime/components/Tag.vue +0 -49
  55. package/src/runtime/composables/index.ts +0 -9
  56. package/src/runtime/composables/useApi.ts +0 -32
  57. package/src/runtime/composables/useFuzzySearch.ts +0 -51
  58. package/src/runtime/composables/useModal.ts +0 -47
  59. package/src/runtime/composables/useTheme.ts +0 -31
  60. package/src/runtime/index.ts +0 -25
  61. /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
- extends: ["orio-ui"],
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/runtime/
168
- │ ├── components/ # 18 Vue components
169
- │ ├── composables/ # 4 composables
170
- │ ├── assets/css/ # Theme CSS files
171
- └── utils/ # Icon registry
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
- └── nuxt.config.ts # Nuxt Layer configuration
176
+ └── build.config.ts # Module build configuration
175
177
  ```
176
178
 
177
179
  ### Running Tests
@@ -0,0 +1,5 @@
1
+ module.exports = function(...args) {
2
+ return import('./module.mjs').then(m => m.default.call(this, ...args))
3
+ }
4
+ const _meta = module.exports.meta = require('./module.json')
5
+ module.exports.getMeta = () => Promise.resolve(_meta)
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+
3
+ export { _default as default };
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+
3
+ export { _default as default };
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "orio-ui",
3
+ "configKey": "orioUi",
4
+ "compatibility": {
5
+ "nuxt": "^3.0.0 || ^4.0.0"
6
+ },
7
+ "version": "1.0.3",
8
+ "builder": {
9
+ "@nuxt/module-builder": "0.8.4",
10
+ "unbuild": "2.0.0"
11
+ }
12
+ }
@@ -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: true
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="dark"] .gradient-hover {
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 lang="scss" scoped>
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
- &.icon-only {
66
- padding: 0;
67
- border-radius: 50%;
68
- }
69
-
70
- &:disabled {
71
- background-color: var(--color-accent-soft);
72
- color: var(--color-muted);
73
- border-color: var(--color-accent-border);
74
- cursor: not-allowed;
75
- }
76
-
77
- &:active {
78
- border: 1px solid var(--color-accent-border);
79
- }
80
-
81
- &.primary {
82
- --gh-color: var(--color-accent);
83
- }
84
-
85
- &.secondary {
86
- background-color: transparent;
87
- border: 1px solid var(--color-accent);
88
- color: var(--color-accent);
89
- &:hover {
90
- color: var(--color-accent-hover);
91
- }
92
- }
93
-
94
- &.subdued {
95
- background-color: transparent;
96
- color: var(--color-accent);
97
- &:hover {
98
- color: var(--color-accent-hover);
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 lang="scss" scoped>
23
+ <style scoped>
24
24
  .control {
25
25
  margin: 0.5rem;
26
-
27
- .control-label {
28
- user-select: none;
29
- }
30
-
31
- &.minimal {
32
- margin: 0;
33
-
34
- .slot-wrapper :first-child {
35
- border: 0;
36
- &:focus {
37
- box-shadow: none;
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 lang="scss">
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 lang="scss" scoped>
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 lang="scss">
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
- &.small {
47
- padding: 1rem;
48
- gap: 0.25rem;
49
-
50
- .empty-state-icon {
51
- font-size: 2rem;
52
- }
53
- }
54
-
55
- &.medium {
56
- padding: 2rem;
57
- gap: 0.5rem;
58
-
59
- .empty-state-icon {
60
- font-size: 3rem;
61
- }
62
- }
63
-
64
- &.large {
65
- padding: 3rem;
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 lang="scss" scoped>
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
- border-color 0.2s ease,
27
- box-shadow 0.2s ease;
28
-
29
- &::placeholder {
30
- color: var(--color-muted);
31
- }
32
-
33
- &:hover {
34
- border-color: var(--color-accent);
35
- }
36
-
37
- &:focus {
38
- border-color: var(--color-accent);
39
- box-shadow: 0 0 0 2px var(--color-accent-soft);
40
- outline: none;
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>
@@ -246,7 +246,7 @@ onBeforeUnmount(() => {
246
246
  window.removeEventListener('resize', redrawPopover, true);
247
247
  });
248
248
  </script>
249
- <style lang="scss" scoped>
249
+ <style scoped>
250
250
  .popover {
251
251
  border: 0;
252
252
  background-color: transparent;