@falcondev-oss/nuxt-layers-base 0.1.0

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 (176) hide show
  1. package/.nuxt/app.config.mjs +317 -0
  2. package/.nuxt/components.d.ts +332 -0
  3. package/.nuxt/imports.d.ts +61 -0
  4. package/.nuxt/manifest/meta/24fb5e89-93fb-44cb-bbff-2a13f165c1e8.json +1 -0
  5. package/.nuxt/nuxt-icon-client-bundle.mjs +1 -0
  6. package/.nuxt/nuxt-icon-server-bundle.mjs +14 -0
  7. package/.nuxt/nuxt.d.ts +24 -0
  8. package/.nuxt/nuxt.node.d.ts +14 -0
  9. package/.nuxt/nuxt.shared.d.ts +5 -0
  10. package/.nuxt/schema/nuxt.schema.d.ts +210 -0
  11. package/.nuxt/schema/nuxt.schema.json +263 -0
  12. package/.nuxt/tsconfig.app.json +217 -0
  13. package/.nuxt/tsconfig.json +219 -0
  14. package/.nuxt/tsconfig.node.json +114 -0
  15. package/.nuxt/tsconfig.server.json +140 -0
  16. package/.nuxt/tsconfig.shared.json +139 -0
  17. package/.nuxt/types/app.config.d.ts +331 -0
  18. package/.nuxt/types/build.d.ts +24 -0
  19. package/.nuxt/types/builder-env.d.ts +1 -0
  20. package/.nuxt/types/components.d.ts +337 -0
  21. package/.nuxt/types/imports.d.ts +906 -0
  22. package/.nuxt/types/layouts.d.ts +7 -0
  23. package/.nuxt/types/middleware.d.ts +7 -0
  24. package/.nuxt/types/modules.d.ts +159 -0
  25. package/.nuxt/types/nitro-config.d.ts +14 -0
  26. package/.nuxt/types/nitro-imports.d.ts +141 -0
  27. package/.nuxt/types/nitro-middleware.d.ts +11 -0
  28. package/.nuxt/types/nitro-nuxt.d.ts +61 -0
  29. package/.nuxt/types/nitro-routes.d.ts +17 -0
  30. package/.nuxt/types/nitro.d.ts +3 -0
  31. package/.nuxt/types/plugins.d.ts +35 -0
  32. package/.nuxt/types/runtime-config.d.ts +36 -0
  33. package/.nuxt/types/ui.d.ts +36 -0
  34. package/.nuxt/types/vue-shim.d.ts +0 -0
  35. package/.nuxt/ui/accordion.ts +20 -0
  36. package/.nuxt/ui/alert.ts +264 -0
  37. package/.nuxt/ui/auth-form.ts +20 -0
  38. package/.nuxt/ui/avatar-group.ts +52 -0
  39. package/.nuxt/ui/avatar.ts +54 -0
  40. package/.nuxt/ui/badge.ts +263 -0
  41. package/.nuxt/ui/banner.ts +108 -0
  42. package/.nuxt/ui/blog-post.ts +143 -0
  43. package/.nuxt/ui/blog-posts.ts +9 -0
  44. package/.nuxt/ui/breadcrumb.ts +45 -0
  45. package/.nuxt/ui/button.ts +378 -0
  46. package/.nuxt/ui/calendar.ts +315 -0
  47. package/.nuxt/ui/card.ts +34 -0
  48. package/.nuxt/ui/carousel.ts +38 -0
  49. package/.nuxt/ui/changelog-version.ts +45 -0
  50. package/.nuxt/ui/changelog-versions.ts +8 -0
  51. package/.nuxt/ui/chat-message.ts +136 -0
  52. package/.nuxt/ui/chat-messages.ts +14 -0
  53. package/.nuxt/ui/chat-palette.ts +8 -0
  54. package/.nuxt/ui/chat-prompt-submit.ts +5 -0
  55. package/.nuxt/ui/chat-prompt.ts +35 -0
  56. package/.nuxt/ui/checkbox-group.ts +207 -0
  57. package/.nuxt/ui/checkbox.ts +237 -0
  58. package/.nuxt/ui/chip.ts +96 -0
  59. package/.nuxt/ui/collapsible.ts +6 -0
  60. package/.nuxt/ui/color-picker.ts +47 -0
  61. package/.nuxt/ui/command-palette.ts +62 -0
  62. package/.nuxt/ui/container.ts +3 -0
  63. package/.nuxt/ui/context-menu.ts +219 -0
  64. package/.nuxt/ui/dashboard-group.ts +3 -0
  65. package/.nuxt/ui/dashboard-navbar.ts +21 -0
  66. package/.nuxt/ui/dashboard-panel.ts +17 -0
  67. package/.nuxt/ui/dashboard-resize-handle.ts +3 -0
  68. package/.nuxt/ui/dashboard-search-button.ts +15 -0
  69. package/.nuxt/ui/dashboard-search.ts +13 -0
  70. package/.nuxt/ui/dashboard-sidebar-collapse.ts +9 -0
  71. package/.nuxt/ui/dashboard-sidebar-toggle.ts +9 -0
  72. package/.nuxt/ui/dashboard-sidebar.ts +37 -0
  73. package/.nuxt/ui/dashboard-toolbar.ts +7 -0
  74. package/.nuxt/ui/drawer.ts +149 -0
  75. package/.nuxt/ui/dropdown-menu.ts +220 -0
  76. package/.nuxt/ui/editor-drag-handle.ts +6 -0
  77. package/.nuxt/ui/editor-emoji-menu.ts +35 -0
  78. package/.nuxt/ui/editor-mention-menu.ts +35 -0
  79. package/.nuxt/ui/editor-suggestion-menu.ts +35 -0
  80. package/.nuxt/ui/editor-toolbar.ts +21 -0
  81. package/.nuxt/ui/editor.ts +35 -0
  82. package/.nuxt/ui/empty.ts +83 -0
  83. package/.nuxt/ui/error.ts +9 -0
  84. package/.nuxt/ui/field-group.ts +16 -0
  85. package/.nuxt/ui/file-upload.ts +290 -0
  86. package/.nuxt/ui/footer-columns.ts +28 -0
  87. package/.nuxt/ui/footer.ts +11 -0
  88. package/.nuxt/ui/form-field.ts +62 -0
  89. package/.nuxt/ui/form.ts +3 -0
  90. package/.nuxt/ui/header.ts +25 -0
  91. package/.nuxt/ui/index.ts +109 -0
  92. package/.nuxt/ui/input-date.ts +337 -0
  93. package/.nuxt/ui/input-menu.ts +460 -0
  94. package/.nuxt/ui/input-number.ts +256 -0
  95. package/.nuxt/ui/input-tags.ts +310 -0
  96. package/.nuxt/ui/input-time.ts +336 -0
  97. package/.nuxt/ui/input.ts +289 -0
  98. package/.nuxt/ui/kbd.ts +195 -0
  99. package/.nuxt/ui/link.ts +22 -0
  100. package/.nuxt/ui/main.ts +3 -0
  101. package/.nuxt/ui/marquee.ts +66 -0
  102. package/.nuxt/ui/modal.ts +60 -0
  103. package/.nuxt/ui/navigation-menu.ts +512 -0
  104. package/.nuxt/ui/page-anchors.ts +30 -0
  105. package/.nuxt/ui/page-aside.ts +10 -0
  106. package/.nuxt/ui/page-body.ts +3 -0
  107. package/.nuxt/ui/page-card.ts +274 -0
  108. package/.nuxt/ui/page-columns.ts +3 -0
  109. package/.nuxt/ui/page-cta.ts +70 -0
  110. package/.nuxt/ui/page-feature.ts +34 -0
  111. package/.nuxt/ui/page-grid.ts +3 -0
  112. package/.nuxt/ui/page-header.ts +18 -0
  113. package/.nuxt/ui/page-hero.ts +44 -0
  114. package/.nuxt/ui/page-links.ts +25 -0
  115. package/.nuxt/ui/page-list.ts +8 -0
  116. package/.nuxt/ui/page-logos.ts +15 -0
  117. package/.nuxt/ui/page-section.ts +84 -0
  118. package/.nuxt/ui/page.ts +32 -0
  119. package/.nuxt/ui/pagination.ts +13 -0
  120. package/.nuxt/ui/pin-input.ts +171 -0
  121. package/.nuxt/ui/popover.ts +6 -0
  122. package/.nuxt/ui/pricing-plan.ts +101 -0
  123. package/.nuxt/ui/pricing-plans.ts +22 -0
  124. package/.nuxt/ui/pricing-table.ts +51 -0
  125. package/.nuxt/ui/progress.ts +297 -0
  126. package/.nuxt/ui/radio-group.ts +352 -0
  127. package/.nuxt/ui/scroll-area.ts +21 -0
  128. package/.nuxt/ui/select-menu.ts +361 -0
  129. package/.nuxt/ui/select.ts +348 -0
  130. package/.nuxt/ui/separator.ts +172 -0
  131. package/.nuxt/ui/skeleton.ts +3 -0
  132. package/.nuxt/ui/slideover.ts +132 -0
  133. package/.nuxt/ui/slider.ts +171 -0
  134. package/.nuxt/ui/stepper.ts +202 -0
  135. package/.nuxt/ui/switch.ts +132 -0
  136. package/.nuxt/ui/table.ts +162 -0
  137. package/.nuxt/ui/tabs.ts +258 -0
  138. package/.nuxt/ui/textarea.ts +294 -0
  139. package/.nuxt/ui/timeline.ts +321 -0
  140. package/.nuxt/ui/toast.ts +74 -0
  141. package/.nuxt/ui/toaster.ts +91 -0
  142. package/.nuxt/ui/tooltip.ts +9 -0
  143. package/.nuxt/ui/tree.ts +168 -0
  144. package/.nuxt/ui/user.ts +101 -0
  145. package/.nuxt/ui-image-component.ts +1 -0
  146. package/.nuxt/ui.css +154 -0
  147. package/app/app.config.ts +7 -0
  148. package/app/app.vue +3 -0
  149. package/app/assets/css/base.css +28 -0
  150. package/app/components/Var.vue +13 -0
  151. package/app/components/layout/LayoutDashboard.vue +102 -0
  152. package/app/components/overlay/modal/ModalActions.vue +25 -0
  153. package/app/components/overlay/modal/ModalConfirm.vue +25 -0
  154. package/app/components/overlay/modal/ModalRadioGroup.vue +37 -0
  155. package/app/components/u/UActions.vue +23 -0
  156. package/app/components/u/UCustomApp.vue +20 -0
  157. package/app/components/u/UField.vue +55 -0
  158. package/app/components/u/UImageWithFallback.vue +35 -0
  159. package/app/components/u/UInputDatePicker.vue +40 -0
  160. package/app/components/u/UInputDurationMinutes.vue +88 -0
  161. package/app/components/u/UTableCard.vue +16 -0
  162. package/app/composables/useConfirm.ts +16 -0
  163. package/app/composables/usePreventPageLeave.ts +31 -0
  164. package/app/composables/useRouteParamString.ts +22 -0
  165. package/app/composables/useTableColumns.tsx +68 -0
  166. package/app/composables/useToast.ts +40 -0
  167. package/app/composables/useTrpc.ts +3 -0
  168. package/app/error.vue +15 -0
  169. package/app/pages/index.vue +3 -0
  170. package/app/utils/form-field-translators.ts +41 -0
  171. package/app/utils/plugins.ts +95 -0
  172. package/app/utils/reactivity.ts +17 -0
  173. package/nuxt.config.ts +85 -0
  174. package/package.json +46 -0
  175. package/pnpm-workspace.yaml +5 -0
  176. package/tsconfig.json +17 -0
