@kvass/widgets 1.2.6 → 1.2.8

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 (58) hide show
  1. package/dist/Flatfinder-xVhUSkxC.js +15 -0
  2. package/dist/_plugin-vue_export-helper.js +17 -0
  3. package/dist/contact.js +21 -0
  4. package/dist/flatfinder.js +185 -0
  5. package/dist/font-selector.js +1 -0
  6. package/dist/img-comparison-slider.js +1 -0
  7. package/dist/index.es.js +12 -0
  8. package/dist/index.js +1 -0
  9. package/dist/map.js +2028 -0
  10. package/dist/project-portal.js +1 -0
  11. package/dist/vimeo.js +1 -0
  12. package/dist/youtube.js +1 -0
  13. package/package.json +4 -1
  14. package/.github/workflows/semantic-release.yml +0 -21
  15. package/.prettierrc +0 -6
  16. package/.releaserc +0 -3
  17. package/index.html +0 -38
  18. package/src/contact/README.md +0 -80
  19. package/src/contact/api.js +0 -82
  20. package/src/contact/components/Checkbox.ce.vue +0 -127
  21. package/src/contact/components/Field.ce.vue +0 -156
  22. package/src/contact/components/Fieldset.ce.vue +0 -63
  23. package/src/contact/components/Form.ce.vue +0 -407
  24. package/src/contact/main.js +0 -9
  25. package/src/contact/utils.js +0 -14
  26. package/src/flatfinder/README.md +0 -58
  27. package/src/flatfinder/components/Flatfinder.ce.vue +0 -34
  28. package/src/flatfinder/main.js +0 -4
  29. package/src/font-selector/README.md +0 -60
  30. package/src/font-selector/components/FontSelector.ce.vue +0 -246
  31. package/src/font-selector/main.js +0 -4
  32. package/src/font-selector/providers.js +0 -48
  33. package/src/font-selector/selector.svg +0 -7
  34. package/src/img-comparison-slider/README.md +0 -69
  35. package/src/img-comparison-slider/components/ImgComparisonSlider.ce.vue +0 -139
  36. package/src/img-comparison-slider/main.js +0 -7
  37. package/src/map/README.md +0 -59
  38. package/src/map/components/Map.ce.vue +0 -66
  39. package/src/map/main.js +0 -4
  40. package/src/project-portal/App.ce.vue +0 -308
  41. package/src/project-portal/api.js +0 -48
  42. package/src/project-portal/assets/logo.png +0 -0
  43. package/src/project-portal/assets/map-pin-solid.svg +0 -1
  44. package/src/project-portal/components/Card.ce.vue +0 -110
  45. package/src/project-portal/components/Category.ce.vue +0 -87
  46. package/src/project-portal/components/CategorySelector.ce.vue +0 -43
  47. package/src/project-portal/components/ProjectTypeSelector.ce.vue +0 -70
  48. package/src/project-portal/main.js +0 -16
  49. package/src/project-portal/styles/_variables.scss +0 -19
  50. package/src/project-portal/styles/components/_card.scss +0 -178
  51. package/src/utils/index.js +0 -40
  52. package/src/vimeo/README.md +0 -58
  53. package/src/vimeo/components/Vimeo.ce.vue +0 -311
  54. package/src/vimeo/main.js +0 -4
  55. package/src/youtube/README.md +0 -58
  56. package/src/youtube/components/Youtube.ce.vue +0 -322
  57. package/src/youtube/main.js +0 -4
  58. package/vite.config.js +0 -51
