@xy-planning-network/trees 0.4.0-rc-8 → 0.4.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 (36) hide show
  1. package/README.md +234 -41
  2. package/dist/trees.es.js +224 -217
  3. package/dist/trees.umd.js +4 -4
  4. package/package.json +4 -2
  5. package/src/lib-components/forms/BaseInput.vue +83 -0
  6. package/src/lib-components/forms/Checkbox.vue +46 -0
  7. package/src/lib-components/forms/DateRangePicker.vue +65 -0
  8. package/src/lib-components/forms/InputHelp.vue +24 -0
  9. package/src/lib-components/forms/InputLabel.vue +23 -0
  10. package/src/lib-components/forms/MultiCheckboxes.vue +55 -0
  11. package/src/lib-components/forms/Radio.vue +58 -0
  12. package/src/lib-components/forms/Select.vue +65 -0
  13. package/src/lib-components/forms/TextArea.vue +50 -0
  14. package/src/lib-components/forms/Toggle.vue +25 -0
  15. package/src/lib-components/forms/YesOrNoRadio.vue +70 -0
  16. package/src/lib-components/layout/DateFilter.vue +54 -0
  17. package/src/lib-components/layout/SidebarLayout.vue +239 -0
  18. package/src/lib-components/layout/StackedLayout.vue +172 -0
  19. package/src/lib-components/lists/Cards.vue +33 -0
  20. package/src/lib-components/lists/DetailList.vue +114 -0
  21. package/src/lib-components/lists/DownloadCell.vue +12 -0
  22. package/src/lib-components/lists/StaticTable.vue +83 -0
  23. package/src/lib-components/lists/Table.vue +291 -0
  24. package/src/lib-components/navigation/ActionsDropdown.vue +78 -0
  25. package/src/lib-components/navigation/Paginator.vue +115 -0
  26. package/src/lib-components/navigation/Steps.vue +83 -0
  27. package/src/lib-components/navigation/Tabs.vue +92 -0
  28. package/src/lib-components/overlays/ContentModal.vue +95 -0
  29. package/src/lib-components/overlays/Flash.vue +131 -0
  30. package/src/lib-components/overlays/Modal.vue +133 -0
  31. package/src/lib-components/overlays/Slideover.vue +87 -0
  32. package/src/lib-components/overlays/Spinner.vue +149 -0
  33. package/types/composables/nav.d.ts +2 -2
  34. package/types/composables/table.d.ts +2 -2
  35. package/types/composables/user.d.ts +1 -4
  36. package/types/lib-components/forms/Select.vue.d.ts +2 -2