@@ -0,0 +1,101 @@
1
+ const size = [
2
+ "3xs",
3
+ "2xs",
4
+ "xs",
5
+ "sm",
6
+ "md",
7
+ "lg",
8
+ "xl",
9
+ "2xl",
10
+ "3xl"
11
+ ] as const
12
+
13
+ export default {
14
+ "slots": {
15
+ "root": "relative group/user",
16
+ "wrapper": "",
17
+ "name": "font-medium",
18
+ "description": "text-muted",
19
+ "avatar": "shrink-0"
20
+ },
21
+ "variants": {
22
+ "orientation": {
23
+ "horizontal": {
24
+ "root": "flex items-center"
25
+ },
26
+ "vertical": {
27
+ "root": "flex flex-col"
28
+ }
29
+ },
30
+ "to": {
31
+ "true": {
32
+ "name": [
33
+ "text-default peer-hover:text-highlighted peer-focus-visible:text-highlighted",
34
+ "transition-colors"
35
+ ],
36
+ "description": [
37
+ "peer-hover:text-toned peer-focus-visible:text-toned",
38
+ "transition-colors"
39
+ ],
40
+ "avatar": "transform transition-transform duration-200 group-hover/user:scale-115 group-has-focus-visible/user:scale-115"
41
+ },
42
+ "false": {
43
+ "name": "text-highlighted",
44
+ "description": ""
45
+ }
46
+ },
47
+ "size": {
48
+ "3xs": {
49
+ "root": "gap-1",
50
+ "wrapper": "flex items-center gap-1",
51
+ "name": "text-xs",
52
+ "description": "text-xs"
53
+ },
54
+ "2xs": {
55
+ "root": "gap-1.5",
56
+ "wrapper": "flex items-center gap-1.5",
57
+ "name": "text-xs",
58
+ "description": "text-xs"
59
+ },
60
+ "xs": {
61
+ "root": "gap-1.5",
62
+ "wrapper": "flex items-center gap-1.5",
63
+ "name": "text-xs",
64
+ "description": "text-xs"
65
+ },
66
+ "sm": {
67
+ "root": "gap-2",
68
+ "name": "text-xs",
69
+ "description": "text-xs"
70
+ },
71
+ "md": {
72
+ "root": "gap-2",
73
+ "name": "text-sm",
74
+ "description": "text-xs"
75
+ },
76
+ "lg": {
77
+ "root": "gap-2.5",
78
+ "name": "text-sm",
79
+ "description": "text-sm"
80
+ },
81
+ "xl": {
82
+ "root": "gap-2.5",
83
+ "name": "text-base",
84
+ "description": "text-sm"
85
+ },
86
+ "2xl": {
87
+ "root": "gap-3",
88
+ "name": "text-base",
89
+ "description": "text-base"
90
+ },
91
+ "3xl": {
92
+ "root": "gap-3",
93
+ "name": "text-lg",
94
+ "description": "text-base"
95
+ }
96
+ }
97
+ },
98
+ "defaultVariants": {
99
+ "size": "md" as typeof size[number]
100
+ }
101
+ }
@@ -0,0 +1 @@
1
+ export default "img"
package/.nuxt/ui.css ADDED
@@ -0,0 +1,154 @@
1
+ @source "/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/**/*";
2
+ @source inline("isolate");
3
+ @source "./ui";
4
+
5
+ @layer base {
6
+ body {
7
+ @apply antialiased text-default bg-default scheme-light dark:scheme-dark;
8
+ }
9
+ }
10
+
11
+ @theme static {
12
+ --color-old-neutral-50: oklch(98.5% 0 0);
13
+ --color-old-neutral-100: oklch(97% 0 0);
14
+ --color-old-neutral-200: oklch(92.2% 0 0);
15
+ --color-old-neutral-300: oklch(87% 0 0);
16
+ --color-old-neutral-400: oklch(70.8% 0 0);
17
+ --color-old-neutral-500: oklch(55.6% 0 0);
18
+ --color-old-neutral-600: oklch(43.9% 0 0);
19
+ --color-old-neutral-700: oklch(37.1% 0 0);
20
+ --color-old-neutral-800: oklch(26.9% 0 0);
21
+ --color-old-neutral-900: oklch(20.5% 0 0);
22
+ --color-old-neutral-950: oklch(14.5% 0 0);
23
+ }
24
+
25
+ @theme default inline {
26
+ --color-primary-50: var(--ui-color-primary-50);
27
+ --color-primary-100: var(--ui-color-primary-100);
28
+ --color-primary-200: var(--ui-color-primary-200);
29
+ --color-primary-300: var(--ui-color-primary-300);
30
+ --color-primary-400: var(--ui-color-primary-400);
31
+ --color-primary-500: var(--ui-color-primary-500);
32
+ --color-primary-600: var(--ui-color-primary-600);
33
+ --color-primary-700: var(--ui-color-primary-700);
34
+ --color-primary-800: var(--ui-color-primary-800);
35
+ --color-primary-900: var(--ui-color-primary-900);
36
+ --color-primary-950: var(--ui-color-primary-950);
37
+ --color-secondary-50: var(--ui-color-secondary-50);
38
+ --color-secondary-100: var(--ui-color-secondary-100);
39
+ --color-secondary-200: var(--ui-color-secondary-200);
40
+ --color-secondary-300: var(--ui-color-secondary-300);
41
+ --color-secondary-400: var(--ui-color-secondary-400);
42
+ --color-secondary-500: var(--ui-color-secondary-500);
43
+ --color-secondary-600: var(--ui-color-secondary-600);
44
+ --color-secondary-700: var(--ui-color-secondary-700);
45
+ --color-secondary-800: var(--ui-color-secondary-800);
46
+ --color-secondary-900: var(--ui-color-secondary-900);
47
+ --color-secondary-950: var(--ui-color-secondary-950);
48
+ --color-success-50: var(--ui-color-success-50);
49
+ --color-success-100: var(--ui-color-success-100);
50
+ --color-success-200: var(--ui-color-success-200);
51
+ --color-success-300: var(--ui-color-success-300);
52
+ --color-success-400: var(--ui-color-success-400);
53
+ --color-success-500: var(--ui-color-success-500);
54
+ --color-success-600: var(--ui-color-success-600);
55
+ --color-success-700: var(--ui-color-success-700);
56
+ --color-success-800: var(--ui-color-success-800);
57
+ --color-success-900: var(--ui-color-success-900);
58
+ --color-success-950: var(--ui-color-success-950);
59
+ --color-info-50: var(--ui-color-info-50);
60
+ --color-info-100: var(--ui-color-info-100);
61
+ --color-info-200: var(--ui-color-info-200);
62
+ --color-info-300: var(--ui-color-info-300);
63
+ --color-info-400: var(--ui-color-info-400);
64
+ --color-info-500: var(--ui-color-info-500);
65
+ --color-info-600: var(--ui-color-info-600);
66
+ --color-info-700: var(--ui-color-info-700);
67
+ --color-info-800: var(--ui-color-info-800);
68
+ --color-info-900: var(--ui-color-info-900);
69
+ --color-info-950: var(--ui-color-info-950);
70
+ --color-warning-50: var(--ui-color-warning-50);
71
+ --color-warning-100: var(--ui-color-warning-100);
72
+ --color-warning-200: var(--ui-color-warning-200);
73
+ --color-warning-300: var(--ui-color-warning-300);
74
+ --color-warning-400: var(--ui-color-warning-400);
75
+ --color-warning-500: var(--ui-color-warning-500);
76
+ --color-warning-600: var(--ui-color-warning-600);
77
+ --color-warning-700: var(--ui-color-warning-700);
78
+ --color-warning-800: var(--ui-color-warning-800);
79
+ --color-warning-900: var(--ui-color-warning-900);
80
+ --color-warning-950: var(--ui-color-warning-950);
81
+ --color-error-50: var(--ui-color-error-50);
82
+ --color-error-100: var(--ui-color-error-100);
83
+ --color-error-200: var(--ui-color-error-200);
84
+ --color-error-300: var(--ui-color-error-300);
85
+ --color-error-400: var(--ui-color-error-400);
86
+ --color-error-500: var(--ui-color-error-500);
87
+ --color-error-600: var(--ui-color-error-600);
88
+ --color-error-700: var(--ui-color-error-700);
89
+ --color-error-800: var(--ui-color-error-800);
90
+ --color-error-900: var(--ui-color-error-900);
91
+ --color-error-950: var(--ui-color-error-950);
92
+ --color-neutral-50: var(--ui-color-neutral-50);
93
+ --color-neutral-100: var(--ui-color-neutral-100);
94
+ --color-neutral-200: var(--ui-color-neutral-200);
95
+ --color-neutral-300: var(--ui-color-neutral-300);
96
+ --color-neutral-400: var(--ui-color-neutral-400);
97
+ --color-neutral-500: var(--ui-color-neutral-500);
98
+ --color-neutral-600: var(--ui-color-neutral-600);
99
+ --color-neutral-700: var(--ui-color-neutral-700);
100
+ --color-neutral-800: var(--ui-color-neutral-800);
101
+ --color-neutral-900: var(--ui-color-neutral-900);
102
+ --color-neutral-950: var(--ui-color-neutral-950);
103
+ --color-primary: var(--ui-primary);
104
+ --color-secondary: var(--ui-secondary);
105
+ --color-success: var(--ui-success);
106
+ --color-info: var(--ui-info);
107
+ --color-warning: var(--ui-warning);
108
+ --color-error: var(--ui-error);
109
+ --radius-xs: calc(var(--ui-radius) * 0.5);
110
+ --radius-sm: var(--ui-radius);
111
+ --radius-md: calc(var(--ui-radius) * 1.5);
112
+ --radius-lg: calc(var(--ui-radius) * 2);
113
+ --radius-xl: calc(var(--ui-radius) * 3);
114
+ --radius-2xl: calc(var(--ui-radius) * 4);
115
+ --radius-3xl: calc(var(--ui-radius) * 6);
116
+ --text-color-dimmed: var(--ui-text-dimmed);
117
+ --text-color-muted: var(--ui-text-muted);
118
+ --text-color-toned: var(--ui-text-toned);
119
+ --text-color-default: var(--ui-text);
120
+ --text-color-highlighted: var(--ui-text-highlighted);
121
+ --text-color-inverted: var(--ui-text-inverted);
122
+ --background-color-default: var(--ui-bg);
123
+ --background-color-muted: var(--ui-bg-muted);
124
+ --background-color-elevated: var(--ui-bg-elevated);
125
+ --background-color-accented: var(--ui-bg-accented);
126
+ --background-color-inverted: var(--ui-bg-inverted);
127
+ --background-color-border: var(--ui-border);
128
+ --border-color-default: var(--ui-border);
129
+ --border-color-muted: var(--ui-border-muted);
130
+ --border-color-accented: var(--ui-border-accented);
131
+ --border-color-inverted: var(--ui-border-inverted);
132
+ --border-color-bg: var(--ui-bg);
133
+ --ring-color-default: var(--ui-border);
134
+ --ring-color-muted: var(--ui-border-muted);
135
+ --ring-color-accented: var(--ui-border-accented);
136
+ --ring-color-inverted: var(--ui-border-inverted);
137
+ --ring-color-bg: var(--ui-bg);
138
+ --ring-offset-color-default: var(--ui-border);
139
+ --ring-offset-color-muted: var(--ui-border-muted);
140
+ --ring-offset-color-accented: var(--ui-border-accented);
141
+ --ring-offset-color-inverted: var(--ui-border-inverted);
142
+ --ring-offset-color-bg: var(--ui-bg);
143
+ --divide-color-default: var(--ui-border);
144
+ --divide-color-muted: var(--ui-border-muted);
145
+ --divide-color-accented: var(--ui-border-accented);
146
+ --divide-color-inverted: var(--ui-border-inverted);
147
+ --divide-color-bg: var(--ui-bg);
148
+ --outline-color-default: var(--ui-border);
149
+ --outline-color-inverted: var(--ui-border-inverted);
150
+ --stroke-default: var(--ui-border);
151
+ --stroke-inverted: var(--ui-border-inverted);
152
+ --fill-default: var(--ui-border);
153
+ --fill-inverted: var(--ui-border-inverted);
154
+ }
@@ -0,0 +1,7 @@
1
+ export default defineAppConfig({
2
+ ui: {
3
+ colors: {
4
+ neutral: 'gray',
5
+ },
6
+ },
7
+ })
package/app/app.vue ADDED
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <UCustomApp />
3
+ </template>
@@ -0,0 +1,28 @@
1
+ @import 'tailwindcss';
2
+ @import '@nuxt/ui';
3
+
4
+ @layer base {
5
+ html,
6
+ body,
7
+ #__nuxt {
8
+ height: 100%;
9
+ isolation: isolate;
10
+ }
11
+
12
+ body {
13
+ background: var(--ui-color-neutral-50);
14
+ }
15
+
16
+ button:not(:disabled),
17
+ [role='button']:not(:disabled) {
18
+ cursor: pointer;
19
+ }
20
+
21
+ label:has(input[type='checkbox']:not(:disabled)) {
22
+ cursor: pointer;
23
+ }
24
+
25
+ fieldset > label {
26
+ cursor: pointer;
27
+ }
28
+ }
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts" generic="T">
2
+ defineProps<{
3
+ value: T
4
+ }>()
5
+
6
+ defineSlots<{
7
+ default: (props: { value: T }) => any
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <slot v-bind="{ value }" />
13
+ </template>
@@ -0,0 +1,102 @@
1
+ <script setup lang="ts">
2
+ import type { ButtonProps, NavigationMenuItem } from '@nuxt/ui'
3
+
4
+ defineProps<{
5
+ sidebar?: {
6
+ logo?: {
7
+ src?: string
8
+ iconSrc?: string
9
+ }
10
+ items?: NavigationMenuItem[]
11
+ bottomItems?: NavigationMenuItem[]
12
+ userMenu?: {
13
+ name: string
14
+ avatarSrc?: string
15
+ }
16
+ }
17
+ navbar?: {
18
+ title?: string
19
+ }
20
+ toolbar?: {
21
+ items?: NavigationMenuItem[]
22
+ itemsEnd?: NavigationMenuItem[]
23
+ }
24
+ container?: boolean
25
+ }>()
26
+
27
+ defineSlots<{
28
+ default: any
29
+ }>()
30
+
31
+ const config = useRuntimeConfig()
32
+ </script>
33
+
34
+ <template>
35
+ <UDashboardGroup storage="local" :storage-key="`${config.public.projectId}-dashboard`" unit="rem">
36
+ <UDashboardSidebar v-if="sidebar" collapsible resizable class="bg-white" mode="drawer">
37
+ <template v-if="sidebar.logo?.src || sidebar.logo?.iconSrc" #header="{ collapsed }">
38
+ <img
39
+ v-if="!collapsed && sidebar.logo.src"
40
+ class="h-5 w-auto shrink-0"
41
+ :src="sidebar.logo.src"
42
+ />
43
+ <img
44
+ v-if="(collapsed || !sidebar.logo.src) && sidebar.logo.iconSrc"
45
+ class="size-5"
46
+ :src="sidebar.logo.iconSrc"
47
+ :class="{
48
+ 'mx-auto': collapsed,
49
+ }"
50
+ />
51
+ </template>
52
+ <template #default="{ collapsed }">
53
+ <UNavigationMenu
54
+ v-if="sidebar.items"
55
+ :collapsed="collapsed"
56
+ :items="sidebar.items"
57
+ orientation="vertical"
58
+ />
59
+
60
+ <UNavigationMenu
61
+ v-if="sidebar.bottomItems"
62
+ :collapsed="collapsed"
63
+ :items="sidebar.bottomItems"
64
+ orientation="vertical"
65
+ class="mt-auto"
66
+ />
67
+ </template>
68
+ <template v-if="sidebar.userMenu" #footer="{ collapsed }">
69
+ <UButton
70
+ :label="collapsed ? undefined : sidebar.userMenu.name"
71
+ :avatar="{
72
+ src: sidebar.userMenu.avatarSrc,
73
+ alt: sidebar.userMenu.name,
74
+ }"
75
+ color="neutral"
76
+ variant="ghost"
77
+ class="w-full"
78
+ :block="collapsed"
79
+ />
80
+ </template>
81
+ </UDashboardSidebar>
82
+ <UDashboardPanel>
83
+ <template #header>
84
+ <UDashboardNavbar v-if="navbar" class="bg-white" :title="navbar.title">
85
+ <template #leading>
86
+ <UDashboardSidebarCollapse />
87
+ </template>
88
+ </UDashboardNavbar>
89
+ <UDashboardToolbar v-if="toolbar" class="bg-white">
90
+ <UNavigationMenu :items="toolbar.items" highlight />
91
+ <UNavigationMenu :items="toolbar.itemsEnd" class="ml-auto" highlight />
92
+ </UDashboardToolbar>
93
+ </template>
94
+ <template #body>
95
+ <UContainer v-if="container">
96
+ <slot />
97
+ </UContainer>
98
+ <slot v-else />
99
+ </template>
100
+ </UDashboardPanel>
101
+ </UDashboardGroup>
102
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { ButtonProps } from '@nuxt/ui'
3
+ import { UModal } from '#components'
4
+
5
+ defineProps<{
6
+ actions: ButtonProps[]
7
+ title: string
8
+ description?: string
9
+ }>()
10
+ </script>
11
+
12
+ <template>
13
+ <UModal :title :description :ui="{ content: 'max-w-fit', footer: 'flex flex-col gap-4' }">
14
+ <template #footer>
15
+ <UButton
16
+ v-for="action of actions"
17
+ :key="action.label"
18
+ variant="subtle"
19
+ class="w-full justify-center"
20
+ size="xl"
21
+ v-bind="action"
22
+ />
23
+ </template>
24
+ </UModal>
25
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ defineProps<{
3
+ title: string
4
+ description: string
5
+ submitLabel: string
6
+ }>()
7
+
8
+ const emit = defineEmits<{ close: [boolean] }>()
9
+ </script>
10
+
11
+ <template>
12
+ <UModal :close="{ onClick: () => emit('close', false) }" :title :description class="max-w-sm">
13
+ <template #footer>
14
+ <div class="flex w-full justify-end gap-2">
15
+ <UButton
16
+ variant="ghost"
17
+ color="neutral"
18
+ label="Abbrechen"
19
+ @click="() => emit('close', false)"
20
+ />
21
+ <UButton :label="submitLabel" color="error" @click="() => emit('close', true)" />
22
+ </div>
23
+ </template>
24
+ </UModal>
25
+ </template>
@@ -0,0 +1,37 @@
1
+ <script setup lang="ts" generic="T extends Extract<RadioGroupItem, object>">
2
+ import type { GetItemValue, NestedItem, RadioGroupItem } from '#ui/types'
3
+ import { UModal } from '#components'
4
+
5
+ const props = defineProps<{
6
+ items: T[]
7
+ defaultValue: GetItemValue<T[], 'value', NestedItem<T>>
8
+ title: string
9
+ submitButtonLabel: string
10
+ description?: string
11
+ }>()
12
+
13
+ const emit = defineEmits<{
14
+ close: [value: T['value'] | undefined]
15
+ }>()
16
+
17
+ const selectedValue = ref(props.defaultValue)
18
+ </script>
19
+
20
+ <template>
21
+ <UModal :title :description>
22
+ <template #body>
23
+ <div class="flex flex-col gap-4">
24
+ <URadioGroup v-model="selectedValue" variant="table" :items />
25
+ <div class="flex w-full justify-end gap-4">
26
+ <UButton
27
+ label="Abbrechen"
28
+ variant="ghost"
29
+ color="neutral"
30
+ @click="() => emit('close', undefined)"
31
+ />
32
+ <UButton :label="submitButtonLabel" @click="() => emit('close', selectedValue)" />
33
+ </div>
34
+ </div>
35
+ </template>
36
+ </UModal>
37
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { ButtonProps } from '@nuxt/ui'
3
+
4
+ defineProps<{
5
+ actions?: ButtonProps[]
6
+ defaults?: Partial<ButtonProps>
7
+ }>()
8
+
9
+ function getActionKey(action: ButtonProps) {
10
+ return action.label || action.icon
11
+ }
12
+ </script>
13
+
14
+ <template>
15
+ <div v-if="actions" class="flex gap-4">
16
+ <UButton
17
+ v-for="action of actions"
18
+ :key="getActionKey(action)"
19
+ v-bind="{ ...defaults, ...action }"
20
+ />
21
+ </div>
22
+ <div v-else />
23
+ </template>
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import type { AppProps } from '@nuxt/ui'
3
+ import { useForwardProps } from 'reka-ui'
4
+
5
+ const props = defineProps<{
6
+ app?: AppProps
7
+ }>()
8
+
9
+ const forwarded = useForwardProps(props)
10
+
11
+ const config = useRuntimeConfig()
12
+ </script>
13
+
14
+ <template>
15
+ <UApp v-bind="forwarded.app" :nonce="config.public.projectId">
16
+ <NuxtLayout>
17
+ <NuxtPage />
18
+ </NuxtLayout>
19
+ </UApp>
20
+ </template>
@@ -0,0 +1,55 @@
1
+ <script setup lang="ts" generic="T">
2
+ import type { FormField } from '@falcondev-oss/form-core'
3
+ import type { FormFieldProps } from '@nuxt/ui'
4
+ import type { ModelModifiers } from '@nuxt/ui/runtime/types/input.js'
5
+ import { useForwardProps } from 'reka-ui'
6
+
7
+ type FieldSlotProps<T> = {
8
+ 'modelValue': T
9
+ 'onUpdate:modelValue': (value: T) => void
10
+ 'onBlur': () => void
11
+ 'disabled': boolean
12
+ 'loading': boolean
13
+ 'modelModifiers'?: Pick<ModelModifiers, 'nullable'>
14
+ }
15
+
16
+ const props = defineProps<
17
+ FormFieldProps & {
18
+ field: FormField<T>
19
+ }
20
+ >()
21
+ defineSlots<{
22
+ default: (props: Omit<FieldSlotProps<T>, 'modelModifiers'>) => any
23
+ }>()
24
+
25
+ const forwardedProps = useForwardProps(props)
26
+
27
+ const formFieldProps = computed(() => {
28
+ const { field, ...rest } = forwardedProps.value
29
+
30
+ return rest
31
+ })
32
+
33
+ const slotProps = computed(
34
+ () =>
35
+ ({
36
+ 'modelValue': forwardedProps.value.field.value,
37
+ 'onUpdate:modelValue': (value) => forwardedProps.value.field.handleChange(value),
38
+ 'onBlur': () => forwardedProps.value.field.handleBlur(),
39
+ 'disabled': forwardedProps.value.field.disabled,
40
+ 'loading': forwardedProps.value.field.isPending,
41
+ 'modelModifiers': {
42
+ nullable: true,
43
+ },
44
+ }) satisfies FieldSlotProps<T>,
45
+ )
46
+ </script>
47
+
48
+ <template>
49
+ <UFormField
50
+ v-bind="formFieldProps"
51
+ :error="forwardedProps.field.errors && forwardedProps.field.errors.join('\n')"
52
+ >
53
+ <slot v-bind="slotProps" />
54
+ </UFormField>
55
+ </template>
@@ -0,0 +1,35 @@
1
+ <script setup lang="ts">
2
+ import { useImage } from '@vueuse/core'
3
+
4
+ const props = defineProps<{
5
+ src?: string
6
+ alt?: string
7
+ fallbackSrc?: string
8
+ }>()
9
+
10
+ defineSlots<{
11
+ default: () => any
12
+ }>()
13
+
14
+ const { error, isReady } = props.src
15
+ ? useImage(() => ({
16
+ src: props.src ?? '',
17
+ }))
18
+ : {
19
+ isReady: false,
20
+ error: true,
21
+ }
22
+ </script>
23
+
24
+ <template>
25
+ <img v-if="isReady" :src="src" :alt="alt" />
26
+ <USkeleton v-else-if="!error" />
27
+ <div v-else>
28
+ <slot name="default">
29
+ <!-- eslint-disable-next-line vue/no-duplicate-attr-inheritance -->
30
+ <img v-if="fallbackSrc" :src="fallbackSrc" v-bind="$attrs" />
31
+ <!-- eslint-disable-next-line vue/no-duplicate-attr-inheritance -->
32
+ <USkeleton v-else v-bind="$attrs" />
33
+ </slot>
34
+ </div>
35
+ </template>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import type { DateValue } from '@internationalized/date'
3
+
4
+ const inputDate = useTemplateRef('inputDate')
5
+
6
+ const model = defineModel<DateValue | null>({ required: true })
7
+ const open = ref(false)
8
+ </script>
9
+
10
+ <template>
11
+ <UInputDate ref="inputDate" v-model="model">
12
+ <template #trailing>
13
+ <UPopover v-model:open="open" :reference="inputDate?.inputsRef[3]?.$el">
14
+ <UButton
15
+ color="neutral"
16
+ variant="link"
17
+ size="sm"
18
+ icon="i-lucide-calendar"
19
+ aria-label="Datum auswählen"
20
+ class="px-0"
21
+ />
22
+
23
+ <template #content>
24
+ <UCalendar
25
+ :model-value="model ?? undefined"
26
+ :multiple="false"
27
+ :range="false"
28
+ class="p-2"
29
+ @update:model-value="
30
+ (val) => {
31
+ model = val ?? null
32
+ open = false
33
+ }
34
+ "
35
+ />
36
+ </template>
37
+ </UPopover>
38
+ </template>
39
+ </UInputDate>
40
+ </template>