@speckle/ui-components 2.16.1-alpha8 → 2.17.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.
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),n=require("@heroicons/vue/24/outline"),z=require("vue-advanced-cropper");require("vue-advanced-cropper/dist/style.css");const i=require("./lib.cjs"),c=require("vue-tippy");require("lodash");require("@heroicons/vue/24/solid");require("@heroicons/vue/20/solid");require("vee-validate");require("nanoid");require("@speckle/shared");require("@vueuse/core");require("@headlessui/vue");require("v3-infinite-loading");const q={class:"flex flex-col space-y-2"},R={class:"flex"},B={class:"flex mx-14 space-x-2"},_=e.createElementVNode("div",{class:"grow"},null,-1),F=e.defineComponent({__name:"AvatarEditor",props:{user:null,disabled:{type:Boolean},size:null},emits:["cancel","save"],setup(u,{emit:m}){const d=u,o=e.ref(null),f=e.ref(null),a=e.ref(null),r=e.ref(null),s=e.computed(()=>{switch(d.size){case"xs":return{width:64,height:64};case"xxl":return{width:140,height:140};case"editable":return{width:240,height:240};case"base":default:return{width:32,height:32}}}),h=t=>{r.value&&URL.revokeObjectURL(r.value),r.value=t},p=t=>{const l=t.files[0];l&&(a.value=l)},x=t=>{var l;return t?"border-primary":(l=a.value)!=null&&l.error?"border-danger":"border-outline-2"},g=()=>{var t;return(t=o.value)==null?void 0:t.rotate(-90)},C=()=>{var t;return(t=o.value)==null?void 0:t.rotate(90)},w=()=>{var t;return(t=o.value)==null?void 0:t.flip(1,0)},k=()=>{var t;return(t=o.value)==null?void 0:t.flip(0,1)},y=()=>{var t;return(t=f.value)==null?void 0:t.triggerPicker()},N=()=>{a.value=null,r.value=null},V=()=>{var l;const t=((l=o.value)==null?void 0:l.getResult().canvas.toDataURL("image/jpeg",.85))||null;m("save",t)};return e.onUnmounted(()=>{h(null)}),e.watch(()=>d.user.avatar,t=>{r.value=t||null},{immediate:!0}),e.watch(a,t=>{r.value=t!=null&&t.file&&!t.error?URL.createObjectURL(t.file):null},{deep:!0}),(t,l)=>(e.openBlock(),e.createElementBlock("div",q,[e.createElementVNode("div",R,[e.createElementVNode("div",{class:e.normalizeClass(["flex flex-col px-2 space-y-1",{invisible:!r.value}])},[e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.ArrowUturnLeftIcon),"hide-text":"",size:"sm",outlined:"",onClick:g},null,8,["icon-left"]),[[e.unref(c.directive),"Rotate left"]]),e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.ArrowUturnRightIcon),"hide-text":"",size:"sm",outlined:"",onClick:C},null,8,["icon-left"]),[[e.unref(c.directive),"Rotate right"]]),e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.ArrowUpOnSquareIcon),"hide-text":"",size:"sm",outlined:"",onClick:k},null,8,["icon-left"]),[[e.unref(c.directive),"Flip vertically"]]),e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.ArrowLeftOnRectangleIcon),"hide-text":"",size:"sm",outlined:"",onClick:w},null,8,["icon-left"]),[[e.unref(c.directive),"Flip horizontally"]])],2),r.value?(e.openBlock(),e.createBlock(e.unref(z.Cropper),{key:0,ref_key:"cropper",ref:o,class:"cropper",src:r.value,"stencil-props":{aspectRatio:1/1},canvas:s.value,style:e.normalizeStyle(`width: ${s.value.width}px; height: ${s.value.height}px`)},null,8,["src","canvas","style"])):e.createCommentVNode("",!0),e.createVNode(i.FormFileUploadZone,{ref_key:"uploadZone",ref:f,class:e.normalizeClass(["cropper flex items-center justify-center",{hidden:r.value}]),accept:"image/*","size-limit":5*1024*1024,onFilesSelected:p},{default:e.withCtx(({isDraggingFiles:v,activatorOn:b})=>[e.createElementVNode("div",e.mergeProps({class:["cursor-pointer text-center w-full h-full border-dashed border-2 rounded-md p-4 flex items-center justify-center text-sm text-foreground-2",[x(v)]]},e.toHandlers(b,!0))," Click here or drag and drop an image ",16)]),_:1},8,["class"]),e.createElementVNode("div",{class:e.normalizeClass(["flex flex-col px-2 space-y-1",{invisible:!r.value}])},[e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.PhotoIcon),"hide-text":"",size:"sm",onClick:y},null,8,["icon-left"]),[[e.unref(c.directive),"Replace image"]]),e.withDirectives(e.createVNode(i.FormButton,{"icon-left":e.unref(n.XMarkIcon),"hide-text":"",size:"sm",color:"danger",onClick:N},null,8,["icon-left"]),[[e.unref(c.directive),"Remove"]])],2)]),e.createElementVNode("div",B,[_,e.createVNode(i.FormButton,{color:"secondary",size:"sm",onClick:l[0]||(l[0]=v=>t.$emit("cancel"))},{default:e.withCtx(()=>[e.createTextVNode(" Close ")]),_:1}),e.createVNode(i.FormButton,{size:"sm",disabled:u.disabled,onClick:V},{default:e.withCtx(()=>[e.createTextVNode("Save")]),_:1},8,["disabled"])])]))}});exports.default=F;
2
+ //# sourceMappingURL=AvatarEditor-0cf61750.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarEditor-0cf61750.cjs","sources":["../src/components/user/AvatarEditor.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col space-y-2\">\n <div class=\"flex\">\n <div class=\"flex flex-col px-2 space-y-1\" :class=\"{ invisible: !activeImageUrl }\">\n <FormButton\n v-tippy=\"'Rotate left'\"\n :icon-left=\"ArrowUturnLeftIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"rotateLeft\"\n />\n <FormButton\n v-tippy=\"'Rotate right'\"\n :icon-left=\"ArrowUturnRightIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"rotateRight\"\n />\n <FormButton\n v-tippy=\"'Flip vertically'\"\n :icon-left=\"ArrowUpOnSquareIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"flipVertical\"\n />\n <FormButton\n v-tippy=\"'Flip horizontally'\"\n :icon-left=\"ArrowLeftOnRectangleIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"flipHorizontal\"\n />\n </div>\n <Cropper\n v-if=\"activeImageUrl\"\n ref=\"cropper\"\n class=\"cropper\"\n :src=\"activeImageUrl\"\n :stencil-props=\"{\n aspectRatio: 1 / 1\n }\"\n :canvas=\"canvasSize\"\n :style=\"`width: ${canvasSize.width}px; height: ${canvasSize.height}px`\"\n />\n <FormFileUploadZone\n ref=\"uploadZone\"\n v-slot=\"{ isDraggingFiles, activatorOn }\"\n class=\"cropper flex items-center justify-center\"\n :class=\"{ hidden: activeImageUrl }\"\n accept=\"image/*\"\n :size-limit=\"5 * 1024 * 1024\"\n @files-selected=\"onFilesSelected\"\n >\n <div\n class=\"cursor-pointer text-center w-full h-full border-dashed border-2 rounded-md p-4 flex items-center justify-center text-sm text-foreground-2\"\n :class=\"[getDashedBorderClasses(isDraggingFiles)]\"\n v-on=\"activatorOn\"\n >\n Click here or drag and drop an image\n </div>\n </FormFileUploadZone>\n <div class=\"flex flex-col px-2 space-y-1\" :class=\"{ invisible: !activeImageUrl }\">\n <FormButton\n v-tippy=\"'Replace image'\"\n :icon-left=\"PhotoIcon\"\n hide-text\n size=\"sm\"\n @click=\"onReplace\"\n />\n <FormButton\n v-tippy=\"'Remove'\"\n :icon-left=\"XMarkIcon\"\n hide-text\n size=\"sm\"\n color=\"danger\"\n @click=\"onRemove\"\n />\n </div>\n </div>\n <div class=\"flex mx-14 space-x-2\">\n <div class=\"grow\" />\n <FormButton color=\"secondary\" size=\"sm\" @click=\"$emit('cancel')\">\n Close\n </FormButton>\n <FormButton size=\"sm\" :disabled=\"disabled\" @click=\"onSave\">Save</FormButton>\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport {\n ArrowUturnLeftIcon,\n ArrowUturnRightIcon,\n ArrowLeftOnRectangleIcon,\n ArrowUpOnSquareIcon,\n XMarkIcon,\n PhotoIcon\n} from '@heroicons/vue/24/outline'\nimport { Nullable } from '@speckle/shared'\nimport { onUnmounted, ref, watch, computed } from 'vue'\nimport { Cropper } from 'vue-advanced-cropper'\nimport 'vue-advanced-cropper/dist/style.css'\nimport FormButton from '~~/src/components/form/Button.vue'\nimport FormFileUploadZone from '~~/src/components/form/file-upload/Zone.vue'\nimport { UploadableFileItem } from '~~/src/composables/form/fileUpload'\nimport { AvatarUser, UserAvatarSize } from '~~/src/composables/user/avatar'\nimport { directive as vTippy } from 'vue-tippy'\n\n/**\n * Always try to lazy load this, as it's quite heavy\n */\n\nconst emit = defineEmits([\"cancel\", \"save\"])\n\nconst props = defineProps({\n \"user\": null,\n \"disabled\": { type: Boolean, },\n \"size\": null\n})\n\nconst cropper = ref(\n null as Nullable<{\n flip: (x: number, y: number) => void\n rotate: (angle: number) => void\n getResult: () => { canvas: HTMLCanvasElement }\n }>\n)\nconst uploadZone = ref(null as Nullable<{ triggerPicker: () => void }>)\nconst selectedUpload = ref(null as Nullable<UploadableFileItem>)\nconst activeImageUrl = ref(null as Nullable<string>)\n\nconst canvasSize = computed(() => {\n switch (props.size) {\n case 'xs' || 'sm' || 'lg' || 'xl':\n return { width: 64, height: 64 }\n case 'xxl':\n return { width: 140, height: 140 }\n case 'editable':\n return { width: 240, height: 240 }\n case 'base':\n default:\n return { width: 32, height: 32 }\n }\n})\n\nconst setNewActiveUrl = (url: Nullable<string>) => {\n if (activeImageUrl.value) {\n URL.revokeObjectURL(activeImageUrl.value)\n }\n\n activeImageUrl.value = url\n}\n\nconst onFilesSelected = (params: { files: UploadableFileItem[] }) => {\n const file = params.files[0]\n if (!file) return\n selectedUpload.value = file\n}\n\nconst getDashedBorderClasses = (isDraggingFiles: boolean) => {\n if (isDraggingFiles) return 'border-primary'\n if (selectedUpload.value?.error) return 'border-danger'\n\n return 'border-outline-2'\n}\n\nconst rotateLeft = () => cropper.value?.rotate(-90)\nconst rotateRight = () => cropper.value?.rotate(90)\nconst flipHorizontal = () => cropper.value?.flip(1, 0)\nconst flipVertical = () => cropper.value?.flip(0, 1)\n\nconst onReplace = () => uploadZone.value?.triggerPicker()\nconst onRemove = () => {\n selectedUpload.value = null\n activeImageUrl.value = null\n}\nconst onSave = () => {\n const newUrl = cropper.value?.getResult().canvas.toDataURL('image/jpeg', 0.85) || null\n emit('save', newUrl)\n}\n\nonUnmounted(() => {\n setNewActiveUrl(null)\n})\n\nwatch(\n () => props.user.avatar,\n (newAvatar) => {\n activeImageUrl.value = newAvatar || null\n },\n { immediate: true }\n)\n\nwatch(\n selectedUpload,\n (newUpload) => {\n activeImageUrl.value =\n newUpload?.file && !newUpload.error ? URL.createObjectURL(newUpload.file) : null\n },\n { deep: true }\n)\n</script>\n"],"names":["cropper","ref","uploadZone","selectedUpload","activeImageUrl","canvasSize","computed","props","setNewActiveUrl","url","onFilesSelected","params","file","getDashedBorderClasses","isDraggingFiles","_a","rotateLeft","rotateRight","flipHorizontal","flipVertical","onReplace","onRemove","onSave","newUrl","emit","onUnmounted","watch","newAvatar","newUpload"],"mappings":"syBA2HMA,EAAUC,EAAA,IACd,IAAA,EAMIC,EAAaD,MAAI,IAA+C,EAChEE,EAAiBF,MAAI,IAAoC,EACzDG,EAAiBH,MAAI,IAAwB,EAE7CI,EAAaC,EAAAA,SAAS,IAAM,CAChC,OAAQC,EAAM,KAAM,CAClB,IAAK,KACH,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAG,EACjC,IAAK,MACH,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAI,EACnC,IAAK,WACH,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAI,EACnC,IAAK,OACL,QACE,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAG,CACnC,CAAA,CACD,EAEKC,EAAmBC,GAA0B,CAC7CL,EAAe,OACb,IAAA,gBAAgBA,EAAe,KAAK,EAG1CA,EAAe,MAAQK,CAAA,EAGnBC,EAAmBC,GAA4C,CAC7D,MAAAC,EAAOD,EAAO,MAAM,CAAC,EACtBC,IACLT,EAAe,MAAQS,EAAA,EAGnBC,EAA0BC,GAA6B,OACvD,OAAAA,EAAwB,kBACxBC,EAAAZ,EAAe,QAAf,MAAAY,EAAsB,MAAc,gBAEjC,kBAAA,EAGHC,EAAa,IAAA,OAAM,OAAAD,EAAAf,EAAQ,QAAR,YAAAe,EAAe,OAAO,MACzCE,EAAc,IAAA,OAAM,OAAAF,EAAAf,EAAQ,QAAR,YAAAe,EAAe,OAAO,KAC1CG,EAAiB,IAAA,OAAM,OAAAH,EAAAf,EAAQ,QAAR,YAAAe,EAAe,KAAK,EAAG,IAC9CI,EAAe,IAAA,OAAM,OAAAJ,EAAAf,EAAQ,QAAR,YAAAe,EAAe,KAAK,EAAG,IAE5CK,EAAY,IAAM,OAAA,OAAAL,EAAAb,EAAW,QAAX,YAAAa,EAAkB,iBACpCM,EAAW,IAAM,CACrBlB,EAAe,MAAQ,KACvBC,EAAe,MAAQ,IAAA,EAEnBkB,EAAS,IAAM,OACb,MAAAC,IAASR,EAAAf,EAAQ,QAAR,YAAAe,EAAe,YAAY,OAAO,UAAU,aAAc,OAAS,KAClFS,EAAK,OAAQD,CAAM,CAAA,EAGrBE,OAAAA,EAAAA,YAAY,IAAM,CAChBjB,EAAgB,IAAI,CAAA,CACrB,EAEDkB,EAAA,MACE,IAAMnB,EAAM,KAAK,OAChBoB,GAAc,CACbvB,EAAe,MAAQuB,GAAa,IACtC,EACA,CAAE,UAAW,EAAK,CAAA,EAGpBD,EAAA,MACEvB,EACCyB,GAAc,CACExB,EAAA,MACbwB,GAAA,MAAAA,EAAW,MAAQ,CAACA,EAAU,MAAQ,IAAI,gBAAgBA,EAAU,IAAI,EAAI,IAChF,EACA,CAAE,KAAM,EAAK,CAAA"}
@@ -1,9 +1,9 @@
1
- import { defineComponent as j, ref as d, onUnmounted as N, watch as x, openBlock as g, createElementBlock as V, createElementVNode as a, normalizeClass as f, withDirectives as c, createVNode as r, unref as t, createBlock as O, createCommentVNode as S, withCtx as m, mergeProps as D, toHandlers as E, createTextVNode as k } from "vue";
2
- import { ArrowUturnLeftIcon as P, ArrowUturnRightIcon as Z, ArrowUpOnSquareIcon as $, ArrowLeftOnRectangleIcon as H, PhotoIcon as q, XMarkIcon as M } from "@heroicons/vue/24/outline";
3
- import { Cropper as T } from "vue-advanced-cropper";
1
+ import { defineComponent as j, ref as d, computed as N, onUnmounted as V, watch as k, openBlock as y, createElementBlock as $, createElementVNode as a, normalizeClass as m, withDirectives as s, createVNode as r, unref as t, createBlock as O, normalizeStyle as D, createCommentVNode as E, withCtx as p, mergeProps as P, toHandlers as Z, createTextVNode as z } from "vue";
2
+ import { ArrowUturnLeftIcon as H, ArrowUturnRightIcon as q, ArrowUpOnSquareIcon as M, ArrowLeftOnRectangleIcon as T, PhotoIcon as X, XMarkIcon as G } from "@heroicons/vue/24/outline";
3
+ import { Cropper as J } from "vue-advanced-cropper";
4
4
  import "vue-advanced-cropper/dist/style.css";