@@ -0,0 +1,95 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ Dialog,
4
+ DialogOverlay,
5
+ DialogTitle,
6
+ TransitionChild,
7
+ TransitionRoot,
8
+ } from "@headlessui/vue"
9
+
10
+ withDefaults(
11
+ defineProps<{
12
+ modelValue: boolean
13
+ title?: string
14
+ }>(),
15
+ {
16
+ title: "",
17
+ }
18
+ )
19
+
20
+ const emit = defineEmits<{
21
+ (e: "update:modelValue", val: boolean): void
22
+ }>()
23
+
24
+ const updateModelValue = (value: boolean) => {
25
+ emit("update:modelValue", value)
26
+ }
27
+ </script>
28
+ <template>
29
+ <TransitionRoot as="template" :show="modelValue">
30
+ <Dialog
31
+ as="div"
32
+ static
33
+ class="fixed z-10 inset-0 overflow-y-auto"
34
+ @close="updateModelValue(false)"
35
+ :open="modelValue"
36
+ >
37
+ <div
38
+ class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"
39
+ >
40
+ <TransitionChild
41
+ as="template"
42
+ enter="ease-out duration-300"
43
+ enter-from="opacity-0"
44
+ enter-to="opacity-100"
45
+ leave="ease-in duration-200"
46
+ leave-from="opacity-100"
47
+ leave-to="opacity-0"
48
+ >
49
+ <DialogOverlay
50
+ class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"
51
+ />
52
+ </TransitionChild>
53
+
54
+ <!-- This element is to trick the browser into centering the modal contents. -->
55
+ <span
56
+ class="hidden sm:inline-block sm:align-middle sm:h-screen"
57
+ aria-hidden="true"
58
+ >&#8203;</span
59
+ >
60
+ <TransitionChild
61
+ as="template"
62
+ enter="ease-out duration-300"
63
+ enter-from="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
64
+ enter-to="opacity-100 translate-y-0 sm:scale-100"
65
+ leave="ease-in duration-200"
66
+ leave-from="opacity-100 translate-y-0 sm:scale-100"
67
+ leave-to="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
68
+ >
69
+ <div
70
+ class="inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-sm sm:w-full sm:p-6"
71
+ >
72
+ <div>
73
+ <slot name="icon"></slot>
74
+ <div class="mt-3 text-center sm:mt-5">
75
+ <DialogTitle as="h3" v-text="title"></DialogTitle>
76
+ <div class="mt-2">
77
+ <slot></slot>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ <div class="mt-5 sm:mt-6">
82
+ <button
83
+ type="button"
84
+ class="inline-flex justify-center w-full xy-btn"
85
+ @click="updateModelValue(false)"
86
+ >
87
+ Go back
88
+ </button>
89
+ </div>
90
+ </div>
91
+ </TransitionChild>
92
+ </div>
93
+ </Dialog>
94
+ </TransitionRoot>
95
+ </template>
@@ -0,0 +1,131 @@
1
+ <script setup lang="ts">
2
+ import { Flash } from "@/composables/overlay"
3
+ import { onMounted, ref } from "vue"
4
+
5
+ // TODO: spk this might benefit from the composition api to avoid race conditions where a flash is requested before the component is mounted.
6
+
7
+ const flashes = ref<Flash[]>([])
8
+ const flashTypeBorderClass = {
9
+ warning: "border-orange-500",
10
+ error: "border-red-500",
11
+ info: "border-blue-500",
12
+ success: "border-green-500",
13
+ }
14
+
15
+ const getFlashClass = (flash: Flash): string => {
16
+ const availableTypes = Object.keys(flashTypeBorderClass)
17
+ // default the flash type to "info" if no flash type or an unsupported flash.type is found
18
+ const type =
19
+ flash?.type && availableTypes.includes(flash.type)
20
+ ? (flash.type as "warning" | "error" | "info" | "success")
21
+ : "info"
22
+ return flashTypeBorderClass[type]
23
+ }
24
+
25
+ const remove = (flash: Flash): void => {
26
+ let index = 0
27
+ for (const f of flashes.value) {
28
+ if (flash.message === f.message) {
29
+ flashes.value.splice(index, 1)
30
+ return
31
+ }
32
+ index++
33
+ }
34
+ }
35
+ const renderFlash = (flash: Flash): void => {
36
+ flashes.value.push(flash)
37
+ // Super simple flash implementation. This could get "smarter" by adding an
38
+ // id to the flash object, and then searching for the specific flash in the
39
+ // array and splicing, instead of simply doing a pop().
40
+ setTimeout(
41
+ (flashes: Flash[]) => {
42
+ flashes.pop()
43
+ },
44
+ 10000,
45
+ flashes.value
46
+ )
47
+ }
48
+
49
+ const renderGenericError = (email: string): void => {
50
+ renderFlash({
51
+ type: "error",
52
+ message:
53
+ "Whoops! Something went wrong, please reach out to " +
54
+ `<a class="underline text-xy-blue" href="mailto:${email}">${email}</a>` +
55
+ " if the issue persists.",
56
+ })
57
+ }
58
+
59
+ onMounted(() => {
60
+ window.VueBus.on("Flash-show-message", (flash) => {
61
+ renderFlash(flash)
62
+ })
63
+
64
+ window.VueBus.on("Flash-show-generic-error", (email) => {
65
+ renderGenericError(email)
66
+ })
67
+
68
+ if (window.Flashes) {
69
+ for (const flash of window.Flashes) {
70
+ if (typeof flash.type === "undefined") {
71
+ const values: string[] = flash.message.split(": ")
72
+ renderFlash({ type: values[0], message: values[1] })
73
+ return
74
+ }
75
+ renderFlash({ type: flash.type, message: flash.message })
76
+ }
77
+ }
78
+ })
79
+ </script>
80
+ <template>
81
+ <div
82
+ class="fixed inset-0 flex flex-col items-end justify-end px-4 py-6 pointer-events-none sm:p-6 z-40"
83
+ >
84
+ <transition-group
85
+ tag="div"
86
+ class="max-w-sm w-full"
87
+ enter-active-class="ease-out duration-300"
88
+ enter-from-class="translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2"
89
+ enter-to-class="translate-y-0 opacity-100 sm:translate-x-0"
90
+ leave-active-class="ease-in duration-100"
91
+ leave-from-class="opacity-100"
92
+ leave-to-class="opacity-0"
93
+ >
94
+ <div
95
+ v-for="(flash, idx) in flashes"
96
+ :key="flash.message"
97
+ class="bg-white shadow-lg rounded-lg pointer-events-auto border-t-4 transform"
98
+ :class="[{ 'mt-2': idx > 0 }, getFlashClass(flash)]"
99
+ >
100
+ <div
101
+ class="rounded-lg ring-1 ring-black ring-opacity-5 overflow-hidden"
102
+ >
103
+ <div class="p-4">
104
+ <div class="flex items-center">
105
+ <div class="w-0 flex-1 flex justify-between">
106
+ <p
107
+ class="w-0 flex-1 text-sm leading-5 font-medium text-gray-900"
108
+ v-html="flash.message"
109
+ ></p>
110
+ </div>
111
+ <div class="ml-4 flex-shrink-0 flex">
112
+ <button
113
+ @click="remove(flash)"
114
+ class="inline-flex text-gray-400 focus:outline-none focus:text-gray-500 transition ease-in-out duration-150"
115
+ >
116
+ <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
117
+ <path
118
+ fill-rule="evenodd"
119
+ d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
120
+ clip-rule="evenodd"
121
+ />
122
+ </svg>
123
+ </button>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </transition-group>
130
+ </div>
131
+ </template>
@@ -0,0 +1,133 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ Dialog,
4
+ DialogOverlay,
5
+ DialogTitle,
6
+ TransitionChild,
7
+ TransitionRoot,
8
+ } from "@headlessui/vue"
9
+ import { XIcon } from "@heroicons/vue/outline"
10
+
11
+ withDefaults(
12
+ defineProps<{
13
+ destructive?: boolean
14
+ disabled?: boolean
15
+ modelValue: boolean
16
+ submitText?: string
17
+ title?: string
18
+ }>(),
19
+ {
20
+ destructive: false,
21
+ disabled: false,
22
+ submitText: "",
23
+ title: "",
24
+ }
25
+ )
26
+
27
+ const emit = defineEmits<{
28
+ (e: "submit"): void
29
+ (e: "update:modelValue", val: boolean): void
30
+ }>()
31
+
32
+ const submit = () => {
33
+ emit("submit")
34
+ }
35
+
36
+ const updateModelValue = (value: boolean) => {
37
+ emit("update:modelValue", value)
38
+ }
39
+ </script>
40
+ <template>
41
+ <TransitionRoot as="template" :show="modelValue">
42
+ <Dialog
43
+ as="div"
44
+ static
45
+ class="fixed z-10 inset-0 overflow-y-auto"
46
+ @close="updateModelValue(false)"
47
+ :open="modelValue"
48
+ >
49
+ <div
50
+ class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"
51
+ >
52
+ <TransitionChild
53
+ as="template"
54
+ enter="ease-out duration-300"
55
+ enter-from="opacity-0"
56
+ enter-to="opacity-100"
57
+ leave="ease-in duration-200"
58
+ leave-from="opacity-100"
59
+ leave-to="opacity-0"
60
+ >
61
+ <DialogOverlay
62
+ class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"
63
+ />
64
+ </TransitionChild>
65
+
66
+ <!-- This element is to trick the browser into centering the modal contents. -->
67
+ <span
68
+ class="hidden sm:inline-block sm:align-middle sm:h-screen"
69
+ aria-hidden="true"
70
+ >&#8203;</span
71
+ >
72
+ <TransitionChild
73
+ as="template"
74
+ enter="ease-out duration-300"
75
+ enter-from="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
76
+ enter-to="opacity-100 translate-y-0 sm:scale-100"
77
+ leave="ease-in duration-200"
78
+ leave-from="opacity-100 translate-y-0 sm:scale-100"
79
+ leave-to="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
80
+ >
81
+ <div
82
+ class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl w-full"
83
+ >
84
+ <div class="block absolute top-0 right-0 pt-4 pr-4">
85
+ <button
86
+ type="button"
87
+ class="bg-white rounded-md text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
88
+ @click="updateModelValue(false)"
89
+ >
90
+ <span class="sr-only">Close</span>
91
+ <XIcon class="h-6 w-6" aria-hidden="true" />
92
+ </button>
93
+ </div>
94
+ <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
95
+ <div class="mt-3 sm:mt-0 sm:text-left">
96
+ <DialogTitle
97
+ as="h3"
98
+ class="text-center text-lg leading-6 font-medium text-gray-900"
99
+ v-text="title"
100
+ ></DialogTitle>
101
+ <div class="mt-2">
102
+ <slot></slot>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ <div
107
+ class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse"
108
+ v-if="submitText"
109
+ >
110
+ <button
111
+ type="button"
112
+ class="xy-btn w-full sm:ml-3 sm:w-auto sm:text-sm"
113
+ @click="submit()"
114
+ v-text="submitText"
115
+ :class="[destructive ? 'xy-btn-red' : 'xy-btn']"
116
+ :disabled="disabled"
117
+ ></button>
118
+ <button
119
+ type="button"
120
+ class="xy-btn-white mt-3 w-full sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm"
121
+ @click="updateModelValue(false)"
122
+ ref="cancelButtonRef"
123
+ >
124
+ Cancel
125
+ </button>
126
+ </div>
127
+ <slot name="buttons"></slot>
128
+ </div>
129
+ </TransitionChild>
130
+ </div>
131
+ </Dialog>
132
+ </TransitionRoot>
133
+ </template>
@@ -0,0 +1,87 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ Dialog,
4
+ DialogOverlay,
5
+ DialogTitle,
6
+ TransitionChild,
7
+ TransitionRoot,
8
+ } from "@headlessui/vue"
9
+ import { XIcon } from "@heroicons/vue/outline"
10
+ import { ref } from "vue"
11
+
12
+ const props = defineProps<{
13
+ header: string
14
+ description: string
15
+ modelValue: boolean
16
+ }>()
17
+
18
+ const open = ref(props.modelValue)
19
+
20
+ const emit = defineEmits<{
21
+ (e: "close", val: boolean): void
22
+ (e: "update:modelValue", val: boolean): void
23
+ }>()
24
+
25
+ const close = () => {
26
+ open.value = false
27
+ emit("close", open.value)
28
+ emit("update:modelValue", open.value)
29
+ }
30
+ </script>
31
+ <template>
32
+ <TransitionRoot as="template" :show="modelValue">
33
+ <Dialog
34
+ as="div"
35
+ static
36
+ class="fixed inset-0 z-40 overflow-hidden bg-black bg-opacity-50"
37
+ @close="close()"
38
+ :open="modelValue"
39
+ >
40
+ <div class="absolute inset-0 overflow-hidden">
41
+ <DialogOverlay class="absolute inset-0" />
42
+
43
+ <div class="fixed inset-y-0 right-0 pl-10 max-w-full flex">
44
+ <TransitionChild
45
+ as="template"
46
+ enter="transform transition ease-in-out duration-500 sm:duration-700"
47
+ enter-from="translate-x-full"
48
+ enter-to="translate-x-0"
49
+ leave="transform transition ease-in-out duration-500 sm:duration-700"
50
+ leave-from="translate-x-0"
51
+ leave-to="translate-x-full"
52
+ >
53
+ <div class="w-screen max-w-md">
54
+ <div
55
+ class="h-full flex flex-col bg-white shadow-xl overflow-y-scroll"
56
+ >
57
+ <div class="py-6 px-4 bg-blue-700 sm:px-6">
58
+ <div class="flex items-center justify-between">
59
+ <DialogTitle as="h3" class="text-white" v-text="header">
60
+ </DialogTitle>
61
+ <div class="ml-3 h-7 flex items-center">
62
+ <button
63
+ class="bg-blue-700 rounded-md text-blue-200 hover:text-white focus:outline-none focus:ring-2 focus:ring-white"
64
+ @click="close()"
65
+ >
66
+ <span class="sr-only">Close panel</span>
67
+ <XIcon class="h-6 w-6" aria-hidden="true" />
68
+ </button>
69
+ </div>
70
+ </div>
71
+ <div class="mt-1">
72
+ <p class="text-blue-300" v-text="description"></p>
73
+ </div>
74
+ </div>
75
+ <div class="relative flex-1 py-6 px-4 sm:px-6">
76
+ <slot></slot>
77
+ </div>
78
+
79
+ <slot name="footer"></slot>
80
+ </div>
81
+ </div>
82
+ </TransitionChild>
83
+ </div>
84
+ </div>
85
+ </Dialog>
86
+ </TransitionRoot>
87
+ </template>
@@ -0,0 +1,149 @@
1
+ <script setup lang="ts">
2
+ import { onMounted, ref } from "vue"
3
+ // TODO: spk this may benefit from composition api
4
+
5
+ const idx = ref(0)
6
+ const loading = ref(false)
7
+ const maxIdx = ref(0)
8
+ const messages = ref<string[]>([])
9
+ const msg = ref("")
10
+ const showMsg = ref(false)
11
+
12
+ const fadeIn = (): void => {
13
+ idx.value++
14
+ if (idx.value > maxIdx.value) {
15
+ idx.value = 0
16
+ }
17
+ if (messages.value) {
18
+ msg.value = messages.value[idx.value]
19
+ }
20
+ showMsg.value = true
21
+ }
22
+
23
+ const fadeOut = (): void => {
24
+ window.setTimeout(() => {
25
+ showMsg.value = false
26
+ }, 2500)
27
+ }
28
+
29
+ onMounted(() => {
30
+ window.VueBus.on("Spinner-show", (spinMessages) => {
31
+ if (spinMessages) {
32
+ messages.value = spinMessages
33
+ maxIdx.value = spinMessages.length - 1
34
+ msg.value = messages.value[idx.value]
35
+ showMsg.value = true
36
+ }
37
+ loading.value = true
38
+ })
39
+
40
+ window.VueBus.on("Spinner-hide", () => {
41
+ idx.value = 0
42
+ maxIdx.value = 0
43
+ messages.value = []
44
+ msg.value = ""
45
+ loading.value = false
46
+ })
47
+ })
48
+ </script>
49
+ <template>
50
+ <div
51
+ class="fixed top-0 left-0 flex items-center justify-center w-full h-full cursor-not-allowed z-50 bg-gray-50 bg-opacity-50"
52
+ v-if="loading"
53
+ >
54
+ <div>
55
+ <div class="flex justify-center">
56
+ <div class="animate-spin-gear">
57
+ <svg
58
+ width="129px"
59
+ height="129px"
60
+ viewBox="0 0 129 129"
61
+ version="1.1"
62
+ xmlns="http://www.w3.org/2000/svg"
63
+ xmlns:xlink="http://www.w3.org/1999/xlink"
64
+ >
65
+ <title>Group 6 Copy 3</title>
66
+ <defs>
67
+ <polygon
68
+ id="path-1"
69
+ points="0.000248076923 0.48676924 128.472837 0.48676924 128.472837 128.800648 0.000248076923 128.800648"
70
+ ></polygon>
71
+ </defs>
72
+ <g
73
+ id="Page-1"
74
+ stroke="none"
75
+ stroke-width="1"
76
+ fill="none"
77
+ fill-rule="evenodd"
78
+ >
79
+ <g id="Group-6-Copy-3">
80
+ <g id="Group-3">
81
+ <mask id="mask-2" fill="white">
82
+ <use xlink:href="#path-1"></use>
83
+ </mask>
84
+ <g id="Clip-2"></g>
85
+ <path
86
+ d="M86.3955173,100.279324 C86.3955173,100.279324 79.4778923,106.213874 64.2360462,106.755809 C48.9954404,106.213874 42.0778154,100.279324 42.0778154,100.279324 C11.8756904,81.4963011 25.2309115,49.088357 25.2309115,49.088357 C36.5680269,24.1350542 59.1839596,22.5554236 63.8105942,22.4983139 L63.8105942,22.5043894 C63.8105942,22.5043894 63.9681231,22.4983139 64.2360462,22.4958837 C64.5052096,22.4983139 64.6627385,22.5043894 64.6627385,22.5043894 L64.6627385,22.4983139 C69.2881327,22.5554236 91.9053058,24.1350542 103.241181,49.088357 C103.241181,49.088357 116.596402,81.4963011 86.3955173,100.279324 L86.3955173,100.279324 Z M128.473085,68.8191581 L128.473085,60.4677727 L117.036738,58.80187 L115.10794,49.3726905 L124.970238,43.4186983 L121.675777,35.7307578 L110.49619,38.6214817 L106.161046,32.1486416 L113.220075,23.080347 L107.361738,17.0716753 L97.9645846,23.7437918 L89.14545,17.842049 L91.8693346,6.72144964 L84.04995,3.59378109 L78.2114596,13.4628269 L69.5907865,11.8127205 L67.908825,0.48676924 L64.6627385,0.48676924 L63.8105942,0.48676924 L60.5645077,0.48676924 L58.8813058,11.8127205 L50.2618731,13.4628269 L44.4233827,3.59378109 L36.6039981,6.72144964 L39.3278827,17.842049 L30.5087481,23.7437918 L21.1103538,17.0716753 L15.2520173,23.080347 L22.3122865,32.1486416 L17.9771423,38.6214817 L6.79755577,35.7307578 L3.50185385,43.4186983 L13.3641519,49.3726905 L11.4365942,58.80187 L0.000248076923,60.4677727 L0.000248076923,68.8191581 L11.4365942,70.4850608 L13.1036712,79.0223566 L3.13718077,84.8050196 L6.29644038,92.5488548 L17.5244019,89.8513318 L23.4832096,98.5854738 L16.7466808,107.893143 L22.8134019,113.695248 L31.9699212,106.70356 L38.5067481,110.99651 L35.5881231,122.068505 L43.35045,125.332265 L49.3625942,115.565287 L58.8813058,117.47421 L60.5645077,128.801377 L63.6927577,128.801377 L64.780575,128.801377 L67.908825,128.801377 L69.5907865,117.47421 L79.1107385,115.565287 L85.1228827,125.332265 L92.8852096,122.068505 L89.9665846,110.99651 L96.5034115,106.70356 L105.659931,113.695248 L111.725412,107.893143 L104.988883,98.5854738 L110.94769,89.8513318 L122.175652,92.5488548 L125.334912,84.8050196 L115.369662,79.0223566 L117.035498,70.4850608 L128.473085,68.8191581 Z"
87
+ id="Fill-1"
88
+ fill="#51A749"
89
+ mask="url(#mask-2)"
90
+ ></path>
91
+ </g>
92
+ </g>
93
+ </g>
94
+ </svg>
95
+ </div>
96
+ <div class="absolute">
97
+ <svg
98
+ class="mt-8"
99
+ width="70px"
100
+ height="70px"
101
+ viewBox="0 0 53 32"
102
+ version="1.1"
103
+ xmlns="http://www.w3.org/2000/svg"
104
+ xmlns:xlink="http://www.w3.org/1999/xlink"
105
+ >
106
+ <title>Group 3 Copy</title>
107
+ <g
108
+ id="Page-1"
109
+ stroke="none"
110
+ stroke-width="1"
111
+ fill="none"
112
+ fill-rule="evenodd"
113
+ >
114
+ <g id="Group-3-Copy">
115
+ <polygon
116
+ id="Fill-1"
117
+ fill="#1F6DF4"
118
+ points="0.7994 0.3999 11.2214 16.0009 0.7994 31.5999 11.2214 31.5999 16.4004 24.0149 21.1934 31.5999 31.9994 31.5999 21.4254 15.7449 26.0064 9.1719 20.6194 1.3729 16.1554 7.9149 11.2214 0.3999"
119
+ ></polygon>
120
+ <polygon
121
+ id="Fill-2"
122
+ fill="#51A749"
123
+ points="41.978 0.3999 36.799 7.6269 32.006 0.3999 21.2 0.3999 31.775 15.5069 27.194 21.7689 32.27 29.1999 52.4 0.3999"
124
+ ></polygon>
125
+ </g>
126
+ </g>
127
+ </svg>
128
+ </div>
129
+ </div>
130
+ <div v-show="messages">
131
+ <transition
132
+ appear
133
+ enter-active-class="ease-out duration-1000"
134
+ enter-from-class="opacity-0"
135
+ enter-to-class="opacity-100"
136
+ leave-active-class="ease-in duration-500"
137
+ leave-from-class="opacity-100"
138
+ leave-to-class="opacity-0"
139
+ @after-enter="fadeOut"
140
+ @after-leave="fadeIn"
141
+ >
142
+ <div class="text-center transition-opacity" v-show="showMsg">
143
+ {{ msg }}
144
+ </div>
145
+ </transition>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </template>
@@ -1,6 +1,6 @@
1
- import { DefineComponent, RenderFunction } from "vue";
1
+ import { Component, RenderFunction } from "vue";
2
2
  export interface Item {
3
- icon?: DefineComponent<unknown, unknown, any> | RenderFunction;
3
+ icon?: Component | RenderFunction;
4
4
  name: string;
5
5
  openInTab?: boolean;
6
6
  url: string;
@@ -1,11 +1,11 @@
1
- import { ComponentPublicInstance, DefineComponent } from "vue";
1
+ import { Component, ComponentPublicInstance } from "vue";
2
2
  import User from "../composables/user";
3
3
  export interface Column {
4
4
  display: string;
5
5
  class?: string;
6
6
  key?: string;
7
7
  presenter?(row: any, instance: ComponentPublicInstance): any;
8
- component?: DefineComponent<unknown, unknown, any>;
8
+ component?: Component;
9
9
  items?: Array<MenuItem>;
10
10
  sort?: string;
11
11
  }
@@ -1,9 +1,6 @@
1
1
  export interface User {
2
- accountID: number;
3
- accountOwner: boolean;
4
- archived: boolean;
5
2
  id: number;
6
3
  email: string;
7
- name: string;
4
+ name?: string;
8
5
  }
9
6
  export default User;
@@ -41,12 +41,12 @@ declare const _default: import("vue").DefineComponent<{
41
41
  modelValue: string | number | undefined;
42
42
  label: string;
43
43
  help: string;
44
+ design: "standard" | "compressed";
45
+ placeholder: string;
44
46
  options: {
45
47
  label: string;
46
48
  value: string | number;
47
49
  }[];
48
- design: "standard" | "compressed";
49
- placeholder: string;
50
50
  } & {}> & {
51
51
  "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
52
52
  }, {