add screen

This commit is contained in:
2026-09-10 03:11:20 +07:00
parent 8fb3de92c8
commit e95a5423b5
65 changed files with 3026 additions and 2427 deletions
@@ -1,4 +1,4 @@
import{A as e,D as t,N as n,it as r,v as i}from"./vue-router-bPs2Bq2h.js";import{B as a,G as o,J as s,K as c,M as l,N as u,V as d,Y as f,Z as p,o as m,r as h,t as g}from"./light-BDe84dgP.js";import{a as _,c as v,r as y}from"./resolve-slot-Cp3m6n7Y.js";import{C as b,F as x,I as S,L as C,M as w,N as T,R as E,V as D,w as O}from"./index-DzEqT7MZ.js";function k(e){let{lineHeight:t,borderRadius:n,fontWeightStrong:r,baseColor:i,dividerColor:o,actionColor:s,textColor1:c,textColor2:l,closeColorHover:u,closeColorPressed:f,closeIconColor:p,closeIconColorHover:m,closeIconColorPressed:h,infoColor:g,successColor:_,warningColor:v,errorColor:y,fontSize:b}=e;return Object.assign(Object.assign({},O),{fontSize:b,lineHeight:t,titleFontWeight:r,borderRadius:n,border:`1px solid ${o}`,color:s,titleTextColor:c,iconColor:l,contentTextColor:l,closeBorderRadius:n,closeColorHover:u,closeColorPressed:f,closeIconColor:p,closeIconColorHover:m,closeIconColorPressed:h,borderInfo:`1px solid ${d(i,a(g,{alpha:.25}))}`,colorInfo:d(i,a(g,{alpha:.08})),titleTextColorInfo:c,iconColorInfo:g,contentTextColorInfo:l,closeColorHoverInfo:u,closeColorPressedInfo:f,closeIconColorInfo:p,closeIconColorHoverInfo:m,closeIconColorPressedInfo:h,borderSuccess:`1px solid ${d(i,a(_,{alpha:.25}))}`,colorSuccess:d(i,a(_,{alpha:.08})),titleTextColorSuccess:c,iconColorSuccess:_,contentTextColorSuccess:l,closeColorHoverSuccess:u,closeColorPressedSuccess:f,closeIconColorSuccess:p,closeIconColorHoverSuccess:m,closeIconColorPressedSuccess:h,borderWarning:`1px solid ${d(i,a(v,{alpha:.33}))}`,colorWarning:d(i,a(v,{alpha:.08})),titleTextColorWarning:c,iconColorWarning:v,contentTextColorWarning:l,closeColorHoverWarning:u,closeColorPressedWarning:f,closeIconColorWarning:p,closeIconColorHoverWarning:m,closeIconColorPressedWarning:h,borderError:`1px solid ${d(i,a(y,{alpha:.25}))}`,colorError:d(i,a(y,{alpha:.08})),titleTextColorError:c,iconColorError:y,contentTextColorError:l,closeColorHoverError:u,closeColorPressedError:f,closeIconColorError:p,closeIconColorHoverError:m,closeIconColorPressedError:h})}var A={name:`Alert`,common:g,self:k},j=c(`alert`,`
import{A as e,D as t,N as n,it as r,v as i}from"./vue-router-bPs2Bq2h.js";import{B as a,G as o,J as s,K as c,M as l,N as u,V as d,Y as f,Z as p,o as m,r as h,t as g}from"./light-BDe84dgP.js";import{a as _,c as v,r as y}from"./resolve-slot-Cp3m6n7Y.js";import{H as b,I as x,L as S,N as C,P as w,R as T,T as E,w as D,z as O}from"./index-DsVCmMvY.js";function k(e){let{lineHeight:t,borderRadius:n,fontWeightStrong:r,baseColor:i,dividerColor:o,actionColor:s,textColor1:c,textColor2:l,closeColorHover:u,closeColorPressed:f,closeIconColor:p,closeIconColorHover:m,closeIconColorPressed:h,infoColor:g,successColor:_,warningColor:v,errorColor:y,fontSize:b}=e;return Object.assign(Object.assign({},E),{fontSize:b,lineHeight:t,titleFontWeight:r,borderRadius:n,border:`1px solid ${o}`,color:s,titleTextColor:c,iconColor:l,contentTextColor:l,closeBorderRadius:n,closeColorHover:u,closeColorPressed:f,closeIconColor:p,closeIconColorHover:m,closeIconColorPressed:h,borderInfo:`1px solid ${d(i,a(g,{alpha:.25}))}`,colorInfo:d(i,a(g,{alpha:.08})),titleTextColorInfo:c,iconColorInfo:g,contentTextColorInfo:l,closeColorHoverInfo:u,closeColorPressedInfo:f,closeIconColorInfo:p,closeIconColorHoverInfo:m,closeIconColorPressedInfo:h,borderSuccess:`1px solid ${d(i,a(_,{alpha:.25}))}`,colorSuccess:d(i,a(_,{alpha:.08})),titleTextColorSuccess:c,iconColorSuccess:_,contentTextColorSuccess:l,closeColorHoverSuccess:u,closeColorPressedSuccess:f,closeIconColorSuccess:p,closeIconColorHoverSuccess:m,closeIconColorPressedSuccess:h,borderWarning:`1px solid ${d(i,a(v,{alpha:.33}))}`,colorWarning:d(i,a(v,{alpha:.08})),titleTextColorWarning:c,iconColorWarning:v,contentTextColorWarning:l,closeColorHoverWarning:u,closeColorPressedWarning:f,closeIconColorWarning:p,closeIconColorHoverWarning:m,closeIconColorPressedWarning:h,borderError:`1px solid ${d(i,a(y,{alpha:.25}))}`,colorError:d(i,a(y,{alpha:.08})),titleTextColorError:c,iconColorError:y,contentTextColorError:l,closeColorHoverError:u,closeColorPressedError:f,closeIconColorError:p,closeIconColorHoverError:m,closeIconColorPressedError:h})}var A={name:`Alert`,common:g,self:k},j=c(`alert`,`
line-height: var(--n-line-height);
border-radius: var(--n-border-radius);
position: relative;
@@ -18,7 +18,7 @@ import{A as e,D as t,N as n,it as r,v as i}from"./vue-router-bPs2Bq2h.js";import
pointer-events: none;
`),f(`closable`,[c(`alert-body`,[s(`title`,`
padding-right: 24px;
`)])]),s(`icon`,{color:`var(--n-icon-color)`}),c(`alert-body`,{padding:`var(--n-padding)`},[s(`title`,{color:`var(--n-title-text-color)`}),s(`content`,{color:`var(--n-content-text-color)`})]),b({originalTransition:`transform .3s var(--n-bezier)`,enterToProps:{transform:`scale(1)`},leaveToProps:{transform:`scale(0.9)`}}),s(`icon`,`
`)])]),s(`icon`,{color:`var(--n-icon-color)`}),c(`alert-body`,{padding:`var(--n-padding)`},[s(`title`,{color:`var(--n-title-text-color)`}),s(`content`,{color:`var(--n-content-text-color)`})]),D({originalTransition:`transform .3s var(--n-bezier)`,enterToProps:{transform:`scale(1)`},leaveToProps:{transform:`scale(0.9)`}}),s(`icon`,`
position: absolute;
left: 0;
top: 0;
@@ -45,4 +45,4 @@ import{A as e,D as t,N as n,it as r,v as i}from"./vue-router-bPs2Bq2h.js";import
font-size: 16px;
line-height: 19px;
font-weight: var(--n-title-font-weight);
`,[o(`& +`,[s(`content`,{marginTop:`9px`})])]),s(`content`,{transition:`color .3s var(--n-bezier)`,fontSize:`var(--n-font-size)`})]),s(`icon`,{transition:`color .3s var(--n-bezier)`})]),M=t({name:`Alert`,inheritAttrs:!1,props:Object.assign(Object.assign({},h.props),{title:String,showIcon:{type:Boolean,default:!0},type:{type:String,default:`default`},bordered:{type:Boolean,default:!0},closable:Boolean,onClose:Function,onAfterLeave:Function,onAfterHide:Function}),slots:Object,setup(e){let{mergedClsPrefixRef:t,mergedBorderedRef:n,inlineThemeDisabled:a,mergedRtlRef:o}=u(e),s=h(`Alert`,`-alert`,j,A,e,t),c=m(`Alert`,o,t),d=i(()=>{let{common:{cubicBezierEaseInOut:t},self:n}=s.value,{fontSize:r,borderRadius:i,titleFontWeight:a,lineHeight:o,iconSize:c,iconMargin:l,iconMarginRtl:u,closeIconSize:d,closeBorderRadius:f,closeSize:m,closeMargin:h,closeMarginRtl:g,padding:_}=n,{type:y}=e,{left:b,right:x}=v(l);return{"--n-bezier":t,"--n-color":n[p(`color`,y)],"--n-close-icon-size":d,"--n-close-border-radius":f,"--n-close-color-hover":n[p(`closeColorHover`,y)],"--n-close-color-pressed":n[p(`closeColorPressed`,y)],"--n-close-icon-color":n[p(`closeIconColor`,y)],"--n-close-icon-color-hover":n[p(`closeIconColorHover`,y)],"--n-close-icon-color-pressed":n[p(`closeIconColorPressed`,y)],"--n-icon-color":n[p(`iconColor`,y)],"--n-border":n[p(`border`,y)],"--n-title-text-color":n[p(`titleTextColor`,y)],"--n-content-text-color":n[p(`contentTextColor`,y)],"--n-line-height":o,"--n-border-radius":i,"--n-font-size":r,"--n-title-font-weight":a,"--n-icon-size":c,"--n-icon-margin":l,"--n-icon-margin-rtl":u,"--n-close-size":m,"--n-close-margin":h,"--n-close-margin-rtl":g,"--n-padding":_,"--n-icon-margin-left":b,"--n-icon-margin-right":x}}),f=a?l(`alert`,i(()=>e.type[0]),d,e):void 0,g=r(!0),_=()=>{let{onAfterLeave:t,onAfterHide:n}=e;t&&t(),n&&n()};return{rtlEnabled:c,mergedClsPrefix:t,mergedBordered:n,visible:g,handleCloseClick:()=>{Promise.resolve(e.onClose?.call(e)).then(e=>{e!==!1&&(g.value=!1)})},handleAfterLeave:()=>{_()},mergedTheme:s,cssVars:a?void 0:d,themeClass:f?.themeClass,onRender:f?.onRender}},render(){var t;return(t=this.onRender)==null||t.call(this),e(w,{onAfterLeave:this.handleAfterLeave},{default:()=>{let{mergedClsPrefix:t,$slots:r}=this,i={class:[`${t}-alert`,this.themeClass,this.closable&&`${t}-alert--closable`,this.showIcon&&`${t}-alert--show-icon`,!this.title&&this.closable&&`${t}-alert--right-adjust`,this.rtlEnabled&&`${t}-alert--rtl`],style:this.cssVars,role:`alert`};return this.visible?e(`div`,Object.assign({},n(this.$attrs,i)),this.closable&&e(T,{clsPrefix:t,class:`${t}-alert__close`,onClick:this.handleCloseClick}),this.bordered&&e(`div`,{class:`${t}-alert__border`}),this.showIcon&&e(`div`,{class:`${t}-alert__icon`,"aria-hidden":`true`},y(r.icon,()=>[e(D,{clsPrefix:t},{default:()=>{switch(this.type){case`success`:return e(S,null);case`info`:return e(C,null);case`warning`:return e(x,null);case`error`:return e(E,null);default:return null}}})])),e(`div`,{class:[`${t}-alert-body`,this.mergedBordered&&`${t}-alert-body--bordered`]},_(r.header,n=>{let r=n||this.title;return r?e(`div`,{class:`${t}-alert-body__title`},r):null}),r.default&&e(`div`,{class:`${t}-alert-body__content`},r))):null}})}});export{M as t};
`,[o(`& +`,[s(`content`,{marginTop:`9px`})])]),s(`content`,{transition:`color .3s var(--n-bezier)`,fontSize:`var(--n-font-size)`})]),s(`icon`,{transition:`color .3s var(--n-bezier)`})]),M=t({name:`Alert`,inheritAttrs:!1,props:Object.assign(Object.assign({},h.props),{title:String,showIcon:{type:Boolean,default:!0},type:{type:String,default:`default`},bordered:{type:Boolean,default:!0},closable:Boolean,onClose:Function,onAfterLeave:Function,onAfterHide:Function}),slots:Object,setup(e){let{mergedClsPrefixRef:t,mergedBorderedRef:n,inlineThemeDisabled:a,mergedRtlRef:o}=u(e),s=h(`Alert`,`-alert`,j,A,e,t),c=m(`Alert`,o,t),d=i(()=>{let{common:{cubicBezierEaseInOut:t},self:n}=s.value,{fontSize:r,borderRadius:i,titleFontWeight:a,lineHeight:o,iconSize:c,iconMargin:l,iconMarginRtl:u,closeIconSize:d,closeBorderRadius:f,closeSize:m,closeMargin:h,closeMarginRtl:g,padding:_}=n,{type:y}=e,{left:b,right:x}=v(l);return{"--n-bezier":t,"--n-color":n[p(`color`,y)],"--n-close-icon-size":d,"--n-close-border-radius":f,"--n-close-color-hover":n[p(`closeColorHover`,y)],"--n-close-color-pressed":n[p(`closeColorPressed`,y)],"--n-close-icon-color":n[p(`closeIconColor`,y)],"--n-close-icon-color-hover":n[p(`closeIconColorHover`,y)],"--n-close-icon-color-pressed":n[p(`closeIconColorPressed`,y)],"--n-icon-color":n[p(`iconColor`,y)],"--n-border":n[p(`border`,y)],"--n-title-text-color":n[p(`titleTextColor`,y)],"--n-content-text-color":n[p(`contentTextColor`,y)],"--n-line-height":o,"--n-border-radius":i,"--n-font-size":r,"--n-title-font-weight":a,"--n-icon-size":c,"--n-icon-margin":l,"--n-icon-margin-rtl":u,"--n-close-size":m,"--n-close-margin":h,"--n-close-margin-rtl":g,"--n-padding":_,"--n-icon-margin-left":b,"--n-icon-margin-right":x}}),f=a?l(`alert`,i(()=>e.type[0]),d,e):void 0,g=r(!0),_=()=>{let{onAfterLeave:t,onAfterHide:n}=e;t&&t(),n&&n()};return{rtlEnabled:c,mergedClsPrefix:t,mergedBordered:n,visible:g,handleCloseClick:()=>{Promise.resolve(e.onClose?.call(e)).then(e=>{e!==!1&&(g.value=!1)})},handleAfterLeave:()=>{_()},mergedTheme:s,cssVars:a?void 0:d,themeClass:f?.themeClass,onRender:f?.onRender}},render(){var t;return(t=this.onRender)==null||t.call(this),e(C,{onAfterLeave:this.handleAfterLeave},{default:()=>{let{mergedClsPrefix:t,$slots:r}=this,i={class:[`${t}-alert`,this.themeClass,this.closable&&`${t}-alert--closable`,this.showIcon&&`${t}-alert--show-icon`,!this.title&&this.closable&&`${t}-alert--right-adjust`,this.rtlEnabled&&`${t}-alert--rtl`],style:this.cssVars,role:`alert`};return this.visible?e(`div`,Object.assign({},n(this.$attrs,i)),this.closable&&e(w,{clsPrefix:t,class:`${t}-alert__close`,onClick:this.handleCloseClick}),this.bordered&&e(`div`,{class:`${t}-alert__border`}),this.showIcon&&e(`div`,{class:`${t}-alert__icon`,"aria-hidden":`true`},y(r.icon,()=>[e(b,{clsPrefix:t},{default:()=>{switch(this.type){case`success`:return e(S,null);case`info`:return e(T,null);case`warning`:return e(x,null);case`error`:return e(O,null);default:return null}}})])),e(`div`,{class:[`${t}-alert-body`,this.mergedBordered&&`${t}-alert-body--bordered`]},_(r.header,n=>{let r=n||this.title;return r?e(`div`,{class:`${t}-alert-body__title`},r):null}),r.default&&e(`div`,{class:`${t}-alert-body__content`},r))):null}})}});export{M as t};
File diff suppressed because one or more lines are too long
+214
View File
File diff suppressed because one or more lines are too long
-447
View File
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,Dt as t,E as n,Et as r,H as i,Q as a,S as o,T as s,W as c,b as l,it as u,lt as d,o as f,p,y as m}from"./vue-router-bPs2Bq2h.js";import{t as h}from"./Tag-BdbFVT7x.js";import{i as g,n as _,t as v}from"./HeaderMenu-eN2wSqXA.js";var y={class:`center-block-custom`},b={class:`width1200 display-table catalog-grid`},x=[`onClick`],S={class:`scenario-content-block`},C={class:`scenario-title`},w={class:`scenario-description`},T={class:`scenario-label`},E=_(e({__name:`CatalogPage`,setup(e){let l=g(),_=u([]),E=f();async function D(){_.value=[];let e=await l.GetScenariosCatalog({});_.value=e.scenarios}async function O(e){E.push(`/scenarios/`+e)}return D(),(e,l)=>(i(),o(p,null,[m(`div`,y,[m(`div`,b,[(i(!0),o(p,null,c(_.value,e=>(i(),o(`div`,{class:`scenario-block`,onClick:t=>O(e.id),key:e.id},[m(`div`,{class:`scenario-image-block scenario-image`,style:r({backgroundImage:`url(${e.image})`})},null,4),m(`div`,S,[m(`p`,C,t(e.name),1),m(`p`,w,t(e.description),1),m(`p`,T,[n(d(h),{bordered:!1,type:`success`,class:`status-block`},{default:a(()=>[s(`Автор: `+t(e.author?.username),1)]),_:2},1024)])])],8,x))),128))])]),n(v,{active:`catalog`})],64))}}),[[`__scopeId`,`data-v-14025c2d`]]),D=e({__name:`CatalogView`,setup(e){return(e,t)=>(i(),l(E))}});export{D as default};
import{D as e,Dt as t,E as n,Et as r,H as i,Q as a,S as o,T as s,W as c,b as l,it as u,lt as d,o as f,p,y as m}from"./vue-router-bPs2Bq2h.js";import{t as h}from"./Tag-CyF6Ld4O.js";import{i as g,n as _,t as v}from"./HeaderMenu-CNP1EQA-.js";var y={class:`center-block-custom`},b={class:`width1200 display-table catalog-grid`},x=[`onClick`],S={class:`scenario-content-block`},C={class:`scenario-title`},w={class:`scenario-description`},T={class:`scenario-label`},E=_(e({__name:`CatalogPage`,setup(e){let l=g(),_=u([]),E=f();async function D(){_.value=[];let e=await l.GetScenariosCatalog({});_.value=e.scenarios}async function O(e){E.push(`/scenarios/`+e)}return D(),(e,l)=>(i(),o(p,null,[m(`div`,y,[m(`div`,b,[(i(!0),o(p,null,c(_.value,e=>(i(),o(`div`,{class:`scenario-block`,onClick:t=>O(e.id),key:e.id},[m(`div`,{class:`scenario-image-block scenario-image`,style:r({backgroundImage:`url(${e.image})`})},null,4),m(`div`,S,[m(`p`,C,t(e.name),1),m(`p`,w,t(e.description),1),m(`p`,T,[n(d(h),{bordered:!1,type:`success`,class:`status-block`},{default:a(()=>[s(`Автор: `+t(e.author?.username),1)]),_:2},1024)])])],8,x))),128))])]),n(v,{active:`catalog`})],64))}}),[[`__scopeId`,`data-v-14025c2d`]]),D=e({__name:`CatalogView`,setup(e){return(e,t)=>(i(),l(E))}});export{D as default};
@@ -1 +1 @@
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-BIx-pZOL.js";import{t as o}from"./HeaderMenu-eN2wSqXA.js";var s=e({__name:`ConsentView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`consent`}),t(o)],64))}});export{s as default};
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-DtxwjX3o.js";import{t as o}from"./HeaderMenu-CNP1EQA-.js";var s=e({__name:`ConsentView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`consent`}),t(o)],64))}});export{s as default};
@@ -1,4 +1,4 @@
import{A as e,D as t,Dt as n,E as r,H as i,Q as a,S as o,T as s,Z as c,b as l,it as u,lt as d,t as f,v as p,y as m,z as h}from"./vue-router-bPs2Bq2h.js";import{G as g,K as _,M as v,N as y,Y as b,Z as x,r as S}from"./light-BDe84dgP.js";import{l as C}from"./resolve-slot-Cp3m6n7Y.js";import{t as w}from"./use-compitable-BcHeQzgm.js";import{t as T}from"./fade-in.cssr-CHZadXSL.js";import{t as E}from"./Alert-Cv6pYaP-.js";import{A as D,J as O,j as k,o as A}from"./index-DzEqT7MZ.js";import{i as j,n as M}from"./HeaderMenu-eN2wSqXA.js";import{t as N}from"./HeaderText-CtkTsjpJ.js";var P=g([g(`@keyframes spin-rotate`,`
import{A as e,D as t,Dt as n,E as r,H as i,Q as a,S as o,T as s,Z as c,b as l,it as u,lt as d,t as f,v as p,y as m,z as h}from"./vue-router-bPs2Bq2h.js";import{G as g,K as _,M as v,N as y,Y as b,Z as x,r as S}from"./light-BDe84dgP.js";import{l as C}from"./resolve-slot-Cp3m6n7Y.js";import{t as w}from"./use-compitable-BcHeQzgm.js";import{t as T}from"./fade-in.cssr-CHZadXSL.js";import{t as E}from"./Alert-CTjuvCFV.js";import{M as D,Y as O,j as k,o as A}from"./index-DsVCmMvY.js";import{i as j,n as M}from"./HeaderMenu-CNP1EQA-.js";import{t as N}from"./HeaderText-BUvQzsGk.js";var P=g([g(`@keyframes spin-rotate`,`
from {
transform: rotate(0);
}
@@ -40,4 +40,4 @@ import{A as e,D as t,Dt as n,E as r,H as i,Q as a,S as o,T as s,Z as c,b as l,it
-webkit-user-select: none;
pointer-events: none;
opacity: var(--n-opacity-spinning);
`)])]),F={small:20,medium:18,large:16},I=t({name:`Spin`,props:Object.assign(Object.assign(Object.assign({},S.props),{contentClass:String,contentStyle:[Object,String],description:String,size:{type:[String,Number],default:`medium`},show:{type:Boolean,default:!0},rotate:{type:Boolean,default:!0},spinning:{type:Boolean,validator:()=>!0,default:void 0},delay:Number}),k),slots:Object,setup(e){let{mergedClsPrefixRef:t,inlineThemeDisabled:n}=y(e),r=S(`Spin`,`-spin`,P,A,e,t),i=p(()=>{let{size:t}=e,{common:{cubicBezierEaseInOut:n},self:i}=r.value,{opacitySpinning:a,color:o,textColor:s}=i;return{"--n-bezier":n,"--n-opacity-spinning":a,"--n-size":typeof t==`number`?C(t):i[x(`size`,t)],"--n-color":o,"--n-text-color":s}}),a=n?v(`spin`,p(()=>{let{size:t}=e;return typeof t==`number`?String(t):t[0]}),i,e):void 0,o=w(e,[`spinning`,`show`]),s=u(!1);return c(t=>{let n;if(o.value){let{delay:r}=e;if(r){n=window.setTimeout(()=>{s.value=!0},r),t(()=>{clearTimeout(n)});return}}s.value=o.value}),{mergedClsPrefix:t,active:s,mergedStrokeWidth:p(()=>{let{strokeWidth:t}=e;if(t!==void 0)return t;let{size:n}=e;return F[typeof n==`number`?`medium`:n]}),cssVars:n?void 0:i,themeClass:a?.themeClass,onRender:a?.onRender}},render(){var t;let{$slots:n,mergedClsPrefix:r,description:i}=this,a=n.icon&&this.rotate,o=(i||n.description)&&e(`div`,{class:`${r}-spin-description`},i||n.description?.call(n)),s=n.icon?e(`div`,{class:[`${r}-spin-body`,this.themeClass]},e(`div`,{class:[`${r}-spin`,a&&`${r}-spin--rotate`],style:n.default?``:this.cssVars},n.icon()),o):e(`div`,{class:[`${r}-spin-body`,this.themeClass]},e(D,{clsPrefix:r,style:n.default?``:this.cssVars,stroke:this.stroke,"stroke-width":this.mergedStrokeWidth,radius:this.radius,scale:this.scale,class:`${r}-spin`}),o);return(t=this.onRender)==null||t.call(this),n.default?e(`div`,{class:[`${r}-spin-container`,this.themeClass],style:this.cssVars},e(`div`,{class:[`${r}-spin-content`,this.active&&`${r}-spin-content--spinning`,this.contentClass],style:this.contentStyle},n),e(O,{name:`fade-in-transition`},{default:()=>this.active?s:null})):s}}),L={class:`center-block-custom`},R={class:`width700 doc-page`},z={class:`doc-title`},B={key:0,class:`doc-loading`},V={key:2,class:`paper-block`},H={class:`paper`},U={class:`doc-text`},W={class:`docs-links`},G=M(t({__name:`DocsPage`,props:{kind:{}},setup(e){let t=e,c={terms:`Пользовательское соглашение`,privacy:`Политика конфиденциальности`,consent:`Согласие на обработку персональных данных`},p=u(``),g=u(!0),_=u(``);return h(async()=>{let e=j(),n={terms:()=>e.GetTerms({}),privacy:()=>e.GetPrivacy({}),consent:()=>e.GetConsent({})};try{let e=await n[t.kind]();e.error?_.value=e.error:p.value=e.text||``}catch(e){_.value=e instanceof Error?e.message:`Не удалось загрузить документ`}finally{g.value=!1}}),(e,u)=>(i(),o(`div`,L,[m(`div`,R,[m(`h1`,z,[r(N,null,{default:a(()=>[s(n(c[t.kind]),1)]),_:1})]),g.value?(i(),o(`div`,B,[r(d(I),{size:`large`})])):_.value?(i(),l(d(E),{key:1,type:`error`,"show-icon":!1,class:`doc-error`},{default:a(()=>[s(n(_.value),1)]),_:1})):(i(),o(`div`,V,[m(`div`,H,[m(`p`,U,n(p.value),1)]),u[0]||=m(`div`,{class:`paper-shadow paper-shadow-left`},null,-1),u[1]||=m(`div`,{class:`paper-shadow paper-shadow-right`},null,-1)])),m(`div`,W,[u[5]||=s(` Смотрите также: `,-1),r(d(f),{to:`/user-agreement`,class:`docs-link`},{default:a(()=>[...u[2]||=[s(`Пользовательское соглашение`,-1)]]),_:1}),u[6]||=s(` · `,-1),r(d(f),{to:`/privacy-policy`,class:`docs-link`},{default:a(()=>[...u[3]||=[s(`Политика конфиденциальности`,-1)]]),_:1}),u[7]||=s(` · `,-1),r(d(f),{to:`/consent`,class:`docs-link`},{default:a(()=>[...u[4]||=[s(`Согласие на обработку персональных данных`,-1)]]),_:1})])])]))}}),[[`__scopeId`,`data-v-f5dde12c`]]);export{G as t};
`)])]),F={small:20,medium:18,large:16},I=t({name:`Spin`,props:Object.assign(Object.assign(Object.assign({},S.props),{contentClass:String,contentStyle:[Object,String],description:String,size:{type:[String,Number],default:`medium`},show:{type:Boolean,default:!0},rotate:{type:Boolean,default:!0},spinning:{type:Boolean,validator:()=>!0,default:void 0},delay:Number}),D),slots:Object,setup(e){let{mergedClsPrefixRef:t,inlineThemeDisabled:n}=y(e),r=S(`Spin`,`-spin`,P,A,e,t),i=p(()=>{let{size:t}=e,{common:{cubicBezierEaseInOut:n},self:i}=r.value,{opacitySpinning:a,color:o,textColor:s}=i;return{"--n-bezier":n,"--n-opacity-spinning":a,"--n-size":typeof t==`number`?C(t):i[x(`size`,t)],"--n-color":o,"--n-text-color":s}}),a=n?v(`spin`,p(()=>{let{size:t}=e;return typeof t==`number`?String(t):t[0]}),i,e):void 0,o=w(e,[`spinning`,`show`]),s=u(!1);return c(t=>{let n;if(o.value){let{delay:r}=e;if(r){n=window.setTimeout(()=>{s.value=!0},r),t(()=>{clearTimeout(n)});return}}s.value=o.value}),{mergedClsPrefix:t,active:s,mergedStrokeWidth:p(()=>{let{strokeWidth:t}=e;if(t!==void 0)return t;let{size:n}=e;return F[typeof n==`number`?`medium`:n]}),cssVars:n?void 0:i,themeClass:a?.themeClass,onRender:a?.onRender}},render(){var t;let{$slots:n,mergedClsPrefix:r,description:i}=this,a=n.icon&&this.rotate,o=(i||n.description)&&e(`div`,{class:`${r}-spin-description`},i||n.description?.call(n)),s=n.icon?e(`div`,{class:[`${r}-spin-body`,this.themeClass]},e(`div`,{class:[`${r}-spin`,a&&`${r}-spin--rotate`],style:n.default?``:this.cssVars},n.icon()),o):e(`div`,{class:[`${r}-spin-body`,this.themeClass]},e(k,{clsPrefix:r,style:n.default?``:this.cssVars,stroke:this.stroke,"stroke-width":this.mergedStrokeWidth,radius:this.radius,scale:this.scale,class:`${r}-spin`}),o);return(t=this.onRender)==null||t.call(this),n.default?e(`div`,{class:[`${r}-spin-container`,this.themeClass],style:this.cssVars},e(`div`,{class:[`${r}-spin-content`,this.active&&`${r}-spin-content--spinning`,this.contentClass],style:this.contentStyle},n),e(O,{name:`fade-in-transition`},{default:()=>this.active?s:null})):s}}),L={class:`center-block-custom`},R={class:`width700 doc-page`},z={class:`doc-title`},B={key:0,class:`doc-loading`},V={key:2,class:`paper-block`},H={class:`paper`},U={class:`doc-text`},W={class:`docs-links`},G=M(t({__name:`DocsPage`,props:{kind:{}},setup(e){let t=e,c={terms:`Пользовательское соглашение`,privacy:`Политика конфиденциальности`,consent:`Согласие на обработку персональных данных`},p=u(``),g=u(!0),_=u(``);return h(async()=>{let e=j(),n={terms:()=>e.GetTerms({}),privacy:()=>e.GetPrivacy({}),consent:()=>e.GetConsent({})};try{let e=await n[t.kind]();e.error?_.value=e.error:p.value=e.text||``}catch(e){_.value=e instanceof Error?e.message:`Не удалось загрузить документ`}finally{g.value=!1}}),(e,u)=>(i(),o(`div`,L,[m(`div`,R,[m(`h1`,z,[r(N,null,{default:a(()=>[s(n(c[t.kind]),1)]),_:1})]),g.value?(i(),o(`div`,B,[r(d(I),{size:`large`})])):_.value?(i(),l(d(E),{key:1,type:`error`,"show-icon":!1,class:`doc-error`},{default:a(()=>[s(n(_.value),1)]),_:1})):(i(),o(`div`,V,[m(`div`,H,[m(`p`,U,n(p.value),1)]),u[0]||=m(`div`,{class:`paper-shadow paper-shadow-left`},null,-1),u[1]||=m(`div`,{class:`paper-shadow paper-shadow-right`},null,-1)])),m(`div`,W,[u[5]||=s(` Смотрите также: `,-1),r(d(f),{to:`/user-agreement`,class:`docs-link`},{default:a(()=>[...u[2]||=[s(`Пользовательское соглашение`,-1)]]),_:1}),u[6]||=s(` · `,-1),r(d(f),{to:`/privacy-policy`,class:`docs-link`},{default:a(()=>[...u[3]||=[s(`Политика конфиденциальности`,-1)]]),_:1}),u[7]||=s(` · `,-1),r(d(f),{to:`/consent`,class:`docs-link`},{default:a(()=>[...u[4]||=[s(`Согласие на обработку персональных данных`,-1)]]),_:1})])])]))}}),[[`__scopeId`,`data-v-f5dde12c`]]);export{G as t};
@@ -1 +1 @@
import{A as e,D as t,v as n}from"./vue-router-bPs2Bq2h.js";import{N as r,Z as i,o as a,r as o}from"./light-BDe84dgP.js";import{o as s,s as c}from"./resolve-slot-Cp3m6n7Y.js";import{s as l}from"./Button-98scn9wc.js";import{t as u}from"./get-slot-6kXJmSMP.js";import{l as d}from"./index-DzEqT7MZ.js";function f(){return d}var p={name:`Flex`,self:f},m=t({name:`Flex`,props:Object.assign(Object.assign({},o.props),{align:String,justify:{type:String,default:`start`},inline:Boolean,vertical:Boolean,reverse:Boolean,size:{type:[String,Number,Array],default:`medium`},wrap:{type:Boolean,default:!0}}),setup(e){let{mergedClsPrefixRef:t,mergedRtlRef:l}=r(e),u=o(`Flex`,`-flex`,void 0,p,e,t);return{rtlEnabled:a(`Flex`,l,t),mergedClsPrefix:t,margin:n(()=>{let{size:t}=e;if(Array.isArray(t))return{horizontal:t[0],vertical:t[1]};if(typeof t==`number`)return{horizontal:t,vertical:t};let{self:{[i(`gap`,t)]:n}}=u.value,{row:r,col:a}=c(n);return{horizontal:s(a),vertical:s(r)}})}},render(){let{vertical:t,reverse:n,align:r,inline:i,justify:a,margin:o,wrap:s,mergedClsPrefix:c,rtlEnabled:d}=this,f=l(u(this),!1);return f.length?e(`div`,{role:`none`,class:[`${c}-flex`,d&&`${c}-flex--rtl`],style:{display:i?`inline-flex`:`flex`,flexDirection:t&&!n?`column`:t&&n?`column-reverse`:!t&&n?`row-reverse`:`row`,justifyContent:a,flexWrap:!s||t?`nowrap`:`wrap`,alignItems:r,gap:`${o.vertical}px ${o.horizontal}px`}},f):null}});export{m as t};
import{A as e,D as t,v as n}from"./vue-router-bPs2Bq2h.js";import{N as r,Z as i,o as a,r as o}from"./light-BDe84dgP.js";import{o as s,s as c}from"./resolve-slot-Cp3m6n7Y.js";import{s as l}from"./Button-CQhak1JU.js";import{t as u}from"./get-slot-6kXJmSMP.js";import{l as d}from"./index-DsVCmMvY.js";function f(){return d}var p={name:`Flex`,self:f},m=t({name:`Flex`,props:Object.assign(Object.assign({},o.props),{align:String,justify:{type:String,default:`start`},inline:Boolean,vertical:Boolean,reverse:Boolean,size:{type:[String,Number,Array],default:`medium`},wrap:{type:Boolean,default:!0}}),setup(e){let{mergedClsPrefixRef:t,mergedRtlRef:l}=r(e),u=o(`Flex`,`-flex`,void 0,p,e,t);return{rtlEnabled:a(`Flex`,l,t),mergedClsPrefix:t,margin:n(()=>{let{size:t}=e;if(Array.isArray(t))return{horizontal:t[0],vertical:t[1]};if(typeof t==`number`)return{horizontal:t,vertical:t};let{self:{[i(`gap`,t)]:n}}=u.value,{row:r,col:a}=c(n);return{horizontal:s(a),vertical:s(r)}})}},render(){let{vertical:t,reverse:n,align:r,inline:i,justify:a,margin:o,wrap:s,mergedClsPrefix:c,rtlEnabled:d}=this,f=l(u(this),!1);return f.length?e(`div`,{role:`none`,class:[`${c}-flex`,d&&`${c}-flex--rtl`],style:{display:i?`inline-flex`:`flex`,flexDirection:t&&!n?`column`:t&&n?`column-reverse`:!t&&n?`row-reverse`:`row`,justifyContent:a,flexWrap:!s||t?`nowrap`:`wrap`,alignItems:r,gap:`${o.vertical}px ${o.horizontal}px`}},f):null}});export{m as t};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,G as t,H as n,S as r}from"./vue-router-bPs2Bq2h.js";import{n as i}from"./HeaderMenu-eN2wSqXA.js";var a={class:`text-with-font`},o=i(e({__name:`HeaderText`,setup(e){return(e,i)=>(n(),r(`span`,a,[t(e.$slots,`default`,{},void 0,!0)]))}}),[[`__scopeId`,`data-v-689794e0`]]);export{o as t};
import{D as e,G as t,H as n,S as r}from"./vue-router-bPs2Bq2h.js";import{n as i}from"./HeaderMenu-CNP1EQA-.js";var a={class:`text-with-font`},o=i(e({__name:`HeaderText`,setup(e){return(e,i)=>(n(),r(`span`,a,[t(e.$slots,`default`,{},void 0,!0)]))}}),[[`__scopeId`,`data-v-689794e0`]]);export{o as t};
@@ -1 +1 @@
import{D as e,E as t,H as n,S as r,p as i,y as a}from"./vue-router-bPs2Bq2h.js";import{t as o}from"./HeaderMenu-eN2wSqXA.js";var s=e({__name:`HomeView`,setup(e){return(e,s)=>(n(),r(i,null,[s[0]||=a(`div`,{class:`center-block-custom content-block center-middle-block-custom height80`},[a(`div`,null,[a(`h1`,{class:`font-text`},`Вечерний детектив`),a(`h3`,{class:`font-text`},`Дело №0`),a(`p`,{class:`content-text`},`Поиграем?`)])],-1),t(o,{active:`main`})],64))}});export{s as default};
import{D as e,E as t,H as n,S as r,p as i,y as a}from"./vue-router-bPs2Bq2h.js";import{t as o}from"./HeaderMenu-CNP1EQA-.js";var s=e({__name:`HomeView`,setup(e){return(e,s)=>(n(),r(i,null,[s[0]||=a(`div`,{class:`center-block-custom content-block center-middle-block-custom height80`},[a(`div`,null,[a(`h1`,{class:`font-text`},`Вечерний детектив`),a(`h3`,{class:`font-text`},`Дело №0`),a(`p`,{class:`content-text`},`Поиграем?`)])],-1),t(o,{active:`main`})],64))}});export{s as default};
+234
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-108
View File
File diff suppressed because one or more lines are too long
+108
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-BIx-pZOL.js";import{t as o}from"./HeaderMenu-eN2wSqXA.js";var s=e({__name:`PrivacyPolicyView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`privacy`}),t(o)],64))}});export{s as default};
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-DtxwjX3o.js";import{t as o}from"./HeaderMenu-CNP1EQA-.js";var s=e({__name:`PrivacyPolicyView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`privacy`}),t(o)],64))}});export{s as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,Dt as t,E as n,H as r,Q as i,S as a,T as o,a as s,b as c,it as l,lt as u,p as d,y as f}from"./vue-router-bPs2Bq2h.js";import{t as p}from"./Tag-BdbFVT7x.js";import{t as m}from"./use-message-L319FZjl.js";import{i as h,n as g,t as _}from"./HeaderMenu-eN2wSqXA.js";var v={class:`center-block-custom`},y={class:`width700`},b={class:`scenario-card`},x={class:`scenario-heading`},S={class:`scenario-title`},C={class:`scenario-image-frame`},w=[`src`,`alt`],T={class:`scenario-details`},E={class:`scenario-description`},D={class:`scenario-author`},O=g(e({__name:`ScenarioPage`,setup(e){let c=m(),g=h(),O=s().params.id,k=l({id:void 0,name:void 0,story:void 0,author:void 0,status:void 0,updatedAt:void 0,createdAt:void 0,publishedAt:void 0});async function A(e){let t=await g.GetScenario({id:e});if(t.error!=``){c.error(t.error);return}k.value=t.scenario}return A(Number(O)),(e,s)=>(r(),a(d,null,[f(`div`,v,[f(`div`,y,[f(`section`,b,[f(`div`,x,[s[0]||=f(`p`,{class:`scenario-kicker`},`ДЕЛО ИЗ КАТАЛОГА`,-1),f(`h1`,S,t(k.value.name),1)]),f(`div`,C,[f(`img`,{class:`scenario-image`,src:k.value.image,alt:k.value.name},null,8,w)]),f(`div`,T,[f(`p`,E,t(k.value.description),1),f(`div`,D,[n(u(p),{bordered:!1,type:`success`,class:`status-block`},{default:i(()=>[o(` Автор: `+t(k.value.author?.username),1)]),_:1})])])])])]),n(_,{active:`catalog`})],64))}}),[[`__scopeId`,`data-v-17249bca`]]),k=e({__name:`ScenarioView`,setup(e){return(e,t)=>(r(),c(O))}});export{k as default};
import{D as e,Dt as t,E as n,H as r,Q as i,S as a,T as o,a as s,b as c,it as l,lt as u,p as d,y as f}from"./vue-router-bPs2Bq2h.js";import{t as p}from"./Tag-CyF6Ld4O.js";import{t as m}from"./use-message-uEq7LuSg.js";import{i as h,n as g,t as _}from"./HeaderMenu-CNP1EQA-.js";var v={class:`center-block-custom`},y={class:`width700`},b={class:`scenario-card`},x={class:`scenario-heading`},S={class:`scenario-title`},C={class:`scenario-image-frame`},w=[`src`,`alt`],T={class:`scenario-details`},E={class:`scenario-description`},D={class:`scenario-author`},O=g(e({__name:`ScenarioPage`,setup(e){let c=m(),g=h(),O=s().params.id,k=l({id:void 0,name:void 0,story:void 0,author:void 0,status:void 0,updatedAt:void 0,createdAt:void 0,publishedAt:void 0});async function A(e){let t=await g.GetScenario({id:e});if(t.error!=``){c.error(t.error);return}k.value=t.scenario}return A(Number(O)),(e,s)=>(r(),a(d,null,[f(`div`,v,[f(`div`,y,[f(`section`,b,[f(`div`,x,[s[0]||=f(`p`,{class:`scenario-kicker`},`ДЕЛО ИЗ КАТАЛОГА`,-1),f(`h1`,S,t(k.value.name),1)]),f(`div`,C,[f(`img`,{class:`scenario-image`,src:k.value.image,alt:k.value.name},null,8,w)]),f(`div`,T,[f(`p`,E,t(k.value.description),1),f(`div`,D,[n(u(p),{bordered:!1,type:`success`,class:`status-block`},{default:i(()=>[o(` Автор: `+t(k.value.author?.username),1)]),_:1})])])])])]),n(_,{active:`catalog`})],64))}}),[[`__scopeId`,`data-v-17249bca`]]),k=e({__name:`ScenarioView`,setup(e){return(e,t)=>(r(),c(O))}});export{k as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
.binding-card[data-v-8f41c97f],.qr-card[data-v-8f41c97f],.ready-card[data-v-8f41c97f]{text-align:center;width:100%;max-width:min(94vw,520px)}.ready-title[data-v-8f41c97f]{font-size:28px}.screen-center[data-v-8f41c97f]{justify-content:center;align-items:center;min-height:100dvh;padding:20px;display:flex}.screen-page[data-v-8f41c97f]{color:#eee;background:#111;min-height:100dvh}
+1
View File
@@ -0,0 +1 @@
import{B as e,D as t,Dt as n,E as r,H as i,Q as a,S as o,T as s,a as c,b as l,it as u,lt as d,p as f,v as p,x as m,y as h,z as g}from"./vue-router-bPs2Bq2h.js";import{t as _}from"./Card-BJm6ZyX4.js";import{t as v}from"./Button-CQhak1JU.js";import{t as y}from"./Select-DikcSvU3.js";import{t as b}from"./use-message-uEq7LuSg.js";import{t as x}from"./QrCode-c3qDqmj4.js";import{i as S,n as C,t as w}from"./HeaderMenu-CNP1EQA-.js";var T={key:0,class:`screen-center`},E={key:1,class:`screen-page`},D={key:0,class:`screen-center`},O={key:0,class:`screen-center`},k={key:1,class:`screen-center`},A=`evening-detective-screen-session`,j=C(t({__name:`ScreenPage`,setup(t){let C=S(),j=b(),M=c(),N=u(``),P=u(``),F=u(),I=u([]),L=u(null),R=u(!1),z=u(!0),B=u(!1),V=u(!1),H=null,U=p(()=>!!(M.query.screenId&&M.query.accessToken)),W=p(()=>{if(!N.value||!P.value)return``;let e=new URL(`/screen`,window.location.origin);return e.searchParams.set(`screenId`,N.value),e.searchParams.set(`accessToken`,P.value),e.toString()}),G=p(()=>I.value.map(e=>({label:e.name||`Игра ${e.id}`,value:e.id})));function K(){sessionStorage.setItem(A,JSON.stringify({screenId:N.value,accessToken:P.value}))}function q(){try{let e=JSON.parse(sessionStorage.getItem(A)||`{}`);N.value=e.screenId||``,P.value=e.accessToken||``}catch{sessionStorage.removeItem(A)}}async function J(){let e=await C.CreateScreenSession({});if(e.error||!e.screenId||!e.accessToken)throw Error(e.error||`Не удалось создать сессию экрана`);N.value=e.screenId,P.value=e.accessToken,K()}async function Y(){if(!(!N.value||!P.value))try{let e=await C.GetScreenState({screenId:N.value,accessToken:P.value});if(e.error)throw Error(e.error);F.value=e.state}catch(e){j.error(e instanceof Error?e.message:`Не удалось получить состояние экрана`)}}async function X(){try{let e=await C.GetGames({});if(e.error)throw Error(e.error);I.value=e.games||[]}catch(e){j.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}async function Z(){if(!(!L.value||!M.query.screenId||!M.query.accessToken)){B.value=!0;try{let e=await C.BindScreen({screenId:String(M.query.screenId),accessToken:String(M.query.accessToken),gameId:L.value});if(e.error)throw Error(e.error);V.value=!0}catch(e){j.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{B.value=!1}}}async function Q(){try{await document.documentElement.requestFullscreen?.()}catch{j.warning(`Полноэкранный режим недоступен в этом браузере`)}R.value=!0}return g(async()=>{if(U.value){await X(),z.value=!1;return}q();try{(!N.value||!P.value)&&await J(),await Y(),H=window.setInterval(Y,1e3)}catch(e){j.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{z.value=!1}}),e(()=>{H!=null&&window.clearInterval(H)}),(e,t)=>(i(),o(f,null,[U.value?(i(),o(`div`,T,[r(d(_),{class:`binding-card`,title:`Привязка экрана`},{default:a(()=>[V.value?(i(),o(f,{key:0},[t[1]||=h(`p`,null,`Экран привязан к игре.`,-1),t[2]||=h(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(i(),o(f,{key:1},[t[4]||=h(`p`,null,`Выберите игру, к которой привязать экран.`,-1),r(d(y),{value:L.value,"onUpdate:value":t[0]||=e=>L.value=e,options:G.value,placeholder:`Игра`},null,8,[`value`,`options`]),r(d(v),{type:`primary`,loading:B.value,disabled:L.value==null,onClick:Z},{default:a(()=>[...t[3]||=[s(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(i(),o(`div`,E,[z.value?(i(),o(`div`,D,`Подготовка экрана…`)):(i(),o(f,{key:1},[F.value?.gameId?(i(),o(`div`,k,[r(d(_),{class:`ready-card`},{default:a(()=>[t[8]||=h(`p`,{class:`ready-title`},`Экран подключён`,-1),h(`p`,null,`Игра №`+n(F.value.gameId),1),R.value?m(``,!0):(i(),l(d(v),{key:0,type:`primary`,onClick:Q},{default:a(()=>[...t[7]||=[s(`Подготовить экран`,-1)]]),_:1}))]),_:1})])):(i(),o(`div`,O,[r(d(_),{class:`qr-card`,title:`Подключение экрана`},{default:a(()=>[W.value?(i(),l(d(x),{key:0,value:W.value,size:260},null,8,[`value`])):m(``,!0),t[6]||=h(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),R.value?m(``,!0):(i(),l(d(v),{key:1,type:`primary`,onClick:Q},{default:a(()=>[...t[5]||=[s(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),U.value?(i(),l(w,{key:2,active:`games`})):m(``,!0)],64))}}),[[`__scopeId`,`data-v-8f41c97f`]]),M=t({__name:`ScreenView`,setup(e){return(e,t)=>(i(),l(j))}});export{M as default};
+210
View File
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{A as e,D as t,f as n,v as r}from"./vue-router-bPs2Bq2h.js";import{N as i,Z as a,o,r as s}from"./light-BDe84dgP.js";import{o as c,s as l}from"./resolve-slot-Cp3m6n7Y.js";import{c as u,s as d}from"./Button-98scn9wc.js";import{t as f}from"./get-slot-6kXJmSMP.js";import{u as p}from"./index-DzEqT7MZ.js";function m(){return p}var h={name:`Space`,self:m},g;function _(){if(!u)return!0;if(g===void 0){let e=document.createElement(`div`);e.style.display=`flex`,e.style.flexDirection=`column`,e.style.rowGap=`1px`,e.appendChild(document.createElement(`div`)),e.appendChild(document.createElement(`div`)),document.body.appendChild(e);let t=e.scrollHeight===1;return document.body.removeChild(e),g=t}return g}var v=t({name:`Space`,props:Object.assign(Object.assign({},s.props),{align:String,justify:{type:String,default:`start`},inline:Boolean,vertical:Boolean,reverse:Boolean,size:[String,Number,Array],wrapItem:{type:Boolean,default:!0},itemClass:String,itemStyle:[String,Object],wrap:{type:Boolean,default:!0},internalUseGap:{type:Boolean,default:void 0}}),setup(e){let{mergedClsPrefixRef:t,mergedRtlRef:n,mergedComponentPropsRef:u}=i(e),d=r(()=>e.size||u?.value?.Space?.size||`medium`),f=s(`Space`,`-space`,void 0,h,e,t),p=o(`Space`,n,t);return{useGap:_(),rtlEnabled:p,mergedClsPrefix:t,margin:r(()=>{let e=d.value;if(Array.isArray(e))return{horizontal:e[0],vertical:e[1]};if(typeof e==`number`)return{horizontal:e,vertical:e};let{self:{[a(`gap`,e)]:t}}=f.value,{row:n,col:r}=l(t);return{horizontal:c(r),vertical:c(n)}})}},render(){let{vertical:t,reverse:r,align:i,inline:a,justify:o,itemClass:s,itemStyle:c,margin:l,wrap:u,mergedClsPrefix:p,rtlEnabled:m,useGap:h,wrapItem:g,internalUseGap:_}=this,v=d(f(this),!1);if(!v.length)return null;let y=`${l.horizontal}px`,b=`${l.horizontal/2}px`,x=`${l.vertical}px`,S=`${l.vertical/2}px`,C=v.length-1,w=o.startsWith(`space-`);return e(`div`,{role:`none`,class:[`${p}-space`,m&&`${p}-space--rtl`],style:{display:a?`inline-flex`:`flex`,flexDirection:t&&!r?`column`:t&&r?`column-reverse`:!t&&r?`row-reverse`:`row`,justifyContent:[`start`,`end`].includes(o)?`flex-${o}`:o,flexWrap:!u||t?`nowrap`:`wrap`,marginTop:h||t?``:`-${S}`,marginBottom:h||t?``:`-${S}`,alignItems:i,gap:h?`${l.vertical}px ${l.horizontal}px`:``}},!g&&(h||_)?v:v.map((r,i)=>r.type===n?r:e(`div`,{role:`none`,class:s,style:[c,{maxWidth:`100%`},h?``:t?{marginBottom:i===C?``:x}:m?{marginLeft:w?o===`space-between`&&i===C?``:b:i===C?``:y,marginRight:w?o===`space-between`&&i===0?``:b:``,paddingTop:S,paddingBottom:S}:{marginRight:w?o===`space-between`&&i===C?``:b:i===C?``:y,marginLeft:w?o===`space-between`&&i===0?``:b:``,paddingTop:S,paddingBottom:S}]},r)))}});export{v as t};
import{A as e,D as t,f as n,v as r}from"./vue-router-bPs2Bq2h.js";import{N as i,Z as a,o,r as s}from"./light-BDe84dgP.js";import{o as c,s as l}from"./resolve-slot-Cp3m6n7Y.js";import{c as u,s as d}from"./Button-CQhak1JU.js";import{t as f}from"./get-slot-6kXJmSMP.js";import{u as p}from"./index-DsVCmMvY.js";function m(){return p}var h={name:`Space`,self:m},g;function _(){if(!u)return!0;if(g===void 0){let e=document.createElement(`div`);e.style.display=`flex`,e.style.flexDirection=`column`,e.style.rowGap=`1px`,e.appendChild(document.createElement(`div`)),e.appendChild(document.createElement(`div`)),document.body.appendChild(e);let t=e.scrollHeight===1;return document.body.removeChild(e),g=t}return g}var v=t({name:`Space`,props:Object.assign(Object.assign({},s.props),{align:String,justify:{type:String,default:`start`},inline:Boolean,vertical:Boolean,reverse:Boolean,size:[String,Number,Array],wrapItem:{type:Boolean,default:!0},itemClass:String,itemStyle:[String,Object],wrap:{type:Boolean,default:!0},internalUseGap:{type:Boolean,default:void 0}}),setup(e){let{mergedClsPrefixRef:t,mergedRtlRef:n,mergedComponentPropsRef:u}=i(e),d=r(()=>e.size||u?.value?.Space?.size||`medium`),f=s(`Space`,`-space`,void 0,h,e,t),p=o(`Space`,n,t);return{useGap:_(),rtlEnabled:p,mergedClsPrefix:t,margin:r(()=>{let e=d.value;if(Array.isArray(e))return{horizontal:e[0],vertical:e[1]};if(typeof e==`number`)return{horizontal:e,vertical:e};let{self:{[a(`gap`,e)]:t}}=f.value,{row:n,col:r}=l(t);return{horizontal:c(r),vertical:c(n)}})}},render(){let{vertical:t,reverse:r,align:i,inline:a,justify:o,itemClass:s,itemStyle:c,margin:l,wrap:u,mergedClsPrefix:p,rtlEnabled:m,useGap:h,wrapItem:g,internalUseGap:_}=this,v=d(f(this),!1);if(!v.length)return null;let y=`${l.horizontal}px`,b=`${l.horizontal/2}px`,x=`${l.vertical}px`,S=`${l.vertical/2}px`,C=v.length-1,w=o.startsWith(`space-`);return e(`div`,{role:`none`,class:[`${p}-space`,m&&`${p}-space--rtl`],style:{display:a?`inline-flex`:`flex`,flexDirection:t&&!r?`column`:t&&r?`column-reverse`:!t&&r?`row-reverse`:`row`,justifyContent:[`start`,`end`].includes(o)?`flex-${o}`:o,flexWrap:!u||t?`nowrap`:`wrap`,marginTop:h||t?``:`-${S}`,marginBottom:h||t?``:`-${S}`,alignItems:i,gap:h?`${l.vertical}px ${l.horizontal}px`:``}},!g&&(h||_)?v:v.map((r,i)=>r.type===n?r:e(`div`,{role:`none`,class:s,style:[c,{maxWidth:`100%`},h?``:t?{marginBottom:i===C?``:x}:m?{marginLeft:w?o===`space-between`&&i===C?``:b:i===C?``:y,marginRight:w?o===`space-between`&&i===0?``:b:``,paddingTop:S,paddingBottom:S}:{marginRight:w?o===`space-between`&&i===C?``:b:i===C?``:y,marginLeft:w?o===`space-between`&&i===0?``:b:``,paddingTop:S,paddingBottom:S}]},r)))}});export{v as t};
@@ -1,4 +1,4 @@
import{A as e,D as t,U as n,it as r,st as i,v as a}from"./vue-router-bPs2Bq2h.js";import{B as o,G as s,J as c,K as l,M as u,N as d,X as f,Y as p,Z as m,o as h,r as g,t as _,z as v}from"./light-BDe84dgP.js";import{a as y,c as b}from"./resolve-slot-Cp3m6n7Y.js";import{n as x,t as S}from"./call-ChHlm4-m.js";import{E as C,N as w}from"./index-DzEqT7MZ.js";function T(e){let{textColor2:t,primaryColorHover:n,primaryColorPressed:r,primaryColor:i,infoColor:a,successColor:s,warningColor:c,errorColor:l,baseColor:u,borderColor:d,opacityDisabled:f,tagColor:p,closeIconColor:m,closeIconColorHover:h,closeIconColorPressed:g,borderRadiusSmall:_,fontSizeMini:v,fontSizeTiny:y,fontSizeSmall:b,fontSizeMedium:x,heightMini:S,heightTiny:w,heightSmall:T,heightMedium:E,closeColorHover:D,closeColorPressed:O,buttonColor2Hover:k,buttonColor2Pressed:A,fontWeightStrong:j}=e;return Object.assign(Object.assign({},C),{closeBorderRadius:_,heightTiny:S,heightSmall:w,heightMedium:T,heightLarge:E,borderRadius:_,opacityDisabled:f,fontSizeTiny:v,fontSizeSmall:y,fontSizeMedium:b,fontSizeLarge:x,fontWeightStrong:j,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:u,colorCheckable:`#0000`,colorHoverCheckable:k,colorPressedCheckable:A,colorChecked:i,colorCheckedHover:n,colorCheckedPressed:r,border:`1px solid ${d}`,textColor:t,color:p,colorBordered:`rgb(250, 250, 252)`,closeIconColor:m,closeIconColorHover:h,closeIconColorPressed:g,closeColorHover:D,closeColorPressed:O,borderPrimary:`1px solid ${o(i,{alpha:.3})}`,textColorPrimary:i,colorPrimary:o(i,{alpha:.12}),colorBorderedPrimary:o(i,{alpha:.1}),closeIconColorPrimary:i,closeIconColorHoverPrimary:i,closeIconColorPressedPrimary:i,closeColorHoverPrimary:o(i,{alpha:.12}),closeColorPressedPrimary:o(i,{alpha:.18}),borderInfo:`1px solid ${o(a,{alpha:.3})}`,textColorInfo:a,colorInfo:o(a,{alpha:.12}),colorBorderedInfo:o(a,{alpha:.1}),closeIconColorInfo:a,closeIconColorHoverInfo:a,closeIconColorPressedInfo:a,closeColorHoverInfo:o(a,{alpha:.12}),closeColorPressedInfo:o(a,{alpha:.18}),borderSuccess:`1px solid ${o(s,{alpha:.3})}`,textColorSuccess:s,colorSuccess:o(s,{alpha:.12}),colorBorderedSuccess:o(s,{alpha:.1}),closeIconColorSuccess:s,closeIconColorHoverSuccess:s,closeIconColorPressedSuccess:s,closeColorHoverSuccess:o(s,{alpha:.12}),closeColorPressedSuccess:o(s,{alpha:.18}),borderWarning:`1px solid ${o(c,{alpha:.35})}`,textColorWarning:c,colorWarning:o(c,{alpha:.15}),colorBorderedWarning:o(c,{alpha:.12}),closeIconColorWarning:c,closeIconColorHoverWarning:c,closeIconColorPressedWarning:c,closeColorHoverWarning:o(c,{alpha:.12}),closeColorPressedWarning:o(c,{alpha:.18}),borderError:`1px solid ${o(l,{alpha:.23})}`,textColorError:l,colorError:o(l,{alpha:.1}),colorBorderedError:o(l,{alpha:.08}),closeIconColorError:l,closeIconColorHoverError:l,closeIconColorPressedError:l,closeColorHoverError:o(l,{alpha:.12}),closeColorPressedError:o(l,{alpha:.18})})}var E={name:`Tag`,common:_,self:T},D={color:Object,type:{type:String,default:`default`},round:Boolean,size:String,closable:Boolean,disabled:{type:Boolean,default:void 0}},O=l(`tag`,`
import{A as e,D as t,U as n,it as r,st as i,v as a}from"./vue-router-bPs2Bq2h.js";import{B as o,G as s,J as c,K as l,M as u,N as d,X as f,Y as p,Z as m,o as h,r as g,t as _,z as v}from"./light-BDe84dgP.js";import{a as y,c as b}from"./resolve-slot-Cp3m6n7Y.js";import{n as x,t as S}from"./call-ChHlm4-m.js";import{D as C,P as w}from"./index-DsVCmMvY.js";function T(e){let{textColor2:t,primaryColorHover:n,primaryColorPressed:r,primaryColor:i,infoColor:a,successColor:s,warningColor:c,errorColor:l,baseColor:u,borderColor:d,opacityDisabled:f,tagColor:p,closeIconColor:m,closeIconColorHover:h,closeIconColorPressed:g,borderRadiusSmall:_,fontSizeMini:v,fontSizeTiny:y,fontSizeSmall:b,fontSizeMedium:x,heightMini:S,heightTiny:w,heightSmall:T,heightMedium:E,closeColorHover:D,closeColorPressed:O,buttonColor2Hover:k,buttonColor2Pressed:A,fontWeightStrong:j}=e;return Object.assign(Object.assign({},C),{closeBorderRadius:_,heightTiny:S,heightSmall:w,heightMedium:T,heightLarge:E,borderRadius:_,opacityDisabled:f,fontSizeTiny:v,fontSizeSmall:y,fontSizeMedium:b,fontSizeLarge:x,fontWeightStrong:j,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:u,colorCheckable:`#0000`,colorHoverCheckable:k,colorPressedCheckable:A,colorChecked:i,colorCheckedHover:n,colorCheckedPressed:r,border:`1px solid ${d}`,textColor:t,color:p,colorBordered:`rgb(250, 250, 252)`,closeIconColor:m,closeIconColorHover:h,closeIconColorPressed:g,closeColorHover:D,closeColorPressed:O,borderPrimary:`1px solid ${o(i,{alpha:.3})}`,textColorPrimary:i,colorPrimary:o(i,{alpha:.12}),colorBorderedPrimary:o(i,{alpha:.1}),closeIconColorPrimary:i,closeIconColorHoverPrimary:i,closeIconColorPressedPrimary:i,closeColorHoverPrimary:o(i,{alpha:.12}),closeColorPressedPrimary:o(i,{alpha:.18}),borderInfo:`1px solid ${o(a,{alpha:.3})}`,textColorInfo:a,colorInfo:o(a,{alpha:.12}),colorBorderedInfo:o(a,{alpha:.1}),closeIconColorInfo:a,closeIconColorHoverInfo:a,closeIconColorPressedInfo:a,closeColorHoverInfo:o(a,{alpha:.12}),closeColorPressedInfo:o(a,{alpha:.18}),borderSuccess:`1px solid ${o(s,{alpha:.3})}`,textColorSuccess:s,colorSuccess:o(s,{alpha:.12}),colorBorderedSuccess:o(s,{alpha:.1}),closeIconColorSuccess:s,closeIconColorHoverSuccess:s,closeIconColorPressedSuccess:s,closeColorHoverSuccess:o(s,{alpha:.12}),closeColorPressedSuccess:o(s,{alpha:.18}),borderWarning:`1px solid ${o(c,{alpha:.35})}`,textColorWarning:c,colorWarning:o(c,{alpha:.15}),colorBorderedWarning:o(c,{alpha:.12}),closeIconColorWarning:c,closeIconColorHoverWarning:c,closeIconColorPressedWarning:c,closeColorHoverWarning:o(c,{alpha:.12}),closeColorPressedWarning:o(c,{alpha:.18}),borderError:`1px solid ${o(l,{alpha:.23})}`,textColorError:l,colorError:o(l,{alpha:.1}),colorBorderedError:o(l,{alpha:.08}),closeIconColorError:l,closeIconColorHoverError:l,closeIconColorPressedError:l,closeColorHoverError:o(l,{alpha:.12}),closeColorPressedError:o(l,{alpha:.18})})}var E={name:`Tag`,common:_,self:T},D={color:Object,type:{type:String,default:`default`},round:Boolean,size:String,closable:Boolean,disabled:{type:Boolean,default:void 0}},O=l(`tag`,`
--n-close-margin: var(--n-close-margin-top) var(--n-close-margin-right) var(--n-close-margin-bottom) var(--n-close-margin-left);
white-space: nowrap;
position: relative;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-440
View File
File diff suppressed because one or more lines are too long
+440
View File
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-BIx-pZOL.js";import{t as o}from"./HeaderMenu-eN2wSqXA.js";var s=e({__name:`UserAgreementView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`terms`}),t(o)],64))}});export{s as default};
import{D as e,E as t,H as n,S as r,p as i}from"./vue-router-bPs2Bq2h.js";import{t as a}from"./DocsPage-DtxwjX3o.js";import{t as o}from"./HeaderMenu-CNP1EQA-.js";var s=e({__name:`UserAgreementView`,setup(e){return(e,s)=>(n(),r(i,null,[t(a,{kind:`terms`}),t(o)],64))}});export{s as default};
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
import{A as e,D as t}from"./vue-router-bPs2Bq2h.js";import{o as n}from"./HeaderMenu-eN2wSqXA.js";var r=t({name:`Remove`,render(){return e(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 512 512`},e(`line`,{x1:`400`,y1:`256`,x2:`112`,y2:`256`,style:`
import{A as e,D as t}from"./vue-router-bPs2Bq2h.js";import{o as n}from"./HeaderMenu-CNP1EQA-.js";var r=t({name:`Remove`,render(){return e(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 512 512`},e(`line`,{x1:`400`,y1:`256`,x2:`112`,y2:`256`,style:`
fill: none;
stroke: currentColor;
stroke-linecap: round;
@@ -1 +1 @@
import{a as e,o as t}from"./HeaderMenu-eN2wSqXA.js";function n(){let t=e();return r(t.refreshTokenAction,t.getToken)}function r(e,n){async function r(r,i){let a={},o=n();o&&(a.Authorization=`Bearer ${o}`);let s=await fetch(`${t()}/${r}`,{...i,headers:{...a,...i.headers}});if(s.status==401){await e();let o=n();o&&(a.Authorization=`Bearer ${o}`),s=await fetch(`${t()}/${r}`,{...i,headers:{...a,...i.headers}})}return s}async function o(e,t){let n=await r(e,{method:`GET`});if(!n.ok)throw Error(await a(n));return{blob:await n.blob(),filename:i(n.headers.get(`Content-Disposition`))||t}}function s(e){return o(`api/scenarios/${e}/archive`,`scenario-${e}.zip`)}function c(e){return o(`api/games/${e}/teams/qr.pdf`,`game-${e}.pdf`)}async function l(e){let t=await r(`api/scenarios/archive`,{method:`POST`,headers:{"Content-Type":e.type||`application/zip`},body:e}),n=await t.json().catch(()=>null);if(!t.ok)return{id:null,error:n?.message||`Ошибка сервера (${t.status})`};let i=typeof n?.error==`string`&&n.error!==``?n.error:null;return{id:typeof n?.id==`number`?n.id:null,error:i}}return{downloadScenarioArchive:s,downloadTeamQR:c,uploadScenarioArchive:l}}function i(e){if(!e)return``;let t=e.match(/filename\*=UTF-8''([^;]+)/i);if(t)try{return decodeURIComponent(t[1].trim()).replace(/[\\/:*?"<>|]/g,`_`)}catch{}let n=e.match(/filename="?([^";]+)"?/i);return(n?n[1]:``).replace(/[\\/:*?"<>|]/g,`_`)}async function a(e){let t=await e.json().catch(()=>null);return t&&typeof t.message==`string`&&t.message!==``?t.message:`Ошибка сервера (${e.status})`}export{n as t};
import{a as e,o as t}from"./HeaderMenu-CNP1EQA-.js";function n(){let t=e();return r(t.refreshTokenAction,t.getToken)}function r(e,n){async function r(r,i){let a={},o=n();o&&(a.Authorization=`Bearer ${o}`);let s=await fetch(`${t()}/${r}`,{...i,headers:{...a,...i.headers}});if(s.status==401){await e();let o=n();o&&(a.Authorization=`Bearer ${o}`),s=await fetch(`${t()}/${r}`,{...i,headers:{...a,...i.headers}})}return s}async function o(e,t){let n=await r(e,{method:`GET`});if(!n.ok)throw Error(await a(n));return{blob:await n.blob(),filename:i(n.headers.get(`Content-Disposition`))||t}}function s(e){return o(`api/scenarios/${e}/archive`,`scenario-${e}.zip`)}function c(e){return o(`api/games/${e}/teams/qr.pdf`,`game-${e}.pdf`)}async function l(e){let t=await r(`api/scenarios/archive`,{method:`POST`,headers:{"Content-Type":e.type||`application/zip`},body:e}),n=await t.json().catch(()=>null);if(!t.ok)return{id:null,error:n?.message||`Ошибка сервера (${t.status})`};let i=typeof n?.error==`string`&&n.error!==``?n.error:null;return{id:typeof n?.id==`number`?n.id:null,error:i}}return{downloadScenarioArchive:s,downloadTeamQR:c,uploadScenarioArchive:l}}function i(e){if(!e)return``;let t=e.match(/filename\*=UTF-8''([^;]+)/i);if(t)try{return decodeURIComponent(t[1].trim()).replace(/[\\/:*?"<>|]/g,`_`)}catch{}let n=e.match(/filename="?([^";]+)"?/i);return(n?n[1]:``).replace(/[\\/:*?"<>|]/g,`_`)}async function a(e){let t=await e.json().catch(()=>null);return t&&typeof t.message==`string`&&t.message!==``?t.message:`Ошибка сервера (${e.status})`}export{n as t};
@@ -1 +1 @@
import{D as e,d as t}from"./light-BDe84dgP.js";import{H as n,W as r}from"./index-DzEqT7MZ.js";var i=/^(\d|\.)+$/,a=/(\d|\.)+/;function o(e,{c:t=1,offset:n=0,attachPx:r=!0}={}){if(typeof e==`number`){let r=(e+n)*t;return r===0?`0`:`${r}px`}else if(typeof e==`string`)if(i.test(e)){let i=(Number(e)+n)*t;return r?i===0?`0`:`${i}px`:`${i}`}else{let r=a.exec(e);return r?e.replace(a,String((Number(r[0])+n)*t)):e}return e}var s=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,c=/^\w*$/;function l(t,n){if(e(t))return!1;var i=typeof t;return i==`number`||i==`symbol`||i==`boolean`||t==null||r(t)?!0:c.test(t)||!s.test(t)||n!=null&&t in Object(n)}var u=`Expected a function`;function d(e,n){if(typeof e!=`function`||n!=null&&typeof n!=`function`)throw TypeError(u);var r=function(){var t=arguments,i=n?n.apply(this,t):t[0],a=r.cache;if(a.has(i))return a.get(i);var o=e.apply(this,t);return r.cache=a.set(i,o)||a,o};return r.cache=new(d.Cache||t),r}d.Cache=t;var f=500;function p(e){var t=d(e,function(e){return n.size===f&&n.clear(),e}),n=t.cache;return t}var m=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,h=/\\(\\)?/g,g=p(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(``),e.replace(m,function(e,n,r,i){t.push(r?i.replace(h,`$1`):n||e)}),t});function _(t,r){return e(t)?t:l(t,r)?[t]:g(n(t))}var v=1/0;function y(e){if(typeof e==`string`||r(e))return e;var t=e+``;return t==`0`&&1/e==-v?`-0`:t}function b(e,t){t=_(t,e);for(var n=0,r=t.length;e!=null&&n<r;)e=e[y(t[n++])];return n&&n==r?e:void 0}function x(e,t,n){var r=e==null?void 0:b(e,t);return r===void 0?n:r}export{l as a,_ as i,b as n,o,y as r,x as t};
import{D as e,d as t}from"./light-BDe84dgP.js";import{G as n,U as r}from"./index-DsVCmMvY.js";var i=/^(\d|\.)+$/,a=/(\d|\.)+/;function o(e,{c:t=1,offset:n=0,attachPx:r=!0}={}){if(typeof e==`number`){let r=(e+n)*t;return r===0?`0`:`${r}px`}else if(typeof e==`string`)if(i.test(e)){let i=(Number(e)+n)*t;return r?i===0?`0`:`${i}px`:`${i}`}else{let r=a.exec(e);return r?e.replace(a,String((Number(r[0])+n)*t)):e}return e}var s=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,c=/^\w*$/;function l(t,r){if(e(t))return!1;var i=typeof t;return i==`number`||i==`symbol`||i==`boolean`||t==null||n(t)?!0:c.test(t)||!s.test(t)||r!=null&&t in Object(r)}var u=`Expected a function`;function d(e,n){if(typeof e!=`function`||n!=null&&typeof n!=`function`)throw TypeError(u);var r=function(){var t=arguments,i=n?n.apply(this,t):t[0],a=r.cache;if(a.has(i))return a.get(i);var o=e.apply(this,t);return r.cache=a.set(i,o)||a,o};return r.cache=new(d.Cache||t),r}d.Cache=t;var f=500;function p(e){var t=d(e,function(e){return n.size===f&&n.clear(),e}),n=t.cache;return t}var m=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,h=/\\(\\)?/g,g=p(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(``),e.replace(m,function(e,n,r,i){t.push(r?i.replace(h,`$1`):n||e)}),t});function _(t,n){return e(t)?t:l(t,n)?[t]:g(r(t))}var v=1/0;function y(e){if(typeof e==`string`||n(e))return e;var t=e+``;return t==`0`&&1/e==-v?`-0`:t}function b(e,t){t=_(t,e);for(var n=0,r=t.length;e!=null&&n<r;)e=e[y(t[n++])];return n&&n==r?e:void 0}function x(e,t,n){var r=e==null?void 0:b(e,t);return r===void 0?n:r}export{l as a,_ as i,b as n,o,y as r,x as t};
+200
View File
File diff suppressed because one or more lines are too long
-200
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,L as n,X as r,it as i,p as a,z as o}from"./vue-router-bPs2Bq2h.js";import{A as s,M as c,j as l}from"./Card-BJm6ZyX4.js";import{o as u}from"./light-WRuBODwl.js";function d(e){return typeof e==`string`?document.querySelector(e):e()||null}function f(e){return e instanceof HTMLElement}function p(e){for(let t=0;t<e.childNodes.length;t++){let n=e.childNodes[t];if(f(n)&&(h(n)||p(n)))return!0}return!1}function m(e){for(let t=e.childNodes.length-1;t>=0;t--){let n=e.childNodes[t];if(f(n)&&(h(n)||m(n)))return!0}return!1}function h(e){if(!g(e))return!1;try{e.focus({preventScroll:!0})}catch{}return document.activeElement===e}function g(e){if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute(`tabIndex`)!==null)return!0;if(e.getAttribute(`disabled`))return!1;switch(e.nodeName){case`A`:return!!e.href&&e.rel!==`ignore`;case`INPUT`:return e.type!==`hidden`&&e.type!==`file`;case`SELECT`:case`TEXTAREA`:return!0;default:return!1}}var _=[],v=t({name:`FocusTrap`,props:{disabled:Boolean,active:Boolean,autoFocus:{type:Boolean,default:!0},onEsc:Function,initialFocusTo:[String,Function],finalFocusTo:[String,Function],returnFocusOnDeactivated:{type:Boolean,default:!0}},setup(e){let t=u(),a=i(null),f=i(null),h=!1,g=!1,v=typeof document>`u`?null:document.activeElement;function y(){return _[_.length-1]===t}function b(t){var n;t.code===`Escape`&&y()&&((n=e.onEsc)==null||n.call(e,t))}o(()=>{r(()=>e.active,e=>{e?(C(),l(`keydown`,document,b)):(s(`keydown`,document,b),h&&w())},{immediate:!0})}),n(()=>{s(`keydown`,document,b),h&&w()});function x(e){if(!g&&y()){let t=S();if(t===null||t.contains(c(e)))return;T(`first`)}}function S(){let e=a.value;if(e===null)return null;let t=e;for(;t=t.nextSibling,!(t===null||t instanceof Element&&t.tagName===`DIV`););return t}function C(){var n;if(!e.disabled){if(_.push(t),e.autoFocus){let{initialFocusTo:t}=e;t===void 0?T(`first`):(n=d(t))==null||n.focus({preventScroll:!0})}h=!0,document.addEventListener(`focus`,x,!0)}}function w(){var n;if(e.disabled||(document.removeEventListener(`focus`,x,!0),_=_.filter(e=>e!==t),y()))return;let{finalFocusTo:r}=e;r===void 0?e.returnFocusOnDeactivated&&v instanceof HTMLElement&&(g=!0,v.focus({preventScroll:!0}),g=!1):(n=d(r))==null||n.focus({preventScroll:!0})}function T(t){if(y()&&e.active){let e=a.value,n=f.value;if(e!==null&&n!==null){let r=S();if(r==null||r===n){g=!0,e.focus({preventScroll:!0}),g=!1;return}g=!0;let i=t===`first`?p(r):m(r);g=!1,i||(g=!0,e.focus({preventScroll:!0}),g=!1)}}}function E(e){if(g)return;let t=S();t!==null&&(e.relatedTarget!==null&&t.contains(e.relatedTarget)?T(`last`):T(`first`))}function D(e){g||(e.relatedTarget!==null&&e.relatedTarget===a.value?T(`last`):T(`first`))}return{focusableStartRef:a,focusableEndRef:f,focusableStyle:`position: absolute; height: 0; width: 0;`,handleStartFocus:E,handleEndFocus:D}},render(){let{default:t}=this.$slots;if(t===void 0)return null;if(this.disabled)return t();let{active:n,focusableStyle:r}=this;return e(a,null,[e(`div`,{"aria-hidden":`true`,tabindex:n?`0`:`-1`,ref:`focusableStartRef`,style:r,onFocus:this.handleStartFocus}),t(),e(`div`,{"aria-hidden":`true`,style:r,ref:`focusableEndRef`,tabindex:n?`0`:`-1`,onFocus:this.handleEndFocus})])}}),y=new WeakSet;function b(e){y.add(e)}function x(e){return!y.has(e)}function S(e,t=[],n){let r={};return t.forEach(t=>{r[t]=e[t]}),Object.assign(r,n)}export{v as i,x as n,b as r,S as t};
+1
View File
@@ -0,0 +1 @@
import{T as e}from"./vue-router-bPs2Bq2h.js";import{t}from"./light-BDe84dgP.js";function n(e=8){return Math.random().toString(16).slice(2,2+e)}function r(t,...n){return typeof t==`function`?t(...n):typeof t==`string`?e(t):typeof t==`number`?e(String(t)):null}var i={railInsetHorizontalBottom:`auto 2px 4px 2px`,railInsetHorizontalTop:`4px 2px auto 2px`,railInsetVerticalRight:`2px 4px 2px auto`,railInsetVerticalLeft:`2px auto 2px 4px`,railColor:`transparent`};function a(e){let{scrollbarColor:t,scrollbarColorHover:n,scrollbarHeight:r,scrollbarWidth:a,scrollbarBorderRadius:o}=e;return Object.assign(Object.assign({},i),{height:r,width:a,borderRadius:o,color:t,colorHover:n})}var o={name:`Scrollbar`,common:t,self:a},s={paddingSmall:`12px 16px 12px`,paddingMedium:`19px 24px 20px`,paddingLarge:`23px 32px 24px`,paddingHuge:`27px 40px 28px`,titleFontSizeSmall:`16px`,titleFontSizeMedium:`18px`,titleFontSizeLarge:`18px`,titleFontSizeHuge:`18px`,closeIconSize:`18px`,closeSize:`22px`};function c(e){let{primaryColor:t,borderRadius:n,lineHeight:r,fontSize:i,cardColor:a,textColor2:o,textColor1:c,dividerColor:l,fontWeightStrong:u,closeIconColor:d,closeIconColorHover:f,closeIconColorPressed:p,closeColorHover:m,closeColorPressed:h,modalColor:g,boxShadow1:_,popoverColor:v,actionColor:y}=e;return Object.assign(Object.assign({},s),{lineHeight:r,color:a,colorModal:g,colorPopover:v,colorTarget:t,colorEmbedded:y,colorEmbeddedModal:y,colorEmbeddedPopover:y,textColor:o,titleTextColor:c,borderColor:l,actionColor:y,titleFontWeight:u,closeColorHover:m,closeColorPressed:h,closeBorderRadius:n,closeIconColor:d,closeIconColorHover:f,closeIconColorPressed:p,fontSizeSmall:i,fontSizeMedium:i,fontSizeLarge:i,fontSizeHuge:i,boxShadow:_,borderRadius:n})}var l={name:`Card`,common:t,self:c};export{r as a,a as i,c as n,n as o,o as r,l as t};
-1
View File
@@ -1 +0,0 @@
import{T as e}from"./vue-router-bPs2Bq2h.js";import{B as t,n,t as r}from"./light-BDe84dgP.js";function i(e=8){return Math.random().toString(16).slice(2,2+e)}function a(t,...n){return typeof t==`function`?t(...n):typeof t==`string`?e(t):typeof t==`number`?e(String(t)):null}var o={railInsetHorizontalBottom:`auto 2px 4px 2px`,railInsetHorizontalTop:`4px 2px auto 2px`,railInsetVerticalRight:`2px 4px 2px auto`,railInsetVerticalLeft:`2px auto 2px 4px`,railColor:`transparent`};function s(e){let{scrollbarColor:t,scrollbarColorHover:n,scrollbarHeight:r,scrollbarWidth:i,scrollbarBorderRadius:a}=e;return Object.assign(Object.assign({},o),{height:r,width:i,borderRadius:a,color:t,colorHover:n})}var c={name:`Scrollbar`,common:r,self:s},l={paddingTiny:`0 8px`,paddingSmall:`0 10px`,paddingMedium:`0 12px`,paddingLarge:`0 14px`,clearSize:`16px`};function u(e){let{textColor2:n,textColor3:r,textColorDisabled:i,primaryColor:a,primaryColorHover:o,inputColor:s,inputColorDisabled:c,borderColor:u,warningColor:d,warningColorHover:f,errorColor:p,errorColorHover:m,borderRadius:h,lineHeight:g,fontSizeTiny:_,fontSizeSmall:v,fontSizeMedium:y,fontSizeLarge:b,heightTiny:x,heightSmall:S,heightMedium:C,heightLarge:w,actionColor:T,clearColor:E,clearColorHover:D,clearColorPressed:O,placeholderColor:k,placeholderColorDisabled:A,iconColor:j,iconColorDisabled:M,iconColorHover:N,iconColorPressed:P,fontWeight:F}=e;return Object.assign(Object.assign({},l),{fontWeight:F,countTextColorDisabled:i,countTextColor:r,heightTiny:x,heightSmall:S,heightMedium:C,heightLarge:w,fontSizeTiny:_,fontSizeSmall:v,fontSizeMedium:y,fontSizeLarge:b,lineHeight:g,lineHeightTextarea:g,borderRadius:h,iconSize:`16px`,groupLabelColor:T,groupLabelTextColor:n,textColor:n,textColorDisabled:i,textDecorationColor:n,caretColor:a,placeholderColor:k,placeholderColorDisabled:A,color:s,colorDisabled:c,colorFocus:s,groupLabelBorder:`1px solid ${u}`,border:`1px solid ${u}`,borderHover:`1px solid ${o}`,borderDisabled:`1px solid ${u}`,borderFocus:`1px solid ${o}`,boxShadowFocus:`0 0 0 2px ${t(a,{alpha:.2})}`,loadingColor:a,loadingColorWarning:d,borderWarning:`1px solid ${d}`,borderHoverWarning:`1px solid ${f}`,colorFocusWarning:s,borderFocusWarning:`1px solid ${f}`,boxShadowFocusWarning:`0 0 0 2px ${t(d,{alpha:.2})}`,caretColorWarning:d,loadingColorError:p,borderError:`1px solid ${p}`,borderHoverError:`1px solid ${m}`,colorFocusError:s,borderFocusError:`1px solid ${m}`,boxShadowFocusError:`0 0 0 2px ${t(p,{alpha:.2})}`,caretColorError:p,clearColor:E,clearColorHover:D,clearColorPressed:O,iconColor:j,iconColorDisabled:M,iconColorHover:N,iconColorPressed:P,suffixTextColor:n})}var d=n({name:`Input`,common:r,peers:{Scrollbar:c},self:u}),f={paddingSmall:`12px 16px 12px`,paddingMedium:`19px 24px 20px`,paddingLarge:`23px 32px 24px`,paddingHuge:`27px 40px 28px`,titleFontSizeSmall:`16px`,titleFontSizeMedium:`18px`,titleFontSizeLarge:`18px`,titleFontSizeHuge:`18px`,closeIconSize:`18px`,closeSize:`22px`};function p(e){let{primaryColor:t,borderRadius:n,lineHeight:r,fontSize:i,cardColor:a,textColor2:o,textColor1:s,dividerColor:c,fontWeightStrong:l,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:p,closeColorHover:m,closeColorPressed:h,modalColor:g,boxShadow1:_,popoverColor:v,actionColor:y}=e;return Object.assign(Object.assign({},f),{lineHeight:r,color:a,colorModal:g,colorPopover:v,colorTarget:t,colorEmbedded:y,colorEmbeddedModal:y,colorEmbeddedPopover:y,textColor:o,titleTextColor:s,borderColor:c,actionColor:y,titleFontWeight:l,closeColorHover:m,closeColorPressed:h,closeBorderRadius:n,closeIconColor:u,closeIconColorHover:d,closeIconColorPressed:p,fontSizeSmall:i,fontSizeMedium:i,fontSizeLarge:i,fontSizeHuge:i,boxShadow:_,borderRadius:n})}var m={name:`Card`,common:r,self:p};export{c as a,i as c,l as i,p as n,s as o,d as r,a as s,m as t};
@@ -1,4 +1,4 @@
import{A as e,D as t,v as n}from"./vue-router-bPs2Bq2h.js";import{K as r,M as i,N as a,Y as o,Z as s,r as c}from"./light-BDe84dgP.js";import{t as l}from"./use-compitable-BcHeQzgm.js";import{r as u}from"./index-DzEqT7MZ.js";var d=r(`text`,`
import{A as e,D as t,v as n}from"./vue-router-bPs2Bq2h.js";import{K as r,M as i,N as a,Y as o,Z as s,r as c}from"./light-BDe84dgP.js";import{t as l}from"./use-compitable-BcHeQzgm.js";import{r as u}from"./index-DsVCmMvY.js";var d=r(`text`,`
transition: color .3s var(--n-bezier);
color: var(--n-text-color);
`,[o(`strong`,`
@@ -1 +1 @@
import{j as e}from"./vue-router-bPs2Bq2h.js";import{I as t}from"./light-BDe84dgP.js";import{f as n}from"./index-DzEqT7MZ.js";function r(){let r=e(n,null);return r===null&&t(`use-message`,"No outer <n-message-provider /> founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),r}export{r as t};
import{j as e}from"./vue-router-bPs2Bq2h.js";import{I as t}from"./light-BDe84dgP.js";import{f as n}from"./index-DsVCmMvY.js";function r(){let r=e(n,null);return r===null&&t(`use-message`,"No outer <n-message-provider /> founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),r}export{r as t};
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{B as e,it as t,z as n}from"./vue-router-bPs2Bq2h.js";function r(r,i=5e3){let a=t(!0),o=null,s=()=>{a.value=!0,r(),o=window.setInterval(r,i)},c=()=>{a.value=!1,o&&=(clearInterval(o),null)};return n(s),e(c),{isActive:a,start:s,stop:c}}export{r as t};
+131
View File
File diff suppressed because one or more lines are too long
-131
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,10 +5,10 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Вечерний детектив</title>
<script type="module" crossorigin src="/assets/index-DzEqT7MZ.js"></script>
<script type="module" crossorigin src="/assets/index-DsVCmMvY.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vue-router-bPs2Bq2h.js">
<link rel="modulepreload" crossorigin href="/assets/light-BDe84dgP.js">
<link rel="modulepreload" crossorigin href="/assets/light-q2QEcHBK.js">
<link rel="modulepreload" crossorigin href="/assets/light-WRuBODwl.js">
<link rel="stylesheet" crossorigin href="/assets/index-B60POEOw.css">
</head>
<body>
+177 -10
View File
@@ -194,8 +194,8 @@ service EveningDetectiveServer {
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags: "Пользователи";
summary: "Изменить чужой пароль (только администратор)";
tags : "Пользователи";
summary : "Изменить чужой пароль (только администратор)";
description: "Пароль вводится вручную: минимум 12 символов, максимум 72 байта. Сеансы сохраняются. Ошибки: 401 — нет авторизации, 403 — нет прав, 400 — неверные данные или собственный ID, 404 — пользователь не найден, 500 — ошибка сохранения.";
};
}
@@ -437,11 +437,11 @@ service EveningDetectiveServer {
// Видео загружается через UploadFile (MP4/WebM). Пустая conclusion удаляет закрывашку.
rpc UpdateScenarioConclusion(UpdateScenarioConclusionReq) returns (UpdateScenarioConclusionRsp) {
option (google.api.http) = {
put: "/api/scenarios/{id}/conclusion"
put : "/api/scenarios/{id}/conclusion"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags: "Сценарии";
tags : "Сценарии";
summary: "Обновить закрывашку сценария (игрокам не передаётся)";
};
}
@@ -498,6 +498,84 @@ service EveningDetectiveServer {
};
}
// Создать сессию экрана. Экран получает токен и показывает QR для привязки.
rpc CreateScreenSession(CreateScreenSessionReq) returns (CreateScreenSessionRsp) {
option (google.api.http) = {
post: "/api/screens"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security: {
security_requirement: {}
}
tags : "Экраны";
summary: "Создать сессию экрана";
};
}
// Получить состояние экрана по его токену. Вызывается самим экраном.
rpc GetScreenState(GetScreenStateReq) returns (GetScreenStateRsp) {
option (google.api.http) = {
post: "/api/screens/state"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security: {
security_requirement: {}
}
tags : "Экраны";
summary: "Получить состояние экрана";
};
}
// Привязать экран к игре. Требует авторизацию организатора, автора или администратора.
rpc BindScreen(BindScreenReq) returns (BindScreenRsp) {
option (google.api.http) = {
post: "/api/screens/{screenId}/bind"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Привязать экран к игре";
};
}
// Отвязать экран от игры. Требует авторизацию организатора, автора или администратора.
rpc UnbindScreen(UnbindScreenReq) returns (UnbindScreenRsp) {
option (google.api.http) = {
post: "/api/screens/{screenId}/unbind"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Отвязать экран от игры";
};
}
// Изменить общий режим показа всех экранов игры.
rpc SetScreenMode(SetScreenModeReq) returns (SetScreenModeRsp) {
option (google.api.http) = {
post: "/api/games/{gameId}/screens/mode"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Изменить режим показа экранов";
};
}
// Отправить общую команду экранам игры.
rpc SendScreenCommand(SendScreenCommandReq) returns (SendScreenCommandRsp) {
option (google.api.http) = {
post: "/api/games/{gameId}/screens/command"
body: "*"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
tags : "Экраны";
summary: "Отправить команду экранам";
};
}
rpc DownloadTeamQR(GetGameReq) returns (google.api.HttpBody) {
option (google.api.http) = {
get: "/api/games/{id}/teams/qr.pdf"
@@ -841,7 +919,7 @@ message GetMeRsp {
}
message ChangeUserPasswordReq {
int32 id = 1;
int32 id = 1;
string new_password = 2;
}
@@ -943,7 +1021,7 @@ message Story {
}
message Conclusion {
string text = 1;
string text = 1;
string video = 2;
}
@@ -1083,7 +1161,7 @@ message DeleteScenarioPlaceRsp {
}
message UpdateScenarioConclusionReq {
int32 id = 1;
int32 id = 1;
Conclusion conclusion = 2;
}
@@ -1168,6 +1246,95 @@ message Game {
optional google.protobuf.Timestamp ended_at = 9;
}
enum ScreenMode {
SCREEN_MODE_UNSPECIFIED = 0;
SCREEN_MODE_COVER = 1;
SCREEN_MODE_INTRO = 2;
SCREEN_MODE_INTRO_DONE = 3;
SCREEN_MODE_CONCLUSION = 4;
SCREEN_MODE_CONCLUSION_DONE = 5;
SCREEN_MODE_RESULTS = 6;
}
enum ScreenCommand {
SCREEN_COMMAND_UNSPECIFIED = 0;
SCREEN_COMMAND_PLAY = 1;
SCREEN_COMMAND_PAUSE = 2;
SCREEN_COMMAND_RESUME = 3;
SCREEN_COMMAND_STOP = 4;
SCREEN_COMMAND_REPLAY = 5;
SCREEN_COMMAND_SEEK = 6;
SCREEN_COMMAND_VOLUME = 7;
}
message ScreenState {
string id = 1;
string status = 2;
optional int32 game_id = 3;
ScreenMode mode = 4;
bool sound_enabled = 5;
string error = 6;
int64 state_version = 7;
int64 position_ms = 8;
}
message CreateScreenSessionReq {}
message CreateScreenSessionRsp {
string error = 1;
string screen_id = 2;
string access_token = 3;
}
message GetScreenStateReq {
string screenId = 1;
string accessToken = 2;
}
message GetScreenStateRsp {
string error = 1;
ScreenState state = 2;
}
message BindScreenReq {
string screenId = 1;
string accessToken = 2;
int32 gameId = 3;
}
message BindScreenRsp {
string error = 1;
ScreenState state = 2;
}
message UnbindScreenReq {
string screenId = 1;
}
message UnbindScreenRsp {
string error = 1;
}
message SetScreenModeReq {
int32 gameId = 1;
ScreenMode mode = 2;
}
message SetScreenModeRsp {
string error = 1;
}
message SendScreenCommandReq {
int32 gameId = 1;
ScreenCommand command = 2;
int64 position_ms = 3;
int32 volume = 4;
}
message SendScreenCommandRsp {
string error = 1;
}
message Team {
int32 id = 1;
string name = 2;
@@ -1330,9 +1497,9 @@ message GetTeamStoryReq {
}
message GetTeamStoryRsp {
string error = 1;
Story story = 2;
Game game = 3;
string error = 1;
Story story = 2;
Game game = 3;
repeated TeamAction actions = 4;
}
@@ -2,6 +2,23 @@
/* eslint-disable camelcase */
// @ts-nocheck
export type ScreenMode =
| "SCREEN_MODE_UNSPECIFIED"
| "SCREEN_MODE_COVER"
| "SCREEN_MODE_INTRO"
| "SCREEN_MODE_INTRO_DONE"
| "SCREEN_MODE_CONCLUSION"
| "SCREEN_MODE_CONCLUSION_DONE"
| "SCREEN_MODE_RESULTS";
export type ScreenCommand =
| "SCREEN_COMMAND_UNSPECIFIED"
| "SCREEN_COMMAND_PLAY"
| "SCREEN_COMMAND_PAUSE"
| "SCREEN_COMMAND_RESUME"
| "SCREEN_COMMAND_STOP"
| "SCREEN_COMMAND_REPLAY"
| "SCREEN_COMMAND_SEEK"
| "SCREEN_COMMAND_VOLUME";
export type PingReq = {
};
@@ -471,6 +488,75 @@ export type Game = {
endedAt?: wellKnownTimestamp;
};
export type ScreenState = {
id: string | undefined;
status: string | undefined;
gameId?: number;
mode: ScreenMode | undefined;
soundEnabled: boolean | undefined;
error: string | undefined;
stateVersion: number | undefined;
positionMs: number | undefined;
};
export type CreateScreenSessionReq = {
};
export type CreateScreenSessionRsp = {
error: string | undefined;
screenId: string | undefined;
accessToken: string | undefined;
};
export type GetScreenStateReq = {
screenId: string | undefined;
accessToken: string | undefined;
};
export type GetScreenStateRsp = {
error: string | undefined;
state: ScreenState | undefined;
};
export type BindScreenReq = {
screenId: string | undefined;
accessToken: string | undefined;
gameId: number | undefined;
};
export type BindScreenRsp = {
error: string | undefined;
state: ScreenState | undefined;
};
export type UnbindScreenReq = {
screenId: string | undefined;
};
export type UnbindScreenRsp = {
error: string | undefined;
};
export type SetScreenModeReq = {
gameId: number | undefined;
mode: ScreenMode | undefined;
};
export type SetScreenModeRsp = {
error: string | undefined;
};
export type SendScreenCommandReq = {
gameId: number | undefined;
command: ScreenCommand | undefined;
positionMs: number | undefined;
volume: number | undefined;
};
export type SendScreenCommandRsp = {
error: string | undefined;
};
export type GetGameReq = {
id: number | undefined;
};
@@ -740,6 +826,18 @@ export interface EveningDetectiveServer {
AddGame(request: AddGameReq): Promise<AddGameRsp>;
GetGames(request: GetGamesReq): Promise<GetGamesRsp>;
GetGame(request: GetGameReq): Promise<GetGameRsp>;
// Создать сессию экрана. Экран получает токен и показывает QR для привязки.
CreateScreenSession(request: CreateScreenSessionReq): Promise<CreateScreenSessionRsp>;
// Получить состояние экрана по его токену. Вызывается самим экраном.
GetScreenState(request: GetScreenStateReq): Promise<GetScreenStateRsp>;
// Привязать экран к игре. Требует авторизацию организатора, автора или администратора.
BindScreen(request: BindScreenReq): Promise<BindScreenRsp>;
// Отвязать экран от игры. Требует авторизацию организатора, автора или администратора.
UnbindScreen(request: UnbindScreenReq): Promise<UnbindScreenRsp>;
// Изменить общий режим показа всех экранов игры.
SetScreenMode(request: SetScreenModeReq): Promise<SetScreenModeRsp>;
// Отправить общую команду экранам игры.
SendScreenCommand(request: SendScreenCommandReq): Promise<SendScreenCommandRsp>;
DownloadTeamQR(request: GetGameReq): Promise<googleapi_HttpBody>;
GetGameAnswers(request: GetGameAnswersReq): Promise<GetGameAnswersRsp>;
GetGameResults(request: GetGameResultsReq): Promise<GetGameResultsRsp>;
@@ -1569,6 +1667,120 @@ export function createEveningDetectiveServerClient(
method: "GetGame",
}) as Promise<GetGameRsp>;
},
CreateScreenSession(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
const path = `api/screens`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "CreateScreenSession",
}) as Promise<CreateScreenSessionRsp>;
},
GetScreenState(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
const path = `api/screens/state`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "GetScreenState",
}) as Promise<GetScreenStateRsp>;
},
BindScreen(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
if (!request.screenId) {
throw new Error("missing required field request.screenId");
}
const path = `api/screens/${request.screenId}/bind`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "BindScreen",
}) as Promise<BindScreenRsp>;
},
UnbindScreen(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
if (!request.screenId) {
throw new Error("missing required field request.screenId");
}
const path = `api/screens/${request.screenId}/unbind`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "UnbindScreen",
}) as Promise<UnbindScreenRsp>;
},
SetScreenMode(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
if (!request.gameId) {
throw new Error("missing required field request.gameId");
}
const path = `api/games/${request.gameId}/screens/mode`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "SetScreenMode",
}) as Promise<SetScreenModeRsp>;
},
SendScreenCommand(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
if (!request.gameId) {
throw new Error("missing required field request.gameId");
}
const path = `api/games/${request.gameId}/screens/command`; // eslint-disable-line quotes
const body = JSON.stringify(request);
const queryParams: string[] = [];
let uri = path;
if (queryParams.length > 0) {
uri += `?${queryParams.join("&")}`
}
return handler({
path: uri,
method: "POST",
body,
}, {
service: "EveningDetectiveServer",
method: "SendScreenCommand",
}) as Promise<SendScreenCommandRsp>;
},
DownloadTeamQR(request) { // eslint-disable-line @typescript-eslint/no-unused-vars
if (!request.id) {
throw new Error("missing required field request.id");
+202
View File
@@ -0,0 +1,202 @@
<script setup lang="ts">
import { NButton, NCard, NQrCode, NSelect, useMessage } from 'naive-ui'
import { computed, onMounted, onUnmounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { getAuthClient } from '@/api/auth_client'
import type { Game, ScreenState } from '@/api/generated/crabs/evening_detective_server'
import HeaderMenu from '@/components/HeaderMenu.vue'
const sessionKey = 'evening-detective-screen-session'
const client = getAuthClient()
const message = useMessage()
const route = useRoute()
const screenId = ref('')
const accessToken = ref('')
const state = ref<ScreenState>()
const games = ref<Game[]>([])
const selectedGameId = ref<number | null>(null)
const prepared = ref(false)
const loading = ref(true)
const binding = ref(false)
const bindSuccess = ref(false)
let pollTimer: number | null = null
const bindingFlow = computed(() => Boolean(route.query.screenId && route.query.accessToken))
const qrValue = computed(() => {
if (!screenId.value || !accessToken.value) return ''
const url = new URL('/screen', window.location.origin)
url.searchParams.set('screenId', screenId.value)
url.searchParams.set('accessToken', accessToken.value)
return url.toString()
})
const gameOptions = computed(() =>
games.value.map((game) => ({ label: game.name || `Игра ${game.id}`, value: game.id! })),
)
function saveSession() {
sessionStorage.setItem(sessionKey, JSON.stringify({ screenId: screenId.value, accessToken: accessToken.value }))
}
function readSession() {
try {
const saved = JSON.parse(sessionStorage.getItem(sessionKey) || '{}') as {
screenId?: string
accessToken?: string
}
screenId.value = saved.screenId || ''
accessToken.value = saved.accessToken || ''
} catch {
sessionStorage.removeItem(sessionKey)
}
}
async function createSession() {
const res = await client.CreateScreenSession({})
if (res.error || !res.screenId || !res.accessToken) {
throw new Error(res.error || 'Не удалось создать сессию экрана')
}
screenId.value = res.screenId
accessToken.value = res.accessToken
saveSession()
}
async function loadState() {
if (!screenId.value || !accessToken.value) return
try {
const res = await client.GetScreenState({ screenId: screenId.value, accessToken: accessToken.value })
if (res.error) throw new Error(res.error)
state.value = res.state
} catch (err) {
message.error(err instanceof Error ? err.message : 'Не удалось получить состояние экрана')
}
}
async function loadGames() {
try {
const res = await client.GetGames({})
if (res.error) throw new Error(res.error)
games.value = res.games || []
} catch (err) {
message.error(err instanceof Error ? err.message : 'Не удалось загрузить игры')
}
}
async function bind() {
if (!selectedGameId.value || !route.query.screenId || !route.query.accessToken) return
binding.value = true
try {
const res = await client.BindScreen({
screenId: String(route.query.screenId),
accessToken: String(route.query.accessToken),
gameId: selectedGameId.value,
})
if (res.error) throw new Error(res.error)
bindSuccess.value = true
} catch (err) {
message.error(err instanceof Error ? err.message : 'Не удалось привязать экран')
} finally {
binding.value = false
}
}
async function prepareScreen() {
try {
await document.documentElement.requestFullscreen?.()
} catch {
message.warning('Полноэкранный режим недоступен в этом браузере')
}
prepared.value = true
}
onMounted(async () => {
if (bindingFlow.value) {
await loadGames()
loading.value = false
return
}
readSession()
try {
if (!screenId.value || !accessToken.value) await createSession()
await loadState()
pollTimer = window.setInterval(loadState, 1000)
} catch (err) {
message.error(err instanceof Error ? err.message : 'Не удалось подготовить экран')
} finally {
loading.value = false
}
})
onUnmounted(() => {
if (pollTimer != null) window.clearInterval(pollTimer)
})
</script>
<template>
<div v-if="bindingFlow" class="screen-center">
<n-card class="binding-card" title="Привязка экрана">
<template v-if="bindSuccess">
<p>Экран привязан к игре.</p>
<p>Можно закрыть эту страницу.</p>
</template>
<template v-else>
<p>Выберите игру, к которой привязать экран.</p>
<n-select v-model:value="selectedGameId" :options="gameOptions" placeholder="Игра" />
<n-button type="primary" :loading="binding" :disabled="selectedGameId == null" @click="bind">
Привязать
</n-button>
</template>
</n-card>
</div>
<div v-else class="screen-page">
<div v-if="loading" class="screen-center">Подготовка экрана…</div>
<template v-else>
<div v-if="!state?.gameId" class="screen-center">
<n-card class="qr-card" title="Подключение экрана">
<n-qr-code v-if="qrValue" :value="qrValue" :size="260" />
<p>Отсканируйте QR телефоном организатора и выберите игру.</p>
<n-button v-if="!prepared" type="primary" @click="prepareScreen">Подготовить экран</n-button>
</n-card>
</div>
<div v-else class="screen-center">
<n-card class="ready-card">
<p class="ready-title">Экран подключён</p>
<p>Игра №{{ state.gameId }}</p>
<n-button v-if="!prepared" type="primary" @click="prepareScreen">Подготовить экран</n-button>
</n-card>
</div>
</template>
</div>
<HeaderMenu v-if="bindingFlow" active="games" />
</template>
<style scoped>
.binding-card,
.qr-card,
.ready-card {
max-width: min(94vw, 520px);
text-align: center;
width: 100%;
}
.ready-title {
font-size: 28px;
}
.screen-center {
align-items: center;
display: flex;
justify-content: center;
min-height: 100dvh;
padding: 20px;
}
.screen-page {
background: #111;
color: #eee;
min-height: 100dvh;
}
</style>
+5
View File
@@ -38,6 +38,11 @@ const router = createRouter({
name: 'games',
component: () => import('../views/GamesView.vue'),
},
{
path: '/screen',
name: 'screen',
component: () => import('../views/ScreenView.vue'),
},
{
path: '/games/:id/results',
name: 'game-results',
+7
View File
@@ -0,0 +1,7 @@
<script setup lang="ts">
import ScreenPage from '@/components/ScreenPage.vue'
</script>
<template>
<ScreenPage />
</template>