5
- import { FormButton as i, FormFileUploadZone as X } from "./lib.js";
6
- import { directive as s } from "vue-tippy";
5
+ import { FormButton as i, FormFileUploadZone as K } from "./lib.js";
6
+ import { directive as c } from "vue-tippy";
7
7
  import "lodash";
8
8
  import "@heroicons/vue/24/solid";
9
9
  import "@heroicons/vue/20/solid";
@@ -13,25 +13,38 @@ import "@speckle/shared";
13
13
  import "@vueuse/core";
14
14
  import "@headlessui/vue";
15
15
  import "v3-infinite-loading";
16
- const G = { class: "flex flex-col space-y-2" }, J = { class: "flex" }, K = { class: "flex mx-14 space-x-2" }, Q = /* @__PURE__ */ a("div", { class: "grow" }, null, -1), me = /* @__PURE__ */ j({
16
+ const Q = { class: "flex flex-col space-y-2" }, W = { class: "flex" }, Y = { class: "flex mx-14 space-x-2" }, ee = /* @__PURE__ */ a("div", { class: "grow" }, null, -1), he = /* @__PURE__ */ j({
17
17
  __name: "AvatarEditor",
18
18
  props: {
19
19
  user: null,
20
- disabled: { type: Boolean }
20
+ disabled: { type: Boolean },
21
+ size: null
21
22
  },
22
23
  emits: ["cancel", "save"],
23
- setup(p, { emit: C }) {
24
- const R = p, n = d(
24
+ setup(v, { emit: C }) {
25
+ const h = v, n = d(
25
26
  null
26
- ), v = d(null), u = d(null), l = d(null), _ = (e) => {
27
+ ), x = d(null), u = d(null), l = d(null), f = N(() => {
28
+ switch (h.size) {
29
+ case "xs":
30
+ return { width: 64, height: 64 };
31
+ case "xxl":
32
+ return { width: 140, height: 140 };
33
+ case "editable":
34
+ return { width: 240, height: 240 };
35
+ case "base":
36
+ default:
37
+ return { width: 32, height: 32 };
38
+ }
39
+ }), R = (e) => {
27
40
  l.value && URL.revokeObjectURL(l.value), l.value = e;
28
- }, y = (e) => {
41
+ }, _ = (e) => {
29
42
  const o = e.files[0];
30
43
  o && (u.value = o);
31
44
  }, b = (e) => {
32
45
  var o;
33
46
  return e ? "border-primary" : (o = u.value) != null && o.error ? "border-danger" : "border-outline-2";
34
- }, z = () => {
47
+ }, w = () => {
35
48
  var e;
36
49
  return (e = n.value) == null ? void 0 : e.rotate(-90);
37
50
  }, L = () => {
@@ -40,76 +53,76 @@ const G = { class: "flex flex-col space-y-2" }, J = { class: "flex" }, K = { cla
40
53
  }, U = () => {
41
54
  var e;
42
55
  return (e = n.value) == null ? void 0 : e.flip(1, 0);
43
- }, w = () => {
44
- var e;
45
- return (e = n.value) == null ? void 0 : e.flip(0, 1);
46
56
  }, I = () => {
47
57
  var e;
48
- return (e = v.value) == null ? void 0 : e.triggerPicker();
58
+ return (e = n.value) == null ? void 0 : e.flip(0, 1);
49
59
  }, A = () => {
50
- u.value = null, l.value = null;
60
+ var e;
61
+ return (e = x.value) == null ? void 0 : e.triggerPicker();
51
62
  }, B = () => {
63
+ u.value = null, l.value = null;
64
+ }, F = () => {
52
65
  var o;
53
66
  const e = ((o = n.value) == null ? void 0 : o.getResult().canvas.toDataURL("image/jpeg", 0.85)) || null;
54
67
  C("save", e);
55
68
  };
56
- return N(() => {
57
- _(null);
58
- }), x(
59
- () => R.user.avatar,
69
+ return V(() => {
70
+ R(null);
71
+ }), k(
72
+ () => h.user.avatar,
60
73
  (e) => {
61
74
  l.value = e || null;
62
75
  },
63
76
  { immediate: !0 }
64
- ), x(
77
+ ), k(
65
78
  u,
66
79
  (e) => {
67
80
  l.value = e != null && e.file && !e.error ? URL.createObjectURL(e.file) : null;
68
81
  },
69
82
  { deep: !0 }
70
- ), (e, o) => (g(), V("div", G, [
71
- a("div", J, [
83
+ ), (e, o) => (y(), $("div", Q, [
84
+ a("div", W, [
72
85
  a("div", {
73
- class: f(["flex flex-col px-2 space-y-1", { invisible: !l.value }])
86
+ class: m(["flex flex-col px-2 space-y-1", { invisible: !l.value }])
74
87
  }, [
75
- c(r(i, {
76
- "icon-left": t(P),
88
+ s(r(i, {
89
+ "icon-left": t(H),
77
90
  "hide-text": "",
78
91
  size: "sm",
79
92
  outlined: "",
80
- onClick: z
93
+ onClick: w
81
94
  }, null, 8, ["icon-left"]), [
82
- [t(s), "Rotate left"]
95
+ [t(c), "Rotate left"]
83
96
  ]),
84
- c(r(i, {
85
- "icon-left": t(Z),
97
+ s(r(i, {
98
+ "icon-left": t(q),
86
99
  "hide-text": "",
87
100
  size: "sm",
88
101
  outlined: "",
89
102
  onClick: L
90
103
  }, null, 8, ["icon-left"]), [
91
- [t(s), "Rotate right"]
104
+ [t(c), "Rotate right"]
92
105
  ]),
93
- c(r(i, {
94
- "icon-left": t($),
106
+ s(r(i, {
107
+ "icon-left": t(M),
95
108
  "hide-text": "",
96
109
  size: "sm",
97
110
  outlined: "",
98
- onClick: w
111
+ onClick: I
99
112
  }, null, 8, ["icon-left"]), [
100
- [t(s), "Flip vertically"]
113
+ [t(c), "Flip vertically"]
101
114
  ]),
102
- c(r(i, {
103
- "icon-left": t(H),
115
+ s(r(i, {
116
+ "icon-left": t(T),
104
117
  "hide-text": "",
105
118
  size: "sm",
106
119
  outlined: "",
107
120
  onClick: U
108
121
  }, null, 8, ["icon-left"]), [
109
- [t(s), "Flip horizontally"]
122
+ [t(c), "Flip horizontally"]
110
123
  ])
111
124
  ], 2),
112
- l.value ? (g(), O(t(T), {
125
+ l.value ? (y(), O(t(J), {
113
126
  key: 0,
114
127
  ref_key: "cropper",
115
128
  ref: n,
@@ -118,68 +131,65 @@ const G = { class: "flex flex-col space-y-2" }, J = { class: "flex" }, K = { cla
118
131
  "stencil-props": {
119
132
  aspectRatio: 1 / 1
120
133
  },
121
- canvas: {
122
- width: 250,
123
- height: 250
124
- },
125
- style: { width: "250px", height: "250px" }
126
- }, null, 8, ["src"])) : S("", !0),
127
- r(X, {
134
+ canvas: f.value,
135
+ style: D(`width: ${f.value.width}px; height: ${f.value.height}px`)
136
+ }, null, 8, ["src", "canvas", "style"])) : E("", !0),
137
+ r(K, {
128
138
  ref_key: "uploadZone",
129
- ref: v,
130
- class: f(["cropper flex items-center justify-center", { hidden: l.value }]),
139
+ ref: x,
140
+ class: m(["cropper flex items-center justify-center", { hidden: l.value }]),
131
141
  accept: "image/*",
132
142
  "size-limit": 5 * 1024 * 1024,
133
- onFilesSelected: y
143
+ onFilesSelected: _
134
144
  }, {
135
- default: m(({ isDraggingFiles: h, activatorOn: F }) => [
136
- a("div", D({
137
- class: ["cursor-pointer text-center w-full h-full border-dashed border-2 rounded-md p-4 flex items-center justify-center text-sm text-foreground-2", [b(h)]]
138
- }, E(F, !0)), " Click here or drag and drop an image ", 16)
145
+ default: p(({ isDraggingFiles: g, activatorOn: S }) => [
146
+ a("div", P({
147
+ class: ["cursor-pointer text-center w-full h-full border-dashed border-2 rounded-md p-4 flex items-center justify-center text-sm text-foreground-2", [b(g)]]
148
+ }, Z(S, !0)), " Click here or drag and drop an image ", 16)
139
149
  ]),
140
150
  _: 1
141
151
  }, 8, ["class"]),
142
152
  a("div", {
143
- class: f(["flex flex-col px-2 space-y-1", { invisible: !l.value }])
153
+ class: m(["flex flex-col px-2 space-y-1", { invisible: !l.value }])
144
154
  }, [
145
- c(r(i, {
146
- "icon-left": t(q),
155
+ s(r(i, {
156
+ "icon-left": t(X),
147
157
  "hide-text": "",
148
158
  size: "sm",
149
- onClick: I
159
+ onClick: A
150
160
  }, null, 8, ["icon-left"]), [
151
- [t(s), "Replace image"]
161
+ [t(c), "Replace image"]
152
162
  ]),
153
- c(r(i, {
154
- "icon-left": t(M),
163
+ s(r(i, {
164
+ "icon-left": t(G),
155
165
  "hide-text": "",
156
166
  size: "sm",
157
167
  color: "danger",
158
- onClick: A
168
+ onClick: B
159
169
  }, null, 8, ["icon-left"]), [
160
- [t(s), "Remove"]
170
+ [t(c), "Remove"]
161
171
  ])
162
172
  ], 2)
163
173
  ]),
164
- a("div", K, [
165
- Q,
174
+ a("div", Y, [
175
+ ee,
166
176
  r(i, {
167
177
  color: "secondary",
168
178
  size: "sm",
169
- onClick: o[0] || (o[0] = (h) => e.$emit("cancel"))
179
+ onClick: o[0] || (o[0] = (g) => e.$emit("cancel"))
170
180
  }, {
171
- default: m(() => [
172
- k(" Cancel ")
181
+ default: p(() => [
182
+ z(" Close ")
173
183
  ]),
174
184
  _: 1
175
185
  }),
176
186
  r(i, {
177
187
  size: "sm",
178
- disabled: p.disabled,
179
- onClick: B
188
+ disabled: v.disabled,
189
+ onClick: F
180
190
  }, {
181
- default: m(() => [
182
- k("Save")
191
+ default: p(() => [
192
+ z("Save")
183
193
  ]),
184
194
  _: 1
185
195
  }, 8, ["disabled"])
@@ -188,6 +198,6 @@ const G = { class: "flex flex-col space-y-2" }, J = { class: "flex" }, K = { cla
188
198
  }
189
199
  });
190
200
  export {
191
- me as default
201
+ he as default
192
202
  };
193
- //# sourceMappingURL=AvatarEditor-1bbae637.js.map
203
+ //# sourceMappingURL=AvatarEditor-8531c565.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarEditor-8531c565.js","sources":["../src/components/user/AvatarEditor.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col space-y-2\">\n <div class=\"flex\">\n <div class=\"flex flex-col px-2 space-y-1\" :class=\"{ invisible: !activeImageUrl }\">\n <FormButton\n v-tippy=\"'Rotate left'\"\n :icon-left=\"ArrowUturnLeftIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"rotateLeft\"\n />\n <FormButton\n v-tippy=\"'Rotate right'\"\n :icon-left=\"ArrowUturnRightIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"rotateRight\"\n />\n <FormButton\n v-tippy=\"'Flip vertically'\"\n :icon-left=\"ArrowUpOnSquareIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"flipVertical\"\n />\n <FormButton\n v-tippy=\"'Flip horizontally'\"\n :icon-left=\"ArrowLeftOnRectangleIcon\"\n hide-text\n size=\"sm\"\n outlined\n @click=\"flipHorizontal\"\n />\n </div>\n <Cropper\n v-if=\"activeImageUrl\"\n ref=\"cropper\"\n class=\"cropper\"\n :src=\"activeImageUrl\"\n :stencil-props=\"{\n aspectRatio: 1 / 1\n }\"\n :canvas=\"canvasSize\"\n :style=\"`width: ${canvasSize.width}px; height: ${canvasSize.height}px`\"\n />\n <FormFileUploadZone\n ref=\"uploadZone\"\n v-slot=\"{ isDraggingFiles, activatorOn }\"\n class=\"cropper flex items-center justify-center\"\n :class=\"{ hidden: activeImageUrl }\"\n accept=\"image/*\"\n :size-limit=\"5 * 1024 * 1024\"\n @files-selected=\"onFilesSelected\"\n >\n <div\n class=\"cursor-pointer text-center w-full h-full border-dashed border-2 rounded-md p-4 flex items-center justify-center text-sm text-foreground-2\"\n :class=\"[getDashedBorderClasses(isDraggingFiles)]\"\n v-on=\"activatorOn\"\n >\n Click here or drag and drop an image\n </div>\n </FormFileUploadZone>\n <div class=\"flex flex-col px-2 space-y-1\" :class=\"{ invisible: !activeImageUrl }\">\n <FormButton\n v-tippy=\"'Replace image'\"\n :icon-left=\"PhotoIcon\"\n hide-text\n size=\"sm\"\n @click=\"onReplace\"\n />\n <FormButton\n v-tippy=\"'Remove'\"\n :icon-left=\"XMarkIcon\"\n hide-text\n size=\"sm\"\n color=\"danger\"\n @click=\"onRemove\"\n />\n </div>\n </div>\n <div class=\"flex mx-14 space-x-2\">\n <div class=\"grow\" />\n <FormButton color=\"secondary\" size=\"sm\" @click=\"$emit('cancel')\">\n Close\n </FormButton>\n <FormButton size=\"sm\" :disabled=\"disabled\" @click=\"onSave\">Save</FormButton>\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport {\n ArrowUturnLeftIcon,\n ArrowUturnRightIcon,\n ArrowLeftOnRectangleIcon,\n ArrowUpOnSquareIcon,\n XMarkIcon,\n PhotoIcon\n} from '@heroicons/vue/24/outline'\nimport { Nullable } from '@speckle/shared'\nimport { onUnmounted, ref, watch, computed } from 'vue'\nimport { Cropper } from 'vue-advanced-cropper'\nimport 'vue-advanced-cropper/dist/style.css'\nimport FormButton from '~~/src/components/form/Button.vue'\nimport FormFileUploadZone from '~~/src/components/form/file-upload/Zone.vue'\nimport { UploadableFileItem } from '~~/src/composables/form/fileUpload'\nimport { AvatarUser, UserAvatarSize } from '~~/src/composables/user/avatar'\nimport { directive as vTippy } from 'vue-tippy'\n\n/**\n * Always try to lazy load this, as it's quite heavy\n */\n\nconst emit = defineEmits([\"cancel\", \"save\"])\n\nconst props = defineProps({\n \"user\": null,\n \"disabled\": { type: Boolean, },\n \"size\": null\n})\n\nconst cropper = ref(\n null as Nullable<{\n flip: (x: number, y: number) => void\n rotate: (angle: number) => void\n getResult: () => { canvas: HTMLCanvasElement }\n }>\n)\nconst uploadZone = ref(null as Nullable<{ triggerPicker: () => void }>)\nconst selectedUpload = ref(null as Nullable<UploadableFileItem>)\nconst activeImageUrl = ref(null as Nullable<string>)\n\nconst canvasSize = computed(() => {\n switch (props.size) {\n case 'xs' || 'sm' || 'lg' || 'xl':\n return { width: 64, height: 64 }\n case 'xxl':\n return { width: 140, height: 140 }\n case 'editable':\n return { width: 240, height: 240 }\n case 'base':\n default:\n return { width: 32, height: 32 }\n }\n})\n\nconst setNewActiveUrl = (url: Nullable<string>) => {\n if (activeImageUrl.value) {\n URL.revokeObjectURL(activeImageUrl.value)\n }\n\n activeImageUrl.value = url\n}\n\nconst onFilesSelected = (params: { files: UploadableFileItem[] }) => {\n const file = params.files[0]\n if (!file) return\n selectedUpload.value = file\n}\n\nconst getDashedBorderClasses = (isDraggingFiles: boolean) => {\n if (isDraggingFiles) return 'border-primary'\n if (selectedUpload.value?.error) return 'border-danger'\n\n return 'border-outline-2'\n}\n\nconst rotateLeft = () => cropper.value?.rotate(-90)\nconst rotateRight = () => cropper.value?.rotate(90)\nconst flipHorizontal = () => cropper.value?.flip(1, 0)\nconst flipVertical = () => cropper.value?.flip(0, 1)\n\nconst onReplace = () => uploadZone.value?.triggerPicker()\nconst onRemove = () => {\n selectedUpload.value = null\n activeImageUrl.value = null\n}\nconst onSave = () => {\n const newUrl = cropper.value?.getResult().canvas.toDataURL('image/jpeg', 0.85) || null\n emit('save', newUrl)\n}\n\nonUnmounted(() => {\n setNewActiveUrl(null)\n})\n\nwatch(\n () => props.user.avatar,\n (newAvatar) => {\n activeImageUrl.value = newAvatar || null\n },\n { immediate: true }\n)\n\nwatch(\n selectedUpload,\n (newUpload) => {\n activeImageUrl.value =\n newUpload?.file && !newUpload.error ? URL.createObjectURL(newUpload.file) : null\n },\n { deep: true }\n)\n</script>\n"],"names":["cropper","ref","uploadZone","selectedUpload","activeImageUrl","canvasSize","computed","props","setNewActiveUrl","url","onFilesSelected","params","file","getDashedBorderClasses","isDraggingFiles","_a","rotateLeft","rotateRight","flipHorizontal","flipVertical","onReplace","onRemove","onSave","newUrl","emit","onUnmounted","watch","newAvatar","newUpload"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;iBA2HMA,IAAUC;AAAA,MACd;AAAA,IAAA,GAMIC,IAAaD,EAAI,IAA+C,GAChEE,IAAiBF,EAAI,IAAoC,GACzDG,IAAiBH,EAAI,IAAwB,GAE7CI,IAAaC,EAAS,MAAM;AAChC,cAAQC,EAAM,MAAM;AAAA,QAClB,KAAK;AACH,iBAAO,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,QACjC,KAAK;AACH,iBAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,QACnC,KAAK;AACH,iBAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,QACnC,KAAK;AAAA,QACL;AACE,iBAAO,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,MACnC;AAAA,IAAA,CACD,GAEKC,IAAkB,CAACC,MAA0B;AACjD,MAAIL,EAAe,SACb,IAAA,gBAAgBA,EAAe,KAAK,GAG1CA,EAAe,QAAQK;AAAA,IAAA,GAGnBC,IAAkB,CAACC,MAA4C;AAC7D,YAAAC,IAAOD,EAAO,MAAM,CAAC;AAC3B,MAAKC,MACLT,EAAe,QAAQS;AAAA,IAAA,GAGnBC,IAAyB,CAACC,MAA6B;;AACvD,aAAAA,IAAwB,oBACxBC,IAAAZ,EAAe,UAAf,QAAAY,EAAsB,QAAc,kBAEjC;AAAA,IAAA,GAGHC,IAAa,MAAA;;AAAM,cAAAD,IAAAf,EAAQ,UAAR,gBAAAe,EAAe,OAAO;AAAA,OACzCE,IAAc,MAAA;;AAAM,cAAAF,IAAAf,EAAQ,UAAR,gBAAAe,EAAe,OAAO;AAAA,OAC1CG,IAAiB,MAAA;;AAAM,cAAAH,IAAAf,EAAQ,UAAR,gBAAAe,EAAe,KAAK,GAAG;AAAA,OAC9CI,IAAe,MAAA;;AAAM,cAAAJ,IAAAf,EAAQ,UAAR,gBAAAe,EAAe,KAAK,GAAG;AAAA,OAE5CK,IAAY,MAAM;;AAAA,cAAAL,IAAAb,EAAW,UAAX,gBAAAa,EAAkB;AAAA,OACpCM,IAAW,MAAM;AACrB,MAAAlB,EAAe,QAAQ,MACvBC,EAAe,QAAQ;AAAA,IAAA,GAEnBkB,IAAS,MAAM;;AACb,YAAAC,MAASR,IAAAf,EAAQ,UAAR,gBAAAe,EAAe,YAAY,OAAO,UAAU,cAAc,UAAS;AAClF,MAAAS,EAAK,QAAQD,CAAM;AAAA,IAAA;AAGrB,WAAAE,EAAY,MAAM;AAChB,MAAAjB,EAAgB,IAAI;AAAA,IAAA,CACrB,GAEDkB;AAAA,MACE,MAAMnB,EAAM,KAAK;AAAA,MACjB,CAACoB,MAAc;AACb,QAAAvB,EAAe,QAAQuB,KAAa;AAAA,MACtC;AAAA,MACA,EAAE,WAAW,GAAK;AAAA,IAAA,GAGpBD;AAAA,MACEvB;AAAA,MACA,CAACyB,MAAc;AACE,QAAAxB,EAAA,QACbwB,KAAA,QAAAA,EAAW,QAAQ,CAACA,EAAU,QAAQ,IAAI,gBAAgBA,EAAU,IAAI,IAAI;AAAA,MAChF;AAAA,MACA,EAAE,MAAM,GAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,32 @@
1
+ declare const _default: import("vue").DefineComponent<{
2
+ value: {
3
+ type: import("vue").PropType<string>;
4
+ required: true;
5
+ };
6
+ rows: {
7
+ type: import("vue").PropType<number>;
8
+ };
9
+ isMultiline: {
10
+ type: import("vue").PropType<boolean>;
11
+ default: boolean;
12
+ };
13
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
14
+ copy: (val: string) => void;
15
+ }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
16
+ value: {
17
+ type: import("vue").PropType<string>;
18
+ required: true;
19
+ };
20
+ rows: {
21
+ type: import("vue").PropType<number>;
22
+ };
23
+ isMultiline: {
24
+ type: import("vue").PropType<boolean>;
25
+ default: boolean;
26
+ };
27
+ }>> & {
28
+ onCopy?: ((val: string) => any) | undefined;
29
+ }, {
30
+ isMultiline: boolean;
31
+ }, {}>;
32
+ export default _default;
@@ -2,7 +2,7 @@ import { RuleExpression } from 'vee-validate';
2
2
  import { ConcreteComponent, PropType } from 'vue';
3
3
  import { Optional } from '@speckle/shared';
4
4
  type InputSize = 'sm' | 'base' | 'lg' | 'xl';
5
- type InputColor = 'page' | 'foundation';
5
+ type InputColor = 'page' | 'foundation' | 'transparent';
6
6
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
7
7
  /**
8
8
  * Input "type" value (changes behaviour & look)
@@ -147,8 +147,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
147
147
  value: string;
148
148
  }) => void;
149
149
  clear: () => void;
150
- focusin: () => void;
151
- focusout: () => void;
150
+ focus: () => void;
151
+ blur: () => void;
152
152
  }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
153
153
  /**
154
154
  * Input "type" value (changes behaviour & look)
@@ -281,8 +281,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
281
281
  default: string;
282
282
  };
283
283
  }>> & {
284
- onFocusin?: (() => any) | undefined;
285
- onFocusout?: (() => any) | undefined;
284
+ onFocus?: (() => any) | undefined;
285
+ onBlur?: (() => any) | undefined;
286
286
  onChange?: ((val: {
287
287
  event?: Event | undefined;
288
288
  value: string;
@@ -313,8 +313,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
313
313
  showClear: boolean;
314
314
  useLabelInErrors: boolean;
315
315
  hideErrorMessage: boolean;
316
- wrapperClasses: string;
317
316
  inputClasses: string;
317
+ wrapperClasses: string;
318
318
  }, {}>, {
319
319
  "input-right"?(_: {}): any;
320
320
  }>;
@@ -19,7 +19,6 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
19
19
  help?: Optional<string>;
20
20
  showLabel?: boolean | undefined;
21
21
  useLabelInErrors?: boolean | undefined;
22
- clearable?: boolean | undefined;
23
22
  items?: SingleItem[] | undefined;
24
23
  filterPredicate?: Optional<(item: SingleItem, searchString: string) => boolean>;
25
24
  disabledItemPredicate?: Optional<(item: SingleItem) => boolean>;
@@ -28,8 +27,10 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
28
27
  buttonStyle?: Optional<"base" | "simple" | "tinted">;
29
28
  hideCheckmarks?: Optional<boolean>;
30
29
  allowUnset?: Optional<boolean>;
30
+ clearable?: boolean | undefined;
31
31
  fixedHeight?: boolean | undefined;
32
32
  fullyControlValue?: boolean | undefined;
33
+ mountMenuOnBody?: boolean | undefined;
33
34
  class?: unknown;
34
35
  style?: unknown;
35
36
  readonly placeholder?: string | undefined;
@@ -98,7 +99,6 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
98
99
  help?: Optional<string>;
99
100
  showLabel?: boolean | undefined;
100
101
  useLabelInErrors?: boolean | undefined;
101
- clearable?: boolean | undefined;
102
102
  items?: SingleItem[] | undefined;
103
103
  filterPredicate?: Optional<(item: SingleItem, searchString: string) => boolean>;
104
104
  disabledItemPredicate?: Optional<(item: SingleItem) => boolean>;
@@ -107,8 +107,10 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
107
107
  buttonStyle?: Optional<"base" | "simple" | "tinted">;
108
108
  hideCheckmarks?: Optional<boolean>;
109
109
  allowUnset?: Optional<boolean>;
110
+ clearable?: boolean | undefined;
110
111
  fixedHeight?: boolean | undefined;
111
112
  fullyControlValue?: boolean | undefined;
113
+ mountMenuOnBody?: boolean | undefined;
112
114
  class?: unknown;
113
115
  style?: unknown;
114
116
  readonly placeholder?: string | undefined;
@@ -196,7 +198,6 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
196
198
  help?: Optional<string>;
197
199
  showLabel?: boolean | undefined;
198
200
  useLabelInErrors?: boolean | undefined;
199
- clearable?: boolean | undefined;
200
201
  items?: SingleItem[] | undefined;
201
202
  filterPredicate?: Optional<(item: SingleItem, searchString: string) => boolean>;
202
203
  disabledItemPredicate?: Optional<(item: SingleItem) => boolean>;
@@ -205,8 +206,10 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
205
206
  buttonStyle?: Optional<"base" | "simple" | "tinted">;
206
207
  hideCheckmarks?: Optional<boolean>;
207
208
  allowUnset?: Optional<boolean>;
209
+ clearable?: boolean | undefined;
208
210
  fixedHeight?: boolean | undefined;
209
211
  fullyControlValue?: boolean | undefined;
212
+ mountMenuOnBody?: boolean | undefined;
210
213
  class?: unknown;
211
214
  style?: unknown;
212
215
  readonly placeholder?: string | undefined;
@@ -297,7 +300,6 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
297
300
  help?: Optional<string>;
298
301
  showLabel?: boolean | undefined;
299
302
  useLabelInErrors?: boolean | undefined;
300
- clearable?: boolean | undefined;
301
303
  items?: SingleItem[] | undefined;
302
304
  filterPredicate?: Optional<(item: SingleItem, searchString: string) => boolean>;
303
305
  disabledItemPredicate?: Optional<(item: SingleItem) => boolean>;
@@ -306,8 +308,10 @@ declare const _default: <SingleItem extends string | number | Record<string, unk
306
308
  buttonStyle?: Optional<"base" | "simple" | "tinted">;
307
309
  hideCheckmarks?: Optional<boolean>;
308
310
  allowUnset?: Optional<boolean>;
311
+ clearable?: boolean | undefined;
309
312
  fixedHeight?: boolean | undefined;
310
313
  fullyControlValue?: boolean | undefined;
314
+ mountMenuOnBody?: boolean | undefined;
311
315
  class?: unknown;
312
316
  style?: unknown;
313
317
  readonly placeholder?: string | undefined;
@@ -133,9 +133,9 @@ declare const _default: import("vue").DefineComponent<{
133
133
  modelValue: ValueType;
134
134
  multiple: boolean;
135
135
  showLabel: boolean;
136
- clearable: boolean;
137
136
  items: Optional<SourceAppDefinition[]>;
138
137
  searchPlaceholder: string;
138
+ clearable: boolean;
139
139
  selectorPlaceholder: Optional<string>;
140
140
  }, {}>;
141
141
  export default _default;
@@ -21,6 +21,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
21
21
  text: string;
22
22
  props: Record<string, unknown>;
23
23
  onClick?: (() => void) | undefined;
24
+ disabled?: boolean | undefined;
25
+ submit?: boolean | undefined;
24
26
  }[]>;
25
27
  };
26
28
  onSubmit: {
@@ -51,6 +53,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
51
53
  text: string;
52
54
  props: Record<string, unknown>;
53
55
  onClick?: (() => void) | undefined;
56
+ disabled?: boolean | undefined;
57
+ submit?: boolean | undefined;
54
58
  }[]>;
55
59
  };
56
60
  onSubmit: {
@@ -60,6 +64,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
60
64
  "onUpdate:open"?: ((v: boolean) => any) | undefined;
61
65
  "onFully-closed"?: (() => any) | undefined;
62
66
  }, {}, {}>, {
67
+ header?(_: {}): any;
63
68
  default?(_: {}): any;
64
69
  buttons?(_: {}): any;
65
70
  }>;
@@ -0,0 +1,55 @@
1
+ import { ConcreteComponent } from 'vue';
2
+ type TitleColor = 'default' | 'danger' | 'warning' | 'success' | 'secondary' | 'info';
3
+ type FormButtonColor = 'default' | 'invert' | 'danger' | 'warning' | 'success' | 'card' | 'secondary' | 'info';
4
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
5
+ title: StringConstructor;
6
+ borderT: BooleanConstructor;
7
+ borderB: BooleanConstructor;
8
+ allowOverflow: BooleanConstructor;
9
+ titleColor: {
10
+ type: () => TitleColor;
11
+ default: string;
12
+ };
13
+ button: () => {
14
+ expandContent?: boolean | undefined;
15
+ text: string;
16
+ to?: string | undefined;
17
+ color: FormButtonColor;
18
+ iconRight?: ConcreteComponent | undefined;
19
+ onClick?: (() => void) | undefined;
20
+ } | undefined;
21
+ alwaysOpen: BooleanConstructor;
22
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
23
+ title: StringConstructor;
24
+ borderT: BooleanConstructor;
25
+ borderB: BooleanConstructor;
26
+ allowOverflow: BooleanConstructor;
27
+ titleColor: {
28
+ type: () => TitleColor;
29
+ default: string;
30
+ };
31
+ button: () => {
32
+ expandContent?: boolean | undefined;
33
+ text: string;
34
+ to?: string | undefined;
35
+ color: FormButtonColor;
36
+ iconRight?: ConcreteComponent | undefined;
37
+ onClick?: (() => void) | undefined;
38
+ } | undefined;
39
+ alwaysOpen: BooleanConstructor;
40
+ }>>, {
41
+ borderT: boolean;
42
+ borderB: boolean;
43
+ allowOverflow: boolean;
44
+ titleColor: TitleColor;
45
+ alwaysOpen: boolean;
46
+ }, {}>, {
47
+ icon?(_: {}): any;
48
+ default?(_: {}): any;
49
+ }>;
50
+ export default _default;
51
+ type __VLS_WithTemplateSlots<T, S> = T & {
52
+ new (): {
53
+ $slots: S;
54
+ };
55
+ };
@@ -49,6 +49,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
49
49
  hoverEffect: boolean;
50
50
  }, {}>, {
51
51
  default?(_: {}): any;
52
+ "absolute-anchor"?(_: {}): any;
52
53
  }>;
53
54
  export default _default;
54
55
  type __VLS_WithTemplateSlots<T, S> = T & {