@@ -0,0 +1 @@
1
+ import{_ as j,x as f,o as t,e as m,w as b,a as u,t as h,v,n as x,g as B,c as l,j as L,d as g,y as M,F as w,k as C,r as y,b as S,T as N,p as V}from"./_plugin-vue_export-helper.js";const E=".category{padding:1rem 1.5rem;border:none;border-radius:var(--kvass-project-selector-border-radius, 3px);font-size:.9em;background-color:var(--kvass-project-selector-light-grey, #efefef)}.category:focus-visible{outline:2px solid var(--kvass-project-selector-primary, #0523a8);outline-offset:2px}.category--primary.category--active{background-color:var(--kvass-project-selector-primary, #0523a8)}.category--sale.category--active{background-color:var(--kvass-project-selector-sale, #2da71d)}.category--sold.category--active{background-color:var(--kvass-project-selector-sold, #cc3434)}.category--development.category--active{background-color:var(--kvass-project-selector-development, #3d495b)}.category--upcoming.category--active{background-color:var(--kvass-project-selector-upcoming, #e9b03d)}.category--default.category--active{background-color:var(--kvass-project-selector-default, )}.category--active{color:#fff}",O={__name:"Category.ce",props:{value:{type:String,default:"development"},component:{type:String,default:"div"},active:{type:Boolean}},setup(e){const o={sale:"sale",upcoming:"upcoming",development:"development",sold:"sold"},a={sale:"Til salgs",upcoming:"Kommer for salg",development:"Under utvikling",all:"Alle",sold:"Utsolgt"},r=e,c=f(()=>o[r.value]?o[r.value]:"default"),s=f(()=>a[r.value]);return(d,p)=>(t(),m(B(e.component),{class:x(["category",[`category--${v(c)}`,{"category--active":e.active}]])},{default:b(()=>[u("span",null,h(v(s)),1)]),_:1},8,["class"]))}},z=j(O,[["styles",[E]]]),U=".project-selector-card{position:relative;font-family:var(--kvass-project-selector-secondary-font, inherit);display:flex;flex-direction:column;border-radius:var(--kvass-project-selector-border-radius, 3px);background-color:#fff;text-decoration:none;color:inherit;overflow:hidden}.project-selector-card__header{min-height:var(--kvass-project-selector-header-min-height, 250px);background-color:var(--kvass-project-selector-dark, #272727)}@media (max-width: 767px){.project-selector-card__header{min-height:var(--kvass-project-selector-header-min-height-resposive, 150px)}}.project-selector-card__header-category{position:absolute;background-color:var(--kvass-project-selector-secondary, #3d495b);z-index:11;color:#fff;left:var(--kvass-project-selector-card-status-gap, .5rem);top:var(--kvass-project-selector-card-status-gap, .5rem);border-radius:var(--kvass-project-selector-border-radius, 3px)}.project-selector-card__header-category .category{font-size:var(--kvass-project-selector-card-status-font-size, .8em);padding:var(--kvass-project-selector-card-status-padding-x, .5rem) var(--kvass-project-selector-card-status-padding-x, 1rem)}.project-selector-card__header-cover{width:100%;background-repeat:no-repeat;height:100%;background-size:cover;background-position:center;transition:transform .62s cubic-bezier(.05,.2,.1,1)}.project-selector-card__header-cover:hover{transform:scale(1.11);-webkit-transform:scale(1.11)}.project-selector-card__title{font-weight:700;line-height:1;margin:0}.project-selector-card__content{background-color:var(--kvass-project-selector-background-color, #efeded);border-top:none;text-align:left;display:flex;flex-direction:column;gap:.5rem;padding:calc(var(--kvass-project-selector-card-spacing, 2.5rem) - .5rem);height:100%}.project-selector-card__content-name{color:var(--kvass-project-selector-dark, #272727);margin:0!important}.project-selector-card__content-url{color:var(--kvass-project-selector-primary, #0523a8);font-size:1.1em;margin-top:auto;text-decoration:underline;text-decoration-color:var(--kvass-project-selector-primary, #0523a8);text-underline-offset:.3em;text-decoration-thickness:1px}.project-selector-card__content-url:hover{color:var(--kvass-project-selector-secondary, #3d495b)}.project-selector-card__content-city{font-size:1.2rem}.project-selector-card__content-location{display:flex;align-items:center;align-content:center;gap:1rem;color:var(--kvass-project-selector-secondary, #3d495b)}.project-selector-card__content-location svg{opacity:.5;height:.9rem}.project-selector-card__content-location svg path{color:currentColor}@media (max-width: 767px){.project-selector-card__content{gap:.5rem;padding:calc(var(--kvass-project-selector-card-spacing, 2.5rem) - .5rem) calc(var(--kvass-project-selector-card-spacing, 2.5rem) - 1rem)}}.project-selector--theme-tiles .project-selector-card{border-radius:var(--kvass-project-selector-border-radius, 0px)}.project-selector--theme-tiles .project-selector-card:hover .project-selector-card__content{background:#0003!important}.project-selector--theme-tiles .project-selector-card__header{min-height:var(--kvass-project-selector-header-min-height, 400px)}@media (max-width: 767px){.project-selector--theme-tiles .project-selector-card__header{min-height:var(--kvass-project-selector-header-min-height-resposive, 250px)}}.project-selector--theme-tiles .project-selector-card__content{font-size:1.5rem;height:unset!important;position:absolute;inset:0;z-index:10;pointer-events:none;background:#0006!important;transition:background .2s ease;display:grid!important;place-content:center}.project-selector--theme-tiles .project-selector-card__content>*{color:#fff!important;text-align:center}.project-selector--theme-tiles .project-selector-card__content-url{text-decoration-color:currentColor;font-size:.8em}.project-selector--theme-tiles .project-selector-card__content-location{justify-content:center;margin-bottom:1rem}.project-selector--theme-tiles .project-selector-card__content-location svg{display:none}.project-selector--theme-tiles .project-selector-card__content-intro{font-size:.8em}",D={key:0,class:"project-selector-card__header-category"},H={class:"project-selector-card__content"},P={class:"project-selector-card__content-name"},G={key:0,class:"project-selector-card__content-location"},K=u("svg",{"aria-hidden":"true",focusable:"false","data-prefix":"fas","data-icon":"map-pin",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 288 512"},[u("path",{fill:"currentColor",d:"M112 316.94v156.69l22.02 33.02c4.75 7.12 15.22 7.12 19.97 0L176 473.63V316.94c-10.39 1.92-21.06 3.06-32 3.06s-21.61-1.14-32-3.06zM144 0C64.47 0 0 64.47 0 144s64.47 144 144 144 144-64.47 144-144S223.53 0 144 0zm0 76c-37.5 0-68 30.5-68 68 0 6.62-5.38 12-12 12s-12-5.38-12-12c0-50.73 41.28-92 92-92 6.62 0 12 5.38 12 12s-5.38 12-12 12z"})],-1),W={class:"project-selector-card__content-city"},q=["innerHTML"],J=["href"],Q={__name:"Card.ce",props:{item:{type:Object,default:()=>({})},theme:{type:String,default:"default",enums:["default","primary","flat"]},disableLabel:{type:Boolean,default:!1}},setup(e){const o=e,a=f(()=>c(o.item.media&&o.item.media.cover?o.item.media.cover:null)||c(o.item.media&&o.item.media.gallery?o.item.media.gallery:null)),r=f(()=>o.item.status);function c(s){if(!s||!s.length)return;let d=s.find(p=>p.type?p.type.startsWith("image"):p);if(d)return d.url}return(s,d)=>(t(),l("div",{class:x(["project-selector-card","project-selector-card--"+e.theme])},[(t(),m(B(e.item.url&&!["development"].includes(v(r))?"a":"div"),{class:"project-selector-card__header",href:e.item.url},{default:b(()=>[e.disableLabel?g("",!0):(t(),l("div",D,[L(z,{value:v(r),component:"div",active:""},null,8,["value"])])),u("div",{class:"project-selector-card__header-cover",style:M({backgroundImage:`url(${v(a)})`})},null,4)]),_:1},8,["href"])),u("div",H,[u("h2",P,h(e.item.name),1),e.item.address&&e.item.address.city?(t(),l("span",G,[K,u("span",W,h(e.item.address?e.item.address.city:""),1)])):g("",!0),u("div",{class:"project-selector-card__content-intro",innerHTML:e.item.intro},null,8,q),e.item.url&&!["development"].includes(v(r))?(t(),l("a",{key:1,class:"project-selector-card__content-url",href:e.item.url}," Se prosjektet",8,J)):g("",!0)])],2))}},T=j(Q,[["styles",[U]]]),R=".project-selector-category__selector{cursor:pointer}@media (max-width: 767px){.project-selector-category__selector{width:100%}}.project-selector-category__selector:hover{box-shadow:inset 0 0 0 2em #4a4a4a33}",X={class:"project-selector-category"},Y={__name:"CategorySelector.ce",props:{items:{type:Array,default:()=>[]},value:{type:String}},setup(e){return(o,a)=>(t(),l("div",X,[(t(!0),l(w,null,C(e.items,(r,c)=>(t(),m(z,{key:c,class:"project-selector-category__selector",value:r,active:e.value==r,component:"button",onClick:s=>o.$emit("input",r)},null,8,["value","active","onClick"]))),128))]))}},F=j(Y,[["styles",[R]]]),Z=".project-type-selector .elder-dropdown__content{z-index:11}.project-type-selector__trigger{appearance:none;padding:1rem 2rem;border:none;border-radius:var(--kvass-project-selector-border-radius, 3px);font-size:.9em;background-color:var(--kvass-project-selector-primary, #0523a8);color:#fff}.project-type-selector__trigger:-ms-expand{display:none}@media (max-width: 767px){.project-type-selector__trigger{width:100%}}.project-type-selector__dropdown-item{text-align:center!important;padding:.5rem 1.5rem;font-size:.9em}.project-type-selector__dropdown-item--selected{background-color:#8f8f8f66}.project-type-selector__dropdown-item:hover{background-color:#24242466}",ee={class:"project-type-selector__trigger"},te=["value","onChange"],re={__name:"ProjectTypeSelector.ce",props:{items:{type:Array,default:()=>[]},value:{type:String}},setup(e){function o(a){return a.charAt(0).toUpperCase()+a.substring(1)}return(a,r)=>(t(),l("select",ee,[(t(!0),l(w,null,C(e.items,(c,s)=>(t(),l("option",{key:s,value:c,onChange:d=>a.$emit("input",c),class:"project-type-selector__dropdown-item"},h(o(c==="none"?"Velg type":c)),41,te))),128))]))}},I=j(re,[["styles",[Z]]]),oe=".project-selector__navigation{display:flex;justify-content:var(--kvass-project-selector-nav-position, center);padding:0 2rem 3rem;gap:1.5rem}@media (max-width: 767px){.project-selector__navigation{flex-direction:column-reverse;justify-content:center;gap:.5rem}}.project-selector__navigation-category{display:flex;justify-content:center;gap:1.5rem}@media (max-width: 767px){.project-selector__navigation-category{flex-direction:column;gap:.5rem;align-items:center}}.project-selector__card{position:relative;display:grid;grid-template-columns:repeat(var(--kvass-project-selector-grid-columns, 4),1fr);gap:var(--kvass-project-selector-grid-gap, 2rem)}@media (max-width: 767px){.project-selector__card{grid-template-columns:1fr;padding-top:2rem}}.project-selector__no-result{font-size:1.2em;text-align:center;display:flex;justify-content:center;align-items:center;min-height:200px;margin:2rem 0;background-color:var(--kvass-project-selector-light-grey, #efefef)}@media (max-width: 767px){.project-selector__no-result{min-height:100px}}.project-selector .list-leave-active{position:absolute}.project-selector .list-move,.project-selector .list-enter-active,.project-selector .list-leave-active{transition:all .5s ease}.project-selector .list-enter{transform:scale(.95)}.project-selector .list-enter,.project-selector .list-leave-to{opacity:0}.project-selector--theme-tiles .project-selector__card{grid-template-columns:repeat(var(--kvass-project-selector-grid-columns, 2),1fr);gap:var(--kvass-project-selector-grid-gap, 0rem)}@media (max-width: 767px){.project-selector--theme-tiles .project-selector__card{grid-template-columns:1fr;padding-top:2rem}}",ce={key:0,class:"project-selector__navigation"},ae={key:2,class:"project-selector__no-result"},se={created(){this.fetch()}},le=Object.assign(se,{__name:"App.ce",props:{source:{type:String,default:"https://feature.kvass.no"},startCategory:{type:String,default:"all",enums:["all","sale","upcoming","development","sold"]},enabledCategories:{type:String,default:"all,sale,upcoming,development,sold"},theme:{type:String,enum:["default","tiles"],default:"default"},sortOn:{type:String,enum:["status","name"],default:"status"},disableNav:{type:Boolean,default:!1}},setup(e){const o=e,a=y(""),r=y("none"),c=y([]);var s=[];y(null);const d=S(()=>[...o.enabledCategories.split(",").filter(n=>n==="all"?!0:s.find(i=>i.status.includes(n)))]),p=S(()=>{let n=["none"].concat(s.map(i=>{if(i.customFields&&i.customFields["project-type"])return i.customFields["project-type"]}));return[...new Set(n||[])].filter(Boolean)});function $(){c.value=s.filter(n=>a.value==="all"?!0:n.status.includes(a.value)).filter(n=>{if(!p.length||r.value==="none")return!0;if(!(!n.customFields||!n.customFields["project-type"]))return n.customFields["project-type"].includes(r.value)})}return(n,i)=>(t(),l("div",{class:x(["project-selector",`project-selector--theme-${e.theme}`])},[!e.disableNav||!d.value.length?(t(),l("div",ce,[d.value.length?(t(),m(F,{key:0,class:"project-selector__navigation-category",items:d.value,value:a.value,onInput:i[0]||(i[0]=_=>{a.value=_,$()})},null,8,["items","value"])):g("",!0),p.value.length>1?(t(),m(I,{key:1,class:"project-selector__navigation-project-type",items:p.value,value:r.value,onInput:i[1]||(i[1]=_=>{r.value=_.target.value,$()})},null,8,["items","value"])):g("",!0)])):g("",!0),c.value&&c.value.length?(t(),m(N,{key:1,tag:"div",name:"list",appear:"",class:"project-selector__card"},{default:b(()=>[(t(!0),l(w,null,C(c.value,(_,A)=>(t(),m(T,{"disable-label":e.disableNav,key:A,item:_,theme:"border"},null,8,["disable-label","item"]))),128))]),_:1})):(t(),l("div",ae,"Ingen resultater"))],2))}}),k=j(le,[["styles",[oe]]]);k.styles=[...k.styles,...T.styles,...z.styles,...F.styles,...I.styles];customElements.define("kvass-project-portal",V(k));
package/dist/vimeo.js ADDED
@@ -0,0 +1 @@
1
+ import{_ as f,o,c as r,z as l,A as m,j as v,w as g,a as d,y as c,B as y,C as k,t as u,d as w,p as b}from"./_plugin-vue_export-helper.js";import{E as p,L as _,W as S}from"./index.js";const x=".widget-kvass-media-render-vimeo{height:100%;width:100%;position:relative}.widget-kvass-media-render-vimeo iframe{height:100%;width:100%}.widget-kvass-media-render-vimeo>*{position:absolute;top:0;left:0;width:100%;height:100%}.widget-kvass-media-render-vimeo__thumbnail{background-size:cover;background-repeat:no-repeat;background-position:center;filter:blur(10px);opacity:.7}.widget-kvass-media-render-vimeo__blocked{display:flex;justify-content:center;align-items:center;left:50%;top:50%;transform:translate(-50%,-50%)}.widget-kvass-media-render-vimeo__blocked svg{opacity:.3}@media (max-width: 992px){.widget-kvass-media-render-vimeo__blocked svg{font-size:2.5em}}.widget-kvass-media-render-vimeo__blocked-warning{pointer-events:initial;position:absolute;bottom:0;text-align:center;background-color:#f2f2f2;font-size:.6em;bottom:3rem;left:3rem;max-width:400px;font-size:.8em;padding:1.5em 2em}.widget-kvass-media-render-vimeo__blocked-warning-button{padding:.5rem;border:1px solid #818181;backdrop-filter:none;background-color:transparent}@media (max-width: 992px){.widget-kvass-media-render-vimeo__blocked-warning{left:.5rem;bottom:.5rem;font-size:.6em;max-width:200px}}.widget-kvass-media-render-vimeo .fade-enter-active,.widget-kvass-media-render-vimeo .fade-leave-active{transition:opacity .5s}.widget-kvass-media-render-vimeo .fade-enter,.widget-kvass-media-render-vimeo .fade-leave-to{opacity:0}",B={props:{url:{type:String,default:""},videoState:{type:String,default:"ready",enums:["ready ","play","pause"]},loop:{type:[String,Boolean],default:!0},autoplay:{type:[String,Boolean],default:!1},controls:{type:[String,Boolean],default:!0},mute:{type:[String,Boolean],default:!1},displayThumbnail:{type:[String,Boolean],default:!0},ignoreConsent:{type:[String,Boolean],default:!1},hideConsent:{type:[String,Boolean],default:!1},thumbnailSource:{type:String,default:""},consentBlockMessage:{type:String,default:"The video is blocked due to lack of consent to cookies"},consentButtonLabel:{type:String,default:"Edit consents"},aspectRatio:{type:String,default:"16/9"}},watch:{videoState:{handler(e,t){if(e!==t)switch(e){case"play":return this.play();case"pause":return this.pause();default:return}}}},data(){return{ready:!1,thumbnail:null,consents:[]}},computed:{kvassDefined(){return typeof Kvass<"u"},showConsent(){return this.hideConsent||!this.kvassDefined?!1:!this.ignoreConsent&&!this.consents.includes("statistics")},videoId(){if(!this.url)return;let e=[p(this.url,/https\:\/\/(w{3}\.)?vimeo\.com\/(.+)\/?/,{group:2}),p(this.url,/https\:\/\/(w{3}\.)?player\.vimeo\.com\/(video\/)?(.+)\/?/,{group:3})].find(t=>!!t);if(e)return e.split("&")[0]}},methods:{openConsent(){this.kvassDefined&&Kvass.emit("consent:show")},async play(){try{this.player.setVolume(0),await this.player.play()}catch(e){console.log(e)}},pause(){this.player.pause()},async init(){const e={url:`https://vimeo.com/${this.videoId}`,loop:this.loop,autoplay:this.autoplay,controls:this.controls,muted:this.mute||this.autoplay,playsinline:1,dnt:1};function t(i){return i==="false"?!1:i==="true"?!0:i}Object.entries(e).map(([i,s])=>e[i]=t(s)),_("https://player.vimeo.com/api/player.js");const a=await S(()=>window.Vimeo,{limit:100});this.player=new a.Player(this.$refs.vimeoPlayer,e),await this.player.ready().then(()=>{this.ready=!0}).catch(i=>{console.log(i)})}},async mounted(){if(this.displayThumbnail&&(this.thumbnail=`/api/media/thumbnail?url=${this.url}`),this.ignoreConsent||!this.kvassDefined)return this.init();let e=t=>{if(this.consents=t||[],!(!this.consents||!this.consents.length)&&this.consents.includes("statistics"))return this.init()};this.kvassDefined&&(Kvass.emit("consent:get",t=>e(t)),Kvass.on("consent:change",e))}},C={key:0,class:"widget-kvass-media-render-vimeo__blocked"},z={class:"widget-kvass-media-render-vimeo__blocked-warning"};function D(e,t,a,i,s,n){return o(),r("div",{class:"widget-kvass-media-render-vimeo",style:c(`aspect-ratio: ${a.aspectRatio};`)},[l((o(),r("div",{key:n.videoId,ref:"vimeoPlayer",class:"widget-kvass-media-render-vimeo__embed",frameborder:"0",allow:"autoplay; fullscreen;",webkitallowfullscreen:"",mozallowfullscreen:""})),[[m,s.ready]]),v(y,{name:"fade",mode:"in-out"},{default:g(()=>[l(d("div",{class:"widget-kvass-media-render-vimeo__thumbnail",style:c({backgroundImage:`url(${s.thumbnail})`})},null,4),[[m,!s.ready&&s.thumbnail]])]),_:1}),n.showConsent?(o(),r("div",C,[d("div",z,[k(u(a.consentBlockMessage)+" ",1),d("button",{class:"widget-kvass-media-render-vimeo__blocked-warning-button",onClick:t[0]||(t[0]=(...h)=>n.openConsent&&n.openConsent(...h))},u(a.consentButtonLabel),1)])])):w("",!0)],4)}const V=f(B,[["render",D],["styles",[x]]]);customElements.define("kvass-vimeo",b(V));
@@ -0,0 +1 @@
1
+ import{_ as p,o as d,c as u,a as i,j as h,w as y,z as f,y as l,A as b,B as g,C as w,t as c,d as v,p as k}from"./_plugin-vue_export-helper.js";import{E as a,L as _,W as S}from"./index.js";const B=".widget-kvass-media-render-youtube{height:100%;width:100%;position:relative}.widget-kvass-media-render-youtube iframe{height:100%;width:100%}.widget-kvass-media-render-youtube>*{position:absolute;top:0;left:0;width:100%;height:100%}.widget-kvass-media-render-youtube__thumbnail{background-size:cover;background-repeat:no-repeat;background-position:center;filter:blur(10px);opacity:.7}.widget-kvass-media-render-youtube__blocked{display:flex;justify-content:center;align-items:center;left:50%;top:50%;transform:translate(-50%,-50%)}.widget-kvass-media-render-youtube__blocked svg{opacity:.3}@media (max-width: 992px){.widget-kvass-media-render-youtube__blocked svg{font-size:2.5em}}.widget-kvass-media-render-youtube__blocked-warning{pointer-events:initial;position:absolute;bottom:0;text-align:center;background-color:#f2f2f2;font-size:.6em;bottom:3rem;left:3rem;max-width:400px;font-size:.8em;padding:1.5em 2em}.widget-kvass-media-render-youtube__blocked-warning-button{padding:.5rem;border:1px solid #818181;backdrop-filter:none;background-color:transparent}@media (max-width: 992px){.widget-kvass-media-render-youtube__blocked-warning{left:.5rem;bottom:.5rem;font-size:.6em;max-width:200px}}.widget-kvass-media-render-youtube .fade-enter-active,.widget-kvass-media-render-youtube .fade-leave-active{transition:opacity .5s}.widget-kvass-media-render-youtube .fade-enter,.widget-kvass-media-render-youtube .fade-leave-to{opacity:0}",x={props:{url:{type:String,default:""},videoState:{type:String,default:"ready",enums:["ready ","play","pause"]},loop:{type:[String,Boolean],default:!0},autoplay:{type:[String,Boolean],default:!1},controls:{type:[String,Boolean],default:!0},mute:{type:[String,Boolean],default:!1},displayThumbnail:{type:[String,Boolean],default:!0},ignoreConsent:{type:[String,Boolean],default:!1},hideConsent:{type:[String,Boolean],default:!1},thumbnailSource:{type:String,default:""},consentBlockMessage:{type:String,default:"The video is blocked due to lack of consent to cookies"},consentButtonLabel:{type:String,default:"Edit consents"},aspectRatio:{type:String,default:"16/9"}},watch:{videoState:{handler(e,t){if(e!==t)switch(e){case"play":return this.play();case"pause":return this.pause();default:return}}}},data(){return{ready:!1,thumbnail:null,consents:[]}},computed:{kvassDefined(){return typeof Kvass<"u"},showConsent(){return this.hideConsent||!this.kvassDefined?!1:!this.ignoreConsent&&!this.consents.includes("statistics")},videoId(){if(!this.url)return;let e=this.url,t=[a(e,/https\:\/\/(w{3}\.)?youtube\.com\/watch\?v=(.+)\/?/,{group:2}),a(e,/https\:\/\/(w{3}\.)?youtube\.com\/embed\/(.+)\/?/,{group:2}),a(e,/https\:\/\/(w{3}\.)?youtube\.com\/watch\/(.+)\/?/,{group:2}),a(e,/https\:\/\/(w{3}\.)?youtu\.be\/(.+)\/?/,{group:2})].find(s=>!!s);if(t)return t.split("&")[0]}},methods:{openConsent(){this.kvassDefined&&Kvass.emit("consent:show")},play(){this.player.mute(),this.player.playVideo()},pause(){this.player.pauseVideo()},async init(){const e={loop:this.loop,autoplay:this.autoplay,controls:this.controls,muted:this.mute||this.autoplay,enablejsapi:1,playsinline:1};function t(s){return s==="false"?!1:s==="true"?!0:s}Object.entries(e).map(([s,r])=>e[s]=Number(t(r))),_("https://www.youtube.com/iframe_api"),await S(()=>window.YT&&window.YT.Player,{limit:200}),this.player=new YT.Player(this.$refs.youtubePlayer,{videoId:this.videoId,playerVars:{...e,videoId:this.videoId,origin:window.location.host},events:{onReady:s=>{this.ready=!0,e.mute&&this.player.mute(),e.autoplay&&this.play()}}})}},async mounted(){if(this.displayThumbnail&&(this.thumbnail=!this.thumbnailSource&&this.kvassDefined?`/api/media/thumbnail?url=${this.url}`:this.thumbnailSource),this.ignoreConsent||!this.kvassDefined)return this.init();let e=t=>{if(this.consents=t||[],!(!this.consents||!this.consents.length)&&this.consents.includes("statistics"))return this.init()};this.kvassDefined&&(Kvass.emit("consent:get",t=>e(t)),Kvass.on("consent:change",e))}},C={ref:"youtubePlayer",class:"kvass-media-render-youtube__embed",frameborder:"0",allow:"autoplay; fullscreen;",webkitallowfullscreen:"",mozallowfullscreen:""},T={key:0,class:"widget-kvass-media-render-youtube__blocked"},z={class:"widget-kvass-media-render-youtube__blocked-warning"};function D(e,t,s,r,n,o){return d(),u("div",{class:"widget-kvass-media-render-youtube",style:l(`aspect-ratio: ${s.aspectRatio};`)},[i("div",C,null,512),h(g,{name:"fade",mode:"in-out"},{default:y(()=>[f(i("div",{class:"widget-kvass-media-render-youtube__thumbnail",style:l({backgroundImage:`url(${n.thumbnail})`})},null,4),[[b,!n.ready&&n.thumbnail]])]),_:1}),o.showConsent?(d(),u("div",T,[i("div",z,[w(c(s.consentBlockMessage)+" ",1),i("button",{class:"widget-kvass-media-render-youtube__blocked-warning-button",onClick:t[0]||(t[0]=(...m)=>o.openConsent&&o.openConsent(...m))},c(s.consentButtonLabel),1)])])):v("",!0)],4)}const E=p(x,[["render",D],["styles",[B]]]);customElements.define("kvass-youtube",k(E));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kvass/widgets",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",
@@ -16,6 +16,9 @@
16
16
  "vue": "^3.4.15",
17
17
  "webfontloader": "^1.6.28"
18
18
  },
19
+ "files": [
20
+ "dist"
21
+ ],
19
22
  "devDependencies": {
20
23
  "@types/webfontloader": "^1.6.38",
21
24
  "@vitejs/plugin-vue": "^5.0.3",
@@ -1,21 +0,0 @@
1
- name: CI
2
- on:
3
- push:
4
- branches:
5
- - master
6
- jobs:
7
- deploy:
8
- runs-on: ubuntu-20.04
9
- steps:
10
- - uses: actions/checkout@v3
11
- - uses: actions/setup-node@v3
12
- with:
13
- node-version: '20'
14
- - name: Authenticate with private NPM package
15
- run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
16
- - run: npm install
17
- - name: Release
18
- env:
19
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
20
- GH_TOKEN: ${{ secrets.GH_TOKEN }}
21
- run: npx semantic-release
package/.prettierrc DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "singleQuote": true,
3
- "tabWidth": 2,
4
- "trailingComma": "all",
5
- "semi": false
6
- }
package/.releaserc DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "ci": false
3
- }
package/index.html DELETED
@@ -1,38 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="nb">
3
-
4
- <head>
5
- <meta charset="UTF-8" />
6
- <link rel="icon" type="image/svg+xml" href="favicon.svg" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
- <title>Kvass Web Components</title>
9
- </head>
10
-
11
- <body
12
- style="font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;">
13
- <!-- <kvass-contact
14
- account-url="https://local.kvass.test"
15
- label-subtitle="Ønsker du å motta vårt nyhetsbrev?"
16
- tags="Test side"
17
- upsell
18
- references="Residential:630f5c19ffd25600331dcd05"
19
- default-assignees="630f5c19ffd25600331dcc06,627181d6009b8f0022b09ac8"
20
- />
21
-
22
- <script type="module" src="/src/contact/main.js"></script> -->
23
-
24
- <!-- <kvass-img-comparison-slider
25
- first-image="https://assets.lastdodo.com/image/ld_medium/plain/assets/catalog/assets/2013/12/2/2/8/7/pdf_287e8674-5b0f-11e3-90d5-a6d2687aed80.jpg,First image"
26
- second-image="https://seeklogo.com/images/I/Ilguciema_Kvass-logo-227537F6D4-seeklogo.com.png,Second imanr bge"
27
- options="keyboard:disabled,direction:vertical"></kvass-img-comparison-slider>
28
-
29
- <script type="module" src="/src/img-comparison-slider/main.js"></script> -->
30
- <!-- <kvass-map coordinates="10.745,59.9123" address="Klokkergårdveien 5, 1711 Sarpsborg" show-address /> -->
31
- <!-- <kvass-flatfinder project-url="https://alvebergtunet.production.kvass.no" project-id="65a4f48ed1ba5cd61468f235"
32
- path-prefix="/residential" />
33
- <script type="module" src="/dist/flatfinder.js"></script> -->
34
- <kvass-font-selector></kvass-font-selector>
35
- <script type="module" src="/src/font-selector/main.js"></script>
36
- </body>
37
-
38
- </html>
@@ -1,80 +0,0 @@
1
- # kvass-contact
2
-
3
- A simple, embeddable Web Component for sending leads to Kvass.
4
-
5
- `https://unpkg.com/@kvass/widgets@latest/dist/contact.js`
6
-
7
- ## Develop
8
-
9
- To run in development mode, first install the neccessary packages.
10
-
11
- ```
12
- npm install
13
- ```
14
-
15
- Then, run in development mode.
16
-
17
- ```
18
- npm run dev
19
- ```
20
-
21
- Open `localhost:3000` in the browser of your choice, and you will see the form widget.
22
-
23
- ## Build
24
-
25
- To build the widget for production, run `build` instead of `dev`.
26
-
27
- ```
28
- npm run build
29
- ```
30
-
31
- To use the widget, use the `<kvass-contact />` element as shown here.
32
-
33
- ```html
34
- <kvass-contact account-url="https://example.kvass.no" />
35
- ```
36
-
37
- ## Props
38
-
39
- The component has several props for easy configuration.
40
-
41
- | Name | Type | Description | Default |
42
- | :--------------------- | :------ | :--------------------------------------------------------------------------------------- | :-------------------------------------- |
43
- | account-url `required` | String | Account URL where data will be sent. | |
44
- | references `required` | String | Comma-separated list of references in {type}:{id} format | |
45
- | default-assignees | String | Comma-separated list of userIds. Used as fallback assignees of the created task in Kvass | |
46
- | projects | String | Comma-separated list of project ids. If not defined, a selection field will show | |
47
- | tags | String | Comma-separated list of tags | |
48
- | upsell | Boolean | If `true`, shows a checkbox for upsell | `false` |
49
- | label-title | String | Title of the lead form | `"Meld interesse"` |
50
- | label-subtitle | String | Optional subtitle shown under form title | |
51
- | label-submit | String | Label for the submit button | `"Meld interesse"` |
52
- | privacy-url | String | Optional URL to privacy statement | `{accountUrl}/api/legal/privacy/tenant` |
53
- | label-success | String | Message displayed after submit | `"Takk for interessen!"` |
54
- | success-theme | String | Success theme, enums: ['default', 'overlay'] | `"default"` |
55
- | submit-timeout | Number | Delay on submit reset | `2000` |
56
-
57
- ## Styling
58
-
59
- The widget's styles are based on CSS custom properties, and can be overwritten.
60
- These are the available CSS variables.
61
-
62
- | Name | Description | Default |
63
- | :------------------------------- | :---------------------------------------------------------- | :------------ |
64
- | --kvass-contact-background | The form's background color | `#ffffff` |
65
- | --kvass-contact-spacing | Base spacing amount. Other amounts are calculated from this | `2rem` |
66
- | --kvass-contact-padding | Outer padding of the form element | `2rem` |
67
- | --kvass-contact-max-width | Max width of the form | `720px` |
68
- | --kvass-contact-border-radius | Base border-radius | `4px` |
69
- | --kvass-contact-border-color | Color of the borders of the form fields | `#eaeaea` |
70
- | --kvass-contact-border-width | Border-width for input fields | `1px` |
71
- | --kvass-contact-color | Base text color | `#222222` |
72
- | --kvass-contact-color-inverted | Inverted text color. Used for the submit button | `#ffffff` |
73
- | --kvass-contact-primary | Primary color. Used for submit button and form elements | `#1d56d8` |
74
- | --kvass-contact-error | Error color. Used for error states | `#d81d1d` |
75
- | --kvass-contact-grid-columns | Amount of columns in the form | `1` |
76
- | --kvass-contact-disabled | Background color on disabled button | `#eaeaea` |
77
- | --kvass-contact-input-background | Background color for input fields | `transparent` |
78
- | --kvass-contact-outline-width | Width of focus outline | `2px` |
79
- | --kvass-contact-outline-offset | Offset between the form control and its outline | `0px` |
80
- | --kvass-contact-checkbox-size | Size of checkboxes | `1em` |
@@ -1,82 +0,0 @@
1
- function createLead(url, data, projects, defaultAssignees) {
2
- if (projects && projects instanceof Array && projects.length) {
3
- return Promise.all(
4
- projects.map((p) => {
5
- let projectRef = { onModel: 'Project', ref: p }
6
- return createLead(url, {
7
- ...data,
8
- project: p,
9
- references: [projectRef, ...data.references],
10
- })
11
- }),
12
- )
13
- }
14
-
15
- if (!projects?.length && defaultAssignees?.length) {
16
- return createContact(
17
- url,
18
- { ...data.contact, assignees: defaultAssignees },
19
- data.comment,
20
- )
21
- }
22
-
23
- return fetch(`${url}/api/graphql`, {
24
- method: 'POST',
25
- headers: {
26
- 'Content-Type': 'application/json',
27
- },
28
- body: JSON.stringify({
29
- query: `
30
- mutation ($data: LeadCreate!) {
31
- LeadCreate(data: $data) {
32
- id
33
- }
34
- }
35
- `,
36
- variables: { data },
37
- }),
38
- }).then((res) => res.json())
39
- }
40
-
41
- function createContact(url, data, comment) {
42
- return fetch(`${url}/api/graphql`, {
43
- method: 'POST',
44
- headers: {
45
- 'Content-Type': 'application/json',
46
- },
47
- body: JSON.stringify({
48
- query: `
49
- mutation ($data: ContactInput!, $comment: String) {
50
- ContactCreate(data: $data, comment: $comment) {
51
- id
52
- }
53
- }
54
- `,
55
- variables: { data, comment },
56
- }),
57
- }).then((res) => res.json())
58
- }
59
-
60
- function getProjects(url) {
61
- return fetch(`${url}/api/graphql`, {
62
- method: 'POST',
63
- headers: {
64
- 'Content-Type': 'application/json',
65
- },
66
- body: JSON.stringify({
67
- query: `
68
- query {
69
- Projects {
70
- id
71
- name
72
- isPublished
73
- }
74
- }
75
- `,
76
- }),
77
- })
78
- .then((res) => res.json())
79
- .then((res) => res.data.Projects.filter((d) => d.isPublished))
80
- }
81
-
82
- export { createLead, createContact, getProjects }
@@ -1,127 +0,0 @@
1
- <script>
2
- export default {
3
- // disable attrs on root element
4
- inheritAttrs: false,
5
- }
6
- </script>
7
-
8
- <script setup>
9
- const emit = defineEmits(['update:modelValue'])
10
- const props = defineProps({
11
- modelValue: [Boolean, Array],
12
- state: String,
13
- label: String,
14
- })
15
-
16
- function onChange(ev) {
17
- if (typeof props.modelValue === 'boolean')
18
- return emit('update:modelValue', ev.target.checked)
19
- return emit(
20
- 'update:modelValue',
21
- ev.target.checked
22
- ? [...props.modelValue, props.state]
23
- : props.modelValue.filter((v) => v !== props.state),
24
- )
25
- }
26
- </script>
27
-
28
- <template>
29
- <label
30
- class="kvass-contact-checkbox"
31
- :class="[
32
- { 'kvass-contact-checkbox--required': 'required' in $attrs },
33
- $attrs.class,
34
- ]"
35
- >
36
- <input
37
- class="kvass-contact-checkbox__element"
38
- type="checkbox"
39
- v-bind="$attrs"
40
- :value="modelValue"
41
- :checked="$attrs.checked"
42
- @change="onChange"
43
- />
44
- <span class="kvass-contact-checkbox__label" v-html="label"></span>
45
- </label>
46
- </template>
47
-
48
- <style lang="scss">
49
- .kvass-contact-checkbox {
50
- display: flex;
51
- align-items: start;
52
- gap: 0.75rem;
53
- cursor: pointer;
54
-
55
- &__element {
56
- cursor: inherit;
57
-
58
- margin: 0;
59
- appearance: none;
60
- background-color: var(--kvass-contact-input-background);
61
- flex-shrink: 0;
62
-
63
- font: inherit;
64
- color: currentColor;
65
- width: var(
66
- --kvass-contact-checkbox-size,
67
- var(--kvass-contact-default-checkbox-size)
68
- );
69
- aspect-ratio: 1;
70
- border: var(
71
- --kvass-contact-checkbox-border-width,
72
- var(--kvass-contact-default-checkbox-border-width)
73
- )
74
- solid currentColor;
75
- border-radius: var(
76
- --kvass-contact-checkbox-border-radius,
77
- var(--kvass-contact-default-checkbox-border-radius)
78
- );
79
-
80
- &:focus-visible {
81
- outline: var(
82
- --kvass-contact-outline-width,
83
- var(--kvass-contact-default-outline-width)
84
- )
85
- solid var(--kvass-contact-color, var(--kvass-contact-default-color));
86
- outline-offset: var(
87
- --kvass-contact-outline-offset,
88
- var(--kvass-contact-default-outline-offset)
89
- );
90
- }
91
-
92
- &:checked {
93
- position: relative;
94
- background-color: var(
95
- --kvass-contact-primary,
96
- var(--kvass-contact-default-primary)
97
- );
98
- border-color: var(
99
- --kvass-contact-primary,
100
- var(--kvass-contact-default-primary)
101
- );
102
-
103
- &::before {
104
- content: '✓';
105
- font-size: 0.75em;
106
- position: absolute;
107
- top: 50%;
108
- left: 50%;
109
- translate: -50% -50%;
110
-
111
- color: var(
112
- --kvass-contact-color-inverted,
113
- var(--kvass-contact-default-color-inverted)
114
- );
115
- }
116
- }
117
- }
118
-
119
- &--required {
120
- span:after {
121
- content: '*';
122
- color: var(--kvass-contact-error, var(--kvass-contact-default-error));
123
- margin-left: 0.3rem;
124
- }
125
- }
126
- }
127
- </style>
@@ -1,156 +0,0 @@
1
- <script>
2
- export default {
3
- // disable attrs on root element
4
- inheritAttrs: false,
5
- }
6
- </script>
7
-
8
- <script setup>
9
- import { computed, ref } from 'vue';
10
-
11
- const emit = defineEmits(['update:modelValue'])
12
- const props = defineProps({
13
- modelValue: [String, Array],
14
- label: String,
15
- type: String,
16
- })
17
-
18
- const component = computed(() => {
19
- switch (props.type) {
20
- case 'textarea':
21
- return 'textarea'
22
- case 'select':
23
- return 'select'
24
- default:
25
- return 'input'
26
- }
27
- })
28
-
29
- const focused = ref(false)
30
- const blurred = ref(false)
31
-
32
- function onInput(event) {
33
- emit('update:modelValue', event.target.value)
34
- focused.value = true
35
- }
36
-
37
- function onBlur() {
38
- if (!focused.value) return
39
- blurred.value = true
40
- }
41
- </script>
42
-
43
- <template>
44
- <label
45
- class="kvass-contact-field"
46
- :class="[
47
- {
48
- 'kvass-contact-field--required': 'required' in $attrs,
49
- 'kvass-contact-field--focused': blurred,
50
- },
51
- $attrs.class,
52
- ]"
53
- :for="$attrs.id"
54
- >
55
- <span class="kvass-contact-field__label" v-if="label">{{ label }}</span>
56
- <component
57
- :is="component"
58
- class="kvass-contact-field__element"
59
- v-bind="$attrs"
60
- :value="modelValue"
61
- @input="onInput"
62
- @blur="onBlur"
63
- >
64
- <slot />
65
- </component>
66
- </label>
67
- </template>
68
-
69
- <style lang="scss">
70
- .kvass-contact-field {
71
- display: flex;
72
- flex-direction: column;
73
- gap: 0.3rem;
74
-
75
- &__label {
76
- margin-left: var(--kvass-contact-label-transform, 0);
77
- font-weight: var(--kvass-contact-label-weight, initial);
78
- }
79
-
80
- input {
81
- -webkit-appearance: none;
82
- }
83
-
84
- &__element {
85
- padding: calc(
86
- var(--kvass-contact-spacing, var(--kvass-contact-default-spacing)) / 2
87
- );
88
-
89
- padding-left: var(
90
- --kvass-contact-field-input-tranform,
91
- calc(
92
- var(--kvass-contact-spacing, var(--kvass-contact-default-spacing)) / 2
93
- )
94
- );
95
-
96
- border-radius: var(
97
- --kvass-contact-border-radius,
98
- var(--kvass-contact-default-border-radius)
99
- );
100
- border: var(
101
- --kvass-contact-border-width,
102
- var(--kvass-contact-default-border-width)
103
- )
104
- solid
105
- var(
106
- --kvass-contact-border-color,
107
- var(--kvass-contact-default-border-color)
108
- );
109
- resize: vertical;
110
- font: inherit;
111
- color: inherit;
112
- background-color: var(
113
- --kvass-contact-input-background,
114
- var(--kvass-contact-default-input-background)
115
- );
116
-
117
- &:focus-visible {
118
- outline: var(
119
- --kvass-contact-outline-width,
120
- var(--kvass-contact-default-outline-width)
121
- )
122
- solid var(--kvass-contact-color, var(--kvass-contact-default-color));
123
-
124
- outline-offset: var(
125
- --kvass-contact-outline-offset,
126
- var(--kvass-contact-default-outline-offset)
127
- );
128
- }
129
- }
130
-
131
- &--required {
132
- .kvass-contact-field__label::after {
133
- content: '*';
134
- color: var(--kvass-contact-error, var(--kvass-contact-default-error));
135
- margin-left: 0.3rem;
136
- }
137
-
138
- &.kvass-contact-field--focused {
139
- .kvass-contact-field__element:invalid {
140
- border-color: var(
141
- --kvass-contact-error,
142
- var(--kvass-contact-default-error)
143
- );
144
- }
145
- }
146
- }
147
-
148
- &--full-width {
149
- grid-column-end: span
150
- var(
151
- --kvass-contact-grid-columns,
152
- var(--kvass-contact-default-grid-columns)
153
- );
154
- }
155
- }
156
- </style>
@@ -1,63 +0,0 @@
1
- <script setup>
2
- defineProps({
3
- label: String,
4
- })
5
- </script>
6
-
7
- <template>
8
- <fieldset class="kvass-contact-fieldset">
9
- <legend class="kvass-contact-fieldset__label" v-if="label">
10
- {{ label }}
11
- </legend>
12
- <slot />
13
- </fieldset>
14
- </template>
15
-
16
- <style lang="scss">
17
- .kvass-contact-fieldset {
18
- position: relative;
19
- display: flex;
20
- flex-direction: column;
21
- gap: calc(
22
- var(--kvass-contact-spacing, var(--kvass-contact-default-spacing)) / 4
23
- );
24
- margin: calc(
25
- var(--kvass-contact-spacing, var(--kvass-contact-default-spacing)) / 1.5
26
- )
27
- 0 0 0;
28
- padding: calc(
29
- var(--kvass-contact-spacing, var(--kvass-contact-default-spacing)) / 2
30
- );
31
- border-radius: var(
32
- --kvass-contact-border-radius,
33
- var(--kvass-contact-default-border-radius)
34
- );
35
- border: var(
36
- --kvass-contact-border-width,
37
- var(--kvass-contact-default-border-width)
38
- )
39
- solid
40
- var(--kvass-contact-border-color, var(--kvass-contact-default-border-color));
41
- font: inherit;
42
-
43
- &:focus-visible {
44
- outline: var(
45
- --kvass-contact-outline-width,
46
- var(--kvass-contact-default-outline-width)
47
- )
48
- solid var(--kvass-contact-color, var(--kvass-contact-default-color));
49
- outline-offset: var(
50
- --kvass-contact-outline-offset,
51
- var(--kvass-contact-default-outline-offset)
52
- );
53
- }
54
-
55
- &__label {
56
- margin: 0;
57
- padding: 0;
58
- position: absolute;
59
- top: -1.4rem;
60
- left: 0;
61
- }
62
- }
63
- </style>