From 68ba4330a81fa4e4ca3172437d71cbc6f144cf2c Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 11:25:47 -0300 Subject: [PATCH 01/12] Removing HTML builder capabilities. --- .../Extensions/PlantumlHtmlDiagram.cs | 74 ------------------- src/C4Sharp/Resources/C4_Diagram.html | 50 ------------- src/C4Sharp/Resources/ds.js | 63 ---------------- src/C4Sharp/Resources/index.html | 35 --------- 4 files changed, 222 deletions(-) delete mode 100644 src/C4Sharp/Models/Plantuml/Extensions/PlantumlHtmlDiagram.cs delete mode 100644 src/C4Sharp/Resources/C4_Diagram.html delete mode 100644 src/C4Sharp/Resources/ds.js delete mode 100644 src/C4Sharp/Resources/index.html diff --git a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlHtmlDiagram.cs b/src/C4Sharp/Models/Plantuml/Extensions/PlantumlHtmlDiagram.cs deleted file mode 100644 index 8331978..0000000 --- a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlHtmlDiagram.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Text; -using C4Sharp.Diagrams; -using C4Sharp.Extensions; - -namespace C4Sharp.Models.Plantuml.Extensions; - -public static class PlantumlHtmlDiagram -{ - public static string ToHtmlPage(this Diagram diagram) - { - var content = ResourceMethods.GetResourceContent("C4_Diagram.html"); - var structs = ListStructure(diagram); - - return content - .Replace("{{title}}", diagram.Title) - .Replace("{{description}}", diagram.Description) - .Replace("{{diagram-type}}", diagram.Type.Name) - .Replace("{{image}}", diagram.SvgFileName()) - .Replace("{{structure-items}}", structs) - .Replace("{{alt}}", diagram.Slug()); - } - - public static string ToIndexHtmlPage(this IEnumerable diagrams) - { - var content = ResourceMethods.GetResourceContent("index.html"); - var items = ListDiagrams(diagrams); - - return content - .Replace("{{diagrams-items}}", items); - } - - private static string ListStructure(Diagram diagram) - { - var values = new StringBuilder(); - foreach (var structure in diagram.Structures) - { - values.AppendLine("
  • "); - values.Append($"

    {structure.Label}

    "); - values.Append($"

    {structure.Alias} | {structure.Boundary.ToString()}

    "); - values.Append($"

    {structure.Description}

    "); - values.Append($"
  • "); - } - - return values.ToString(); - } - - private static string ListDiagrams(IEnumerable diagrams) - { - var values = new StringBuilder(); - foreach (var structure in diagrams) - { - values.AppendLine("
  • "); - values.Append("
    "); - values.Append($"
     
    "); - values.Append("
    "); - values.Append("
    "); - values.Append($"

    {structure.Title}

    "); - values.Append($"

    {structure.Type.Name} Diagram

    "); - values.Append($"
    "); - values.Append("
    "); - values.Append($"

    {structure.Description}

    "); - values.Append($"HTML | "); - values.Append($"SVG | "); - values.Append($"PUML"); - values.Append($"
    "); - values.Append("
    "); - values.Append("
    "); - values.Append($"
  • "); - } - - return values.ToString(); - } - -} \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Diagram.html b/src/C4Sharp/Resources/C4_Diagram.html deleted file mode 100644 index c6f2b17..0000000 --- a/src/C4Sharp/Resources/C4_Diagram.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - {{title}} - - - -
    -
    - logo -
    - -
    -

    {{title}}

    -

    {{diagram-type}} Diagram

    -

    {{description}}

    -
    - - -
    - - - {{alt}} - - -
    - - -
    -

    Structures

    -
      - {{structure-items}} -
    -
    - -
    -
    -

    This document was build by C4Sharp

    - -
    -
    - - - \ No newline at end of file diff --git a/src/C4Sharp/Resources/ds.js b/src/C4Sharp/Resources/ds.js deleted file mode 100644 index 055ece1..0000000 --- a/src/C4Sharp/Resources/ds.js +++ /dev/null @@ -1,63 +0,0 @@ -(()=>{var _y=Object.create;var Mr=Object.defineProperty;var Cy=Object.getOwnPropertyDescriptor;var Ay=Object.getOwnPropertyNames;var Ey=Object.getPrototypeOf,Oy=Object.prototype.hasOwnProperty;var Go=i=>Mr(i,"__esModule",{value:!0});var Zi=i=>{if(typeof require!="undefined")return require(i);throw new Error('Dynamic require of "'+i+'" is not supported')};var S=(i,e)=>()=>(i&&(e=i(i=0)),e);var b=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),me=(i,e)=>{Go(i);for(var t in e)Mr(i,t,{get:e[t],enumerable:!0})},Ty=(i,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ay(e))!Oy.call(i,r)&&r!=="default"&&Mr(i,r,{get:()=>e[r],enumerable:!(t=Cy(e,r))||t.enumerable});return i},V=i=>Ty(Go(Mr(i!=null?_y(Ey(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var h,l=S(()=>{h={platform:"",env:{},versions:{node:"14.17.6"}}});var Py,ge,tt=S(()=>{l();Py=0,ge={readFileSync:i=>self[i]||"",statSync:()=>({mtimeMs:Py++})}});var Yo={};me(Yo,{default:()=>ee});var ee,Ue=S(()=>{l();ee={resolve:i=>i,extname:i=>"."+i.split(".").pop()}});var Ho,Qo=S(()=>{l();Ho={sync:i=>[].concat(i)}});var es=b((QC,Xo)=>{l();"use strict";var Jo=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[r,s]of this.oldCache.entries())this.onEviction(r,s);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};Xo.exports=Jo});var Ko,Zo=S(()=>{l();Ko=i=>i});var el,tl=S(()=>{l();el=i=>i&&i._hash});function Lr(i){return el(i,{ignoreUnknown:!0})}var rl=S(()=>{l();tl()});var Fr,ts=S(()=>{l();Fr={}});function il(i){let e=ge.readFileSync(i,"utf-8"),t=Fr(e);return{file:i,requires:t}}function rs(i){let t=[il(i)];for(let r of t)r.requires.filter(s=>s.startsWith("./")||s.startsWith("../")).forEach(s=>{try{let n=ee.dirname(r.file),a=Fr.sync(s,{basedir:n}),o=il(a);t.push(o)}catch(n){}});return t}var sl=S(()=>{l();tt();Ue();ts();ts()});function Ve(i){if(i=`${i}`,i==="0")return"0";if(/^[+-]?(\d+|\d*\.\d+)(e[+-]?\d+)?(%|\w+)?$/.test(i))return i.replace(/^[+-]?/,e=>e==="-"?"":"-");if(i.includes("var(")||i.includes("calc("))return`calc(${i} * -1)`}var Br=S(()=>{l()});var nl,al=S(()=>{l();nl=["preflight","container","accessibility","pointerEvents","visibility","position","inset","isolation","zIndex","order","gridColumn","gridColumnStart","gridColumnEnd","gridRow","gridRowStart","gridRowEnd","float","clear","margin","boxSizing","display","aspectRatio","height","maxHeight","minHeight","width","minWidth","maxWidth","flex","flexShrink","flexGrow","flexBasis","tableLayout","borderCollapse","transformOrigin","translate","rotate","skew","scale","transform","animation","cursor","touchAction","userSelect","resize","scrollSnapType","scrollSnapAlign","scrollSnapStop","scrollMargin","scrollPadding","listStylePosition","listStyleType","appearance","columns","breakBefore","breakInside","breakAfter","gridAutoColumns","gridAutoFlow","gridAutoRows","gridTemplateColumns","gridTemplateRows","flexDirection","flexWrap","placeContent","placeItems","alignContent","alignItems","justifyContent","justifyItems","gap","space","divideWidth","divideStyle","divideColor","divideOpacity","placeSelf","alignSelf","justifySelf","overflow","overscrollBehavior","scrollBehavior","textOverflow","whitespace","wordBreak","borderRadius","borderWidth","borderStyle","borderColor","borderOpacity","backgroundColor","backgroundOpacity","backgroundImage","gradientColorStops","boxDecorationBreak","backgroundSize","backgroundAttachment","backgroundClip","backgroundPosition","backgroundRepeat","backgroundOrigin","fill","stroke","strokeWidth","objectFit","objectPosition","padding","textAlign","textIndent","verticalAlign","fontFamily","fontSize","fontWeight","textTransform","fontStyle","fontVariantNumeric","lineHeight","letterSpacing","textColor","textOpacity","textDecoration","textDecorationColor","textDecorationStyle","textDecorationThickness","textUnderlineOffset","fontSmoothing","placeholderColor","placeholderOpacity","caretColor","accentColor","opacity","backgroundBlendMode","mixBlendMode","boxShadow","boxShadowColor","outlineStyle","outlineWidth","outlineOffset","outlineColor","ringWidth","ringColor","ringOpacity","ringOffsetWidth","ringOffsetColor","blur","brightness","contrast","dropShadow","grayscale","hueRotate","invert","saturate","sepia","filter","backdropBlur","backdropBrightness","backdropContrast","backdropGrayscale","backdropHueRotate","backdropInvert","backdropOpacity","backdropSaturate","backdropSepia","backdropFilter","transitionProperty","transitionDelay","transitionDuration","transitionTimingFunction","willChange","content"]});function ol(i,e){return i===void 0?e:Array.isArray(i)?i:[...new Set(e.filter(r=>i!==!1&&i[r]!==!1).concat(Object.keys(i).filter(r=>i[r]!==!1)))]}var ll=S(()=>{l()});var Lt=b((uA,ul)=>{l();ul.exports={content:[],presets:[],darkMode:"media",theme:{screens:{sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},colors:({colors:i})=>({inherit:i.inherit,current:i.current,transparent:i.transparent,black:i.black,white:i.white,slate:i.slate,gray:i.gray,zinc:i.zinc,neutral:i.neutral,stone:i.stone,red:i.red,orange:i.orange,amber:i.amber,yellow:i.yellow,lime:i.lime,green:i.green,emerald:i.emerald,teal:i.teal,cyan:i.cyan,sky:i.sky,blue:i.blue,indigo:i.indigo,violet:i.violet,purple:i.purple,fuchsia:i.fuchsia,pink:i.pink,rose:i.rose}),columns:{auto:"auto",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"10",11:"11",12:"12","3xs":"16rem","2xs":"18rem",xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem"},spacing:{px:"1px",0:"0px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",11:"2.75rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},animation:{none:"none",spin:"spin 1s linear infinite",ping:"ping 1s cubic-bezier(0, 0, 0.2, 1) infinite",pulse:"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",bounce:"bounce 1s infinite"},aspectRatio:{auto:"auto",square:"1 / 1",video:"16 / 9"},backdropBlur:({theme:i})=>i("blur"),backdropBrightness:({theme:i})=>i("brightness"),backdropContrast:({theme:i})=>i("contrast"),backdropGrayscale:({theme:i})=>i("grayscale"),backdropHueRotate:({theme:i})=>i("hueRotate"),backdropInvert:({theme:i})=>i("invert"),backdropOpacity:({theme:i})=>i("opacity"),backdropSaturate:({theme:i})=>i("saturate"),backdropSepia:({theme:i})=>i("sepia"),backgroundColor:({theme:i})=>i("colors"),backgroundImage:{none:"none","gradient-to-t":"linear-gradient(to top, var(--tw-gradient-stops))","gradient-to-tr":"linear-gradient(to top right, var(--tw-gradient-stops))","gradient-to-r":"linear-gradient(to right, var(--tw-gradient-stops))","gradient-to-br":"linear-gradient(to bottom right, var(--tw-gradient-stops))","gradient-to-b":"linear-gradient(to bottom, var(--tw-gradient-stops))","gradient-to-bl":"linear-gradient(to bottom left, var(--tw-gradient-stops))","gradient-to-l":"linear-gradient(to left, var(--tw-gradient-stops))","gradient-to-tl":"linear-gradient(to top left, var(--tw-gradient-stops))"},backgroundOpacity:({theme:i})=>i("opacity"),backgroundPosition:{bottom:"bottom",center:"center",left:"left","left-bottom":"left bottom","left-top":"left top",right:"right","right-bottom":"right bottom","right-top":"right top",top:"top"},backgroundSize:{auto:"auto",cover:"cover",contain:"contain"},blur:{0:"0",none:"0",sm:"4px",DEFAULT:"8px",md:"12px",lg:"16px",xl:"24px","2xl":"40px","3xl":"64px"},brightness:{0:"0",50:".5",75:".75",90:".9",95:".95",100:"1",105:"1.05",110:"1.1",125:"1.25",150:"1.5",200:"2"},borderColor:({theme:i})=>({...i("colors"),DEFAULT:i("colors.gray.200","currentColor")}),borderOpacity:({theme:i})=>i("opacity"),borderRadius:{none:"0px",sm:"0.125rem",DEFAULT:"0.25rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},borderWidth:{DEFAULT:"1px",0:"0px",2:"2px",4:"4px",8:"8px"},boxShadow:{sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)",DEFAULT:"0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)",md:"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",lg:"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",xl:"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)","2xl":"0 25px 50px -12px rgb(0 0 0 / 0.25)",inner:"inset 0 2px 4px 0 rgb(0 0 0 / 0.05)",none:"none"},boxShadowColor:({theme:i})=>i("colors"),caretColor:({theme:i})=>i("colors"),accentColor:({theme:i})=>({...i("colors"),auto:"auto"}),contrast:{0:"0",50:".5",75:".75",100:"1",125:"1.25",150:"1.5",200:"2"},container:{},content:{none:"none"},cursor:{auto:"auto",default:"default",pointer:"pointer",wait:"wait",text:"text",move:"move",help:"help","not-allowed":"not-allowed",none:"none","context-menu":"context-menu",progress:"progress",cell:"cell",crosshair:"crosshair","vertical-text":"vertical-text",alias:"alias",copy:"copy","no-drop":"no-drop",grab:"grab",grabbing:"grabbing","all-scroll":"all-scroll","col-resize":"col-resize","row-resize":"row-resize","n-resize":"n-resize","e-resize":"e-resize","s-resize":"s-resize","w-resize":"w-resize","ne-resize":"ne-resize","nw-resize":"nw-resize","se-resize":"se-resize","sw-resize":"sw-resize","ew-resize":"ew-resize","ns-resize":"ns-resize","nesw-resize":"nesw-resize","nwse-resize":"nwse-resize","zoom-in":"zoom-in","zoom-out":"zoom-out"},divideColor:({theme:i})=>i("borderColor"),divideOpacity:({theme:i})=>i("borderOpacity"),divideWidth:({theme:i})=>i("borderWidth"),dropShadow:{sm:"0 1px 1px rgb(0 0 0 / 0.05)",DEFAULT:["0 1px 2px rgb(0 0 0 / 0.1)","0 1px 1px rgb(0 0 0 / 0.06)"],md:["0 4px 3px rgb(0 0 0 / 0.07)","0 2px 2px rgb(0 0 0 / 0.06)"],lg:["0 10px 8px rgb(0 0 0 / 0.04)","0 4px 3px rgb(0 0 0 / 0.1)"],xl:["0 20px 13px rgb(0 0 0 / 0.03)","0 8px 5px rgb(0 0 0 / 0.08)"],"2xl":"0 25px 25px rgb(0 0 0 / 0.15)",none:"0 0 #0000"},fill:({theme:i})=>i("colors"),grayscale:{0:"0",DEFAULT:"100%"},hueRotate:{0:"0deg",15:"15deg",30:"30deg",60:"60deg",90:"90deg",180:"180deg"},invert:{0:"0",DEFAULT:"100%"},flex:{1:"1 1 0%",auto:"1 1 auto",initial:"0 1 auto",none:"none"},flexBasis:({theme:i})=>({auto:"auto",...i("spacing"),"1/2":"50%","1/3":"33.333333%","2/3":"66.666667%","1/4":"25%","2/4":"50%","3/4":"75%","1/5":"20%","2/5":"40%","3/5":"60%","4/5":"80%","1/6":"16.666667%","2/6":"33.333333%","3/6":"50%","4/6":"66.666667%","5/6":"83.333333%","1/12":"8.333333%","2/12":"16.666667%","3/12":"25%","4/12":"33.333333%","5/12":"41.666667%","6/12":"50%","7/12":"58.333333%","8/12":"66.666667%","9/12":"75%","10/12":"83.333333%","11/12":"91.666667%",full:"100%"}),flexGrow:{0:"0",DEFAULT:"1"},flexShrink:{0:"0",DEFAULT:"1"},fontFamily:{sans:["ui-sans-serif","system-ui","-apple-system","BlinkMacSystemFont",'"Segoe UI"',"Roboto",'"Helvetica Neue"',"Arial",'"Noto Sans"',"sans-serif",'"Apple Color Emoji"','"Segoe UI Emoji"','"Segoe UI Symbol"','"Noto Color Emoji"'],serif:["ui-serif","Georgia","Cambria",'"Times New Roman"',"Times","serif"],mono:["ui-monospace","SFMono-Regular","Menlo","Monaco","Consolas",'"Liberation Mono"','"Courier New"',"monospace"]},fontSize:{xs:["0.75rem",{lineHeight:"1rem"}],sm:["0.875rem",{lineHeight:"1.25rem"}],base:["1rem",{lineHeight:"1.5rem"}],lg:["1.125rem",{lineHeight:"1.75rem"}],xl:["1.25rem",{lineHeight:"1.75rem"}],"2xl":["1.5rem",{lineHeight:"2rem"}],"3xl":["1.875rem",{lineHeight:"2.25rem"}],"4xl":["2.25rem",{lineHeight:"2.5rem"}],"5xl":["3rem",{lineHeight:"1"}],"6xl":["3.75rem",{lineHeight:"1"}],"7xl":["4.5rem",{lineHeight:"1"}],"8xl":["6rem",{lineHeight:"1"}],"9xl":["8rem",{lineHeight:"1"}]},fontWeight:{thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},gap:({theme:i})=>i("spacing"),gradientColorStops:({theme:i})=>i("colors"),gridAutoColumns:{auto:"auto",min:"min-content",max:"max-content",fr:"minmax(0, 1fr)"},gridAutoRows:{auto:"auto",min:"min-content",max:"max-content",fr:"minmax(0, 1fr)"},gridColumn:{auto:"auto","span-1":"span 1 / span 1","span-2":"span 2 / span 2","span-3":"span 3 / span 3","span-4":"span 4 / span 4","span-5":"span 5 / span 5","span-6":"span 6 / span 6","span-7":"span 7 / span 7","span-8":"span 8 / span 8","span-9":"span 9 / span 9","span-10":"span 10 / span 10","span-11":"span 11 / span 11","span-12":"span 12 / span 12","span-full":"1 / -1"},gridColumnEnd:{auto:"auto",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"10",11:"11",12:"12",13:"13"},gridColumnStart:{auto:"auto",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"10",11:"11",12:"12",13:"13"},gridRow:{auto:"auto","span-1":"span 1 / span 1","span-2":"span 2 / span 2","span-3":"span 3 / span 3","span-4":"span 4 / span 4","span-5":"span 5 / span 5","span-6":"span 6 / span 6","span-full":"1 / -1"},gridRowStart:{auto:"auto",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7"},gridRowEnd:{auto:"auto",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7"},gridTemplateColumns:{none:"none",1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",7:"repeat(7, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",9:"repeat(9, minmax(0, 1fr))",10:"repeat(10, minmax(0, 1fr))",11:"repeat(11, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"},gridTemplateRows:{none:"none",1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))"},height:({theme:i})=>({auto:"auto",...i("spacing"),"1/2":"50%","1/3":"33.333333%","2/3":"66.666667%","1/4":"25%","2/4":"50%","3/4":"75%","1/5":"20%","2/5":"40%","3/5":"60%","4/5":"80%","1/6":"16.666667%","2/6":"33.333333%","3/6":"50%","4/6":"66.666667%","5/6":"83.333333%",full:"100%",screen:"100vh",min:"min-content",max:"max-content",fit:"fit-content"}),inset:({theme:i})=>({auto:"auto",...i("spacing"),"1/2":"50%","1/3":"33.333333%","2/3":"66.666667%","1/4":"25%","2/4":"50%","3/4":"75%",full:"100%"}),keyframes:{spin:{to:{transform:"rotate(360deg)"}},ping:{"75%, 100%":{transform:"scale(2)",opacity:"0"}},pulse:{"50%":{opacity:".5"}},bounce:{"0%, 100%":{transform:"translateY(-25%)",animationTimingFunction:"cubic-bezier(0.8,0,1,1)"},"50%":{transform:"none",animationTimingFunction:"cubic-bezier(0,0,0.2,1)"}}},letterSpacing:{tighter:"-0.05em",tight:"-0.025em",normal:"0em",wide:"0.025em",wider:"0.05em",widest:"0.1em"},lineHeight:{none:"1",tight:"1.25",snug:"1.375",normal:"1.5",relaxed:"1.625",loose:"2",3:".75rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem"},listStyleType:{none:"none",disc:"disc",decimal:"decimal"},margin:({theme:i})=>({auto:"auto",...i("spacing")}),maxHeight:({theme:i})=>({...i("spacing"),full:"100%",screen:"100vh",min:"min-content",max:"max-content",fit:"fit-content"}),maxWidth:({theme:i,breakpoints:e})=>({none:"none",0:"0rem",xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem",full:"100%",min:"min-content",max:"max-content",fit:"fit-content",prose:"65ch",...e(i("screens"))}),minHeight:{0:"0px",full:"100%",screen:"100vh",min:"min-content",max:"max-content",fit:"fit-content"},minWidth:{0:"0px",full:"100%",min:"min-content",max:"max-content",fit:"fit-content"},objectPosition:{bottom:"bottom",center:"center",left:"left","left-bottom":"left bottom","left-top":"left top",right:"right","right-bottom":"right bottom","right-top":"right top",top:"top"},opacity:{0:"0",5:"0.05",10:"0.1",20:"0.2",25:"0.25",30:"0.3",40:"0.4",50:"0.5",60:"0.6",70:"0.7",75:"0.75",80:"0.8",90:"0.9",95:"0.95",100:"1"},order:{first:"-9999",last:"9999",none:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"10",11:"11",12:"12"},padding:({theme:i})=>i("spacing"),placeholderColor:({theme:i})=>i("colors"),placeholderOpacity:({theme:i})=>i("opacity"),outlineColor:({theme:i})=>i("colors"),outlineOffset:{0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},outlineWidth:{0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},ringColor:({theme:i})=>({DEFAULT:i("colors.blue.500","#3b82f6"),...i("colors")}),ringOffsetColor:({theme:i})=>i("colors"),ringOffsetWidth:{0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},ringOpacity:({theme:i})=>({DEFAULT:"0.5",...i("opacity")}),ringWidth:{DEFAULT:"3px",0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},rotate:{0:"0deg",1:"1deg",2:"2deg",3:"3deg",6:"6deg",12:"12deg",45:"45deg",90:"90deg",180:"180deg"},saturate:{0:"0",50:".5",100:"1",150:"1.5",200:"2"},scale:{0:"0",50:".5",75:".75",90:".9",95:".95",100:"1",105:"1.05",110:"1.1",125:"1.25",150:"1.5"},scrollMargin:({theme:i})=>({...i("spacing")}),scrollPadding:({theme:i})=>i("spacing"),sepia:{0:"0",DEFAULT:"100%"},skew:{0:"0deg",1:"1deg",2:"2deg",3:"3deg",6:"6deg",12:"12deg"},space:({theme:i})=>({...i("spacing")}),stroke:({theme:i})=>i("colors"),strokeWidth:{0:"0",1:"1",2:"2"},textColor:({theme:i})=>i("colors"),textDecorationColor:({theme:i})=>i("colors"),textDecorationThickness:{auto:"auto","from-font":"from-font",0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},textUnderlineOffset:{auto:"auto",0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"},textIndent:({theme:i})=>({...i("spacing")}),textOpacity:({theme:i})=>i("opacity"),transformOrigin:{center:"center",top:"top","top-right":"top right",right:"right","bottom-right":"bottom right",bottom:"bottom","bottom-left":"bottom left",left:"left","top-left":"top left"},transitionDelay:{75:"75ms",100:"100ms",150:"150ms",200:"200ms",300:"300ms",500:"500ms",700:"700ms",1e3:"1000ms"},transitionDuration:{DEFAULT:"150ms",75:"75ms",100:"100ms",150:"150ms",200:"200ms",300:"300ms",500:"500ms",700:"700ms",1e3:"1000ms"},transitionProperty:{none:"none",all:"all",DEFAULT:"color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter",colors:"color, background-color, border-color, text-decoration-color, fill, stroke",opacity:"opacity",shadow:"box-shadow",transform:"transform"},transitionTimingFunction:{DEFAULT:"cubic-bezier(0.4, 0, 0.2, 1)",linear:"linear",in:"cubic-bezier(0.4, 0, 1, 1)",out:"cubic-bezier(0, 0, 0.2, 1)","in-out":"cubic-bezier(0.4, 0, 0.2, 1)"},translate:({theme:i})=>({...i("spacing"),"1/2":"50%","1/3":"33.333333%","2/3":"66.666667%","1/4":"25%","2/4":"50%","3/4":"75%",full:"100%"}),width:({theme:i})=>({auto:"auto",...i("spacing"),"1/2":"50%","1/3":"33.333333%","2/3":"66.666667%","1/4":"25%","2/4":"50%","3/4":"75%","1/5":"20%","2/5":"40%","3/5":"60%","4/5":"80%","1/6":"16.666667%","2/6":"33.333333%","3/6":"50%","4/6":"66.666667%","5/6":"83.333333%","1/12":"8.333333%","2/12":"16.666667%","3/12":"25%","4/12":"33.333333%","5/12":"41.666667%","6/12":"50%","7/12":"58.333333%","8/12":"66.666667%","9/12":"75%","10/12":"83.333333%","11/12":"91.666667%",full:"100%",screen:"100vw",min:"min-content",max:"max-content",fit:"fit-content"}),willChange:{auto:"auto",scroll:"scroll-position",contents:"contents",transform:"transform"},zIndex:{auto:"auto",0:"0",10:"10",20:"20",30:"30",40:"40",50:"50"}},variantOrder:["first","last","odd","even","visited","checked","empty","read-only","group-hover","group-focus","focus-within","hover","focus","focus-visible","active","disabled"],plugins:[]}});var Nr,We,is=S(()=>{l();Nr=i=>i,We={yellow:Nr,bold:{yellow:Nr,magenta:Nr,cyan:Nr}}});function ss(i,e,t){h.env.JEST_WORKER_ID===void 0&&(t&&fl.has(t)||(t&&fl.add(t),console.warn(""),e.forEach(r=>console.warn(i,"-",r))))}function ns(i){return We.dim(i)}var fl,W,Ce=S(()=>{l();is();fl=new Set;W={info(i,e){ss(We.bold.cyan("info"),...Array.isArray(i)?[i]:[e,i])},warn(i,e){ss(We.bold.yellow("warn"),...Array.isArray(i)?[i]:[e,i])},risk(i,e){ss(We.bold.magenta("risk"),...Array.isArray(i)?[i]:[e,i])}}});var cl={};me(cl,{default:()=>as});function Ft({version:i,from:e,to:t}){W.warn(`${e}-color-renamed`,[`As of Tailwind CSS ${i}, \`${e}\` has been renamed to \`${t}\`.`,"Update your configuration file to silence this warning."])}var as,os=S(()=>{l();Ce();as={inherit:"inherit",current:"currentColor",transparent:"transparent",black:"#000",white:"#fff",slate:{50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a"},gray:{50:"#f9fafb",100:"#f3f4f6",200:"#e5e7eb",300:"#d1d5db",400:"#9ca3af",500:"#6b7280",600:"#4b5563",700:"#374151",800:"#1f2937",900:"#111827"},zinc:{50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b"},neutral:{50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717"},stone:{50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917"},red:{50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d"},orange:{50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12"},amber:{50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f"},yellow:{50:"#fefce8",100:"#fef9c3",200:"#fef08a",300:"#fde047",400:"#facc15",500:"#eab308",600:"#ca8a04",700:"#a16207",800:"#854d0e",900:"#713f12"},lime:{50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314"},green:{50:"#f0fdf4",100:"#dcfce7",200:"#bbf7d0",300:"#86efac",400:"#4ade80",500:"#22c55e",600:"#16a34a",700:"#15803d",800:"#166534",900:"#14532d"},emerald:{50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b"},teal:{50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a"},cyan:{50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63"},sky:{50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e"},blue:{50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a"},indigo:{50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81"},violet:{50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95"},purple:{50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87"},fuchsia:{50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75"},pink:{50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843"},rose:{50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337"},get lightBlue(){return Ft({version:"v2.2",from:"lightBlue",to:"sky"}),this.sky},get warmGray(){return Ft({version:"v3.0",from:"warmGray",to:"stone"}),this.stone},get trueGray(){return Ft({version:"v3.0",from:"trueGray",to:"neutral"}),this.neutral},get coolGray(){return Ft({version:"v3.0",from:"coolGray",to:"gray"}),this.gray},get blueGray(){return Ft({version:"v3.0",from:"blueGray",to:"slate"}),this.slate}}});function ls(i,...e){for(let t of e){for(let r in t)i?.hasOwnProperty?.(r)||(i[r]=t[r]);for(let r of Object.getOwnPropertySymbols(t))i?.hasOwnProperty?.(r)||(i[r]=t[r])}return i}var pl=S(()=>{l()});function Ge(i){if(Array.isArray(i))return i;let e=i.split("[").length-1,t=i.split("]").length-1;if(e!==t)throw new Error(`Path is invalid. Has unbalanced brackets: ${i}`);return i.split(/\.(?![^\[]*\])|[\[\]]/g).filter(Boolean)}var zr=S(()=>{l()});function dl(i){(()=>{if(i.purge||!i.content||!Array.isArray(i.content)&&!(typeof i.content=="object"&&i.content!==null))return!1;if(Array.isArray(i.content))return i.content.every(t=>typeof t=="string"?!0:!(typeof t?.raw!="string"||t?.extension&&typeof t?.extension!="string"));if(typeof i.content=="object"&&i.content!==null){if(Object.keys(i.content).some(t=>!["files","extract","transform"].includes(t)))return!1;if(Array.isArray(i.content.files)){if(!i.content.files.every(t=>typeof t=="string"?!0:!(typeof t?.raw!="string"||t?.extension&&typeof t?.extension!="string")))return!1;if(typeof i.content.extract=="object"){for(let t of Object.values(i.content.extract))if(typeof t!="function")return!1}else if(!(i.content.extract===void 0||typeof i.content.extract=="function"))return!1;if(typeof i.content.transform=="object"){for(let t of Object.values(i.content.transform))if(typeof t!="function")return!1}else if(!(i.content.transform===void 0||typeof i.content.transform=="function"))return!1}return!0}return!1})()||W.warn("purge-deprecation",["The `purge`/`content` options have changed in Tailwind CSS v3.0.","Update your configuration file to eliminate this warning.","https://tailwindcss.com/docs/upgrade-guide#configure-content-sources"]),i.safelist=(()=>{let{content:t,purge:r,safelist:s}=i;return Array.isArray(s)?s:Array.isArray(t?.safelist)?t.safelist:Array.isArray(r?.safelist)?r.safelist:Array.isArray(r?.options?.safelist)?r.options.safelist:[]})(),typeof i.prefix=="function"?(W.warn("prefix-function",["As of Tailwind CSS v3.0, `prefix` cannot be a function.","Update `prefix` in your configuration to be a string to eliminate this warning.","https://tailwindcss.com/docs/upgrade-guide#prefix-cannot-be-a-function"]),i.prefix=""):i.prefix=i.prefix??"",i.content={files:(()=>{let{content:t,purge:r}=i;return Array.isArray(r)?r:Array.isArray(r?.content)?r.content:Array.isArray(t)?t:Array.isArray(t?.content)?t.content:Array.isArray(t?.files)?t.files:[]})(),extract:(()=>{let t=(()=>i.purge?.extract?i.purge.extract:i.content?.extract?i.content.extract:i.purge?.extract?.DEFAULT?i.purge.extract.DEFAULT:i.content?.extract?.DEFAULT?i.content.extract.DEFAULT:i.purge?.options?.extractors?i.purge.options.extractors:i.content?.options?.extractors?i.content.options.extractors:{})(),r={},s=(()=>{if(i.purge?.options?.defaultExtractor)return i.purge.options.defaultExtractor;if(i.content?.options?.defaultExtractor)return i.content.options.defaultExtractor})();if(s!==void 0&&(r.DEFAULT=s),typeof t=="function")r.DEFAULT=t;else if(Array.isArray(t))for(let{extensions:n,extractor:a}of t??[])for(let o of n)r[o]=a;else typeof t=="object"&&t!==null&&Object.assign(r,t);return r})(),transform:(()=>{let t=(()=>i.purge?.transform?i.purge.transform:i.content?.transform?i.content.transform:i.purge?.transform?.DEFAULT?i.purge.transform.DEFAULT:i.content?.transform?.DEFAULT?i.content.transform.DEFAULT:{})(),r={};return typeof t=="function"&&(r.DEFAULT=t),typeof t=="object"&&t!==null&&Object.assign(r,t),r})()};for(let t of i.content.files)if(typeof t=="string"&&/{([^,]*?)}/g.test(t)){W.warn("invalid-glob-braces",[`The glob pattern ${ns(t)} in your Tailwind CSS configuration is invalid.`,`Update it to ${ns(t.replace(/{([^,]*?)}/g,"$1"))} to silence this warning.`]);break}return i.content.files.length===0&&W.warn("content-problems",["The `content` option in your Tailwind CSS configuration is missing or empty.","Configure your content sources or your generated CSS will be missing styles.","https://tailwindcss.com/docs/content-configuration"]),i}var hl=S(()=>{l();Ce()});function Ae(i){if(Object.prototype.toString.call(i)!=="[object Object]")return!1;let e=Object.getPrototypeOf(i);return e===null||e===Object.prototype}var Bt=S(()=>{l()});function Ie(i){return Array.isArray(i)?i.map(e=>Ie(e)):typeof i=="object"&&i!==null?Object.fromEntries(Object.entries(i).map(([e,t])=>[e,Ie(t)])):i}var $r=S(()=>{l()});function rt(i){return typeof i=="function"}function Nt(i){return typeof i=="object"&&i!==null}function zt(i,...e){let t=e.pop();for(let r of e)for(let s in r){let n=t(i[s],r[s]);n===void 0?Nt(i[s])&&Nt(r[s])?i[s]=zt(i[s],r[s],t):i[s]=r[s]:i[s]=n}return i}function Dy(i,...e){return rt(i)?i(...e):i}function qy(i){return i.reduce((e,{extend:t})=>zt(e,t,(r,s)=>r===void 0?[s]:Array.isArray(r)?[s,...r]:[s,r]),{})}function Iy(i){return{...i.reduce((e,t)=>ls(e,t),{}),extend:qy(i)}}function gl(i,e){if(Array.isArray(i)&&Nt(i[0]))return i.concat(e);if(Array.isArray(e)&&Nt(e[0])&&Nt(i))return[i,...e];if(Array.isArray(e))return e}function Ry({extend:i,...e}){return zt(e,i,(t,r)=>!rt(t)&&!r.some(rt)?zt({},t,...r,gl):(s,n)=>zt({},...[t,...r].map(a=>Dy(a,s,n)),gl))}function My(i){let e=(t,r)=>{let s=Ge(t),n=0,a=i;for(;a!=null&&n({...t,[r]:rt(i[r])?i[r](e,jr):i[r]}),{})}function yl(i){let e=[];return i.forEach(t=>{e=[...e,t];let r=t?.plugins??[];r.length!==0&&r.forEach(s=>{s.__isOptionsFunction&&(s=s()),e=[...e,...yl([s?.config??{}])]})}),e}function Ly(i){return[...i].reduceRight((t,r)=>rt(r)?r({corePlugins:t}):ol(r,t),nl)}function Fy(i){return[...i].reduceRight((t,r)=>[...t,...r],[])}function us(i){let e=[...yl(i),{prefix:"",important:!1,separator:":",variantOrder:ml.default.variantOrder}];return dl(ls({theme:My(Ry(Iy(e.map(t=>t?.theme??{})))),corePlugins:Ly(e.map(t=>t.corePlugins)),plugins:Fy(i.map(t=>t?.plugins??[]))},...e))}var ml,jr,bl=S(()=>{l();Br();al();ll();ml=V(Lt());os();pl();zr();hl();Bt();$r();jr={colors:as,negative(i){return Object.keys(i).filter(e=>i[e]!=="0").reduce((e,t)=>{let r=Ve(i[t]);return r!==void 0&&(e[`-${t}`]=r),e},{})},breakpoints(i){return Object.keys(i).filter(e=>typeof i[e]=="string").reduce((e,t)=>({...e,[`screen-${t}`]:i[t]}),{})}}});function Vr(i,e){return Ur.future.includes(e)?i.future==="all"||(i?.future?.[e]??wl[e]??!1):Ur.experimental.includes(e)?i.experimental==="all"||(i?.experimental?.[e]??wl[e]??!1):!1}function vl(i){return i.experimental==="all"?Ur.experimental:Object.keys(i?.experimental??{}).filter(e=>Ur.experimental.includes(e)&&i.experimental[e])}function xl(i){if(h.env.JEST_WORKER_ID===void 0&&vl(i).length>0){let e=vl(i).map(t=>We.yellow(t)).join(", ");W.warn("experimental-flags-enabled",[`You have enabled experimental features: ${e}`,"Experimental features in Tailwind CSS are not covered by semver, may introduce breaking changes, and can change at any time."])}}var wl,Ur,Wr=S(()=>{l();is();Ce();wl={optimizeUniversalDefaults:!1},Ur={future:[],experimental:["optimizeUniversalDefaults"]}});function Gr(i){let e=(i?.presets??[kl.default]).slice().reverse().flatMap(s=>Gr(s instanceof Function?s():s)),t={},r=Object.keys(t).filter(s=>Vr(i,s)).map(s=>t[s]);return[i,...r,...e]}var kl,Sl=S(()=>{l();kl=V(Lt());Wr()});var _l={};me(_l,{default:()=>$t});function $t(...i){let[,...e]=Gr(i[0]);return us([...i,...e])}var fs=S(()=>{l();bl();Sl()});function Yr(i){return typeof i=="object"&&i!==null}function By(i){return Object.keys(i).length===0}function Cl(i){return typeof i=="string"||i instanceof String}function cs(i){if(Yr(i)&&i.config===void 0&&!By(i))return null;if(Yr(i)&&i.config!==void 0&&Cl(i.config))return ee.resolve(i.config);if(Yr(i)&&i.config!==void 0&&Yr(i.config))return null;if(Cl(i))return ee.resolve(i);for(let e of["./tailwind.config.js","./tailwind.config.cjs"])try{let t=ee.resolve(e);return ge.accessSync(t),t}catch(t){}return null}var Al=S(()=>{l();tt();Ue()});function Ny(i){if(i===void 0)return!1;if(i==="true"||i==="1")return!0;if(i==="false"||i==="0")return!1;if(i==="*")return!0;let e=i.split(",").map(t=>t.split(":")[0]);return e.includes("-tailwindcss")?!1:!!e.includes("tailwindcss")}var le,El,Ol,Hr,it=S(()=>{l();le={NODE_ENV:"production",DEBUG:Ny(h.env.DEBUG)},El=new Map,Ol=new Map,Hr=new Map});var Tl={};me(Tl,{default:()=>ps});var ps,ds=S(()=>{l();ps={parse:i=>({href:i})}});var hs=b(()=>{l()});var ms=b(()=>{l()});var Qr=b((WA,Dl)=>{l();"use strict";var{red:zy,bold:$y,gray:jy,options:Uy}=hs(),Pl=ms(),st=class extends Error{constructor(e,t,r,s,n,a){super(e);this.name="CssSyntaxError",this.reason=e,n&&(this.file=n),s&&(this.source=s),a&&(this.plugin=a),typeof t!="undefined"&&typeof r!="undefined"&&(this.line=t,this.column=r),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,st)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"",typeof this.line!="undefined"&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(e){if(!this.source)return"";let t=this.source;e==null&&(e=Uy.enabled),Pl&&e&&(t=Pl(t));let r=t.split(/\r?\n/),s=Math.max(this.line-3,0),n=Math.min(this.line+2,r.length),a=String(n).length,o,f;return e?(o=c=>$y(zy(c)),f=c=>jy(c)):o=f=c=>c,r.slice(s,n).map((c,u)=>{let p=s+1+u,d=" "+(" "+p).slice(-a)+" | ";if(p===this.line){let g=f(d.replace(/\d/g," "))+c.slice(0,this.column-1).replace(/[^\t]/g," ");return o(">")+f(d)+c+` - `+g+o("^")}return" "+f(d)+c}).join(` -`)}toString(){let e=this.showSourceCode();return e&&(e=` - -`+e+` -`),this.name+": "+this.message+e}};Dl.exports=st;st.default=st});var Jr=b((GA,gs)=>{l();"use strict";gs.exports.isClean=Symbol("isClean");gs.exports.my=Symbol("my")});var ys=b((YA,Rl)=>{l();"use strict";var ql={colon:": ",indent:" ",beforeDecl:` -`,beforeRule:` -`,beforeOpen:" ",beforeClose:` -`,beforeComment:` -`,after:` -`,emptyBody:"",commentLeft:" ",commentRight:" ",semicolon:!1};function Vy(i){return i[0].toUpperCase()+i.slice(1)}var Il=class{constructor(e){this.builder=e}stringify(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}document(e){this.body(e)}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}comment(e){let t=this.raw(e,"left","commentLeft"),r=this.raw(e,"right","commentRight");this.builder("/*"+t+e.text+r+"*/",e)}decl(e,t){let r=this.raw(e,"between","colon"),s=e.prop+r+this.rawValue(e,"value");e.important&&(s+=e.raws.important||" !important"),t&&(s+=";"),this.builder(s,e)}rule(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}atrule(e,t){let r="@"+e.name,s=e.params?this.rawValue(e,"params"):"";if(typeof e.raws.afterName!="undefined"?r+=e.raws.afterName:s&&(r+=" "),e.nodes)this.block(e,r+s);else{let n=(e.raws.between||"")+(t?";":"");this.builder(r+s+n,e)}}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type==="comment";)t-=1;let r=this.raw(e,"semicolon");for(let s=0;s{if(s=f.raws[t],typeof s!="undefined")return!1})}return typeof s=="undefined"&&(s=ql[r]),a.rawCache[r]=s,s}rawSemicolon(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length&&r.last.type==="decl"&&(t=r.raws.semicolon,typeof t!="undefined"))return!1}),t}rawEmptyBody(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length===0&&(t=r.raws.after,typeof t!="undefined"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(r=>{let s=r.parent;if(s&&s!==e&&s.parent&&s.parent===e&&typeof r.raws.before!="undefined"){let n=r.raws.before.split(` -`);return t=n[n.length-1],t=t.replace(/\S/g,""),!1}}),t}rawBeforeComment(e,t){let r;return e.walkComments(s=>{if(typeof s.raws.before!="undefined")return r=s.raws.before,r.includes(` -`)&&(r=r.replace(/[^\n]+$/,"")),!1}),typeof r=="undefined"?r=this.raw(t,null,"beforeDecl"):r&&(r=r.replace(/\S/g,"")),r}rawBeforeDecl(e,t){let r;return e.walkDecls(s=>{if(typeof s.raws.before!="undefined")return r=s.raws.before,r.includes(` -`)&&(r=r.replace(/[^\n]+$/,"")),!1}),typeof r=="undefined"?r=this.raw(t,null,"beforeRule"):r&&(r=r.replace(/\S/g,"")),r}rawBeforeRule(e){let t;return e.walk(r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&typeof r.raws.before!="undefined")return t=r.raws.before,t.includes(` -`)&&(t=t.replace(/[^\n]+$/,"")),!1}),t&&(t=t.replace(/\S/g,"")),t}rawBeforeClose(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length>0&&typeof r.raws.after!="undefined")return t=r.raws.after,t.includes(` -`)&&(t=t.replace(/[^\n]+$/,"")),!1}),t&&(t=t.replace(/\S/g,"")),t}rawBeforeOpen(e){let t;return e.walk(r=>{if(r.type!=="decl"&&(t=r.raws.between,typeof t!="undefined"))return!1}),t}rawColon(e){let t;return e.walkDecls(r=>{if(typeof r.raws.between!="undefined")return t=r.raws.between.replace(/[^\s:]/g,""),!1}),t}beforeAfter(e,t){let r;e.type==="decl"?r=this.raw(e,null,"beforeDecl"):e.type==="comment"?r=this.raw(e,null,"beforeComment"):t==="before"?r=this.raw(e,null,"beforeRule"):r=this.raw(e,null,"beforeClose");let s=e.parent,n=0;for(;s&&s.type!=="root";)n+=1,s=s.parent;if(r.includes(` -`)){let a=this.raw(e,null,"indent");if(a.length)for(let o=0;o{l();"use strict";var Wy=ys();function bs(i,e){new Wy(e).stringify(i)}Ml.exports=bs;bs.default=bs});var jt=b((QA,Ll)=>{l();"use strict";var{isClean:Kr,my:Gy}=Jr(),Yy=Qr(),Hy=ys(),Qy=Xr();function ws(i,e){let t=new i.constructor;for(let r in i){if(!Object.prototype.hasOwnProperty.call(i,r)||r==="proxyCache")continue;let s=i[r],n=typeof s;r==="parent"&&n==="object"?e&&(t[r]=e):r==="source"?t[r]=s:Array.isArray(s)?t[r]=s.map(a=>ws(a,t)):(n==="object"&&s!==null&&(s=ws(s)),t[r]=s)}return t}var Zr=class{constructor(e={}){this.raws={},this[Kr]=!1,this[Gy]=!0;for(let t in e)if(t==="nodes"){this.nodes=[];for(let r of e[t])typeof r.clone=="function"?this.append(r.clone()):this.append(r)}else this[t]=e[t]}error(e,t={}){if(this.source){let r=this.positionBy(t);return this.source.input.error(e,r.line,r.column,t)}return new Yy(e)}warn(e,t,r){let s={node:this};for(let n in r)s[n]=r[n];return e.warn(t,s)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}toString(e=Qy){e.stringify&&(e=e.stringify);let t="";return e(this,r=>{t+=r}),t}assign(e={}){for(let t in e)this[t]=e[t];return this}clone(e={}){let t=ws(this);for(let r in e)t[r]=e[r];return t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}replaceWith(...e){if(this.parent){let t=this,r=!1;for(let s of e)s===this?r=!0:r?(this.parent.insertAfter(t,s),t=s):this.parent.insertBefore(t,s);r||this.remove()}return this}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}before(e){return this.parent.insertBefore(this,e),this}after(e){return this.parent.insertAfter(this,e),this}root(){let e=this;for(;e.parent&&e.parent.type!=="document";)e=e.parent;return e}raw(e,t){return new Hy().raw(this,e,t)}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}toJSON(e,t){let r={},s=t==null;t=t||new Map;let n=0;for(let a in this){if(!Object.prototype.hasOwnProperty.call(this,a)||a==="parent"||a==="proxyCache")continue;let o=this[a];if(Array.isArray(o))r[a]=o.map(f=>typeof f=="object"&&f.toJSON?f.toJSON(null,t):f);else if(typeof o=="object"&&o.toJSON)r[a]=o.toJSON(null,t);else if(a==="source"){let f=t.get(o.input);f==null&&(f=n,t.set(o.input,n),n++),r[a]={inputId:f,start:o.start,end:o.end}}else r[a]=o}return s&&(r.inputs=[...t.keys()].map(a=>a.toJSON())),r}positionInside(e){let t=this.toString(),r=this.source.start.column,s=this.source.start.line;for(let n=0;ne.root().toProxy():e[t]}}}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\n\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\n\s{4}at /,`$&${t.input.from}:${t.start.line}:${t.start.column}$&`)}return e}markDirty(){if(this[Kr]){this[Kr]=!1;let e=this;for(;e=e.parent;)e[Kr]=!1}}get proxyOf(){return this}};Ll.exports=Zr;Zr.default=Zr});var Ut=b((JA,Fl)=>{l();"use strict";var Jy=jt(),ei=class extends Jy{constructor(e){e&&typeof e.value!="undefined"&&typeof e.value!="string"&&(e={...e,value:String(e.value)});super(e);this.type="decl"}get variable(){return this.prop.startsWith("--")||this.prop[0]==="$"}};Fl.exports=ei;ei.default=ei});var Nl=b((XA,Bl)=>{l();Bl.exports=function(i,e){return{generate:()=>{let t="";return i(e,r=>{t+=r}),[t]}}}});var Vt=b((KA,zl)=>{l();"use strict";var Xy=jt(),ti=class extends Xy{constructor(e){super(e);this.type="comment"}};zl.exports=ti;ti.default=ti});var Re=b((ZA,Hl)=>{l();"use strict";var{isClean:$l,my:jl}=Jr(),Ul=Ut(),Vl=Vt(),Ky=jt(),Wl,vs,xs;function Gl(i){return i.map(e=>(e.nodes&&(e.nodes=Gl(e.nodes)),delete e.source,e))}function Yl(i){if(i[$l]=!1,i.proxyOf.nodes)for(let e of i.proxyOf.nodes)Yl(e)}var ue=class extends Ky{push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),r,s;for(;this.indexes[t]{let s;try{s=e(t,r)}catch(n){throw t.addToError(n)}return s!==!1&&t.walk&&(s=t.walk(e)),s})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((r,s)=>{if(r.type==="decl"&&e.test(r.prop))return t(r,s)}):this.walk((r,s)=>{if(r.type==="decl"&&r.prop===e)return t(r,s)}):(t=e,this.walk((r,s)=>{if(r.type==="decl")return t(r,s)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((r,s)=>{if(r.type==="rule"&&e.test(r.selector))return t(r,s)}):this.walk((r,s)=>{if(r.type==="rule"&&r.selector===e)return t(r,s)}):(t=e,this.walk((r,s)=>{if(r.type==="rule")return t(r,s)}))}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((r,s)=>{if(r.type==="atrule"&&e.test(r.name))return t(r,s)}):this.walk((r,s)=>{if(r.type==="atrule"&&r.name===e)return t(r,s)}):(t=e,this.walk((r,s)=>{if(r.type==="atrule")return t(r,s)}))}walkComments(e){return this.walk((t,r)=>{if(t.type==="comment")return e(t,r)})}append(...e){for(let t of e){let r=this.normalize(t,this.last);for(let s of r)this.proxyOf.nodes.push(s)}return this.markDirty(),this}prepend(...e){e=e.reverse();for(let t of e){let r=this.normalize(t,this.first,"prepend").reverse();for(let s of r)this.proxyOf.nodes.unshift(s);for(let s in this.indexes)this.indexes[s]=this.indexes[s]+r.length}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}insertBefore(e,t){e=this.index(e);let r=e===0?"prepend":!1,s=this.normalize(t,this.proxyOf.nodes[e],r).reverse();for(let a of s)this.proxyOf.nodes.splice(e,0,a);let n;for(let a in this.indexes)n=this.indexes[a],e<=n&&(this.indexes[a]=n+s.length);return this.markDirty(),this}insertAfter(e,t){e=this.index(e);let r=this.normalize(t,this.proxyOf.nodes[e]).reverse();for(let n of r)this.proxyOf.nodes.splice(e+1,0,n);let s;for(let n in this.indexes)s=this.indexes[n],e=e&&(this.indexes[r]=t-1);return this.markDirty(),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls(s=>{t.props&&!t.props.includes(s.prop)||t.fast&&!s.value.includes(t.fast)||(s.value=s.value.replace(e,r))}),this.markDirty(),this}every(e){return this.nodes.every(e)}some(e){return this.nodes.some(e)}index(e){return typeof e=="number"?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}get first(){if(!!this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(!!this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}normalize(e,t){if(typeof e=="string")e=Gl(Wl(e).nodes);else if(Array.isArray(e)){e=e.slice(0);for(let s of e)s.parent&&s.parent.removeChild(s,"ignore")}else if(e.type==="root"&&this.type!=="document"){e=e.nodes.slice(0);for(let s of e)s.parent&&s.parent.removeChild(s,"ignore")}else if(e.type)e=[e];else if(e.prop){if(typeof e.value=="undefined")throw new Error("Value field is missed in node creation");typeof e.value!="string"&&(e.value=String(e.value)),e=[new Ul(e)]}else if(e.selector)e=[new vs(e)];else if(e.name)e=[new xs(e)];else if(e.text)e=[new Vl(e)];else throw new Error("Unknown node type in node creation");return e.map(s=>(s[jl]||ue.rebuild(s),s=s.proxyOf,s.parent&&s.parent.removeChild(s),s[$l]&&Yl(s),typeof s.raws.before=="undefined"&&t&&typeof t.raws.before!="undefined"&&(s.raws.before=t.raws.before.replace(/\S/g,"")),s.parent=this,s))}getProxyProcessor(){return{set(e,t,r){return e[t]===r||(e[t]=r,(t==="name"||t==="params"||t==="selector")&&e.markDirty()),!0},get(e,t){return t==="proxyOf"?e:e[t]?t==="each"||typeof t=="string"&&t.startsWith("walk")?(...r)=>e[t](...r.map(s=>typeof s=="function"?(n,a)=>s(n.toProxy(),a):s)):t==="every"||t==="some"?r=>e[t]((s,...n)=>r(s.toProxy(),...n)):t==="root"?()=>e.root().toProxy():t==="nodes"?e.nodes.map(r=>r.toProxy()):t==="first"||t==="last"?e[t].toProxy():e[t]:e[t]}}}getIterator(){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach+=1;let e=this.lastEach;return this.indexes[e]=0,e}};ue.registerParse=i=>{Wl=i};ue.registerRule=i=>{vs=i};ue.registerAtRule=i=>{xs=i};Hl.exports=ue;ue.default=ue;ue.rebuild=i=>{i.type==="atrule"?Object.setPrototypeOf(i,xs.prototype):i.type==="rule"?Object.setPrototypeOf(i,vs.prototype):i.type==="decl"?Object.setPrototypeOf(i,Ul.prototype):i.type==="comment"&&Object.setPrototypeOf(i,Vl.prototype),i[jl]=!0,i.nodes&&i.nodes.forEach(e=>{ue.rebuild(e)})}});var ri=b((e5,Xl)=>{l();"use strict";var Zy=Re(),Ql,Jl,nt=class extends Zy{constructor(e){super({type:"document",...e});this.nodes||(this.nodes=[])}toResult(e={}){return new Ql(new Jl,this,e).stringify()}};nt.registerLazyResult=i=>{Ql=i};nt.registerProcessor=i=>{Jl=i};Xl.exports=nt;nt.default=nt});var eu=b((t5,Zl)=>{l();"use strict";var Kl={};Zl.exports=function(e){Kl[e]||(Kl[e]=!0,typeof console!="undefined"&&console.warn&&console.warn(e))}});var ks=b((r5,tu)=>{l();"use strict";var ii=class{constructor(e,t={}){if(this.type="warning",this.text=e,t.node&&t.node.source){let r=t.node.positionBy(t);this.line=r.line,this.column=r.column}for(let r in t)this[r]=t[r]}toString(){return this.node?this.node.error(this.text,{plugin:this.plugin,index:this.index,word:this.word}).message:this.plugin?this.plugin+": "+this.text:this.text}};tu.exports=ii;ii.default=ii});var Ss=b((i5,ru)=>{l();"use strict";var eb=ks(),si=class{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new eb(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter(e=>e.type==="warning")}get content(){return this.css}};ru.exports=si;si.default=si});var ou=b((s5,au)=>{l();"use strict";var _s="'".charCodeAt(0),iu='"'.charCodeAt(0),ni="\\".charCodeAt(0),su="/".charCodeAt(0),ai=` -`.charCodeAt(0),Wt=" ".charCodeAt(0),oi="\f".charCodeAt(0),li=" ".charCodeAt(0),ui="\r".charCodeAt(0),tb="[".charCodeAt(0),rb="]".charCodeAt(0),ib="(".charCodeAt(0),sb=")".charCodeAt(0),nb="{".charCodeAt(0),ab="}".charCodeAt(0),ob=";".charCodeAt(0),lb="*".charCodeAt(0),ub=":".charCodeAt(0),fb="@".charCodeAt(0),fi=/[\t\n\f\r "#'()/;[\\\]{}]/g,ci=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,cb=/.[\n"'(/\\]/,nu=/[\da-f]/i;au.exports=function(e,t={}){let r=e.css.valueOf(),s=t.ignoreErrors,n,a,o,f,c,u,p,d,g,y,x=r.length,w=0,v=[],C=[];function D(){return w}function I(Y){throw e.error("Unclosed "+Y,w)}function q(){return C.length===0&&w>=x}function G(Y){if(C.length)return C.pop();if(w>=x)return;let Mt=Y?Y.ignoreUnclosed:!1;switch(n=r.charCodeAt(w),n){case ai:case Wt:case li:case ui:case oi:{a=w;do a+=1,n=r.charCodeAt(a);while(n===Wt||n===ai||n===li||n===ui||n===oi);y=["space",r.slice(w,a)],w=a-1;break}case tb:case rb:case nb:case ab:case ub:case ob:case sb:{let Rr=String.fromCharCode(n);y=[Rr,Rr,w];break}case ib:{if(d=v.length?v.pop()[1]:"",g=r.charCodeAt(w+1),d==="url"&&g!==_s&&g!==iu&&g!==Wt&&g!==ai&&g!==li&&g!==oi&&g!==ui){a=w;do{if(u=!1,a=r.indexOf(")",a+1),a===-1)if(s||Mt){a=w;break}else I("bracket");for(p=a;r.charCodeAt(p-1)===ni;)p-=1,u=!u}while(u);y=["brackets",r.slice(w,a+1),w,a],w=a}else a=r.indexOf(")",w+1),f=r.slice(w,a+1),a===-1||cb.test(f)?y=["(","(",w]:(y=["brackets",f,w,a],w=a);break}case _s:case iu:{o=n===_s?"'":'"',a=w;do{if(u=!1,a=r.indexOf(o,a+1),a===-1)if(s||Mt){a=w+1;break}else I("string");for(p=a;r.charCodeAt(p-1)===ni;)p-=1,u=!u}while(u);y=["string",r.slice(w,a+1),w,a],w=a;break}case fb:{fi.lastIndex=w+1,fi.test(r),fi.lastIndex===0?a=r.length-1:a=fi.lastIndex-2,y=["at-word",r.slice(w,a+1),w,a],w=a;break}case ni:{for(a=w,c=!0;r.charCodeAt(a+1)===ni;)a+=1,c=!c;if(n=r.charCodeAt(a+1),c&&n!==su&&n!==Wt&&n!==ai&&n!==li&&n!==ui&&n!==oi&&(a+=1,nu.test(r.charAt(a)))){for(;nu.test(r.charAt(a+1));)a+=1;r.charCodeAt(a+1)===Wt&&(a+=1)}y=["word",r.slice(w,a+1),w,a],w=a;break}default:{n===su&&r.charCodeAt(w+1)===lb?(a=r.indexOf("*/",w+2)+1,a===0&&(s||Mt?a=r.length:I("comment")),y=["comment",r.slice(w,a+1),w,a],w=a):(ci.lastIndex=w+1,ci.test(r),ci.lastIndex===0?a=r.length-1:a=ci.lastIndex-2,y=["word",r.slice(w,a+1),w,a],v.push(y),w=a);break}}return w++,y}function he(Y){C.push(Y)}return{back:he,nextToken:G,endOfFile:q,position:D}}});var pi=b((n5,uu)=>{l();"use strict";var lu=Re(),Gt=class extends lu{constructor(e){super(e);this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};uu.exports=Gt;Gt.default=Gt;lu.registerAtRule(Gt)});var ot=b((a5,pu)=>{l();"use strict";var pb=Re(),fu,cu,at=class extends pb{constructor(e){super(e);this.type="root",this.nodes||(this.nodes=[])}removeChild(e,t){let r=this.index(e);return!t&&r===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}normalize(e,t,r){let s=super.normalize(e);if(t){if(r==="prepend")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let n of s)n.raws.before=t.raws.before}return s}toResult(e={}){return new fu(new cu,this,e).stringify()}};at.registerLazyResult=i=>{fu=i};at.registerProcessor=i=>{cu=i};pu.exports=at;at.default=at});var Cs=b((o5,du)=>{l();"use strict";var Yt={split(i,e,t){let r=[],s="",n=!1,a=0,o=!1,f=!1;for(let c of i)f?f=!1:c==="\\"?f=!0:o?c===o&&(o=!1):c==='"'||c==="'"?o=c:c==="("?a+=1:c===")"?a>0&&(a-=1):a===0&&e.includes(c)&&(n=!0),n?(s!==""&&r.push(s.trim()),s="",n=!1):s+=c;return(t||s!=="")&&r.push(s.trim()),r},space(i){let e=[" ",` -`," "];return Yt.split(i,e)},comma(i){return Yt.split(i,[","],!0)}};du.exports=Yt;Yt.default=Yt});var di=b((l5,mu)=>{l();"use strict";var hu=Re(),db=Cs(),Ht=class extends hu{constructor(e){super(e);this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return db.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,r=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(r)}};mu.exports=Ht;Ht.default=Ht;hu.registerRule(Ht)});var wu=b((u5,bu)=>{l();"use strict";var hb=Ut(),mb=ou(),gb=Vt(),yb=pi(),bb=ot(),gu=di(),yu=class{constructor(e){this.input=e,this.root=new bb,this.current=this.root,this.spaces="",this.semicolon=!1,this.customProperty=!1,this.createTokenizer(),this.root.source={input:e,start:{offset:0,line:1,column:1}}}createTokenizer(){this.tokenizer=mb(this.input)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}comment(e){let t=new gb;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]);let r=e[1].slice(2,-2);if(/^\s*$/.test(r))t.text="",t.raws.left=r,t.raws.right="";else{let s=r.match(/^(\s*)([^]*\S)(\s*)$/);t.text=s[2],t.raws.left=s[1],t.raws.right=s[3]}}emptyRule(e){let t=new gu;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}other(e){let t=!1,r=null,s=!1,n=null,a=[],o=e[1].startsWith("--"),f=[],c=e;for(;c;){if(r=c[0],f.push(c),r==="("||r==="[")n||(n=c),a.push(r==="("?")":"]");else if(o&&s&&r==="{")n||(n=c),a.push("}");else if(a.length===0)if(r===";")if(s){this.decl(f,o);return}else break;else if(r==="{"){this.rule(f);return}else if(r==="}"){this.tokenizer.back(f.pop()),t=!0;break}else r===":"&&(s=!0);else r===a[a.length-1]&&(a.pop(),a.length===0&&(n=null));c=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),a.length>0&&this.unclosedBracket(n),t&&s){for(;f.length&&(c=f[f.length-1][0],!(c!=="space"&&c!=="comment"));)this.tokenizer.back(f.pop());this.decl(f,o)}else this.unknownWord(f)}rule(e){e.pop();let t=new gu;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}decl(e,t){let r=new hb;this.init(r,e[0][2]);let s=e[e.length-1];for(s[0]===";"&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(s[3]||s[2]);e[0][0]!=="word";)e.length===1&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop="";e.length;){let f=e[0][0];if(f===":"||f==="space"||f==="comment")break;r.prop+=e.shift()[1]}r.raws.between="";let n;for(;e.length;)if(n=e.shift(),n[0]===":"){r.raws.between+=n[1];break}else n[0]==="word"&&/\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1];(r.prop[0]==="_"||r.prop[0]==="*")&&(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let a=this.spacesAndCommentsFromStart(e);this.precheckMissedSemicolon(e);for(let f=e.length-1;f>=0;f--){if(n=e[f],n[1].toLowerCase()==="!important"){r.important=!0;let c=this.stringFrom(e,f);c=this.spacesFromEnd(e)+c,c!==" !important"&&(r.raws.important=c);break}else if(n[1].toLowerCase()==="important"){let c=e.slice(0),u="";for(let p=f;p>0;p--){let d=c[p][0];if(u.trim().indexOf("!")===0&&d!=="space")break;u=c.pop()[1]+u}u.trim().indexOf("!")===0&&(r.important=!0,r.raws.important=u,e=c)}if(n[0]!=="space"&&n[0]!=="comment")break}let o=e.some(f=>f[0]!=="space"&&f[0]!=="comment");this.raw(r,"value",e),o?r.raws.between+=a:r.value=a+r.value,r.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}atrule(e){let t=new yb;t.name=e[1].slice(1),t.name===""&&this.unnamedAtrule(t,e),this.init(t,e[2]);let r,s,n,a=!1,o=!1,f=[],c=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),r=e[0],r==="("||r==="["?c.push(r==="("?")":"]"):r==="{"&&c.length>0?c.push("}"):r===c[c.length-1]&&c.pop(),c.length===0)if(r===";"){t.source.end=this.getPosition(e[2]),this.semicolon=!0;break}else if(r==="{"){o=!0;break}else if(r==="}"){if(f.length>0){for(n=f.length-1,s=f[n];s&&s[0]==="space";)s=f[--n];s&&(t.source.end=this.getPosition(s[3]||s[2]))}this.end(e);break}else f.push(e);else f.push(e);if(this.tokenizer.endOfFile()){a=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(f),f.length?(t.raws.afterName=this.spacesAndCommentsFromStart(f),this.raw(t,"params",f),a&&(e=f[f.length-1],t.source.end=this.getPosition(e[3]||e[2]),this.spaces=t.raws.between,t.raws.between="")):(t.raws.afterName="",t.params=""),o&&(t.nodes=[],this.current=t)}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type==="rule"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces="")}}getPosition(e){let t=this.input.fromOffset(e);return{offset:e,line:t.line,column:t.col}}init(e,t){this.current.push(e),e.source={start:this.getPosition(t),input:this.input},e.raws.before=this.spaces,this.spaces="",e.type!=="comment"&&(this.semicolon=!1)}raw(e,t,r){let s,n,a=r.length,o="",f=!0,c,u,p=/^([#.|])?(\w)+/i;for(let d=0;dg+y[1],"");e.raws[t]={value:o,raw:d}}e[t]=o}spacesAndCommentsFromEnd(e){let t,r="";for(;e.length&&(t=e[e.length-1][0],!(t!=="space"&&t!=="comment"));)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r="";for(;e.length&&(t=e[0][0],!(t!=="space"&&t!=="comment"));)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r="";for(;e.length&&(t=e[e.length-1][0],t==="space");)r=e.pop()[1]+r;return r}stringFrom(e,t){let r="";for(let s=t;s=0&&(s=e[n],!(s[0]!=="space"&&(r+=1,r===2)));n--);throw this.input.error("Missed semicolon",s[0]==="word"?s[3]+1:s[2])}};bu.exports=yu});var vu=b(()=>{l()});var ku=b((p5,xu)=>{l();var wb="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",vb=(i,e)=>()=>{let t="",r=e;for(;r--;)t+=i[Math.random()*i.length|0];return t},xb=(i=21)=>{let e="",t=i;for(;t--;)e+=wb[Math.random()*64|0];return e};xu.exports={nanoid:xb,customAlphabet:vb}});var As=b((d5,Su)=>{l();Su.exports={}});var mi=b((h5,Eu)=>{l();"use strict";var{SourceMapConsumer:kb,SourceMapGenerator:Sb}=vu(),{fileURLToPath:_u,pathToFileURL:hi}=(ds(),Tl),{resolve:Es,isAbsolute:Os}=(Ue(),Yo),{nanoid:_b}=ku(),Ts=ms(),Cu=Qr(),Cb=As(),Ps=Symbol("fromOffsetCache"),Ab=Boolean(kb&&Sb),Au=Boolean(Es&&Os),Qt=class{constructor(e,t={}){if(e===null||typeof e=="undefined"||typeof e=="object"&&!e.toString)throw new Error(`PostCSS received ${e} instead of CSS string`);if(this.css=e.toString(),this.css[0]==="\uFEFF"||this.css[0]==="\uFFFE"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!Au||/^\w+:\/\//.test(t.from)||Os(t.from)?this.file=t.from:this.file=Es(t.from)),Au&&Ab){let r=new Cb(this.css,t);if(r.text){this.map=r;let s=r.consumer().file;!this.file&&s&&(this.file=this.mapResolve(s))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}fromOffset(e){let t,r;if(this[Ps])r=this[Ps];else{let n=this.css.split(` -`);r=new Array(n.length);let a=0;for(let o=0,f=n.length;o=t)s=r.length-1;else{let n=r.length-2,a;for(;s>1),e=r[a+1])s=a+1;else{s=a;break}}return{line:s+1,col:e-r[s]+1}}error(e,t,r,s={}){let n;if(!r){let o=this.fromOffset(t);t=o.line,r=o.col}let a=this.origin(t,r);return a?n=new Cu(e,a.line,a.column,a.source,a.file,s.plugin):n=new Cu(e,t,r,this.css,this.file,s.plugin),n.input={line:t,column:r,source:this.css},this.file&&(hi&&(n.input.url=hi(this.file).toString()),n.input.file=this.file),n}origin(e,t){if(!this.map)return!1;let r=this.map.consumer(),s=r.originalPositionFor({line:e,column:t});if(!s.source)return!1;let n;Os(s.source)?n=hi(s.source):n=new URL(s.source,this.map.consumer().sourceRoot||hi(this.map.mapFile));let a={url:n.toString(),line:s.line,column:s.column};if(n.protocol==="file:")if(_u)a.file=_u(n);else throw new Error("file: protocol is not available in this PostCSS build");let o=r.sourceContentFor(s.source);return o&&(a.source=o),a}mapResolve(e){return/^\w+:\/\//.test(e)?e:Es(this.map.consumer().sourceRoot||this.map.root||".",e)}get from(){return this.file||this.id}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}};Eu.exports=Qt;Qt.default=Qt;Ts&&Ts.registerInput&&Ts.registerInput(Qt)});var Ds=b((m5,Ou)=>{l();"use strict";var Eb=Re(),Ob=wu(),Tb=mi();function gi(i,e){let t=new Tb(i,e),r=new Ob(t);try{r.parse()}catch(s){throw s}return r.root}Ou.exports=gi;gi.default=gi;Eb.registerParse(gi)});var Rs=b((y5,qu)=>{l();"use strict";var{isClean:ye,my:Pb}=Jr(),Db=Nl(),qb=Xr(),Ib=Re(),Rb=ri(),g5=eu(),Tu=Ss(),Mb=Ds(),Lb=ot(),Fb={document:"Document",root:"Root",atrule:"AtRule",rule:"Rule",decl:"Declaration",comment:"Comment"},Bb={postcssPlugin:!0,prepare:!0,Once:!0,Document:!0,Root:!0,Declaration:!0,Rule:!0,AtRule:!0,Comment:!0,DeclarationExit:!0,RuleExit:!0,AtRuleExit:!0,CommentExit:!0,RootExit:!0,DocumentExit:!0,OnceExit:!0},Nb={postcssPlugin:!0,prepare:!0,Once:!0},lt=0;function Jt(i){return typeof i=="object"&&typeof i.then=="function"}function Pu(i){let e=!1,t=Fb[i.type];return i.type==="decl"?e=i.prop.toLowerCase():i.type==="atrule"&&(e=i.name.toLowerCase()),e&&i.append?[t,t+"-"+e,lt,t+"Exit",t+"Exit-"+e]:e?[t,t+"-"+e,t+"Exit",t+"Exit-"+e]:i.append?[t,lt,t+"Exit"]:[t,t+"Exit"]}function Du(i){let e;return i.type==="document"?e=["Document",lt,"DocumentExit"]:i.type==="root"?e=["Root",lt,"RootExit"]:e=Pu(i),{node:i,events:e,eventIndex:0,visitors:[],visitorIndex:0,iterator:0}}function qs(i){return i[ye]=!1,i.nodes&&i.nodes.forEach(e=>qs(e)),i}var Is={},Ee=class{constructor(e,t,r){this.stringified=!1,this.processed=!1;let s;if(typeof t=="object"&&t!==null&&(t.type==="root"||t.type==="document"))s=qs(t);else if(t instanceof Ee||t instanceof Tu)s=qs(t.root),t.map&&(typeof r.map=="undefined"&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let n=Mb;r.syntax&&(n=r.syntax.parse),r.parser&&(n=r.parser),n.parse&&(n=n.parse);try{s=n(t,r)}catch(a){this.processed=!0,this.error=a}s&&!s[Pb]&&Ib.rebuild(s)}this.result=new Tu(e,s,r),this.helpers={...Is,result:this.result,postcss:Is},this.plugins=this.processor.plugins.map(n=>typeof n=="object"&&n.prepare?{...n,...n.prepare(this.result)}:n)}get[Symbol.toStringTag](){return"LazyResult"}get processor(){return this.result.processor}get opts(){return this.result.opts}get css(){return this.stringify().css}get content(){return this.stringify().content}get map(){return this.stringify().map}get root(){return this.sync().root}get messages(){return this.sync().messages}warnings(){return this.sync().warnings()}toString(){return this.css}then(e,t){return this.async().then(e,t)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(Jt(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ye];)e[ye]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type==="document")for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=qb;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let s=new Db(t,this.result.root,this.result.opts).generate();return this.result.css=s[0],this.result.map=s[1],this.result}walkSync(e){e[ye]=!0;let t=Pu(e);for(let r of t)if(r===lt)e.nodes&&e.each(s=>{s[ye]||this.walkSync(s)});else{let s=this.listeners[r];if(s&&this.visitSync(s,e.toProxy()))return}}visitSync(e,t){for(let[r,s]of e){this.result.lastPlugin=r;let n;try{n=s(t,this.helpers)}catch(a){throw this.handleError(a,t.proxyOf)}if(t.type!=="root"&&t.type!=="document"&&!t.parent)return!0;if(Jt(n))throw this.getAsyncError()}}runOnRoot(e){this.result.lastPlugin=e;try{if(typeof e=="object"&&e.Once){if(this.result.root.type==="document"){let t=this.result.root.nodes.map(r=>e.Once(r,this.helpers));return Jt(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}else if(typeof e=="function")return e(this.result.root,this.result)}catch(t){throw this.handleError(t)}}getAsyncError(){throw new Error("Use process(css).then(cb) to work with async plugins")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,e.name==="CssSyntaxError"&&!e.plugin?(e.plugin=r.postcssPlugin,e.setMessage()):r.postcssVersion}catch(s){console&&console.error&&console.error(s)}return e}async runAsync(){this.plugin=0;for(let e=0;e0;){let r=this.visitTick(t);if(Jt(r))try{await r}catch(s){let n=t[t.length-1].node;throw this.handleError(s,n)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if(e.type==="document"){let s=e.nodes.map(n=>r(n,this.helpers));await Promise.all(s)}else await r(e,this.helpers)}catch(s){throw this.handleError(s)}}}return this.processed=!0,this.stringify()}prepareVisitors(){this.listeners={};let e=(t,r,s)=>{this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push([t,s])};for(let t of this.plugins)if(typeof t=="object")for(let r in t){if(!Bb[r]&&/^[A-Z]/.test(r))throw new Error(`Unknown event ${r} in ${t.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`);if(!Nb[r])if(typeof t[r]=="object")for(let s in t[r])s==="*"?e(t,r,t[r][s]):e(t,r+"-"+s.toLowerCase(),t[r][s]);else typeof t[r]=="function"&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}visitTick(e){let t=e[e.length-1],{node:r,visitors:s}=t;if(r.type!=="root"&&r.type!=="document"&&!r.parent){e.pop();return}if(s.length>0&&t.visitorIndex{Is=i};qu.exports=Ee;Ee.default=Ee;Lb.registerLazyResult(Ee);Rb.registerLazyResult(Ee)});var Ru=b((b5,Iu)=>{l();"use strict";var zb=Rs(),$b=ri(),jb=ot(),ut=class{constructor(e=[]){this.version="8.3.6",this.plugins=this.normalize(e)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}process(e,t={}){return this.plugins.length===0&&typeof t.parser=="undefined"&&typeof t.stringifier=="undefined"&&typeof t.syntax=="undefined"&&!t.hideNothingWarning,new zb(this,e,t)}normalize(e){let t=[];for(let r of e)if(r.postcss===!0?r=r():r.postcss&&(r=r.postcss),typeof r=="object"&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if(typeof r=="object"&&r.postcssPlugin)t.push(r);else if(typeof r=="function")t.push(r);else if(!(typeof r=="object"&&(r.parse||r.stringify)))throw new Error(r+" is not a PostCSS plugin");return t}};Iu.exports=ut;ut.default=ut;jb.registerProcessor(ut);$b.registerProcessor(ut)});var Lu=b((w5,Mu)=>{l();"use strict";var Ub=Ut(),Vb=As(),Wb=Vt(),Gb=pi(),Yb=mi(),Hb=ot(),Qb=di();function Xt(i,e){if(Array.isArray(i))return i.map(s=>Xt(s));let{inputs:t,...r}=i;if(t){e=[];for(let s of t){let n={...s,__proto__:Yb.prototype};n.map&&(n.map={...n.map,__proto__:Vb.prototype}),e.push(n)}}if(r.nodes&&(r.nodes=i.nodes.map(s=>Xt(s,e))),r.source){let{inputId:s,...n}=r.source;r.source=n,s!=null&&(r.source.input=e[s])}if(r.type==="root")return new Hb(r);if(r.type==="decl")return new Ub(r);if(r.type==="rule")return new Qb(r);if(r.type==="comment")return new Wb(r);if(r.type==="atrule")return new Gb(r);throw new Error("Unknown node type: "+i.type)}Mu.exports=Xt;Xt.default=Xt});var te=b((v5,Vu)=>{l();"use strict";var Jb=Qr(),Fu=Ut(),Xb=Rs(),Kb=Re(),Bu=Ru(),Zb=Xr(),ew=Lu(),Nu=ri(),tw=ks(),zu=Vt(),$u=pi(),rw=Ss(),iw=mi(),sw=Ds(),nw=Cs(),ju=di(),Uu=ot(),aw=jt();function M(...i){return i.length===1&&Array.isArray(i[0])&&(i=i[0]),new Bu(i)}M.plugin=function(e,t){console&&console.warn&&(console.warn(e+`: postcss.plugin was deprecated. Migration guide: -https://evilmartians.com/chronicles/postcss-8-plugin-migration`),h.env.LANG&&h.env.LANG.startsWith("cn")&&console.warn(e+`: \u91CC\u9762 postcss.plugin \u88AB\u5F03\u7528. \u8FC1\u79FB\u6307\u5357: -https://www.w3ctech.com/topic/2226`));function r(...n){let a=t(...n);return a.postcssPlugin=e,a.postcssVersion=new Bu().version,a}let s;return Object.defineProperty(r,"postcss",{get(){return s||(s=r()),s}}),r.process=function(n,a,o){return M([r(o)]).process(n,a)},r};M.stringify=Zb;M.parse=sw;M.fromJSON=ew;M.list=nw;M.comment=i=>new zu(i);M.atRule=i=>new $u(i);M.decl=i=>new Fu(i);M.rule=i=>new ju(i);M.root=i=>new Uu(i);M.document=i=>new Nu(i);M.CssSyntaxError=Jb;M.Declaration=Fu;M.Container=Kb;M.Document=Nu;M.Comment=zu;M.Warning=tw;M.AtRule=$u;M.Result=rw;M.Input=iw;M.Rule=ju;M.Root=Uu;M.Node=aw;Xb.registerPostcss(M);Vu.exports=M;M.default=M});var $,F,x5,k5,S5,_5,C5,A5,E5,O5,T5,P5,D5,q5,I5,R5,M5,L5,F5,B5,N5,z5,$5,j5,U5,Me=S(()=>{l();$=V(te()),F=$.default,x5=$.default.stringify,k5=$.default.fromJSON,S5=$.default.plugin,_5=$.default.parse,C5=$.default.list,A5=$.default.document,E5=$.default.comment,O5=$.default.atRule,T5=$.default.rule,P5=$.default.decl,D5=$.default.root,q5=$.default.CssSyntaxError,I5=$.default.Declaration,R5=$.default.Container,M5=$.default.Document,L5=$.default.Comment,F5=$.default.Warning,B5=$.default.AtRule,N5=$.default.Result,z5=$.default.Input,$5=$.default.Rule,j5=$.default.Root,U5=$.default.Node});var Ms=b((W5,Wu)=>{l();Wu.exports=function(i,e,t,r,s){for(e=e.split?e.split("."):e,r=0;r{l();"use strict";yi.__esModule=!0;yi.default=uw;function ow(i){for(var e=i.toLowerCase(),t="",r=!1,s=0;s<6&&e[s]!==void 0;s++){var n=e.charCodeAt(s),a=n>=97&&n<=102||n>=48&&n<=57;if(r=n===32,!a)break;t+=e[s]}if(t.length!==0){var o=parseInt(t,16),f=o>=55296&&o<=57343;return f||o===0||o>1114111?["\uFFFD",t.length+(r?1:0)]:[String.fromCodePoint(o),t.length+(r?1:0)]}}var lw=/\\/;function uw(i){var e=lw.test(i);if(!e)return i;for(var t="",r=0;r{l();"use strict";wi.__esModule=!0;wi.default=fw;function fw(i){for(var e=arguments.length,t=new Array(e>1?e-1:0),r=1;r0;){var s=t.shift();if(!i[s])return;i=i[s]}return i}Yu.exports=wi.default});var Ju=b((vi,Qu)=>{l();"use strict";vi.__esModule=!0;vi.default=cw;function cw(i){for(var e=arguments.length,t=new Array(e>1?e-1:0),r=1;r0;){var s=t.shift();i[s]||(i[s]={}),i=i[s]}}Qu.exports=vi.default});var Ku=b((xi,Xu)=>{l();"use strict";xi.__esModule=!0;xi.default=pw;function pw(i){for(var e="",t=i.indexOf("/*"),r=0;t>=0;){e=e+i.slice(r,t);var s=i.indexOf("*/",t+2);if(s<0)return e;r=s+2,t=i.indexOf("/*",r)}return e=e+i.slice(r),e}Xu.exports=xi.default});var Kt=b(be=>{l();"use strict";be.__esModule=!0;be.stripComments=be.ensureObject=be.getProp=be.unesc=void 0;var dw=ki(bi());be.unesc=dw.default;var hw=ki(Hu());be.getProp=hw.default;var mw=ki(Ju());be.ensureObject=mw.default;var gw=ki(Ku());be.stripComments=gw.default;function ki(i){return i&&i.__esModule?i:{default:i}}});var Oe=b((Zt,tf)=>{l();"use strict";Zt.__esModule=!0;Zt.default=void 0;var Zu=Kt();function ef(i,e){for(var t=0;tr||this.source.end.lines||this.source.end.line===r&&this.source.end.column{l();"use strict";B.__esModule=!0;B.UNIVERSAL=B.ATTRIBUTE=B.CLASS=B.COMBINATOR=B.COMMENT=B.ID=B.NESTING=B.PSEUDO=B.ROOT=B.SELECTOR=B.STRING=B.TAG=void 0;var vw="tag";B.TAG=vw;var xw="string";B.STRING=xw;var kw="selector";B.SELECTOR=kw;var Sw="root";B.ROOT=Sw;var _w="pseudo";B.PSEUDO=_w;var Cw="nesting";B.NESTING=Cw;var Aw="id";B.ID=Aw;var Ew="comment";B.COMMENT=Ew;var Ow="combinator";B.COMBINATOR=Ow;var Tw="class";B.CLASS=Tw;var Pw="attribute";B.ATTRIBUTE=Pw;var Dw="universal";B.UNIVERSAL=Dw});var Si=b((er,af)=>{l();"use strict";er.__esModule=!0;er.default=void 0;var qw=Rw(Oe()),Te=Iw(Q());function rf(){if(typeof WeakMap!="function")return null;var i=new WeakMap;return rf=function(){return i},i}function Iw(i){if(i&&i.__esModule)return i;if(i===null||typeof i!="object"&&typeof i!="function")return{default:i};var e=rf();if(e&&e.has(i))return e.get(i);var t={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var n=r?Object.getOwnPropertyDescriptor(i,s):null;n&&(n.get||n.set)?Object.defineProperty(t,s,n):t[s]=i[s]}return t.default=i,e&&e.set(i,t),t}function Rw(i){return i&&i.__esModule?i:{default:i}}function Mw(i,e){var t;if(typeof Symbol=="undefined"||i[Symbol.iterator]==null){if(Array.isArray(i)||(t=Lw(i))||e&&i&&typeof i.length=="number"){t&&(i=t);var r=0;return function(){return r>=i.length?{done:!0}:{done:!1,value:i[r++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return t=i[Symbol.iterator](),t.next.bind(t)}function Lw(i,e){if(!!i){if(typeof i=="string")return sf(i,e);var t=Object.prototype.toString.call(i).slice(8,-1);if(t==="Object"&&i.constructor&&(t=i.constructor.name),t==="Map"||t==="Set")return Array.from(i);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return sf(i,e)}}function sf(i,e){(e==null||e>i.length)&&(e=i.length);for(var t=0,r=new Array(e);t=s&&(this.indexes[a]=n-1);return this},t.removeAll=function(){for(var s=Mw(this.nodes),n;!(n=s()).done;){var a=n.value;a.parent=void 0}return this.nodes=[],this},t.empty=function(){return this.removeAll()},t.insertAfter=function(s,n){n.parent=this;var a=this.index(s);this.nodes.splice(a+1,0,n),n.parent=this;var o;for(var f in this.indexes)o=this.indexes[f],a<=o&&(this.indexes[f]=o+1);return this},t.insertBefore=function(s,n){n.parent=this;var a=this.index(s);this.nodes.splice(a,0,n),n.parent=this;var o;for(var f in this.indexes)o=this.indexes[f],o<=a&&(this.indexes[f]=o+1);return this},t._findChildAtPosition=function(s,n){var a=void 0;return this.each(function(o){if(o.atPosition){var f=o.atPosition(s,n);if(f)return a=f,!1}else if(o.isAtPosition(s,n))return a=o,!1}),a},t.atPosition=function(s,n){if(this.isAtPosition(s,n))return this._findChildAtPosition(s,n)||this},t._inferEndPosition=function(){this.last&&this.last.source&&this.last.source.end&&(this.source=this.source||{},this.source.end=this.source.end||{},Object.assign(this.source.end,this.last.source.end))},t.each=function(s){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach++;var n=this.lastEach;if(this.indexes[n]=0,!!this.length){for(var a,o;this.indexes[n]{l();"use strict";tr.__esModule=!0;tr.default=void 0;var zw=jw(Si()),$w=Q();function jw(i){return i&&i.__esModule?i:{default:i}}function of(i,e){for(var t=0;t{l();"use strict";rr.__esModule=!0;rr.default=void 0;var Gw=Hw(Si()),Yw=Q();function Hw(i){return i&&i.__esModule?i:{default:i}}function Qw(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Ns(i,e)}function Ns(i,e){return Ns=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Ns(i,e)}var Jw=function(i){Qw(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=Yw.SELECTOR,r}return e}(Gw.default);rr.default=Jw;uf.exports=rr.default});var _i=b((H5,ff)=>{l();"use strict";var Xw={},Kw=Xw.hasOwnProperty,Zw=function(e,t){if(!e)return t;var r={};for(var s in t)r[s]=Kw.call(e,s)?e[s]:t[s];return r},e0=/[ -,\.\/:-@\[-\^`\{-~]/,t0=/[ -,\.\/:-@\[\]\^`\{-~]/,r0=/(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g,$s=function i(e,t){t=Zw(t,i.options),t.quotes!="single"&&t.quotes!="double"&&(t.quotes="single");for(var r=t.quotes=="double"?'"':"'",s=t.isIdentifier,n=e.charAt(0),a="",o=0,f=e.length;o126){if(u>=55296&&u<=56319&&o{l();"use strict";ir.__esModule=!0;ir.default=void 0;var i0=cf(_i()),s0=Kt(),n0=cf(Oe()),a0=Q();function cf(i){return i&&i.__esModule?i:{default:i}}function pf(i,e){for(var t=0;t{l();"use strict";sr.__esModule=!0;sr.default=void 0;var f0=p0(Oe()),c0=Q();function p0(i){return i&&i.__esModule?i:{default:i}}function d0(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Vs(i,e)}function Vs(i,e){return Vs=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Vs(i,e)}var h0=function(i){d0(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=c0.COMMENT,r}return e}(f0.default);sr.default=h0;hf.exports=sr.default});var Ys=b((nr,mf)=>{l();"use strict";nr.__esModule=!0;nr.default=void 0;var m0=y0(Oe()),g0=Q();function y0(i){return i&&i.__esModule?i:{default:i}}function b0(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Gs(i,e)}function Gs(i,e){return Gs=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Gs(i,e)}var w0=function(i){b0(e,i);function e(r){var s;return s=i.call(this,r)||this,s.type=g0.ID,s}var t=e.prototype;return t.valueToString=function(){return"#"+i.prototype.valueToString.call(this)},e}(m0.default);nr.default=w0;mf.exports=nr.default});var Ci=b((ar,bf)=>{l();"use strict";ar.__esModule=!0;ar.default=void 0;var v0=gf(_i()),x0=Kt(),k0=gf(Oe());function gf(i){return i&&i.__esModule?i:{default:i}}function yf(i,e){for(var t=0;t{l();"use strict";or.__esModule=!0;or.default=void 0;var A0=O0(Ci()),E0=Q();function O0(i){return i&&i.__esModule?i:{default:i}}function T0(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Qs(i,e)}function Qs(i,e){return Qs=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Qs(i,e)}var P0=function(i){T0(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=E0.TAG,r}return e}(A0.default);or.default=P0;wf.exports=or.default});var Ks=b((lr,vf)=>{l();"use strict";lr.__esModule=!0;lr.default=void 0;var D0=I0(Oe()),q0=Q();function I0(i){return i&&i.__esModule?i:{default:i}}function R0(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Xs(i,e)}function Xs(i,e){return Xs=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Xs(i,e)}var M0=function(i){R0(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=q0.STRING,r}return e}(D0.default);lr.default=M0;vf.exports=lr.default});var en=b((ur,xf)=>{l();"use strict";ur.__esModule=!0;ur.default=void 0;var L0=B0(Si()),F0=Q();function B0(i){return i&&i.__esModule?i:{default:i}}function N0(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,Zs(i,e)}function Zs(i,e){return Zs=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},Zs(i,e)}var z0=function(i){N0(e,i);function e(r){var s;return s=i.call(this,r)||this,s.type=F0.PSEUDO,s}var t=e.prototype;return t.toString=function(){var s=this.length?"("+this.map(String).join(",")+")":"";return[this.rawSpaceBefore,this.stringifyProperty("value"),s,this.rawSpaceAfter].join("")},e}(L0.default);ur.default=z0;xf.exports=ur.default});var kf={};me(kf,{deprecate:()=>$0});function $0(i){return i}var Sf=S(()=>{l()});var Cf=b((Q5,_f)=>{l();_f.exports=(Sf(),kf).deprecate});var on=b(pr=>{l();"use strict";pr.__esModule=!0;pr.unescapeValue=nn;pr.default=void 0;var fr=rn(_i()),j0=rn(bi()),U0=rn(Ci()),V0=Q(),tn;function rn(i){return i&&i.__esModule?i:{default:i}}function Af(i,e){for(var t=0;t0&&!s.quoted&&o.before.length===0&&!(s.spaces.value&&s.spaces.value.after)&&(o.before=" "),Ef(a,o)}))),n.push("]"),n.push(this.rawSpaceAfter),n.join("")},W0(e,[{key:"quoted",get:function(){var s=this.quoteMark;return s==="'"||s==='"'},set:function(s){Q0()}},{key:"quoteMark",get:function(){return this._quoteMark},set:function(s){if(!this._constructed){this._quoteMark=s;return}this._quoteMark!==s&&(this._quoteMark=s,this._syncRawValue())}},{key:"qualifiedAttribute",get:function(){return this.qualifiedName(this.raws.attribute||this.attribute)}},{key:"insensitiveFlag",get:function(){return this.insensitive?"i":""}},{key:"value",get:function(){return this._value},set:function(s){if(this._constructed){var n=nn(s),a=n.deprecatedUsage,o=n.unescaped,f=n.quoteMark;if(a&&H0(),o===this._value&&f===this._quoteMark)return;this._value=o,this._quoteMark=f,this._syncRawValue()}else this._value=s}},{key:"attribute",get:function(){return this._attribute},set:function(s){this._handleEscapes("attribute",s),this._attribute=s}}]),e}(U0.default);pr.default=Ai;Ai.NO_QUOTE=null;Ai.SINGLE_QUOTE="'";Ai.DOUBLE_QUOTE='"';var an=(tn={"'":{quotes:"single",wrap:!0},'"':{quotes:"double",wrap:!0}},tn[null]={isIdentifier:!0},tn);function Ef(i,e){return""+e.before+i+e.after}});var un=b((dr,Of)=>{l();"use strict";dr.__esModule=!0;dr.default=void 0;var K0=ev(Ci()),Z0=Q();function ev(i){return i&&i.__esModule?i:{default:i}}function tv(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,ln(i,e)}function ln(i,e){return ln=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},ln(i,e)}var rv=function(i){tv(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=Z0.UNIVERSAL,r.value="*",r}return e}(K0.default);dr.default=rv;Of.exports=dr.default});var cn=b((hr,Tf)=>{l();"use strict";hr.__esModule=!0;hr.default=void 0;var iv=nv(Oe()),sv=Q();function nv(i){return i&&i.__esModule?i:{default:i}}function av(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,fn(i,e)}function fn(i,e){return fn=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},fn(i,e)}var ov=function(i){av(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=sv.COMBINATOR,r}return e}(iv.default);hr.default=ov;Tf.exports=hr.default});var dn=b((mr,Pf)=>{l();"use strict";mr.__esModule=!0;mr.default=void 0;var lv=fv(Oe()),uv=Q();function fv(i){return i&&i.__esModule?i:{default:i}}function cv(i,e){i.prototype=Object.create(e.prototype),i.prototype.constructor=i,pn(i,e)}function pn(i,e){return pn=Object.setPrototypeOf||function(r,s){return r.__proto__=s,r},pn(i,e)}var pv=function(i){cv(e,i);function e(t){var r;return r=i.call(this,t)||this,r.type=uv.NESTING,r.value="&",r}return e}(lv.default);mr.default=pv;Pf.exports=mr.default});var qf=b((Ei,Df)=>{l();"use strict";Ei.__esModule=!0;Ei.default=dv;function dv(i){return i.sort(function(e,t){return e-t})}Df.exports=Ei.default});var hn=b(O=>{l();"use strict";O.__esModule=!0;O.combinator=O.word=O.comment=O.str=O.tab=O.newline=O.feed=O.cr=O.backslash=O.bang=O.slash=O.doubleQuote=O.singleQuote=O.space=O.greaterThan=O.pipe=O.equals=O.plus=O.caret=O.tilde=O.dollar=O.closeSquare=O.openSquare=O.closeParenthesis=O.openParenthesis=O.semicolon=O.colon=O.comma=O.at=O.asterisk=O.ampersand=void 0;var hv=38;O.ampersand=hv;var mv=42;O.asterisk=mv;var gv=64;O.at=gv;var yv=44;O.comma=yv;var bv=58;O.colon=bv;var wv=59;O.semicolon=wv;var vv=40;O.openParenthesis=vv;var xv=41;O.closeParenthesis=xv;var kv=91;O.openSquare=kv;var Sv=93;O.closeSquare=Sv;var _v=36;O.dollar=_v;var Cv=126;O.tilde=Cv;var Av=94;O.caret=Av;var Ev=43;O.plus=Ev;var Ov=61;O.equals=Ov;var Tv=124;O.pipe=Tv;var Pv=62;O.greaterThan=Pv;var Dv=32;O.space=Dv;var If=39;O.singleQuote=If;var qv=34;O.doubleQuote=qv;var Iv=47;O.slash=Iv;var Rv=33;O.bang=Rv;var Mv=92;O.backslash=Mv;var Lv=13;O.cr=Lv;var Fv=12;O.feed=Fv;var Bv=10;O.newline=Bv;var Nv=9;O.tab=Nv;var zv=If;O.str=zv;var $v=-1;O.comment=$v;var jv=-2;O.word=jv;var Uv=-3;O.combinator=Uv});var Lf=b(gr=>{l();"use strict";gr.__esModule=!0;gr.default=Jv;gr.FIELDS=void 0;var _=Vv(hn()),ft,L;function Rf(){if(typeof WeakMap!="function")return null;var i=new WeakMap;return Rf=function(){return i},i}function Vv(i){if(i&&i.__esModule)return i;if(i===null||typeof i!="object"&&typeof i!="function")return{default:i};var e=Rf();if(e&&e.has(i))return e.get(i);var t={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var n=r?Object.getOwnPropertyDescriptor(i,s):null;n&&(n.get||n.set)?Object.defineProperty(t,s,n):t[s]=i[s]}return t.default=i,e&&e.set(i,t),t}var Wv=(ft={},ft[_.tab]=!0,ft[_.newline]=!0,ft[_.cr]=!0,ft[_.feed]=!0,ft),Gv=(L={},L[_.space]=!0,L[_.tab]=!0,L[_.newline]=!0,L[_.cr]=!0,L[_.feed]=!0,L[_.ampersand]=!0,L[_.asterisk]=!0,L[_.bang]=!0,L[_.comma]=!0,L[_.colon]=!0,L[_.semicolon]=!0,L[_.openParenthesis]=!0,L[_.closeParenthesis]=!0,L[_.openSquare]=!0,L[_.closeSquare]=!0,L[_.singleQuote]=!0,L[_.doubleQuote]=!0,L[_.plus]=!0,L[_.pipe]=!0,L[_.tilde]=!0,L[_.greaterThan]=!0,L[_.equals]=!0,L[_.dollar]=!0,L[_.caret]=!0,L[_.slash]=!0,L),mn={},Mf="0123456789abcdefABCDEF";for(Oi=0;Oi0?(C=a+x,D=v-w[x].length):(C=a,D=n),q=_.comment,a=C,d=C,p=v-D):c===_.slash?(v=o,q=c,d=a,p=o-n,f=v+1):(v=Yv(t,o),q=_.word,d=a,p=v-n),f=v+1;break}e.push([q,a,o-n,d,p,o,f]),D&&(n=D,D=null),o=f}return e}});var Vf=b((yr,Uf)=>{l();"use strict";yr.__esModule=!0;yr.default=void 0;var Xv=re(Bs()),gn=re(zs()),Kv=re(Us()),Ff=re(Ws()),Zv=re(Ys()),ex=re(Js()),yn=re(Ks()),tx=re(en()),Bf=Ti(on()),rx=re(un()),bn=re(cn()),ix=re(dn()),sx=re(qf()),k=Ti(Lf()),A=Ti(hn()),nx=Ti(Q()),j=Kt(),Ye,wn;function Nf(){if(typeof WeakMap!="function")return null;var i=new WeakMap;return Nf=function(){return i},i}function Ti(i){if(i&&i.__esModule)return i;if(i===null||typeof i!="object"&&typeof i!="function")return{default:i};var e=Nf();if(e&&e.has(i))return e.get(i);var t={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var n=r?Object.getOwnPropertyDescriptor(i,s):null;n&&(n.get||n.set)?Object.defineProperty(t,s,n):t[s]=i[s]}return t.default=i,e&&e.set(i,t),t}function re(i){return i&&i.__esModule?i:{default:i}}function zf(i,e){for(var t=0;t0){var a=this.current.last;if(a){var o=this.convertWhitespaceNodesToSpace(n),f=o.space,c=o.rawSpace;c!==void 0&&(a.rawSpaceAfter+=c),a.spaces.after+=f}else n.forEach(function(q){return r.newNode(q)})}return}var u=this.currToken,p=void 0;s>this.position&&(p=this.parseWhitespaceEquivalentTokens(s));var d;if(this.isNamedCombinator()?d=this.namedCombinator():this.currToken[k.FIELDS.TYPE]===A.combinator?(d=new bn.default({value:this.content(),source:ct(this.currToken),sourceIndex:this.currToken[k.FIELDS.START_POS]}),this.position++):vn[this.currToken[k.FIELDS.TYPE]]||p||this.unexpected(),d){if(p){var g=this.convertWhitespaceNodesToSpace(p),y=g.space,x=g.rawSpace;d.spaces.before=y,d.rawSpaceBefore=x}}else{var w=this.convertWhitespaceNodesToSpace(p,!0),v=w.space,C=w.rawSpace;C||(C=v);var D={},I={spaces:{}};v.endsWith(" ")&&C.endsWith(" ")?(D.before=v.slice(0,v.length-1),I.spaces.before=C.slice(0,C.length-1)):v.startsWith(" ")&&C.startsWith(" ")?(D.after=v.slice(1),I.spaces.after=C.slice(1)):I.value=C,d=new bn.default({value:" ",source:xn(u,this.tokens[this.position-1]),sourceIndex:u[k.FIELDS.START_POS],spaces:D,raws:I})}return this.currToken&&this.currToken[k.FIELDS.TYPE]===A.space&&(d.spaces.after=this.optionalSpace(this.content()),this.position++),this.newNode(d)},e.comma=function(){if(this.position===this.tokens.length-1){this.root.trailingComma=!0,this.position++;return}this.current._inferEndPosition();var r=new gn.default({source:{start:$f(this.tokens[this.position+1])}});this.current.parent.append(r),this.current=r,this.position++},e.comment=function(){var r=this.currToken;this.newNode(new Ff.default({value:this.content(),source:ct(r),sourceIndex:r[k.FIELDS.START_POS]})),this.position++},e.error=function(r,s){throw this.root.error(r,s)},e.missingBackslash=function(){return this.error("Expected a backslash preceding the semicolon.",{index:this.currToken[k.FIELDS.START_POS]})},e.missingParenthesis=function(){return this.expected("opening parenthesis",this.currToken[k.FIELDS.START_POS])},e.missingSquareBracket=function(){return this.expected("opening square bracket",this.currToken[k.FIELDS.START_POS])},e.unexpected=function(){return this.error("Unexpected '"+this.content()+"'. Escaping special characters with \\ may help.",this.currToken[k.FIELDS.START_POS])},e.namespace=function(){var r=this.prevToken&&this.content(this.prevToken)||!0;if(this.nextToken[k.FIELDS.TYPE]===A.word)return this.position++,this.word(r);if(this.nextToken[k.FIELDS.TYPE]===A.asterisk)return this.position++,this.universal(r)},e.nesting=function(){if(this.nextToken){var r=this.content(this.nextToken);if(r==="|"){this.position++;return}}var s=this.currToken;this.newNode(new ix.default({value:this.content(),source:ct(s),sourceIndex:s[k.FIELDS.START_POS]})),this.position++},e.parentheses=function(){var r=this.current.last,s=1;if(this.position++,r&&r.type===nx.PSEUDO){var n=new gn.default({source:{start:$f(this.tokens[this.position-1])}}),a=this.current;for(r.append(n),this.current=n;this.position1&&r.nextToken&&r.nextToken[k.FIELDS.TYPE]===A.openParenthesis&&r.error("Misplaced parenthesis.",{index:r.nextToken[k.FIELDS.START_POS]})});else return this.expected(["pseudo-class","pseudo-element"],this.currToken[k.FIELDS.START_POS])},e.space=function(){var r=this.content();this.position===0||this.prevToken[k.FIELDS.TYPE]===A.comma||this.prevToken[k.FIELDS.TYPE]===A.openParenthesis||this.current.nodes.every(function(s){return s.type==="comment"})?(this.spaces=this.optionalSpace(r),this.position++):this.position===this.tokens.length-1||this.nextToken[k.FIELDS.TYPE]===A.comma||this.nextToken[k.FIELDS.TYPE]===A.closeParenthesis?(this.current.last.spaces.after=this.optionalSpace(r),this.position++):this.combinator()},e.string=function(){var r=this.currToken;this.newNode(new yn.default({value:this.content(),source:ct(r),sourceIndex:r[k.FIELDS.START_POS]})),this.position++},e.universal=function(r){var s=this.nextToken;if(s&&this.content(s)==="|")return this.position++,this.namespace();var n=this.currToken;this.newNode(new rx.default({value:this.content(),source:ct(n),sourceIndex:n[k.FIELDS.START_POS]}),r),this.position++},e.splitWord=function(r,s){for(var n=this,a=this.nextToken,o=this.content();a&&~[A.dollar,A.caret,A.equals,A.word].indexOf(a[k.FIELDS.TYPE]);){this.position++;var f=this.content();if(o+=f,f.lastIndexOf("\\")===f.length-1){var c=this.nextToken;c&&c[k.FIELDS.TYPE]===A.space&&(o+=this.requiredSpace(this.content(c)),this.position++)}a=this.nextToken}var u=kn(o,".").filter(function(y){var x=o[y-1]==="\\",w=/^\d+\.\d+%$/.test(o);return!x&&!w}),p=kn(o,"#").filter(function(y){return o[y-1]!=="\\"}),d=kn(o,"#{");d.length&&(p=p.filter(function(y){return!~d.indexOf(y)}));var g=(0,sx.default)(lx([0].concat(u,p)));g.forEach(function(y,x){var w=g[x+1]||o.length,v=o.slice(y,w);if(x===0&&s)return s.call(n,v,g.length);var C,D=n.currToken,I=D[k.FIELDS.START_POS]+g[x],q=He(D[1],D[2]+y,D[3],D[2]+(w-1));if(~u.indexOf(y)){var G={value:v.slice(1),source:q,sourceIndex:I};C=new Kv.default(pt(G,"value"))}else if(~p.indexOf(y)){var he={value:v.slice(1),source:q,sourceIndex:I};C=new Zv.default(pt(he,"value"))}else{var Y={value:v,source:q,sourceIndex:I};pt(Y,"value"),C=new ex.default(Y)}n.newNode(C,r),r=null}),this.position++},e.word=function(r){var s=this.nextToken;return s&&this.content(s)==="|"?(this.position++,this.namespace()):this.splitWord(r)},e.loop=function(){for(;this.position{l();"use strict";br.__esModule=!0;br.default=void 0;var fx=cx(Vf());function cx(i){return i&&i.__esModule?i:{default:i}}var px=function(){function i(t,r){this.func=t||function(){},this.funcRes=null,this.options=r}var e=i.prototype;return e._shouldUpdateSelector=function(r,s){s===void 0&&(s={});var n=Object.assign({},this.options,s);return n.updateSelector===!1?!1:typeof r!="string"},e._isLossy=function(r){r===void 0&&(r={});var s=Object.assign({},this.options,r);return s.lossless===!1},e._root=function(r,s){s===void 0&&(s={});var n=new fx.default(r,this._parseOptions(s));return n.root},e._parseOptions=function(r){return{lossy:this._isLossy(r)}},e._run=function(r,s){var n=this;return s===void 0&&(s={}),new Promise(function(a,o){try{var f=n._root(r,s);Promise.resolve(n.func(f)).then(function(c){var u=void 0;return n._shouldUpdateSelector(r,s)&&(u=f.toString(),r.selector=u),{transform:c,root:f,string:u}}).then(a,o)}catch(c){o(c);return}})},e._runSync=function(r,s){s===void 0&&(s={});var n=this._root(r,s),a=this.func(n);if(a&&typeof a.then=="function")throw new Error("Selector processor returned a promise to a synchronous call.");var o=void 0;return s.updateSelector&&typeof r!="string"&&(o=n.toString(),r.selector=o),{transform:a,root:n,string:o}},e.ast=function(r,s){return this._run(r,s).then(function(n){return n.root})},e.astSync=function(r,s){return this._runSync(r,s).root},e.transform=function(r,s){return this._run(r,s).then(function(n){return n.transform})},e.transformSync=function(r,s){return this._runSync(r,s).transform},e.process=function(r,s){return this._run(r,s).then(function(n){return n.string||n.root.toString()})},e.processSync=function(r,s){var n=this._runSync(r,s);return n.string||n.root.toString()},i}();br.default=px;Wf.exports=br.default});var Yf=b(N=>{l();"use strict";N.__esModule=!0;N.universal=N.tag=N.string=N.selector=N.root=N.pseudo=N.nesting=N.id=N.comment=N.combinator=N.className=N.attribute=void 0;var dx=ie(on()),hx=ie(Us()),mx=ie(cn()),gx=ie(Ws()),yx=ie(Ys()),bx=ie(dn()),wx=ie(en()),vx=ie(Bs()),xx=ie(zs()),kx=ie(Ks()),Sx=ie(Js()),_x=ie(un());function ie(i){return i&&i.__esModule?i:{default:i}}var Cx=function(e){return new dx.default(e)};N.attribute=Cx;var Ax=function(e){return new hx.default(e)};N.className=Ax;var Ex=function(e){return new mx.default(e)};N.combinator=Ex;var Ox=function(e){return new gx.default(e)};N.comment=Ox;var Tx=function(e){return new yx.default(e)};N.id=Tx;var Px=function(e){return new bx.default(e)};N.nesting=Px;var Dx=function(e){return new wx.default(e)};N.pseudo=Dx;var qx=function(e){return new vx.default(e)};N.root=qx;var Ix=function(e){return new xx.default(e)};N.selector=Ix;var Rx=function(e){return new kx.default(e)};N.string=Rx;var Mx=function(e){return new Sx.default(e)};N.tag=Mx;var Lx=function(e){return new _x.default(e)};N.universal=Lx});var Xf=b(R=>{l();"use strict";R.__esModule=!0;R.isNode=Sn;R.isPseudoElement=Jf;R.isPseudoClass=Yx;R.isContainer=Hx;R.isNamespace=Qx;R.isUniversal=R.isTag=R.isString=R.isSelector=R.isRoot=R.isPseudo=R.isNesting=R.isIdentifier=R.isComment=R.isCombinator=R.isClassName=R.isAttribute=void 0;var U=Q(),X,Fx=(X={},X[U.ATTRIBUTE]=!0,X[U.CLASS]=!0,X[U.COMBINATOR]=!0,X[U.COMMENT]=!0,X[U.ID]=!0,X[U.NESTING]=!0,X[U.PSEUDO]=!0,X[U.ROOT]=!0,X[U.SELECTOR]=!0,X[U.STRING]=!0,X[U.TAG]=!0,X[U.UNIVERSAL]=!0,X);function Sn(i){return typeof i=="object"&&Fx[i.type]}function se(i,e){return Sn(e)&&e.type===i}var Hf=se.bind(null,U.ATTRIBUTE);R.isAttribute=Hf;var Bx=se.bind(null,U.CLASS);R.isClassName=Bx;var Nx=se.bind(null,U.COMBINATOR);R.isCombinator=Nx;var zx=se.bind(null,U.COMMENT);R.isComment=zx;var $x=se.bind(null,U.ID);R.isIdentifier=$x;var jx=se.bind(null,U.NESTING);R.isNesting=jx;var _n=se.bind(null,U.PSEUDO);R.isPseudo=_n;var Ux=se.bind(null,U.ROOT);R.isRoot=Ux;var Vx=se.bind(null,U.SELECTOR);R.isSelector=Vx;var Wx=se.bind(null,U.STRING);R.isString=Wx;var Qf=se.bind(null,U.TAG);R.isTag=Qf;var Gx=se.bind(null,U.UNIVERSAL);R.isUniversal=Gx;function Jf(i){return _n(i)&&i.value&&(i.value.startsWith("::")||i.value.toLowerCase()===":before"||i.value.toLowerCase()===":after")}function Yx(i){return _n(i)&&!Jf(i)}function Hx(i){return!!(Sn(i)&&i.walk)}function Qx(i){return Hf(i)||Qf(i)}});var Kf=b(fe=>{l();"use strict";fe.__esModule=!0;var Cn=Q();Object.keys(Cn).forEach(function(i){i==="default"||i==="__esModule"||i in fe&&fe[i]===Cn[i]||(fe[i]=Cn[i])});var An=Yf();Object.keys(An).forEach(function(i){i==="default"||i==="__esModule"||i in fe&&fe[i]===An[i]||(fe[i]=An[i])});var En=Xf();Object.keys(En).forEach(function(i){i==="default"||i==="__esModule"||i in fe&&fe[i]===En[i]||(fe[i]=En[i])})});var we=b((wr,ec)=>{l();"use strict";wr.__esModule=!0;wr.default=void 0;var Jx=Zx(Gf()),Xx=Kx(Kf());function Zf(){if(typeof WeakMap!="function")return null;var i=new WeakMap;return Zf=function(){return i},i}function Kx(i){if(i&&i.__esModule)return i;if(i===null||typeof i!="object"&&typeof i!="function")return{default:i};var e=Zf();if(e&&e.has(i))return e.get(i);var t={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var n=r?Object.getOwnPropertyDescriptor(i,s):null;n&&(n.get||n.set)?Object.defineProperty(t,s,n):t[s]=i[s]}return t.default=i,e&&e.set(i,t),t}function Zx(i){return i&&i.__esModule?i:{default:i}}var On=function(e){return new Jx.default(e)};Object.assign(On,Xx);delete On.__esModule;var e1=On;wr.default=e1;ec.exports=wr.default});function Pe(i){return["fontSize","outline"].includes(i)?e=>(typeof e=="function"&&(e=e({})),Array.isArray(e)&&(e=e[0]),e):["fontFamily","boxShadow","transitionProperty","transitionDuration","transitionDelay","transitionTimingFunction","backgroundImage","backgroundSize","backgroundColor","cursor","animation"].includes(i)?e=>(typeof e=="function"&&(e=e({})),Array.isArray(e)&&(e=e.join(", ")),e):["gridTemplateColumns","gridTemplateRows","objectPosition"].includes(i)?e=>(typeof e=="function"&&(e=e({})),typeof e=="string"&&(e=F.list.comma(e).join(" ")),e):e=>(typeof e=="function"&&(e=e({})),e)}var vr=S(()=>{l();Me()});var nc=b((sE,qn)=>{l();var tc=we();function Tn(i,e){let t,r=tc(s=>{t=s});try{r.processSync(i)}catch(s){throw i.includes(":")?e?e.error("Missed semicolon"):s:e?e.error(s.message):s}return t.at(0)}function rc(i,e){let t=!1;return i.each(r=>{if(r.type==="nesting"){let s=e.clone();r.value!=="&"?r.replaceWith(Tn(r.value.replace("&",s.toString()))):r.replaceWith(s),t=!0}else r.nodes&&rc(r,e)&&(t=!0)}),t}function ic(i,e){let t=[];return i.selectors.forEach(r=>{let s=Tn(r,i);e.selectors.forEach(n=>{if(n.length){let a=Tn(n,e);rc(a,s)||(a.prepend(tc.combinator({value:" "})),a.prepend(s.clone())),t.push(a.toString())}})}),t}function Pn(i,e){return i&&i.type==="comment"?(e.after(i),i):e}function t1(i){return function e(t,r,s){let n=[];if(r.each(a=>{a.type==="comment"||a.type==="decl"?n.push(a):a.type==="rule"&&s?a.selectors=ic(t,a):a.type==="atrule"&&(a.nodes&&i[a.name]?e(t,a,!0):n.push(a))}),s&&n.length){let a=t.clone({nodes:[]});for(let o of n)a.append(o);r.prepend(a)}}}function Dn(i,e,t,r){let s=new r({selector:i,nodes:[]});for(let n of e)s.append(n);return t.after(s),s}function sc(i,e){let t={};for(let r of i)t[r]=!0;if(e)for(let r of e){let s=r.replace(/^@/,"");t[s]=!0}return t}qn.exports=(i={})=>{let e=sc(["media","supports"],i.bubble),t=t1(e),r=sc(["document","font-face","keyframes","-webkit-keyframes","-moz-keyframes"],i.unwrap),s=i.preserveEmpty;return{postcssPlugin:"postcss-nested",Rule(n,{Rule:a}){let o=!1,f=n,c=!1,u=[];n.each(p=>{if(p.type==="rule")u.length&&(f=Dn(n.selector,u,f,a),u=[]),c=!0,o=!0,p.selectors=ic(n,p),f=Pn(p.prev(),f),f.after(p),f=p;else if(p.type==="atrule")if(u.length&&(f=Dn(n.selector,u,f,a),u=[]),p.name==="at-root"){o=!0,t(n,p,!1);let d=p.nodes;p.params&&(d=new a({selector:p.params,nodes:d})),f.after(d),f=d,p.remove()}else e[p.name]?(c=!0,o=!0,t(n,p,!0),f=Pn(p.prev(),f),f.after(p),f=p):r[p.name]?(c=!0,o=!0,t(n,p,!1),f=Pn(p.prev(),f),f.after(p),f=p):c&&u.push(p);else p.type==="decl"&&c&&u.push(p)}),u.length&&(f=Dn(n.selector,u,f,a)),o&&s!==!0&&(n.raws.semicolon=!0,n.nodes.length===0&&n.remove())}}};qn.exports.postcss=!0});var uc=b((nE,lc)=>{l();"use strict";var ac=/-(\w|$)/g,oc=(i,e)=>e.toUpperCase(),r1=i=>(i=i.toLowerCase(),i==="float"?"cssFloat":i.startsWith("-ms-")?i.substr(1).replace(ac,oc):i.replace(ac,oc));lc.exports=r1});var Mn=b((aE,fc)=>{l();var i1=uc(),s1={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0};function In(i){return typeof i.nodes=="undefined"?!0:Rn(i)}function Rn(i){let e,t={};return i.each(r=>{if(r.type==="atrule")e="@"+r.name,r.params&&(e+=" "+r.params),typeof t[e]=="undefined"?t[e]=In(r):Array.isArray(t[e])?t[e].push(In(r)):t[e]=[t[e],In(r)];else if(r.type==="rule"){let s=Rn(r);if(t[r.selector])for(let n in s)t[r.selector][n]=s[n];else t[r.selector]=s}else if(r.type==="decl"){r.prop[0]==="-"&&r.prop[1]==="-"?e=r.prop:e=i1(r.prop);let s=r.value;!isNaN(r.value)&&s1[e]&&(s=parseFloat(r.value)),r.important&&(s+=" !important"),typeof t[e]=="undefined"?t[e]=s:Array.isArray(t[e])?t[e].push(s):t[e]=[t[e],s]}}),t}fc.exports=Rn});var Pi=b((oE,hc)=>{l();var xr=te(),cc=/\s*!important\s*$/i,n1={"box-flex":!0,"box-flex-group":!0,"column-count":!0,flex:!0,"flex-grow":!0,"flex-positive":!0,"flex-shrink":!0,"flex-negative":!0,"font-weight":!0,"line-clamp":!0,"line-height":!0,opacity:!0,order:!0,orphans:!0,"tab-size":!0,widows:!0,"z-index":!0,zoom:!0,"fill-opacity":!0,"stroke-dashoffset":!0,"stroke-opacity":!0,"stroke-width":!0};function a1(i){return i.replace(/([A-Z])/g,"-$1").replace(/^ms-/,"-ms-").toLowerCase()}function pc(i,e,t){t===!1||t===null||(e.startsWith("--")||(e=a1(e)),typeof t=="number"&&(t===0||n1[e]?t=t.toString():t+="px"),e==="css-float"&&(e="float"),cc.test(t)?(t=t.replace(cc,""),i.push(xr.decl({prop:e,value:t,important:!0}))):i.push(xr.decl({prop:e,value:t})))}function dc(i,e,t){let r=xr.atRule({name:e[1],params:e[3]||""});typeof t=="object"&&(r.nodes=[],Ln(t,r)),i.push(r)}function Ln(i,e){let t,r,s;for(t in i)if(r=i[t],!(r===null||typeof r=="undefined"))if(t[0]==="@"){let n=t.match(/@(\S+)(\s+([\W\w]*)\s*)?/);if(Array.isArray(r))for(let a of r)dc(e,n,a);else dc(e,n,r)}else if(Array.isArray(r))for(let n of r)pc(e,t,n);else typeof r=="object"?(s=xr.rule({selector:t}),Ln(r,s),e.push(s)):pc(e,t,r)}hc.exports=function(i){let e=xr.root();return Ln(i,e),e}});var Fn=b((lE,mc)=>{l();var o1=Mn();mc.exports=function(e){return console&&console.warn&&e.warnings().forEach(t=>{let r=t.plugin||"PostCSS";console.warn(r+": "+t.text)}),o1(e.root)}});var yc=b((uE,gc)=>{l();var l1=te(),u1=Fn(),f1=Pi();gc.exports=function(e){let t=l1(e);return async r=>{let s=await t.process(r,{parser:f1,from:void 0});return u1(s)}}});var wc=b((fE,bc)=>{l();var c1=te(),p1=Fn(),d1=Pi();bc.exports=function(i){let e=c1(i);return t=>{let r=e.process(t,{parser:d1,from:void 0});return p1(r)}}});var xc=b((cE,vc)=>{l();var h1=Mn(),m1=Pi(),g1=yc(),y1=wc();vc.exports={objectify:h1,parse:m1,async:g1,sync:y1}});var dt,kc,pE,dE,hE,mE,Sc=S(()=>{l();dt=V(xc()),kc=dt.default,pE=dt.default.objectify,dE=dt.default.parse,hE=dt.default.async,mE=dt.default.sync});function ht(i){return Array.isArray(i)?i.flatMap(e=>F([(0,_c.default)({bubble:["screen"]})]).process(e,{parser:kc}).root.nodes):ht([i])}var _c,Bn=S(()=>{l();Me();_c=V(nc());Sc()});function Cc(i,e){return e(i),i}var Ac=S(()=>{l()});function mt(i,e){return(0,Ec.default)(t=>{t.walkClasses(r=>{Cc(r.value,s=>{r.value=`${i}${s}`})})}).processSync(e)}var Ec,Di=S(()=>{l();Ec=V(we());Ac()});function Qe(i){return i.replace(/\\,/g,"\\2c ")}var qi=S(()=>{l()});function ce(i){let e=Oc.default.className();return e.value=i,Qe(e?.raws?.value??e.value)}var Oc,kr=S(()=>{l();Oc=V(we());qi()});function Nn(i){return Qe(`.${ce(i)}`)}function Ii(i,e){return Nn(Sr(i,e))}function Sr(i,e){return e==="DEFAULT"?i:e==="-"||e==="-DEFAULT"?`-${i}`:e.startsWith("-")?`-${i}${e}`:`${i}-${e}`}var zn=S(()=>{l();kr();qi()});var Pc=b((TE,Tc)=>{l();"use strict";Tc.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});function _r(i){if(typeof i!="string")return null;if(i=i.trim(),i==="transparent")return{mode:"rgb",color:["0","0","0"],alpha:"0"};if(i in $n.default)return{mode:"rgb",color:$n.default[i].map(s=>s.toString())};let e=i.replace(w1,(s,n,a,o,f)=>["#",n,n,a,a,o,o,f?f+f:""].join("")).match(b1);if(e!==null)return{mode:"rgb",color:[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)].map(s=>s.toString()),alpha:e[4]?(parseInt(e[4],16)/255).toString():void 0};let t=i.match(v1);if(t!==null)return{mode:"rgb",color:[t[1],t[2],t[3]].map(s=>s.toString()),alpha:t[4]?.toString?.()};let r=i.match(x1);return r!==null?{mode:"hsl",color:[r[1],r[2],r[3]].map(s=>s.toString()),alpha:r[4]?.toString?.()}:null}function jn({mode:i,color:e,alpha:t}){let r=t!==void 0;return`${i}(${e.join(" ")}${r?` / ${t}`:""})`}var $n,b1,w1,Le,Ri,Dc,v1,x1,Un=S(()=>{l();$n=V(Pc()),b1=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,w1=/^#([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i,Le="(?:\\d+|\\d*\\.\\d+)%?",Ri="(?:\\s*,\\s*|\\s+)",Dc="\\s*[,/]\\s*",v1=new RegExp(`^rgba?\\(\\s*(${Le})${Ri}(${Le})${Ri}(${Le})(?:${Dc}(${Le}))?\\s*\\)$`),x1=new RegExp(`^hsla?\\(\\s*((?:${Le})(?:deg|rad|grad|turn)?)${Ri}(${Le})${Ri}(${Le})(?:${Dc}(${Le}))?\\s*\\)$`)});function gt(i,e,t){if(typeof i=="function")return i({opacityValue:e});let r=_r(i);return r===null?t:jn({...r,alpha:e})}function K({color:i,property:e,variable:t}){let r=[].concat(e);if(typeof i=="function")return{[t]:"1",...Object.fromEntries(r.map(n=>[n,i({opacityVariable:t,opacityValue:`var(${t})`})]))};let s=_r(i);return s===null?Object.fromEntries(r.map(n=>[n,i])):s.alpha!==void 0?Object.fromEntries(r.map(n=>[n,i])):{[t]:"1",...Object.fromEntries(r.map(n=>[n,jn({...s,alpha:`var(${t})`})]))}}var Vn=S(()=>{l();Un()});function Mi(i){return i.split(S1).map(t=>{let r=t.trim(),s={raw:r},n=r.split(_1),a=new Set;for(let o of n)qc.lastIndex=0,!a.has("KEYWORD")&&k1.has(o)?(s.keyword=o,a.add("KEYWORD")):qc.test(o)?a.has("X")?a.has("Y")?a.has("BLUR")?a.has("SPREAD")||(s.spread=o,a.add("SPREAD")):(s.blur=o,a.add("BLUR")):(s.y=o,a.add("Y")):(s.x=o,a.add("X")):s.color?(s.unknown||(s.unknown=[]),s.unknown.push(o)):s.color=o;return s.valid=s.x!==void 0&&s.y!==void 0,s})}function Ic(i){return i.map(e=>e.valid?[e.keyword,e.x,e.y,e.blur,e.spread,e.color].filter(Boolean).join(" "):e.raw).join(", ")}var k1,S1,_1,qc,Wn=S(()=>{l();k1=new Set(["inset","inherit","initial","revert","unset"]),S1=/\,(?![^(]*\))/g,_1=/\ +(?![^(]*\))/g,qc=/^-?(\d+)(.*?)$/g});function pe(i,e=!0){return i.includes("url(")?i.split(/(url\(.*?\))/g).filter(Boolean).map(t=>/^url\(.*?\)$/.test(t)?t:pe(t,!1)).join(""):(i=i.replace(/([^\\])_+/g,(t,r)=>r+" ".repeat(t.length-1)).replace(/^_/g," ").replace(/\\_/g,"_"),e&&(i=i.trim()),i.replace(/(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g,"$1 $2 "))}function Hn(i){return i.startsWith("url(")}function Mc(i){return!isNaN(Number(i))||Gn.some(e=>new RegExp(`^${e}\\(.+?`).test(i))}function Qn(i){return/%$/g.test(i)||Gn.some(e=>new RegExp(`^${e}\\(.+?%`).test(i))}function Jn(i){return i.split(Yn).every(e=>e==="0"||new RegExp(`${Lc}$`).test(e)||Gn.some(t=>new RegExp(`^${t}\\(.+?${Lc}`).test(e)))}function Fc(i){return A1.has(i)}function Bc(i){let e=Mi(pe(i));for(let t of e)if(!t.valid)return!1;return!0}function Nc(i){let e=0;return i.split(Yn).every(r=>(r=pe(r),r.startsWith("var(")?!0:_r(r)!==null?(e++,!0):!1))?e>0:!1}function zc(i){let e=0;return i.split(Rc).every(r=>(r=pe(r),r.startsWith("var(")?!0:Hn(r)||O1(r)||["element(","image(","cross-fade(","image-set("].some(s=>r.startsWith(s))?(e++,!0):!1))?e>0:!1}function O1(i){i=pe(i);for(let e of E1)if(i.startsWith(`${e}(`))return!0;return!1}function $c(i){let e=0;return i.split(Yn).every(r=>(r=pe(r),r.startsWith("var(")?!0:T1.has(r)||Jn(r)||Qn(r)?(e++,!0):!1))?e>0:!1}function jc(i){let e=0;return i.split(Rc).every(r=>(r=pe(r),r.startsWith("var(")?!0:r.includes(" ")&&!/(['"])([^"']+)\1/g.test(r)||/^\d/g.test(r)?!1:(e++,!0)))?e>0:!1}function Uc(i){return P1.has(i)}function Vc(i){return D1.has(i)}function Wc(i){return q1.has(i)}var Gn,Rc,Yn,C1,Lc,A1,E1,T1,P1,D1,q1,Xn=S(()=>{l();Un();Wn();Gn=["min","max","clamp","calc"],Rc=/,(?![^(]*\))/g,Yn=/_(?![^(]*\))/g;C1=["cm","mm","Q","in","pc","pt","px","em","ex","ch","rem","lh","vw","vh","vmin","vmax"],Lc=`(?:${C1.join("|")})`;A1=new Set(["thin","medium","thick"]);E1=new Set(["linear-gradient","radial-gradient","repeating-linear-gradient","repeating-radial-gradient","conic-gradient"]);T1=new Set(["center","top","right","bottom","left"]);P1=new Set(["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]);D1=new Set(["xx-small","x-small","small","medium","large","x-large","x-large","xxx-large"]);q1=new Set(["larger","smaller"])});function Yc(i,e){return(0,Gc.default)(s=>{s.walkClasses(n=>{let a=e(n.value);n.value=a,n.raws&&n.raws.value&&(n.raws.value=Qe(n.raws.value))})}).processSync(i)}function Hc(i,e){if(!Cr(i))return;let t=i.slice(1,-1);if(!!e(t))return pe(t)}function I1(i,e={},t){let r=e[i];if(r!==void 0)return Ve(r);if(Cr(i)){let s=Hc(i,t);return s===void 0?void 0:Ve(s)}}function Li(i,e={},{validate:t=()=>!0}={}){let r=e.values?.[i];return r!==void 0?r:e.supportsNegativeValues&&i.startsWith("-")?I1(i.slice(1),e.values,t):Hc(i,t)}function Cr(i){return i.startsWith("[")&&i.endsWith("]")}function R1(i){let e=i.lastIndexOf("/");return e===-1||e===i.length-1?[i]:[i.slice(0,e),i.slice(e+1)]}function M1(i,e={},{tailwindConfig:t={}}={}){if(e.values?.[i]!==void 0)return e.values?.[i];let[r,s]=R1(i);if(s!==void 0){let n=e.values?.[r]??(Cr(r)?r.slice(1,-1):void 0);return n===void 0?void 0:Cr(s)?gt(n,s.slice(1,-1)):t.theme?.opacity?.[s]===void 0?void 0:gt(n,t.theme.opacity[s])}return Li(i,e,{validate:Nc})}function L1(i,e={}){return e.values?.[i]}function ne(i){return(e,t)=>Li(e,t,{validate:i})}function F1(i,e){let t=i.indexOf(e);return t===-1?[void 0,i]:[i.slice(0,t),i.slice(t+1)]}function Kn(i,e,t,r){if(Cr(e)){let s=e.slice(1,-1),[n,a]=F1(s,":");if(!/^[\w-_]+$/g.test(n))a=s;else if(n!==void 0&&!Jc.includes(n))return[];if(a.length>0&&Jc.includes(n))return[Li(`[${a}]`,t),n]}for(let s of[].concat(i)){let n=Qc[s](e,t,{tailwindConfig:r});if(n!==void 0)return[n,s]}return[]}var Gc,Qc,Jc,Zn=S(()=>{l();Gc=V(we());qi();Vn();Xn();Br();Qc={any:Li,color:M1,url:ne(Hn),image:ne(zc),length:ne(Jn),percentage:ne(Qn),position:ne($c),lookup:L1,"generic-name":ne(Uc),"family-name":ne(jc),number:ne(Mc),"line-width":ne(Fc),"absolute-size":ne(Vc),"relative-size":ne(Wc),shadow:ne(Bc)},Jc=Object.keys(Qc)});function Je(i){return(i>0n)-(i<0n)}var Fi=S(()=>{l()});function E(i,e=[[i,[i]]],{filterDefault:t=!1,...r}={}){let s=Pe(i);return function({matchUtilities:n,theme:a}){for(let o of e){let f=Array.isArray(o[0])?o:[o];n(f.reduce((c,[u,p])=>Object.assign(c,{[u]:d=>p.reduce((g,y)=>Array.isArray(y)?Object.assign(g,{[y[0]]:y[1]}):Object.assign(g,{[y]:s(d)}),{})}),{}),{...r,values:t?Object.fromEntries(Object.entries(a(i)??{}).filter(([c])=>c!=="DEFAULT")):a(i)})}}}var Xc=S(()=>{l();vr()});function Xe(i){return i=Array.isArray(i)?i:[i],i.map(e=>e.values.map(t=>t.raw!==void 0?t.raw:[t.min&&`(min-width: ${t.min})`,t.max&&`(max-width: ${t.max})`].filter(Boolean).join(" and "))).join(", ")}var Bi=S(()=>{l()});function ea(i){return i.split(V1).map(t=>{let r=t.trim(),s={value:r},n=r.split(W1),a=new Set;for(let o of n)!a.has("DIRECTIONS")&&B1.has(o)?(s.direction=o,a.add("DIRECTIONS")):!a.has("PLAY_STATES")&&N1.has(o)?(s.playState=o,a.add("PLAY_STATES")):!a.has("FILL_MODES")&&z1.has(o)?(s.fillMode=o,a.add("FILL_MODES")):!a.has("ITERATION_COUNTS")&&($1.has(o)||G1.test(o))?(s.iterationCount=o,a.add("ITERATION_COUNTS")):!a.has("TIMING_FUNCTION")&&j1.has(o)||!a.has("TIMING_FUNCTION")&&U1.some(f=>o.startsWith(`${f}(`))?(s.timingFunction=o,a.add("TIMING_FUNCTION")):!a.has("DURATION")&&Kc.test(o)?(s.duration=o,a.add("DURATION")):!a.has("DELAY")&&Kc.test(o)?(s.delay=o,a.add("DELAY")):a.has("NAME")?(s.unknown||(s.unknown=[]),s.unknown.push(o)):(s.name=o,a.add("NAME"));return s})}var B1,N1,z1,$1,j1,U1,V1,W1,Kc,G1,Zc=S(()=>{l();B1=new Set(["normal","reverse","alternate","alternate-reverse"]),N1=new Set(["running","paused"]),z1=new Set(["none","forwards","backwards","both"]),$1=new Set(["infinite"]),j1=new Set(["linear","ease","ease-in","ease-out","ease-in-out","step-start","step-end"]),U1=["cubic-bezier","steps"],V1=/\,(?![^(]*\))/g,W1=/\ +(?![^(]*\))/g,Kc=/^(-?[\d.]+m?s)$/,G1=/^(\d+)$/});var ep,H,tp=S(()=>{l();ep=i=>Object.assign({},...Object.entries(i??{}).flatMap(([e,t])=>typeof t=="object"?Object.entries(ep(t)).map(([r,s])=>({[e+(r==="DEFAULT"?"":`-${r}`)]:s})):[{[`${e}`]:t}])),H=ep});function z(i){return typeof i=="function"?i({}):i}var rp=S(()=>{l()});var sp,ip=S(()=>{sp="3.0.18"});function Fe(i,e=!0){return Array.isArray(i)?i.map(t=>{if(e&&Array.isArray(t))throw new Error("The tuple syntax is not supported for `screens`.");if(typeof t=="string")return{name:t.toString(),values:[{min:t,max:void 0}]};let[r,s]=t;return r=r.toString(),typeof s=="string"?{name:r,values:[{min:s,max:void 0}]}:Array.isArray(s)?{name:r,values:s.map(n=>np(n))}:{name:r,values:[np(s)]}}):Fe(Object.entries(i??{}),!1)}function np({"min-width":i,min:e=i,max:t,raw:r}={}){return{min:e,max:t,raw:r}}var Ni=S(()=>{l()});var ve,de,xe,ke,ap,op=S(()=>{l();tt();Ue();Me();Xc();Bi();Zc();tp();Vn();rp();Bt();vr();ip();Ce();Ni();Wn();ve={pseudoElementVariants:({addVariant:i})=>{i("first-letter","&::first-letter"),i("first-line","&::first-line"),i("marker",["& *::marker","&::marker"]),i("selection",["& *::selection","&::selection"]),i("file","&::file-selector-button"),i("placeholder","&::placeholder"),i("before",({container:e})=>(e.walkRules(t=>{let r=!1;t.walkDecls("content",()=>{r=!0}),r||t.prepend(F.decl({prop:"content",value:"var(--tw-content)"}))}),"&::before")),i("after",({container:e})=>(e.walkRules(t=>{let r=!1;t.walkDecls("content",()=>{r=!0}),r||t.prepend(F.decl({prop:"content",value:"var(--tw-content)"}))}),"&::after"))},pseudoClassVariants:({addVariant:i})=>{let e=[["first",":first-child"],["last",":last-child"],["only",":only-child"],["odd",":nth-child(odd)"],["even",":nth-child(even)"],"first-of-type","last-of-type","only-of-type","visited","target",["open","[open]"],"default","checked","indeterminate","placeholder-shown","autofill","required","valid","invalid","in-range","out-of-range","read-only","empty","focus-within","hover","focus","focus-visible","active","disabled"].map(t=>Array.isArray(t)?t:[t,`:${t}`]);for(let[t,r]of e)i(t,`&${r}`);for(let[t,r]of e)i(`group-${t}`,`:merge(.group)${r} &`);for(let[t,r]of e)i(`peer-${t}`,`:merge(.peer)${r} ~ &`)},directionVariants:({addVariant:i})=>{i("ltr",()=>(W.warn("rtl-experimental",["The RTL features in Tailwind CSS are currently in preview.","Preview features are not covered by semver, and may be improved in breaking ways at any time."]),'[dir="ltr"] &')),i("rtl",()=>(W.warn("rtl-experimental",["The RTL features in Tailwind CSS are currently in preview.","Preview features are not covered by semver, and may be improved in breaking ways at any time."]),'[dir="rtl"] &'))},reducedMotionVariants:({addVariant:i})=>{i("motion-safe","@media (prefers-reduced-motion: no-preference)"),i("motion-reduce","@media (prefers-reduced-motion: reduce)")},darkVariants:({config:i,addVariant:e})=>{let t=i("darkMode","media");t===!1&&(t="media",W.warn("darkmode-false",["The `darkMode` option in your Tailwind CSS configuration is set to `false`, which now behaves the same as `media`.","Change `darkMode` to `media` or remove it entirely.","https://tailwindcss.com/docs/upgrade-guide#remove-dark-mode-configuration"])),t==="class"?e("dark",".dark &"):t==="media"&&e("dark","@media (prefers-color-scheme: dark)")},printVariant:({addVariant:i})=>{i("print","@media print")},screenVariants:({theme:i,addVariant:e})=>{for(let t of Fe(i("screens"))){let r=Xe(t);e(t.name,`@media ${r}`)}},orientationVariants:({addVariant:i})=>{i("portrait","@media (orientation: portrait)"),i("landscape","@media (orientation: landscape)")}},de=["translate(var(--tw-translate-x), var(--tw-translate-y))","rotate(var(--tw-rotate))","skewX(var(--tw-skew-x))","skewY(var(--tw-skew-y))","scaleX(var(--tw-scale-x))","scaleY(var(--tw-scale-y))"].join(" "),xe=["var(--tw-blur)","var(--tw-brightness)","var(--tw-contrast)","var(--tw-grayscale)","var(--tw-hue-rotate)","var(--tw-invert)","var(--tw-saturate)","var(--tw-sepia)","var(--tw-drop-shadow)"].join(" "),ke=["var(--tw-backdrop-blur)","var(--tw-backdrop-brightness)","var(--tw-backdrop-contrast)","var(--tw-backdrop-grayscale)","var(--tw-backdrop-hue-rotate)","var(--tw-backdrop-invert)","var(--tw-backdrop-opacity)","var(--tw-backdrop-saturate)","var(--tw-backdrop-sepia)"].join(" "),ap={preflight:({addBase:i})=>{let e=F.parse(`*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:theme('borderColor.DEFAULT', 'currentColor')}::after,::before{--tw-content:''}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji")}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:theme('colors.gray.4', #9ca3af)}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}`);i([F.comment({text:`! tailwindcss v${sp} | MIT License | https://tailwindcss.com`}),...e.nodes])},container:(()=>{function i(t=[]){return t.flatMap(r=>r.values.map(s=>s.min)).filter(r=>r!==void 0)}function e(t,r,s){if(typeof s=="undefined")return[];if(!(typeof s=="object"&&s!==null))return[{screen:"DEFAULT",minWidth:0,padding:s}];let n=[];s.DEFAULT&&n.push({screen:"DEFAULT",minWidth:0,padding:s.DEFAULT});for(let a of t)for(let o of r)for(let{min:f}of o.values)f===a&&n.push({minWidth:a,padding:s[o.name]});return n}return function({addComponents:t,theme:r}){let s=Fe(r("container.screens",r("screens"))),n=i(s),a=e(n,s,r("container.padding")),o=c=>{let u=a.find(p=>p.minWidth===c);return u?{paddingRight:u.padding,paddingLeft:u.padding}:{}},f=Array.from(new Set(n.slice().sort((c,u)=>parseInt(c)-parseInt(u)))).map(c=>({[`@media (min-width: ${c})`]:{".container":{"max-width":c,...o(c)}}}));t([{".container":Object.assign({width:"100%"},r("container.center",!1)?{marginRight:"auto",marginLeft:"auto"}:{},o(0))},...f])}})(),accessibility:({addUtilities:i})=>{i({".sr-only":{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"},".not-sr-only":{position:"static",width:"auto",height:"auto",padding:"0",margin:"0",overflow:"visible",clip:"auto",whiteSpace:"normal"}})},pointerEvents:({addUtilities:i})=>{i({".pointer-events-none":{"pointer-events":"none"},".pointer-events-auto":{"pointer-events":"auto"}})},visibility:({addUtilities:i})=>{i({".visible":{visibility:"visible"},".invisible":{visibility:"hidden"}})},position:({addUtilities:i})=>{i({".static":{position:"static"},".fixed":{position:"fixed"},".absolute":{position:"absolute"},".relative":{position:"relative"},".sticky":{position:"sticky"}})},inset:E("inset",[["inset",["top","right","bottom","left"]],[["inset-x",["left","right"]],["inset-y",["top","bottom"]]],[["top",["top"]],["right",["right"]],["bottom",["bottom"]],["left",["left"]]]],{supportsNegativeValues:!0}),isolation:({addUtilities:i})=>{i({".isolate":{isolation:"isolate"},".isolation-auto":{isolation:"auto"}})},zIndex:E("zIndex",[["z",["zIndex"]]],{supportsNegativeValues:!0}),order:E("order",void 0,{supportsNegativeValues:!0}),gridColumn:E("gridColumn",[["col",["gridColumn"]]]),gridColumnStart:E("gridColumnStart",[["col-start",["gridColumnStart"]]]),gridColumnEnd:E("gridColumnEnd",[["col-end",["gridColumnEnd"]]]),gridRow:E("gridRow",[["row",["gridRow"]]]),gridRowStart:E("gridRowStart",[["row-start",["gridRowStart"]]]),gridRowEnd:E("gridRowEnd",[["row-end",["gridRowEnd"]]]),float:({addUtilities:i})=>{i({".float-right":{float:"right"},".float-left":{float:"left"},".float-none":{float:"none"}})},clear:({addUtilities:i})=>{i({".clear-left":{clear:"left"},".clear-right":{clear:"right"},".clear-both":{clear:"both"},".clear-none":{clear:"none"}})},margin:E("margin",[["m",["margin"]],[["mx",["margin-left","margin-right"]],["my",["margin-top","margin-bottom"]]],[["mt",["margin-top"]],["mr",["margin-right"]],["mb",["margin-bottom"]],["ml",["margin-left"]]]],{supportsNegativeValues:!0}),boxSizing:({addUtilities:i})=>{i({".box-border":{"box-sizing":"border-box"},".box-content":{"box-sizing":"content-box"}})},display:({addUtilities:i})=>{i({".block":{display:"block"},".inline-block":{display:"inline-block"},".inline":{display:"inline"},".flex":{display:"flex"},".inline-flex":{display:"inline-flex"},".table":{display:"table"},".inline-table":{display:"inline-table"},".table-caption":{display:"table-caption"},".table-cell":{display:"table-cell"},".table-column":{display:"table-column"},".table-column-group":{display:"table-column-group"},".table-footer-group":{display:"table-footer-group"},".table-header-group":{display:"table-header-group"},".table-row-group":{display:"table-row-group"},".table-row":{display:"table-row"},".flow-root":{display:"flow-root"},".grid":{display:"grid"},".inline-grid":{display:"inline-grid"},".contents":{display:"contents"},".list-item":{display:"list-item"},".hidden":{display:"none"}})},aspectRatio:E("aspectRatio",[["aspect",["aspect-ratio"]]]),height:E("height",[["h",["height"]]]),maxHeight:E("maxHeight",[["max-h",["maxHeight"]]]),minHeight:E("minHeight",[["min-h",["minHeight"]]]),width:E("width",[["w",["width"]]]),minWidth:E("minWidth",[["min-w",["minWidth"]]]),maxWidth:E("maxWidth",[["max-w",["maxWidth"]]]),flex:E("flex"),flexShrink:E("flexShrink",[["flex-shrink",["flex-shrink"]],["shrink",["flex-shrink"]]]),flexGrow:E("flexGrow",[["flex-grow",["flex-grow"]],["grow",["flex-grow"]]]),flexBasis:E("flexBasis",[["basis",["flex-basis"]]]),tableLayout:({addUtilities:i})=>{i({".table-auto":{"table-layout":"auto"},".table-fixed":{"table-layout":"fixed"}})},borderCollapse:({addUtilities:i})=>{i({".border-collapse":{"border-collapse":"collapse"},".border-separate":{"border-collapse":"separate"}})},transformOrigin:E("transformOrigin",[["origin",["transformOrigin"]]]),translate:E("translate",[[["translate-x",[["@defaults transform",{}],"--tw-translate-x",["transform",de]]],["translate-y",[["@defaults transform",{}],"--tw-translate-y",["transform",de]]]]],{supportsNegativeValues:!0}),rotate:E("rotate",[["rotate",[["@defaults transform",{}],"--tw-rotate",["transform",de]]]],{supportsNegativeValues:!0}),skew:E("skew",[[["skew-x",[["@defaults transform",{}],"--tw-skew-x",["transform",de]]],["skew-y",[["@defaults transform",{}],"--tw-skew-y",["transform",de]]]]],{supportsNegativeValues:!0}),scale:E("scale",[["scale",[["@defaults transform",{}],"--tw-scale-x","--tw-scale-y",["transform",de]]],[["scale-x",[["@defaults transform",{}],"--tw-scale-x",["transform",de]]],["scale-y",[["@defaults transform",{}],"--tw-scale-y",["transform",de]]]]],{supportsNegativeValues:!0}),transform:({addDefaults:i,addUtilities:e})=>{i("transform",{"--tw-translate-x":"0","--tw-translate-y":"0","--tw-rotate":"0","--tw-skew-x":"0","--tw-skew-y":"0","--tw-scale-x":"1","--tw-scale-y":"1"}),e({".transform":{"@defaults transform":{},transform:de},".transform-cpu":{transform:de},".transform-gpu":{transform:de.replace("translate(var(--tw-translate-x), var(--tw-translate-y))","translate3d(var(--tw-translate-x), var(--tw-translate-y), 0)")},".transform-none":{transform:"none"}})},animation:({matchUtilities:i,theme:e,prefix:t})=>{let r=n=>t(`.${n}`).slice(1),s=Object.fromEntries(Object.entries(e("keyframes")??{}).map(([n,a])=>[n,{[`@keyframes ${r(n)}`]:a}]));i({animate:n=>{let a=ea(n);return[...a.flatMap(o=>s[o.name]),{animation:a.map(({name:o,value:f})=>o===void 0||s[o]===void 0?f:f.replace(o,r(o))).join(", ")}]}},{values:e("animation")})},cursor:E("cursor"),touchAction:({addDefaults:i,addUtilities:e})=>{i("touch-action",{"--tw-pan-x":" ","--tw-pan-y":" ","--tw-pinch-zoom":" "});let t="var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)";e({".touch-auto":{"touch-action":"auto"},".touch-none":{"touch-action":"none"},".touch-pan-x":{"@defaults touch-action":{},"--tw-pan-x":"pan-x","touch-action":t},".touch-pan-left":{"@defaults touch-action":{},"--tw-pan-x":"pan-left","touch-action":t},".touch-pan-right":{"@defaults touch-action":{},"--tw-pan-x":"pan-right","touch-action":t},".touch-pan-y":{"@defaults touch-action":{},"--tw-pan-y":"pan-y","touch-action":t},".touch-pan-up":{"@defaults touch-action":{},"--tw-pan-y":"pan-up","touch-action":t},".touch-pan-down":{"@defaults touch-action":{},"--tw-pan-y":"pan-down","touch-action":t},".touch-pinch-zoom":{"@defaults touch-action":{},"--tw-pinch-zoom":"pinch-zoom","touch-action":t},".touch-manipulation":{"touch-action":"manipulation"}})},userSelect:({addUtilities:i})=>{i({".select-none":{"user-select":"none"},".select-text":{"user-select":"text"},".select-all":{"user-select":"all"},".select-auto":{"user-select":"auto"}})},resize:({addUtilities:i})=>{i({".resize-none":{resize:"none"},".resize-y":{resize:"vertical"},".resize-x":{resize:"horizontal"},".resize":{resize:"both"}})},scrollSnapType:({addDefaults:i,addUtilities:e})=>{i("scroll-snap-type",{"--tw-scroll-snap-strictness":"proximity"}),e({".snap-none":{"scroll-snap-type":"none"},".snap-x":{"@defaults scroll-snap-type":{},"scroll-snap-type":"x var(--tw-scroll-snap-strictness)"},".snap-y":{"@defaults scroll-snap-type":{},"scroll-snap-type":"y var(--tw-scroll-snap-strictness)"},".snap-both":{"@defaults scroll-snap-type":{},"scroll-snap-type":"both var(--tw-scroll-snap-strictness)"},".snap-mandatory":{"--tw-scroll-snap-strictness":"mandatory"},".snap-proximity":{"--tw-scroll-snap-strictness":"proximity"}})},scrollSnapAlign:({addUtilities:i})=>{i({".snap-start":{"scroll-snap-align":"start"},".snap-end":{"scroll-snap-align":"end"},".snap-center":{"scroll-snap-align":"center"},".snap-align-none":{"scroll-snap-align":"none"}})},scrollSnapStop:({addUtilities:i})=>{i({".snap-normal":{"scroll-snap-stop":"normal"},".snap-always":{"scroll-snap-stop":"always"}})},scrollMargin:E("scrollMargin",[["scroll-m",["scroll-margin"]],[["scroll-mx",["scroll-margin-left","scroll-margin-right"]],["scroll-my",["scroll-margin-top","scroll-margin-bottom"]]],[["scroll-mt",["scroll-margin-top"]],["scroll-mr",["scroll-margin-right"]],["scroll-mb",["scroll-margin-bottom"]],["scroll-ml",["scroll-margin-left"]]]],{supportsNegativeValues:!0}),scrollPadding:E("scrollPadding",[["scroll-p",["scroll-padding"]],[["scroll-px",["scroll-padding-left","scroll-padding-right"]],["scroll-py",["scroll-padding-top","scroll-padding-bottom"]]],[["scroll-pt",["scroll-padding-top"]],["scroll-pr",["scroll-padding-right"]],["scroll-pb",["scroll-padding-bottom"]],["scroll-pl",["scroll-padding-left"]]]]),listStylePosition:({addUtilities:i})=>{i({".list-inside":{"list-style-position":"inside"},".list-outside":{"list-style-position":"outside"}})},listStyleType:E("listStyleType",[["list",["listStyleType"]]]),appearance:({addUtilities:i})=>{i({".appearance-none":{appearance:"none"}})},columns:E("columns",[["columns",["columns"]]]),breakBefore:({addUtilities:i})=>{i({".break-before-auto":{"break-before":"auto"},".break-before-avoid":{"break-before":"avoid"},".break-before-all":{"break-before":"all"},".break-before-avoid-page":{"break-before":"avoid-page"},".break-before-page":{"break-before":"page"},".break-before-left":{"break-before":"left"},".break-before-right":{"break-before":"right"},".break-before-column":{"break-before":"column"}})},breakInside:({addUtilities:i})=>{i({".break-inside-auto":{"break-inside":"auto"},".break-inside-avoid":{"break-inside":"avoid"},".break-inside-avoid-page":{"break-inside":"avoid-page"},".break-inside-avoid-column":{"break-inside":"avoid-column"}})},breakAfter:({addUtilities:i})=>{i({".break-after-auto":{"break-after":"auto"},".break-after-avoid":{"break-after":"avoid"},".break-after-all":{"break-after":"all"},".break-after-avoid-page":{"break-after":"avoid-page"},".break-after-page":{"break-after":"page"},".break-after-left":{"break-after":"left"},".break-after-right":{"break-after":"right"},".break-after-column":{"break-after":"column"}})},gridAutoColumns:E("gridAutoColumns",[["auto-cols",["gridAutoColumns"]]]),gridAutoFlow:({addUtilities:i})=>{i({".grid-flow-row":{gridAutoFlow:"row"},".grid-flow-col":{gridAutoFlow:"column"},".grid-flow-row-dense":{gridAutoFlow:"row dense"},".grid-flow-col-dense":{gridAutoFlow:"column dense"}})},gridAutoRows:E("gridAutoRows",[["auto-rows",["gridAutoRows"]]]),gridTemplateColumns:E("gridTemplateColumns",[["grid-cols",["gridTemplateColumns"]]]),gridTemplateRows:E("gridTemplateRows",[["grid-rows",["gridTemplateRows"]]]),flexDirection:({addUtilities:i})=>{i({".flex-row":{"flex-direction":"row"},".flex-row-reverse":{"flex-direction":"row-reverse"},".flex-col":{"flex-direction":"column"},".flex-col-reverse":{"flex-direction":"column-reverse"}})},flexWrap:({addUtilities:i})=>{i({".flex-wrap":{"flex-wrap":"wrap"},".flex-wrap-reverse":{"flex-wrap":"wrap-reverse"},".flex-nowrap":{"flex-wrap":"nowrap"}})},placeContent:({addUtilities:i})=>{i({".place-content-center":{"place-content":"center"},".place-content-start":{"place-content":"start"},".place-content-end":{"place-content":"end"},".place-content-between":{"place-content":"space-between"},".place-content-around":{"place-content":"space-around"},".place-content-evenly":{"place-content":"space-evenly"},".place-content-stretch":{"place-content":"stretch"}})},placeItems:({addUtilities:i})=>{i({".place-items-start":{"place-items":"start"},".place-items-end":{"place-items":"end"},".place-items-center":{"place-items":"center"},".place-items-stretch":{"place-items":"stretch"}})},alignContent:({addUtilities:i})=>{i({".content-center":{"align-content":"center"},".content-start":{"align-content":"flex-start"},".content-end":{"align-content":"flex-end"},".content-between":{"align-content":"space-between"},".content-around":{"align-content":"space-around"},".content-evenly":{"align-content":"space-evenly"}})},alignItems:({addUtilities:i})=>{i({".items-start":{"align-items":"flex-start"},".items-end":{"align-items":"flex-end"},".items-center":{"align-items":"center"},".items-baseline":{"align-items":"baseline"},".items-stretch":{"align-items":"stretch"}})},justifyContent:({addUtilities:i})=>{i({".justify-start":{"justify-content":"flex-start"},".justify-end":{"justify-content":"flex-end"},".justify-center":{"justify-content":"center"},".justify-between":{"justify-content":"space-between"},".justify-around":{"justify-content":"space-around"},".justify-evenly":{"justify-content":"space-evenly"}})},justifyItems:({addUtilities:i})=>{i({".justify-items-start":{"justify-items":"start"},".justify-items-end":{"justify-items":"end"},".justify-items-center":{"justify-items":"center"},".justify-items-stretch":{"justify-items":"stretch"}})},gap:E("gap",[["gap",["gap"]],[["gap-x",["columnGap"]],["gap-y",["rowGap"]]]]),space:({matchUtilities:i,addUtilities:e,theme:t})=>{i({"space-x":r=>(r=r==="0"?"0px":r,{"& > :not([hidden]) ~ :not([hidden])":{"--tw-space-x-reverse":"0","margin-right":`calc(${r} * var(--tw-space-x-reverse))`,"margin-left":`calc(${r} * calc(1 - var(--tw-space-x-reverse)))`}}),"space-y":r=>(r=r==="0"?"0px":r,{"& > :not([hidden]) ~ :not([hidden])":{"--tw-space-y-reverse":"0","margin-top":`calc(${r} * calc(1 - var(--tw-space-y-reverse)))`,"margin-bottom":`calc(${r} * var(--tw-space-y-reverse))`}})},{values:t("space"),supportsNegativeValues:!0}),e({".space-y-reverse > :not([hidden]) ~ :not([hidden])":{"--tw-space-y-reverse":"1"},".space-x-reverse > :not([hidden]) ~ :not([hidden])":{"--tw-space-x-reverse":"1"}})},divideWidth:({matchUtilities:i,addUtilities:e,theme:t})=>{i({"divide-x":r=>(r=r==="0"?"0px":r,{"& > :not([hidden]) ~ :not([hidden])":{"@defaults border-width":{},"--tw-divide-x-reverse":"0","border-right-width":`calc(${r} * var(--tw-divide-x-reverse))`,"border-left-width":`calc(${r} * calc(1 - var(--tw-divide-x-reverse)))`}}),"divide-y":r=>(r=r==="0"?"0px":r,{"& > :not([hidden]) ~ :not([hidden])":{"@defaults border-width":{},"--tw-divide-y-reverse":"0","border-top-width":`calc(${r} * calc(1 - var(--tw-divide-y-reverse)))`,"border-bottom-width":`calc(${r} * var(--tw-divide-y-reverse))`}})},{values:t("divideWidth"),type:["line-width","length"]}),e({".divide-y-reverse > :not([hidden]) ~ :not([hidden])":{"@defaults border-width":{},"--tw-divide-y-reverse":"1"},".divide-x-reverse > :not([hidden]) ~ :not([hidden])":{"@defaults border-width":{},"--tw-divide-x-reverse":"1"}})},divideStyle:({addUtilities:i})=>{i({".divide-solid > :not([hidden]) ~ :not([hidden])":{"border-style":"solid"},".divide-dashed > :not([hidden]) ~ :not([hidden])":{"border-style":"dashed"},".divide-dotted > :not([hidden]) ~ :not([hidden])":{"border-style":"dotted"},".divide-double > :not([hidden]) ~ :not([hidden])":{"border-style":"double"},".divide-none > :not([hidden]) ~ :not([hidden])":{"border-style":"none"}})},divideColor:({matchUtilities:i,theme:e,corePlugins:t})=>{i({divide:r=>t("divideOpacity")?{["& > :not([hidden]) ~ :not([hidden])"]:K({color:r,property:"border-color",variable:"--tw-divide-opacity"})}:{["& > :not([hidden]) ~ :not([hidden])"]:{"border-color":z(r)}}},{values:(({DEFAULT:r,...s})=>s)(H(e("divideColor"))),type:"color"})},divideOpacity:({matchUtilities:i,theme:e})=>{i({"divide-opacity":t=>({["& > :not([hidden]) ~ :not([hidden])"]:{"--tw-divide-opacity":t}})},{values:e("divideOpacity")})},placeSelf:({addUtilities:i})=>{i({".place-self-auto":{"place-self":"auto"},".place-self-start":{"place-self":"start"},".place-self-end":{"place-self":"end"},".place-self-center":{"place-self":"center"},".place-self-stretch":{"place-self":"stretch"}})},alignSelf:({addUtilities:i})=>{i({".self-auto":{"align-self":"auto"},".self-start":{"align-self":"flex-start"},".self-end":{"align-self":"flex-end"},".self-center":{"align-self":"center"},".self-stretch":{"align-self":"stretch"},".self-baseline":{"align-self":"baseline"}})},justifySelf:({addUtilities:i})=>{i({".justify-self-auto":{"justify-self":"auto"},".justify-self-start":{"justify-self":"start"},".justify-self-end":{"justify-self":"end"},".justify-self-center":{"justify-self":"center"},".justify-self-stretch":{"justify-self":"stretch"}})},overflow:({addUtilities:i})=>{i({".overflow-auto":{overflow:"auto"},".overflow-hidden":{overflow:"hidden"},".overflow-clip":{overflow:"clip"},".overflow-visible":{overflow:"visible"},".overflow-scroll":{overflow:"scroll"},".overflow-x-auto":{"overflow-x":"auto"},".overflow-y-auto":{"overflow-y":"auto"},".overflow-x-hidden":{"overflow-x":"hidden"},".overflow-y-hidden":{"overflow-y":"hidden"},".overflow-x-clip":{"overflow-x":"clip"},".overflow-y-clip":{"overflow-y":"clip"},".overflow-x-visible":{"overflow-x":"visible"},".overflow-y-visible":{"overflow-y":"visible"},".overflow-x-scroll":{"overflow-x":"scroll"},".overflow-y-scroll":{"overflow-y":"scroll"}})},overscrollBehavior:({addUtilities:i})=>{i({".overscroll-auto":{"overscroll-behavior":"auto"},".overscroll-contain":{"overscroll-behavior":"contain"},".overscroll-none":{"overscroll-behavior":"none"},".overscroll-y-auto":{"overscroll-behavior-y":"auto"},".overscroll-y-contain":{"overscroll-behavior-y":"contain"},".overscroll-y-none":{"overscroll-behavior-y":"none"},".overscroll-x-auto":{"overscroll-behavior-x":"auto"},".overscroll-x-contain":{"overscroll-behavior-x":"contain"},".overscroll-x-none":{"overscroll-behavior-x":"none"}})},scrollBehavior:({addUtilities:i})=>{i({".scroll-auto":{"scroll-behavior":"auto"},".scroll-smooth":{"scroll-behavior":"smooth"}})},textOverflow:({addUtilities:i})=>{i({".truncate":{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},".overflow-ellipsis":{"text-overflow":"ellipsis"},".text-ellipsis":{"text-overflow":"ellipsis"},".text-clip":{"text-overflow":"clip"}})},whitespace:({addUtilities:i})=>{i({".whitespace-normal":{"white-space":"normal"},".whitespace-nowrap":{"white-space":"nowrap"},".whitespace-pre":{"white-space":"pre"},".whitespace-pre-line":{"white-space":"pre-line"},".whitespace-pre-wrap":{"white-space":"pre-wrap"}})},wordBreak:({addUtilities:i})=>{i({".break-normal":{"overflow-wrap":"normal","word-break":"normal"},".break-words":{"overflow-wrap":"break-word"},".break-all":{"word-break":"break-all"}})},borderRadius:E("borderRadius",[["rounded",["border-radius"]],[["rounded-t",["border-top-left-radius","border-top-right-radius"]],["rounded-r",["border-top-right-radius","border-bottom-right-radius"]],["rounded-b",["border-bottom-right-radius","border-bottom-left-radius"]],["rounded-l",["border-top-left-radius","border-bottom-left-radius"]]],[["rounded-tl",["border-top-left-radius"]],["rounded-tr",["border-top-right-radius"]],["rounded-br",["border-bottom-right-radius"]],["rounded-bl",["border-bottom-left-radius"]]]]),borderWidth:E("borderWidth",[["border",[["@defaults border-width",{}],"border-width"]],[["border-x",[["@defaults border-width",{}],"border-left-width","border-right-width"]],["border-y",[["@defaults border-width",{}],"border-top-width","border-bottom-width"]]],[["border-t",[["@defaults border-width",{}],"border-top-width"]],["border-r",[["@defaults border-width",{}],"border-right-width"]],["border-b",[["@defaults border-width",{}],"border-bottom-width"]],["border-l",[["@defaults border-width",{}],"border-left-width"]]]],{type:["line-width","length"]}),borderStyle:({addUtilities:i})=>{i({".border-solid":{"border-style":"solid"},".border-dashed":{"border-style":"dashed"},".border-dotted":{"border-style":"dotted"},".border-double":{"border-style":"double"},".border-hidden":{"border-style":"hidden"},".border-none":{"border-style":"none"}})},borderColor:({matchUtilities:i,theme:e,corePlugins:t})=>{i({border:r=>t("borderOpacity")?K({color:r,property:"border-color",variable:"--tw-border-opacity"}):{"border-color":z(r)}},{values:(({DEFAULT:r,...s})=>s)(H(e("borderColor"))),type:["color"]}),i({"border-x":r=>t("borderOpacity")?K({color:r,property:["border-left-color","border-right-color"],variable:"--tw-border-opacity"}):{"border-left-color":z(r),"border-right-color":z(r)},"border-y":r=>t("borderOpacity")?K({color:r,property:["border-top-color","border-bottom-color"],variable:"--tw-border-opacity"}):{"border-top-color":z(r),"border-bottom-color":z(r)}},{values:(({DEFAULT:r,...s})=>s)(H(e("borderColor"))),type:"color"}),i({"border-t":r=>t("borderOpacity")?K({color:r,property:"border-top-color",variable:"--tw-border-opacity"}):{"border-top-color":z(r)},"border-r":r=>t("borderOpacity")?K({color:r,property:"border-right-color",variable:"--tw-border-opacity"}):{"border-right-color":z(r)},"border-b":r=>t("borderOpacity")?K({color:r,property:"border-bottom-color",variable:"--tw-border-opacity"}):{"border-bottom-color":z(r)},"border-l":r=>t("borderOpacity")?K({color:r,property:"border-left-color",variable:"--tw-border-opacity"}):{"border-left-color":z(r)}},{values:(({DEFAULT:r,...s})=>s)(H(e("borderColor"))),type:"color"})},borderOpacity:E("borderOpacity",[["border-opacity",["--tw-border-opacity"]]]),backgroundColor:({matchUtilities:i,theme:e,corePlugins:t})=>{i({bg:r=>t("backgroundOpacity")?K({color:r,property:"background-color",variable:"--tw-bg-opacity"}):{"background-color":z(r)}},{values:H(e("backgroundColor")),type:"color"})},backgroundOpacity:E("backgroundOpacity",[["bg-opacity",["--tw-bg-opacity"]]]),backgroundImage:E("backgroundImage",[["bg",["background-image"]]],{type:["lookup","image","url"]}),gradientColorStops:(()=>{function i(e){return gt(e,0,"rgb(255 255 255 / 0)")}return function({matchUtilities:e,theme:t}){let r={values:H(t("gradientColorStops")),type:["color","any"]};e({from:s=>{let n=i(s);return{"--tw-gradient-from":z(s,"from"),"--tw-gradient-stops":`var(--tw-gradient-from), var(--tw-gradient-to, ${n})`}}},r),e({via:s=>{let n=i(s);return{"--tw-gradient-stops":`var(--tw-gradient-from), ${z(s,"via")}, var(--tw-gradient-to, ${n})`}}},r),e({to:s=>({"--tw-gradient-to":z(s,"to")})},r)}})(),boxDecorationBreak:({addUtilities:i})=>{i({".decoration-slice":{"box-decoration-break":"slice"},".decoration-clone":{"box-decoration-break":"clone"},".box-decoration-slice":{"box-decoration-break":"slice"},".box-decoration-clone":{"box-decoration-break":"clone"}})},backgroundSize:E("backgroundSize",[["bg",["background-size"]]],{type:["lookup","length","percentage"]}),backgroundAttachment:({addUtilities:i})=>{i({".bg-fixed":{"background-attachment":"fixed"},".bg-local":{"background-attachment":"local"},".bg-scroll":{"background-attachment":"scroll"}})},backgroundClip:({addUtilities:i})=>{i({".bg-clip-border":{"background-clip":"border-box"},".bg-clip-padding":{"background-clip":"padding-box"},".bg-clip-content":{"background-clip":"content-box"},".bg-clip-text":{"background-clip":"text"}})},backgroundPosition:E("backgroundPosition",[["bg",["background-position"]]],{type:["lookup","position"]}),backgroundRepeat:({addUtilities:i})=>{i({".bg-repeat":{"background-repeat":"repeat"},".bg-no-repeat":{"background-repeat":"no-repeat"},".bg-repeat-x":{"background-repeat":"repeat-x"},".bg-repeat-y":{"background-repeat":"repeat-y"},".bg-repeat-round":{"background-repeat":"round"},".bg-repeat-space":{"background-repeat":"space"}})},backgroundOrigin:({addUtilities:i})=>{i({".bg-origin-border":{"background-origin":"border-box"},".bg-origin-padding":{"background-origin":"padding-box"},".bg-origin-content":{"background-origin":"content-box"}})},fill:({matchUtilities:i,theme:e})=>{i({fill:t=>({fill:z(t)})},{values:H(e("fill")),type:["color","any"]})},stroke:({matchUtilities:i,theme:e})=>{i({stroke:t=>({stroke:z(t)})},{values:H(e("stroke")),type:["color","url"]})},strokeWidth:E("strokeWidth",[["stroke",["stroke-width"]]],{type:["length","number","percentage"]}),objectFit:({addUtilities:i})=>{i({".object-contain":{"object-fit":"contain"},".object-cover":{"object-fit":"cover"},".object-fill":{"object-fit":"fill"},".object-none":{"object-fit":"none"},".object-scale-down":{"object-fit":"scale-down"}})},objectPosition:E("objectPosition",[["object",["object-position"]]]),padding:E("padding",[["p",["padding"]],[["px",["padding-left","padding-right"]],["py",["padding-top","padding-bottom"]]],[["pt",["padding-top"]],["pr",["padding-right"]],["pb",["padding-bottom"]],["pl",["padding-left"]]]]),textAlign:({addUtilities:i})=>{i({".text-left":{"text-align":"left"},".text-center":{"text-align":"center"},".text-right":{"text-align":"right"},".text-justify":{"text-align":"justify"}})},textIndent:E("textIndent",[["indent",["text-indent"]]],{supportsNegativeValues:!0}),verticalAlign:({addUtilities:i,matchUtilities:e})=>{i({".align-baseline":{"vertical-align":"baseline"},".align-top":{"vertical-align":"top"},".align-middle":{"vertical-align":"middle"},".align-bottom":{"vertical-align":"bottom"},".align-text-top":{"vertical-align":"text-top"},".align-text-bottom":{"vertical-align":"text-bottom"},".align-sub":{"vertical-align":"sub"},".align-super":{"vertical-align":"super"}}),e({align:t=>({"vertical-align":t})})},fontFamily:E("fontFamily",[["font",["fontFamily"]]],{type:["lookup","generic-name","family-name"]}),fontSize:({matchUtilities:i,theme:e})=>{i({text:t=>{let[r,s]=Array.isArray(t)?t:[t],{lineHeight:n,letterSpacing:a}=Ae(s)?s:{lineHeight:s};return{"font-size":r,...n===void 0?{}:{"line-height":n},...a===void 0?{}:{"letter-spacing":a}}}},{values:e("fontSize"),type:["absolute-size","relative-size","length","percentage"]})},fontWeight:E("fontWeight",[["font",["fontWeight"]]],{type:["lookup","number"]}),textTransform:({addUtilities:i})=>{i({".uppercase":{"text-transform":"uppercase"},".lowercase":{"text-transform":"lowercase"},".capitalize":{"text-transform":"capitalize"},".normal-case":{"text-transform":"none"}})},fontStyle:({addUtilities:i})=>{i({".italic":{"font-style":"italic"},".not-italic":{"font-style":"normal"}})},fontVariantNumeric:({addDefaults:i,addUtilities:e})=>{let t="var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)";i("font-variant-numeric",{"--tw-ordinal":" ","--tw-slashed-zero":" ","--tw-numeric-figure":" ","--tw-numeric-spacing":" ","--tw-numeric-fraction":" "}),e({".normal-nums":{"font-variant-numeric":"normal"},".ordinal":{"@defaults font-variant-numeric":{},"--tw-ordinal":"ordinal","font-variant-numeric":t},".slashed-zero":{"@defaults font-variant-numeric":{},"--tw-slashed-zero":"slashed-zero","font-variant-numeric":t},".lining-nums":{"@defaults font-variant-numeric":{},"--tw-numeric-figure":"lining-nums","font-variant-numeric":t},".oldstyle-nums":{"@defaults font-variant-numeric":{},"--tw-numeric-figure":"oldstyle-nums","font-variant-numeric":t},".proportional-nums":{"@defaults font-variant-numeric":{},"--tw-numeric-spacing":"proportional-nums","font-variant-numeric":t},".tabular-nums":{"@defaults font-variant-numeric":{},"--tw-numeric-spacing":"tabular-nums","font-variant-numeric":t},".diagonal-fractions":{"@defaults font-variant-numeric":{},"--tw-numeric-fraction":"diagonal-fractions","font-variant-numeric":t},".stacked-fractions":{"@defaults font-variant-numeric":{},"--tw-numeric-fraction":"stacked-fractions","font-variant-numeric":t}})},lineHeight:E("lineHeight",[["leading",["lineHeight"]]]),letterSpacing:E("letterSpacing",[["tracking",["letterSpacing"]]],{supportsNegativeValues:!0}),textColor:({matchUtilities:i,theme:e,corePlugins:t})=>{i({text:r=>t("textOpacity")?K({color:r,property:"color",variable:"--tw-text-opacity"}):{color:z(r)}},{values:H(e("textColor")),type:"color"})},textOpacity:E("textOpacity",[["text-opacity",["--tw-text-opacity"]]]),textDecoration:({addUtilities:i})=>{i({".underline":{"text-decoration-line":"underline"},".overline":{"text-decoration-line":"overline"},".line-through":{"text-decoration-line":"line-through"},".no-underline":{"text-decoration-line":"none"}})},textDecorationColor:({matchUtilities:i,theme:e})=>{i({decoration:t=>({"text-decoration-color":z(t)})},{values:H(e("textDecorationColor")),type:["color"]})},textDecorationStyle:({addUtilities:i})=>{i({".decoration-solid":{"text-decoration-style":"solid"},".decoration-double":{"text-decoration-style":"double"},".decoration-dotted":{"text-decoration-style":"dotted"},".decoration-dashed":{"text-decoration-style":"dashed"},".decoration-wavy":{"text-decoration-style":"wavy"}})},textDecorationThickness:E("textDecorationThickness",[["decoration",["text-decoration-thickness"]]],{type:["length","percentage"]}),textUnderlineOffset:E("textUnderlineOffset",[["underline-offset",["text-underline-offset"]]],{type:["length","percentage"]}),fontSmoothing:({addUtilities:i})=>{i({".antialiased":{"-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale"},".subpixel-antialiased":{"-webkit-font-smoothing":"auto","-moz-osx-font-smoothing":"auto"}})},placeholderColor:({matchUtilities:i,theme:e,corePlugins:t})=>{i({placeholder:r=>t("placeholderOpacity")?{"&::placeholder":K({color:r,property:"color",variable:"--tw-placeholder-opacity"})}:{"&::placeholder":{color:z(r)}}},{values:H(e("placeholderColor")),type:["color","any"]})},placeholderOpacity:({matchUtilities:i,theme:e})=>{i({"placeholder-opacity":t=>({["&::placeholder"]:{"--tw-placeholder-opacity":t}})},{values:e("placeholderOpacity")})},caretColor:({matchUtilities:i,theme:e})=>{i({caret:t=>({"caret-color":z(t)})},{values:H(e("caretColor")),type:["color","any"]})},accentColor:({matchUtilities:i,theme:e})=>{i({accent:t=>({"accent-color":z(t)})},{values:H(e("accentColor")),type:["color","any"]})},opacity:E("opacity",[["opacity",["opacity"]]]),backgroundBlendMode:({addUtilities:i})=>{i({".bg-blend-normal":{"background-blend-mode":"normal"},".bg-blend-multiply":{"background-blend-mode":"multiply"},".bg-blend-screen":{"background-blend-mode":"screen"},".bg-blend-overlay":{"background-blend-mode":"overlay"},".bg-blend-darken":{"background-blend-mode":"darken"},".bg-blend-lighten":{"background-blend-mode":"lighten"},".bg-blend-color-dodge":{"background-blend-mode":"color-dodge"},".bg-blend-color-burn":{"background-blend-mode":"color-burn"},".bg-blend-hard-light":{"background-blend-mode":"hard-light"},".bg-blend-soft-light":{"background-blend-mode":"soft-light"},".bg-blend-difference":{"background-blend-mode":"difference"},".bg-blend-exclusion":{"background-blend-mode":"exclusion"},".bg-blend-hue":{"background-blend-mode":"hue"},".bg-blend-saturation":{"background-blend-mode":"saturation"},".bg-blend-color":{"background-blend-mode":"color"},".bg-blend-luminosity":{"background-blend-mode":"luminosity"}})},mixBlendMode:({addUtilities:i})=>{i({".mix-blend-normal":{"mix-blend-mode":"normal"},".mix-blend-multiply":{"mix-blend-mode":"multiply"},".mix-blend-screen":{"mix-blend-mode":"screen"},".mix-blend-overlay":{"mix-blend-mode":"overlay"},".mix-blend-darken":{"mix-blend-mode":"darken"},".mix-blend-lighten":{"mix-blend-mode":"lighten"},".mix-blend-color-dodge":{"mix-blend-mode":"color-dodge"},".mix-blend-color-burn":{"mix-blend-mode":"color-burn"},".mix-blend-hard-light":{"mix-blend-mode":"hard-light"},".mix-blend-soft-light":{"mix-blend-mode":"soft-light"},".mix-blend-difference":{"mix-blend-mode":"difference"},".mix-blend-exclusion":{"mix-blend-mode":"exclusion"},".mix-blend-hue":{"mix-blend-mode":"hue"},".mix-blend-saturation":{"mix-blend-mode":"saturation"},".mix-blend-color":{"mix-blend-mode":"color"},".mix-blend-luminosity":{"mix-blend-mode":"luminosity"}})},boxShadow:(()=>{let i=Pe("boxShadow"),e=["var(--tw-ring-offset-shadow, 0 0 #0000)","var(--tw-ring-shadow, 0 0 #0000)","var(--tw-shadow)"].join(", ");return function({matchUtilities:t,addDefaults:r,theme:s}){r(" box-shadow",{"--tw-ring-offset-shadow":"0 0 #0000","--tw-ring-shadow":"0 0 #0000","--tw-shadow":"0 0 #0000","--tw-shadow-colored":"0 0 #0000"}),t({shadow:n=>{n=i(n);let a=Mi(n);for(let o of a)!o.valid||(o.color="var(--tw-shadow-color)");return{"@defaults box-shadow":{},"--tw-shadow":n==="none"?"0 0 #0000":n,"--tw-shadow-colored":n==="none"?"0 0 #0000":Ic(a),"box-shadow":e}}},{values:s("boxShadow"),type:["shadow"]})}})(),boxShadowColor:({matchUtilities:i,theme:e})=>{i({shadow:t=>({"--tw-shadow-color":z(t),"--tw-shadow":"var(--tw-shadow-colored)"})},{values:H(e("boxShadowColor")),type:["color"]})},outlineStyle:({addUtilities:i})=>{i({".outline-none":{outline:"2px solid transparent","outline-offset":"2px"},".outline":{"outline-style":"solid"},".outline-dashed":{"outline-style":"dashed"},".outline-dotted":{"outline-style":"dotted"},".outline-double":{"outline-style":"double"},".outline-hidden":{"outline-style":"hidden"}})},outlineWidth:E("outlineWidth",[["outline",["outline-width"]]],{type:["length","number","percentage"]}),outlineOffset:E("outlineOffset",[["outline-offset",["outline-offset"]]],{type:["length","number","percentage"]}),outlineColor:({matchUtilities:i,theme:e})=>{i({outline:t=>({"outline-color":z(t)})},{values:H(e("outlineColor")),type:["color"]})},ringWidth:({matchUtilities:i,addDefaults:e,addUtilities:t,theme:r})=>{let s=r("ringOpacity.DEFAULT","0.5"),n=gt(r("ringColor.DEFAULT"),s,`rgb(147 197 253 / ${s})`);e("ring-width",{"--tw-ring-inset":" ","--tw-ring-offset-width":r("ringOffsetWidth.DEFAULT","0px"),"--tw-ring-offset-color":r("ringOffsetColor.DEFAULT","#fff"),"--tw-ring-color":n,"--tw-ring-offset-shadow":"0 0 #0000","--tw-ring-shadow":"0 0 #0000","--tw-shadow":"0 0 #0000","--tw-shadow-colored":"0 0 #0000"}),i({ring:a=>({"@defaults ring-width":{},"--tw-ring-offset-shadow":"var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)","--tw-ring-shadow":`var(--tw-ring-inset) 0 0 0 calc(${a} + var(--tw-ring-offset-width)) var(--tw-ring-color)`,"box-shadow":["var(--tw-ring-offset-shadow)","var(--tw-ring-shadow)","var(--tw-shadow, 0 0 #0000)"].join(", ")})},{values:r("ringWidth"),type:"length"}),t({".ring-inset":{"@defaults ring-width":{},"--tw-ring-inset":"inset"}})},ringColor:({matchUtilities:i,theme:e})=>{i({ring:t=>K({color:t,property:"--tw-ring-color",variable:"--tw-ring-opacity"})},{values:Object.fromEntries(Object.entries(H(e("ringColor"))).filter(([t])=>t!=="DEFAULT")),type:"color"})},ringOpacity:E("ringOpacity",[["ring-opacity",["--tw-ring-opacity"]]],{filterDefault:!0}),ringOffsetWidth:E("ringOffsetWidth",[["ring-offset",["--tw-ring-offset-width"]]],{type:"length"}),ringOffsetColor:({matchUtilities:i,theme:e})=>{i({"ring-offset":t=>({"--tw-ring-offset-color":z(t)})},{values:H(e("ringOffsetColor")),type:"color"})},blur:({matchUtilities:i,theme:e})=>{i({blur:t=>({"--tw-blur":`blur(${t})`,"@defaults filter":{},filter:xe})},{values:e("blur")})},brightness:({matchUtilities:i,theme:e})=>{i({brightness:t=>({"--tw-brightness":`brightness(${t})`,"@defaults filter":{},filter:xe})},{values:e("brightness")})},contrast:({matchUtilities:i,theme:e})=>{i({contrast:t=>({"--tw-contrast":`contrast(${t})`,"@defaults filter":{},filter:xe})},{values:e("contrast")})},dropShadow:({matchUtilities:i,theme:e})=>{i({"drop-shadow":t=>({"--tw-drop-shadow":Array.isArray(t)?t.map(r=>`drop-shadow(${r})`).join(" "):`drop-shadow(${t})`,"@defaults filter":{},filter:xe})},{values:e("dropShadow")})},grayscale:({matchUtilities:i,theme:e})=>{i({grayscale:t=>({"--tw-grayscale":`grayscale(${t})`,"@defaults filter":{},filter:xe})},{values:e("grayscale")})},hueRotate:({matchUtilities:i,theme:e})=>{i({"hue-rotate":t=>({"--tw-hue-rotate":`hue-rotate(${t})`,"@defaults filter":{},filter:xe})},{values:e("hueRotate"),supportsNegativeValues:!0})},invert:({matchUtilities:i,theme:e})=>{i({invert:t=>({"--tw-invert":`invert(${t})`,"@defaults filter":{},filter:xe})},{values:e("invert")})},saturate:({matchUtilities:i,theme:e})=>{i({saturate:t=>({"--tw-saturate":`saturate(${t})`,"@defaults filter":{},filter:xe})},{values:e("saturate")})},sepia:({matchUtilities:i,theme:e})=>{i({sepia:t=>({"--tw-sepia":`sepia(${t})`,"@defaults filter":{},filter:xe})},{values:e("sepia")})},filter:({addDefaults:i,addUtilities:e})=>{i("filter",{"--tw-blur":" ","--tw-brightness":" ","--tw-contrast":" ","--tw-grayscale":" ","--tw-hue-rotate":" ","--tw-invert":" ","--tw-saturate":" ","--tw-sepia":" ","--tw-drop-shadow":" "}),e({".filter":{"@defaults filter":{},filter:xe},".filter-none":{filter:"none"}})},backdropBlur:({matchUtilities:i,theme:e})=>{i({"backdrop-blur":t=>({"--tw-backdrop-blur":`blur(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropBlur")})},backdropBrightness:({matchUtilities:i,theme:e})=>{i({"backdrop-brightness":t=>({"--tw-backdrop-brightness":`brightness(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropBrightness")})},backdropContrast:({matchUtilities:i,theme:e})=>{i({"backdrop-contrast":t=>({"--tw-backdrop-contrast":`contrast(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropContrast")})},backdropGrayscale:({matchUtilities:i,theme:e})=>{i({"backdrop-grayscale":t=>({"--tw-backdrop-grayscale":`grayscale(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropGrayscale")})},backdropHueRotate:({matchUtilities:i,theme:e})=>{i({"backdrop-hue-rotate":t=>({"--tw-backdrop-hue-rotate":`hue-rotate(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropHueRotate"),supportsNegativeValues:!0})},backdropInvert:({matchUtilities:i,theme:e})=>{i({"backdrop-invert":t=>({"--tw-backdrop-invert":`invert(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropInvert")})},backdropOpacity:({matchUtilities:i,theme:e})=>{i({"backdrop-opacity":t=>({"--tw-backdrop-opacity":`opacity(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropOpacity")})},backdropSaturate:({matchUtilities:i,theme:e})=>{i({"backdrop-saturate":t=>({"--tw-backdrop-saturate":`saturate(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropSaturate")})},backdropSepia:({matchUtilities:i,theme:e})=>{i({"backdrop-sepia":t=>({"--tw-backdrop-sepia":`sepia(${t})`,"@defaults backdrop-filter":{},"backdrop-filter":ke})},{values:e("backdropSepia")})},backdropFilter:({addDefaults:i,addUtilities:e})=>{i("backdrop-filter",{"--tw-backdrop-blur":" ","--tw-backdrop-brightness":" ","--tw-backdrop-contrast":" ","--tw-backdrop-grayscale":" ","--tw-backdrop-hue-rotate":" ","--tw-backdrop-invert":" ","--tw-backdrop-opacity":" ","--tw-backdrop-saturate":" ","--tw-backdrop-sepia":" "}),e({".backdrop-filter":{"@defaults backdrop-filter":{},"backdrop-filter":ke},".backdrop-filter-none":{"backdrop-filter":"none"}})},transitionProperty:({matchUtilities:i,theme:e})=>{let t=e("transitionTimingFunction.DEFAULT"),r=e("transitionDuration.DEFAULT");i({transition:s=>({"transition-property":s,...s==="none"?{}:{"transition-timing-function":t,"transition-duration":r}})},{values:e("transitionProperty")})},transitionDelay:E("transitionDelay",[["delay",["transitionDelay"]]]),transitionDuration:E("transitionDuration",[["duration",["transitionDuration"]]],{filterDefault:!0}),transitionTimingFunction:E("transitionTimingFunction",[["ease",["transitionTimingFunction"]]],{filterDefault:!0}),willChange:E("willChange",[["will-change",["will-change"]]]),content:E("content",[["content",["--tw-content",["content","var(--tw-content)"]]]])}});function yt(i){let e=[],t=!1;for(let r=0;r0)}var lp,up,H1,ta=S(()=>{l();lp=new Map([["{","}"],["[","]"],["(",")"]]),up=new Map(Array.from(lp.entries()).map(([i,e])=>[e,i])),H1=new Set(['"',"'","`"])});function pp(i){if(i.includes("{")){if(!Q1(i))throw new Error("Your { and } are unbalanced.");return i.split(/{(.*)}/gim).flatMap(e=>pp(e)).filter(Boolean)}return[i.trim()]}function Q1(i){let e=0;for(let t of i)if(t==="{")e++;else if(t==="}"&&--e<0)return!1;return e===0}function J1(i,e,{before:t=[]}={}){if(t=[].concat(t),t.length<=0){i.push(e);return}let r=i.length-1;for(let s of t){let n=i.indexOf(s);n!==-1&&(r=Math.min(r,n))}i.splice(r,0,e)}function dp(i){return Array.isArray(i)?i.flatMap(e=>!Array.isArray(e)&&!Ae(e)?e:ht(e)):dp([i])}function hp(i){return(0,cp.default)(t=>{let r=[];return t.walkClasses(s=>{r.push(s.value)}),r}).transformSync(i)}function X1(i,e={containsNonOnDemandable:!1},t=0){let r=[];if(i.type==="rule")for(let s of i.selectors){let n=hp(s);n.length===0&&(e.containsNonOnDemandable=!0);for(let a of n)r.push(a)}else i.type==="atrule"&&i.walkRules(s=>{for(let n of s.selectors.flatMap(a=>hp(a,e,t+1)))r.push(n)});return t===0?[e.containsNonOnDemandable||r.length===0,r]:r}function Ar(i){return dp(i).flatMap(e=>{let t=new Map,[r,s]=X1(e);return r&&s.unshift("*"),s.map(n=>(t.has(e)||t.set(e,e),[n,t.get(e)]))})}function K1(i,e,{variantList:t,variantMap:r,offsets:s,classList:n}){function a(c,u){return c?(0,fp.default)(i,c,u):i}function o(c){return mt(i.prefix,c)}function f(c,u){return c==="*"?"*":u.respectPrefix?e.tailwindConfig.prefix+c:c}return{addVariant(c,u,p={}){u=[].concat(u).map(d=>{if(typeof d!="string")return({modifySelectors:y,container:x,separator:w})=>d({modifySelectors:y,container:x,separator:w});d=d.replace(/\n+/g,"").replace(/\s{1,}/g," ").trim();let g=pp(d).map(y=>{if(!y.startsWith("@"))return({format:v})=>v(y);let[,x,w]=/@(.*?) (.*)/g.exec(y);return({wrap:v})=>v(F.atRule({name:x,params:w}))}).reverse();return y=>{for(let x of g)x(y)}}),J1(t,c,p),r.set(c,u)},postcss:F,prefix:o,e:ce,config:a,theme(c,u){let[p,...d]=Ge(c),g=a(["theme",p,...d],u);return Pe(p)(g)},corePlugins:c=>Array.isArray(i.corePlugins)?i.corePlugins.includes(c):a(["corePlugins",c],!0),variants:()=>[],addUserCss(c){for(let[u,p]of Ar(c)){let d=s.user++;e.candidateRuleMap.has(u)||e.candidateRuleMap.set(u,[]),e.candidateRuleMap.get(u).push([{sort:d,layer:"user"},p])}},addBase(c){for(let[u,p]of Ar(c)){let d=f(u,{}),g=s.base++;e.candidateRuleMap.has(d)||e.candidateRuleMap.set(d,[]),e.candidateRuleMap.get(d).push([{sort:g,layer:"base"},p])}},addDefaults(c,u){let p={[`@defaults ${c}`]:u};for(let[d,g]of Ar(p)){let y=f(d,{});e.candidateRuleMap.has(y)||e.candidateRuleMap.set(y,[]),e.candidateRuleMap.get(y).push([{sort:s.base++,layer:"defaults"},g])}},addComponents(c,u){u=Object.assign({},{respectPrefix:!0,respectImportant:!1},Array.isArray(u)?{}:u);for(let[d,g]of Ar(c)){let y=f(d,u);n.add(y),e.candidateRuleMap.has(y)||e.candidateRuleMap.set(y,[]),e.candidateRuleMap.get(y).push([{sort:s.components++,layer:"components",options:u},g])}},addUtilities(c,u){u=Object.assign({},{respectPrefix:!0,respectImportant:!0},Array.isArray(u)?{}:u);for(let[d,g]of Ar(c)){let y=f(d,u);n.add(y),e.candidateRuleMap.has(y)||e.candidateRuleMap.set(y,[]),e.candidateRuleMap.get(y).push([{sort:s.utilities++,layer:"utilities",options:u},g])}},matchUtilities:function(c,u){u={...{respectPrefix:!0,respectImportant:!0},...u};let d=s.utilities++;for(let g in c){let w=function(C,{isOnlyPlugin:D}){let{type:I="any"}=u;I=[].concat(I);let[q,G]=Kn(I,C,u,i);return q===void 0?[]:!I.includes(G)&&!D?[]:yt(q)?[].concat(x(q)).filter(Boolean).map(Y=>({[Ii(g,C)]:Y})):[]},y=f(g,u),x=c[g];n.add([y,u]);let v=[{sort:d,layer:"utilities",options:u},w];e.candidateRuleMap.has(y)||e.candidateRuleMap.set(y,[]),e.candidateRuleMap.get(y).push(v)}},matchComponents:function(c,u){u={...{respectPrefix:!0,respectImportant:!1},...u};let d=s.components++;for(let g in c){let w=function(C,{isOnlyPlugin:D}){let{type:I="any"}=u;I=[].concat(I);let[q,G]=Kn(I,C,u,i);if(q===void 0)return[];if(!I.includes(G))if(D)W.warn([`Unnecessary typehint \`${G}\` in \`${g}-${C}\`.`,`You can safely update it to \`${g}-${C.replace(G+":","")}\`.`]);else return[];return yt(q)?[].concat(x(q)).filter(Boolean).map(Y=>({[Ii(g,C)]:Y})):[]},y=f(g,u),x=c[g];n.add([y,u]);let v=[{sort:d,layer:"components",options:u},w];e.candidateRuleMap.has(y)||e.candidateRuleMap.set(y,[]),e.candidateRuleMap.get(y).push(v)}}}}function zi(i){return ra.has(i)||ra.set(i,new Map),ra.get(i)}function mp(i,e){let t=!1;for(let r of i){if(!r)continue;let s=ps.parse(r),n=s.hash?s.href.replace(s.hash,""):s.href;n=s.search?n.replace(s.search,""):n;let a=ge.statSync(decodeURIComponent(n),{throwIfNoEntry:!1})?.mtimeMs;!a||((!e.has(r)||a>e.get(r))&&(t=!0),e.set(r,a))}return t}function gp(i){i.walkAtRules(e=>{["responsive","variants"].includes(e.name)&&(gp(e),e.before(e.nodes),e.remove())})}function Z1(i){let e=[];return i.each(t=>{t.type==="atrule"&&["responsive","variants"].includes(t.name)&&(t.name="layer",t.params="utilities")}),i.walkAtRules("layer",t=>{if(gp(t),t.params==="base"){for(let r of t.nodes)e.push(function({addBase:s}){s(r,{respectPrefix:!1})});t.remove()}else if(t.params==="components"){for(let r of t.nodes)e.push(function({addComponents:s}){s(r,{respectPrefix:!1})});t.remove()}else if(t.params==="utilities"){for(let r of t.nodes)e.push(function({addUtilities:s}){s(r,{respectPrefix:!1})});t.remove()}}),i.walkRules(t=>{e.push(function({addUserCss:r}){r(t,{respectPrefix:!1})})}),e}function ek(i,e){let t=Object.entries({...ve,...ap}).map(([o,f])=>i.tailwindConfig.corePlugins.includes(o)?f:null).filter(Boolean),r=i.tailwindConfig.plugins.map(o=>(o.__isOptionsFunction&&(o=o()),typeof o=="function"?o:o.handler)),s=Z1(e),n=[ve.pseudoElementVariants,ve.pseudoClassVariants],a=[ve.directionVariants,ve.reducedMotionVariants,ve.darkVariants,ve.printVariant,ve.screenVariants,ve.orientationVariants];return[...t,...n,...r,...a,...s]}function tk(i,e){let t=[],r=new Map,s={defaults:0n,base:0n,components:0n,utilities:0n,user:0n},n=new Set,a=K1(e.tailwindConfig,e,{variantList:t,variantMap:r,offsets:s,classList:n});for(let p of i)if(Array.isArray(p))for(let d of p)d(a);else p?.(a);let o=(p=>p.reduce((d,g)=>g>d?g:d))([s.base,s.defaults,s.components,s.utilities,s.user]),f=BigInt(o.toString(2).length);e.arbitraryPropertiesSort=(1n<{let g=r.get(p).length,y=1n<Je(p-d))),e.minimumScreen=[...e.variantOrder.values()].shift();for(let[p,d]of r.entries()){let g=e.variantOrder.get(p);e.variantMap.set(p,d.map((y,x)=>[g<0){let p=[];for(let d of u){if(typeof d=="string"){e.changedContent.push({content:d,extension:"html"});continue}if(d instanceof RegExp){W.warn("root-regex",["Regular expressions in `safelist` work differently in Tailwind CSS v3.0.","Update your `safelist` configuration to eliminate this warning.","https://tailwindcss.com/docs/content-configuration#safelisting-classes"]);continue}p.push(d)}if(p.length>0){let d=new Map;for(let g of n){let y=Array.isArray(g)?(()=>{let[x,w]=g,v=Object.keys(w?.values??{}).map(C=>Sr(x,C));return w?.supportsNegativeValues&&(v=[...v,...v.map(C=>"-"+C)]),v})():[g];for(let x of y)for(let{pattern:w,variants:v=[]}of p)if(w.lastIndex=0,d.has(w)||d.set(w,0),!!w.test(x)){d.set(w,d.get(w)+1),e.changedContent.push({content:x,extension:"html"});for(let C of v)e.changedContent.push({content:C+e.tailwindConfig.separator+x,extension:"html"})}}for(let[g,y]of d.entries())y===0&&W.warn([`The safelist pattern \`${g}\` doesn't match any Tailwind CSS classes.`,"Fix this pattern or remove it from your `safelist` configuration.","https://tailwindcss.com/docs/content-configuration#safelisting-classes"])}}e.getClassList=function(){let p=[];for(let d of n)if(Array.isArray(d)){let[g,y]=d,x=[];for(let[w,v]of Object.entries(y?.values??{}))p.push(Sr(g,w)),y?.supportsNegativeValues&&Ve(v)&&x.push(Sr(g,`-${w}`));p.push(...x)}else p.push(d);return p}}function ia(i,e=[],t=F.root()){let r={disposables:[],ruleCache:new Set,classCache:new Map,applyClassCache:new Map,notClassCache:new Set,postCssNodeCache:new Map,candidateRuleMap:new Map,tailwindConfig:i,changedContent:e,variantMap:new Map,stylesheetCache:null},s=ek(r,t);return tk(s,r),r}function yp(i,e,t,r,s,n){let a=e.opts.from,o=r!==null;le.DEBUG&&console.log("Source path:",a);let f;if(o&&bt.has(a))f=bt.get(a);else if(Er.has(s)){let u=Er.get(s);Be.get(u).add(a),bt.set(a,u),f=u}if(f&&!mp([...n],zi(f)))return[f,!1];if(bt.has(a)){let u=bt.get(a);if(Be.has(u)&&(Be.get(u).delete(a),Be.get(u).size===0)){Be.delete(u);for(let[p,d]of Er)d===u&&Er.delete(p);for(let p of u.disposables.splice(0))p(u)}}le.DEBUG&&console.log("Setting up new context...");let c=ia(t,[],i);return mp([...n],zi(c)),Er.set(s,c),bt.set(a,c),Be.has(c)||Be.set(c,new Set),Be.get(c).add(a),[c,!0]}var fp,cp,ra,bt,Er,Be,sa=S(()=>{l();tt();ds();Me();fp=V(Ms()),cp=V(we());vr();Bn();Di();Bt();kr();zn();Zn();Fi();op();it();it();zr();Ce();Br();ta();ra=new WeakMap;bt=El,Er=Ol,Be=Hr});var bp,wp=S(()=>{l();bp=()=>!1});var vp,xp=S(()=>{l();vp=()=>""});function rk(i){let e=i,t=vp(i);return t!=="."&&(e=i.substr(t.length),e.charAt(0)==="/"&&(e=e.substr(1))),e.substr(0,2)==="./"&&(e=e.substr(2)),e.charAt(0)==="/"&&(e=e.substr(1)),{base:t,glob:e}}function na(i){if(i.startsWith("!"))return null;let e;if(bp(i)){let{base:t,glob:r}=rk(i);e={type:"dir-dependency",dir:ee.resolve(t),glob:r}}else e={type:"dependency",file:ee.resolve(i)};return e.type==="dir-dependency"&&h.env.ROLLUP_WATCH==="true"&&(e={type:"dependency",file:e.dir}),e}var kp=S(()=>{l();wp();xp();Ue()});function ik(i,e){if(aa.has(i))return aa.get(i);let t=e.content.files.filter(r=>typeof r=="string").map(r=>Ko(r));return aa.set(i,t).get(i)}function sk(i){let e=cs(i);if(e!==null){let[r,s,n,a]=_p.get(e)||[],o=rs(e).map(d=>d.file),f=!1,c=new Map;for(let d of o){let g=ge.statSync(d).mtimeMs;c.set(d,g),(!a||!a.has(d)||g>a.get(d))&&(f=!0)}if(!f)return[r,e,s,n];for(let d of o)delete Zi.cache[d];let u=$t(Zi(e)),p=Lr(u);return _p.set(e,[u,p,o,c]),[u,e,p,o]}let t=$t(i.config===void 0?i:i.config);return[t,null,Lr(t),[]]}function nk(i,e,t){let r=i.tailwindConfig.content.files.filter(s=>typeof s.raw=="string").map(({raw:s,extension:n="html"})=>({content:s,extension:n}));for(let s of ak(e,t)){let n=ge.readFileSync(s,"utf8"),a=ee.extname(s).slice(1);r.push({content:n,extension:a})}return r}function ak(i,e){let t=new Set;le.DEBUG&&console.time("Finding changed files");let r=Ho.sync(i);for(let s of r){let n=e.has(s)?e.get(s):-1/0,a=ge.statSync(s).mtimeMs;a>n&&(t.add(s),e.set(s,a))}return le.DEBUG&&console.timeEnd("Finding changed files"),t}function oa(i){return({tailwindDirectives:e,registerDependency:t,applyDirectives:r})=>(s,n)=>{let[a,o,f,c]=sk(i),u=new Set(c);if(e.size>0||r.size>0){u.add(n.opts.from);for(let g of n.messages)g.type==="dependency"&&u.add(g.file)}let[p]=yp(s,n,a,o,f,u),d=ik(p,a);if(e.size>0||r.size>0){let g=zi(p);for(let y of d){let x=na(y);x&&t(x)}for(let y of nk(p,d,g))p.changedContent.push(y)}for(let g of c)t({type:"dependency",file:g});return p}}var Sp,_p,aa,Cp=S(()=>{l();tt();Ue();Qo();Sp=V(es());Zo();rl();sl();fs();Al();it();sa();kp();_p=new Sp.default({maxSize:100}),aa=new WeakMap});function la(i){let e=new Set,t=new Set,r=new Set;if(i.walkAtRules(s=>{s.name==="apply"&&r.add(s),s.name==="import"&&(s.params==='"tailwindcss/base"'||s.params==="'tailwindcss/base'"?(s.name="tailwind",s.params="base"):s.params==='"tailwindcss/components"'||s.params==="'tailwindcss/components'"?(s.name="tailwind",s.params="components"):s.params==='"tailwindcss/utilities"'||s.params==="'tailwindcss/utilities'"?(s.name="tailwind",s.params="utilities"):(s.params==='"tailwindcss/screens"'||s.params==="'tailwindcss/screens'"||s.params==='"tailwindcss/variants"'||s.params==="'tailwindcss/variants'")&&(s.name="tailwind",s.params="variants")),s.name==="tailwind"&&(s.params==="screens"&&(s.params="variants"),e.add(s.params)),["layer","responsive","variants"].includes(s.name)&&(["responsive","variants"].includes(s.name)&&W.warn(`${s.name}-at-rule-deprecated`,[`The \`@${s.name}\` directive has been deprecated in Tailwind CSS v3.0.`,"Use `@layer utilities` or `@layer components` instead.","https://tailwindcss.com/docs/upgrade-guide#replace-variants-with-layer"]),t.add(s))}),!e.has("base")||!e.has("components")||!e.has("utilities")){for(let s of t)if(s.name==="layer"&&["base","components","utilities"].includes(s.params)){if(!e.has(s.params))throw s.error(`\`@layer ${s.params}\` is used but no matching \`@tailwind ${s.params}\` directive is present.`)}else if(s.name==="responsive"){if(!e.has("utilities"))throw s.error("`@responsive` is used but `@tailwind utilities` is missing.")}else if(s.name==="variants"&&!e.has("utilities"))throw s.error("`@variants` is used but `@tailwind utilities` is missing.")}return{tailwindDirectives:e,applyDirectives:r}}var Ap=S(()=>{l();Ce()});function Tp(i,...e){for(let t of e){let r=Dp(t,$i);if(r!==null&&Dp(i,$i,r)!==null){let n=`${$i}(${r})`,a=t.indexOf(n),o=t.slice(a+n.length).split(" ")[0];i=i.replace(n,n+o);continue}i=t.replace(Op,i)}return i}function Pp(i,{selector:e,candidate:t,context:r}){let s=r?.tailwindConfig?.separator??":",n=new RegExp(`\\${s}(?![^[]*\\])`),a=t.split(n).pop();return r?.tailwindConfig?.prefix&&(i=mt(r.tailwindConfig.prefix,i)),i=i.replace(Op,`.${ce(t)}`),e=(0,ua.default)(o=>o.walkClasses(f=>(f.raws&&f.value.includes(a)&&(f.raws.value=ce((0,Ep.default)(f.raws.value))),f))).processSync(e),e=e.replace(`.${ce(a)}`,i),(0,ua.default)(o=>o.map(f=>{f.walkPseudos(p=>(ok.has(p.value)&&p.replaceWith(p.nodes),p));function c(p){let d=[];for(let g of p.nodes)fa(g)&&(d.push(g),p.removeChild(g)),g?.nodes&&d.push(...c(g));return d}let u=c(f);return u.length>0&&f.nodes.push(u.sort(fk)),f})).processSync(e)}function fk(i,e){return i.type!=="pseudo"&&e.type!=="pseudo"||i.type==="combinator"^e.type==="combinator"?0:i.type==="pseudo"^e.type==="pseudo"?(i.type==="pseudo")-(e.type==="pseudo"):fa(i)-fa(e)}function fa(i){return i.type!=="pseudo"||uk.includes(i.value)?!1:i.value.startsWith("::")||lk.includes(i.value)}function Dp(i,e,t){let r=i.indexOf(t?`${e}(${t})`:e);if(r===-1)return null;r+=e.length+1;let s="",n=0;for(let a of i.slice(r))if(a!=="("&&a!==")")s+=a;else if(a==="(")s+=a,n++;else if(a===")"){if(--n<0)break;s+=a}return s}var ua,Ep,$i,Op,ok,lk,uk,qp=S(()=>{l();ua=V(we()),Ep=V(bi());kr();Di();$i=":merge",Op="&",ok=new Set([$i]);lk=[":before",":after",":first-line",":first-letter"],uk=["::file-selector-button"]});function pk(i){return ck.transformSync(i)}function*Ip(i,e=1/0){if(e<0)return;let t;if(e===1/0&&i.endsWith("]")){let n=i.indexOf("[");t=["-","/"].includes(i[n-1])?n-1:-1}else t=i.lastIndexOf("-",e);if(t<0)return;let r=i.slice(0,t),s=i.slice(t+1);yield[r,s],yield*Ip(i,t-1)}function dk(i,e){if(i.length===0||e.tailwindConfig.prefix==="")return i;for(let t of i){let[r]=t;if(r.options.respectPrefix){let s=F.root({nodes:[t[1].clone()]});s.walkRules(n=>{n.selector=mt(e.tailwindConfig.prefix,n.selector)}),t[1]=s.nodes[0]}}return i}function hk(i){if(i.length===0)return i;let e=[];for(let[t,r]of i){let s=F.root({nodes:[r.clone()]});s.walkRules(n=>{n.selector=Yc(n.selector,a=>`!${a}`),n.walkDecls(a=>a.important=!0)}),e.push([{...t,important:!0},s.nodes[0]])}return e}function mk(i,e,t){if(e.length===0)return e;if(t.variantMap.has(i)){let r=t.variantMap.get(i),s=[];for(let[n,a]of e){if(n.layer==="user")continue;let o=F.root({nodes:[a.clone()]});for(let[f,c]of r){let g=function(){d.size>0||u.walkRules(v=>d.set(v,v.selector))},y=function(v){return g(),u.each(C=>{C.type==="rule"&&(C.selectors=C.selectors.map(D=>v({get className(){return pk(D)},selector:D})))}),u},u=o.clone(),p=[],d=new Map,x=c({get container(){return g(),u},separator:t.tailwindConfig.separator,modifySelectors:y,wrap(v){let C=u.nodes;u.removeAll(),v.append(C),u.append(v)},format(v){p.push(v)}});if(typeof x=="string"&&p.push(x),x===null)continue;d.size>0&&u.walkRules(v=>{if(!d.has(v))return;let C=d.get(v);if(C===v.selector)return;let D=v.selector,I=(0,ca.default)(q=>{q.walkClasses(G=>{G.value=`${i}${t.tailwindConfig.separator}${G.value}`})}).processSync(C);p.push(D.replace(I,"&")),v.selector=C}),u.nodes[0].raws.tailwind={parentLayer:n.layer};let w=[{...n,sort:f|n.sort,collectedFormats:(n.collectedFormats??[]).concat(p)},u.nodes[0]];s.push(w)}}return s}return[]}function pa(i,e,t={}){return!Ae(i)&&!Array.isArray(i)?[[i],t]:Array.isArray(i)?pa(i[0],e,i[1]):(e.has(i)||e.set(i,ht(i)),[e.get(i),t])}function yk(i){return gk.test(i)&&!i.startsWith("http")}function bk(i,e){try{return F.parse(`a{${i}:${e}}`).toResult(),!0}catch(t){return!1}}function wk(i,e){let[,t,r]=i.match(/^\[([a-zA-Z0-9-_]+):(\S+)\]$/)??[];if(r===void 0||!yk(t)||!yt(r))return null;let s=pe(r);return bk(t,s)?[[{sort:e.arbitraryPropertiesSort,layer:"utilities"},()=>({[Nn(i)]:{[t]:s}})]]:null}function*vk(i,e){e.candidateRuleMap.has(i)&&(yield[e.candidateRuleMap.get(i),"DEFAULT"]),yield*function*(a){a!==null&&(yield[a,"DEFAULT"])}(wk(i,e));let t=i,r=!1,s=e.tailwindConfig.prefix,n=s.length;t[n]==="-"&&(r=!0,t=s+t.slice(n+1)),r&&e.candidateRuleMap.has(t)&&(yield[e.candidateRuleMap.get(t),"-DEFAULT"]);for(let[a,o]of Ip(t))e.candidateRuleMap.has(a)&&(yield[e.candidateRuleMap.get(a),r?`-${o}`:o])}function xk(i,e){return i.split(new RegExp(`\\${e}(?![^[]*\\])`,"g"))}function*da(i,e){let t=e.tailwindConfig.separator,[r,...s]=xk(i,t).reverse(),n=!1;r.startsWith("!")&&(n=!0,r=r.slice(1));for(let a of vk(r,e)){let o=[],f=new Map,[c,u]=a,p=c.length===1;for(let[d,g]of c){let y=[];if(typeof g=="function")for(let x of[].concat(g(u,{isOnlyPlugin:p}))){let[w,v]=pa(x,e.postCssNodeCache);for(let C of w)y.push([{...d,options:{...d.options,...v}},C])}else if(u==="DEFAULT"||u==="-DEFAULT"){let x=g,[w,v]=pa(x,e.postCssNodeCache);for(let C of w)y.push([{...d,options:{...d.options,...v}},C])}y.length>0&&(f.set(y,d.options?.type),o.push(y))}if(kk(u)&&o.length>1){let d=o.map(y=>new Set([...f.get(y)??[]]));for(let y of d)for(let x of y){let w=!1;for(let v of d)y!==v&&v.has(x)&&(v.delete(x),w=!0);w&&y.delete(x)}let g=[];for(let[y,x]of d.entries())for(let w of x){let v=o[y].map(([,C])=>C).flat().map(C=>C.toString().split(` -`).slice(1,-1).map(D=>D.trim()).map(D=>` ${D}`).join(` -`)).join(` - -`);g.push(` Use \`${i.replace("[",`[${w}:`)}\` for \`${v.trim()}\``);break}W.warn([`The class \`${i}\` is ambiguous and matches multiple utilities.`,...g,`If this is content and not a class, replace it with \`${i.replace("[","[").replace("]","]")}\` to silence this warning.`]);continue}o=dk(o.flat(),e),n&&(o=hk(o,e));for(let d of s)o=mk(d,o,e);for(let d of o){if(d[0].collectedFormats){let g=Tp("&",...d[0].collectedFormats),y=F.root({nodes:[d[1].clone()]});y.walkRules(x=>{ha(x)||(x.selector=Pp(g,{selector:x.selector,candidate:i,context:e}))}),d[1]=y.nodes[0]}yield d}}}function ha(i){return i.parent&&i.parent.type==="atrule"&&i.parent.name==="keyframes"}function Rp(i,e){let t=[];for(let s of i){if(e.notClassCache.has(s))continue;if(e.classCache.has(s)){t.push(e.classCache.get(s));continue}let n=Array.from(da(s,e));if(n.length===0){e.notClassCache.add(s);continue}e.classCache.set(s,n),t.push(n)}let r=(s=>{if(s===!0)return n=>{n.walkDecls(a=>{a.parent.type==="rule"&&!ha(a.parent)&&(a.important=!0)})};if(typeof s=="string")return n=>{n.selectors=n.selectors.map(a=>`${s} ${a}`)}})(e.tailwindConfig.important);return t.flat(1).map(([{sort:s,layer:n,options:a},o])=>{if(a.respectImportant&&r){let f=F.root({nodes:[o.clone()]});f.walkRules(c=>{ha(c)||r(c)}),o=f.nodes[0]}return[s|e.layerOrder[n],o]})}function kk(i){return i.startsWith("[")&&i.endsWith("]")}var ca,ck,gk,ma=S(()=>{l();Me();ca=V(we());Bn();Bt();Di();Zn();Ce();qp();zn();Xn();ta();ck=(0,ca.default)(i=>i.first.filter(({type:e})=>e==="class").pop().value);gk=/^[a-z_-]/});function Ke(i,e){return i.map(t=>{let r=t.clone();return e!==void 0&&(r.source=e),r})}var Mp=S(()=>{l()});function Lp(i){let e=i.matchAll(_k),t=i.match(Ck)||[];return[...e,...t].flat().filter(s=>s!==void 0)}var Sk,_k,Ck,Fp=S(()=>{l();Sk=[/(?:\['([^'\s]+[^<>"'`\s:\\])')/.source,/(?:\["([^"\s]+[^<>"'`\s:\\])")/.source,/(?:\[`([^`\s]+[^<>"'`\s:\\])`)/.source,/([^<>"'`\s]*\[\w*'[^"`\s]*'?\])/.source,/([^<>"'`\s]*\[\w*"[^'`\s]*"?\])/.source,/([^<>"'`\s]*\[\w*\('[^"'`\s]*'\)\])/.source,/([^<>"'`\s]*\[\w*\("[^"'`\s]*"\)\])/.source,/([^<>"'`\s]*\[\w*\('[^"`\s]*'\)\])/.source,/([^<>"'`\s]*\[\w*\("[^'`\s]*"\)\])/.source,/([^<>"'`\s]*\['[^"'`\s]*'\])/.source,/([^<>"'`\s]*\["[^"'`\s]*"\])/.source,/([^<>"'`\s]*\[[^<>"'`\s]*:[^\]\s]*\])/.source,/([^<>"'`\s]*\[[^<>"'`\s]*:'[^"'`\s]*'\])/.source,/([^<>"'`\s]*\[[^<>"'`\s]*:"[^"'`\s]*"\])/.source,/([^<>"'`\s]*\[[^"'`\s]+\][^<>"'`\s]*)/.source,/([^"'`\s]*[^<>"'`\s:\\])/.source,/([^<>"'`\s]*[^"'`\s:\\])/.source].join("|"),_k=new RegExp(Sk,"g"),Ck=/[^<>"'`\s.(){}[\]#=%$]*[^<>"'`\s.(){}[\]#=%:$]/g});function Ak(i,e){let t=i.content.extract;return t[e]||t.DEFAULT||Np[e]||Np.DEFAULT}function Ek(i,e){let t=i.content.transform;return t[e]||t.DEFAULT||zp[e]||zp.DEFAULT}function Ok(i,e,t,r){Or.has(e)||Or.set(e,new Bp.default({maxSize:25e3}));for(let s of i.split(` -`))if(s=s.trim(),!r.has(s))if(r.add(s),Or.get(e).has(s))for(let n of Or.get(e).get(s))t.add(n);else{let n=e(s).filter(o=>o!=="!*"),a=new Set(n);for(let o of a)t.add(o);Or.get(e).set(s,a)}}function Tk(i,e){let t=i.sort(([s],[n])=>Je(s-n)),r={base:new Set,defaults:new Set,components:new Set,utilities:new Set,variants:new Set,user:new Set};for(let[s,n]of t){if(s>=e.minimumScreen){r.variants.add(n);continue}if(s&e.layerOrder.base){r.base.add(n);continue}if(s&e.layerOrder.defaults){r.defaults.add(n);continue}if(s&e.layerOrder.components){r.components.add(n);continue}if(s&e.layerOrder.utilities){r.utilities.add(n);continue}if(s&e.layerOrder.user){r.user.add(n);continue}}return r}function ga(i){return e=>{let t={base:null,components:null,utilities:null,variants:null};if(e.walkAtRules(y=>{y.name==="tailwind"&&Object.keys(t).includes(y.params)&&(t[y.params]=y)}),Object.values(t).every(y=>y===null))return e;let r=new Set(["*"]),s=new Set;Ze.DEBUG&&console.time("Reading changed files");for(let{content:y,extension:x}of i.changedContent){let w=Ek(i.tailwindConfig,x),v=Ak(i.tailwindConfig,x);Ok(w(y),v,r,s)}Ze.DEBUG&&console.timeEnd("Reading changed files");let n=i.classCache.size;Ze.DEBUG&&console.time("Generate rules");let a=Rp(r,i);if(Ze.DEBUG&&console.timeEnd("Generate rules"),Ze.DEBUG&&console.time("Build stylesheet"),i.stylesheetCache===null||i.classCache.size!==n){for(let y of a)i.ruleCache.add(y);i.stylesheetCache=Tk([...i.ruleCache],i)}Ze.DEBUG&&console.timeEnd("Build stylesheet");let{defaults:o,base:f,components:c,utilities:u,variants:p}=i.stylesheetCache;t.base&&(t.base.before(Ke([...f,...o],t.base.source)),t.base.remove()),t.components&&(t.components.before(Ke([...c],t.components.source)),t.components.remove()),t.utilities&&(t.utilities.before(Ke([...u],t.utilities.source)),t.utilities.remove());let d=Array.from(p).filter(y=>{let x=y.raws.tailwind?.parentLayer;return x==="components"?t.components!==null:x==="utilities"?t.utilities!==null:!0});t.variants?(t.variants.before(Ke(d,t.variants.source)),t.variants.remove()):d.length>0&&e.append(Ke(d,e.source));let g=d.some(y=>y.raws.tailwind?.parentLayer==="utilities");t.utilities&&u.size===0&&!g&&W.warn("content-problems",["No utility classes were detected in your source files. If this is unexpected, double-check the `content` option in your Tailwind CSS configuration.","https://tailwindcss.com/docs/content-configuration"]),Ze.DEBUG&&(console.log("Potential classes: ",r.size),console.log("Active contexts: ",Hr.size)),i.changedContent=[],e.walkAtRules("layer",y=>{Object.keys(t).includes(y.params)&&y.remove()})}}var Bp,Ze,Np,zp,Or,$p=S(()=>{l();Bp=V(es());it();ma();Fi();Ce();Mp();Fp();Ze=le,Np={DEFAULT:Lp},zp={DEFAULT:i=>i,svelte:i=>i.replace(/(?:^|\s)class:/g," ")};Or=new WeakMap});function ya(i){let e=new Set;return F.root({nodes:[i.clone()]}).walkRules(r=>{(0,jp.default)(s=>{s.walkClasses(n=>{e.add(n.value)})}).processSync(r.selector)}),Array.from(e)}function Pk(i,e){let t=new Set;for(let r of i)t.add(r.split(e).pop());return Array.from(t)}function Dk(i,e){let t=i.tailwindConfig.prefix;return typeof t=="function"?t(e):t+e}function qk(i,e){for(let t of i){if(e.notClassCache.has(t)||e.applyClassCache.has(t))continue;if(e.classCache.has(t)){e.applyClassCache.set(t,e.classCache.get(t).map(([s,n])=>[s,n.clone()]));continue}let r=Array.from(da(t,e));if(r.length===0){e.notClassCache.add(t);continue}e.applyClassCache.set(t,r)}return e.applyClassCache}function Up(i){let e=i.split(/[\s\t\n]+/g);return e[e.length-1]==="!important"?[e.slice(0,-1),!0]:[e,!1]}function Vp(i,e){let t=new Set,r=[];if(i.walkAtRules("apply",s=>{let[n]=Up(s.params);for(let a of n)t.add(a);r.push(s)}),r.length>0){let n=function(o,f,c){let u=`.${ce(c)}`,p=f.split(/\s*\,(?![^(]*\))\s*/g);return o.split(/\s*\,(?![^(]*\))\s*/g).map(d=>{let g=[];for(let y of p){let x=y.replace(u,d);x!==y&&g.push(x)}return g.join(", ")}).join(", ")},s=qk(t,e),a=new Map;for(let o of r){let f=a.get(o.parent)||[];a.set(o.parent,f);let[c,u]=Up(o.params);if(o.parent.type==="atrule"){if(o.parent.name==="screen"){let p=o.parent.params;throw o.error(`@apply is not supported within nested at-rules like @screen. We suggest you write this as @apply ${c.map(d=>`${p}:${d}`).join(" ")} instead.`)}throw o.error(`@apply is not supported within nested at-rules like @${o.parent.name}. You can fix this by un-nesting @${o.parent.name}.`)}for(let p of c){if(!s.has(p))throw p===Dk(e,"group")?o.error(`@apply should not be used with the '${p}' utility`):o.error(`The \`${p}\` class does not exist. If \`${p}\` is a custom class, make sure it is defined within a \`@layer\` directive.`);let d=s.get(p);f.push([p,u,d])}}for(let[o,f]of a){let c=[];for(let[p,d,g]of f)for(let[y,x]of g){let w=ya(o),v=ya(x);if(v=v.concat(Pk(v,e.tailwindConfig.separator)),w.some(q=>v.includes(q)))throw x.error(`You cannot \`@apply\` the \`${p}\` utility here because it creates a circular dependency.`);let D=F.root({nodes:[x.clone()]});(x.type!=="atrule"||x.type==="atrule"&&x.name!=="keyframes")&&D.walkRules(q=>{if(!ya(q).some(G=>G===p)){q.remove();return}q.selector=n(o.selector,q.selector,p),q.walkDecls(G=>{G.important=y.important||d})}),c.push([{...y,sort:y.sort|e.layerOrder[y.layer]},D.nodes[0]])}let u=c.sort(([p],[d])=>Je(p.sort-d.sort)).map(p=>p[1]);o.after(u)}for(let o of r)o.parent.nodes.length>1?o.remove():o.parent.remove();Vp(i,e)}}function ba(i){return e=>{Vp(e,i)}}var jp,Wp=S(()=>{l();Me();jp=V(we());ma();Fi();kr()});var Gp=b((O4,ji)=>{l();(function(){"use strict";function i(r,s,n){if(!r)return null;i.caseSensitive||(r=r.toLowerCase());var a=i.threshold===null?null:i.threshold*r.length,o=i.thresholdAbsolute,f;a!==null&&o!==null?f=Math.min(a,o):a!==null?f=a:o!==null?f=o:f=null;var c,u,p,d,g,y=s.length;for(g=0;gn)return n+1;var f=[],c,u,p,d,g;for(c=0;c<=o;c++)f[c]=[c];for(u=0;u<=a;u++)f[0][u]=u;for(c=1;c<=o;c++){for(p=e,d=1,c>n&&(d=c-n),g=o+1,g>n+c&&(g=n+c),u=1;u<=a;u++)ug?f[c][u]=n+1:s.charAt(c-1)===r.charAt(u-1)?f[c][u]=f[c-1][u-1]:f[c][u]=Math.min(f[c-1][u-1]+1,Math.min(f[c][u-1]+1,f[c-1][u]+1)),f[c][u]n)return n+1}return f[o][a]}})()});var Hp=b((T4,Yp)=>{l();var wa="(".charCodeAt(0),va=")".charCodeAt(0),Ui="'".charCodeAt(0),xa='"'.charCodeAt(0),ka="\\".charCodeAt(0),wt="/".charCodeAt(0),Sa=",".charCodeAt(0),_a=":".charCodeAt(0),Vi="*".charCodeAt(0),Ik="u".charCodeAt(0),Rk="U".charCodeAt(0),Mk="+".charCodeAt(0),Lk=/^[a-f0-9?-]+$/i;Yp.exports=function(i){for(var e=[],t=i,r,s,n,a,o,f,c,u,p=0,d=t.charCodeAt(p),g=t.length,y=[{nodes:e}],x=0,w,v="",C="",D="";p{l();Qp.exports=function i(e,t,r){var s,n,a,o;for(s=0,n=e.length;s{l();function Xp(i,e){var t=i.type,r=i.value,s,n;return e&&(n=e(i))!==void 0?n:t==="word"||t==="space"?r:t==="string"?(s=i.quote||"",s+r+(i.unclosed?"":s)):t==="comment"?"/*"+r+(i.unclosed?"":"*/"):t==="div"?(i.before||"")+r+(i.after||""):Array.isArray(i.nodes)?(s=Kp(i.nodes,e),t!=="function"?s:r+"("+(i.before||"")+s+(i.after||"")+(i.unclosed?"":")")):r}function Kp(i,e){var t,r;if(Array.isArray(i)){for(t="",r=i.length-1;~r;r-=1)t=Xp(i[r],e)+t;return t}return Xp(i,e)}Zp.exports=Kp});var rd=b((q4,td)=>{l();var Wi="-".charCodeAt(0),Gi="+".charCodeAt(0),Ca=".".charCodeAt(0),Fk="e".charCodeAt(0),Bk="E".charCodeAt(0);function Nk(i){var e=i.charCodeAt(0),t;if(e===Gi||e===Wi){if(t=i.charCodeAt(1),t>=48&&t<=57)return!0;var r=i.charCodeAt(2);return t===Ca&&r>=48&&r<=57}return e===Ca?(t=i.charCodeAt(1),t>=48&&t<=57):e>=48&&e<=57}td.exports=function(i){var e=0,t=i.length,r,s,n;if(t===0||!Nk(i))return!1;for(r=i.charCodeAt(e),(r===Gi||r===Wi)&&e++;e57));)e+=1;if(r=i.charCodeAt(e),s=i.charCodeAt(e+1),r===Ca&&s>=48&&s<=57)for(e+=2;e57));)e+=1;if(r=i.charCodeAt(e),s=i.charCodeAt(e+1),n=i.charCodeAt(e+2),(r===Fk||r===Bk)&&(s>=48&&s<=57||(s===Gi||s===Wi)&&n>=48&&n<=57))for(e+=s===Gi||s===Wi?3:2;e57));)e+=1;return{number:i.slice(0,e),unit:i.slice(e)}}});var Tr=b((I4,nd)=>{l();var zk=Hp(),id=Jp(),sd=ed();function Ne(i){return this instanceof Ne?(this.nodes=zk(i),this):new Ne(i)}Ne.prototype.toString=function(){return Array.isArray(this.nodes)?sd(this.nodes):""};Ne.prototype.walk=function(i,e){return id(this.nodes,i,e),this};Ne.unit=rd();Ne.walk=id;Ne.stringify=sd;nd.exports=Ne});function Ea(i){return typeof i=="object"&&i!==null}function $k(i,e){let t=Ge(e);do if(t.pop(),(0,Pr.default)(i,t)!==void 0)break;while(t.length);return t.length?t:void 0}function vt(i){return typeof i=="string"?i:i.reduce((e,t,r)=>t.includes(".")?`${e}[${t}]`:r===0?t:`${e}.${t}`,"")}function od(i){return i.map(e=>`'${e}'`).join(", ")}function ld(i){return od(Object.keys(i))}function Oa(i,e,t){let r=Array.isArray(e)?vt(e):e.replace(/^['"]+/g,"").replace(/['"]+$/g,""),s=Array.isArray(e)?e:Ge(r),n=(0,Pr.default)(i.theme,s,t);if(n===void 0){let o=`'${r}' does not exist in your theme config.`,f=s.slice(0,-1),c=(0,Pr.default)(i.theme,f);if(Ea(c)){let u=Object.keys(c).filter(d=>Oa(i,[...f,d]).isValid),p=(0,ad.default)(s[s.length-1],u);p?o+=` Did you mean '${vt([...f,p])}'?`:u.length>0&&(o+=` '${vt(f)}' has the following valid keys: ${od(u)}`)}else{let u=$k(i.theme,r);if(u){let p=(0,Pr.default)(i.theme,u);Ea(p)?o+=` '${vt(u)}' has the following keys: ${ld(p)}`:o+=` '${vt(u)}' is not an object.`}else o+=` Your theme has the following top-level keys: ${ld(i.theme)}`}return{isValid:!1,error:o}}if(!(typeof n=="string"||typeof n=="number"||typeof n=="function"||n instanceof String||n instanceof Number||Array.isArray(n))){let o=`'${r}' was found but does not resolve to a string.`;if(Ea(n)){let f=Object.keys(n).filter(c=>Oa(i,[...s,c]).isValid);f.length&&(o+=` Did you mean something like '${vt([...s,f[0]])}'?`)}return{isValid:!1,error:o}}let[a]=s;return{isValid:!0,value:Pe(a)(n)}}function jk(i,e,t){e=e.map(s=>ud(i,s,t));let r=[""];for(let s of e)s.type==="div"&&s.value===","?r.push(""):r[r.length-1]+=Aa.default.stringify(s);return r}function ud(i,e,t){if(e.type==="function"&&t[e.value]!==void 0){let r=jk(i,e.nodes,t);e.type="word",e.value=t[e.value](i,...r)}return e}function Uk(i,e,t){return(0,Aa.default)(e).walk(r=>{ud(i,r,t)}).toString()}function fd({tailwindConfig:i}){let e={theme:(t,r,...s)=>{let{isValid:n,value:a,error:o}=Oa(i,r,s.length?s:void 0);if(!n)throw t.error(o);return a},screen:(t,r)=>{r=r.replace(/^['"]+/g,"").replace(/['"]+$/g,"");let n=Fe(i.theme.screens).find(({name:a})=>a===r);if(!n)throw t.error(`The '${r}' screen does not exist in your theme.`);return Xe(n)}};return t=>{t.walk(r=>{let s=Vk[r.type];s!==void 0&&(r[s]=Uk(r,r[s],e))})}}var Pr,ad,Aa,Vk,cd=S(()=>{l();Pr=V(Ms()),ad=V(Gp());vr();Aa=V(Tr());Ni();Bi();zr();Vk={atrule:"params",decl:"value"}});function pd({tailwindConfig:{theme:i}}){return function(e){e.walkAtRules("screen",t=>{let r=t.params,n=Fe(i.screens).find(({name:a})=>a===r);if(!n)throw t.error(`No \`${r}\` screen found.`);t.name="media",t.params=Xe(n)})}}var dd=S(()=>{l();Ni();Bi()});function Wk(i){let e=i.filter(o=>o.type!=="pseudo"||o.nodes.length>0?!0:o.value.startsWith("::")||[":before",":after",":first-line",":first-letter"].includes(o.value)).reverse(),t=new Set(["tag","class","id","attribute"]),r=e.findIndex(o=>t.has(o.type));if(r===-1)return e.reverse().join("").trim();let s=e[r],n=hd[s.type]?hd[s.type](s):s;e=e.slice(0,r);let a=e.findIndex(o=>o.type==="combinator"&&o.value===">");return a!==-1&&(e.splice(0,a),e.unshift(Yi.default.universal())),[n,...e.reverse()].join("").trim()}function Yk(i){return Ta.has(i)||Ta.set(i,Gk.transformSync(i)),Ta.get(i)}function Pa({tailwindConfig:i}){return e=>{let t=new Map,r=new Set;e.walkAtRules("defaults",s=>{if(s.nodes&&s.nodes.length>0){r.add(s);return}let n=s.params;t.has(n)||t.set(n,new Set),t.get(n).add(s.parent),s.remove()});for(let s of r){let n=new Map,a=t.get(s.params)??[];for(let o of a)for(let f of Yk(o.selector)){let c=f.includes(":-")||f.includes("::-")?f:"__DEFAULT__",u=n.get(c)??new Set;n.set(c,u),u.add(f)}if(Vr(i,"optimizeUniversalDefaults")){if(n.size===0){s.remove();continue}for(let[,o]of n){let f=F.rule();f.selectors=[...o],f.append(s.nodes.map(c=>c.clone())),s.before(f)}}else{let o=F.rule();o.selectors=["*","::before","::after"],o.append(s.nodes),s.before(o)}s.remove()}}}var Yi,hd,Gk,Ta,md=S(()=>{l();Me();Yi=V(we());Wr();hd={id(i){return Yi.default.attribute({attribute:"id",operator:"=",value:i.value,quoteMark:'"'})}};Gk=(0,Yi.default)(i=>i.map(e=>{let t=e.split(r=>r.type==="combinator"&&r.value===" ").pop();return Wk(t)})),Ta=new Map});function Da(){return i=>{let e=null;i.each(t=>{if(!Hk.has(t.type)){e=null;return}if(e===null){e=t;return}let r=gd[t.type];t.type==="atrule"&&t.name==="font-face"?e=t:r.every(s=>(t[s]??"").replace(/\s+/g," ")===(e[s]??"").replace(/\s+/g," "))?(e.append(t.nodes),t.remove()):e=t})}}var gd,Hk,yd=S(()=>{l();gd={atrule:["name","params"],rule:["selector"]},Hk=new Set(Object.keys(gd))});function qa(){return i=>{i.walkRules(e=>{let t=new Map,r=new Set([]),s=new Map;e.walkDecls(n=>{if(n.parent===e){if(t.has(n.prop)){if(t.get(n.prop).value===n.value){r.add(t.get(n.prop)),t.set(n.prop,n);return}s.has(n.prop)||s.set(n.prop,new Set),s.get(n.prop).add(t.get(n.prop)),s.get(n.prop).add(n)}t.set(n.prop,n)}});for(let n of r)n.remove();for(let n of s.values()){let a=new Map;for(let o of n){let f=Jk(o.value);f!==null&&(a.has(f)||a.set(f,new Set),a.get(f).add(o))}for(let o of a.values()){let f=Array.from(o).slice(0,-1);for(let c of f)c.remove()}}})}}function Jk(i){let e=/^-?\d*.?\d+([\w%]+)?$/g.exec(i);return e?e[1]??Qk:null}var Qk,bd=S(()=>{l();Qk=Symbol("unitless-number")});function Xk(i){if(!i.walkAtRules)return;let e=new Set;if(i.walkAtRules("apply",t=>{e.add(t.parent)}),e.size!==0)for(let t of e){let r=[],s=[];for(let n of t.nodes)n.type==="atrule"&&n.name==="apply"?(s.length>0&&(r.push(s),s=[]),r.push([n])):s.push(n);if(s.length>0&&r.push(s),r.length!==1){for(let n of[...r].reverse()){let a=t.clone({nodes:[]});a.append(n),t.after(a)}t.remove()}}}function Hi(){return i=>{Xk(i)}}var wd=S(()=>{l()});function vd(i){return(e,t)=>{let r=!1;e.walkAtRules("tailwind",s=>{if(r)return!1;if(s.parent&&s.parent.type!=="root")return r=!0,s.warn(t,["Nested @tailwind rules were detected, but are not supported.","Consider using a prefix to scope Tailwind's classes: https://tailwindcss.com/docs/configuration#prefix","Alternatively, use the important selector strategy: https://tailwindcss.com/docs/configuration#selector-strategy"].join(` -`)),!1}),e.walkRules(s=>{if(r)return!1;s.walkRules(n=>(r=!0,n.warn(t,["Nested CSS was detected, but CSS nesting has not been configured correctly.","Please enable a CSS nesting plugin *before* Tailwind in your configuration.","See how here: https://tailwindcss.com/docs/using-with-preprocessors#nesting"].join(` -`)),!1))})}}var xd=S(()=>{l()});function Ia(i){return function(e,t){let{tailwindDirectives:r,applyDirectives:s}=la(e);vd()(e,t),Hi()(e,t);let n=i({tailwindDirectives:r,applyDirectives:s,registerDependency(a){t.messages.push({plugin:"tailwindcss",parent:t.opts.from,...a})},createContext(a,o){return ia(a,o,e)}})(e,t);if(n.tailwindConfig.separator==="-")throw new Error("The '-' character cannot be used as a custom separator in JIT mode due to parsing ambiguity. Please use another character like '_' instead.");xl(n.tailwindConfig),ga(n)(e,t),Hi()(e,t),ba(n)(e,t),fd(n)(e,t),pd(n)(e,t),Pa(n)(e,t),Da(n)(e,t),qa(n)(e,t)}}var kd=S(()=>{l();Ap();$p();Wp();cd();dd();md();yd();bd();wd();xd();sa();Wr()});var Sd=b((cT,Ra)=>{l();Cp();kd();it();Ra.exports=function(e){return{postcssPlugin:"tailwindcss",plugins:[le.DEBUG&&function(t){return console.log(` -`),console.time("JIT TOTAL"),t},function(t,r){Ia(oa(e))(t,r)},le.DEBUG&&function(t){return console.timeEnd("JIT TOTAL"),console.log(` -`),t}].filter(Boolean)}};Ra.exports.postcss=!0});var Ma=b((pT,_d)=>{l();_d.exports=()=>["and_chr 92","and_uc 12.12","chrome 92","chrome 91","edge 91","firefox 89","ios_saf 14.5-14.7","ios_saf 14.0-14.4","safari 14.1","samsung 14.0"]});var Qi={};me(Qi,{agents:()=>Kk,feature:()=>Zk});function Zk(){return{status:"cr",title:"CSS Feature Queries",stats:{ie:{"6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","5.5":"n"},edge:{"12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","79":"y","80":"y","81":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y"},firefox:{"2":"n","3":"n","4":"n","5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","12":"n","13":"n","14":"n","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","59":"y","60":"y","61":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","79":"y","80":"y","81":"y","82":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y","93":"y","3.5":"n","3.6":"n"},chrome:{"4":"n","5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","12":"n","13":"n","14":"n","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"n","23":"n","24":"n","25":"n","26":"n","27":"n","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","59":"y","60":"y","61":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","79":"y","80":"y","81":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y","93":"y","94":"y","95":"y"},safari:{"4":"n","5":"n","6":"n","7":"n","8":"n","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","9.1":"y","10.1":"y","11.1":"y","12.1":"y","13.1":"y","14.1":"y",TP:"y","3.1":"n","3.2":"n","5.1":"n","6.1":"n","7.1":"n"},opera:{"9":"n","11":"n","12":"n","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","60":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","12.1":"y","9.5-9.6":"n","10.0-10.1":"n","10.5":"n","10.6":"n","11.1":"n","11.5":"n","11.6":"n"},ios_saf:{"8":"n","9.0-9.2":"y","9.3":"y","10.0-10.2":"y","10.3":"y","11.0-11.2":"y","11.3-11.4":"y","12.0-12.1":"y","12.2-12.4":"y","13.0-13.1":"y","13.2":"y","13.3":"y","13.4-13.7":"y","14.0-14.4":"y","14.5-14.7":"y","3.2":"n","4.0-4.1":"n","4.2-4.3":"n","5.0-5.1":"n","6.0-6.1":"n","7.0-7.1":"n","8.1-8.4":"n"},op_mini:{all:"y"},android:{"3":"n","4":"n","92":"y","4.4":"y","4.4.3-4.4.4":"y","2.1":"n","2.2":"n","2.3":"n","4.1":"n","4.2-4.3":"n"},bb:{"7":"n","10":"n"},op_mob:{"10":"n","11":"n","12":"n","64":"y","11.1":"n","11.5":"n","12.1":"n"},and_chr:{"92":"y"},and_ff:{"90":"y"},ie_mob:{"10":"n","11":"n"},and_uc:{"12.12":"y"},samsung:{"4":"y","5.0-5.4":"y","6.2-6.4":"y","7.2-7.4":"y","8.2":"y","9.2":"y","10.1":"y","11.1-11.2":"y","12.0":"y","13.0":"y","14.0":"y"},and_qq:{"10.4":"y"},baidu:{"7.12":"y"},kaios:{"2.5":"y"}}}}var Kk,Ji=S(()=>{l();Kk={ie:{prefix:"ms"},edge:{prefix:"webkit",prefix_exceptions:{"12":"ms","13":"ms","14":"ms","15":"ms","16":"ms","17":"ms","18":"ms"}},firefox:{prefix:"moz"},chrome:{prefix:"webkit"},safari:{prefix:"webkit"},opera:{prefix:"webkit",prefix_exceptions:{"9":"o","11":"o","12":"o","9.5-9.6":"o","10.0-10.1":"o","10.5":"o","10.6":"o","11.1":"o","11.5":"o","11.6":"o","12.1":"o"}},ios_saf:{prefix:"webkit"},op_mini:{prefix:"o"},android:{prefix:"webkit"},bb:{prefix:"webkit"},op_mob:{prefix:"o",prefix_exceptions:{"64":"webkit"}},and_chr:{prefix:"webkit"},and_ff:{prefix:"moz"},ie_mob:{prefix:"ms"},and_uc:{prefix:"webkit",prefix_exceptions:{"12.12":"webkit"}},samsung:{prefix:"webkit"},and_qq:{prefix:"webkit"},baidu:{prefix:"webkit"},kaios:{prefix:"moz"}}});var J=b((dT,ze)=>{l();var{list:La}=te();ze.exports.error=function(i){let e=new Error(i);throw e.autoprefixer=!0,e};ze.exports.uniq=function(i){return[...new Set(i)]};ze.exports.removeNote=function(i){return i.includes(" ")?i.split(" ")[0]:i};ze.exports.escapeRegexp=function(i){return i.replace(/[$()*+-.?[\\\]^{|}]/g,"\\$&")};ze.exports.regexp=function(i,e=!0){return e&&(i=this.escapeRegexp(i)),new RegExp(`(^|[\\s,(])(${i}($|[\\s(,]))`,"gi")};ze.exports.editList=function(i,e){let t=La.comma(i),r=e(t,[]);if(t===r)return i;let s=i.match(/,\s*/);return s=s?s[0]:", ",r.join(s)};ze.exports.splitSelector=function(i){return La.comma(i).map(e=>La.space(e).map(t=>t.split(/(?=\.|#)/g)))}});var $e=b((hT,Ed)=>{l();var e2=Ma(),Cd=(Ji(),Qi).agents,t2=J(),Ad=class{static prefixes(){if(this.prefixesCache)return this.prefixesCache;this.prefixesCache=[];for(let e in Cd)this.prefixesCache.push(`-${Cd[e].prefix}-`);return this.prefixesCache=t2.uniq(this.prefixesCache).sort((e,t)=>t.length-e.length),this.prefixesCache}static withPrefix(e){return this.prefixesRegexp||(this.prefixesRegexp=new RegExp(this.prefixes().join("|"))),this.prefixesRegexp.test(e)}constructor(e,t,r,s){this.data=e,this.options=r||{},this.browserslistOpts=s||{},this.selected=this.parse(t)}parse(e){let t={};for(let r in this.browserslistOpts)t[r]=this.browserslistOpts[r];return t.path=this.options.from,e2(e,t)}prefix(e){let[t,r]=e.split(" "),s=this.data[t],n=s.prefix_exceptions&&s.prefix_exceptions[r];return n||(n=s.prefix),`-${n}-`}isSelected(e){return this.selected.includes(e)}};Ed.exports=Ad});var Dr=b((mT,Od)=>{l();Od.exports={prefix(i){let e=i.match(/^(-\w+-)/);return e?e[0]:""},unprefixed(i){return i.replace(/^-\w+-/,"")}}});var xt=b((gT,Pd)=>{l();var r2=$e(),Td=Dr(),i2=J();function Fa(i,e){let t=new i.constructor;for(let r of Object.keys(i||{})){let s=i[r];r==="parent"&&typeof s=="object"?e&&(t[r]=e):r==="source"||r===null?t[r]=s:Array.isArray(s)?t[r]=s.map(n=>Fa(n,t)):r!=="_autoprefixerPrefix"&&r!=="_autoprefixerValues"&&r!=="proxyCache"&&(typeof s=="object"&&s!==null&&(s=Fa(s,t)),t[r]=s)}return t}var Xi=class{static hack(e){return this.hacks||(this.hacks={}),e.names.map(t=>(this.hacks[t]=e,this.hacks[t]))}static load(e,t,r){let s=this.hacks&&this.hacks[e];return s?new s(e,t,r):new this(e,t,r)}static clone(e,t){let r=Fa(e);for(let s in t)r[s]=t[s];return r}constructor(e,t,r){this.prefixes=t,this.name=e,this.all=r}parentPrefix(e){let t;return typeof e._autoprefixerPrefix!="undefined"?t=e._autoprefixerPrefix:e.type==="decl"&&e.prop[0]==="-"?t=Td.prefix(e.prop):e.type==="root"?t=!1:e.type==="rule"&&e.selector.includes(":-")&&/:(-\w+-)/.test(e.selector)?t=e.selector.match(/:(-\w+-)/)[1]:e.type==="atrule"&&e.name[0]==="-"?t=Td.prefix(e.name):t=this.parentPrefix(e.parent),r2.prefixes().includes(t)||(t=!1),e._autoprefixerPrefix=t,e._autoprefixerPrefix}process(e,t){if(!this.check(e))return;let r=this.parentPrefix(e),s=this.prefixes.filter(a=>!r||r===i2.removeNote(a)),n=[];for(let a of s)this.add(e,a,n.concat([a]),t)&&n.push(a);return n}clone(e,t){return Xi.clone(e,t)}};Pd.exports=Xi});var T=b((yT,Id)=>{l();var s2=xt(),n2=$e(),Dd=J(),qd=class extends s2{check(){return!0}prefixed(e,t){return t+e}normalize(e){return e}otherPrefixes(e,t){for(let r of n2.prefixes())if(r!==t&&e.includes(r))return!0;return!1}set(e,t){return e.prop=this.prefixed(e.prop,t),e}needCascade(e){return e._autoprefixerCascade||(e._autoprefixerCascade=this.all.options.cascade!==!1&&e.raw("before").includes(` -`)),e._autoprefixerCascade}maxPrefixed(e,t){if(t._autoprefixerMax)return t._autoprefixerMax;let r=0;for(let s of e)s=Dd.removeNote(s),s.length>r&&(r=s.length);return t._autoprefixerMax=r,t._autoprefixerMax}calcBefore(e,t,r=""){let n=this.maxPrefixed(e,t)-Dd.removeNote(r).length,a=t.raw("before");return n>0&&(a+=Array(n).fill(" ").join("")),a}restoreBefore(e){let t=e.raw("before").split(` -`),r=t[t.length-1];this.all.group(e).up(s=>{let n=s.raw("before").split(` -`),a=n[n.length-1];a.lengtha.prop===s.prop&&a.value===s.value)))return this.needCascade(e)&&(s.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,s)}isAlready(e,t){let r=this.all.group(e).up(s=>s.prop===t);return r||(r=this.all.group(e).down(s=>s.prop===t)),r}add(e,t,r,s){let n=this.prefixed(e.prop,t);if(!(this.isAlready(e,n)||this.otherPrefixes(e.value,t)))return this.insert(e,t,r,s)}process(e,t){if(!this.needCascade(e)){super.process(e,t);return}let r=super.process(e,t);!r||!r.length||(this.restoreBefore(e),e.raws.before=this.calcBefore(r,e))}old(e,t){return[this.prefixed(e,t)]}};Id.exports=qd});var Md=b((bT,Rd)=>{l();Rd.exports=function i(e){return{mul:t=>new i(e*t),div:t=>new i(e/t),simplify:()=>new i(e),toString:()=>e.toString()}}});var Bd=b((wT,Fd)=>{l();var a2=Md(),o2=xt(),Ba=J(),l2=/(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/gi,u2=/(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i,Ld=class extends o2{prefixName(e,t){return e==="-moz-"?t+"--moz-device-pixel-ratio":e+t+"-device-pixel-ratio"}prefixQuery(e,t,r,s,n){return s=new a2(s),n==="dpi"?s=s.div(96):n==="dpcm"&&(s=s.mul(2.54).div(96)),s=s.simplify(),e==="-o-"&&(s=s.n+"/"+s.d),this.prefixName(e,t)+r+s}clean(e){if(!this.bad){this.bad=[];for(let t of this.prefixes)this.bad.push(this.prefixName(t,"min")),this.bad.push(this.prefixName(t,"max"))}e.params=Ba.editList(e.params,t=>t.filter(r=>this.bad.every(s=>!r.includes(s))))}process(e){let t=this.parentPrefix(e),r=t?[t]:this.prefixes;e.params=Ba.editList(e.params,(s,n)=>{for(let a of s){if(!a.includes("min-resolution")&&!a.includes("max-resolution")){n.push(a);continue}for(let o of r){let f=a.replace(l2,c=>{let u=c.match(u2);return this.prefixQuery(o,u[1],u[2],u[3],u[4])});n.push(f)}n.push(a)}return Ba.uniq(n)})}};Fd.exports=Ld});var Ud=b((vT,jd)=>{l();var{list:f2}=te(),Nd=Tr(),c2=$e(),zd=Dr(),$d=class{constructor(e){this.props=["transition","transition-property"],this.prefixes=e}add(e,t){let r,s,n=this.prefixes.add[e.prop],a=this.ruleVendorPrefixes(e),o=a||n&&n.prefixes||[],f=this.parse(e.value),c=f.map(g=>this.findProp(g)),u=[];if(c.some(g=>g[0]==="-"))return;for(let g of f){if(s=this.findProp(g),s[0]==="-")continue;let y=this.prefixes.add[s];if(!(!y||!y.prefixes))for(r of y.prefixes){if(a&&!a.some(w=>r.includes(w)))continue;let x=this.prefixes.prefixed(s,r);x!=="-ms-transform"&&!c.includes(x)&&(this.disabled(s,r)||u.push(this.clone(s,x,g)))}}f=f.concat(u);let p=this.stringify(f),d=this.stringify(this.cleanFromUnprefixed(f,"-webkit-"));if(o.includes("-webkit-")&&this.cloneBefore(e,`-webkit-${e.prop}`,d),this.cloneBefore(e,e.prop,d),o.includes("-o-")){let g=this.stringify(this.cleanFromUnprefixed(f,"-o-"));this.cloneBefore(e,`-o-${e.prop}`,g)}for(r of o)if(r!=="-webkit-"&&r!=="-o-"){let g=this.stringify(this.cleanOtherPrefixes(f,r));this.cloneBefore(e,r+e.prop,g)}p!==e.value&&!this.already(e,e.prop,p)&&(this.checkForWarning(t,e),e.cloneBefore(),e.value=p)}findProp(e){let t=e[0].value;if(/^\d/.test(t)){for(let[r,s]of e.entries())if(r!==0&&s.type==="word")return s.value}return t}already(e,t,r){return e.parent.some(s=>s.prop===t&&s.value===r)}cloneBefore(e,t,r){this.already(e,t,r)||e.cloneBefore({prop:t,value:r})}checkForWarning(e,t){if(t.prop!=="transition-property")return;let r=!1,s=!1;t.parent.each(n=>{if(n.type!=="decl"||n.prop.indexOf("transition-")!==0)return;let a=f2.comma(n.value);if(n.prop==="transition-property"){a.forEach(o=>{let f=this.prefixes.add[o];f&&f.prefixes&&f.prefixes.length>0&&(r=!0)});return}return s=s||a.length>1,!1}),r&&s&&t.warn(e,"Replace transition-property to transition, because Autoprefixer could not support any cases of transition-property and other transition-*")}remove(e){let t=this.parse(e.value);t=t.filter(a=>{let o=this.prefixes.remove[this.findProp(a)];return!o||!o.remove});let r=this.stringify(t);if(e.value===r)return;if(t.length===0){e.remove();return}let s=e.parent.some(a=>a.prop===e.prop&&a.value===r),n=e.parent.some(a=>a!==e&&a.prop===e.prop&&a.value.length>r.length);if(s||n){e.remove();return}e.value=r}parse(e){let t=Nd(e),r=[],s=[];for(let n of t.nodes)s.push(n),n.type==="div"&&n.value===","&&(r.push(s),s=[]);return r.push(s),r.filter(n=>n.length>0)}stringify(e){if(e.length===0)return"";let t=[];for(let r of e)r[r.length-1].type!=="div"&&r.push(this.div(e)),t=t.concat(r);return t[0].type==="div"&&(t=t.slice(1)),t[t.length-1].type==="div"&&(t=t.slice(0,-2+1||void 0)),Nd.stringify({nodes:t})}clone(e,t,r){let s=[],n=!1;for(let a of r)!n&&a.type==="word"&&a.value===e?(s.push({type:"word",value:t}),n=!0):s.push(a);return s}div(e){for(let t of e)for(let r of t)if(r.type==="div"&&r.value===",")return r;return{type:"div",value:",",after:" "}}cleanOtherPrefixes(e,t){return e.filter(r=>{let s=zd.prefix(this.findProp(r));return s===""||s===t})}cleanFromUnprefixed(e,t){let r=e.map(n=>this.findProp(n)).filter(n=>n.slice(0,t.length)===t).map(n=>this.prefixes.unprefixed(n)),s=[];for(let n of e){let a=this.findProp(n),o=zd.prefix(a);!r.includes(a)&&(o===t||o==="")&&s.push(n)}return s}disabled(e,t){let r=["order","justify-content","align-self","align-content"];if(e.includes("flex")||r.includes(e)){if(this.prefixes.options.flexbox===!1)return!0;if(this.prefixes.options.flexbox==="no-2009")return t.includes("2009")}}ruleVendorPrefixes(e){let{parent:t}=e;if(t.type!=="rule")return!1;if(!t.selector.includes(":-"))return!1;let r=c2.prefixes().filter(s=>t.selector.includes(":"+s));return r.length>0?r:!1}};jd.exports=$d});var kt=b((xT,Wd)=>{l();var p2=J(),Vd=class{constructor(e,t,r,s){this.unprefixed=e,this.prefixed=t,this.string=r||t,this.regexp=s||p2.regexp(t)}check(e){return e.includes(this.string)?!!e.match(this.regexp):!1}};Wd.exports=Vd});var ae=b((kT,Yd)=>{l();var d2=xt(),h2=kt(),m2=Dr(),g2=J(),Gd=class extends d2{static save(e,t){let r=t.prop,s=[];for(let n in t._autoprefixerValues){let a=t._autoprefixerValues[n];if(a===t.value)continue;let o,f=m2.prefix(r);if(f==="-pie-")continue;if(f===n){o=t.value=a,s.push(o);continue}let c=e.prefixed(r,n),u=t.parent;if(!u.every(y=>y.prop!==c)){s.push(o);continue}let p=a.replace(/\s+/," ");if(u.some(y=>y.prop===t.prop&&y.value.replace(/\s+/," ")===p)){s.push(o);continue}let g=this.clone(t,{value:a});o=t.parent.insertBefore(t,g),s.push(o)}return s}check(e){let t=e.value;return t.includes(this.name)?!!t.match(this.regexp()):!1}regexp(){return this.regexpCache||(this.regexpCache=g2.regexp(this.name))}replace(e,t){return e.replace(this.regexp(),`$1${t}$2`)}value(e){return e.raws.value&&e.raws.value.value===e.value?e.raws.value.raw:e.value}add(e,t){e._autoprefixerValues||(e._autoprefixerValues={});let r=e._autoprefixerValues[t]||this.value(e),s;do if(s=r,r=this.replace(r,t),r===!1)return;while(r!==s);e._autoprefixerValues[t]=r}old(e){return new h2(this.name,e+this.name)}};Yd.exports=Gd});var je=b((ST,Hd)=>{l();Hd.exports={}});var za=b((_T,Xd)=>{l();var Qd=Tr(),y2=ae(),b2=je().insertAreas,w2=/(^|[^-])linear-gradient\(\s*(top|left|right|bottom)/i,v2=/(^|[^-])radial-gradient\(\s*\d+(\w*|%)\s+\d+(\w*|%)\s*,/i,x2=/(!\s*)?autoprefixer:\s*ignore\s+next/i,k2=/(!\s*)?autoprefixer\s*grid:\s*(on|off|(no-)?autoplace)/i,S2=["width","height","min-width","max-width","min-height","max-height","inline-size","min-inline-size","max-inline-size","block-size","min-block-size","max-block-size"];function Na(i){return i.parent.some(e=>e.prop==="grid-template"||e.prop==="grid-template-areas")}function _2(i){let e=i.parent.some(r=>r.prop==="grid-template-rows"),t=i.parent.some(r=>r.prop==="grid-template-columns");return e&&t}var Jd=class{constructor(e){this.prefixes=e}add(e,t){let r=this.prefixes.add["@resolution"],s=this.prefixes.add["@keyframes"],n=this.prefixes.add["@viewport"],a=this.prefixes.add["@supports"];e.walkAtRules(u=>{if(u.name==="keyframes"){if(!this.disabled(u,t))return s&&s.process(u)}else if(u.name==="viewport"){if(!this.disabled(u,t))return n&&n.process(u)}else if(u.name==="supports"){if(this.prefixes.options.supports!==!1&&!this.disabled(u,t))return a.process(u)}else if(u.name==="media"&&u.params.includes("-resolution")&&!this.disabled(u,t))return r&&r.process(u)}),e.walkRules(u=>{if(!this.disabled(u,t))return this.prefixes.add.selectors.map(p=>p.process(u,t))});function o(u){return u.parent.nodes.some(p=>{if(p.type!=="decl")return!1;let d=p.prop==="display"&&/(inline-)?grid/.test(p.value),g=p.prop.startsWith("grid-template"),y=/^grid-([A-z]+-)?gap/.test(p.prop);return d||g||y})}function f(u){return u.parent.some(p=>p.prop==="display"&&/(inline-)?flex/.test(p.value))}let c=this.gridStatus(e,t)&&this.prefixes.add["grid-area"]&&this.prefixes.add["grid-area"].prefixes;return e.walkDecls(u=>{if(this.disabledDecl(u,t))return;let p=u.parent,d=u.prop,g=u.value;if(d==="grid-row-span"){t.warn("grid-row-span is not part of final Grid Layout. Use grid-row.",{node:u});return}else if(d==="grid-column-span"){t.warn("grid-column-span is not part of final Grid Layout. Use grid-column.",{node:u});return}else if(d==="display"&&g==="box"){t.warn("You should write display: flex by final spec instead of display: box",{node:u});return}else if(d==="text-emphasis-position")(g==="under"||g==="over")&&t.warn("You should use 2 values for text-emphasis-position For example, `under left` instead of just `under`.",{node:u});else if(/^(align|justify|place)-(items|content)$/.test(d)&&f(u))(g==="start"||g==="end")&&t.warn(`${g} value has mixed support, consider using flex-${g} instead`,{node:u});else if(d==="text-decoration-skip"&&g==="ink")t.warn("Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed",{node:u});else{if(c&&this.gridStatus(u,t))if(u.value==="subgrid"&&t.warn("IE does not support subgrid",{node:u}),/^(align|justify|place)-items$/.test(d)&&o(u)){let x=d.replace("-items","-self");t.warn(`IE does not support ${d} on grid containers. Try using ${x} on child elements instead: ${u.parent.selector} > * { ${x}: ${u.value} }`,{node:u})}else if(/^(align|justify|place)-content$/.test(d)&&o(u))t.warn(`IE does not support ${u.prop} on grid containers`,{node:u});else if(d==="display"&&u.value==="contents"){t.warn("Please do not use display: contents; if you have grid setting enabled",{node:u});return}else if(u.prop==="grid-gap"){let x=this.gridStatus(u,t);x==="autoplace"&&!_2(u)&&!Na(u)?t.warn("grid-gap only works if grid-template(-areas) is being used or both rows and columns have been declared and cells have not been manually placed inside the explicit grid",{node:u}):(x===!0||x==="no-autoplace")&&!Na(u)&&t.warn("grid-gap only works if grid-template(-areas) is being used",{node:u})}else if(d==="grid-auto-columns"){t.warn("grid-auto-columns is not supported by IE",{node:u});return}else if(d==="grid-auto-rows"){t.warn("grid-auto-rows is not supported by IE",{node:u});return}else if(d==="grid-auto-flow"){let x=p.some(v=>v.prop==="grid-template-rows"),w=p.some(v=>v.prop==="grid-template-columns");Na(u)?t.warn("grid-auto-flow is not supported by IE",{node:u}):g.includes("dense")?t.warn("grid-auto-flow: dense is not supported by IE",{node:u}):!x&&!w&&t.warn("grid-auto-flow works only if grid-template-rows and grid-template-columns are present in the same rule",{node:u});return}else if(g.includes("auto-fit")){t.warn("auto-fit value is not supported by IE",{node:u,word:"auto-fit"});return}else if(g.includes("auto-fill")){t.warn("auto-fill value is not supported by IE",{node:u,word:"auto-fill"});return}else d.startsWith("grid-template")&&g.includes("[")&&t.warn("Autoprefixer currently does not support line names. Try using grid-template-areas instead.",{node:u,word:"["});if(g.includes("radial-gradient"))if(v2.test(u.value))t.warn("Gradient has outdated direction syntax. New syntax is like `closest-side at 0 0` instead of `0 0, closest-side`.",{node:u});else{let x=Qd(g);for(let w of x.nodes)if(w.type==="function"&&w.value==="radial-gradient")for(let v of w.nodes)v.type==="word"&&(v.value==="cover"?t.warn("Gradient has outdated direction syntax. Replace `cover` to `farthest-corner`.",{node:u}):v.value==="contain"&&t.warn("Gradient has outdated direction syntax. Replace `contain` to `closest-side`.",{node:u}))}g.includes("linear-gradient")&&w2.test(g)&&t.warn("Gradient has outdated direction syntax. New syntax is like `to left` instead of `right`.",{node:u})}S2.includes(u.prop)&&(u.value.includes("-fill-available")||(u.value.includes("fill-available")?t.warn("Replace fill-available to stretch, because spec had been changed",{node:u}):u.value.includes("fill")&&Qd(g).nodes.some(w=>w.type==="word"&&w.value==="fill")&&t.warn("Replace fill to stretch, because spec had been changed",{node:u})));let y;if(u.prop==="transition"||u.prop==="transition-property")return this.prefixes.transition.add(u,t);if(u.prop==="align-self"){if(this.displayType(u)!=="grid"&&this.prefixes.options.flexbox!==!1&&(y=this.prefixes.add["align-self"],y&&y.prefixes&&y.process(u)),this.gridStatus(u,t)!==!1&&(y=this.prefixes.add["grid-row-align"],y&&y.prefixes))return y.process(u,t)}else if(u.prop==="justify-self"){if(this.gridStatus(u,t)!==!1&&(y=this.prefixes.add["grid-column-align"],y&&y.prefixes))return y.process(u,t)}else if(u.prop==="place-self"){if(y=this.prefixes.add["place-self"],y&&y.prefixes&&this.gridStatus(u,t)!==!1)return y.process(u,t)}else if(y=this.prefixes.add[u.prop],y&&y.prefixes)return y.process(u,t)}),this.gridStatus(e,t)&&b2(e,this.disabled),e.walkDecls(u=>{if(this.disabledValue(u,t))return;let p=this.prefixes.unprefixed(u.prop),d=this.prefixes.values("add",p);if(Array.isArray(d))for(let g of d)g.process&&g.process(u,t);y2.save(this.prefixes,u)})}remove(e,t){let r=this.prefixes.remove["@resolution"];e.walkAtRules((s,n)=>{this.prefixes.remove[`@${s.name}`]?this.disabled(s,t)||s.parent.removeChild(n):s.name==="media"&&s.params.includes("-resolution")&&r&&r.clean(s)});for(let s of this.prefixes.remove.selectors)e.walkRules((n,a)=>{s.check(n)&&(this.disabled(n,t)||n.parent.removeChild(a))});return e.walkDecls((s,n)=>{if(this.disabled(s,t))return;let a=s.parent,o=this.prefixes.unprefixed(s.prop);if((s.prop==="transition"||s.prop==="transition-property")&&this.prefixes.transition.remove(s),this.prefixes.remove[s.prop]&&this.prefixes.remove[s.prop].remove){let f=this.prefixes.group(s).down(c=>this.prefixes.normalize(c.prop)===o);if(o==="flex-flow"&&(f=!0),s.prop==="-webkit-box-orient"){let c={"flex-direction":!0,"flex-flow":!0};if(!s.parent.some(u=>c[u.prop]))return}if(f&&!this.withHackValue(s)){s.raw("before").includes(` -`)&&this.reduceSpaces(s),a.removeChild(n);return}}for(let f of this.prefixes.values("remove",o)){if(!f.check||!f.check(s.value))continue;if(o=f.unprefixed,this.prefixes.group(s).down(u=>u.value.includes(o))){a.removeChild(n);return}}})}withHackValue(e){return e.prop==="-webkit-background-clip"&&e.value==="text"}disabledValue(e,t){return this.gridStatus(e,t)===!1&&e.type==="decl"&&e.prop==="display"&&e.value.includes("grid")||this.prefixes.options.flexbox===!1&&e.type==="decl"&&e.prop==="display"&&e.value.includes("flex")||e.type==="decl"&&e.prop==="content"?!0:this.disabled(e,t)}disabledDecl(e,t){if(this.gridStatus(e,t)===!1&&e.type==="decl"&&(e.prop.includes("grid")||e.prop==="justify-items"))return!0;if(this.prefixes.options.flexbox===!1&&e.type==="decl"){let r=["order","justify-content","align-items","align-content"];if(e.prop.includes("flex")||r.includes(e.prop))return!0}return this.disabled(e,t)}disabled(e,t){if(!e)return!1;if(e._autoprefixerDisabled!==void 0)return e._autoprefixerDisabled;if(e.parent){let s=e.prev();if(s&&s.type==="comment"&&x2.test(s.text))return e._autoprefixerDisabled=!0,e._autoprefixerSelfDisabled=!0,!0}let r=null;if(e.nodes){let s;e.each(n=>{n.type==="comment"&&/(!\s*)?autoprefixer:\s*(off|on)/i.test(n.text)&&(typeof s!="undefined"?t.warn("Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.",{node:n}):s=/on/i.test(n.text))}),s!==void 0&&(r=!s)}if(!e.nodes||r===null)if(e.parent){let s=this.disabled(e.parent,t);e.parent._autoprefixerSelfDisabled===!0?r=!1:r=s}else r=!1;return e._autoprefixerDisabled=r,r}reduceSpaces(e){let t=!1;if(this.prefixes.group(e).up(()=>(t=!0,!0)),t)return;let r=e.raw("before").split(` -`),s=r[r.length-1].length,n=!1;this.prefixes.group(e).down(a=>{r=a.raw("before").split(` -`);let o=r.length-1;r[o].length>s&&(n===!1&&(n=r[o].length-s),r[o]=r[o].slice(0,-n),a.raws.before=r.join(` -`))})}displayType(e){for(let t of e.parent.nodes)if(t.prop==="display"){if(t.value.includes("flex"))return"flex";if(t.value.includes("grid"))return"grid"}return!1}gridStatus(e,t){if(!e)return!1;if(e._autoprefixerGridStatus!==void 0)return e._autoprefixerGridStatus;let r=null;if(e.nodes){let s;e.each(n=>{if(n.type==="comment"&&k2.test(n.text)){let a=/:\s*autoplace/i.test(n.text),o=/no-autoplace/i.test(n.text);typeof s!="undefined"?t.warn("Second Autoprefixer grid control comment was ignored. Autoprefixer applies control comments to the whole block, not to the next rules.",{node:n}):a?s="autoplace":o?s=!0:s=/on/i.test(n.text)}}),s!==void 0&&(r=s)}if(e.type==="atrule"&&e.name==="supports"){let s=e.params;s.includes("grid")&&s.includes("auto")&&(r=!1)}if(!e.nodes||r===null)if(e.parent){let s=this.gridStatus(e.parent,t);e.parent._autoprefixerSelfDisabled===!0?r=!1:r=s}else typeof this.prefixes.options.grid!="undefined"?r=this.prefixes.options.grid:typeof h.env.AUTOPREFIXER_GRID!="undefined"?h.env.AUTOPREFIXER_GRID==="autoplace"?r="autoplace":r=!0:r=!1;return e._autoprefixerGridStatus=r,r}};Xd.exports=Jd});var Zd=b((CT,Kd)=>{l();Kd.exports={A:{A:{"2":"J D E F A B iB"},B:{"1":"C K L G M N O R S T U V W X Y Z a P b H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x y z AB BB CB DB EB FB GB bB HB cB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB R S T kB U V W X Y Z a P b H dB","2":"jB aB I c J D E F A B C K L G M N O d e f lB mB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x y z AB BB CB DB EB FB GB bB HB cB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB R S T U V W X Y Z a P b H dB nB oB","2":"I c J D E F A B C K L G M N O d e f g h i j k l"},E:{"1":"F A B C K L G tB fB YB ZB uB vB wB","2":"I c J D E pB eB qB rB sB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 G M N O d e f g h i j k l m n o p q r s t u v w x y z AB BB CB DB EB FB GB HB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB ZB","2":"F B C xB yB zB 0B YB gB 1B"},G:{"1":"7B 8B 9B AC BC CC DC EC FC GC HC IC JC KC","2":"E eB 2B hB 3B 4B 5B 6B"},H:{"1":"LC"},I:{"1":"H QC RC","2":"aB I MC NC OC PC hB"},J:{"2":"D A"},K:{"1":"Q","2":"A B C YB gB ZB"},L:{"1":"H"},M:{"1":"P"},N:{"2":"A B"},O:{"1":"SC"},P:{"1":"I TC UC VC WC XC fB YC ZC aC bC"},Q:{"1":"cC"},R:{"1":"dC"},S:{"1":"eC"}},B:4,C:"CSS Feature Queries"}});var ih=b((AT,rh)=>{l();function eh(i){return i[i.length-1]}var th={parse(i){let e=[""],t=[e];for(let r of i){if(r==="("){e=[""],eh(t).push(e),t.push(e);continue}if(r===")"){t.pop(),e=eh(t),e.push("");continue}e[e.length-1]+=r}return t[0]},stringify(i){let e="";for(let t of i){if(typeof t=="object"){e+=`(${th.stringify(t)})`;continue}e+=t}return e}};rh.exports=th});var lh=b((ET,oh)=>{l();var C2=Zd(),{feature:A2}=(Ji(),Qi),{parse:E2}=te(),O2=$e(),$a=ih(),T2=ae(),P2=J(),sh=A2(C2),nh=[];for(let i in sh.stats){let e=sh.stats[i];for(let t in e){let r=e[t];/y/.test(r)&&nh.push(i+" "+t)}}var ah=class{constructor(e,t){this.Prefixes=e,this.all=t}prefixer(){if(this.prefixerCache)return this.prefixerCache;let e=this.all.browsers.selected.filter(r=>nh.includes(r)),t=new O2(this.all.browsers.data,e,this.all.options);return this.prefixerCache=new this.Prefixes(this.all.data,t,this.all.options),this.prefixerCache}parse(e){let t=e.split(":"),r=t[0],s=t[1];return s||(s=""),[r.trim(),s.trim()]}virtual(e){let[t,r]=this.parse(e),s=E2("a{}").first;return s.append({prop:t,value:r,raws:{before:""}}),s}prefixed(e){let t=this.virtual(e);if(this.disabled(t.first))return t.nodes;let r={warn:()=>null},s=this.prefixer().add[t.first.prop];s&&s.process&&s.process(t.first,r);for(let n of t.nodes){for(let a of this.prefixer().values("add",t.first.prop))a.process(n);T2.save(this.all,n)}return t.nodes}isNot(e){return typeof e=="string"&&/not\s*/i.test(e)}isOr(e){return typeof e=="string"&&/\s*or\s*/i.test(e)}isProp(e){return typeof e=="object"&&e.length===1&&typeof e[0]=="string"}isHack(e,t){return!new RegExp(`(\\(|\\s)${P2.escapeRegexp(t)}:`).test(e)}toRemove(e,t){let[r,s]=this.parse(e),n=this.all.unprefixed(r),a=this.all.cleaner();if(a.remove[r]&&a.remove[r].remove&&!this.isHack(t,n))return!0;for(let o of a.values("remove",n))if(o.check(s))return!0;return!1}remove(e,t){let r=0;for(;rtypeof t!="object"?t:t.length===1&&typeof t[0]=="object"?this.cleanBrackets(t[0]):this.cleanBrackets(t))}convert(e){let t=[""];for(let r of e)t.push([`${r.prop}: ${r.value}`]),t.push(" or ");return t[t.length-1]="",t}normalize(e){if(typeof e!="object")return e;if(e=e.filter(t=>t!==""),typeof e[0]=="string"){let t=e[0].trim();if(t.includes(":")||t==="selector"||t==="not selector")return[$a.stringify(e)]}return e.map(t=>this.normalize(t))}add(e,t){return e.map(r=>{if(this.isProp(r)){let s=this.prefixed(r[0]);return s.length>1?this.convert(s):r}return typeof r=="object"?this.add(r,t):r})}process(e){let t=$a.parse(e.params);t=this.normalize(t),t=this.remove(t,e.params),t=this.add(t,e.params),t=this.cleanBrackets(t),e.params=$a.stringify(t)}disabled(e){if(!this.all.options.grid&&(e.prop==="display"&&e.value.includes("grid")||e.prop.includes("grid")||e.prop==="justify-items"))return!0;if(this.all.options.flexbox===!1){if(e.prop==="display"&&e.value.includes("flex"))return!0;let t=["order","justify-content","align-items","align-content"];if(e.prop.includes("flex")||t.includes(e.prop))return!0}return!1}};oh.exports=ah});var ch=b((OT,fh)=>{l();var uh=class{constructor(e,t){this.prefix=t,this.prefixed=e.prefixed(this.prefix),this.regexp=e.regexp(this.prefix),this.prefixeds=e.possible().map(r=>[e.prefixed(r),e.regexp(r)]),this.unprefixed=e.name,this.nameRegexp=e.regexp()}isHack(e){let t=e.parent.index(e)+1,r=e.parent.nodes;for(;t{l();var{list:D2}=te(),q2=ch(),I2=xt(),R2=$e(),M2=J(),ph=class extends I2{constructor(e,t,r){super(e,t,r);this.regexpCache=new Map}check(e){return e.selector.includes(this.name)?!!e.selector.match(this.regexp()):!1}prefixed(e){return this.name.replace(/^(\W*)/,`$1${e}`)}regexp(e){if(!this.regexpCache.has(e)){let t=e?this.prefixed(e):this.name;this.regexpCache.set(e,new RegExp(`(^|[^:"'=])${M2.escapeRegexp(t)}`,"gi"))}return this.regexpCache.get(e)}possible(){return R2.prefixes()}prefixeds(e){if(e._autoprefixerPrefixeds){if(e._autoprefixerPrefixeds[this.name])return e._autoprefixerPrefixeds}else e._autoprefixerPrefixeds={};let t={};if(e.selector.includes(",")){let s=D2.comma(e.selector).filter(n=>n.includes(this.name));for(let n of this.possible())t[n]=s.map(a=>this.replace(a,n)).join(", ")}else for(let r of this.possible())t[r]=this.replace(e.selector,r);return e._autoprefixerPrefixeds[this.name]=t,e._autoprefixerPrefixeds}already(e,t,r){let s=e.parent.index(e)-1;for(;s>=0;){let n=e.parent.nodes[s];if(n.type!=="rule")return!1;let a=!1;for(let o in t[this.name]){let f=t[this.name][o];if(n.selector===f){if(r===o)return!0;a=!0;break}}if(!a)return!1;s-=1}return!1}replace(e,t){return e.replace(this.regexp(),`$1${this.prefixed(t)}`)}add(e,t){let r=this.prefixeds(e);if(this.already(e,r,t))return;let s=this.clone(e,{selector:r[this.name][t]});e.parent.insertBefore(e,s)}old(e){return new q2(this,e)}};dh.exports=ph});var gh=b((PT,mh)=>{l();var L2=xt(),hh=class extends L2{add(e,t){let r=t+e.name;if(e.parent.some(a=>a.name===r&&a.params===e.params))return;let n=this.clone(e,{name:r});return e.parent.insertBefore(e,n)}process(e){let t=this.parentPrefix(e);for(let r of this.prefixes)(!t||t===r)&&this.add(e,r)}};mh.exports=hh});var bh=b((DT,yh)=>{l();var F2=St(),ja=class extends F2{prefixed(e){return e==="-webkit-"?":-webkit-full-screen":e==="-moz-"?":-moz-full-screen":`:${e}fullscreen`}};ja.names=[":fullscreen"];yh.exports=ja});var vh=b((qT,wh)=>{l();var B2=St(),Ua=class extends B2{possible(){return super.possible().concat(["-moz- old","-ms- old"])}prefixed(e){return e==="-webkit-"?"::-webkit-input-placeholder":e==="-ms-"?"::-ms-input-placeholder":e==="-ms- old"?":-ms-input-placeholder":e==="-moz- old"?":-moz-placeholder":`::${e}placeholder`}};Ua.names=["::placeholder"];wh.exports=Ua});var kh=b((IT,xh)=>{l();var N2=St(),Va=class extends N2{prefixed(e){return e==="-ms-"?":-ms-input-placeholder":`:${e}placeholder-shown`}};Va.names=[":placeholder-shown"];xh.exports=Va});var _h=b((RT,Sh)=>{l();var z2=St(),$2=J(),Wa=class extends z2{constructor(e,t,r){super(e,t,r);this.prefixes&&(this.prefixes=$2.uniq(this.prefixes.map(s=>"-webkit-")))}prefixed(e){return e==="-webkit-"?"::-webkit-file-upload-button":`::${e}file-selector-button`}};Wa.names=["::file-selector-button"];Sh.exports=Wa});var Z=b((MT,Ch)=>{l();Ch.exports=function(i){let e;return i==="-webkit- 2009"||i==="-moz-"?e=2009:i==="-ms-"?e=2012:i==="-webkit-"&&(e="final"),i==="-webkit- 2009"&&(i="-webkit-"),[e,i]}});var Th=b((LT,Oh)=>{l();var Ah=te().list,Eh=Z(),j2=T(),_t=class extends j2{prefixed(e,t){let r;return[r,t]=Eh(t),r===2009?t+"box-flex":super.prefixed(e,t)}normalize(){return"flex"}set(e,t){let r=Eh(t)[0];if(r===2009)return e.value=Ah.space(e.value)[0],e.value=_t.oldValues[e.value]||e.value,super.set(e,t);if(r===2012){let s=Ah.space(e.value);s.length===3&&s[2]==="0"&&(e.value=s.slice(0,2).concat("0px").join(" "))}return super.set(e,t)}};_t.names=["flex","box-flex"];_t.oldValues={auto:"1",none:"0"};Oh.exports=_t});var qh=b((FT,Dh)=>{l();var Ph=Z(),U2=T(),Ga=class extends U2{prefixed(e,t){let r;return[r,t]=Ph(t),r===2009?t+"box-ordinal-group":r===2012?t+"flex-order":super.prefixed(e,t)}normalize(){return"order"}set(e,t){return Ph(t)[0]===2009&&/\d/.test(e.value)?(e.value=(parseInt(e.value)+1).toString(),super.set(e,t)):super.set(e,t)}};Ga.names=["order","flex-order","box-ordinal-group"];Dh.exports=Ga});var Rh=b((BT,Ih)=>{l();var V2=T(),Ya=class extends V2{check(e){let t=e.value;return!t.toLowerCase().includes("alpha(")&&!t.includes("DXImageTransform.Microsoft")&&!t.includes("data:image/svg+xml")}};Ya.names=["filter"];Ih.exports=Ya});var Lh=b((NT,Mh)=>{l();var W2=T(),Ha=class extends W2{insert(e,t,r,s){if(t!=="-ms-")return super.insert(e,t,r);let n=this.clone(e),a=e.prop.replace(/end$/,"start"),o=t+e.prop.replace(/end$/,"span");if(!e.parent.some(f=>f.prop===o)){if(n.prop=o,e.value.includes("span"))n.value=e.value.replace(/span\s/i,"");else{let f;if(e.parent.walkDecls(a,c=>{f=c}),f){let c=Number(e.value)-Number(f.value)+"";n.value=c}else e.warn(s,`Can not prefix ${e.prop} (${a} is not found)`)}e.cloneBefore(n)}}};Ha.names=["grid-row-end","grid-column-end"];Mh.exports=Ha});var Bh=b((zT,Fh)=>{l();var G2=T(),Qa=class extends G2{check(e){return!e.value.split(/\s+/).some(t=>{let r=t.toLowerCase();return r==="reverse"||r==="alternate-reverse"})}};Qa.names=["animation","animation-direction"];Fh.exports=Qa});var zh=b(($T,Nh)=>{l();var Y2=Z(),H2=T(),Ja=class extends H2{insert(e,t,r){let s;if([s,t]=Y2(t),s!==2009)return super.insert(e,t,r);let n=e.value.split(/\s+/).filter(p=>p!=="wrap"&&p!=="nowrap"&&"wrap-reverse");if(n.length===0||e.parent.some(p=>p.prop===t+"box-orient"||p.prop===t+"box-direction"))return;let o=n[0],f=o.includes("row")?"horizontal":"vertical",c=o.includes("reverse")?"reverse":"normal",u=this.clone(e);return u.prop=t+"box-orient",u.value=f,this.needCascade(e)&&(u.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,u),u=this.clone(e),u.prop=t+"box-direction",u.value=c,this.needCascade(e)&&(u.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,u)}};Ja.names=["flex-flow","box-direction","box-orient"];Nh.exports=Ja});var jh=b((jT,$h)=>{l();var Q2=Z(),J2=T(),Xa=class extends J2{normalize(){return"flex"}prefixed(e,t){let r;return[r,t]=Q2(t),r===2009?t+"box-flex":r===2012?t+"flex-positive":super.prefixed(e,t)}};Xa.names=["flex-grow","flex-positive"];$h.exports=Xa});var Vh=b((UT,Uh)=>{l();var X2=Z(),K2=T(),Ka=class extends K2{set(e,t){if(X2(t)[0]!==2009)return super.set(e,t)}};Ka.names=["flex-wrap"];Uh.exports=Ka});var Gh=b((VT,Wh)=>{l();var Z2=T(),Ct=je(),Za=class extends Z2{insert(e,t,r,s){if(t!=="-ms-")return super.insert(e,t,r);let n=Ct.parse(e),[a,o]=Ct.translate(n,0,2),[f,c]=Ct.translate(n,1,3);[["grid-row",a],["grid-row-span",o],["grid-column",f],["grid-column-span",c]].forEach(([u,p])=>{Ct.insertDecl(e,u,p)}),Ct.warnTemplateSelectorNotFound(e,s),Ct.warnIfGridRowColumnExists(e,s)}};Za.names=["grid-area"];Wh.exports=Za});var Hh=b((WT,Yh)=>{l();var eS=T(),qr=je(),eo=class extends eS{insert(e,t,r){if(t!=="-ms-")return super.insert(e,t,r);if(e.parent.some(a=>a.prop==="-ms-grid-row-align"))return;let[[s,n]]=qr.parse(e);n?(qr.insertDecl(e,"grid-row-align",s),qr.insertDecl(e,"grid-column-align",n)):(qr.insertDecl(e,"grid-row-align",s),qr.insertDecl(e,"grid-column-align",s))}};eo.names=["place-self"];Yh.exports=eo});var Jh=b((GT,Qh)=>{l();var tS=T(),to=class extends tS{check(e){let t=e.value;return!t.includes("/")||t.includes("span")}normalize(e){return e.replace("-start","")}prefixed(e,t){let r=super.prefixed(e,t);return t==="-ms-"&&(r=r.replace("-start","")),r}};to.names=["grid-row-start","grid-column-start"];Qh.exports=to});var Zh=b((YT,Kh)=>{l();var Xh=Z(),rS=T(),At=class extends rS{check(e){return e.parent&&!e.parent.some(t=>t.prop&&t.prop.startsWith("grid-"))}prefixed(e,t){let r;return[r,t]=Xh(t),r===2012?t+"flex-item-align":super.prefixed(e,t)}normalize(){return"align-self"}set(e,t){let r=Xh(t)[0];if(r===2012)return e.value=At.oldValues[e.value]||e.value,super.set(e,t);if(r==="final")return super.set(e,t)}};At.names=["align-self","flex-item-align"];At.oldValues={"flex-end":"end","flex-start":"start"};Kh.exports=At});var tm=b((HT,em)=>{l();var iS=T(),sS=J(),ro=class extends iS{constructor(e,t,r){super(e,t,r);this.prefixes&&(this.prefixes=sS.uniq(this.prefixes.map(s=>s==="-ms-"?"-webkit-":s)))}};ro.names=["appearance"];em.exports=ro});var sm=b((QT,im)=>{l();var rm=Z(),nS=T(),io=class extends nS{normalize(){return"flex-basis"}prefixed(e,t){let r;return[r,t]=rm(t),r===2012?t+"flex-preferred-size":super.prefixed(e,t)}set(e,t){let r;if([r,t]=rm(t),r===2012||r==="final")return super.set(e,t)}};io.names=["flex-basis","flex-preferred-size"];im.exports=io});var am=b((JT,nm)=>{l();var aS=T(),so=class extends aS{normalize(){return this.name.replace("box-image","border")}prefixed(e,t){let r=super.prefixed(e,t);return t==="-webkit-"&&(r=r.replace("border","box-image")),r}};so.names=["mask-border","mask-border-source","mask-border-slice","mask-border-width","mask-border-outset","mask-border-repeat","mask-box-image","mask-box-image-source","mask-box-image-slice","mask-box-image-width","mask-box-image-outset","mask-box-image-repeat"];nm.exports=so});var lm=b((XT,om)=>{l();var oS=T(),Se=class extends oS{insert(e,t,r){let s=e.prop==="mask-composite",n;s?n=e.value.split(","):n=e.value.match(Se.regexp)||[],n=n.map(c=>c.trim()).filter(c=>c);let a=n.length,o;if(a&&(o=this.clone(e),o.value=n.map(c=>Se.oldValues[c]||c).join(", "),n.includes("intersect")&&(o.value+=", xor"),o.prop=t+"mask-composite"),s)return a?(this.needCascade(e)&&(o.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,o)):void 0;let f=this.clone(e);return f.prop=t+f.prop,a&&(f.value=f.value.replace(Se.regexp,"")),this.needCascade(e)&&(f.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,f),a?(this.needCascade(e)&&(o.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,o)):e}};Se.names=["mask","mask-composite"];Se.oldValues={add:"source-over",subtract:"source-out",intersect:"source-in",exclude:"xor"};Se.regexp=new RegExp(`\\s+(${Object.keys(Se.oldValues).join("|")})\\b(?!\\))\\s*(?=[,])`,"ig");om.exports=Se});var cm=b((KT,fm)=>{l();var um=Z(),lS=T(),Et=class extends lS{prefixed(e,t){let r;return[r,t]=um(t),r===2009?t+"box-align":r===2012?t+"flex-align":super.prefixed(e,t)}normalize(){return"align-items"}set(e,t){let r=um(t)[0];return(r===2009||r===2012)&&(e.value=Et.oldValues[e.value]||e.value),super.set(e,t)}};Et.names=["align-items","flex-align","box-align"];Et.oldValues={"flex-end":"end","flex-start":"start"};fm.exports=Et});var dm=b((ZT,pm)=>{l();var uS=T(),no=class extends uS{set(e,t){return t==="-ms-"&&e.value==="contain"&&(e.value="element"),super.set(e,t)}insert(e,t,r){if(!(e.value==="all"&&t==="-ms-"))return super.insert(e,t,r)}};no.names=["user-select"];pm.exports=no});var gm=b((eP,mm)=>{l();var hm=Z(),fS=T(),ao=class extends fS{normalize(){return"flex-shrink"}prefixed(e,t){let r;return[r,t]=hm(t),r===2012?t+"flex-negative":super.prefixed(e,t)}set(e,t){let r;if([r,t]=hm(t),r===2012||r==="final")return super.set(e,t)}};ao.names=["flex-shrink","flex-negative"];mm.exports=ao});var bm=b((tP,ym)=>{l();var cS=T(),oo=class extends cS{prefixed(e,t){return`${t}column-${e}`}normalize(e){return e.includes("inside")?"break-inside":e.includes("before")?"break-before":"break-after"}set(e,t){return(e.prop==="break-inside"&&e.value==="avoid-column"||e.value==="avoid-page")&&(e.value="avoid"),super.set(e,t)}insert(e,t,r){if(e.prop!=="break-inside")return super.insert(e,t,r);if(!(/region/i.test(e.value)||/page/i.test(e.value)))return super.insert(e,t,r)}};oo.names=["break-inside","page-break-inside","column-break-inside","break-before","page-break-before","column-break-before","break-after","page-break-after","column-break-after"];ym.exports=oo});var vm=b((rP,wm)=>{l();var pS=T(),lo=class extends pS{prefixed(e,t){return t+"print-color-adjust"}normalize(){return"color-adjust"}};lo.names=["color-adjust","print-color-adjust"];wm.exports=lo});var km=b((iP,xm)=>{l();var dS=T(),Ot=class extends dS{insert(e,t,r){if(t==="-ms-"){let s=this.set(this.clone(e),t);this.needCascade(e)&&(s.raws.before=this.calcBefore(r,e,t));let n="ltr";return e.parent.nodes.forEach(a=>{a.prop==="direction"&&(a.value==="rtl"||a.value==="ltr")&&(n=a.value)}),s.value=Ot.msValues[n][e.value]||e.value,e.parent.insertBefore(e,s)}return super.insert(e,t,r)}};Ot.names=["writing-mode"];Ot.msValues={ltr:{"horizontal-tb":"lr-tb","vertical-rl":"tb-rl","vertical-lr":"tb-lr"},rtl:{"horizontal-tb":"rl-tb","vertical-rl":"bt-rl","vertical-lr":"bt-lr"}};xm.exports=Ot});var _m=b((sP,Sm)=>{l();var hS=T(),uo=class extends hS{set(e,t){return e.value=e.value.replace(/\s+fill(\s)/,"$1"),super.set(e,t)}};uo.names=["border-image"];Sm.exports=uo});var Em=b((nP,Am)=>{l();var Cm=Z(),mS=T(),Tt=class extends mS{prefixed(e,t){let r;return[r,t]=Cm(t),r===2012?t+"flex-line-pack":super.prefixed(e,t)}normalize(){return"align-content"}set(e,t){let r=Cm(t)[0];if(r===2012)return e.value=Tt.oldValues[e.value]||e.value,super.set(e,t);if(r==="final")return super.set(e,t)}};Tt.names=["align-content","flex-line-pack"];Tt.oldValues={"flex-end":"end","flex-start":"start","space-between":"justify","space-around":"distribute"};Am.exports=Tt});var Tm=b((aP,Om)=>{l();var gS=T(),oe=class extends gS{prefixed(e,t){return t==="-moz-"?t+(oe.toMozilla[e]||e):super.prefixed(e,t)}normalize(e){return oe.toNormal[e]||e}};oe.names=["border-radius"];oe.toMozilla={};oe.toNormal={};for(let i of["top","bottom"])for(let e of["left","right"]){let t=`border-${i}-${e}-radius`,r=`border-radius-${i}${e}`;oe.names.push(t),oe.names.push(r),oe.toMozilla[t]=r,oe.toNormal[r]=t}Om.exports=oe});var Dm=b((oP,Pm)=>{l();var yS=T(),fo=class extends yS{prefixed(e,t){return e.includes("-start")?t+e.replace("-block-start","-before"):t+e.replace("-block-end","-after")}normalize(e){return e.includes("-before")?e.replace("-before","-block-start"):e.replace("-after","-block-end")}};fo.names=["border-block-start","border-block-end","margin-block-start","margin-block-end","padding-block-start","padding-block-end","border-before","border-after","margin-before","margin-after","padding-before","padding-after"];Pm.exports=fo});var Im=b((lP,qm)=>{l();var bS=T(),{parseTemplate:wS,warnMissedAreas:vS,getGridGap:xS,warnGridGap:kS,inheritGridGap:SS}=je(),co=class extends bS{insert(e,t,r,s){if(t!=="-ms-")return super.insert(e,t,r);if(e.parent.some(g=>g.prop==="-ms-grid-rows"))return;let n=xS(e),a=SS(e,n),{rows:o,columns:f,areas:c}=wS({decl:e,gap:a||n}),u=Object.keys(c).length>0,p=Boolean(o),d=Boolean(f);return kS({gap:n,hasColumns:d,decl:e,result:s}),vS(c,e,s),(p&&d||u)&&e.cloneBefore({prop:"-ms-grid-rows",value:o,raws:{}}),d&&e.cloneBefore({prop:"-ms-grid-columns",value:f,raws:{}}),e}};co.names=["grid-template"];qm.exports=co});var Mm=b((uP,Rm)=>{l();var _S=T(),po=class extends _S{prefixed(e,t){return t+e.replace("-inline","")}normalize(e){return e.replace(/(margin|padding|border)-(start|end)/,"$1-inline-$2")}};po.names=["border-inline-start","border-inline-end","margin-inline-start","margin-inline-end","padding-inline-start","padding-inline-end","border-start","border-end","margin-start","margin-end","padding-start","padding-end"];Rm.exports=po});var Fm=b((fP,Lm)=>{l();var CS=T(),ho=class extends CS{check(e){return!e.value.includes("flex-")&&e.value!=="baseline"}prefixed(e,t){return t+"grid-row-align"}normalize(){return"align-self"}};ho.names=["grid-row-align"];Lm.exports=ho});var Nm=b((cP,Bm)=>{l();var AS=T(),Pt=class extends AS{keyframeParents(e){let{parent:t}=e;for(;t;){if(t.type==="atrule"&&t.name==="keyframes")return!0;({parent:t}=t)}return!1}contain3d(e){if(e.prop==="transform-origin")return!1;for(let t of Pt.functions3d)if(e.value.includes(`${t}(`))return!0;return!1}set(e,t){return e=super.set(e,t),t==="-ms-"&&(e.value=e.value.replace(/rotatez/gi,"rotate")),e}insert(e,t,r){if(t==="-ms-"){if(!this.contain3d(e)&&!this.keyframeParents(e))return super.insert(e,t,r)}else if(t==="-o-"){if(!this.contain3d(e))return super.insert(e,t,r)}else return super.insert(e,t,r)}};Pt.names=["transform","transform-origin"];Pt.functions3d=["matrix3d","translate3d","translateZ","scale3d","scaleZ","rotate3d","rotateX","rotateY","perspective"];Bm.exports=Pt});var jm=b((pP,$m)=>{l();var zm=Z(),ES=T(),mo=class extends ES{normalize(){return"flex-direction"}insert(e,t,r){let s;if([s,t]=zm(t),s!==2009)return super.insert(e,t,r);if(e.parent.some(u=>u.prop===t+"box-orient"||u.prop===t+"box-direction"))return;let a=e.value,o,f;a==="inherit"||a==="initial"||a==="unset"?(o=a,f=a):(o=a.includes("row")?"horizontal":"vertical",f=a.includes("reverse")?"reverse":"normal");let c=this.clone(e);return c.prop=t+"box-orient",c.value=o,this.needCascade(e)&&(c.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,c),c=this.clone(e),c.prop=t+"box-direction",c.value=f,this.needCascade(e)&&(c.raws.before=this.calcBefore(r,e,t)),e.parent.insertBefore(e,c)}old(e,t){let r;return[r,t]=zm(t),r===2009?[t+"box-orient",t+"box-direction"]:super.old(e,t)}};mo.names=["flex-direction","box-direction","box-orient"];$m.exports=mo});var Vm=b((dP,Um)=>{l();var OS=T(),go=class extends OS{check(e){return e.value==="pixelated"}prefixed(e,t){return t==="-ms-"?"-ms-interpolation-mode":super.prefixed(e,t)}set(e,t){return t!=="-ms-"?super.set(e,t):(e.prop="-ms-interpolation-mode",e.value="nearest-neighbor",e)}normalize(){return"image-rendering"}process(e,t){return super.process(e,t)}};go.names=["image-rendering","interpolation-mode"];Um.exports=go});var Gm=b((hP,Wm)=>{l();var TS=T(),PS=J(),yo=class extends TS{constructor(e,t,r){super(e,t,r);this.prefixes&&(this.prefixes=PS.uniq(this.prefixes.map(s=>s==="-ms-"?"-webkit-":s)))}};yo.names=["backdrop-filter"];Wm.exports=yo});var Hm=b((mP,Ym)=>{l();var DS=T(),qS=J(),bo=class extends DS{constructor(e,t,r){super(e,t,r);this.prefixes&&(this.prefixes=qS.uniq(this.prefixes.map(s=>s==="-ms-"?"-webkit-":s)))}check(e){return e.value.toLowerCase()==="text"}};bo.names=["background-clip"];Ym.exports=bo});var Jm=b((gP,Qm)=>{l();var IS=T(),RS=["none","underline","overline","line-through","blink","inherit","initial","unset"],wo=class extends IS{check(e){return e.value.split(/\s+/).some(t=>!RS.includes(t))}};wo.names=["text-decoration"];Qm.exports=wo});var Zm=b((yP,Km)=>{l();var Xm=Z(),MS=T(),Dt=class extends MS{prefixed(e,t){let r;return[r,t]=Xm(t),r===2009?t+"box-pack":r===2012?t+"flex-pack":super.prefixed(e,t)}normalize(){return"justify-content"}set(e,t){let r=Xm(t)[0];if(r===2009||r===2012){let s=Dt.oldValues[e.value]||e.value;if(e.value=s,r!==2009||s!=="distribute")return super.set(e,t)}else if(r==="final")return super.set(e,t)}};Dt.names=["justify-content","flex-pack","box-pack"];Dt.oldValues={"flex-end":"end","flex-start":"start","space-between":"justify","space-around":"distribute"};Km.exports=Dt});var tg=b((bP,eg)=>{l();var LS=T(),vo=class extends LS{set(e,t){let r=e.value.toLowerCase();return t==="-webkit-"&&!r.includes(" ")&&r!=="contain"&&r!=="cover"&&(e.value=e.value+" "+e.value),super.set(e,t)}};vo.names=["background-size"];eg.exports=vo});var ig=b((wP,rg)=>{l();var FS=T(),xo=je(),ko=class extends FS{insert(e,t,r){if(t!=="-ms-")return super.insert(e,t,r);let s=xo.parse(e),[n,a]=xo.translate(s,0,1);s[0]&&s[0].includes("span")&&(a=s[0].join("").replace(/\D/g,"")),[[e.prop,n],[`${e.prop}-span`,a]].forEach(([f,c])=>{xo.insertDecl(e,f,c)})}};ko.names=["grid-row","grid-column"];rg.exports=ko});var ag=b((vP,ng)=>{l();var BS=T(),{prefixTrackProp:sg,prefixTrackValue:NS,autoplaceGridItems:zS,getGridGap:$S,inheritGridGap:jS}=je(),US=za(),So=class extends BS{prefixed(e,t){return t==="-ms-"?sg({prop:e,prefix:t}):super.prefixed(e,t)}normalize(e){return e.replace(/^grid-(rows|columns)/,"grid-template-$1")}insert(e,t,r,s){if(t!=="-ms-")return super.insert(e,t,r);let{parent:n,prop:a,value:o}=e,f=a.includes("rows"),c=a.includes("columns"),u=n.some(C=>C.prop==="grid-template"||C.prop==="grid-template-areas");if(u&&f)return!1;let p=new US({options:{}}),d=p.gridStatus(n,s),g=$S(e);g=jS(e,g)||g;let y=f?g.row:g.column;(d==="no-autoplace"||d===!0)&&!u&&(y=null);let x=NS({value:o,gap:y});e.cloneBefore({prop:sg({prop:a,prefix:t}),value:x});let w=n.nodes.find(C=>C.prop==="grid-auto-flow"),v="row";if(w&&!p.disabled(w,s)&&(v=w.value.trim()),d==="autoplace"){let C=n.nodes.find(I=>I.prop==="grid-template-rows");if(!C&&u)return;if(!C&&!u){e.warn(s,"Autoplacement does not work without grid-template-rows property");return}!n.nodes.find(I=>I.prop==="grid-template-columns")&&!u&&e.warn(s,"Autoplacement does not work without grid-template-columns property"),c&&!u&&zS(e,s,g,v)}}};So.names=["grid-template-rows","grid-template-columns","grid-rows","grid-columns"];ng.exports=So});var lg=b((xP,og)=>{l();var VS=T(),_o=class extends VS{check(e){return!e.value.includes("flex-")&&e.value!=="baseline"}prefixed(e,t){return t+"grid-column-align"}normalize(){return"justify-self"}};_o.names=["grid-column-align"];og.exports=_o});var fg=b((kP,ug)=>{l();var WS=T(),Co=class extends WS{prefixed(e,t){return t+"scroll-chaining"}normalize(){return"overscroll-behavior"}set(e,t){return e.value==="auto"?e.value="chained":(e.value==="none"||e.value==="contain")&&(e.value="none"),super.set(e,t)}};Co.names=["overscroll-behavior","scroll-chaining"];ug.exports=Co});var dg=b((SP,pg)=>{l();var GS=T(),{parseGridAreas:YS,warnMissedAreas:HS,prefixTrackProp:QS,prefixTrackValue:cg,getGridGap:JS,warnGridGap:XS,inheritGridGap:KS}=je();function ZS(i){return i.trim().slice(1,-1).split(/["']\s*["']?/g)}var Ao=class extends GS{insert(e,t,r,s){if(t!=="-ms-")return super.insert(e,t,r);let n=!1,a=!1,o=e.parent,f=JS(e);f=KS(e,f)||f,o.walkDecls(/-ms-grid-rows/,p=>p.remove()),o.walkDecls(/grid-template-(rows|columns)/,p=>{if(p.prop==="grid-template-rows"){a=!0;let{prop:d,value:g}=p;p.cloneBefore({prop:QS({prop:d,prefix:t}),value:cg({value:g,gap:f.row})})}else n=!0});let c=ZS(e.value);n&&!a&&f.row&&c.length>1&&e.cloneBefore({prop:"-ms-grid-rows",value:cg({value:`repeat(${c.length}, auto)`,gap:f.row}),raws:{}}),XS({gap:f,hasColumns:n,decl:e,result:s});let u=YS({rows:c,gap:f});return HS(u,e,s),e}};Ao.names=["grid-template-areas"];pg.exports=Ao});var mg=b((_P,hg)=>{l();var e_=T(),Eo=class extends e_{set(e,t){return t==="-webkit-"&&(e.value=e.value.replace(/\s*(right|left)\s*/i,"")),super.set(e,t)}};Eo.names=["text-emphasis-position"];hg.exports=Eo});var yg=b((CP,gg)=>{l();var t_=T(),Oo=class extends t_{set(e,t){return e.prop==="text-decoration-skip-ink"&&e.value==="auto"?(e.prop=t+"text-decoration-skip",e.value="ink",e):super.set(e,t)}};Oo.names=["text-decoration-skip-ink","text-decoration-skip"];gg.exports=Oo});var Sg=b((AP,kg)=>{l();"use strict";kg.exports={wrap:bg,limit:wg,validate:vg,test:To,curry:r_,name:xg};function bg(i,e,t){var r=e-i;return((t-i)%r+r)%r+i}function wg(i,e,t){return Math.max(i,Math.min(e,t))}function vg(i,e,t,r,s){if(!To(i,e,t,r,s))throw new Error(t+" is outside of range ["+i+","+e+")");return t}function To(i,e,t,r,s){return!(te||s&&t===e||r&&t===i)}function xg(i,e,t,r){return(t?"(":"[")+i+","+e+(r?")":"]")}function r_(i,e,t,r){var s=xg.bind(null,i,e,t,r);return{wrap:bg.bind(null,i,e),limit:wg.bind(null,i,e),validate:function(n){return vg(i,e,n,t,r)},test:function(n){return To(i,e,n,t,r)},toString:s,name:s}}});var Ag=b((EP,Cg)=>{l();var Po=Tr(),i_=Sg(),s_=kt(),n_=ae(),a_=J(),_g=/top|left|right|bottom/gi,De=class extends n_{replace(e,t){let r=Po(e);for(let s of r.nodes)if(s.type==="function"&&s.value===this.name)if(s.nodes=this.newDirection(s.nodes),s.nodes=this.normalize(s.nodes),t==="-webkit- old"){if(!this.oldWebkit(s))return!1}else s.nodes=this.convertDirection(s.nodes),s.value=t+s.value;return r.toString()}replaceFirst(e,...t){return t.map(s=>s===" "?{type:"space",value:s}:{type:"word",value:s}).concat(e.slice(1))}normalizeUnit(e,t){return`${parseFloat(e)/t*360}deg`}normalize(e){if(!e[0])return e;if(/-?\d+(.\d+)?grad/.test(e[0].value))e[0].value=this.normalizeUnit(e[0].value,400);else if(/-?\d+(.\d+)?rad/.test(e[0].value))e[0].value=this.normalizeUnit(e[0].value,2*Math.PI);else if(/-?\d+(.\d+)?turn/.test(e[0].value))e[0].value=this.normalizeUnit(e[0].value,1);else if(e[0].value.includes("deg")){let t=parseFloat(e[0].value);t=i_.wrap(0,360,t),e[0].value=`${t}deg`}return e[0].value==="0deg"?e=this.replaceFirst(e,"to"," ","top"):e[0].value==="90deg"?e=this.replaceFirst(e,"to"," ","right"):e[0].value==="180deg"?e=this.replaceFirst(e,"to"," ","bottom"):e[0].value==="270deg"&&(e=this.replaceFirst(e,"to"," ","left")),e}newDirection(e){if(e[0].value==="to"||(_g.lastIndex=0,!_g.test(e[0].value)))return e;e.unshift({type:"word",value:"to"},{type:"space",value:" "});for(let t=2;t0&&(e[0].value==="to"?this.fixDirection(e):e[0].value.includes("deg")?this.fixAngle(e):this.isRadial(e)&&this.fixRadial(e)),e}fixDirection(e){e.splice(0,2);for(let t of e){if(t.type==="div")break;t.type==="word"&&(t.value=this.revertDirection(t.value))}}fixAngle(e){let t=e[0].value;t=parseFloat(t),t=Math.abs(450-t)%360,t=this.roundFloat(t,3),e[0].value=`${t}deg`}fixRadial(e){let t=[],r=[],s,n,a,o,f;for(o=0;o{l();var o_=kt(),l_=ae();function Eg(i){return new RegExp(`(^|[\\s,(])(${i}($|[\\s),]))`,"gi")}var Do=class extends l_{regexp(){return this.regexpCache||(this.regexpCache=Eg(this.name)),this.regexpCache}isStretch(){return this.name==="stretch"||this.name==="fill"||this.name==="fill-available"}replace(e,t){return t==="-moz-"&&this.isStretch()?e.replace(this.regexp(),"$1-moz-available$3"):t==="-webkit-"&&this.isStretch()?e.replace(this.regexp(),"$1-webkit-fill-available$3"):super.replace(e,t)}old(e){let t=e+this.name;return this.isStretch()&&(e==="-moz-"?t="-moz-available":e==="-webkit-"&&(t="-webkit-fill-available")),new o_(this.name,t,t,Eg(t))}add(e,t){if(!(e.prop.includes("grid")&&t!=="-webkit-"))return super.add(e,t)}};Do.names=["max-content","min-content","fit-content","fill","fill-available","stretch"];Og.exports=Do});var qg=b((TP,Dg)=>{l();var Pg=kt(),u_=ae(),qo=class extends u_{replace(e,t){return t==="-webkit-"?e.replace(this.regexp(),"$1-webkit-optimize-contrast"):t==="-moz-"?e.replace(this.regexp(),"$1-moz-crisp-edges"):super.replace(e,t)}old(e){return e==="-webkit-"?new Pg(this.name,"-webkit-optimize-contrast"):e==="-moz-"?new Pg(this.name,"-moz-crisp-edges"):super.old(e)}};qo.names=["pixelated"];Dg.exports=qo});var Rg=b((PP,Ig)=>{l();var f_=ae(),Io=class extends f_{replace(e,t){let r=super.replace(e,t);return t==="-webkit-"&&(r=r.replace(/("[^"]+"|'[^']+')(\s+\d+\w)/gi,"url($1)$2")),r}};Io.names=["image-set"];Ig.exports=Io});var Lg=b((DP,Mg)=>{l();var c_=te().list,p_=ae(),Ro=class extends p_{replace(e,t){return c_.space(e).map(r=>{if(r.slice(0,+this.name.length+1)!==this.name+"(")return r;let s=r.lastIndexOf(")"),n=r.slice(s+1),a=r.slice(this.name.length+1,s);if(t==="-webkit-"){let o=a.match(/\d*.?\d+%?/);o?(a=a.slice(o[0].length).trim(),a+=`, ${o[0]}`):a+=", 0.5"}return t+this.name+"("+a+")"+n}).join(" ")}};Ro.names=["cross-fade"];Mg.exports=Ro});var Bg=b((qP,Fg)=>{l();var d_=Z(),h_=kt(),m_=ae(),Mo=class extends m_{constructor(e,t){super(e,t);e==="display-flex"&&(this.name="flex")}check(e){return e.prop==="display"&&e.value===this.name}prefixed(e){let t,r;return[t,e]=d_(e),t===2009?this.name==="flex"?r="box":r="inline-box":t===2012?this.name==="flex"?r="flexbox":r="inline-flexbox":t==="final"&&(r=this.name),e+r}replace(e,t){return this.prefixed(t)}old(e){let t=this.prefixed(e);if(!!t)return new h_(this.name,t)}};Mo.names=["display-flex","inline-flex"];Fg.exports=Mo});var zg=b((IP,Ng)=>{l();var g_=ae(),Lo=class extends g_{constructor(e,t){super(e,t);e==="display-grid"&&(this.name="grid")}check(e){return e.prop==="display"&&e.value===this.name}};Lo.names=["display-grid","inline-grid"];Ng.exports=Lo});var jg=b((RP,$g)=>{l();var y_=ae(),Fo=class extends y_{constructor(e,t){super(e,t);e==="filter-function"&&(this.name="filter")}};Fo.names=["filter","filter-function"];$g.exports=Fo});var Gg=b((MP,Wg)=>{l();var Ug=Dr(),P=T(),Vg=Bd(),b_=Ud(),w_=za(),v_=lh(),Bo=$e(),qt=St(),x_=gh(),_e=ae(),It=J(),k_=bh(),S_=vh(),__=kh(),C_=_h(),A_=Th(),E_=qh(),O_=Rh(),T_=Lh(),P_=Bh(),D_=zh(),q_=jh(),I_=Vh(),R_=Gh(),M_=Hh(),L_=Jh(),F_=Zh(),B_=tm(),N_=sm(),z_=am(),$_=lm(),j_=cm(),U_=dm(),V_=gm(),W_=bm(),G_=vm(),Y_=km(),H_=_m(),Q_=Em(),J_=Tm(),X_=Dm(),K_=Im(),Z_=Mm(),eC=Fm(),tC=Nm(),rC=jm(),iC=Vm(),sC=Gm(),nC=Hm(),aC=Jm(),oC=Zm(),lC=tg(),uC=ig(),fC=ag(),cC=lg(),pC=fg(),dC=dg(),hC=mg(),mC=yg(),gC=Ag(),yC=Tg(),bC=qg(),wC=Rg(),vC=Lg(),xC=Bg(),kC=zg(),SC=jg();qt.hack(k_);qt.hack(S_);qt.hack(__);qt.hack(C_);P.hack(A_);P.hack(E_);P.hack(O_);P.hack(T_);P.hack(P_);P.hack(D_);P.hack(q_);P.hack(I_);P.hack(R_);P.hack(M_);P.hack(L_);P.hack(F_);P.hack(B_);P.hack(N_);P.hack(z_);P.hack($_);P.hack(j_);P.hack(U_);P.hack(V_);P.hack(W_);P.hack(G_);P.hack(Y_);P.hack(H_);P.hack(Q_);P.hack(J_);P.hack(X_);P.hack(K_);P.hack(Z_);P.hack(eC);P.hack(tC);P.hack(rC);P.hack(iC);P.hack(sC);P.hack(nC);P.hack(aC);P.hack(oC);P.hack(lC);P.hack(uC);P.hack(fC);P.hack(cC);P.hack(pC);P.hack(dC);P.hack(hC);P.hack(mC);_e.hack(gC);_e.hack(yC);_e.hack(bC);_e.hack(wC);_e.hack(vC);_e.hack(xC);_e.hack(kC);_e.hack(SC);var No=new Map,Ir=class{constructor(e,t,r={}){this.data=e,this.browsers=t,this.options=r,[this.add,this.remove]=this.preprocess(this.select(this.data)),this.transition=new b_(this),this.processor=new w_(this)}cleaner(){if(this.cleanerCache)return this.cleanerCache;if(this.browsers.selected.length){let e=new Bo(this.browsers.data,[]);this.cleanerCache=new Ir(this.data,e,this.options)}else return this;return this.cleanerCache}select(e){let t={add:{},remove:{}};for(let r in e){let s=e[r],n=s.browsers.map(f=>{let c=f.split(" ");return{browser:`${c[0]} ${c[1]}`,note:c[2]}}),a=n.filter(f=>f.note).map(f=>`${this.browsers.prefix(f.browser)} ${f.note}`);a=It.uniq(a),n=n.filter(f=>this.browsers.isSelected(f.browser)).map(f=>{let c=this.browsers.prefix(f.browser);return f.note?`${c} ${f.note}`:c}),n=this.sort(It.uniq(n)),this.options.flexbox==="no-2009"&&(n=n.filter(f=>!f.includes("2009")));let o=s.browsers.map(f=>this.browsers.prefix(f));s.mistakes&&(o=o.concat(s.mistakes)),o=o.concat(a),o=It.uniq(o),n.length?(t.add[r]=n,n.length!n.includes(f)))):t.remove[r]=o}return t}sort(e){return e.sort((t,r)=>{let s=It.removeNote(t).length,n=It.removeNote(r).length;return s===n?r.length-t.length:n-s})}preprocess(e){let t={selectors:[],"@supports":new v_(Ir,this)};for(let s in e.add){let n=e.add[s];if(s==="@keyframes"||s==="@viewport")t[s]=new x_(s,n,this);else if(s==="@resolution")t[s]=new Vg(s,n,this);else if(this.data[s].selector)t.selectors.push(qt.load(s,n,this));else{let a=this.data[s].props;if(a){let o=_e.load(s,n,this);for(let f of a)t[f]||(t[f]={values:[]}),t[f].values.push(o)}else{let o=t[s]&&t[s].values||[];t[s]=P.load(s,n,this),t[s].values=o}}}let r={selectors:[]};for(let s in e.remove){let n=e.remove[s];if(this.data[s].selector){let a=qt.load(s,n);for(let o of n)r.selectors.push(a.old(o))}else if(s==="@keyframes"||s==="@viewport")for(let a of n){let o=`@${a}${s.slice(1)}`;r[o]={remove:!0}}else if(s==="@resolution")r[s]=new Vg(s,n,this);else{let a=this.data[s].props;if(a){let o=_e.load(s,[],this);for(let f of n){let c=o.old(f);if(c)for(let u of a)r[u]||(r[u]={}),r[u].values||(r[u].values=[]),r[u].values.push(c)}}else for(let o of n){let f=this.decl(s).old(s,o);if(s==="align-self"){let c=t[s]&&t[s].prefixes;if(c){if(o==="-webkit- 2009"&&c.includes("-webkit-"))continue;if(o==="-webkit-"&&c.includes("-webkit- 2009"))continue}}for(let c of f)r[c]||(r[c]={}),r[c].remove=!0}}}return[t,r]}decl(e){return No.has(e)||No.set(e,P.load(e)),No.get(e)}unprefixed(e){let t=this.normalize(Ug.unprefixed(e));return t==="flex-direction"&&(t="flex-flow"),t}normalize(e){return this.decl(e).normalize(e)}prefixed(e,t){return e=Ug.unprefixed(e),this.decl(e).prefixed(e,t)}values(e,t){let r=this[e],s=r["*"]&&r["*"].values,n=r[t]&&r[t].values;return s&&n?It.uniq(s.concat(n)):s||n||[]}group(e){let t=e.parent,r=t.index(e),{length:s}=t.nodes,n=this.unprefixed(e.prop),a=(o,f)=>{for(r+=o;r>=0&&r{l();Yg.exports={"backface-visibility":{mistakes:["-ms-","-o-"],feature:"transforms3d",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},"backdrop-filter":{feature:"css-backdrop-filter",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},element:{props:["background","background-image","border-image","mask","list-style","list-style-image","content","mask-image"],feature:"css-element-function",browsers:["firefox 89"]},"user-select":{mistakes:["-khtml-"],feature:"user-select-none",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},"background-clip":{feature:"background-clip-text",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},hyphens:{feature:"css-hyphens",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},":fullscreen":{selector:!0,feature:"fullscreen",browsers:["and_chr 92","and_uc 12.12","safari 14.1"]},"::backdrop":{selector:!0,feature:"fullscreen",browsers:["and_chr 92","and_uc 12.12","safari 14.1"]},"::file-selector-button":{selector:!0,feature:"fullscreen",browsers:["safari 14.1"]},"tab-size":{feature:"css3-tabsize",browsers:["firefox 89"]},fill:{props:["width","min-width","max-width","height","min-height","max-height","inline-size","min-inline-size","max-inline-size","block-size","min-block-size","max-block-size","grid","grid-template","grid-template-rows","grid-template-columns","grid-auto-columns","grid-auto-rows"],feature:"intrinsic-width",browsers:["and_chr 92","chrome 91","chrome 92","edge 91","samsung 14.0"]},"fill-available":{props:["width","min-width","max-width","height","min-height","max-height","inline-size","min-inline-size","max-inline-size","block-size","min-block-size","max-block-size","grid","grid-template","grid-template-rows","grid-template-columns","grid-auto-columns","grid-auto-rows"],feature:"intrinsic-width",browsers:["and_chr 92","chrome 91","chrome 92","edge 91","samsung 14.0"]},stretch:{props:["width","min-width","max-width","height","min-height","max-height","inline-size","min-inline-size","max-inline-size","block-size","min-block-size","max-block-size","grid","grid-template","grid-template-rows","grid-template-columns","grid-auto-columns","grid-auto-rows"],feature:"intrinsic-width",browsers:["firefox 89"]},"fit-content":{props:["width","min-width","max-width","height","min-height","max-height","inline-size","min-inline-size","max-inline-size","block-size","min-block-size","max-block-size","grid","grid-template","grid-template-rows","grid-template-columns","grid-auto-columns","grid-auto-rows"],feature:"intrinsic-width",browsers:["firefox 89"]},"text-decoration-style":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-decoration-color":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-decoration-line":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-decoration":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-decoration-skip":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-decoration-skip-ink":{feature:"text-decoration",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"text-size-adjust":{feature:"text-size-adjust",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7"]},"mask-clip":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-composite":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-image":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-origin":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-repeat":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border-repeat":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border-source":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},mask:{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-position":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-size":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border-outset":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border-width":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"mask-border-slice":{feature:"css-masks",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"clip-path":{feature:"css-clip-path",browsers:["and_uc 12.12","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"box-decoration-break":{feature:"css-boxdecorationbreak",browsers:["and_chr 92","chrome 91","chrome 92","edge 91","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"@resolution":{feature:"css-media-resolution",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},"border-inline-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"border-inline-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"margin-inline-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"margin-inline-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"padding-inline-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"padding-inline-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"border-block-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"border-block-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"margin-block-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"margin-block-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"padding-block-start":{feature:"css-logical-props",browsers:["and_uc 12.12"]},"padding-block-end":{feature:"css-logical-props",browsers:["and_uc 12.12"]},appearance:{feature:"css-appearance",browsers:["and_uc 12.12","ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1","samsung 14.0"]},"image-set":{props:["background","background-image","border-image","cursor","mask","mask-image","list-style","list-style-image","content"],feature:"css-image-set",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},"cross-fade":{props:["background","background-image","border-image","mask","list-style","list-style-image","content","mask-image"],feature:"css-cross-fade",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},"text-emphasis":{feature:"text-emphasis",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},"text-emphasis-position":{feature:"text-emphasis",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},"text-emphasis-style":{feature:"text-emphasis",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},"text-emphasis-color":{feature:"text-emphasis",browsers:["and_chr 92","and_uc 12.12","chrome 91","chrome 92","edge 91","samsung 14.0"]},":any-link":{selector:!0,feature:"css-any-link",browsers:["and_uc 12.12"]},isolate:{props:["unicode-bidi"],feature:"css-unicode-bidi",browsers:["ios_saf 14.0-14.4","ios_saf 14.5-14.7","safari 14.1"]},"color-adjust":{feature:"css-color-adjust",browsers:["chrome 91","chrome 92","edge 91","safari 14.1"]}}});var Jg=b((FP,Qg)=>{l();Qg.exports={}});var ey=b((BP,Zg)=>{l();var _C=Ma(),{agents:CC}=(Ji(),Qi),zo=hs(),AC=$e(),EC=Gg(),OC=Hg(),TC=Jg(),Xg={browsers:CC,prefixes:OC},Kg=` - Replace Autoprefixer \`browsers\` option to Browserslist config. - Use \`browserslist\` key in \`package.json\` or \`.browserslistrc\` file. - - Using \`browsers\` option can cause errors. Browserslist config can - be used for Babel, Autoprefixer, postcss-normalize and other tools. - - If you really need to use option, rename it to \`overrideBrowserslist\`. - - Learn more at: - https://github.com/browserslist/browserslist#readme - https://twitter.com/browserslist - -`;function PC(i){return Object.prototype.toString.apply(i)==="[object Object]"}var $o=new Map;function DC(i,e){e.browsers.selected.length!==0&&(e.add.selectors.length>0||Object.keys(e.add).length>2||i.warn(`Autoprefixer target browsers do not need any prefixes.You do not need Autoprefixer anymore. -Check your Browserslist config to be sure that your targets are set up correctly. - - Learn more at: - https://github.com/postcss/autoprefixer#readme - https://github.com/browserslist/browserslist#readme - -`))}Zg.exports=Rt;function Rt(...i){let e;if(i.length===1&&PC(i[0])?(e=i[0],i=void 0):i.length===0||i.length===1&&!i[0]?i=void 0:i.length<=2&&(Array.isArray(i[0])||!i[0])?(e=i[1],i=i[0]):typeof i[i.length-1]=="object"&&(e=i.pop()),e||(e={}),e.browser)throw new Error("Change `browser` option to `overrideBrowserslist` in Autoprefixer");if(e.browserslist)throw new Error("Change `browserslist` option to `overrideBrowserslist` in Autoprefixer");e.overrideBrowserslist?i=e.overrideBrowserslist:e.browsers&&(typeof console!="undefined"&&console.warn&&(zo.red?console.warn(zo.red(Kg.replace(/`[^`]+`/g,s=>zo.yellow(s.slice(1,-1))))):console.warn(Kg)),i=e.browsers);let t={ignoreUnknownVersions:e.ignoreUnknownVersions,stats:e.stats,env:e.env};function r(s){let n=Xg,a=new AC(n.browsers,i,s,t),o=a.selected.join(", ")+JSON.stringify(e);return $o.has(o)||$o.set(o,new EC(n.prefixes,a,e)),$o.get(o)}return{postcssPlugin:"autoprefixer",prepare(s){let n=r({from:s.opts.from,env:e.env});return{OnceExit(a){DC(s,n),e.remove!==!1&&n.processor.remove(a,s),e.add!==!1&&n.processor.add(a,s)}}},info(s){return s=s||{},s.from=s.from||h.cwd(),TC(r(s))},options:e,browsers:i}}Rt.postcss=!0;Rt.data=Xg;Rt.defaults=_C.defaults;Rt.info=()=>Rt().info()});var ty={};me(ty,{default:()=>qC});var qC,ry=S(()=>{l();qC=[]});var sy={};me(sy,{default:()=>IC});var iy,IC,ny=S(()=>{l();$r();iy=V(Lt()),IC=Ie(iy.default.theme)});var oy={};me(oy,{default:()=>RC});var ay,RC,ly=S(()=>{l();$r();ay=V(Lt()),RC=Ie(ay.default)});function uy(i,e){return{handler:i,config:e}}var fy,cy=S(()=>{l();uy.withOptions=function(i,e=()=>({})){let t=function(r){return{__options:r,handler:i(r),config:e(r)}};return t.__isOptionsFunction=!0,t.__pluginFunction=i,t.__configFunction=e,t};fy=uy});var py={};me(py,{default:()=>MC});var MC,dy=S(()=>{l();cy();MC=fy});l();"use strict";var LC=qe(Sd()),FC=qe(te()),BC=qe(ey()),NC=qe((ry(),ty)),zC=qe((ny(),sy)),$C=qe((ly(),oy)),jC=qe((os(),cl)),UC=qe((dy(),py)),VC=qe((fs(),_l));function qe(i){return i&&i.__esModule?i:{default:i}}console.warn("cdn.tailwindcss.com should not be used in production. To use Tailwind CSS in production, install it as a PostCSS plugin or use the Tailwind CLI: https://tailwindcss.com/docs/installation");var Ki="tailwind",jo="text/tailwindcss",hy="/template.html",et,my=!0,gy=0,Uo=new Set,Vo,yy="",by=(i=!1)=>({get(e,t){return(!i||t==="config")&&typeof e[t]=="object"&&e[t]!==null?new Proxy(e[t],by()):e[t]},set(e,t,r){return e[t]=r,(!i||t==="config")&&Wo(!0),!0}});window[Ki]=new Proxy({config:{},defaultTheme:zC.default,defaultConfig:$C.default,colors:jC.default,plugin:UC.default,resolveConfig:VC.default},by(!0));function wy(i){Vo.observe(i,{attributes:!0,attributeFilter:["type"],characterData:!0,subtree:!0,childList:!0})}new MutationObserver(async i=>{let e=!1;if(!Vo){Vo=new MutationObserver(async()=>await Wo(!0));for(let t of document.querySelectorAll(`style[type="${jo}"]`))wy(t)}for(let t of i)for(let r of t.addedNodes)r.nodeType===1&&r.tagName==="STYLE"&&r.getAttribute("type")===jo&&(wy(r),e=!0);await Wo(e)}).observe(document.documentElement,{attributes:!0,attributeFilter:["class"],childList:!0,subtree:!0});async function Wo(i=!1){i&&(gy++,Uo.clear());let e="";for(let r of document.querySelectorAll(`style[type="${jo}"]`))e+=r.textContent;let t=new Set;for(let r of document.querySelectorAll("[class]"))for(let s of r.classList)Uo.has(s)||t.add(s);if(document.body&&(my||t.size>0||e!==yy||!et||!et.isConnected)){for(let s of t)Uo.add(s);my=!1,yy=e,self[hy]=Array.from(t).join(" ");let r=(0,FC.default)([(0,LC.default)({...window[Ki].config,_hash:gy,content:[hy],plugins:[...NC.default,...Array.isArray(window[Ki].config.plugins)?window[Ki].config.plugins:[]]}),(0,BC.default)({remove:!1})]).process(`@tailwind base;@tailwind components;@tailwind utilities;${e}`).css;(!et||!et.isConnected)&&(et=document.createElement("style"),document.head.append(et)),et.textContent=r}}})(); -/*! https://mths.be/cssesc v3.0.0 by @mathias */ \ No newline at end of file diff --git a/src/C4Sharp/Resources/index.html b/src/C4Sharp/Resources/index.html deleted file mode 100644 index dbe0af6..0000000 --- a/src/C4Sharp/Resources/index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - Index - - - -
    -
    - logo -
    - - -
    -

    Diagrams

    -
      - {{diagrams-items}} -
    -
    - -
    -
    -

    This document was build by C4Sharp

    - -
    -
    - - - \ No newline at end of file From 58d0c456815d3c538d4d3acb0ae6d97ed56209d3 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 11:27:03 -0300 Subject: [PATCH 02/12] Rename folder Model to Elements --- src/C4Sharp/{Models => Elements}/Component.cs | 4 ++-- .../{Models => Elements}/ComponentType.cs | 2 +- src/C4Sharp/{Models => Elements}/Container.cs | 5 ++--- .../{Models => Elements}/ContainerBoundary.cs | 11 ++++------ .../{Models => Elements}/ContainerType.cs | 2 +- .../{Models => Elements}/Containers/Api.cs | 2 +- .../Containers/BlobStore.cs | 2 +- .../Containers/ClientDesktop.cs | 2 +- .../Containers/ClientSideWebApp.cs | 2 +- .../Containers/Database.cs | 2 +- .../Containers/EventStreaming.cs | 2 +- .../Containers/FileSystem.cs | 2 +- .../Containers/MessageBroker.cs | 2 +- .../{Models => Elements}/Containers/Mobile.cs | 2 +- .../{Models => Elements}/Containers/Queue.cs | 2 +- .../Containers/ServerConsole.cs | 2 +- .../Containers/ServerSideWebApp.cs | 2 +- .../Containers/ServerlessFunction.cs | 2 +- .../Containers/ShellScript.cs | 2 +- .../{Models => Elements}/DeploymentNode.cs | 2 +- .../EnterpriseBoundary.cs | 2 +- src/C4Sharp/{Models => Elements}/IBoundary.cs | 2 +- src/C4Sharp/{Models => Elements}/Person.cs | 4 ++-- .../Plantuml/Constants/ElementName.cs | 2 +- .../Plantuml/Constants/LineStyle.cs | 2 +- .../Plantuml/Constants/Shape.cs | 2 +- .../Plantuml/ElementStyle.cs | 4 ++-- .../Plantuml/ElementTag.cs | 4 ++-- .../Plantuml/Extensions/PlantumlDiagram.cs | 5 ++--- .../Extensions/PlantumlRelationship.cs | 4 ++-- .../Plantuml/Extensions/PlantumlStructure.cs | 20 +++++++++---------- .../Plantuml/IO/PlantumlContext.cs | 5 ++--- .../Plantuml/IO/PlantumlException.cs | 2 +- .../Plantuml/IO/PlantumlResources.cs | 8 ++++---- .../Plantuml/RelationshipTag.cs | 4 ++-- .../Relationships/Boundary.cs | 2 +- .../Relationships/Direction.cs | 2 +- .../Relationships/Position.cs | 2 +- .../Relationships/Relationship.cs | 2 +- .../{Models => Elements}/SoftwareSystem.cs | 4 ++-- .../SoftwareSystemBoundary.cs | 5 +---- src/C4Sharp/{Models => Elements}/Structure.cs | 5 ++--- .../StructureCollection.cs | 2 +- .../{Models => Elements}/StructureIdentity.cs | 4 ++-- 44 files changed, 71 insertions(+), 81 deletions(-) rename src/C4Sharp/{Models => Elements}/Component.cs (97%) rename src/C4Sharp/{Models => Elements}/ComponentType.cs (89%) rename src/C4Sharp/{Models => Elements}/Container.cs (97%) rename src/C4Sharp/{Models => Elements}/ContainerBoundary.cs (88%) rename src/C4Sharp/{Models => Elements}/ContainerType.cs (96%) rename src/C4Sharp/{Models => Elements}/Containers/Api.cs (88%) rename src/C4Sharp/{Models => Elements}/Containers/BlobStore.cs (88%) rename src/C4Sharp/{Models => Elements}/Containers/ClientDesktop.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/ClientSideWebApp.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/Database.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/EventStreaming.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/FileSystem.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/MessageBroker.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/Mobile.cs (88%) rename src/C4Sharp/{Models => Elements}/Containers/Queue.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/ServerConsole.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/ServerSideWebApp.cs (89%) rename src/C4Sharp/{Models => Elements}/Containers/ServerlessFunction.cs (90%) rename src/C4Sharp/{Models => Elements}/Containers/ShellScript.cs (89%) rename src/C4Sharp/{Models => Elements}/DeploymentNode.cs (96%) rename src/C4Sharp/{Models => Elements}/EnterpriseBoundary.cs (87%) rename src/C4Sharp/{Models => Elements}/IBoundary.cs (72%) rename src/C4Sharp/{Models => Elements}/Person.cs (89%) rename src/C4Sharp/{Models => Elements}/Plantuml/Constants/ElementName.cs (93%) rename src/C4Sharp/{Models => Elements}/Plantuml/Constants/LineStyle.cs (93%) rename src/C4Sharp/{Models => Elements}/Plantuml/Constants/Shape.cs (91%) rename src/C4Sharp/{Models => Elements}/Plantuml/ElementStyle.cs (94%) rename src/C4Sharp/{Models => Elements}/Plantuml/ElementTag.cs (94%) rename src/C4Sharp/{Models => Elements}/Plantuml/Extensions/PlantumlDiagram.cs (97%) rename src/C4Sharp/{Models => Elements}/Plantuml/Extensions/PlantumlRelationship.cs (93%) rename src/C4Sharp/{Models => Elements}/Plantuml/Extensions/PlantumlStructure.cs (88%) rename src/C4Sharp/{Models => Elements}/Plantuml/IO/PlantumlContext.cs (98%) rename src/C4Sharp/{Models => Elements}/Plantuml/IO/PlantumlException.cs (87%) rename src/C4Sharp/{Models => Elements}/Plantuml/IO/PlantumlResources.cs (92%) rename src/C4Sharp/{Models => Elements}/Plantuml/RelationshipTag.cs (93%) rename src/C4Sharp/{Models => Elements}/Relationships/Boundary.cs (70%) rename src/C4Sharp/{Models => Elements}/Relationships/Direction.cs (72%) rename src/C4Sharp/{Models => Elements}/Relationships/Position.cs (74%) rename src/C4Sharp/{Models => Elements}/Relationships/Relationship.cs (98%) rename src/C4Sharp/{Models => Elements}/SoftwareSystem.cs (93%) rename src/C4Sharp/{Models => Elements}/SoftwareSystemBoundary.cs (84%) rename src/C4Sharp/{Models => Elements}/Structure.cs (96%) rename src/C4Sharp/{Models => Elements}/StructureCollection.cs (96%) rename src/C4Sharp/{Models => Elements}/StructureIdentity.cs (91%) diff --git a/src/C4Sharp/Models/Component.cs b/src/C4Sharp/Elements/Component.cs similarity index 97% rename from src/C4Sharp/Models/Component.cs rename to src/C4Sharp/Elements/Component.cs index c93072b..f18c1d0 100644 --- a/src/C4Sharp/Models/Component.cs +++ b/src/C4Sharp/Elements/Component.cs @@ -1,6 +1,6 @@ -using C4Sharp.Extensions; +using C4Sharp.Commons.Extensions; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// The word "component" is a hugely overloaded term in the software development industry, but in this context a diff --git a/src/C4Sharp/Models/ComponentType.cs b/src/C4Sharp/Elements/ComponentType.cs similarity index 89% rename from src/C4Sharp/Models/ComponentType.cs rename to src/C4Sharp/Elements/ComponentType.cs index f2555e2..104345b 100644 --- a/src/C4Sharp/Models/ComponentType.cs +++ b/src/C4Sharp/Elements/ComponentType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// Component types diff --git a/src/C4Sharp/Models/Container.cs b/src/C4Sharp/Elements/Container.cs similarity index 97% rename from src/C4Sharp/Models/Container.cs rename to src/C4Sharp/Elements/Container.cs index 6debf73..f3ad714 100644 --- a/src/C4Sharp/Models/Container.cs +++ b/src/C4Sharp/Elements/Container.cs @@ -1,7 +1,6 @@ -using System.ComponentModel; -using C4Sharp.Extensions; +using C4Sharp.Commons.Extensions; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// Not Docker! In the C4 model, a container represents an application or a data store. A container is something diff --git a/src/C4Sharp/Models/ContainerBoundary.cs b/src/C4Sharp/Elements/ContainerBoundary.cs similarity index 88% rename from src/C4Sharp/Models/ContainerBoundary.cs rename to src/C4Sharp/Elements/ContainerBoundary.cs index 5d63c4b..7e2cff2 100644 --- a/src/C4Sharp/Models/ContainerBoundary.cs +++ b/src/C4Sharp/Elements/ContainerBoundary.cs @@ -1,7 +1,7 @@ -using C4Sharp.Extensions; -using C4Sharp.Models.Relationships; +using C4Sharp.Commons.Extensions; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// Container Boundary @@ -29,12 +29,9 @@ public sealed record ContainerBoundary : ContainerBoundary { public ContainerBoundary():base(StructureIdentity.New(), typeof(T).ToNamingConvention()) { - } public ContainerBoundary(string label):base(StructureIdentity.New(), label) { - - } - + } } diff --git a/src/C4Sharp/Models/ContainerType.cs b/src/C4Sharp/Elements/ContainerType.cs similarity index 96% rename from src/C4Sharp/Models/ContainerType.cs rename to src/C4Sharp/Elements/ContainerType.cs index fa745d6..fa26d1f 100644 --- a/src/C4Sharp/Models/ContainerType.cs +++ b/src/C4Sharp/Elements/ContainerType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// Container Type diff --git a/src/C4Sharp/Models/Containers/Api.cs b/src/C4Sharp/Elements/Containers/Api.cs similarity index 88% rename from src/C4Sharp/Models/Containers/Api.cs rename to src/C4Sharp/Elements/Containers/Api.cs index b71eff9..d296381 100644 --- a/src/C4Sharp/Models/Containers/Api.cs +++ b/src/C4Sharp/Elements/Containers/Api.cs @@ -1,5 +1,5 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record Api(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Api, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/BlobStore.cs b/src/C4Sharp/Elements/Containers/BlobStore.cs similarity index 88% rename from src/C4Sharp/Models/Containers/BlobStore.cs rename to src/C4Sharp/Elements/Containers/BlobStore.cs index 01f97b5..f5320df 100644 --- a/src/C4Sharp/Models/Containers/BlobStore.cs +++ b/src/C4Sharp/Elements/Containers/BlobStore.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record BlobStore(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Blob, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ClientDesktop.cs b/src/C4Sharp/Elements/Containers/ClientDesktop.cs similarity index 89% rename from src/C4Sharp/Models/Containers/ClientDesktop.cs rename to src/C4Sharp/Elements/Containers/ClientDesktop.cs index ef807a4..cae113f 100644 --- a/src/C4Sharp/Models/Containers/ClientDesktop.cs +++ b/src/C4Sharp/Elements/Containers/ClientDesktop.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ClientDesktop(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.ClientDesktop, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ClientSideWebApp.cs b/src/C4Sharp/Elements/Containers/ClientSideWebApp.cs similarity index 89% rename from src/C4Sharp/Models/Containers/ClientSideWebApp.cs rename to src/C4Sharp/Elements/Containers/ClientSideWebApp.cs index c8db8d3..0eac460 100644 --- a/src/C4Sharp/Models/Containers/ClientSideWebApp.cs +++ b/src/C4Sharp/Elements/Containers/ClientSideWebApp.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ClientSideWebApp(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Spa, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/Database.cs b/src/C4Sharp/Elements/Containers/Database.cs similarity index 89% rename from src/C4Sharp/Models/Containers/Database.cs rename to src/C4Sharp/Elements/Containers/Database.cs index e9837a5..8f524de 100644 --- a/src/C4Sharp/Models/Containers/Database.cs +++ b/src/C4Sharp/Elements/Containers/Database.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record Database(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Database, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/EventStreaming.cs b/src/C4Sharp/Elements/Containers/EventStreaming.cs similarity index 89% rename from src/C4Sharp/Models/Containers/EventStreaming.cs rename to src/C4Sharp/Elements/Containers/EventStreaming.cs index 66fec7c..a715d0c 100644 --- a/src/C4Sharp/Models/Containers/EventStreaming.cs +++ b/src/C4Sharp/Elements/Containers/EventStreaming.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record EventStreaming(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Topic, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/FileSystem.cs b/src/C4Sharp/Elements/Containers/FileSystem.cs similarity index 89% rename from src/C4Sharp/Models/Containers/FileSystem.cs rename to src/C4Sharp/Elements/Containers/FileSystem.cs index 9167c7e..9e7bd94 100644 --- a/src/C4Sharp/Models/Containers/FileSystem.cs +++ b/src/C4Sharp/Elements/Containers/FileSystem.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record FileSystem(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.FileSystem, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/MessageBroker.cs b/src/C4Sharp/Elements/Containers/MessageBroker.cs similarity index 89% rename from src/C4Sharp/Models/Containers/MessageBroker.cs rename to src/C4Sharp/Elements/Containers/MessageBroker.cs index 0535bb4..0685e2f 100644 --- a/src/C4Sharp/Models/Containers/MessageBroker.cs +++ b/src/C4Sharp/Elements/Containers/MessageBroker.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record MessageBroker(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Queue, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/Mobile.cs b/src/C4Sharp/Elements/Containers/Mobile.cs similarity index 88% rename from src/C4Sharp/Models/Containers/Mobile.cs rename to src/C4Sharp/Elements/Containers/Mobile.cs index a2197b1..f4868a7 100644 --- a/src/C4Sharp/Models/Containers/Mobile.cs +++ b/src/C4Sharp/Elements/Containers/Mobile.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record Mobile(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Mobile, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/Queue.cs b/src/C4Sharp/Elements/Containers/Queue.cs similarity index 89% rename from src/C4Sharp/Models/Containers/Queue.cs rename to src/C4Sharp/Elements/Containers/Queue.cs index 7df287a..f8d595c 100644 --- a/src/C4Sharp/Models/Containers/Queue.cs +++ b/src/C4Sharp/Elements/Containers/Queue.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record Queue(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.Queue, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ServerConsole.cs b/src/C4Sharp/Elements/Containers/ServerConsole.cs similarity index 89% rename from src/C4Sharp/Models/Containers/ServerConsole.cs rename to src/C4Sharp/Elements/Containers/ServerConsole.cs index 68181f5..8a7e757 100644 --- a/src/C4Sharp/Models/Containers/ServerConsole.cs +++ b/src/C4Sharp/Elements/Containers/ServerConsole.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ServerConsole(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.ServerConsole, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ServerSideWebApp.cs b/src/C4Sharp/Elements/Containers/ServerSideWebApp.cs similarity index 89% rename from src/C4Sharp/Models/Containers/ServerSideWebApp.cs rename to src/C4Sharp/Elements/Containers/ServerSideWebApp.cs index 5d04c8c..b8fd85c 100644 --- a/src/C4Sharp/Models/Containers/ServerSideWebApp.cs +++ b/src/C4Sharp/Elements/Containers/ServerSideWebApp.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ServerSideWebApp(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.WebApplication, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ServerlessFunction.cs b/src/C4Sharp/Elements/Containers/ServerlessFunction.cs similarity index 90% rename from src/C4Sharp/Models/Containers/ServerlessFunction.cs rename to src/C4Sharp/Elements/Containers/ServerlessFunction.cs index f724f09..23636d7 100644 --- a/src/C4Sharp/Models/Containers/ServerlessFunction.cs +++ b/src/C4Sharp/Elements/Containers/ServerlessFunction.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ServerlessFunction(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.ServerlessFunction, Technology, Description); diff --git a/src/C4Sharp/Models/Containers/ShellScript.cs b/src/C4Sharp/Elements/Containers/ShellScript.cs similarity index 89% rename from src/C4Sharp/Models/Containers/ShellScript.cs rename to src/C4Sharp/Elements/Containers/ShellScript.cs index f7e4271..2c755ce 100644 --- a/src/C4Sharp/Models/Containers/ShellScript.cs +++ b/src/C4Sharp/Elements/Containers/ShellScript.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Containers; +namespace C4Sharp.Elements.Containers; public record ShellScript(string Alias, string Label, string Technology, string? Description = null) : Container(Alias, Label, ContainerType.ShellScript, Technology, Description); diff --git a/src/C4Sharp/Models/DeploymentNode.cs b/src/C4Sharp/Elements/DeploymentNode.cs similarity index 96% rename from src/C4Sharp/Models/DeploymentNode.cs rename to src/C4Sharp/Elements/DeploymentNode.cs index 64d5500..f163f5b 100644 --- a/src/C4Sharp/Models/DeploymentNode.cs +++ b/src/C4Sharp/Elements/DeploymentNode.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// A deployment node is something like physical infrastructure (e.g. a physical server or device), diff --git a/src/C4Sharp/Models/EnterpriseBoundary.cs b/src/C4Sharp/Elements/EnterpriseBoundary.cs similarity index 87% rename from src/C4Sharp/Models/EnterpriseBoundary.cs rename to src/C4Sharp/Elements/EnterpriseBoundary.cs index 5f4fae7..7def14e 100644 --- a/src/C4Sharp/Models/EnterpriseBoundary.cs +++ b/src/C4Sharp/Elements/EnterpriseBoundary.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models; +namespace C4Sharp.Elements; public record EnterpriseBoundary(string Alias, string Label, params Structure[] Structures) : Structure(Alias, Label), IBoundary { diff --git a/src/C4Sharp/Models/IBoundary.cs b/src/C4Sharp/Elements/IBoundary.cs similarity index 72% rename from src/C4Sharp/Models/IBoundary.cs rename to src/C4Sharp/Elements/IBoundary.cs index aadbf54..37c2195 100644 --- a/src/C4Sharp/Models/IBoundary.cs +++ b/src/C4Sharp/Elements/IBoundary.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models; +namespace C4Sharp.Elements; public interface IBoundary { diff --git a/src/C4Sharp/Models/Person.cs b/src/C4Sharp/Elements/Person.cs similarity index 89% rename from src/C4Sharp/Models/Person.cs rename to src/C4Sharp/Elements/Person.cs index e71ed2c..5e53f23 100644 --- a/src/C4Sharp/Models/Person.cs +++ b/src/C4Sharp/Elements/Person.cs @@ -1,6 +1,6 @@ -using C4Sharp.Models.Relationships; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// A person represents one of the human users of your software system (e.g. actors, roles, personas, etc) diff --git a/src/C4Sharp/Models/Plantuml/Constants/ElementName.cs b/src/C4Sharp/Elements/Plantuml/Constants/ElementName.cs similarity index 93% rename from src/C4Sharp/Models/Plantuml/Constants/ElementName.cs rename to src/C4Sharp/Elements/Plantuml/Constants/ElementName.cs index cb3f999..18e6614 100644 --- a/src/C4Sharp/Models/Plantuml/Constants/ElementName.cs +++ b/src/C4Sharp/Elements/Plantuml/Constants/ElementName.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Plantuml.Constants; +namespace C4Sharp.Elements.Plantuml.Constants; public record ElementName { diff --git a/src/C4Sharp/Models/Plantuml/Constants/LineStyle.cs b/src/C4Sharp/Elements/Plantuml/Constants/LineStyle.cs similarity index 93% rename from src/C4Sharp/Models/Plantuml/Constants/LineStyle.cs rename to src/C4Sharp/Elements/Plantuml/Constants/LineStyle.cs index aebc6e7..877c37d 100644 --- a/src/C4Sharp/Models/Plantuml/Constants/LineStyle.cs +++ b/src/C4Sharp/Elements/Plantuml/Constants/LineStyle.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Plantuml.Constants; +namespace C4Sharp.Elements.Plantuml.Constants; public record LineStyle { diff --git a/src/C4Sharp/Models/Plantuml/Constants/Shape.cs b/src/C4Sharp/Elements/Plantuml/Constants/Shape.cs similarity index 91% rename from src/C4Sharp/Models/Plantuml/Constants/Shape.cs rename to src/C4Sharp/Elements/Plantuml/Constants/Shape.cs index d602aee..09c777c 100644 --- a/src/C4Sharp/Models/Plantuml/Constants/Shape.cs +++ b/src/C4Sharp/Elements/Plantuml/Constants/Shape.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Plantuml.Constants; +namespace C4Sharp.Elements.Plantuml.Constants; public record Shape { diff --git a/src/C4Sharp/Models/Plantuml/ElementStyle.cs b/src/C4Sharp/Elements/Plantuml/ElementStyle.cs similarity index 94% rename from src/C4Sharp/Models/Plantuml/ElementStyle.cs rename to src/C4Sharp/Elements/Plantuml/ElementStyle.cs index fce2843..1b82d9c 100644 --- a/src/C4Sharp/Models/Plantuml/ElementStyle.cs +++ b/src/C4Sharp/Elements/Plantuml/ElementStyle.cs @@ -1,7 +1,7 @@ using C4Sharp.Diagrams; -using C4Sharp.Models.Plantuml.Constants; +using C4Sharp.Elements.Plantuml.Constants; -namespace C4Sharp.Models.Plantuml; +namespace C4Sharp.Elements.Plantuml; public class ElementStyle : IElementStyle { diff --git a/src/C4Sharp/Models/Plantuml/ElementTag.cs b/src/C4Sharp/Elements/Plantuml/ElementTag.cs similarity index 94% rename from src/C4Sharp/Models/Plantuml/ElementTag.cs rename to src/C4Sharp/Elements/Plantuml/ElementTag.cs index d52707c..fc7e2e0 100644 --- a/src/C4Sharp/Models/Plantuml/ElementTag.cs +++ b/src/C4Sharp/Elements/Plantuml/ElementTag.cs @@ -1,7 +1,7 @@ using C4Sharp.Diagrams; -using C4Sharp.Models.Plantuml.Constants; +using C4Sharp.Elements.Plantuml.Constants; -namespace C4Sharp.Models.Plantuml; +namespace C4Sharp.Elements.Plantuml; public class ElementTag : IElementTag { diff --git a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlDiagram.cs b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs similarity index 97% rename from src/C4Sharp/Models/Plantuml/Extensions/PlantumlDiagram.cs rename to src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs index 023d8aa..8f4c176 100644 --- a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlDiagram.cs +++ b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs @@ -1,9 +1,8 @@ +using System.Text; using C4Sharp.Diagrams; using C4Sharp.FileSystem; -using C4Sharp.Models.Plantuml.Constants; -using System.Text; -namespace C4Sharp.Models.Plantuml.Extensions; +namespace C4Sharp.Elements.Plantuml.Extensions; /// /// Parser Diagram to PlantUML diff --git a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlRelationship.cs b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs similarity index 93% rename from src/C4Sharp/Models/Plantuml/Extensions/PlantumlRelationship.cs rename to src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs index 3e1e396..e73bb9e 100644 --- a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlRelationship.cs +++ b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs @@ -1,6 +1,6 @@ -using C4Sharp.Models.Relationships; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models.Plantuml.Extensions; +namespace C4Sharp.Elements.Plantuml.Extensions; /// /// Parser Relationship to PlantUML diff --git a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlStructure.cs b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs similarity index 88% rename from src/C4Sharp/Models/Plantuml/Extensions/PlantumlStructure.cs rename to src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs index de67cc7..7d75132 100644 --- a/src/C4Sharp/Models/Plantuml/Extensions/PlantumlStructure.cs +++ b/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs @@ -1,8 +1,8 @@ -using C4Sharp.Extensions; -using C4Sharp.Models.Relationships; using System.Text; +using C4Sharp.Commons; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models.Plantuml.Extensions; +namespace C4Sharp.Elements.Plantuml.Extensions; /// /// PlantUML Parser @@ -54,7 +54,7 @@ private static string ToPumlString(this SoftwareSystemBoundary boundary) foreach (var container in boundary.Containers) { - stream.AppendLine($"{SpaceMethods.Indent()}{container.ToPumlString()}"); + stream.AppendLine($"{TabIndentation.Indent()}{container.ToPumlString()}"); } stream.AppendLine("}"); @@ -72,7 +72,7 @@ private static string ToPumlString(this EnterpriseBoundary boundary) { if (structure is Person or SoftwareSystem or EnterpriseBoundary) { - stream.AppendLine($"{SpaceMethods.Indent()}{structure.ToPumlString()}"); + stream.AppendLine($"{TabIndentation.Indent()}{structure.ToPumlString()}"); } } @@ -122,7 +122,7 @@ private static string ToPumlString(this ContainerBoundary boundary) stream.AppendLine($"Container_Boundary({boundary.Alias}, \"{boundary.Label}\") {{"); foreach (var component in boundary.Components) { - stream.AppendLine($"{SpaceMethods.Indent()}{component.ToPumlString()}"); + stream.AppendLine($"{TabIndentation.Indent()}{component.ToPumlString()}"); } if (boundary.Relationships.Any()) @@ -130,7 +130,7 @@ private static string ToPumlString(this ContainerBoundary boundary) stream.AppendLine(); foreach (var relationship in boundary.Relationships) { - stream.AppendLine($"{SpaceMethods.Indent()}{relationship.ToPumlString()}"); + stream.AppendLine($"{TabIndentation.Indent()}{relationship.ToPumlString()}"); } } @@ -142,7 +142,7 @@ private static string ToPumlString(this ContainerBoundary boundary) private static string ToPumlString(this DeploymentNode deployment, int concat = 0) { var stream = new StringBuilder(); - var spaces = SpaceMethods.Indent(concat); + var spaces = TabIndentation.Indent(concat); if (concat == 0) { @@ -158,12 +158,12 @@ private static string ToPumlString(this DeploymentNode deployment, int concat = foreach (var node in deployment.Nodes) { - stream.AppendLine($"{node.ToPumlString(concat + SpaceMethods.TabSize)}"); + stream.AppendLine($"{node.ToPumlString(concat + TabIndentation.TabSize)}"); } if (deployment.Container != null) { - stream.AppendLine(SpaceMethods.Indent(concat) + deployment.Container.ToPumlString()); + stream.AppendLine(TabIndentation.Indent(concat) + deployment.Container.ToPumlString()); } stream.Append(spaces + "}"); diff --git a/src/C4Sharp/Models/Plantuml/IO/PlantumlContext.cs b/src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs similarity index 98% rename from src/C4Sharp/Models/Plantuml/IO/PlantumlContext.cs rename to src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs index 45190cf..836d287 100644 --- a/src/C4Sharp/Models/Plantuml/IO/PlantumlContext.cs +++ b/src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs @@ -1,11 +1,10 @@ using System.Diagnostics; using System.Text; using C4Sharp.Diagrams; -using C4Sharp.Extensions; +using C4Sharp.Elements.Plantuml.Extensions; using C4Sharp.FileSystem; -using C4Sharp.Models.Plantuml.Extensions; -namespace C4Sharp.Models.Plantuml.IO; +namespace C4Sharp.Elements.Plantuml.IO; public partial class PlantumlContext : IDisposable { diff --git a/src/C4Sharp/Models/Plantuml/IO/PlantumlException.cs b/src/C4Sharp/Elements/Plantuml/IO/PlantumlException.cs similarity index 87% rename from src/C4Sharp/Models/Plantuml/IO/PlantumlException.cs rename to src/C4Sharp/Elements/Plantuml/IO/PlantumlException.cs index 2467b4f..601cc55 100644 --- a/src/C4Sharp/Models/Plantuml/IO/PlantumlException.cs +++ b/src/C4Sharp/Elements/Plantuml/IO/PlantumlException.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Plantuml.IO; +namespace C4Sharp.Elements.Plantuml.IO; /// /// PlantumlException diff --git a/src/C4Sharp/Models/Plantuml/IO/PlantumlResources.cs b/src/C4Sharp/Elements/Plantuml/IO/PlantumlResources.cs similarity index 92% rename from src/C4Sharp/Models/Plantuml/IO/PlantumlResources.cs rename to src/C4Sharp/Elements/Plantuml/IO/PlantumlResources.cs index 1671a6c..8ce9bc9 100644 --- a/src/C4Sharp/Models/Plantuml/IO/PlantumlResources.cs +++ b/src/C4Sharp/Elements/Plantuml/IO/PlantumlResources.cs @@ -1,7 +1,7 @@ -using C4Sharp.Extensions; +using C4Sharp.Commons; using C4Sharp.FileSystem; -namespace C4Sharp.Models.Plantuml.IO; +namespace C4Sharp.Elements.Plantuml.IO; internal static class PlantumlResources { @@ -47,7 +47,7 @@ private static void LoadResource(string resourcesPath, string resourceName) return; } - var stream = ResourceMethods.GetResourceContent(resourceName); + var stream = ResourceFile.ReadString(resourceName); Directory.CreateDirectory(resourcesPath); File.WriteAllText(path, stream); } @@ -106,7 +106,7 @@ private static void LoadIconPngResource(string resourcesPath) private static void LoadStream(string path, string resourceName) { - var stream = ResourceMethods.GetResourceStream(resourceName) ?? throw new InvalidOperationException(); + var stream = ResourceFile.ReadStream(resourceName) ?? throw new InvalidOperationException(); using var file = new FileStream(path, FileMode.Create, FileAccess.Write); stream.CopyTo(file); stream.Flush(); diff --git a/src/C4Sharp/Models/Plantuml/RelationshipTag.cs b/src/C4Sharp/Elements/Plantuml/RelationshipTag.cs similarity index 93% rename from src/C4Sharp/Models/Plantuml/RelationshipTag.cs rename to src/C4Sharp/Elements/Plantuml/RelationshipTag.cs index f61729b..221f81a 100644 --- a/src/C4Sharp/Models/Plantuml/RelationshipTag.cs +++ b/src/C4Sharp/Elements/Plantuml/RelationshipTag.cs @@ -1,7 +1,7 @@ using C4Sharp.Diagrams; -using C4Sharp.Models.Plantuml.Constants; +using C4Sharp.Elements.Plantuml.Constants; -namespace C4Sharp.Models.Plantuml; +namespace C4Sharp.Elements.Plantuml; public class RelationshipTag : IRelationshipTag { diff --git a/src/C4Sharp/Models/Relationships/Boundary.cs b/src/C4Sharp/Elements/Relationships/Boundary.cs similarity index 70% rename from src/C4Sharp/Models/Relationships/Boundary.cs rename to src/C4Sharp/Elements/Relationships/Boundary.cs index 7714156..bebd383 100644 --- a/src/C4Sharp/Models/Relationships/Boundary.cs +++ b/src/C4Sharp/Elements/Relationships/Boundary.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Relationships; +namespace C4Sharp.Elements.Relationships; /// /// Boundary scope diff --git a/src/C4Sharp/Models/Relationships/Direction.cs b/src/C4Sharp/Elements/Relationships/Direction.cs similarity index 72% rename from src/C4Sharp/Models/Relationships/Direction.cs rename to src/C4Sharp/Elements/Relationships/Direction.cs index d0dfc2a..8dcce7a 100644 --- a/src/C4Sharp/Models/Relationships/Direction.cs +++ b/src/C4Sharp/Elements/Relationships/Direction.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Relationships; +namespace C4Sharp.Elements.Relationships; /// /// Direction diff --git a/src/C4Sharp/Models/Relationships/Position.cs b/src/C4Sharp/Elements/Relationships/Position.cs similarity index 74% rename from src/C4Sharp/Models/Relationships/Position.cs rename to src/C4Sharp/Elements/Relationships/Position.cs index 1ed5160..1635c3e 100644 --- a/src/C4Sharp/Models/Relationships/Position.cs +++ b/src/C4Sharp/Elements/Relationships/Position.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Relationships; +namespace C4Sharp.Elements.Relationships; /// /// Positions diff --git a/src/C4Sharp/Models/Relationships/Relationship.cs b/src/C4Sharp/Elements/Relationships/Relationship.cs similarity index 98% rename from src/C4Sharp/Models/Relationships/Relationship.cs rename to src/C4Sharp/Elements/Relationships/Relationship.cs index bdea12f..cb75890 100644 --- a/src/C4Sharp/Models/Relationships/Relationship.cs +++ b/src/C4Sharp/Elements/Relationships/Relationship.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models.Relationships; +namespace C4Sharp.Elements.Relationships; /// /// Relationship diff --git a/src/C4Sharp/Models/SoftwareSystem.cs b/src/C4Sharp/Elements/SoftwareSystem.cs similarity index 93% rename from src/C4Sharp/Models/SoftwareSystem.cs rename to src/C4Sharp/Elements/SoftwareSystem.cs index 11627d4..a5989c7 100644 --- a/src/C4Sharp/Models/SoftwareSystem.cs +++ b/src/C4Sharp/Elements/SoftwareSystem.cs @@ -1,6 +1,6 @@ -using C4Sharp.Models.Relationships; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// A software system is the highest level of abstraction and describes something that delivers value to its users, diff --git a/src/C4Sharp/Models/SoftwareSystemBoundary.cs b/src/C4Sharp/Elements/SoftwareSystemBoundary.cs similarity index 84% rename from src/C4Sharp/Models/SoftwareSystemBoundary.cs rename to src/C4Sharp/Elements/SoftwareSystemBoundary.cs index 9e11124..482d266 100644 --- a/src/C4Sharp/Models/SoftwareSystemBoundary.cs +++ b/src/C4Sharp/Elements/SoftwareSystemBoundary.cs @@ -1,7 +1,4 @@ -using System.Reflection; -using System.Reflection.Metadata; - -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// Software System Boundary diff --git a/src/C4Sharp/Models/Structure.cs b/src/C4Sharp/Elements/Structure.cs similarity index 96% rename from src/C4Sharp/Models/Structure.cs rename to src/C4Sharp/Elements/Structure.cs index bf0c221..0f6ef5f 100644 --- a/src/C4Sharp/Models/Structure.cs +++ b/src/C4Sharp/Elements/Structure.cs @@ -1,7 +1,6 @@ -using C4Sharp.Extensions; -using C4Sharp.Models.Relationships; +using C4Sharp.Elements.Relationships; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; /// /// In order to create these maps of your code, we first need a common set of abstractions to create a ubiquitous diff --git a/src/C4Sharp/Models/StructureCollection.cs b/src/C4Sharp/Elements/StructureCollection.cs similarity index 96% rename from src/C4Sharp/Models/StructureCollection.cs rename to src/C4Sharp/Elements/StructureCollection.cs index 6542635..d4f3313 100644 --- a/src/C4Sharp/Models/StructureCollection.cs +++ b/src/C4Sharp/Elements/StructureCollection.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Models; +namespace C4Sharp.Elements; internal class StructureCollection { diff --git a/src/C4Sharp/Models/StructureIdentity.cs b/src/C4Sharp/Elements/StructureIdentity.cs similarity index 91% rename from src/C4Sharp/Models/StructureIdentity.cs rename to src/C4Sharp/Elements/StructureIdentity.cs index 311ba7a..9d6e23c 100644 --- a/src/C4Sharp/Models/StructureIdentity.cs +++ b/src/C4Sharp/Elements/StructureIdentity.cs @@ -1,6 +1,6 @@ -using C4Sharp.Extensions; +using C4Sharp.Commons.Extensions; -namespace C4Sharp.Models; +namespace C4Sharp.Elements; public record StructureIdentity { From f9dbe19ee82dc4c6524a1fd69d60d39859b68945 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 22:45:36 -0300 Subject: [PATCH 03/12] removing C4Bank sample --- .../Architecture/ComponentDiagram.cs | 71 ------------------ .../Architecture/ContainerDiagram.cs | 61 --------------- .../Architecture/ContextDiagram.cs | 47 ------------ .../C4Bank.Deposit/C4Bank.Deposit.csproj | 17 ----- .../C4Bank/C4Bank.Deposit/Shared/ICommand.cs | 6 -- .../C4Bank.Deposit/Shared/IController.cs | 6 -- .../C4Bank/C4Bank.Deposit/Shared/IEvent.cs | 6 -- .../C4Bank/C4Bank.Deposit/Shared/IHandler.cs | 6 -- .../C4Bank/C4Bank.Deposit/Shared/IProducer.cs | 6 -- .../C4Bank.Deposit/Shared/IRepository.cs | 6 -- .../C4Bank.Deposit/Shared/IValidation.cs | 6 -- .../C4Bank/C4Bank.Deposit/Shared/IWorker.cs | 6 -- .../Adapters/DepositProcessingProducer.cs | 17 ----- .../Adapters/DepositProcessingWorker.cs | 26 ------- .../Adapters/DepositRepository.cs | 13 ---- .../DepositProcessingInstaller.cs | 13 ---- .../Interfaces/IDepositProcessingHandler.cs | 9 --- .../Interfaces/IDepositRepository.cs | 8 -- .../Interfaces/IDepositoProcessingProducer.cs | 10 --- .../UseCase/DepositProcessingHandler.cs | 29 ------- .../UseCase/DepositProcessingMapper.cs | 10 --- .../UseCase/DepositProcessingValidation.cs | 40 ---------- .../UseCase/Entities/AccountDeposit.cs | 3 - .../Commands/RegisterDepositCommand.cs | 6 -- .../Messages/Events/DepositReceived.cs | 14 ---- .../Messages/Events/DepositRejected.cs | 5 -- .../Messages/Events/RegisteredDeposit.cs | 5 -- .../Adapters/AccountRepository.cs | 11 --- .../Adapters/SynchronizeNewAccountConsumer.cs | 22 ------ .../Adapters/SynchronizeNewAccountProducer.cs | 17 ----- .../Interfaces/IAccountRepository.cs | 6 -- .../ISynchronizeNewAccountHandler.cs | 8 -- .../ISynchronizeNewAccountProducer.cs | 9 --- .../SynchronizeNewAccountInstaller.cs | 13 ---- .../UseCase/Entities/Account.cs | 3 - .../Commands/SynchronizedAccountCommand.cs | 3 - .../Events/AccountSynchronizationRejected.cs | 3 - .../Messages/Events/AccountSynchronized.cs | 3 - .../Messages/Events/RegisteredAccount.cs | 3 - .../UseCase/SynchronizeNewAccountHandler.cs | 26 ------- .../UseCase/SynchronizeNewAccountMapper.cs | 10 --- .../SynchronizeNewAccountValidation.cs | 39 ---------- samples/C4Bank/README.md | 46 ------------ ...componetns-of-deposit-area-c4component.png | Bin 64410 -> 0 bytes ...nk-context-of-deposit-area-c4container.png | Bin 62457 -> 0 bytes ...ank-contexts-of-deposit-area-c4context.png | Bin 44451 -> 0 bytes 46 files changed, 674 deletions(-) delete mode 100644 samples/C4Bank/C4Bank.Deposit/Architecture/ComponentDiagram.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Architecture/ContainerDiagram.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Architecture/ContextDiagram.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/C4Bank.Deposit.csproj delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/ICommand.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IController.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IEvent.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IHandler.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IProducer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IRepository.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IValidation.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/Shared/IWorker.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingProducer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingWorker.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositRepository.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/DepositProcessingInstaller.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositProcessingHandler.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositRepository.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositoProcessingProducer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingHandler.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingMapper.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingValidation.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Entities/AccountDeposit.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Commands/RegisterDepositCommand.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositReceived.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositRejected.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/RegisteredDeposit.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/AccountRepository.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountConsumer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountProducer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/IAccountRepository.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountHandler.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountProducer.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/SynchronizeNewAccountInstaller.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Entities/Account.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Commands/SynchronizedAccountCommand.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronizationRejected.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronized.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/RegisteredAccount.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountHandler.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountMapper.cs delete mode 100644 samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountValidation.cs delete mode 100644 samples/C4Bank/README.md delete mode 100644 samples/C4Bank/assets/c4bank-componetns-of-deposit-area-c4component.png delete mode 100644 samples/C4Bank/assets/c4bank-context-of-deposit-area-c4container.png delete mode 100644 samples/C4Bank/assets/c4bank-contexts-of-deposit-area-c4context.png diff --git a/samples/C4Bank/C4Bank.Deposit/Architecture/ComponentDiagram.cs b/samples/C4Bank/C4Bank.Deposit/Architecture/ComponentDiagram.cs deleted file mode 100644 index 4f8ed8c..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Architecture/ComponentDiagram.cs +++ /dev/null @@ -1,71 +0,0 @@ -using C4Bank.Deposit.Shared; -using C4Bank.Deposit.UseCases.DepositProcessing.Adapters; -using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Containers; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; - -namespace C4Bank.Deposit.Architecture; - -public class ComponentDiagram : DiagramBuildRunner -{ - protected override string Title => "C4Bank Components of Deposit Area"; - protected override DiagramType DiagramType => DiagramType.Component; - - protected override IEnumerable Structures() => new Structure[] - { - new Person("Customer", "Customer"), - new EventStreaming("kafka", "Partition")[1], - new EventStreaming("kafka", "Partition")[2], - new EventStreaming("kafka", "DLQ")[3], - new ContainerBoundary - { - Components = new Component[] - { - new Component("Aspnet"), - new Component("class/C#"), - new Component("record/C#"), - new Component("decorator/C#"), - new Component("class/C#"), - new Component("class/C#"), - new Component("class/C#"), - } - }, - new Database("Database", "Database", "SQL Server", "Data Base") - }; - - protected override IEnumerable Relationships() => new[] - { - It("Customer") > It() | "request", - It() > It(1) | "Produces", - - //Worker - It() > It(1) | "Consumes", - It() > It() | "Map to", - It() > It() | "Call", - - //Validation - It() > It() |"Call", - It() > It() | "Produces", - - //Handler - It() > It() | "Execute", - It() >= It() | "Write/Read", - It() > It() | "Produces", - - //Producer - It() > It(2) | "Produces", - It() > It(3) | "Produces", - It() >= It("Database") | "Write/Read", - }; - - protected override IElementStyle? SetStyle() - { - return new ElementStyle() - .UpdateElementStyle(ElementName.Person, "#000000", "#000000") - .UpdateElementStyle(ElementName.Component, "#ffffff", "#000000", "#000000", false, Shape.RoundedBoxShape) - .UpdateElementStyle(ElementName.Container, "#f4f4f4", "#000000", "#000000", false, Shape.RoundedBoxShape); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Architecture/ContainerDiagram.cs b/samples/C4Bank/C4Bank.Deposit/Architecture/ContainerDiagram.cs deleted file mode 100644 index 930a74e..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Architecture/ContainerDiagram.cs +++ /dev/null @@ -1,61 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.Adapters; -using C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Adapters; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; -using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Containers; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; - -namespace C4Bank.Deposit.Architecture; - -public class ContainerDiagram : DiagramBuildRunner -{ - protected override string Title => "C4Bank Context of Deposit Area"; - protected override DiagramType DiagramType => DiagramType.Container; - - - protected override IEnumerable Structures() => new Structure[] - { - new Person("Customer", "Customer", "Bank Customer"), - new SoftwareSystem("OTBank.Finance", "Finance", "OTBank Finance System", Boundary.External), - new SoftwareSystem("C4Bank.Account", "Account", "C4Bank Account System"), - new Api("Aspnet/C#", "ACL"), - new EventStreaming("kafka", "Partition 01"), - - SoftwareSystemBoundary.New("Deposit", - new Api("C#"), - new Database("SQL Server", "Deposit Data Base"), - new ServerConsole("C#", "Kafka Consumer"), - new Database("SQL Server", "Account Data Base") - ), - }; - - protected override IEnumerable Relationships() => new[] - { - It("Customer") > It("OTBank.Finance") | "send deposit", - It("OTBank.Finance") > It() | ("POST", "HTTP"), - It() < It() | ("POST", "HTTP"), - It() > It(), - - It("Customer") > It("C4Bank.Account") | "register", - It("C4Bank.Account") > It() | "produces", - It() > It() | "consumes", - It() > It(), - It() > It(), - }; - - protected override IElementStyle? SetStyle() - { - return new ElementStyle() - .UpdateElementStyle(ElementName.Person, "#000000", "#000000") - .UpdateElementStyle(ElementName.Container, "#ffffff", "#000000", "#000000", false, Shape.RoundedBoxShape) - .UpdateElementStyle(ElementName.System, "#f4f4f4", "#000000", "#000000", false, Shape.RoundedBoxShape) - .UpdateElementStyle(ElementName.ExternalSystem, "#ABB2B9", "#000000", "#000000", false, Shape.RoundedBoxShape); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Architecture/ContextDiagram.cs b/samples/C4Bank/C4Bank.Deposit/Architecture/ContextDiagram.cs deleted file mode 100644 index eb9d4f7..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Architecture/ContextDiagram.cs +++ /dev/null @@ -1,47 +0,0 @@ -using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; -using static C4Sharp.Models.Relationships.Position; - -namespace C4Bank.Deposit.Architecture; - -public class ContextDiagram : DiagramBuildRunner -{ - protected override string Title => "C4Bank Contexts of Deposit Area"; - protected override DiagramType DiagramType => DiagramType.Context; - - - protected override IEnumerable Structures() => new Structure[] - { - new Person("Customer", "Customer", "Bank Customer"), - new SoftwareSystem("OTBank.Finance", "Finance", "OTBank Finance System", Boundary.External), - - new EnterpriseBoundary("C4Bank", "C4Bank Domain", - new SoftwareSystem("C4Bank.Account", "Account", "C4Bank Account System", Boundary.Internal), - new SoftwareSystem("C4Bank.Deposit", "Deposit", "C4Bank Deposit System", Boundary.Internal)), - - new SoftwareSystem("eMailer.System", "Deposit", "Mailer Deposit System", Boundary.External), - }; - - protected override IEnumerable Relationships() => new[] - { - It("Customer") > It("OTBank.Finance") | "Request deposit", - It("OTBank.Finance") > It("C4Bank.Deposit") | "Send deposit", - - It("Customer") > It("C4Bank.Account") | "Request registration" , - It("C4Bank.Account") > It("C4Bank.Deposit") | "Send registration", - - It("C4Bank.Deposit") > It("eMailer.System") | "Notify" | Neighbor, - It("eMailer.System") > It("Customer") |"Notify customer" - }; - - protected override IElementStyle? SetStyle() - { - return new ElementStyle() - .UpdateElementStyle(ElementName.Person, "#000000", "#000000") - .UpdateElementStyle(ElementName.System, "#f4f4f4", "#000000", "#000000", false, Shape.RoundedBoxShape) - .UpdateElementStyle(ElementName.ExternalSystem, "#ABB2B9", "#000000", "#000000", false, Shape.RoundedBoxShape); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/C4Bank.Deposit.csproj b/samples/C4Bank/C4Bank.Deposit/C4Bank.Deposit.csproj deleted file mode 100644 index 271fce0..0000000 --- a/samples/C4Bank/C4Bank.Deposit/C4Bank.Deposit.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - - - - - - diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/ICommand.cs b/samples/C4Bank/C4Bank.Deposit/Shared/ICommand.cs deleted file mode 100644 index d0eaa30..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/ICommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface ICommand -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IController.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IController.cs deleted file mode 100644 index cc15c4d..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IController.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IController -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IEvent.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IEvent.cs deleted file mode 100644 index 754119f..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IEvent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IEvent -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IHandler.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IHandler.cs deleted file mode 100644 index dda407d..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IHandler -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IProducer.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IProducer.cs deleted file mode 100644 index a96fb4d..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IProducer.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IProducer -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IRepository.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IRepository.cs deleted file mode 100644 index 9367c50..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IRepository.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IRepository -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IValidation.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IValidation.cs deleted file mode 100644 index 333e616..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IValidation.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IValidation -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/Shared/IWorker.cs b/samples/C4Bank/C4Bank.Deposit/Shared/IWorker.cs deleted file mode 100644 index 41acf79..0000000 --- a/samples/C4Bank/C4Bank.Deposit/Shared/IWorker.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.Shared; - -public interface IWorker -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingProducer.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingProducer.cs deleted file mode 100644 index c024127..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingProducer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.Adapters; - -public class DepositProcessingProducer: IDepositoProcessingProducer -{ - public Task Complete(RegisteredDeposit @event) - { - return Task.CompletedTask; - } - - public Task Reject(DepositRejected @event) - { - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingWorker.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingWorker.cs deleted file mode 100644 index 42d2f6e..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositProcessingWorker.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.ComponentModel; -using C4Bank.Deposit.Shared; -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositoProcessing.UseCase; -using C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.Adapters; - -[Description("Deposit Worker API")] -public class DepositProcessingWorker: IWorker -{ - private readonly IDepositProcessingHandler _handler; - - public DepositProcessingWorker(IDepositProcessingHandler handler) - { - _handler = handler; - } - - public async Task Consume(DepositReceived @event) - { - var command = DepositProcessingMapper.Map(@event); - await _handler.ExecuteAsync(command); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositRepository.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositRepository.cs deleted file mode 100644 index 142db33..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Adapters/DepositRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Entities; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.Adapters; - -public class DepositRepository: IDepositRepository -{ - public Task Register(AccountDeposit accountDeposit) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/DepositProcessingInstaller.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/DepositProcessingInstaller.cs deleted file mode 100644 index bc02602..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/DepositProcessingInstaller.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace C4Bank.Deposit.UseCases.DepositProcessing; - -public static class DepositProcessingInstaller -{ - public static IServiceCollection AddDepositProcessing(this IServiceCollection services) - { - //TODO: Dependency Injection - - return services; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositProcessingHandler.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositProcessingHandler.cs deleted file mode 100644 index d227463..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositProcessingHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -using C4Bank.Deposit.Shared; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Commands; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; - -public interface IDepositProcessingHandler: IHandler -{ - Task ExecuteAsync(RegisterDepositCommand command); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositRepository.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositRepository.cs deleted file mode 100644 index ab7940e..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositRepository.cs +++ /dev/null @@ -1,8 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Entities; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; - -public interface IDepositRepository -{ - Task Register(AccountDeposit accountDeposit); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositoProcessingProducer.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositoProcessingProducer.cs deleted file mode 100644 index b314fd6..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/Interfaces/IDepositoProcessingProducer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using C4Bank.Deposit.Shared; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; - -public interface IDepositoProcessingProducer : IProducer -{ - Task Complete(RegisteredDeposit @event); - Task Reject(DepositRejected @event); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingHandler.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingHandler.cs deleted file mode 100644 index 285f17e..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingHandler.cs +++ /dev/null @@ -1,29 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositoProcessing.UseCase; -using C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Entities; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase; - -public class DepositProcessingHandler : IDepositProcessingHandler -{ - private readonly IDepositRepository _repository; - private readonly IDepositoProcessingProducer _producer; - - public DepositProcessingHandler(IDepositRepository repository, IDepositoProcessingProducer producer) - { - _repository = repository; - _producer = producer; - } - - public async Task ExecuteAsync(RegisterDepositCommand command) - { - var deposit = DepositProcessingMapper.Map(command); - await _repository.Register(deposit); - - var @event = DepositProcessingMapper.Map(deposit); - await _producer.Complete(@event); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingMapper.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingMapper.cs deleted file mode 100644 index 398f6c0..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingMapper.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace C4Bank.Deposit.UseCases.DepositoProcessing.UseCase; - -public static class DepositProcessingMapper -{ - public static TTarget Map(object source) - { - //TODO: implements mapping class - return default!; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingValidation.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingValidation.cs deleted file mode 100644 index f0089b4..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/DepositProcessingValidation.cs +++ /dev/null @@ -1,40 +0,0 @@ -using C4Bank.Deposit.UseCases.DepositoProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.Interfaces; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.DepositoProcessing.UseCase; - -/// -/// This class represents the use of Decorator pattern -/// -/// -public class DepositProcessingValidation: IDepositProcessingHandler -{ - private readonly IDepositProcessingHandler _handler; - private readonly IDepositoProcessingProducer _producer; - - public DepositProcessingValidation(IDepositProcessingHandler handler, IDepositoProcessingProducer producer) - { - _handler = handler; - _producer = producer; - } - - public async Task ExecuteAsync(RegisterDepositCommand command) - { - var (success, messages) = Validate(command); - - if (!success) - { - var @event = DepositProcessingMapper.Map(command); - await _producer.Reject(@event with { Reason = messages }); - } - - await _handler.ExecuteAsync(command); - } - - private (bool success, string[] messages) Validate(RegisterDepositCommand command) - { - return (true, Array.Empty()); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Entities/AccountDeposit.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Entities/AccountDeposit.cs deleted file mode 100644 index 9bba8f5..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Entities/AccountDeposit.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Entities; - -public record AccountDeposit(); \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Commands/RegisterDepositCommand.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Commands/RegisterDepositCommand.cs deleted file mode 100644 index 450d261..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Commands/RegisterDepositCommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Commands; - -public class RegisterDepositCommand -{ - -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositReceived.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositReceived.cs deleted file mode 100644 index f239752..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositReceived.cs +++ /dev/null @@ -1,14 +0,0 @@ -using C4Bank.Deposit.Shared; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -public record DepositReceived: IEvent -{ - public string? DepositCode { get; init; } - public decimal Amount { get; init; } - public int AccountId { get; init; } - public int BankCode { get; init; } - public int BankAccount { get; init; } - public int BankAgency { get; init; } - public DateTime DepositDat { get; init; } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositRejected.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositRejected.cs deleted file mode 100644 index ad5a735..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/DepositRejected.cs +++ /dev/null @@ -1,5 +0,0 @@ -using C4Bank.Deposit.Shared; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -public record DepositRejected(string[] Reason): IEvent; \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/RegisteredDeposit.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/RegisteredDeposit.cs deleted file mode 100644 index 866422c..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/DepositProcessing/UseCase/Messages/Events/RegisteredDeposit.cs +++ /dev/null @@ -1,5 +0,0 @@ -using C4Bank.Deposit.Shared; - -namespace C4Bank.Deposit.UseCases.DepositProcessing.UseCase.Messages.Events; - -public record RegisteredDeposit(): IEvent; \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/AccountRepository.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/AccountRepository.cs deleted file mode 100644 index e810b75..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/AccountRepository.cs +++ /dev/null @@ -1,11 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Adapters; - -public class AccountRepository: IAccountRepository -{ - public Task Register(UseCase.Entities.Account account) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountConsumer.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountConsumer.cs deleted file mode 100644 index 0e9cbd1..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountConsumer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Adapters; - -public class SynchronizeNewAccountConsumer -{ - private readonly ISynchronizeNewAccountHandler _handler; - - public SynchronizeNewAccountConsumer(ISynchronizeNewAccountHandler handler) - { - _handler = handler; - } - - public async Task Consume(RegisteredAccount @event) - { - var command = SynchronizeNewAccountMapper.Map(@event); - await _handler.ExecuteAsync(command); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountProducer.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountProducer.cs deleted file mode 100644 index 8e71a8a..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Adapters/SynchronizeNewAccountProducer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Adapters; - -public class SynchronizeNewAccountProducer: ISynchronizeNewAccountProducer -{ - public Task Complete(AccountSynchronized @event) - { - return Task.CompletedTask; - } - - public Task Reject(AccountSynchronizationRejected @event) - { - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/IAccountRepository.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/IAccountRepository.cs deleted file mode 100644 index 8558ca3..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/IAccountRepository.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; - -public interface IAccountRepository -{ - Task Register(UseCase.Entities.Account account); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountHandler.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountHandler.cs deleted file mode 100644 index d716c13..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountHandler.cs +++ /dev/null @@ -1,8 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Commands; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; - -public interface ISynchronizeNewAccountHandler -{ - Task ExecuteAsync(SynchronizedAccountCommand command); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountProducer.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountProducer.cs deleted file mode 100644 index 6e39464..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/Interfaces/ISynchronizeNewAccountProducer.cs +++ /dev/null @@ -1,9 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; - -public interface ISynchronizeNewAccountProducer -{ - Task Complete(AccountSynchronized @event); - Task Reject(AccountSynchronizationRejected @event); -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/SynchronizeNewAccountInstaller.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/SynchronizeNewAccountInstaller.cs deleted file mode 100644 index 3e0e706..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/SynchronizeNewAccountInstaller.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount; - -public static class SynchronizeNewAccountInstaller -{ - public static IServiceCollection AddSynchronizeNewAccount(this IServiceCollection services) - { - //TODO: Dependency Injection - - return services; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Entities/Account.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Entities/Account.cs deleted file mode 100644 index ce823fc..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Entities/Account.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Entities; - -public record Account(); \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Commands/SynchronizedAccountCommand.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Commands/SynchronizedAccountCommand.cs deleted file mode 100644 index 0a4f663..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Commands/SynchronizedAccountCommand.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Commands; - -public record SynchronizedAccountCommand; diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronizationRejected.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronizationRejected.cs deleted file mode 100644 index 132b6e0..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronizationRejected.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -public record AccountSynchronizationRejected(string[] Reason); \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronized.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronized.cs deleted file mode 100644 index 90fc869..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/AccountSynchronized.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -public record AccountSynchronized(); \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/RegisteredAccount.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/RegisteredAccount.cs deleted file mode 100644 index b001d92..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/Messages/Events/RegisteredAccount.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -public record RegisteredAccount(); diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountHandler.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountHandler.cs deleted file mode 100644 index 03b7dac..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase; - -public class SynchronizeNewAccountHandler : ISynchronizeNewAccountHandler -{ - private readonly IAccountRepository _repository; - private readonly ISynchronizeNewAccountProducer _producer; - - public SynchronizeNewAccountHandler(IAccountRepository repository, ISynchronizeNewAccountProducer producer) - { - _repository = repository; - _producer = producer; - } - - public async Task ExecuteAsync(SynchronizedAccountCommand command) - { - var deposit = SynchronizeNewAccountMapper.Map(command); - await _repository.Register(deposit); - - var @event = SynchronizeNewAccountMapper.Map(deposit); - await _producer.Complete(@event); - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountMapper.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountMapper.cs deleted file mode 100644 index 99cc223..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountMapper.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase; - -public static class SynchronizeNewAccountMapper -{ - public static TTarget Map(object source) - { - //TODO: implements mapping class - return default!; - } -} \ No newline at end of file diff --git a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountValidation.cs b/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountValidation.cs deleted file mode 100644 index b17b036..0000000 --- a/samples/C4Bank/C4Bank.Deposit/UseCases/SynchronizeNewAccount/UseCase/SynchronizeNewAccountValidation.cs +++ /dev/null @@ -1,39 +0,0 @@ -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.Interfaces; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Commands; -using C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase.Messages.Events; - -namespace C4Bank.Deposit.UseCases.SynchronizeNewAccount.UseCase; - -/// -/// This class represents the use of Decorator pattern -/// -/// -public class SynchronizeNewAccountValidation: ISynchronizeNewAccountHandler -{ - private readonly ISynchronizeNewAccountHandler _handler; - private readonly ISynchronizeNewAccountProducer _producer; - - public SynchronizeNewAccountValidation(ISynchronizeNewAccountHandler handler, ISynchronizeNewAccountProducer producer) - { - _handler = handler; - _producer = producer; - } - - public async Task ExecuteAsync(SynchronizedAccountCommand command) - { - var (success, messages) = Validate(command); - - if (!success) - { - var @event = SynchronizeNewAccountMapper.Map(command); - await _producer.Reject(@event with { Reason = messages }); - } - - await _handler.ExecuteAsync(command); - } - - private (bool success, string[] messages) Validate(SynchronizedAccountCommand command) - { - return (true, Array.Empty()); - } -} \ No newline at end of file diff --git a/samples/C4Bank/README.md b/samples/C4Bank/README.md deleted file mode 100644 index a5ccaa6..0000000 --- a/samples/C4Bank/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# C4Bank Sample -> ⚠️ **ATTENTION**! This example does not correspond to reality and has only the didactic purpose of teaching the use of C4SHarp functionalities. In this simulation, a fictitious bank deposit process is performed. - -### Context Diagram -> A System Context diagram is a good starting point for diagramming and documenting a software system, allowing you to step back and see the big picture. Draw a diagram showing your system as a box in the centre, surrounded by its users and the other systems that it interacts with. - -![img](./assets/c4bank-contexts-of-deposit-area-c4context.png) - -picture 1. Context Diagram -see the code [here](../C4Bank/C4Bank.Deposit/Architecure/ContextDiagram.cs) - -- Scope: A single software system. -- Primary elements: The software system in scope. -- Supporting elements: People (e.g. users, actors, roles, or personas) and software systems (external dependencies) that are directly connected to the software system in scope. Typically these other software systems sit outside the scope or boundary of your own software system, and you don’t have responsibility or ownership of them. -- Intended audience: Everybody, both technical and non-technical people, inside and outside of the software development team. -- Recommended for most teams: Yes. - -### Container Diagram ->Once you understand how your system fits in to the overall IT environment, a really useful next step is to zoom-in to the system boundary with a Container diagram. A "container" is something like a server-side web application, single-page application, desktop application, mobile app, database schema, file system, etc. Essentially, a container is a separately runnable/deployable unit (e.g. a separate process space) that executes code or stores data. - -![img](./assets/c4bank-context-of-deposit-area-c4container.png) - -picture 2. Container Diagram -see the code [here]('../C4Bank/C4Bank.Deposit/Architecure/ContainerDiagram.cs') - -- **Scope**: A single software system. -- **Primary** elements: Containers within the software system in scope. -- **Supporting** elements: People and software systems directly connected to the containers. -- **Intended** audience: Technical people inside and outside of the software development team; including software architects, developers and operations/support staff. -- **Recommended** for most teams: Yes. - -Notes: This diagram says nothing about deployment scenarios, clustering, replication, failover, etc. - -### Component Diagram ->The Component diagram shows how a container is made up of a number of "components", what each of those components are, their responsibilities and the technology/implementation details. - -![img](./assets/c4bank-componetns-of-deposit-area-c4component.png) - -picture 3. Component Diagram -see the code [here](../C4Bank/C4Bank.Deposit/Architecure/ComponentDiagram.cs) - -- **Scope**: A single container. -- **Primary** elements: Components within the container in scope. -- **Supporting** elements: Containers (within the software system in scope) plus people and software systems directly connected to the components. -- **Intended** audience: Software architects and developers. -- **Recommended** for most teams: No, only create component diagrams if you feel they add value, and consider automating their creation for long-lived documentation. diff --git a/samples/C4Bank/assets/c4bank-componetns-of-deposit-area-c4component.png b/samples/C4Bank/assets/c4bank-componetns-of-deposit-area-c4component.png deleted file mode 100644 index faf22db307537cd5c2a5aa31948c18ad0c2a9ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64410 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

    Cu0dg}l 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 diff --git a/samples/C4Bank/assets/c4bank-context-of-deposit-area-c4container.png b/samples/C4Bank/assets/c4bank-context-of-deposit-area-c4container.png deleted file mode 100644 index 415df007edd9334c87a681de1e791d9ca8321b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62457 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≻{T7l~aO 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

      2T7+!4h?U$KvaPE9grg?hhxmkaC`Z z;qiC-6@$_c*`Ui;7u3v3KZjGHg~Q7Ofb7bZD_p3*vXDWDaCD>)a5VDpsL{N|_2kJv z;M(Fj4KIMb8NFW_g5V8whE}YH<%@nL@S0}wY7q$d^m*#}xBRvKiX=7ys|;=N2y6sO zWvfpocSTE%D3^AG%jv@3b}?(fp*iUw}gga@c*r)aS`3-}y>oce*nFHsHt&JJ)8 z6XWCmb44BCyl4U!+uB<~;WSy=v|CJay!Mj`{R(;%?{>=ptvEA?&F&mUW06{8OAXn* zRf|2Jk{hjLj(3)^zVDVZP^EhqVgw5j%j;>|hyI!XhhLSQ2!zhuBpA zC5Oy+$x{Crb;!6lV^ueUB~zRpSOYDR0LU7`4hn$JU%TW5fD86B`ZHfUIX+%+7$=UC z?VOr=nVp#5UIV(#rnMM$i@RlB*o-$WSeh&9~J+MFi%rBP4Nu0Lqh zPp(jN8DV4y!A>o)7uj^uEY5LtmV0)DQbCCADgbaxpf|WM7c)%++5MZLlga8=w(LN> zhzEtat_>T~5Vy~?_SzpjsE((7~x@Y8F7%2 zmbG=k84nwCNQ^juzi-!6pM3ObkT>PRLV6!>)9=

      kCp%@^1jE4#M)knoH=#>19~Z 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 diff --git a/samples/C4Bank/assets/c4bank-contexts-of-deposit-area-c4context.png b/samples/C4Bank/assets/c4bank-contexts-of-deposit-area-c4context.png deleted file mode 100644 index a444a4fe7d2bbb6af1db1b52829dbf74f4ef440a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44451 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 Date: Sun, 25 Dec 2022 22:46:23 -0300 Subject: [PATCH 04/12] Adapting Sample to new C4Sharp DSL --- .../Diagrams/ComponentDiagram.cs | 21 +-- .../Diagrams/ContainerDiagram.cs | 36 +++--- .../C4Sharp.Sample/Diagrams/ContextDiagram.cs | 21 +-- .../Diagrams/DeploymentDiagram.cs | 10 +- .../Diagrams/EnterpriseDiagram.cs | 26 ++-- samples/Basic/C4Sharp.Sample/Program.cs | 9 +- .../C4Sharp.Sample/Structures/Components.cs | 2 +- .../C4Sharp.Sample/Structures/Containers.cs | 120 +++++++++--------- .../Basic/C4Sharp.Sample/Structures/Nodes.cs | 2 +- .../Basic/C4Sharp.Sample/Structures/People.cs | 4 +- .../C4Sharp.Sample/Structures/Systems.cs | 5 +- 11 files changed, 129 insertions(+), 127 deletions(-) diff --git a/samples/Basic/C4Sharp.Sample/Diagrams/ComponentDiagram.cs b/samples/Basic/C4Sharp.Sample/Diagrams/ComponentDiagram.cs index d1a17e7..2823fc3 100644 --- a/samples/Basic/C4Sharp.Sample/Diagrams/ComponentDiagram.cs +++ b/samples/Basic/C4Sharp.Sample/Diagrams/ComponentDiagram.cs @@ -1,6 +1,7 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Elements; +using C4Sharp.Elements.Boundaries; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Structures; namespace C4Sharp.Sample.Diagrams @@ -26,7 +27,7 @@ public class ComponentDiagram: DiagramBuildRunner protected override DiagramLayout FlowVisualization => DiagramLayout.LeftRight; protected override bool LayoutAsSketch => true; - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { Spa, MobileApp, @@ -35,12 +36,12 @@ public class ComponentDiagram: DiagramBuildRunner Boundary(), }; - protected override IEnumerable Relationships() => new Relationship[] + protected override IEnumerable Relationships => new Relationship[] { - (Spa > Sign)["Uses", "JSON/HTTPS"], - (Spa > Accounts)["Uses", "JSON/HTTPS"], - (MobileApp > Sign)["Uses", "JSON/HTTPS"], - (MobileApp > Accounts)["Uses", "JSON/HTTPS"], + Spa > Sign | ("Uses", "JSON/HTTPS"), + Spa > Accounts | ("Uses", "JSON/HTTPS"), + MobileApp > Sign | ("Uses", "JSON/HTTPS"), + MobileApp > Accounts | ("Uses", "JSON/HTTPS") }; private static ContainerBoundary Boundary() @@ -58,8 +59,8 @@ private static ContainerBoundary Boundary() { Sign > Security, Accounts > MainframeFacade, - (Security > SqlDatabase)["Read & write to", "JDBC"], - (MainframeFacade > Mainframe)["Uses", "XML/HTTPS"] + Security > SqlDatabase | ("Read & write to", "JDBC"), + MainframeFacade > Mainframe | ("Uses", "XML/HTTPS") } }; } diff --git a/samples/Basic/C4Sharp.Sample/Diagrams/ContainerDiagram.cs b/samples/Basic/C4Sharp.Sample/Diagrams/ContainerDiagram.cs index 7882ec8..5e1d30b 100644 --- a/samples/Basic/C4Sharp.Sample/Diagrams/ContainerDiagram.cs +++ b/samples/Basic/C4Sharp.Sample/Diagrams/ContainerDiagram.cs @@ -1,8 +1,10 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements; +using C4Sharp.Elements.Boundaries; +using C4Sharp.Elements.Plantuml; +using C4Sharp.Elements.Plantuml.Constants; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Structures; namespace C4Sharp.Sample.Diagrams @@ -14,7 +16,7 @@ public class ContainerDiagram: DiagramBuildRunner protected override string Title => "Container diagram for Internet Banking System"; protected override DiagramType DiagramType => DiagramType.Container; - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { People.Customer, Systems.BankingSystem, @@ -28,23 +30,23 @@ public class ContainerDiagram: DiagramBuildRunner ) }; - protected override IEnumerable Relationships() => new[] + protected override IEnumerable Relationships => new[] { - (People.Customer > WebApp)["Uses", "HTTPS"], - (People.Customer > Spa)["Uses", "HTTPS"], - (People.Customer > MobileApp)["Uses"], + People.Customer > WebApp | ("Uses", "HTTPS"), + People.Customer > Spa | ("Uses", "HTTPS"), + People.Customer > MobileApp | "Uses", - (WebApp > Spa)["Delivers"][Position.Neighbor], - (Spa > BackendApi)["Uses", "async, JSON/HTTPS"], - (MobileApp > BackendApi)["Uses", "async, JSON/HTTPS"], - (SqlDatabase < BackendApi)["Uses", "async, JSON/HTTPS"][Position.Neighbor], + WebApp > Spa | "Delivers" | Position.Neighbor, + Spa > BackendApi | ("Uses", "async, JSON/HTTPS"), + MobileApp > BackendApi | ("Uses", "async, JSON/HTTPS"), + SqlDatabase < BackendApi | ("Uses", "async, JSON/HTTPS") | Position.Neighbor, - (People.Customer < Systems.MailSystem)["Sends e-mails to"], - (Systems.MailSystem < BackendApi)["Sends e-mails using", "sync, SMTP"], - (BackendApi > Systems.BankingSystem)["Uses", "sync/async, XML/HTTPS"][Position.Neighbor] + People.Customer < Systems.MailSystem | "Sends e-mails to", + Systems.MailSystem < BackendApi | ("Sends e-mails using", "sync, SMTP"), + BackendApi > Systems.BankingSystem | ("Uses", "sync/async, XML/HTTPS") | Position.Neighbor }; - protected override IElementTag? SetTags() + protected override IElementTag SetTags() { return new ElementTag() .AddElementTag("services", "#3F6684", shape: Shape.EightSidedShape); diff --git a/samples/Basic/C4Sharp.Sample/Diagrams/ContextDiagram.cs b/samples/Basic/C4Sharp.Sample/Diagrams/ContextDiagram.cs index 5e51378..d5f99ad 100644 --- a/samples/Basic/C4Sharp.Sample/Diagrams/ContextDiagram.cs +++ b/samples/Basic/C4Sharp.Sample/Diagrams/ContextDiagram.cs @@ -1,8 +1,9 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements; +using C4Sharp.Elements.Plantuml; +using C4Sharp.Elements.Plantuml.Constants; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Structures; namespace C4Sharp.Sample.Diagrams @@ -16,7 +17,7 @@ public class ContextDiagram : DiagramBuildRunner protected override string Title => "System Context diagram for Internet Banking System"; protected override DiagramType DiagramType => DiagramType.Context; - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { Customer, BankingSystem, @@ -24,15 +25,15 @@ public class ContextDiagram : DiagramBuildRunner MailSystem }; - protected override IEnumerable Relationships() => new[] + protected override IEnumerable Relationships => new[] { (Customer > BankingSystem).AddTags("error"), - (Customer < MailSystem)["Sends e-mails to"], - (BankingSystem > MailSystem)["Sends e-mails", "SMTP"][Neighbor], - BankingSystem > Mainframe, + Customer < MailSystem | "Sends e-mails to", + BankingSystem > MailSystem | ("Sends e-mails", "SMTP") | Neighbor, + BankingSystem > Mainframe }; - protected override IElementStyle? SetStyle() + protected override IElementStyle SetStyle() { return new ElementStyle() .UpdateElementStyle(ElementName.ExternalPerson, "#7f3b08", "#7f3b08") diff --git a/samples/Basic/C4Sharp.Sample/Diagrams/DeploymentDiagram.cs b/samples/Basic/C4Sharp.Sample/Diagrams/DeploymentDiagram.cs index 2f224b0..68a560a 100644 --- a/samples/Basic/C4Sharp.Sample/Diagrams/DeploymentDiagram.cs +++ b/samples/Basic/C4Sharp.Sample/Diagrams/DeploymentDiagram.cs @@ -1,6 +1,6 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Elements; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Structures; namespace C4Sharp.Sample.Diagrams @@ -10,14 +10,14 @@ public class DeploymentDiagram: DiagramBuildRunner protected override string Title => "System Context diagram for Internet Banking System"; protected override DiagramType DiagramType => DiagramType.Deployment; - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { BigBankNode(), Nodes.Ios("ios", Containers.MobileApp), Nodes.PersonalComputer("computer", Nodes.Browser("browser", Containers.Spa)) }; - protected override IEnumerable Relationships() => new[] + protected override IEnumerable Relationships => new[] { (Containers.MobileApp > Containers.BackendApi)["Makes API calls to", "json/HTTPS"], (Containers.Spa > Containers.BackendApi)["Makes API calls to", "json/HTTPS"], @@ -30,7 +30,7 @@ protected override IEnumerable Relationships() => new[] private static DeploymentNode BigBankNode() { - return new ("plc", "Big Bank plc") + return new DeploymentNode("plc", "Big Bank plc") { Description = "Big Bank plc data center", Nodes = new[] diff --git a/samples/Basic/C4Sharp.Sample/Diagrams/EnterpriseDiagram.cs b/samples/Basic/C4Sharp.Sample/Diagrams/EnterpriseDiagram.cs index f551637..3137b0e 100644 --- a/samples/Basic/C4Sharp.Sample/Diagrams/EnterpriseDiagram.cs +++ b/samples/Basic/C4Sharp.Sample/Diagrams/EnterpriseDiagram.cs @@ -1,8 +1,10 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Plantuml; -using C4Sharp.Models.Plantuml.Constants; -using C4Sharp.Models.Relationships; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements; +using C4Sharp.Elements.Boundaries; +using C4Sharp.Elements.Plantuml; +using C4Sharp.Elements.Plantuml.Constants; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Structures; namespace C4Sharp.Sample.Diagrams @@ -16,7 +18,7 @@ public class EnterpriseDiagram: DiagramBuildRunner protected override string Title => "System Enterprise diagram for Internet Banking System"; protected override DiagramType DiagramType => DiagramType.Context; - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { Customer, EnterpriseBoundary(), @@ -26,19 +28,19 @@ public class EnterpriseDiagram: DiagramBuildRunner private static EnterpriseBoundary EnterpriseBoundary() { - return new EnterpriseBoundary("eboundary", "Domain A") + return new EnterpriseBoundary("enterprise.boundary", "Domain A") { Structures = new Structure[] { BankingSystem, - new EnterpriseBoundary("eboundary1", "Domain Internal Users") + new EnterpriseBoundary("enterprise.boundary.1", "Domain Internal Users") { Structures = new Structure[] { InternalCustomer, } }, - new EnterpriseBoundary("eboundary2", "Domain Managers") + new EnterpriseBoundary("enterprise.boundary.2", "Domain Managers") { Structures = new Structure[] { @@ -49,17 +51,17 @@ private static EnterpriseBoundary EnterpriseBoundary() }; } - protected override IEnumerable Relationships() => new[] + protected override IEnumerable Relationships => new[] { Customer > BankingSystem, InternalCustomer > BankingSystem, Manager > BankingSystem, - (Customer < MailSystem)["Sends e-mails to"], - (BankingSystem > MailSystem)["Sends e-mails", "SMTP"][Neighbor], + Customer < MailSystem | "Sends e-mails to", + BankingSystem > MailSystem | ("Sends e-mails", "SMTP") | Neighbor, BankingSystem > Mainframe, }; - protected override IElementStyle? SetStyle() + protected override IElementStyle SetStyle() { return new ElementStyle() .UpdateElementStyle(ElementName.ExternalPerson, "#7f3b08", "#7f3b08") diff --git a/samples/Basic/C4Sharp.Sample/Program.cs b/samples/Basic/C4Sharp.Sample/Program.cs index 4e416b0..28a07b2 100644 --- a/samples/Basic/C4Sharp.Sample/Program.cs +++ b/samples/Basic/C4Sharp.Sample/Program.cs @@ -1,4 +1,4 @@ -using C4Sharp.Models.Plantuml.IO; +using C4Sharp.Elements.Plantuml.IO; using C4Sharp.Sample.Diagrams; namespace C4Sharp.Sample; @@ -16,11 +16,12 @@ private static void Main() new EnterpriseDiagram().Build(), }; - new PlantumlContext() + var context = new PlantumlContext(); + + context .UseDiagramImageBuilder() .UseDiagramSvgImageBuilder() - .UseStandardLibraryBaseUrl() - .UseHtmlPageBuilder() + //.UseStandardLibraryBaseUrl() //load the resources from github C4plantuml repository .Export(diagrams); } } \ No newline at end of file diff --git a/samples/Basic/C4Sharp.Sample/Structures/Components.cs b/samples/Basic/C4Sharp.Sample/Structures/Components.cs index a87af24..9e55970 100644 --- a/samples/Basic/C4Sharp.Sample/Structures/Components.cs +++ b/samples/Basic/C4Sharp.Sample/Structures/Components.cs @@ -1,4 +1,4 @@ -using C4Sharp.Models; +using C4Sharp.Elements; namespace C4Sharp.Sample.Structures; diff --git a/samples/Basic/C4Sharp.Sample/Structures/Containers.cs b/samples/Basic/C4Sharp.Sample/Structures/Containers.cs index b4e93b7..7688f42 100644 --- a/samples/Basic/C4Sharp.Sample/Structures/Containers.cs +++ b/samples/Basic/C4Sharp.Sample/Structures/Containers.cs @@ -1,67 +1,63 @@ -using C4Sharp.Models; +using System.Reflection.Emit; +using C4Sharp.Elements; +using C4Sharp.Elements.Containers; namespace C4Sharp.Sample.Structures; public static class Containers { - private static Container? _webApp; - - public static Container WebApp => _webApp ??= new Container( - "Corporate.Finance.Limits.Service.ServiceBus", "WebApp") - { - ContainerType = ContainerType.WebApplication, - Description = "Delivers the static content and the Internet banking SPA", - Technology = "C#, WebApi" - }; - - private static Container? _spa; - - public static Container Spa => _spa ??= new Container( - "Spa", "SPA") - { - ContainerType = ContainerType.Spa, - Description = "Provides all the Internet banking functionality to customers via their web browser", - Technology = "JavaScript, Angular" - }; - - private static Container? _mobileApp; - - public static Container MobileApp => _mobileApp ??= new Container( - "MobileApp", "MobileApp") - { - ContainerType = ContainerType.Mobile, - Description = - "Provides a limited subset of the Internet banking functionality to customers via their mobile device", - Technology = "C#, Xamarin" - }; - - private static Container? _sqlDatabase; - - public static Container SqlDatabase => _sqlDatabase ??= new Container( - "Database", "SqlDatabase") - { - ContainerType = ContainerType.Database, - Description = "Stores user registration information, hashed auth credentials, access logs, etc.", - Technology = "SQL Database" - }; - - private static Container? _oracleDatabase; - - public static Container OracleDatabase => _oracleDatabase ??= new Container( - "Database", "OracleDatabase") - { - ContainerType = ContainerType.Database, - Description = "Stores user registration information, hashed auth credentials, access logs, etc.", - Technology = "Oracle Database" - }; - - private static Container? _backendApi; - - public static Container BackendApi => _backendApi ??= new Container( - "BackendApi", "BackendApi") - { - ContainerType = ContainerType.Api, - Description = "Provides Internet banking functionality via API.", - Technology = "Dotnet, Docker Container" - }; -} + private static ServerSideWebApp? _webApp; + + public static ServerSideWebApp WebApp => _webApp ??= new ServerSideWebApp( + Alias: "Corporate.Finance.Limits.Service.ServiceBus", + Label: "WebApp", + Description: "Delivers the static content and the Internet banking SPA", + Technology: "C#, WebApi" + ); + + private static ClientSideWebApp? _spa; + + public static ClientSideWebApp Spa => _spa ??= new ClientSideWebApp( + Alias: "Spa", + Label: "SPA", + Technology: "JavaScript, Angular", + Description: "Provides all the Internet banking functionality to customers via their web browser" + ); + + private static Mobile? _mobileApp; + + public static Mobile MobileApp => _mobileApp ??= new Mobile( + Alias: "MobileApp", + Label: "MobileApp", + Description: + "Provides a limited subset of the Internet banking functionality to customers via their mobile device", + Technology: "C#, Xamarin" + ); + + private static Database? _sqlDatabase; + + public static Database SqlDatabase => _sqlDatabase ??= new Database( + Alias: "Database", + Label: "SqlDatabase", + Description: "Stores user registration information, hashed auth credentials, access logs, etc.", + Technology: "SQL Database" + ); + + private static Database? _oracleDatabase; + + public static Database OracleDatabase => _oracleDatabase ??= new Database( + Alias: "Database", + Label: "OracleDatabase", + Description: "Stores user registration information, hashed auth credentials, access logs, etc.", + Technology: "Oracle Database" + ); + + private static Api? _backendApi; + + public static Api BackendApi => _backendApi ??= new Api( + Alias: "BackendApi", + Label: "BackendApi", + Description: "Provides Internet banking functionality via API.", + Technology: "Dotnet, Docker Container" + ); +} \ No newline at end of file diff --git a/samples/Basic/C4Sharp.Sample/Structures/Nodes.cs b/samples/Basic/C4Sharp.Sample/Structures/Nodes.cs index dad3162..a137992 100644 --- a/samples/Basic/C4Sharp.Sample/Structures/Nodes.cs +++ b/samples/Basic/C4Sharp.Sample/Structures/Nodes.cs @@ -1,4 +1,4 @@ -using C4Sharp.Models; +using C4Sharp.Elements; namespace C4Sharp.Sample.Structures; diff --git a/samples/Basic/C4Sharp.Sample/Structures/People.cs b/samples/Basic/C4Sharp.Sample/Structures/People.cs index 43cf2c0..776aa9d 100644 --- a/samples/Basic/C4Sharp.Sample/Structures/People.cs +++ b/samples/Basic/C4Sharp.Sample/Structures/People.cs @@ -1,5 +1,5 @@ -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Elements; +using C4Sharp.Elements.Relationships; namespace C4Sharp.Sample.Structures; diff --git a/samples/Basic/C4Sharp.Sample/Structures/Systems.cs b/samples/Basic/C4Sharp.Sample/Structures/Systems.cs index 7e8d065..fb1a55b 100644 --- a/samples/Basic/C4Sharp.Sample/Structures/Systems.cs +++ b/samples/Basic/C4Sharp.Sample/Structures/Systems.cs @@ -1,6 +1,6 @@ using C4Sharp.Diagrams; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Elements; +using C4Sharp.Elements.Relationships; using C4Sharp.Sample.Diagrams; namespace C4Sharp.Sample.Structures; @@ -16,7 +16,6 @@ public static class Systems Description = "Allows customers to view information about their " + "bank accounts, and make payments.", Tags = new[] { "services" }, - Link = DiagramHRef.LinkTo() }; private static SoftwareSystem? _mainframe; From 5597b1e7ab7bc68189fe2bc12475474b85f323cf Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 22:48:07 -0300 Subject: [PATCH 05/12] Update version of C4 PUML files in Resource --- src/C4Sharp/Resources/C4.puml | 542 +++++++++++++++++------ src/C4Sharp/Resources/C4_Component.puml | 40 +- src/C4Sharp/Resources/C4_Container.puml | 54 ++- src/C4Sharp/Resources/C4_Context.puml | 193 +++++++- src/C4Sharp/Resources/C4_Deployment.puml | 56 +-- src/C4Sharp/Resources/C4_Dynamic.puml | 10 +- 6 files changed, 644 insertions(+), 251 deletions(-) diff --git a/src/C4Sharp/Resources/C4.puml b/src/C4Sharp/Resources/C4.puml index 3f82416..ecd1d45 100644 --- a/src/C4Sharp/Resources/C4.puml +++ b/src/C4Sharp/Resources/C4.puml @@ -3,7 +3,9 @@ 'Version ' ################################## !function C4Version() - !return "2.4.0" + ' 2 spaces and ' are used as unique marker, that the release scripts makes the correct version update + !$c4Version = "2.6.0beta1" + !return $c4Version !end function !procedure C4VersionDetails() @@ -29,20 +31,33 @@ rectangle C4VersionDetailsArea <> [ !global $LEGEND_DARK_COLOR = "#66622E" !global $LEGEND_LIGHT_COLOR = "#khaki" +!global $SKETCH_BG_COLOR = "#EEEBDC" +!global $SKETCH_FONT_COLOR = "" +!global $SKETCH_WARNING_COLOR = "red" +!global $SKETCH_FONT_NAME = "Comic Sans MS" + ' Labels ' ################################## -!global $LEGEND_SHADOW_TEXT = "(shadow) " -!global $LEGEND_NO_SHADOW_TEXT = "(no shadow) " -!global $LEGEND_NO_FONT_BG_TEXT = "(no text, no back color) " -!global $LEGEND_NO_FONT_TEXT = "(no text color) " -!global $LEGEND_NO_BG_TEXT = "(no back color) " -!global $LEGEND_NO_LINE_TEXT = "(no line color) " -!global $LEGEND_ROUNDED_BOX = "(rounded box) " -!global $LEGEND_EIGHT_SIDED = "(eight sided) " -!global $LEGEND_DOTTED_LINE = "(dotted) " -!global $LEGEND_DASHED_LINE = "(dashed) " -!global $LEGEND_BOLD_LINE = "(bold) " +!global $LEGEND_SHADOW_TEXT = "shadow" +!global $LEGEND_NO_SHADOW_TEXT = "no shadow" +!global $LEGEND_NO_FONT_BG_TEXT = "last text and back color" +!global $LEGEND_NO_FONT_TEXT = "last text color" +!global $LEGEND_NO_BG_TEXT = "last back color" +!global $LEGEND_NO_LINE_TEXT = "last line color" +!global $LEGEND_ROUNDED_BOX = "rounded box" +!global $LEGEND_EIGHT_SIDED = "eight sided" +!global $LEGEND_DOTTED_LINE = "dotted" +!global $LEGEND_DASHED_LINE = "dashed" +!global $LEGEND_BOLD_LINE = "bold" +!global $LEGEND_BOUNDARY = "boundary" +!global $LEGEND_DASHED_BOUNDARY = "dashed" +' ignore transparent atm, that the legend is smaller +'!global $LEGEND_DASHED_TRANSPARENT_BOUNDARY = "dashed, transparent" +!global $LEGEND_DASHED_TRANSPARENT_BOUNDARY = "dashed" + +!global $SKETCH_FOOTER_WARNING = "Warning:" +!global $SKETCH_FOOTER_TEXT = "Created for discussion, needs to be validated" ' Styling ' ################################## @@ -51,6 +66,10 @@ rectangle C4VersionDetailsArea <> [ !global $ROUNDED_BOX_SIZE = 25 !global $EIGHT_SIDED_SIZE = 18 +!global $LEGEND_DETAILS_SMALL_SIZE = 10 +!global $LEGEND_DETAILS_NORMAL_SIZE = 14 +!global $LEGEND_DETAILS_SIZE = $LEGEND_DETAILS_SMALL_SIZE + !global $ROUNDED_BOX = "roundedBox" !global $EIGHT_SIDED = "eightSided" @@ -58,6 +77,10 @@ rectangle C4VersionDetailsArea <> [ !global $DASHED_LINE = "dashed" !global $BOLD_LINE = "bold" +!global $LEGEND_DETAILS_NONE = "none" +!global $LEGEND_DETAILS_NORMAL = "normal" +!global $LEGEND_DETAILS_SMALL = "small" + skinparam defaultTextAlignment center skinparam wrapWidth 200 @@ -95,33 +118,31 @@ skinparam arrow { FontSize 12 } -skinparam actor { +skinparam person { StereotypeFontSize 12 shadowing false - style awesome } -skinparam person { +skinparam actor { StereotypeFontSize 12 shadowing false + style awesome } ' Some boundary skinparams have to be set as package skinparams too (PlantUML uses internal packages) -skinparam package { +' UpdateBoundaryStyle() called in boundary section below +skinparam rectangle<> { + Shadowing false StereotypeFontSize 6 StereotypeFontColor $BOUNDARY_BG_COLOR - FontStyle plain - BackgroundColor $BOUNDARY_BG_COLOR + BorderStyle dashed } -skinparam rectangle<> { - Shadowing false +skinparam package { StereotypeFontSize 6 StereotypeFontColor $BOUNDARY_BG_COLOR - FontColor $BOUNDARY_COLOR - BorderColor $BOUNDARY_COLOR + FontStyle plain BackgroundColor $BOUNDARY_BG_COLOR - BorderStyle dashed } ' Legend and Tags @@ -254,10 +275,28 @@ skinparam rectangle<> { !return $arg !endfunction +' if $value is empty try to load it via variable, optional can it store the calculated value +!function $restoreEmpty($elementType, $property, $value, $store) + !$var = "$" + $elementType + "Restore" + $property + !if ($value == "") + !$value = %get_variable_value($var) + !elseif ($store) + %set_variable_value($var, $value) + !endif + !return $value +!endfunction + +' clear the restore property +!function $clearRestore($elementType, $property) + !$var = "$" + $elementType + "Restore" + $property + %set_variable_value($var, "") + !return "" +!endfunction + !function $elementTagSkinparams($element, $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape) !$elementSkin = "skinparam " + $element + "<<" + $tagStereo + ">> {" + %newline() !if ($fontColor != "") - !if ($tagStereo != "boundary") + !if (%strpos($tagStereo, "boundary") < 0) !$elementSkin = $elementSkin + " StereotypeFontColor " + $fontColor + %newline() !endif !$elementSkin = $elementSkin + " FontColor " + $fontColor + %newline() @@ -293,12 +332,13 @@ skinparam rectangle<> { !$tagSkin = $elementTagSkinparams("rectangle", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape) !$tagSkin = $tagSkin + $elementTagSkinparams("database", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "") !$tagSkin = $tagSkin + $elementTagSkinparams("queue", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "") + ' plantuml.jar bug - actor have to be after person + !$tagSkin = $tagSkin + $elementTagSkinparams("person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "") ' actor has style awesome, therefore $fontColor is ignored and text uses $bgColor too !$tagSkin = $tagSkin + $elementTagSkinparams("actor", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "") - !$tagSkin = $tagSkin + $elementTagSkinparams("person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "") - !if ($tagStereo == "boundary" && $bgColor != "") - !$tagSkin = $tagSkin + "skinparam package<>StereotypeFontColor " + $bgColor + %newline() - !$tagSkin = $tagSkin + "skinparam rectangle<>StereotypeFontColor " + $bgColor + %newline() + !if (%strpos($tagStereo, "boundary") >= 0 && $bgColor != "") + !$tagSkin = $tagSkin + "skinparam package<<" + $tagStereo + ">>StereotypeFontColor " + $bgColor + %newline() + !$tagSkin = $tagSkin + "skinparam rectangle<<" + $tagStereo + ">>StereotypeFontColor " + $bgColor + %newline() !endif $tagSkin !endprocedure @@ -311,19 +351,24 @@ $tagSkin !return $c !endfunction -!unquoted procedure $defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle) +!unquoted procedure $defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness) !$elementSkin = "skinparam arrow<<" + $tagStereo + ">> {" + %newline() - !$elementSkin = $elementSkin + " Color " - !if ($lineColor != "") - !$elementSkin = $elementSkin + $colorWithoutHash($lineColor) - !endif - !if ($textColor != "") - !$elementSkin = $elementSkin + ";text:" + $colorWithoutHash($textColor) + !if ($lineColor != "") || ($textColor != "") || ($lineStyle != "") + !$elementSkin = $elementSkin + " Color " + !if ($lineColor != "") + !$elementSkin = $elementSkin + $colorWithoutHash($lineColor) + !endif + !if ($textColor != "") + !$elementSkin = $elementSkin + ";text:" + $colorWithoutHash($textColor) + !endif + !if ($lineStyle != "") + !$elementSkin = $elementSkin + ";line." + $lineStyle + !endif + !$elementSkin = $elementSkin + %newline() !endif - !if ($lineStyle != "") - !$elementSkin = $elementSkin + ";line." + $lineStyle + !if ($lineThickness != "") + !$elementSkin = $elementSkin + " thickness " + $lineThickness + %newline() !endif - !$elementSkin = $elementSkin + %newline() !$elementSkin = $elementSkin + "}" + %newline() $elementSkin !endprocedure @@ -442,7 +487,7 @@ $elementSkin !return $formatted !endfunction -!function $tagLegendEntry($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) +!function $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) !$bg = $bgColor !$fo = $fontColor !$bo = $borderColor @@ -483,6 +528,7 @@ $elementSkin !endif !$tagEntry = "|" + !$tagDetails = "(" !$tagEntry = $tagEntry + "<" + $colorWithHash($bg) +">" ' ..white rectangle !$tagEntry = $tagEntry + " " @@ -491,39 +537,82 @@ $elementSkin !$tagEntry = $tagEntry + $getSprite($legendSprite) + " " !endif !if ($legendText == "") - !$tagEntry = $tagEntry + " " + $tagStereo + " " + !if ($tagStereo == "boundary") + !if ($bgColor == "#00000000" || %lower($bgColor) == "transparent") + !$tagEntry = $tagEntry + " " + $LEGEND_BOUNDARY + " " + !$tagDetails = $tagDetails + $LEGEND_DASHED_TRANSPARENT_BOUNDARY + ", " + !else + !$tagEntry = $tagEntry + " " + $LEGEND_BOUNDARY + " " + !$tagDetails = $tagDetails + $LEGEND_DASHED_BOUNDARY + ", " + !endif + !elseif (%strpos($tagStereo, "boundary") >= 0) + ' if contains/ends with _boundary remove _boundary and add "boundary (dashed)" + !$pos = %strpos($tagStereo, "_boundary") + !if ($pos > 0) + !$tagEntry = $tagEntry + " " + %substr($tagStereo, 0 ,$pos) + !if ($bgColor == "#00000000" || %lower($bgColor) == "transparent") + !$tagEntry = $tagEntry + " " + $LEGEND_BOUNDARY + " " + !$tagDetails = $tagDetails + $LEGEND_DASHED_TRANSPARENT_BOUNDARY + ", " + !else + !$tagEntry = $tagEntry + " " + $LEGEND_BOUNDARY + " " + !$tagDetails = $tagDetails + $LEGEND_DASHED_BOUNDARY + ", " + !endif + !endif + !else + !$tagEntry = $tagEntry + " " + $tagStereo + " " + !endif !if ($shadowing == "true") - !$tagEntry = $tagEntry + $LEGEND_SHADOW_TEXT + !$tagDetails = $tagDetails + $LEGEND_SHADOW_TEXT + ", " !endif !if ($shadowing == "false") - !$tagEntry = $tagEntry + $LEGEND_NO_SHADOW_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_SHADOW_TEXT + ", " !endif !if ($shape == $ROUNDED_BOX) - !$tagEntry = $tagEntry + $LEGEND_ROUNDED_BOX + !$tagDetails = $tagDetails + $LEGEND_ROUNDED_BOX + ", " !endif !if ($shape == $EIGHT_SIDED) - !$tagEntry = $tagEntry + $LEGEND_EIGHT_SIDED + !$tagDetails = $tagDetails + $LEGEND_EIGHT_SIDED + ", " !endif !if ($fontColor == "" && $bgColor == "") - !$tagEntry = $tagEntry + $LEGEND_NO_FONT_BG_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_BG_TEXT + ", " !else !if ($fontColor == "") - !$tagEntry = $tagEntry + $LEGEND_NO_FONT_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + ", " !endif !if ($bgColor == "") - !$tagEntry = $tagEntry + $LEGEND_NO_BG_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_BG_TEXT + ", " !endif !endif + !if ($tagDetails=="(") + !$tagDetails = "" + !else + !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2) + !$tagDetails = $tagDetails + ")" + !endif !else - !$tagEntry = $tagEntry + " " + $legendText + " " + !$brPos = %strpos($legendText, "\n") + !if ($brPos > 0) + !$tagEntry = $tagEntry + %substr($legendText, 0, $brPos) + " " + !$details = %substr($legendText, $brPos + 2) + !if ($details=="") + !$tagDetails = "" + !else + !$tagDetails = $tagDetails + $details + ")" + !endif + !else + !$tagEntry = $tagEntry + " " + $legendText + " " + !$tagDetails = "" + !endif !endif - !$tagEntry = $tagEntry + " " - !$tagEntry = $tagEntry + "|" + !$tagDetails = $tagDetails + " " + !$tagDetails = $tagDetails + "|" +%set_variable_value("$" + $tagStereo + "LegendEntry", $tagEntry) +%set_variable_value("$" + $tagStereo + "LegendDetails", $tagDetails) !return $tagEntry !endfunction -!function $tagRelLegendEntry($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite) +!function $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) !$tc = $textColor !$lc = $lineColor @@ -543,6 +632,7 @@ $elementSkin !endif !$tagEntry = "|" + !$tagDetails = "(" ' ..white line !$tagEntry = $tagEntry + " " !$tagEntry = $tagEntry + "" @@ -552,49 +642,67 @@ $elementSkin !if ($legendText == "") !$tagEntry = $tagEntry + " " + $tagStereo + " " !if ($textColor == "") - !$tagEntry = $tagEntry + $LEGEND_NO_FONT_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + ", " !endif !if ($lineColor == "") - !$tagEntry = $tagEntry + $LEGEND_NO_LINE_TEXT + !$tagDetails = $tagDetails + $LEGEND_NO_LINE_TEXT + ", " !endif !if ($lineStyle != "") !if ($lineStyle == $DOTTED_LINE) - !$tagEntry = $tagEntry + $LEGEND_DOTTED_LINE + !$tagDetails = $tagDetails + $LEGEND_DOTTED_LINE + ", " !elseif ($lineStyle == $DASHED_LINE) - !$tagEntry = $tagEntry + $LEGEND_DASHED_LINE + !$tagDetails = $tagDetails + $LEGEND_DASHED_LINE + ", " !elseif ($lineStyle == $BOLD_LINE) - !$tagEntry = $tagEntry + $LEGEND_BOLD_LINE + !$tagDetails = $tagDetails + $LEGEND_BOLD_LINE + ", " !else - !$tagEntry = $tagEntry + "(" + $lineStyle + ") " + !$tagDetails = $tagDetails + $lineStyle + ", " !endif !endif + !if ($lineThickness != "") + !$tagDetails = $tagDetails + "thickness " + $lineThickness + ") " + !endif + !if ($tagDetails=="(") + !$tagDetails = "" + !else + !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2) + !$tagDetails = $tagDetails + ")" + !endif !else - !$tagEntry = $tagEntry + " " + $legendText + " " + !$brPos = %strpos($legendText, "\n") + !if ($brPos > 0) + !$tagEntry = $tagEntry + " " + %substr($legendText, 0, $brPos) + " " + !$details = %substr($legendText, $brPos + 2) + !if ($details=="") + !$tagDetails = "" + !else + !$tagDetails = $tagDetails + $details + ")" + !endif + !else + !$tagEntry = $tagEntry + " " + $legendText + " " + !$tagDetails = "" + !endif !endif - !$tagEntry = $tagEntry + " " - !$tagEntry = $tagEntry + "|" + !$tagDetails = $tagDetails + " " + !$tagDetails = $tagDetails + "|" +%set_variable_value("$" + $tagStereo + "_LineLegendEntry", $tagEntry) +%set_variable_value("$" + $tagStereo + "_LineLegendDetails", $tagDetails) !return $tagEntry !endfunction -!global $LEGEND_DOTTED_LINE = "(dotted) " -!global $LEGEND_DASHED_LINE = "(dashed) " -!global $LEGEND_BOLD_LINE = "(bold) " - !unquoted procedure $addTagToLegend($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $legendText="", $legendSprite="") '' if a combined element tag is defined (e.g. "v1.0&v1.1") then it is typically a merged color, '' like a new $fontColor="#fdae61" therefore it should be added to the legend '' and the & combined tags will be not removed ' !if (%strpos($tagStereo, "&") < 0) - !$tagEntry = $tagLegendEntry($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) -%set_variable_value("$" + $tagStereo + "LegendEntry", $tagEntry) + !$dummyAlreadyVariables = $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) !$tagCustomLegend = $tagCustomLegend + $tagStereo + "\n" !$tagMask = $tagLegendMask( $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite) %set_variable_value("$" + $tagStereo + "LegendMask", $tagMask) ' !endif !endprocedure -!unquoted procedure $addRelTagToLegend($tagStereo, $textColor="", $lineColor="", $lineStyle="", $legendText="", $legendSprite="") +!unquoted procedure $addRelTagToLegend($tagStereo, $textColor="", $lineColor="", $lineStyle="", $legendText="", $legendSprite="", $lineThickness="") '' Arrows have a bug with stereotype/skinparams and cannot combine text colors of one stereotype '' and the line color of another stereotype. Therefore the text color of one tag and the line color '' of another tag have to be combined via a "workaround" tag ("v1.0&v1.1"). @@ -602,9 +710,8 @@ $elementSkin '' be an inconsistency between the element tags and the rel tags and therefore '' & combined workaround tags are not removed too (and in unlikely cases the color itself could be changed) ' !if (%strpos($tagStereo, "&") < 0) - !$tagEntry = $tagRelLegendEntry($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite) -%set_variable_value("$" + $tagStereo + "_LineLegendEntry", $tagEntry) - !$tagCustomLegend = $tagCustomLegend + $tagStereo + "_Line\n" + !$dummyAlreadyVariables = $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) + !$tagCustomLegend = $tagCustomLegend + $tagStereo + "_Line\n" ' !endif !endprocedure @@ -615,13 +722,23 @@ $elementSkin !$allDefined = %substr($allDefined, $brPos+2) !$brPos = %strpos($allDefined, "\n") !if (%variable_exists("$" + $tagStereo + "Legend")) -%get_variable_value("$" + $tagStereo + "LegendEntry") + ' is part of legendDetails + !$part1 = %get_variable_value("$" + $tagStereo + "LegendEntry") + !$partSize = "" + !$part2 = %get_variable_value("$" + $tagStereo + "LegendDetails") + !$line = $part1 + $partSize + $part2 +$line !endif !endwhile !if (%strlen($allDefined) > 0) !$tagStereo = $allDefined !if (%variable_exists("$" + $tagStereo + "Legend")) -%get_variable_value("$" + $tagStereo + "LegendEntry") + ' is part of legendDetails + !$part1 = %get_variable_value("$" + $tagStereo + "LegendEntry") + !$partSize = "" + !$part2 = %get_variable_value("$" + $tagStereo + "LegendDetails") + !$line = $part1 + $partSize + $part2 +$line !endif !endif !endprocedure @@ -661,9 +778,24 @@ $defineSkinparams($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $s $addTagToLegend($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) !endprocedure +!unquoted procedure $addElementTagInclReuse($elementName, $tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + !$bgColor=$restoreEmpty($elementName, "bgColor", $bgColor, %true()) + !$fontColor=$restoreEmpty($elementName, "fontColor", $fontColor, %true()) + !$borderColor=$restoreEmpty($elementName, "borderColor", $borderColor, %true()) + !$shadowing=$restoreEmpty($elementName, "shadowing", $shadowing, %true()) + !$shape=$restoreEmpty($elementName, "shape", $shape, %true()) + !$sprite=$restoreEmpty($elementName, "sprite", $sprite, %true()) + !$techn=$restoreEmpty($elementName, "techn", $techn, %true()) + ' new style should has its own legend text + ' !$legendText=$restoreEmpty($elementName, "legendText", $legendText, %true()) + !$legendSprite=$restoreEmpty($elementName, "legendSprite", $legendSprite, %true()) + + AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!endprocedure + ' used by new defined rel tags -!unquoted procedure AddRelTag($tagStereo, $textColor="", $lineColor="", $lineStyle = "", $sprite="", $techn="", $legendText="", $legendSprite="") -$defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle) +!unquoted procedure AddRelTag($tagStereo, $textColor="", $lineColor="", $lineStyle="", $sprite="", $techn="", $legendText="", $legendSprite="", $lineThickness="") +$defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness) !if ($sprite != "") %set_variable_value("$" + $tagStereo + "RelTagSprite", $sprite) !if ($legendSprite == "") @@ -674,11 +806,20 @@ $defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle) !if ($techn != "") %set_variable_value("$" + $tagStereo + "RelTagTechn", $techn) !endif -$addRelTagToLegend($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite) +$addRelTagToLegend($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) !endprocedure ' update the style of existing elements like person, ... !unquoted procedure UpdateElementStyle($elementName, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") +!$bgColor=$restoreEmpty($elementName, "bgColor", $bgColor, %true()) +!$fontColor=$restoreEmpty($elementName, "fontColor", $fontColor, %true()) +!$borderColor=$restoreEmpty($elementName, "borderColor", $borderColor, %true()) +!$shadowing=$restoreEmpty($elementName, "shadowing", $shadowing, %true()) +!$shape=$restoreEmpty($elementName, "shape", $shape, %true()) +!$sprite=$restoreEmpty($elementName, "sprite", $sprite, %true()) +!$techn=$restoreEmpty($elementName, "techn", $techn, %true()) +!$legendText=$restoreEmpty($elementName, "legendText", $legendText, %true()) +!$legendSprite=$restoreEmpty($elementName, "legendSprite", $legendSprite, %true()) $defineSkinparams($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape) !if ($sprite != "") %set_variable_value("$" + $elementName + "ElementTagSprite", $sprite) @@ -689,8 +830,7 @@ $defineSkinparams($elementName, $bgColor, $fontColor, $borderColor, $shadowing, !if ($techn != "") %set_variable_value("$" + $elementName + "ElementTagTechn", $techn) !endif - !$tagEntry = $tagLegendEntry($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) -%set_variable_value("$" + $elementName + "LegendEntry", $tagEntry) + !$dummyAlreadyVariables = $setTagLegendVariables($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite) ' default tags sets at least bgColor and fontColor !$tagMask = $tagLegendMask("CHANGED", "CHANGED", $borderColor, $shadowing, $shape, $sprite) %set_variable_value("$" + $elementName + "LegendMask", $tagMask) @@ -736,72 +876,57 @@ $elementSkin !global $REL_TECHN_MAX_CHAR_WIDTH = 35 !global $REL_DESCR_MAX_CHAR_WIDTH = 32 -!unquoted function $breakDescr($descr, $widthStr) +!unquoted function $breakText($text, $usedNewLine, $widthStr="-1") !$width = %intval($widthStr) !$multiLine = "" -!if (%strpos($descr, "\n") >= 0) +!if (%strpos($text, "\n") >= 0) + !while (%strpos($text, "\n") >= 0) + !$brPos = %strpos($text, "\n") + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine + !$text = %substr($text, $brPos+2) + !endwhile !else - !while (%strlen($descr) > $width) + !while ($width>0 && %strlen($text) > $width) !$brPos = $width - !while ($brPos > 0 && %substr($descr, $brPos, 1) != ' ') + !while ($brPos > 0 && %substr($text, $brPos, 1) != ' ') !$brPos = $brPos - 1 !endwhile !if ($brPos < 1) - !$brPos = %strpos($descr, " ") + !$brPos = %strpos($text, " ") !else !endif !if ($brPos > 0) - !$multiLine = $multiLine + %substr($descr, 0, $brPos) + "\n" - !$descr = %substr($descr, $brPos + 1) + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine + !$text = %substr($text, $brPos + 1) !else - !$multiLine = $multiLine+ $descr - !$descr = "" + !$multiLine = $multiLine+ $text + !$text = "" !endif !endwhile !endif -!if (%strlen($descr) > 0) - !$multiLine = $multiLine + $descr +!if (%strlen($text) > 0) + !$multiLine = $multiLine + $text !endif !return $multiLine !endfunction -' $breakTechn() supports //...//; $breakNode() in C4_Deployment supports no //....// -!unquoted function $breakTechn($techn, $widthStr) -!$width = %intval($widthStr) -!$multiLine = "" -!if (%strpos($techn, "\n") >= 0) - !while (%strpos($techn, "\n") >= 0) - !$brPos = %strpos($techn, "\n") - !$multiLine = $multiLine + %substr($techn, 0, $brPos) + '//\n//' - !$techn = %substr($techn, $brPos+2) - !endwhile -!else - !while (%strlen($techn) > $width) - !$brPos = $width - !while ($brPos > 0 && %substr($techn, $brPos, 1) != ' ') - !$brPos = $brPos - 1 - !endwhile +!unquoted function $breakLabel($text) +!$usedNewLine = "\n== " +!$multiLine = $breakText($text, $usedNewLine) +!return $multiLine +!endfunction - !if ($brPos < 1) - !$brPos = %strpos($techn, " ") - !else - !endif +!unquoted function $breakDescr($text, $widthStr) + !$usedNewLine = "\n" + !return $breakText($text, $usedNewLine, $widthStr) +!endfunction - !if ($brPos > 0) - !$multiLine = $multiLine + %substr($techn, 0, $brPos) + '//\n//' - !$techn = %substr($techn, $brPos + 1) - !else - !$multiLine = $multiLine+ $techn - !$techn = "" - !endif - !endwhile -!endif -!if (%strlen($techn) > 0) - !$multiLine = $multiLine + $techn -!endif -!return $multiLine +' $breakTechn() supports //...//; $breakNode() in C4_Deployment supports no //....// +!unquoted function $breakTechn($text, $widthStr) + !$usedNewLine = '//\n//' + !return $breakText($text, $usedNewLine, $widthStr) !endfunction ' Element properties @@ -870,22 +995,34 @@ SetPropertyHeader("Property","Value") ' Layout ' ################################## +!function $getLegendDetailsSize($detailsFormat) + !if $detailsFormat == $LEGEND_DETAILS_NONE + !$size = 0 + !elseif $detailsFormat == $LEGEND_DETAILS_SMALL + !$size = $LEGEND_DETAILS_SMALL_SIZE + !else + !$size = $LEGEND_DETAILS_NORMAL_SIZE + !endif + !return $size +!endfunction + !procedure $getHideStereotype($hideStereotype) !if ($hideStereotype == "true") hide stereotype !endif !endprocedure -!procedure $getLegendTable() +!procedure $getLegendTable($detailsFormat) +!global $LEGEND_DETAILS_SIZE = $getLegendDetailsSize($detailsFormat) <#00000000,#00000000>|**Legend** | $showActiveLegendEntries($tagDefaultLegend) $showActiveLegendEntries($tagCustomLegend) !endprocedure -!procedure $getLegendArea($areaAlias, $hideStereotype) +!procedure $getLegendArea($areaAlias, $hideStereotype, $details) $getHideStereotype($hideStereotype) rectangle $areaAlias<> [ -$getLegendTable() +$getLegendTable($details) ] !endprocedure @@ -893,11 +1030,58 @@ $getLegendTable() hide stereotype !endprocedure +!unquoted procedure SET_SKETCH_STYLE($bgColor="_dont_change_", $fontColor="_dont_change_", $warningColor="_dont_change_", $fontName="_dont_change_", $footerWarning="_dont_change_", $footerText="_dont_change_") +!if $bgColor != "_dont_change_" + !global $SKETCH_BG_COLOR = $bgColor +!endif +!if $fontColor != "_dont_change_" + !global $SKETCH_FONT_COLOR = $fontColor +!endif +!if $warningColor != "_dont_change_" + !global $SKETCH_WARNING_COLOR = $warningColor +!endif +!if $fontName != "_dont_change_" + !global $SKETCH_FONT_NAME = $fontName +!endif +!if $footerWarning != "_dont_change_" + !global $SKETCH_FOOTER_WARNING = $footerWarning +!endif +!if $footerText != "_dont_change_" + !global $SKETCH_FOOTER_TEXT = $footerText +!endif +!endprocedure + !procedure LAYOUT_AS_SKETCH() -skinparam backgroundColor #EEEBDC -skinparam handwritten true -skinparam defaultFontName "Comic Sans MS" -center footer Warning: Created for discussion, needs to be validated + skinparam handwritten true +!if $SKETCH_BG_COLOR > "" + skinparam backgroundColor $SKETCH_BG_COLOR +!endif +!if $SKETCH_FONT_COLOR > "" + skinparam footer { + FontColor $SKETCH_FONT_COLOR + } + !if $ARROW_COLOR == "#666666" + !global $ARROW_COLOR = $SKETCH_FONT_COLOR + skinparam arrow { + Color $ARROW_COLOR + FontColor $ARROW_COLOR + } + !endif + !if $BOUNDARY_COLOR == "#444444" + !global $BOUNDARY_COLOR = $SKETCH_FONT_COLOR + skinparam rectangle<> { + FontColor $BOUNDARY_COLOR + BorderColor $BOUNDARY_COLOR + } + !endif +!endif +!if $SKETCH_FONT_NAMES > "" + skinparam defaultFontName $SKETCH_FONT_NAME +!endif +!if $SKETCH_FOOTER_WARNING > "" || $SKETCH_FOOTER_TEXT > "" + !$line = "footer "+ $SKETCH_FOOTER_WARNING + " " + $SKETCH_FOOTER_TEXT + $line +!endif !endprocedure !global $fix_direction=%false() @@ -949,11 +1133,24 @@ left to right direction left to right direction !endprocedure +' legend details can displayed as Normal(), Small(), None() +!function None() +!return $LEGEND_DETAILS_NONE +!endfunction + +!function Normal() +!return $LEGEND_DETAILS_NORMAL +!endfunction + +!function Small() +!return $LEGEND_DETAILS_SMALL +!endfunction + ' has to be last call in diagram -!unquoted procedure SHOW_LEGEND($hideStereotype="true") +!unquoted procedure SHOW_LEGEND($hideStereotype="true", $details=Small()) $getHideStereotype($hideStereotype) legend right -$getLegendTable() +$getLegendTable($details) endlegend !endprocedure @@ -970,26 +1167,69 @@ SHOW_LEGEND($hideStereotype) !endfunction ' enables that legend can be located in drawing area of the diagram. It has to be last call in diagram followed by Lay_Distance() -!unquoted procedure SHOW_FLOATING_LEGEND($alias=LEGEND(), $hideStereotype="true") -$getLegendArea($alias, $hideStereotype) +!unquoted procedure SHOW_FLOATING_LEGEND($alias=LEGEND(), $hideStereotype="true", $details=Normal()) +$getLegendArea($alias, $hideStereotype, $details) !endprocedure ' Boundaries ' ################################## +!unquoted procedure UpdateBoundaryStyle($elementName="", $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $type="", $legendText="") + !if ($elementName != "") + !$elementBoundary = $elementName + '_boundary' + UpdateElementStyle($elementBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, "", $type, $legendText, "") + !else + UpdateElementStyle("boundary", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "", $type, $legendText, "") + ' simulate color inheritance + UpdateBoundaryStyle("enterprise", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "Enterprise", "") + UpdateBoundaryStyle("system", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "System", "") + UpdateBoundaryStyle("container", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "Container", "") + !endif +!endprocedure + +!unquoted procedure AddBoundaryTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $type="", $legendText="") + !$tagBoundary = $tagStereo + '_boundary' + AddElementTag($tagBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, "", $type, $legendText, "") +!endprocedure + +' add _boundary to all tags that short tag version can be used +!unquoted function $addBoundaryPostfix($tags) + !if (%strlen($tags) == 0) + !return '' + !endif + !$boundaryTags = '' + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$boundaryTags = $boundaryTags + $tag + '_boundary+' + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$boundaryTags = $boundaryTags + $tags + '_boundary' + !endif + !return $boundaryTags +!endfunction + !function $getBoundary($label, $type) !if ($type == "") - !return '==' + $label + !return '== ' + $breakLabel($label) !endif !if (type != "") - !return '==' + $label + '\n[' + $type + ']' + !return '== ' + $breakLabel($label) + '\n[' + $type + ']' !endif !endfunction !unquoted procedure Boundary($alias, $label, $type="", $tags="", $link="") -rectangle "$getBoundary($label, $type)" $toStereos("boundary", $tags) as $alias $getLink($link) +!$boundaryTags = $addBoundaryPostfix($tags) +' nodes $type reuses $techn definition of $boundaryTags +!$type=$toElementArg($type, $boundaryTags, "ElementTagTechn", "boundary") +rectangle "$getBoundary($label, $type)" $toStereos("boundary", $boundaryTags) as $alias $getLink($link) !endprocedure +' Boundary Styling +UpdateBoundaryStyle("", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR) + ' Relationship ' ################################## @@ -1005,9 +1245,11 @@ rectangle "$getBoundary($label, $type)" $toStereos("boundary", $tags) as $alias !$rel = $rel + $getSprite($sprite) + ' ' !endif !if ($link != "") - !$rel = $rel + '**[[' + $link + ' ' + $label + ']]**' + !$usedNewLine = ']]**\n**[[' + $link + ' ' + !$rel = $rel + '**[[' + $link + ' ' + $breakText($label, $usedNewLine) + ']]**' !else - !$rel = $rel + '**' + $label + '**' + !$usedNewLine = '**\n**' + !$rel = $rel + '**' + $breakText($label, $usedNewLine) + '**' !endif !if ($techn != "") ' line break is not deterministic, calculate it @@ -1017,14 +1259,19 @@ rectangle "$getBoundary($label, $type)" $toStereos("boundary", $tags) as $alias ' line break is not deterministic, calculate it !$rel = $rel + '\n\n' + $breakDescr($descr, $REL_DESCR_MAX_CHAR_WIDTH) !endif + !$prop = $getProps() + !if ($prop != "") + ' reuse table + !$rel = $rel + $prop + !endif !return $rel !endfunction !unquoted procedure Rel_($alias1, $alias2, $label, $direction) -$alias1 $direction $alias2 : **$label** +$getRel($direction, $alias1, $alias2, $label, "", "", "", "", "") !endprocedure !unquoted procedure Rel_($alias1, $alias2, $label, $techn, $direction) -$alias1 $direction $alias2 : **$label**\n//[$techn]// +$getRel($direction, $alias1, $alias2, $label, $techn, "", "", "", "") !endprocedure !unquoted procedure Rel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") @@ -1117,19 +1364,34 @@ $getRel($right("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, !unquoted procedure Lay_D($from, $to) $from -[hidden]D- $to !endprocedure +!unquoted procedure Lay_Down($from, $to) +$from -[hidden]D- $to +!endprocedure + !unquoted procedure Lay_U($from, $to) $from -[hidden]U- $to !endprocedure +!unquoted procedure Lay_Up($from, $to) +$from -[hidden]U- $to +!endprocedure + !unquoted procedure Lay_R($from, $to) $from -[hidden]R- $to !endprocedure +!unquoted procedure Lay_Right($from, $to) +$from -[hidden]R- $to +!endprocedure + !unquoted procedure Lay_L($from, $to) $from -[hidden]L- $to !endprocedure +!unquoted procedure Lay_Left($from, $to) +$from -[hidden]L- $to +!endprocedure ' PlantUML bug: lines which does "not match" with the orientation/direction of the diagram ' uses the same length therefore the method offers no direction at all. ' If a direction is required the Lay_...() methods can be used !unquoted procedure Lay_Distance($from, $to, $distance="0") $from $getHiddenLine($distance) $to -!endprocedure +!endprocedure \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Component.puml b/src/C4Sharp/Resources/C4_Component.puml index d755084..8a83386 100644 --- a/src/C4Sharp/Resources/C4_Component.puml +++ b/src/C4Sharp/Resources/C4_Component.puml @@ -1,6 +1,6 @@ -' convert it with additional command line argument -DRELATIVE_INCLUDE="." to use locally +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally !if %variable_exists("RELATIVE_INCLUDE") - !include %get_variable_value("RELATIVE_INCLUDE")/C4_Container.puml + !include ./C4_Container.puml !else !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml !endif @@ -27,17 +27,17 @@ UpdateElementStyle("component", $COMPONENT_BG_COLOR, $COMPONENT_FONT_COLOR, $COM UpdateElementStyle("external_component", $EXTERNAL_COMPONENT_BG_COLOR, $COMPONENT_FONT_COLOR, $EXTERNAL_COMPONENT_BORDER_COLOR) ' shortcuts with default colors -!unquoted procedure AddComponentTag($tagStereo, $bgColor=$COMPONENT_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$COMPONENT_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!unquoted procedure AddComponentTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + $addElementTagInclReuse("component", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) !endprocedure -!unquoted procedure AddExternalComponentTag($tagStereo, $bgColor=$EXTERNAL_COMPONENT_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$EXTERNAL_COMPONENT_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!unquoted procedure AddExternalComponentTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + $addElementTagInclReuse("external_component", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) !endprocedure ' Layout ' ################################## -SetDefaultLegendEntries("person\nsystem\ncontainer\ncomponent\nexternal_person\nexternal_system\nexternal_container\nexternal_component") +SetDefaultLegendEntries("person\nsystem\ncontainer\ncomponent\nexternal_person\nexternal_system\nexternal_container\nexternal_component\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") !procedure LAYOUT_WITH_LEGEND() hide stereotype @@ -58,18 +58,18 @@ endlegend ' ################################## !function $getComponent($label, $techn, $descr, $sprite) -!if ($descr == "") && ($sprite == "") -!return '=='+$label+'\n//['+$techn+']//' -!endif -!if ($descr == "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label+'\n//['+$techn+']//' -!endif -!if ($descr != "") && ($sprite == "") -!return '=='+$label+'\n//['+$techn+']//\n\n '+$descr -!endif -!if ($descr != "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label+'\n//['+$techn+']//\n\n '+$descr -!endif + !$component = "" + !if ($sprite != "") + !$component = $component + $getSprite($sprite) + '\n' + !endif + !$component = $component + '== ' + $breakLabel($label) + !if ($techn != "") + !$component = $component + '\n//[' + $breakTechn($techn, '-1') + ']//' + !endif + !if ($descr != "") + !$component = $component + '\n\n' + $descr + !endif + !return $component !endfunction !unquoted procedure Component($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") @@ -106,4 +106,4 @@ database "$getComponent($label, $techn, $descr, $sprite)$getProps()" $toStereos( !$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "external_component") !$techn=$toElementArg($techn, $tags, "ElementTagTechn", "external_component") queue "$getComponent($label, $techn, $descr, $sprite)$getProps()" $toStereos("external_component",$tags) as $alias $getLink($link) -!endprocedure +!endprocedure \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Container.puml b/src/C4Sharp/Resources/C4_Container.puml index b020232..6a9543f 100644 --- a/src/C4Sharp/Resources/C4_Container.puml +++ b/src/C4Sharp/Resources/C4_Container.puml @@ -1,6 +1,6 @@ -' convert it with additional command line argument -DRELATIVE_INCLUDE="." to use locally +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally !if %variable_exists("RELATIVE_INCLUDE") - !include %get_variable_value("RELATIVE_INCLUDE")/C4_Context.puml + !include ./C4_Context.puml !else !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml !endif @@ -23,18 +23,24 @@ UpdateElementStyle("container", $CONTAINER_BG_COLOR, $ELEMENT_FONT_COLOR, $CONTAINER_BORDER_COLOR) UpdateElementStyle("external_container", $EXTERNAL_CONTAINER_BG_COLOR, $ELEMENT_FONT_COLOR, $EXTERNAL_CONTAINER_BORDER_COLOR) +UpdateBoundaryStyle("container", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $type="Container") + ' shortcuts with default colors -!unquoted procedure AddContainerTag($tagStereo, $bgColor=$CONTAINER_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$CONTAINER_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!unquoted procedure AddContainerTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + $addElementTagInclReuse("container", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!endprocedure +!unquoted procedure AddExternalContainerTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + $addElementTagInclReuse("external_container", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) !endprocedure -!unquoted procedure AddExternalContainerTag($tagStereo, $bgColor=$EXTERNAL_CONTAINER_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$EXTERNAL_CONTAINER_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) + +!unquoted procedure UpdateContainerBoundaryStyle($bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $shadowing="", $shape="", $type="Container", $legendText="") + UpdateBoundaryStyle("container", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText) !endprocedure ' Layout ' ################################## -SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container") +SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") !procedure LAYOUT_WITH_LEGEND() hide stereotype @@ -53,18 +59,18 @@ endlegend ' ################################## !function $getContainer($label, $techn, $descr, $sprite) -!if ($descr == "") && ($sprite == "") -!return '=='+$label+'\n//['+$techn+']//' -!endif -!if ($descr == "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label+'\n//['+$techn+']//' -!endif -!if ($descr != "") && ($sprite == "") -!return '=='+$label+'\n//['+$techn+']//\n\n '+$descr -!endif -!if ($descr != "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label+'\n//['+$techn+']//\n\n '+$descr -!endif + !$container = "" + !if ($sprite != "") + !$container = $container + $getSprite($sprite) + '\n' + !endif + !$container = $container + '== ' + $breakLabel($label) + !if ($techn != "") + !$container = $container + '\n//[' + $breakTechn($techn, '-1') + ']//' + !endif + !if ($descr != "") + !$container = $container + '\n\n' + $descr + !endif + !return $container !endfunction !unquoted procedure Container($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") @@ -107,5 +113,11 @@ queue "$getContainer($label, $techn, $descr, $sprite)$getProps()" $toStereos("ex ' ################################## !unquoted procedure Container_Boundary($alias, $label, $tags="", $link="") -Boundary($alias, $label, "Container", $tags, $link) -!endprocedure + !if ($tags != "") + !$allTags = $tags + '+container' + !else + !$allTags = 'container' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link) +!endprocedure \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Context.puml b/src/C4Sharp/Resources/C4_Context.puml index ff23a66..ff7de8d 100644 --- a/src/C4Sharp/Resources/C4_Context.puml +++ b/src/C4Sharp/Resources/C4_Context.puml @@ -1,6 +1,6 @@ -' convert it with additional command line argument -DRELATIVE_INCLUDE="." to use locally +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally !if %variable_exists("RELATIVE_INCLUDE") - !include %get_variable_value("RELATIVE_INCLUDE")/C4.puml + !include ./C4.puml !else !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4.puml !endif @@ -30,18 +30,28 @@ UpdateElementStyle("external_person", $EXTERNAL_PERSON_BG_COLOR, $ELEMENT_FONT_C UpdateElementStyle("system", $SYSTEM_BG_COLOR, $ELEMENT_FONT_COLOR, $SYSTEM_BORDER_COLOR) UpdateElementStyle("external_system", $EXTERNAL_SYSTEM_BG_COLOR, $ELEMENT_FONT_COLOR, $EXTERNAL_SYSTEM_BORDER_COLOR) +UpdateBoundaryStyle("enterprise", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $type="Enterprise") +UpdateBoundaryStyle("system", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $type="System") + ' shortcuts with default colors -!unquoted procedure AddPersonTag($tagStereo, $bgColor=$PERSON_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$PERSON_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) +!unquoted procedure AddPersonTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") + $addElementTagInclReuse("person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) !endprocedure -!unquoted procedure AddExternalPersonTag($tagStereo, $bgColor=$EXTERNAL_PERSON_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$EXTERNAL_PERSON_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) +!unquoted procedure AddExternalPersonTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") + $addElementTagInclReuse("external_person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) !endprocedure -!unquoted procedure AddSystemTag($tagStereo, $bgColor=$SYSTEM_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$SYSTEM_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) +!unquoted procedure AddSystemTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") + $addElementTagInclReuse("system", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) !endprocedure -!unquoted procedure AddExternalSystemTag($tagStereo, $bgColor=$EXTERNAL_SYSTEM_BG_COLOR, $fontColor=$ELEMENT_FONT_COLOR, $borderColor=$EXTERNAL_SYSTEM_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) +!unquoted procedure AddExternalSystemTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="") + $addElementTagInclReuse("external_system", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, "", $legendText, $legendSprite) +!endprocedure + +!unquoted procedure UpdateEnterpriseBoundaryStyle($bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $shadowing="", $shape="", $type="Enterprise", $legendText="") + UpdateBoundaryStyle("enterprise", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText) +!endprocedure +!unquoted procedure UpdateSystemBoundaryStyle($bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $shadowing="", $shape="", $type="System", $legendText="") + UpdateBoundaryStyle("system", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText) !endprocedure ' Sprites @@ -149,10 +159,112 @@ sprite $person2 [48x48/16] { 000000000002578888888888888888888864100000000000 } +sprite $robot [48x48/16] { +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000005BFFFFFFFFFFFFFFFFFFFFFE9100000000000 +0000000000AFFFFFFFFFFFFFFFFFFFFFFFFFE30000000000 +0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFE1000000000 +000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000000000 +000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000699405FFFFFFC427FFFFFFFFFC427FFFFFFE009982000 +008FFF705FFFFFE10006FFFFFFFE00007FFFFFE00FFFF100 +00CFFF705FFFFFA00001FFFFFFF900002FFFFFE00FFFF500 +00DFFF705FFFFFB00002FFFFFFFA00003FFFFFE00FFFF500 +00DFFF705FFFFFF4000AFFFFFFFF3000BFFFFFE00FFFF500 +00DFFF705FFFFFFFA8DFFFFFFFFFFA8DFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00CFFF705FFFFFF87777777777777777CFFFFFE00FFFF500 +008FFF705FFFFFF100000000000000009FFFFFE00FFFF100 +000699405FFFFFF76666666666666666CFFFFFE009982000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000 +000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFF7000000000 +0000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFD0000000000 +00000000004CFFFFFFFFFFFFFFFFFFFFFFFF910000000000 +000000000000011111111111111111111110000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +} + +sprite $robot2 [48x48/16] { +000000000000000088888888888888880000000000000000 +000000000000000AFFFFFFFFFFFFFFFFA000000000000000 +00000000000000CFFFFFFFFFFFFFFFFFFC00000000000000 +00000000000004EFFFFFFFFFFFFFFFFFFE40000000000000 +0000000000000AFFFFFFFFFFFFFFFFFFFFA0000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000004CFFFFFFFFFFFFFFFFFFC40000000000000 +000000488888848CFFFFFFFFFFFFFFFFC848888884000000 +00000CFFFFFFFFC888888888888888888CFFFFFFFFC00000 +00008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000 +0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0000CFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFC0000 +00008FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF80000 +00000CFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFC00000 +000000488887578888888888888888888864688884000000 +000000000000000000000000000000000000000000000000 +} + ' Layout ' ################################## -SetDefaultLegendEntries("person\nsystem\nexternal_person\nexternal_system") +SetDefaultLegendEntries("person\nsystem\nexternal_person\nexternal_system\nenterprise_boundary\nsystem_boundary\nboundary") !procedure LAYOUT_WITH_LEGEND() hide stereotype @@ -166,11 +278,29 @@ endlegend !endprocedure !global $defaultPersonSprite = "person" +!$dummy = $restoreEmpty("person", "sprite", $defaultPersonSprite, %true()) +UpdateElementStyle("person") +' workaround of plantuml.jar bug - person overwrites external_person setting +!$dummy = $restoreEmpty("external_person", "sprite", $defaultPersonSprite, %true()) +UpdateElementStyle("external_person") !global $portraitPerson = "false" +!procedure $clearPersonRestore() + !$dummy = $clearRestore("person", "sprite") + !$dummy = $clearRestore("person", "legendSprite") + %set_variable_value("$" + "person" + "ElementTagSprite", "") + UpdateElementStyle("person") + ' workaround of plantuml.jar bug - person overwrites external_person setting + !$dummy = $clearRestore("external_person", "sprite") + !$dummy = $clearRestore("external_person", "legendSprite") + %set_variable_value("$" + "external_person" + "ElementTagSprite", "") + UpdateElementStyle("external_person") +!endprocedure + !procedure HIDE_PERSON_SPRITE() !$defaultPersonSprite = "" !$portraitPerson = "false" + $clearPersonRestore() !endprocedure !unquoted procedure SHOW_PERSON_SPRITE($sprite="") @@ -179,17 +309,24 @@ endlegend !else !$defaultPersonSprite = $sprite !endif + !$dummy = $restoreEmpty("person", "sprite", $defaultPersonSprite, %true()) + UpdateElementStyle("person") + ' workaround of plantuml.jar bug - person overwrites external_person setting + !$dummy = $restoreEmpty("external_person", "sprite", $defaultPersonSprite, %true()) + UpdateElementStyle("external_person") !$portraitPerson = "false" !endprocedure !unquoted procedure SHOW_PERSON_PORTRAIT() !$defaultPersonSprite = "" !$portraitPerson = "portrait" + $clearPersonRestore() !endprocedure !unquoted procedure SHOW_PERSON_OUTLINE() !$defaultPersonSprite = "" !$portraitPerson = "outline" + $clearPersonRestore() !endprocedure ' Elements @@ -200,31 +337,31 @@ endlegend !$sprite = $defaultPersonSprite !endif !if ($descr == "") && ($sprite == "") - !return '=='+$label + !return '== '+$breakLabel($label) !endif !if ($descr == "") && ($sprite != "") - !return $getSprite($sprite)+'\n=='+$label + !return $getSprite($sprite)+'\n== '+$breakLabel($label) !endif !if ($descr != "") && ($sprite == "") - !return '=='+$label+'\n\n '+$descr + !return '== '+$breakLabel($label)+'\n\n '+$descr !endif !if ($descr != "") && ($sprite != "") - !return $getSprite($sprite)+'\n=='+$label+'\n\n '+$descr + !return $getSprite($sprite)+'\n== '+$breakLabel($label)+'\n\n '+$descr !endif !endfunction !function $getSystem($label, $descr, $sprite) !if ($descr == "") && ($sprite == "") -!return '=='+$label +!return '== '+$breakLabel($label) !endif !if ($descr == "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label +!return $getSprite($sprite)+'\n== '+$breakLabel($label) !endif !if ($descr != "") && ($sprite == "") -!return '=='+$label+'\n\n '+$descr +!return '== '+$breakLabel($label)+'\n\n '+$descr !endif !if ($descr != "") && ($sprite != "") -!return $getSprite($sprite)+'\n=='+$label+'\n\n '+$descr +!return $getSprite($sprite)+'\n== '+$breakLabel($label)+'\n\n '+$descr !endif !endfunction @@ -284,9 +421,21 @@ queue "$getSystem($label, $descr, $sprite)$getProps()" $toStereos("external_syst ' ################################## !unquoted procedure Enterprise_Boundary($alias, $label, $tags="", $link="") -Boundary($alias, $label, "Enterprise", $tags, $link) + !if ($tags != "") + !$allTags = $tags + '+enterprise' + !else + !$allTags = 'enterprise' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link) !endprocedure !unquoted procedure System_Boundary($alias, $label, $tags="", $link="") -Boundary($alias, $label, "System", $tags, $link) -!endprocedure + !if ($tags != "") + !$allTags = $tags + '+system' + !else + !$allTags = 'system' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link) +!endprocedure \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Deployment.puml b/src/C4Sharp/Resources/C4_Deployment.puml index 0f225f2..eda6ee7 100644 --- a/src/C4Sharp/Resources/C4_Deployment.puml +++ b/src/C4Sharp/Resources/C4_Deployment.puml @@ -1,6 +1,6 @@ -' convert it with additional command line argument -DRELATIVE_INCLUDE="." to use locally +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally !if %variable_exists("RELATIVE_INCLUDE") - !include %get_variable_value("RELATIVE_INCLUDE")/C4_Container.puml + !include ./C4_Container.puml !else !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml !endif @@ -22,15 +22,15 @@ skinparam rectangle<> { ' shortcuts with default colors ' node specific: $type reuses $techn definition of $tags -!unquoted procedure AddNodeTag($tagStereo, $bgColor=$NODE_BG_COLOR, $fontColor=$NODE_FONT_COLOR, $borderColor=$NODE_BORDER_COLOR, $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") - AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) +!unquoted procedure AddNodeTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="") + $addElementTagInclReuse("node", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite) !endprocedure ' Layout ' ################################## ' comment if node should not be added to legend. No calculated legend extension required -SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container\nnode") +SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container\nnode\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") ' Line breaks ' ################################## @@ -42,40 +42,10 @@ SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_sy !global $NODE_TYPE_MAX_CHAR_WIDTH = 35 !global $NODE_DESCR_MAX_CHAR_WIDTH = 32 -!unquoted function $breakNode($type, $widthStr) -!$width = %intval($widthStr) -!$multiLine = "" -!if (%strpos($type, "\n") >= 0) - !while (%strpos($type, "\n") >= 0) - !$brPos = %strpos($type, "\n") - !$multiLine = $multiLine + %substr($type, 0, $brPos) + '\n' - !$type = %substr($type, $brPos+2) - !endwhile -!else - !while (%strlen($type) > $width) - !$brPos = $width - !while ($brPos > 0 && %substr($type, $brPos, 1) != ' ') - !$brPos = $brPos - 1 - !endwhile - - !if ($brPos < 1) - !$brPos = %strpos($type, " ") - !else - !endif - - !if ($brPos > 0) - !$multiLine = $multiLine + %substr($type, 0, $brPos) + '\n' - !$type = %substr($type, $brPos + 1) - !else - !$multiLine = $multiLine+ $type - !$type = "" - !endif - !endwhile -!endif -!if (%strlen($type) > 0) - !$multiLine = $multiLine + $type -!endif -!return $multiLine +' $breakTechn() in C4 supports //...//; $breakNode() in C4_Deployment supports no //....// +!unquoted function $breakNode($text, $widthStr) + !$usedNewLine = '\n' + !return $breakText($text, $usedNewLine, $widthStr) !endfunction ' Elements @@ -86,7 +56,7 @@ SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_sy !if ($sprite != "") !$nodeText = $nodeText + $getSprite($sprite) + '\n' !endif - !$nodeText = $nodeText + '==' + $label + !$nodeText = $nodeText + '== ' + $breakText($label, "\n== ") !if ($type != "") !$nodeText = $nodeText + '\n[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' !endif @@ -101,7 +71,7 @@ SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_sy !if ($sprite != "") !$nodeText = $nodeText + $getSprite($sprite) + '\l' !endif - !$nodeText = $nodeText + '==' + $label + !$nodeText = $nodeText + '== ' + $breakText($label, "\l== ") !if ($type != "") !$nodeText = $nodeText + '\l[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' !endif @@ -116,7 +86,7 @@ SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_sy !if ($sprite != "") !$nodeText = $nodeText + $getSprite($sprite) + '\r' !endif - !$nodeText = $nodeText + '==' + $label + !$nodeText = $nodeText + '== ' + $breakText($label, "\r== ") !if ($type != "") !$nodeText = $nodeText + '\r[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' !endif @@ -166,4 +136,4 @@ rectangle "$getNode_L($label, $type, $descr, $sprite)$getProps_L()" $toStereos(" ' nodes $type reuses $techn definition of $tags !$type=$toElementArg($type, $tags, "ElementTagTechn", "node") rectangle "$getNode_R($label, $type, $descr, $sprite)$getProps_R()" $toStereos("node",$tags) as $alias $getLink($link) -!endprocedure +!endprocedure \ No newline at end of file diff --git a/src/C4Sharp/Resources/C4_Dynamic.puml b/src/C4Sharp/Resources/C4_Dynamic.puml index e8f506a..e4a4108 100644 --- a/src/C4Sharp/Resources/C4_Dynamic.puml +++ b/src/C4Sharp/Resources/C4_Dynamic.puml @@ -1,6 +1,6 @@ -' convert it with additional command line argument -DRELATIVE_INCLUDE="." to use locally +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally !if %variable_exists("RELATIVE_INCLUDE") - !include %get_variable_value("RELATIVE_INCLUDE")/C4_Component.puml + !include ./C4_Component.puml !else !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml !endif @@ -59,10 +59,10 @@ ' ################################## !unquoted procedure Rel_($e_index, $alias1, $alias2, $label, $direction) -$alias1 $direction $alias2 : **$e_index: $label** +$getRel($direction, $alias1, $alias2, $e_index + ": " + $label, "", "", "", "", "") !endprocedure !unquoted procedure Rel_($e_index, $alias1, $alias2, $label, $techn, $direction) -$alias1 $direction $alias2 : **$e_index: $label**\n//[$techn]// +$getRel($direction, $alias1, $alias2, $e_index + ": " + $label, $techn, "", "", "", "") !endprocedure !unquoted procedure Rel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") @@ -143,4 +143,4 @@ $getRel($right("-","->>"), $from, $to, $e_index + ": " + $label, $techn, $descr, !endprocedure !unquoted procedure RelIndex_Right($e_index, $from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") $getRel($right("-","->>"), $from, $to, $e_index + ": " + $label, $techn, $descr, $sprite, $tags, $link) -!endprocedure +!endprocedure \ No newline at end of file From 7b693e884246fb41496880ec19067c014c6e1d85 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 22:59:37 -0300 Subject: [PATCH 06/12] Remodeling Library Structure - Unnecessary diagram classes were removed - Namespaces were adjusted - Model folder was renamed to Elements - Html Builder code was removed - New Container Microservice - PlantumlSession.cs was removed --- .../{ => Commons}/Extensions/StringMethods.cs | 2 +- .../Commons/Extensions/TypeNameMethods.cs | 11 + .../FileSystem/C4FileException.cs | 11 +- .../FileSystem/C4SharpDirectory.cs | 2 +- .../ResourceFile.cs} | 12 +- .../TabIndentation.cs} | 12 +- src/C4Sharp/Diagrams/Core/ComponentDiagram.cs | 8 - src/C4Sharp/Diagrams/Core/ContainerDiagram.cs | 10 - src/C4Sharp/Diagrams/Core/ContextDiagram.cs | 9 - src/C4Sharp/Diagrams/Diagram.cs | 28 +- src/C4Sharp/Diagrams/DiagramBuildRunner.cs | 46 +--- src/C4Sharp/Diagrams/DiagramConstants.cs | 12 - .../Diagrams/DiagramNamingConvention.cs | 4 +- src/C4Sharp/Diagrams/DiagramRef.cs | 14 - .../{ => Interfaces}/IDiagramBuildRunner.cs | 2 +- .../{ => Interfaces}/IDiagramStyle.cs | 2 +- .../{ => Interfaces}/IElementStyle.cs | 2 +- .../Diagrams/{ => Interfaces}/IElementTag.cs | 2 +- .../{ => Interfaces}/IRelationshipTag.cs | 2 +- .../Plantuml/Constants/ElementName.cs | 0 .../Plantuml/Constants/LineStyle.cs | 0 .../Plantuml/Constants/Shape.cs | 0 .../Plantuml}/PlantumlContext.cs | 68 +---- .../Plantuml}/PlantumlDiagram.cs | 3 +- .../Plantuml}/PlantumlException.cs | 0 .../Plantuml}/PlantumlRelationship.cs | 2 +- .../Plantuml}/PlantumlResources.cs | 0 .../Plantuml}/PlantumlStructure.cs | 11 +- .../Plantuml/Style}/ElementStyle.cs | 1 + .../Plantuml/Style}/ElementTag.cs | 1 + .../Plantuml/Style}/RelationshipTag.cs | 1 + .../Supplementary/DeploymentDiagram.cs | 12 - .../{ => Boundaries}/ContainerBoundary.cs | 3 +- .../{ => Boundaries}/EnterpriseBoundary.cs | 2 +- .../Elements/{ => Boundaries}/IBoundary.cs | 2 +- .../SoftwareSystemBoundary.cs | 7 +- src/C4Sharp/Elements/Container.cs | 17 +- src/C4Sharp/Elements/ContainerType.cs | 3 + .../Elements/Containers/Microservice.cs | 10 + src/C4Sharp/Elements/DeploymentNode.cs | 2 +- .../Elements/Relationships/Relationship.cs | 4 +- src/C4Sharp/Elements/Structure.cs | 9 +- src/C4Sharp/Elements/StructureCollection.cs | 2 + src/C4Sharp/Extensions/TypeNameMethods.cs | 26 -- .../Models/Plantuml/IO/PlantumlSession.cs | 256 ------------------ 45 files changed, 123 insertions(+), 510 deletions(-) rename src/C4Sharp/{ => Commons}/Extensions/StringMethods.cs (98%) create mode 100644 src/C4Sharp/Commons/Extensions/TypeNameMethods.cs rename src/C4Sharp/{ => Commons}/FileSystem/C4FileException.cs (66%) rename src/C4Sharp/{ => Commons}/FileSystem/C4SharpDirectory.cs (87%) rename src/C4Sharp/{Extensions/ResourceMethods.cs => Commons/ResourceFile.cs} (82%) rename src/C4Sharp/{Extensions/SpaceMethods.cs => Commons/TabIndentation.cs} (70%) delete mode 100644 src/C4Sharp/Diagrams/Core/ComponentDiagram.cs delete mode 100644 src/C4Sharp/Diagrams/Core/ContainerDiagram.cs delete mode 100644 src/C4Sharp/Diagrams/Core/ContextDiagram.cs delete mode 100644 src/C4Sharp/Diagrams/DiagramRef.cs rename src/C4Sharp/Diagrams/{ => Interfaces}/IDiagramBuildRunner.cs (61%) rename src/C4Sharp/Diagrams/{ => Interfaces}/IDiagramStyle.cs (69%) rename src/C4Sharp/Diagrams/{ => Interfaces}/IElementStyle.cs (57%) rename src/C4Sharp/Diagrams/{ => Interfaces}/IElementTag.cs (56%) rename src/C4Sharp/Diagrams/{ => Interfaces}/IRelationshipTag.cs (58%) rename src/C4Sharp/{Elements => Diagrams}/Plantuml/Constants/ElementName.cs (100%) rename src/C4Sharp/{Elements => Diagrams}/Plantuml/Constants/LineStyle.cs (100%) rename src/C4Sharp/{Elements => Diagrams}/Plantuml/Constants/Shape.cs (100%) rename src/C4Sharp/{Elements/Plantuml/IO => Diagrams/Plantuml}/PlantumlContext.cs (78%) rename src/C4Sharp/{Elements/Plantuml/Extensions => Diagrams/Plantuml}/PlantumlDiagram.cs (98%) rename src/C4Sharp/{Elements/Plantuml/IO => Diagrams/Plantuml}/PlantumlException.cs (100%) rename src/C4Sharp/{Elements/Plantuml/Extensions => Diagrams/Plantuml}/PlantumlRelationship.cs (96%) rename src/C4Sharp/{Elements/Plantuml/IO => Diagrams/Plantuml}/PlantumlResources.cs (100%) rename src/C4Sharp/{Elements/Plantuml/Extensions => Diagrams/Plantuml}/PlantumlStructure.cs (93%) rename src/C4Sharp/{Elements/Plantuml => Diagrams/Plantuml/Style}/ElementStyle.cs (97%) rename src/C4Sharp/{Elements/Plantuml => Diagrams/Plantuml/Style}/ElementTag.cs (97%) rename src/C4Sharp/{Elements/Plantuml => Diagrams/Plantuml/Style}/RelationshipTag.cs (97%) delete mode 100644 src/C4Sharp/Diagrams/Supplementary/DeploymentDiagram.cs rename src/C4Sharp/Elements/{ => Boundaries}/ContainerBoundary.cs (96%) rename src/C4Sharp/Elements/{ => Boundaries}/EnterpriseBoundary.cs (83%) rename src/C4Sharp/Elements/{ => Boundaries}/IBoundary.cs (64%) rename src/C4Sharp/Elements/{ => Boundaries}/SoftwareSystemBoundary.cs (56%) create mode 100644 src/C4Sharp/Elements/Containers/Microservice.cs delete mode 100644 src/C4Sharp/Extensions/TypeNameMethods.cs delete mode 100644 src/C4Sharp/Models/Plantuml/IO/PlantumlSession.cs diff --git a/src/C4Sharp/Extensions/StringMethods.cs b/src/C4Sharp/Commons/Extensions/StringMethods.cs similarity index 98% rename from src/C4Sharp/Extensions/StringMethods.cs rename to src/C4Sharp/Commons/Extensions/StringMethods.cs index 92b556d..2f6433a 100644 --- a/src/C4Sharp/Extensions/StringMethods.cs +++ b/src/C4Sharp/Commons/Extensions/StringMethods.cs @@ -3,7 +3,7 @@ using System.Text; using System.Text.RegularExpressions; -namespace C4Sharp.Extensions; +namespace C4Sharp.Commons.Extensions; ///

      /// String methods diff --git a/src/C4Sharp/Commons/Extensions/TypeNameMethods.cs b/src/C4Sharp/Commons/Extensions/TypeNameMethods.cs new file mode 100644 index 0000000..4c14f3f --- /dev/null +++ b/src/C4Sharp/Commons/Extensions/TypeNameMethods.cs @@ -0,0 +1,11 @@ +namespace C4Sharp.Commons.Extensions; + +public static class TypeNameMethods +{ + internal static string ToNamingConvention(this Type type) + { + return type.IsInterface && type.Name.StartsWith("I") + ? type.Name.SplitCapitalizedWords().Remove(0, 1) + : type.Name.SplitCapitalizedWords(); + } +} \ No newline at end of file diff --git a/src/C4Sharp/FileSystem/C4FileException.cs b/src/C4Sharp/Commons/FileSystem/C4FileException.cs similarity index 66% rename from src/C4Sharp/FileSystem/C4FileException.cs rename to src/C4Sharp/Commons/FileSystem/C4FileException.cs index 4bb96ec..64e1259 100644 --- a/src/C4Sharp/FileSystem/C4FileException.cs +++ b/src/C4Sharp/Commons/FileSystem/C4FileException.cs @@ -1,10 +1,12 @@ using System.Diagnostics.CodeAnalysis; +using System.Runtime.Serialization; namespace C4Sharp.FileSystem; /// /// C4File Exception /// +[Serializable] [ExcludeFromCodeCoverage] public class C4FileException : Exception { @@ -14,7 +16,6 @@ public class C4FileException : Exception /// public C4FileException(string message) : base(message) { - } /// @@ -24,6 +25,14 @@ public C4FileException(string message) : base(message) /// public C4FileException(string message, Exception innerException) : base(message, innerException) { + } + /// + /// Constructor + /// + /// + /// + public C4FileException([NotNull] SerializationInfo info, StreamingContext context) : base(info, context) + { } } diff --git a/src/C4Sharp/FileSystem/C4SharpDirectory.cs b/src/C4Sharp/Commons/FileSystem/C4SharpDirectory.cs similarity index 87% rename from src/C4Sharp/FileSystem/C4SharpDirectory.cs rename to src/C4Sharp/Commons/FileSystem/C4SharpDirectory.cs index cb1a3e3..aa376ac 100644 --- a/src/C4Sharp/FileSystem/C4SharpDirectory.cs +++ b/src/C4Sharp/Commons/FileSystem/C4SharpDirectory.cs @@ -1,7 +1,7 @@ namespace C4Sharp.FileSystem; /// -/// Manipulate the C4 folder and their resoucers +/// Manipulate the C4 folder and their resourcers /// internal static class C4SharpDirectory { diff --git a/src/C4Sharp/Extensions/ResourceMethods.cs b/src/C4Sharp/Commons/ResourceFile.cs similarity index 82% rename from src/C4Sharp/Extensions/ResourceMethods.cs rename to src/C4Sharp/Commons/ResourceFile.cs index f350475..ab2ba59 100644 --- a/src/C4Sharp/Extensions/ResourceMethods.cs +++ b/src/C4Sharp/Commons/ResourceFile.cs @@ -1,14 +1,14 @@ -using C4Sharp.Models.Plantuml.IO; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using C4Sharp.Elements.Plantuml.IO; -namespace C4Sharp.Extensions; +namespace C4Sharp.Commons; /// /// Methods to manipulate resource /// [ExcludeFromCodeCoverage] -internal static class ResourceMethods +internal static class ResourceFile { /// /// Get resource string content from resource file @@ -16,11 +16,11 @@ internal static class ResourceMethods /// file name /// resource content /// - public static string GetResourceContent(string name) + public static string ReadString(string name) { try { - using var stream = GetResourceStream(name); + using var stream = ReadStream(name); using var reader = new StreamReader(stream ?? throw new InvalidOperationException()); return reader.ReadToEnd(); } @@ -36,7 +36,7 @@ public static string GetResourceContent(string name) /// /// /// - public static Stream? GetResourceStream(string name) + public static Stream? ReadStream(string name) { try { diff --git a/src/C4Sharp/Extensions/SpaceMethods.cs b/src/C4Sharp/Commons/TabIndentation.cs similarity index 70% rename from src/C4Sharp/Extensions/SpaceMethods.cs rename to src/C4Sharp/Commons/TabIndentation.cs index 0bc72a2..2c1c9ac 100644 --- a/src/C4Sharp/Extensions/SpaceMethods.cs +++ b/src/C4Sharp/Commons/TabIndentation.cs @@ -1,29 +1,29 @@ using System.Diagnostics.CodeAnalysis; -namespace C4Sharp.Extensions; +namespace C4Sharp.Commons; /// /// Indentation methods /// [ExcludeFromCodeCoverage] -internal static class SpaceMethods +internal static class TabIndentation { /// - /// Default indentation tabsize + /// Default indentation. /// internal static int TabSize => 4; /// - /// Ident string using default tabsize + /// Ident string using default tab size. /// /// indented text internal static string Indent() => string.Empty.PadLeft(TabSize); /// - /// Ident string using tabsize + /// Ident string using tab size. /// - /// tabsize + /// tab size /// indented text internal static string Indent(int size) => string.Empty.PadLeft(size); diff --git a/src/C4Sharp/Diagrams/Core/ComponentDiagram.cs b/src/C4Sharp/Diagrams/Core/ComponentDiagram.cs deleted file mode 100644 index aaebd97..0000000 --- a/src/C4Sharp/Diagrams/Core/ComponentDiagram.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace C4Sharp.Diagrams.Core; - -/// -/// The Component diagram shows how a container is made up of a number of "components", what each of those -/// components are, their responsibilities and the technology/implementation details. -/// -/// -public record ComponentDiagram() : Diagram(DiagramType.Component); diff --git a/src/C4Sharp/Diagrams/Core/ContainerDiagram.cs b/src/C4Sharp/Diagrams/Core/ContainerDiagram.cs deleted file mode 100644 index aca933b..0000000 --- a/src/C4Sharp/Diagrams/Core/ContainerDiagram.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace C4Sharp.Diagrams.Core; - -/// -/// The Container diagram shows the high-level shape of the software architecture and how responsibilities are -/// distributed across it. It also shows the major technology choices and how the containers communicate with one -/// another. It's a simple, high-level technology focussed diagram that is useful for software developers and -/// support/operations staff alike. -/// -/// -public record ContainerDiagram() : Diagram(DiagramType.Container); diff --git a/src/C4Sharp/Diagrams/Core/ContextDiagram.cs b/src/C4Sharp/Diagrams/Core/ContextDiagram.cs deleted file mode 100644 index 9c8f14b..0000000 --- a/src/C4Sharp/Diagrams/Core/ContextDiagram.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace C4Sharp.Diagrams.Core; - -/// -/// A System Context diagram is a good starting point for diagramming and documenting a software system, allowing -/// you to step back and see the big picture. Draw a diagram showing your system as a box in the centre, surrounded -/// by its users and the other systems that it interacts with. -/// -/// -public record ContextDiagram() : Diagram(DiagramType.Context); diff --git a/src/C4Sharp/Diagrams/Diagram.cs b/src/C4Sharp/Diagrams/Diagram.cs index db4d947..1e0100b 100644 --- a/src/C4Sharp/Diagrams/Diagram.cs +++ b/src/C4Sharp/Diagrams/Diagram.cs @@ -1,6 +1,6 @@ -using C4Sharp.Extensions; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements; +using C4Sharp.Elements.Relationships; namespace C4Sharp.Diagrams; @@ -8,31 +8,29 @@ namespace C4Sharp.Diagrams; /// Visualising this hierarchy of abstractions is then done by creating a collection of Context, Container, /// Component and (optionally) Code (e.g. UML class) diagrams. This is where the C4 model gets its name from. /// -public abstract record Diagram +public record Diagram { internal string Name { get; } - public string Reference { get; init; } public bool LayoutWithLegend { get; init; } public bool ShowLegend { get; init; } public bool LayoutAsSketch { get; init; } public string? Title { get; init; } public string? Description { get; init; } public DiagramLayout FlowVisualization { get; init; } - public DiagramType Type { get; } - public Structure[] Structures { get; init; } - public Relationship[] Relationships { get; init; } - public IElementStyle? Style { get; private init; } - public IElementTag? Tags { get; private init; } - public IRelationshipTag? RelTags { get; private init; } + private DiagramType Type { get; } + public IEnumerable Structures { get; init; } + public IEnumerable Relationships { get; init; } + public IElementStyle? Style { get; init; } + public IElementTag? Tags { get; init; } + public IRelationshipTag? RelTags { get; init; } /// /// Constructor /// /// - protected Diagram(DiagramType type) + public Diagram(DiagramType type) { Type = type; - Reference = this.CreateRef(); LayoutWithLegend = true; Description = string.Empty; Title = string.Empty; @@ -43,8 +41,4 @@ protected Diagram(DiagramType type) Structures = Array.Empty(); Relationships = Array.Empty(); } - - public Diagram SetStyle(IElementStyle? style) => this with { Style = style }; - public Diagram SetTags(IElementTag? tag) => this with { Tags = tag }; - public Diagram SetRelTags(IRelationshipTag? tag) => this with { RelTags = tag }; } diff --git a/src/C4Sharp/Diagrams/DiagramBuildRunner.cs b/src/C4Sharp/Diagrams/DiagramBuildRunner.cs index 6c68aa1..4a0fc98 100644 --- a/src/C4Sharp/Diagrams/DiagramBuildRunner.cs +++ b/src/C4Sharp/Diagrams/DiagramBuildRunner.cs @@ -1,9 +1,6 @@ -using System.Reflection.Metadata.Ecma335; -using C4Sharp.Diagrams.Core; -using C4Sharp.Diagrams.Supplementary; -using C4Sharp.Extensions; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements; +using C4Sharp.Elements.Relationships; namespace C4Sharp.Diagrams; @@ -18,6 +15,8 @@ public abstract class DiagramBuildRunner : IDiagramBuildRunner protected abstract string Title { get; } protected virtual string Description { get; } protected abstract DiagramType DiagramType { get; } + protected abstract IEnumerable Structures { get; } + protected abstract IEnumerable Relationships { get; } protected DiagramBuildRunner() { @@ -33,7 +32,7 @@ protected DiagramBuildRunner() public Structure It(int instance) => It(StructureIdentity.New(instance.ToString()).Value); public Structure It(string instance) => It(StructureIdentity.New(instance).Value); - public Structure It(string key) + private Structure It(string key) => _structures.Items[key] ?? throw new KeyNotFoundException($"Structure {key} not found"); @@ -45,42 +44,27 @@ public Structure It(string key, string instance) => _structures.Items[new StructureIdentity(key, instance).Value] ?? throw new KeyNotFoundException($"Structure {key} not found"); - - protected abstract IEnumerable Structures(); - protected abstract IEnumerable Relationships(); protected virtual IElementStyle? SetStyle() => null; protected virtual IElementTag? SetTags() => null; protected virtual IRelationshipTag? SetRelTags() => null; - public Diagram Build() { - _structures.AddRange(Structures()); - - Diagram? diagram = DiagramType.Value switch - { - DiagramConstants.Component => Activator.CreateInstance(), - DiagramConstants.Container => Activator.CreateInstance(), - DiagramConstants.Context => Activator.CreateInstance(), - DiagramConstants.Deployment => Activator.CreateInstance(), - _ => throw new ArgumentNullException(nameof(DiagramType), $"{nameof(DiagramType)} is required") - }; + _structures.AddRange(Structures); - var result = diagram with + return new Diagram(DiagramType) with { - Structures = Structures().ToArray(), - Relationships = Relationships().ToArray(), + Structures = Structures, + Relationships = Relationships, Title = Title, - Reference = this.CreateRef(), ShowLegend = ShowLegend, - Description = Description.GetDescriptionOrDefault(DiagramType), + Description = Description, LayoutWithLegend = LayoutWithLegend, LayoutAsSketch = LayoutAsSketch, - FlowVisualization = FlowVisualization + FlowVisualization = FlowVisualization, + Tags = SetTags(), + RelTags = SetRelTags(), + Style = SetStyle() }; - - return result.SetStyle(SetStyle()) - .SetTags(SetTags()) - .SetRelTags(SetRelTags()); } } \ No newline at end of file diff --git a/src/C4Sharp/Diagrams/DiagramConstants.cs b/src/C4Sharp/Diagrams/DiagramConstants.cs index 65ff227..e46140c 100644 --- a/src/C4Sharp/Diagrams/DiagramConstants.cs +++ b/src/C4Sharp/Diagrams/DiagramConstants.cs @@ -6,16 +6,4 @@ public static class DiagramConstants public const string Container = "C4_Container"; public const string Context = "C4_Context"; public const string Deployment = "C4_Deployment"; - - public static string GetDescriptionOrDefault(this string description, DiagramType diagramType) - { - return !string.IsNullOrEmpty(description) ? description : diagramType.Value switch - { - Component => "The Component diagram shows how a container is made up of a number of components, what each of those components are, their responsibilities and the technology/implementation details.", - Container => "A container is something like a server-side web application, single-page application, desktop application, mobile app, database schema, file system, etc. Essentially, a container is a separately runnable/deployable unit (e.g. a separate process space) that executes code or stores data.", - Context => "A System Context diagram is a good starting point for diagramming and documenting a software system, allowing you to step back and see the big picture. Draw a diagram showing your system as a box in the centre, surrounded by its users and the other systems that it interacts with.", - Deployment => "A deployment diagram allows you to illustrate how software systems and/or containers in the static model are mapped to infrastructure. This deployment diagram is based upon a UML deployment diagram, although simplified slightly to show the mapping between containers and deployment nodes.", - _ => description - }; - } } \ No newline at end of file diff --git a/src/C4Sharp/Diagrams/DiagramNamingConvention.cs b/src/C4Sharp/Diagrams/DiagramNamingConvention.cs index d4f02dd..e7a0583 100644 --- a/src/C4Sharp/Diagrams/DiagramNamingConvention.cs +++ b/src/C4Sharp/Diagrams/DiagramNamingConvention.cs @@ -1,11 +1,9 @@ -using C4Sharp.Extensions; +using C4Sharp.Commons.Extensions; namespace C4Sharp.Diagrams; public static class DiagramNamingConvention { - public static string HtmlPageName(this Diagram diagram) => $"{diagram.Reference}.html"; - public static string SvgFileName(this Diagram diagram) => $"{diagram.Slug()}.svg"; public static string PumlFileName(this Diagram diagram) => $"{diagram.Slug()}.puml"; public static string Slug(this Diagram diagram) => $"{diagram.Title}-{diagram.Name}".GenerateSlug(); } \ No newline at end of file diff --git a/src/C4Sharp/Diagrams/DiagramRef.cs b/src/C4Sharp/Diagrams/DiagramRef.cs deleted file mode 100644 index ecb7fed..0000000 --- a/src/C4Sharp/Diagrams/DiagramRef.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace C4Sharp.Diagrams; - -internal static class DiagramRef -{ - public static string LinkTo() where T : DiagramBuildRunner => GetLink(typeof(T)); - public static string CreateRef(this DiagramBuildRunner diagram) => GetLink(diagram.GetType()); - public static string CreateRef(this Diagram diagram) => GetLink(diagram.GetType()); - private static string GetLink(Type type) => $"dgref.{type.FullName?.ToLower() ?? type.Name.ToLower()}"; -} - -public static class DiagramHRef -{ - public static string LinkTo() where T : DiagramBuildRunner => $"{DiagramRef.LinkTo()}.html"; -} \ No newline at end of file diff --git a/src/C4Sharp/Diagrams/IDiagramBuildRunner.cs b/src/C4Sharp/Diagrams/Interfaces/IDiagramBuildRunner.cs similarity index 61% rename from src/C4Sharp/Diagrams/IDiagramBuildRunner.cs rename to src/C4Sharp/Diagrams/Interfaces/IDiagramBuildRunner.cs index 03a180e..0238331 100644 --- a/src/C4Sharp/Diagrams/IDiagramBuildRunner.cs +++ b/src/C4Sharp/Diagrams/Interfaces/IDiagramBuildRunner.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Diagrams; +namespace C4Sharp.Diagrams.Interfaces; public interface IDiagramBuildRunner { diff --git a/src/C4Sharp/Diagrams/IDiagramStyle.cs b/src/C4Sharp/Diagrams/Interfaces/IDiagramStyle.cs similarity index 69% rename from src/C4Sharp/Diagrams/IDiagramStyle.cs rename to src/C4Sharp/Diagrams/Interfaces/IDiagramStyle.cs index 79d85e9..cb1cbdc 100644 --- a/src/C4Sharp/Diagrams/IDiagramStyle.cs +++ b/src/C4Sharp/Diagrams/Interfaces/IDiagramStyle.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Diagrams; +namespace C4Sharp.Diagrams.Interfaces; public interface IDiagramStyle { diff --git a/src/C4Sharp/Diagrams/IElementStyle.cs b/src/C4Sharp/Diagrams/Interfaces/IElementStyle.cs similarity index 57% rename from src/C4Sharp/Diagrams/IElementStyle.cs rename to src/C4Sharp/Diagrams/Interfaces/IElementStyle.cs index acee495..8448a47 100644 --- a/src/C4Sharp/Diagrams/IElementStyle.cs +++ b/src/C4Sharp/Diagrams/Interfaces/IElementStyle.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Diagrams; +namespace C4Sharp.Diagrams.Interfaces; public interface IElementStyle : IDiagramStyle { diff --git a/src/C4Sharp/Diagrams/IElementTag.cs b/src/C4Sharp/Diagrams/Interfaces/IElementTag.cs similarity index 56% rename from src/C4Sharp/Diagrams/IElementTag.cs rename to src/C4Sharp/Diagrams/Interfaces/IElementTag.cs index b9dc03c..a3796b9 100644 --- a/src/C4Sharp/Diagrams/IElementTag.cs +++ b/src/C4Sharp/Diagrams/Interfaces/IElementTag.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Diagrams; +namespace C4Sharp.Diagrams.Interfaces; public interface IElementTag : IDiagramStyle { diff --git a/src/C4Sharp/Diagrams/IRelationshipTag.cs b/src/C4Sharp/Diagrams/Interfaces/IRelationshipTag.cs similarity index 58% rename from src/C4Sharp/Diagrams/IRelationshipTag.cs rename to src/C4Sharp/Diagrams/Interfaces/IRelationshipTag.cs index d6c4ee4..2433460 100644 --- a/src/C4Sharp/Diagrams/IRelationshipTag.cs +++ b/src/C4Sharp/Diagrams/Interfaces/IRelationshipTag.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Diagrams; +namespace C4Sharp.Diagrams.Interfaces; public interface IRelationshipTag : IDiagramStyle { diff --git a/src/C4Sharp/Elements/Plantuml/Constants/ElementName.cs b/src/C4Sharp/Diagrams/Plantuml/Constants/ElementName.cs similarity index 100% rename from src/C4Sharp/Elements/Plantuml/Constants/ElementName.cs rename to src/C4Sharp/Diagrams/Plantuml/Constants/ElementName.cs diff --git a/src/C4Sharp/Elements/Plantuml/Constants/LineStyle.cs b/src/C4Sharp/Diagrams/Plantuml/Constants/LineStyle.cs similarity index 100% rename from src/C4Sharp/Elements/Plantuml/Constants/LineStyle.cs rename to src/C4Sharp/Diagrams/Plantuml/Constants/LineStyle.cs diff --git a/src/C4Sharp/Elements/Plantuml/Constants/Shape.cs b/src/C4Sharp/Diagrams/Plantuml/Constants/Shape.cs similarity index 100% rename from src/C4Sharp/Elements/Plantuml/Constants/Shape.cs rename to src/C4Sharp/Diagrams/Plantuml/Constants/Shape.cs diff --git a/src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlContext.cs similarity index 78% rename from src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlContext.cs index 836d287..22ec817 100644 --- a/src/C4Sharp/Elements/Plantuml/IO/PlantumlContext.cs +++ b/src/C4Sharp/Diagrams/Plantuml/PlantumlContext.cs @@ -1,7 +1,8 @@ using System.Diagnostics; +using System.Runtime.InteropServices.ComTypes; using System.Text; using C4Sharp.Diagrams; -using C4Sharp.Elements.Plantuml.Extensions; +using C4Sharp.Diagrams.Plantuml; using C4Sharp.FileSystem; namespace C4Sharp.Elements.Plantuml.IO; @@ -10,7 +11,6 @@ public partial class PlantumlContext : IDisposable { private bool StandardLibraryBaseUrl { get; set; } private bool GenerateDiagramImages { get; set; } - private bool GenerateHtmlPages { get; set; } private bool GenerateDiagramSvgImages { get; set; } private string? PlantumlJarPath { get; set; } private ProcessStartInfo ProcessInfo { get; } @@ -24,7 +24,6 @@ public PlantumlContext() StandardLibraryBaseUrl = false; GenerateDiagramImages = false; GenerateDiagramSvgImages = false; - GenerateHtmlPages = false; ProcessInfo = new ProcessStartInfo { @@ -58,17 +57,6 @@ public PlantumlContext UseDiagramImageBuilder() return this; } - /// - /// The C4Sharp will generate *.html page for your diagrams images. - /// - /// - public PlantumlContext UseHtmlPageBuilder() - { - GenerateHtmlPages = true; - GenerateDiagramSvgImages = true; - return this; - } - /// /// The C4Sharp will generate *.puml files of your diagram. /// Also, you could save the *.svg files using this method @@ -114,21 +102,9 @@ public void Export(string path, IEnumerable diagrams) SavePumlFiles(diagram, path); } - if (GenerateDiagramImages) - { - SaveDiagramFiles(path, "png"); - } - - if (GenerateDiagramSvgImages) - { - SaveDiagramFiles(path, "svg"); - } - - if (GenerateHtmlPages) - { - SaveHtmlFiles(path, enumerable); - } - } + if (GenerateDiagramImages) SaveDiagramFiles(path, "png"); + if (GenerateDiagramSvgImages) SaveDiagramFiles(path, "svg"); + } } /// @@ -141,13 +117,14 @@ public partial class PlantumlContext /// /// C4 Diagram /// Output path - private void SavePumlFiles(Diagram diagram, string path) + private string SavePumlFiles(Diagram diagram, string path) { try { var filePath = Path.Combine(path, diagram.PumlFileName()); Directory.CreateDirectory(path); File.WriteAllText(filePath, diagram.ToPumlString(StandardLibraryBaseUrl)); + return filePath; } catch (Exception e) { @@ -186,7 +163,7 @@ private void SaveDiagramFiles(string path, string generatedImageFormat) var process = new Process { StartInfo = ProcessInfo }; process.OutputDataReceived += (_, args) => results.AppendLine(args.Data); - + process.Start(); process.WaitForExit(); } @@ -226,33 +203,4 @@ public void Dispose() // ignored } } -} - -/// -/// HTML file utils -/// -public partial class PlantumlContext -{ - private static void SaveHtmlFiles(string path, IEnumerable diagrams) - { - try - { - Directory.CreateDirectory(path); - PlantumlResources.LoadHtmlResources(path); - var enumerable = diagrams as Diagram[] ?? diagrams.ToArray(); - - var index = Path.Combine(path, "index.html"); - File.WriteAllText(index, enumerable.ToIndexHtmlPage()); - - foreach (var diagram in enumerable) - { - var filePath = Path.Combine(path, diagram.HtmlPageName()); - File.WriteAllText(filePath, diagram.ToHtmlPage()); - } - } - catch (Exception e) - { - throw new PlantumlException($"{nameof(PlantumlException)}: Could not save html file.", e); - } - } } \ No newline at end of file diff --git a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlDiagram.cs similarity index 98% rename from src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlDiagram.cs index 8f4c176..75ce798 100644 --- a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlDiagram.cs +++ b/src/C4Sharp/Diagrams/Plantuml/PlantumlDiagram.cs @@ -1,8 +1,7 @@ using System.Text; -using C4Sharp.Diagrams; using C4Sharp.FileSystem; -namespace C4Sharp.Elements.Plantuml.Extensions; +namespace C4Sharp.Diagrams.Plantuml; /// /// Parser Diagram to PlantUML diff --git a/src/C4Sharp/Elements/Plantuml/IO/PlantumlException.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlException.cs similarity index 100% rename from src/C4Sharp/Elements/Plantuml/IO/PlantumlException.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlException.cs diff --git a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlRelationship.cs similarity index 96% rename from src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlRelationship.cs index e73bb9e..e818d3f 100644 --- a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlRelationship.cs +++ b/src/C4Sharp/Diagrams/Plantuml/PlantumlRelationship.cs @@ -1,6 +1,6 @@ using C4Sharp.Elements.Relationships; -namespace C4Sharp.Elements.Plantuml.Extensions; +namespace C4Sharp.Diagrams.Plantuml; /// /// Parser Relationship to PlantUML diff --git a/src/C4Sharp/Elements/Plantuml/IO/PlantumlResources.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlResources.cs similarity index 100% rename from src/C4Sharp/Elements/Plantuml/IO/PlantumlResources.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlResources.cs diff --git a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs b/src/C4Sharp/Diagrams/Plantuml/PlantumlStructure.cs similarity index 93% rename from src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs rename to src/C4Sharp/Diagrams/Plantuml/PlantumlStructure.cs index 7d75132..e2443b3 100644 --- a/src/C4Sharp/Elements/Plantuml/Extensions/PlantumlStructure.cs +++ b/src/C4Sharp/Diagrams/Plantuml/PlantumlStructure.cs @@ -1,8 +1,10 @@ using System.Text; using C4Sharp.Commons; +using C4Sharp.Elements; +using C4Sharp.Elements.Boundaries; using C4Sharp.Elements.Relationships; -namespace C4Sharp.Elements.Plantuml.Extensions; +namespace C4Sharp.Diagrams.Plantuml; /// /// PlantUML Parser @@ -32,7 +34,6 @@ private static string ToPumlString(this Person person) return $"{procedureName}({person.Alias}, \"{person.Label}\", \"{person.Description}\"" - .TryConcatLink(person) .TryConcatTags(person) + ")"; } @@ -42,7 +43,6 @@ private static string ToPumlString(this SoftwareSystem system) return $"{procedureName}({system.Alias}, \"{system.Label}\", \"{system.Description}\"" - .TryConcatLink(system) .TryConcatTags(system) + ")"; } @@ -93,7 +93,6 @@ private static string ToPumlString(this Component component) return $"{procedureName}({component.Alias}, \"{component.Label}\", \"{component.Technology}\", \"{component.Description}\"" - .TryConcatLink(component) .TryConcatTags(component) + ")"; } @@ -110,7 +109,6 @@ private static string ToPumlString(this Container container) }; return $"{procedureName}({container.Alias}, \"{container.Label}\", \"{container.Technology}\", \"{container.Description}\"" - .TryConcatLink(container) .TryConcatTags(container) + ")"; } @@ -176,7 +174,4 @@ private static string GetExternalSuffix(Structure structure) => private static string TryConcatTags(this string value, Structure structure) => value + (structure.Tags.Any() ? $", $tags=\"{string.Join("+", structure.Tags)}\"" : string.Empty); - - private static string TryConcatLink(this string value, Structure structure) => - value + (string.IsNullOrEmpty(structure.Link) ? string.Empty : $", $link=\"{structure.Link}\""); } diff --git a/src/C4Sharp/Elements/Plantuml/ElementStyle.cs b/src/C4Sharp/Diagrams/Plantuml/Style/ElementStyle.cs similarity index 97% rename from src/C4Sharp/Elements/Plantuml/ElementStyle.cs rename to src/C4Sharp/Diagrams/Plantuml/Style/ElementStyle.cs index 1b82d9c..5c472f6 100644 --- a/src/C4Sharp/Elements/Plantuml/ElementStyle.cs +++ b/src/C4Sharp/Diagrams/Plantuml/Style/ElementStyle.cs @@ -1,4 +1,5 @@ using C4Sharp.Diagrams; +using C4Sharp.Diagrams.Interfaces; using C4Sharp.Elements.Plantuml.Constants; namespace C4Sharp.Elements.Plantuml; diff --git a/src/C4Sharp/Elements/Plantuml/ElementTag.cs b/src/C4Sharp/Diagrams/Plantuml/Style/ElementTag.cs similarity index 97% rename from src/C4Sharp/Elements/Plantuml/ElementTag.cs rename to src/C4Sharp/Diagrams/Plantuml/Style/ElementTag.cs index fc7e2e0..d1a75b3 100644 --- a/src/C4Sharp/Elements/Plantuml/ElementTag.cs +++ b/src/C4Sharp/Diagrams/Plantuml/Style/ElementTag.cs @@ -1,4 +1,5 @@ using C4Sharp.Diagrams; +using C4Sharp.Diagrams.Interfaces; using C4Sharp.Elements.Plantuml.Constants; namespace C4Sharp.Elements.Plantuml; diff --git a/src/C4Sharp/Elements/Plantuml/RelationshipTag.cs b/src/C4Sharp/Diagrams/Plantuml/Style/RelationshipTag.cs similarity index 97% rename from src/C4Sharp/Elements/Plantuml/RelationshipTag.cs rename to src/C4Sharp/Diagrams/Plantuml/Style/RelationshipTag.cs index 221f81a..2106e8d 100644 --- a/src/C4Sharp/Elements/Plantuml/RelationshipTag.cs +++ b/src/C4Sharp/Diagrams/Plantuml/Style/RelationshipTag.cs @@ -1,4 +1,5 @@ using C4Sharp.Diagrams; +using C4Sharp.Diagrams.Interfaces; using C4Sharp.Elements.Plantuml.Constants; namespace C4Sharp.Elements.Plantuml; diff --git a/src/C4Sharp/Diagrams/Supplementary/DeploymentDiagram.cs b/src/C4Sharp/Diagrams/Supplementary/DeploymentDiagram.cs deleted file mode 100644 index 5f87abe..0000000 --- a/src/C4Sharp/Diagrams/Supplementary/DeploymentDiagram.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace C4Sharp.Diagrams.Supplementary; - -/// -/// A deployment diagram allows you to illustrate how software systems and/or containers in the static model are -/// mapped to infrastructure. This deployment diagram is based upon a UML deployment diagram, although simplified -/// slightly to show the mapping between containers and deployment nodes. A deployment node is something like -/// physical infrastructure (e.g. a physical server or device), virtualised infrastructure (e.g. IaaS, PaaS, -/// a virtual machine), containerised infrastructure (e.g. a Docker container), an execution environment -/// (e.g. a database server, Java EE web/application server, Microsoft IIS), etc. Deployment nodes can be nested. -/// -/// -public record DeploymentDiagram() : Diagram(DiagramType.Deployment); diff --git a/src/C4Sharp/Elements/ContainerBoundary.cs b/src/C4Sharp/Elements/Boundaries/ContainerBoundary.cs similarity index 96% rename from src/C4Sharp/Elements/ContainerBoundary.cs rename to src/C4Sharp/Elements/Boundaries/ContainerBoundary.cs index 7e2cff2..59b8dd7 100644 --- a/src/C4Sharp/Elements/ContainerBoundary.cs +++ b/src/C4Sharp/Elements/Boundaries/ContainerBoundary.cs @@ -1,7 +1,7 @@ using C4Sharp.Commons.Extensions; using C4Sharp.Elements.Relationships; -namespace C4Sharp.Elements; +namespace C4Sharp.Elements.Boundaries; /// /// Container Boundary @@ -16,7 +16,6 @@ public ContainerBoundary(StructureIdentity alias, string label):base(alias, labe { } - public IEnumerable Components { get; init; } = Array.Empty(); public IEnumerable Relationships { get; init; } = Array.Empty(); public Structure[] GetBoundaryStructures() => Components.Select(x => x as Structure).ToArray(); diff --git a/src/C4Sharp/Elements/EnterpriseBoundary.cs b/src/C4Sharp/Elements/Boundaries/EnterpriseBoundary.cs similarity index 83% rename from src/C4Sharp/Elements/EnterpriseBoundary.cs rename to src/C4Sharp/Elements/Boundaries/EnterpriseBoundary.cs index 7def14e..c86c8d7 100644 --- a/src/C4Sharp/Elements/EnterpriseBoundary.cs +++ b/src/C4Sharp/Elements/Boundaries/EnterpriseBoundary.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Elements; +namespace C4Sharp.Elements.Boundaries; public record EnterpriseBoundary(string Alias, string Label, params Structure[] Structures) : Structure(Alias, Label), IBoundary { diff --git a/src/C4Sharp/Elements/IBoundary.cs b/src/C4Sharp/Elements/Boundaries/IBoundary.cs similarity index 64% rename from src/C4Sharp/Elements/IBoundary.cs rename to src/C4Sharp/Elements/Boundaries/IBoundary.cs index 37c2195..2696e95 100644 --- a/src/C4Sharp/Elements/IBoundary.cs +++ b/src/C4Sharp/Elements/Boundaries/IBoundary.cs @@ -1,4 +1,4 @@ -namespace C4Sharp.Elements; +namespace C4Sharp.Elements.Boundaries; public interface IBoundary { diff --git a/src/C4Sharp/Elements/SoftwareSystemBoundary.cs b/src/C4Sharp/Elements/Boundaries/SoftwareSystemBoundary.cs similarity index 56% rename from src/C4Sharp/Elements/SoftwareSystemBoundary.cs rename to src/C4Sharp/Elements/Boundaries/SoftwareSystemBoundary.cs index 482d266..876aa21 100644 --- a/src/C4Sharp/Elements/SoftwareSystemBoundary.cs +++ b/src/C4Sharp/Elements/Boundaries/SoftwareSystemBoundary.cs @@ -1,15 +1,10 @@ -namespace C4Sharp.Elements; +namespace C4Sharp.Elements.Boundaries; /// /// Software System Boundary /// public sealed record SoftwareSystemBoundary(string Alias, string Label, params Container[] Containers) : Structure(Alias, Label), IBoundary { - public static SoftwareSystemBoundary New(string label, params Container[] containers) - { - return new SoftwareSystemBoundary(Guid.NewGuid().ToString("N"), label, containers); - } - public Structure[] GetBoundaryStructures() => Containers.Select(x => x as Structure).ToArray(); } diff --git a/src/C4Sharp/Elements/Container.cs b/src/C4Sharp/Elements/Container.cs index f3ad714..4285697 100644 --- a/src/C4Sharp/Elements/Container.cs +++ b/src/C4Sharp/Elements/Container.cs @@ -22,13 +22,15 @@ public record Container : Structure public Container this[int index] => GetInstance(index.ToString()); public Container this[string instanceName] => GetInstance(instanceName); - public Container(string alias, string label) : base(alias, label) + public Container(string alias, string label) + : base(alias, label) { ContainerType = ContainerType.None; Technology = $"{ContainerType.ToString().SplitCapitalizedWords()}"; } - public Container(string alias, string label, ContainerType type, string? technology) : this(alias, label) + public Container(string alias, string label, ContainerType type, string? technology) + : this(alias, label) { ContainerType = type; Technology = technology is null @@ -41,6 +43,12 @@ public Container(string alias, string label, ContainerType type, string? technol { Description = description ?? string.Empty; } + + public Container(string alias, string label, ContainerType type, string? technology, string? description, IEnumerable tags) + : this(alias, label, type, technology, description) + { + Tags = tags; + } /// /// Get or Create a instance of current container @@ -73,12 +81,13 @@ private Container GetInstance(string instanceName) public record Container : Container { - private protected Container(ContainerType type, string? technology = null, string? description = null) + private protected Container(ContainerType type, string? technology = null, string? description = null, IEnumerable? tags = null) : base( StructureIdentity.New().Value, typeof(T).ToNamingConvention(), type, technology, - description ?? typeof(T).ToNamingConvention() + description ?? typeof(T).ToNamingConvention(), + tags ?? Array.Empty() ) { } } \ No newline at end of file diff --git a/src/C4Sharp/Elements/ContainerType.cs b/src/C4Sharp/Elements/ContainerType.cs index fa26d1f..cbfba1a 100644 --- a/src/C4Sharp/Elements/ContainerType.cs +++ b/src/C4Sharp/Elements/ContainerType.cs @@ -36,6 +36,9 @@ public enum ContainerType [Description("API")] Api, + + [Description("Microservice")] + Microservice, [Description("Queue")] Queue, diff --git a/src/C4Sharp/Elements/Containers/Microservice.cs b/src/C4Sharp/Elements/Containers/Microservice.cs new file mode 100644 index 0000000..8c752e8 --- /dev/null +++ b/src/C4Sharp/Elements/Containers/Microservice.cs @@ -0,0 +1,10 @@ +namespace C4Sharp.Elements.Containers; + +public record Microservice(string Alias, string Label, string Technology, string? Description = null) + : Container(Alias, Label, ContainerType.Microservice, Technology, Description, new []{ "microservice" }); + +public record Microservice(string? Technology = null, string? Description = null) + : Container(ContainerType.Microservice, Technology, Description, new []{ "microservice" }); + + + \ No newline at end of file diff --git a/src/C4Sharp/Elements/DeploymentNode.cs b/src/C4Sharp/Elements/DeploymentNode.cs index f163f5b..b51937c 100644 --- a/src/C4Sharp/Elements/DeploymentNode.cs +++ b/src/C4Sharp/Elements/DeploymentNode.cs @@ -2,7 +2,7 @@ namespace C4Sharp.Elements; /// /// A deployment node is something like physical infrastructure (e.g. a physical server or device), -/// virtualised infrastructure (e.g. IaaS, PaaS, a virtual machine), containerised infrastructure +/// virtualized infrastructure (e.g. IaaS, PaaS, a virtual machine), containerised infrastructure /// (e.g. a Docker container), an execution environment (e.g. a database server, Java EE web/application /// server, Microsoft IIS), etc. Deployment nodes can be nested. /// diff --git a/src/C4Sharp/Elements/Relationships/Relationship.cs b/src/C4Sharp/Elements/Relationships/Relationship.cs index cb75890..9f65b1c 100644 --- a/src/C4Sharp/Elements/Relationships/Relationship.cs +++ b/src/C4Sharp/Elements/Relationships/Relationship.cs @@ -115,8 +115,8 @@ public Relationship(Structure @from, Direction direction, Structure to, string l public static Relationship operator |(Relationship a, (string label, string protocolo) b) { - var (label, protocolo) = b; - return new Relationship(a.From, a.Direction, a.To, label, protocolo, a.Position); + var (label, protocol) = b; + return new Relationship(a.From, a.Direction, a.To, label, protocol, a.Position); } public static Relationship operator |(Relationship a, Position position) diff --git a/src/C4Sharp/Elements/Structure.cs b/src/C4Sharp/Elements/Structure.cs index 0f6ef5f..dddd31d 100644 --- a/src/C4Sharp/Elements/Structure.cs +++ b/src/C4Sharp/Elements/Structure.cs @@ -14,8 +14,7 @@ public abstract record Structure public string Alias { get; } public string Label { get; init; } = ""; public string Description { get; init; } = string.Empty; - public string[] Tags { get; init; } = Array.Empty(); - public string Link { get; init; } = string.Empty; + public IEnumerable Tags { get; init; } public Boundary Boundary { get; init; } = Boundary.Internal; /// @@ -23,9 +22,11 @@ public abstract record Structure /// /// Should be unique /// - protected Structure(string alias, string label) => (Alias, Label) = (alias, label); + protected Structure(string alias, string label, string[]? tags = null) => + (Alias, Label, Tags) = (alias, label, tags ?? Array.Empty()); - protected Structure(StructureIdentity identity, string label) : this(identity.Value, label) + protected Structure(StructureIdentity identity, string label, string[]? tags = null) + : this(identity.Value, label, tags) { } diff --git a/src/C4Sharp/Elements/StructureCollection.cs b/src/C4Sharp/Elements/StructureCollection.cs index d4f3313..0b1c6f0 100644 --- a/src/C4Sharp/Elements/StructureCollection.cs +++ b/src/C4Sharp/Elements/StructureCollection.cs @@ -1,3 +1,5 @@ +using C4Sharp.Elements.Boundaries; + namespace C4Sharp.Elements; internal class StructureCollection diff --git a/src/C4Sharp/Extensions/TypeNameMethods.cs b/src/C4Sharp/Extensions/TypeNameMethods.cs deleted file mode 100644 index 5ac8b3d..0000000 --- a/src/C4Sharp/Extensions/TypeNameMethods.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.ComponentModel; - -namespace C4Sharp.Extensions; - -public static class TypeNameMethods -{ - internal static string ToNamingConvention(this Type type) - { - return type.IsInterface && type.Name.StartsWith("I") - ? type.Name.SplitCapitalizedWords().Remove(0, 1) - : type.Name.SplitCapitalizedWords(); - } - - public static string? GetValueFromDescription(this Type type) - { - var description = type.GetCustomAttributes(typeof(DescriptionAttribute), false) - .FirstOrDefault(x => x is DescriptionAttribute); - - if (description is DescriptionAttribute attribute) - { - return attribute.Description; - } - - return null; - } -} \ No newline at end of file diff --git a/src/C4Sharp/Models/Plantuml/IO/PlantumlSession.cs b/src/C4Sharp/Models/Plantuml/IO/PlantumlSession.cs deleted file mode 100644 index e571d2e..0000000 --- a/src/C4Sharp/Models/Plantuml/IO/PlantumlSession.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System.Diagnostics; -using System.Text; -using C4Sharp.Diagrams; -using C4Sharp.FileSystem; -using C4Sharp.Models.Plantuml.Extensions; - -namespace C4Sharp.Models.Plantuml.IO; - -/// -/// Session -/// -[Obsolete("This class is deprecated! Please, use PlantumlContext")] -public partial class PlantumlSession : IDisposable -{ - public bool StandardLibraryBaseUrl { get; private set; } - public bool GenerateDiagramImages { get; private set; } - public bool GenerateDiagramSvgImages { get; private set; } - private string? PlantumlJarPath { get; set; } - private ProcessStartInfo ProcessInfo { get; } - - /// - /// Constructor - /// - public PlantumlSession() - { - PlantumlJarPath = null; - ProcessInfo = new ProcessStartInfo - { - FileName = "java", - UseShellExecute = false, - CreateNoWindow = true, - WindowStyle = ProcessWindowStyle.Hidden, - }; - } - - /// - /// The C4Sharp has embedded the current version of C4-PluntUML. - /// But, if you want to use the C4-PlantUML up-to-date version from their repo, - /// use this method - /// - /// PlantumlSession instance - public PlantumlSession UseStandardLibraryBaseUrl() - { - StandardLibraryBaseUrl = true; - return this; - } - - /// - /// The C4Sharp will generate *.puml files of your diagram. - /// Also, you could save the *.png files using this method - /// - /// - public PlantumlSession UseDiagramImageBuilder() - { - GenerateDiagramImages = true; - return this; - } - - /// - /// The C4Sharp will generate *.puml files of your diagram. - /// Also, you could save the *.svg files using this method - /// - /// - public PlantumlSession UseDiagramSvgImageBuilder() - { - GenerateDiagramSvgImages = true; - return this; - } - - /// - /// Execute plantuml.jar - /// - /// puml files path - /// specifies the format of the generated images - /// - public void Execute(string path, string generatedImageFormat) - { - try - { - PlantumlResources.LoadResources(path); - PlantumlJarPath ??= PlantumlResources.LoadPlantumlJar(); - - var directory = new DirectoryInfo(path).FullName; - - if (string.IsNullOrEmpty(directory)) - { - throw new PlantumlException($"{nameof(PlantumlException)}: puml file not found."); - } - - var results = new StringBuilder(); - - var jar = CalculateJarCommand(StandardLibraryBaseUrl, generatedImageFormat, directory); - - ProcessInfo.Arguments = $"{jar} \"{path}\""; - ProcessInfo.RedirectStandardOutput = true; - ProcessInfo.StandardOutputEncoding = Encoding.UTF8; - - var process = new Process { StartInfo = ProcessInfo }; - - process.OutputDataReceived += (_, args) => results.AppendLine(args.Data); - - process.Start(); - process.WaitForExit(); - } - catch (Exception e) - { - throw new PlantumlException($"{nameof(PlantumlException)}: puml file not found.", e); - } - } - - private string CalculateJarCommand(bool useStandardLibrary, string generatedImageFormat, string directory) - { - const string includeLocalFilesArg = "-DRELATIVE_INCLUDE=\".\""; - - var resourcesOriginArg = useStandardLibrary ? string.Empty : includeLocalFilesArg; - var imageFormatOutputArg = string.IsNullOrWhiteSpace(generatedImageFormat) - ? string.Empty - : $"-t{generatedImageFormat}"; - - return - $"-jar \"{PlantumlJarPath}\" {resourcesOriginArg} {imageFormatOutputArg} -Playout=smetana -verbose -o \"{directory}\" -charset UTF-8"; - } - - /// - /// Using the -pipe option, you can easily use PlantUML in your scripts. - /// With this option, a diagram description is received through standard input and the PNG file is generated to standard output. - /// No file is written on the local file system. - /// - /// puml content - /// - internal (string, Stream) GetStream(string input) - { - try - { - PlantumlJarPath ??= PlantumlResources.LoadPlantumlJar(); - - var results = new StringBuilder(); - var fileName = Guid.NewGuid().ToString("N"); - var standardLibraryBaseUrlArgs = StandardLibraryBaseUrl ? string.Empty : "-DRELATIVE_INCLUDE=\".\""; - var jar = $"-jar {PlantumlJarPath} {standardLibraryBaseUrlArgs} -Playout=smetana -verbose -charset UTF-8"; - - ProcessInfo.Arguments = $"{jar} -pipe > {fileName}.png"; - ProcessInfo.RedirectStandardOutput = true; - ProcessInfo.RedirectStandardInput = true; - ProcessInfo.StandardOutputEncoding = Encoding.UTF8; - - var process = new Process { StartInfo = ProcessInfo }; - - process.OutputDataReceived += (_, args) => results.AppendLine(args.Data); - - process.Start(); - process.StandardInput.Write(input); - process.StandardInput.Flush(); - process.StandardInput.Close(); - process.BeginOutputReadLine(); - process.WaitForExit(); - - var buffer = Encoding.UTF8.GetBytes(results.ToString()); - return (fileName, new MemoryStream(buffer)); - } - catch (Exception e) - { - throw new PlantumlException($"{nameof(PlantumlException)}: puml file not found.", e); - } - } - - /// - /// Clear Plantuml Resource - /// - public void Dispose() - { - try - { - if (PlantumlJarPath is not null) - { - File.Delete(PlantumlJarPath); - } - } - catch - { - // ignored - } - } -} - -/// -/// PUML File Utils -/// -public partial class PlantumlSession -{ - private static readonly object Lock = new(); - - /// - /// It creates a Puml file into the default directory "./c4" - /// If the attribute of Session GenerateDiagramImages is true - /// It generates png files of the diagram - /// - /// C4 Diagrams - public void Export(IEnumerable diagrams) - { - var dirPath = Directory.GetCurrentDirectory(); - var path = Path.Join(dirPath, C4SharpDirectory.DirectoryName); - Export(path, diagrams); - } - - /// - /// It creates a Puml file into the default directory "./c4" - /// If the attribute of Session GenerateDiagramImages is true - /// It generates png files of the diagram - /// - /// C4 Diagrams - /// - /// Full path of the directory - /// For windows.: C:\users\user\projects\ - /// For Unix.: users/user/projects/ - /// - public void Export(string path, IEnumerable diagrams) - { - foreach (var diagram in diagrams) - { - Save(diagram, path); - } - - if (GenerateDiagramImages) - { - Execute(path, "png"); - } - - if (GenerateDiagramSvgImages) - { - Execute(path, "svg"); - } - } - - /// - /// Save puml file. It's creates path if non exists. - /// - /// C4 Diagram - /// Output path - private void Save(Diagram diagram, string path) - { - try - { - lock (Lock) - { - var filePath = Path.Combine(path, $"{diagram.Slug()}.puml"); - Directory.CreateDirectory(path); - File.WriteAllText(filePath, diagram.ToPumlString(StandardLibraryBaseUrl)); - } - } - catch (Exception e) - { - throw new PlantumlException($"{nameof(PlantumlException)}: Could not save puml file.", e); - } - } -} \ No newline at end of file From 8aae31a1ad6080ae71bd722bbd4382d1865eb81d Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:03:35 -0300 Subject: [PATCH 07/12] Update package version - C4Sharp update to 6.0.x - C4Sharp update to 2.0.x --- .github/workflows/dotnet.yml | 7 ++----- src/C4Sharp.Tools/C4Sharp.Tools.csproj | 2 +- src/C4Sharp/C4Sharp.csproj | 9 ++------- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 7c24f78..09b5091 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -7,8 +7,8 @@ on: branches: [ main ] env: - VERSION: 5.2.${{ github.run_number }} - CLI_VERSION: 1.2.${{ github.run_number }}-beta + VERSION: 6.0.${{ github.run_number }} + CLI_VERSION: 2.0.${{ github.run_number }} NUGET_INDEX: https://api.nuget.org/v3/index.json BUILD_TYPE: Release @@ -37,9 +37,6 @@ jobs: - name: Build run: dotnet build --no-restore --configuration Release - - name: Unit Tests - run: dotnet test ./tests/**/*.UnitTests.csproj --no-restore - - name: Integrated Tests run: dotnet test ./tests/**/*.IntegratedTests.csproj --no-restore diff --git a/src/C4Sharp.Tools/C4Sharp.Tools.csproj b/src/C4Sharp.Tools/C4Sharp.Tools.csproj index 7557d44..57fd188 100644 --- a/src/C4Sharp.Tools/C4Sharp.Tools.csproj +++ b/src/C4Sharp.Tools/C4Sharp.Tools.csproj @@ -14,7 +14,7 @@ https://github.com/8T4/c4sharp git c4, diagrams - 1.2.0 + 2.0.0 https://github.com/8T4/c4sharp/blob/main/LICENSE true true diff --git a/src/C4Sharp/C4Sharp.csproj b/src/C4Sharp/C4Sharp.csproj index 4b88c51..7928408 100644 --- a/src/C4Sharp/C4Sharp.csproj +++ b/src/C4Sharp/C4Sharp.csproj @@ -11,7 +11,7 @@ https://github.com/8T4/c4sharp git c4, diagrams - 5.2.0 + 6.0.0 https://github.com/8T4/c4sharp/blob/main/LICENSE true true @@ -30,16 +30,11 @@ - - + - - - - From c9ab03e31eec0426438d1ad3400c13ec6dbb83e4 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:05:04 -0300 Subject: [PATCH 08/12] Removing HTML Builder code from Tools --- src/C4Sharp.Tools/Commands/BuildCommand.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/C4Sharp.Tools/Commands/BuildCommand.cs b/src/C4Sharp.Tools/Commands/BuildCommand.cs index 5130a88..0434f9a 100644 --- a/src/C4Sharp.Tools/Commands/BuildCommand.cs +++ b/src/C4Sharp.Tools/Commands/BuildCommand.cs @@ -1,8 +1,8 @@ using System.Diagnostics; using System.Reflection; using C4Sharp.Diagrams; -using C4Sharp.Models.Plantuml.Extensions; -using C4Sharp.Models.Plantuml.IO; +using C4Sharp.Diagrams.Interfaces; +using C4Sharp.Elements.Plantuml.IO; using C4Sharp.Tools.Commands.Arguments; using C4Sharp.Tools.Commands.Options; @@ -33,7 +33,7 @@ private async Task Execute(string path, string? output, string? doc) return 1; } - //RunDotnetBuild(slnPath); + await RunDotnetBuild(slnPath); var runners = await StartAnalysis(workspace, slnPath); GenerateC4Diagrams(runners, output, doc); return 0; @@ -103,7 +103,7 @@ private static MSBuildWorkspace CreateWorkspace() /// Run dotnet build \"{slnPath}\" /// /// solution path - private static void RunDotnetBuild(string slnPath) + private static async Task RunDotnetBuild(string slnPath) { ColorConsole.WriteLine("Running dotnet build".White()); var dotnetProcess = Process.Start(new ProcessStartInfo(@"dotnet", $"build \"{slnPath}\"") @@ -112,7 +112,7 @@ private static void RunDotnetBuild(string slnPath) RedirectStandardInput = true, RedirectStandardOutput = true }); - dotnetProcess!.WaitForExitAsync(); + await dotnetProcess!.WaitForExitAsync(); ColorConsole.WriteLine("dotnet build complete".White()); } @@ -178,16 +178,10 @@ private static void GenerateC4Diagrams(IEnumerable runners, .UseDiagramImageBuilder() .UseDiagramSvgImageBuilder(); - if (doc is not null && doc.Equals("html")) - { - context.UseHtmlPageBuilder(); - } - context.Export(directory, runners.Select(r => r.Build())); PrintFileList(directory, "png"); PrintFileList(directory, "svg"); - PrintFileList(directory, "html"); PrintFileList(directory, "puml"); } From c51e379d3c8fa443be09a46132f4c32259eac5ee Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:05:42 -0300 Subject: [PATCH 09/12] Removing unnecessary unit test project --- .../C4Sharp.UnitTests.csproj | 27 -------- .../Diagrams/DiagramTests.cs | 63 ------------------- 2 files changed, 90 deletions(-) delete mode 100644 tests/C4Sharp.UnitTests/C4Sharp.UnitTests.csproj delete mode 100644 tests/C4Sharp.UnitTests/Diagrams/DiagramTests.cs diff --git a/tests/C4Sharp.UnitTests/C4Sharp.UnitTests.csproj b/tests/C4Sharp.UnitTests/C4Sharp.UnitTests.csproj deleted file mode 100644 index 4ab6ddb..0000000 --- a/tests/C4Sharp.UnitTests/C4Sharp.UnitTests.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - net6.0 - - false - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/tests/C4Sharp.UnitTests/Diagrams/DiagramTests.cs b/tests/C4Sharp.UnitTests/Diagrams/DiagramTests.cs deleted file mode 100644 index 499cab9..0000000 --- a/tests/C4Sharp.UnitTests/Diagrams/DiagramTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -using C4Sharp.Diagrams; -using C4Sharp.Diagrams.Core; -using C4Sharp.Diagrams.Supplementary; -using FluentAssertions; -using Xunit; - -namespace C4Sharp.UnitTests.Diagrams; - -public class DiagramTests -{ - [Theory] - [InlineData("Test A")] - [InlineData("test A")] - [InlineData("TEST A")] - public void TestWhenSlugComponentDiagram(string title) - { - var diagram = new ComponentDiagram { Title = title }; - diagram.Slug().Should().Be("test-a-c4component"); - } - - [Theory] - [InlineData("Test A")] - [InlineData("test A")] - [InlineData("TEST A")] - public void TestWhenSlugContextDiagram(string title) - { - var diagram = new ContextDiagram { Title = title }; - diagram.Slug().Should().Be("test-a-c4context"); - } - - [Theory] - [InlineData("Test A")] - [InlineData("test A")] - [InlineData("TEST A")] - public void TestWhenSlugContainerDiagram(string title) - { - var diagram = new ContainerDiagram { Title = title }; - diagram.Slug().Should().Be("test-a-c4container"); - } - - [Theory] - [InlineData("Test A")] - [InlineData("test A")] - [InlineData("TEST A")] - public void TestWhenSlugDeploymentDiagram(string title) - { - var diagram = new DeploymentDiagram { Title = title }; - diagram.Slug().Should().Be("test-a-c4deployment"); - } - - [Fact] - public void TestWhenCreateWithDefaultAttributes() - { - var diagram = new ComponentDiagram(); - - diagram.LayoutWithLegend.Should().BeTrue(); - diagram.LayoutAsSketch.Should().BeFalse(); - diagram.ShowLegend.Should().BeFalse(); - diagram.FlowVisualization.Should().Be(DiagramLayout.TopDown); - diagram.Structures.Should().BeNullOrEmpty(); - diagram.Relationships.Should().BeNullOrEmpty(); - } -} From 9006d9e7f11b2ece23df35fa5ce5c95d65d57562 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:06:16 -0300 Subject: [PATCH 10/12] Improve Integration tests to use sample code --- .../C4Sharp.IntegratedTests.csproj | 1 + .../ExportingDiagramTests.cs | 75 +++++++++++-------- .../Stubs/Diagrams/ComponentDiagramBuilder.cs | 50 ------------- .../Stubs/Diagrams/ContainerDiagramBuilder.cs | 49 ------------ .../Stubs/Diagrams/ContextDiagramBuilder.cs | 28 ------- .../Diagrams/DeploymentDiagramBuilder.cs | 41 ---------- .../Stubs/Models/Components.cs | 39 ---------- .../Stubs/Models/Containers.cs | 67 ----------------- .../Stubs/Models/Nodes.cs | 56 -------------- .../Stubs/Models/People.cs | 13 ---- .../Stubs/Models/Systems.cs | 36 --------- 11 files changed, 43 insertions(+), 412 deletions(-) delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ComponentDiagramBuilder.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContainerDiagramBuilder.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContextDiagramBuilder.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Diagrams/DeploymentDiagramBuilder.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Models/Components.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Models/Containers.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Models/Nodes.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Models/People.cs delete mode 100644 tests/C4Sharp.IntegratedTests/Stubs/Models/Systems.cs diff --git a/tests/C4Sharp.IntegratedTests/C4Sharp.IntegratedTests.csproj b/tests/C4Sharp.IntegratedTests/C4Sharp.IntegratedTests.csproj index dedf6c5..848f155 100644 --- a/tests/C4Sharp.IntegratedTests/C4Sharp.IntegratedTests.csproj +++ b/tests/C4Sharp.IntegratedTests/C4Sharp.IntegratedTests.csproj @@ -21,6 +21,7 @@ + diff --git a/tests/C4Sharp.IntegratedTests/ExportingDiagramTests.cs b/tests/C4Sharp.IntegratedTests/ExportingDiagramTests.cs index 31fef71..c2dec08 100644 --- a/tests/C4Sharp.IntegratedTests/ExportingDiagramTests.cs +++ b/tests/C4Sharp.IntegratedTests/ExportingDiagramTests.cs @@ -1,27 +1,27 @@ using C4Sharp.Diagrams; -using C4Sharp.IntegratedTests.Stubs.Diagrams; -using C4Sharp.Models.Plantuml.IO; +using C4Sharp.Elements.Plantuml.IO; using Xunit; +using ComponentDiagram = C4Sharp.Sample.Diagrams.ComponentDiagram; +using ContainerDiagram = C4Sharp.Sample.Diagrams.ContainerDiagram; +using ContextDiagram = C4Sharp.Sample.Diagrams.ContextDiagram; +using DeploymentDiagram = C4Sharp.Sample.Diagrams.DeploymentDiagram; namespace C4Sharp.IntegratedTests; -public class ExportingDiagramTests : ExportingDiagramFixture, IDisposable +public class ExportingDiagramTests : ExportingDiagramFixture, IAsyncLifetime { - public ExportingDiagramTests() => Setup(); - [Fact] public void TestExportWithoutImages() { var diagrams = new Diagram[] { - ContextDiagramBuilder.Build() with { Title = "Diagram" }, - ContainerDiagramBuilder.Build() with { Title = "Diagram" }, - ComponentDiagramBuilder.Build() with { Title = "Diagram" }, - DeploymentDiagramBuilder.Build() with { Title = "Diagram" } + new ContextDiagram().Build() with { Title = "Diagram" }, + new ContainerDiagram().Build() with { Title = "Diagram" }, + new ComponentDiagram().Build() with { Title = "Diagram" }, + new DeploymentDiagram().Build() with { Title = "Diagram" } }; - using var session = new PlantumlSession(); - session.Export(diagrams); + new PlantumlContext().Export(diagrams); VerifyIfResourceFilesExists(); VerifyIfPumlFilesExists("diagram"); @@ -36,15 +36,14 @@ public void TestExportToSpecifiedPath() var diagrams = new Diagram[] { - ContextDiagramBuilder.Build() with { Title = "Diagram" }, - ContainerDiagramBuilder.Build() with { Title = "Diagram" }, - ComponentDiagramBuilder.Build() with { Title = "Diagram" }, - DeploymentDiagramBuilder.Build() with { Title = "Diagram" } + new ContextDiagram().Build() with { Title = "Diagram" }, + new ContainerDiagram().Build() with { Title = "Diagram" }, + new ComponentDiagram().Build() with { Title = "Diagram" }, + new DeploymentDiagram().Build() with { Title = "Diagram" } }; var pathSave = new DirectoryInfo(path).FullName; - - new PlantumlSession() + new PlantumlContext() .UseDiagramImageBuilder() .Export(pathSave, diagrams); @@ -60,13 +59,13 @@ public void TestExportOnlyPngToDefaultPath() { var diagrams = new Diagram[] { - ContextDiagramBuilder.Build() with { Title = "Diagram" }, - ContainerDiagramBuilder.Build() with { Title = "Diagram" }, - ComponentDiagramBuilder.Build() with { Title = "Diagram" }, - DeploymentDiagramBuilder.Build() with { Title = "Diagram" } + new ContextDiagram().Build() with { Title = "Diagram" }, + new ContainerDiagram().Build() with { Title = "Diagram" }, + new ComponentDiagram().Build() with { Title = "Diagram" }, + new DeploymentDiagram().Build() with { Title = "Diagram" } }; - new PlantumlSession() + new PlantumlContext() .UseDiagramImageBuilder() .Export(diagrams); @@ -81,13 +80,13 @@ public void TestExportOnlySvgToDefaultPath() { var diagrams = new Diagram[] { - ContextDiagramBuilder.Build() with { Title = "Diagram" }, - ContainerDiagramBuilder.Build() with { Title = "Diagram" }, - ComponentDiagramBuilder.Build() with { Title = "Diagram" }, - DeploymentDiagramBuilder.Build() with { Title = "Diagram" } + new ContextDiagram().Build() with { Title = "Diagram" }, + new ContainerDiagram().Build() with { Title = "Diagram" }, + new ComponentDiagram().Build() with { Title = "Diagram" }, + new DeploymentDiagram().Build() with { Title = "Diagram" } }; - new PlantumlSession() + new PlantumlContext() .UseDiagramSvgImageBuilder() .Export(diagrams); @@ -102,13 +101,13 @@ public void TestExportPngAndSvgToDefaultPath() { var diagrams = new Diagram[] { - ContextDiagramBuilder.Build() with { Title = "Diagram" }, - ContainerDiagramBuilder.Build() with { Title = "Diagram" }, - ComponentDiagramBuilder.Build() with { Title = "Diagram" }, - DeploymentDiagramBuilder.Build() with { Title = "Diagram" } + new ContextDiagram().Build() with { Title = "Diagram" }, + new ContainerDiagram().Build() with { Title = "Diagram" }, + new ComponentDiagram().Build() with { Title = "Diagram" }, + new DeploymentDiagram().Build() with { Title = "Diagram" } }; - new PlantumlSession() + new PlantumlContext() .UseDiagramImageBuilder() .UseDiagramSvgImageBuilder() .Export(diagrams); @@ -119,5 +118,15 @@ public void TestExportPngAndSvgToDefaultPath() VerifyIfSvgFilesExists("diagram"); } - public void Dispose() => CleanUp(); + public Task InitializeAsync() + { + Setup(); + return Task.CompletedTask; + } + + public Task DisposeAsync() + { + CleanUp(); + return Task.CompletedTask; + } } diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ComponentDiagramBuilder.cs b/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ComponentDiagramBuilder.cs deleted file mode 100644 index ae50a40..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ComponentDiagramBuilder.cs +++ /dev/null @@ -1,50 +0,0 @@ -using C4Sharp.Diagrams; -using C4Sharp.Diagrams.Core; -using C4Sharp.Models; -using static C4Sharp.IntegratedTests.Stubs.Models.Components; -using static C4Sharp.IntegratedTests.Stubs.Models.Containers; -using static C4Sharp.IntegratedTests.Stubs.Models.Systems; - -namespace C4Sharp.IntegratedTests.Stubs.Diagrams; -public static class ComponentDiagramBuilder -{ - public static ComponentDiagram Build() => new() - { - Title = "Internet Banking System API Application", - FlowVisualization = DiagramLayout.LeftRight, - LayoutAsSketch = true, - Structures = new Structure[] - { - Spa, - MobileApp, - SqlDatabase, - Mainframe, - Boundary(), - }, - Relationships = new[] - { - (Spa > Sign)["Uses", "JSON/HTTPS"], - (Spa > Accounts)["Uses", "JSON/HTTPS"], - (MobileApp > Sign)["Uses", "JSON/HTTPS"], - (MobileApp > Accounts)["Uses", "JSON/HTTPS"], - } - }; - - private static ContainerBoundary Boundary() => new("c1", "API Application") - { - Components = new[] - { - Sign, - Accounts, - Security, - MainframeFacade - }, - Relationships = new[] - { - Sign > Security, - Accounts > MainframeFacade, - (Security > SqlDatabase)["Read & write to", "JDBC"], - (MainframeFacade > Mainframe)["Uses", "XML/HTTPS"] - } - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContainerDiagramBuilder.cs b/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContainerDiagramBuilder.cs deleted file mode 100644 index 65cd148..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContainerDiagramBuilder.cs +++ /dev/null @@ -1,49 +0,0 @@ -using C4Sharp.Diagrams.Core; -using C4Sharp.IntegratedTests.Stubs.Models; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; -using static C4Sharp.IntegratedTests.Stubs.Models.Containers; - -namespace C4Sharp.IntegratedTests.Stubs.Diagrams; -public static class ContainerDiagramBuilder -{ - public static ContainerDiagram Build() => new() - { - ShowLegend = true, - Title = "Container diagram for Internet Banking System", - Structures = new Structure[] - { - People.Customer, - Boundary(), - Systems.BankingSystem, - Systems.MailSystem, - }, - Relationships = new[] - { - (People.Customer > WebApp)["Uses", "HTTPS"], - (People.Customer > Spa)["Uses", "HTTPS"], - (People.Customer > MobileApp)["Uses"], - - (WebApp > Spa)["Delivers"][Position.Neighbor], - (Spa > BackendApi)["Uses", "async, JSON/HTTPS"], - (MobileApp > BackendApi)["Uses", "async, JSON/HTTPS"], - (SqlDatabase < BackendApi)["Uses", "async, JSON/HTTPS"][Position.Neighbor], - - (People.Customer < Systems.MailSystem)["Sends e-mails to"], - (Systems.MailSystem < BackendApi)["Sends e-mails using", "sync, SMTP"], - (BackendApi > Systems.BankingSystem)["Uses", "sync/async, XML/HTTPS"][Position.Neighbor] - } - }; - - private static SoftwareSystemBoundary Boundary() => new("c1", "Internet Banking") - { - Containers = new[] - { - WebApp, - Spa, - MobileApp, - SqlDatabase, - BackendApi - } - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContextDiagramBuilder.cs b/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContextDiagramBuilder.cs deleted file mode 100644 index 18b6e86..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/ContextDiagramBuilder.cs +++ /dev/null @@ -1,28 +0,0 @@ -using C4Sharp.Diagrams.Core; -using C4Sharp.Models; -using static C4Sharp.IntegratedTests.Stubs.Models.People; -using static C4Sharp.IntegratedTests.Stubs.Models.Systems; -using static C4Sharp.Models.Relationships.Position; - -namespace C4Sharp.IntegratedTests.Stubs.Diagrams; -public static class ContextDiagramBuilder -{ - public static ContextDiagram Build() => new() - { - Title = "System Context diagram for Internet Banking System", - Structures = new Structure[] - { - Customer, - BankingSystem, - Mainframe, - MailSystem - }, - Relationships = new[] - { - Customer > BankingSystem, - (Customer < MailSystem)["Sends e-mails to"], - (BankingSystem > MailSystem)["Sends e-mails", "SMTP"][Neighbor], - BankingSystem > Mainframe, - } - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/DeploymentDiagramBuilder.cs b/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/DeploymentDiagramBuilder.cs deleted file mode 100644 index 7a7501d..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Diagrams/DeploymentDiagramBuilder.cs +++ /dev/null @@ -1,41 +0,0 @@ -using C4Sharp.Diagrams.Supplementary; -using C4Sharp.IntegratedTests.Stubs.Models; -using C4Sharp.Models; -using C4Sharp.Models.Relationships; - -namespace C4Sharp.IntegratedTests.Stubs.Diagrams; - -public static class DeploymentDiagramBuilder -{ - public static DeploymentDiagram Build() => new() - { - Title = "System Context diagram for Internet Banking System", - Structures = new Structure[] - { - BigBankNode(), - Nodes.Ios("ios", Containers.MobileApp), - Nodes.PersonalComputer("computer", Nodes.Browser("browser", Containers.Spa)) - }, - Relationships = new[] - { - (Containers.MobileApp > Containers.BackendApi)["Makes API calls to", "json/HTTPS"], - (Containers.Spa > Containers.BackendApi)["Makes API calls to", "json/HTTPS"], - (Containers.WebApp > Containers.Spa)["Delivers to the customer's web browser"][Position.Up], - (Containers.BackendApi > Containers.OracleDatabase[1])["Writes to", "JDBC"], - (Containers.BackendApi < Containers.OracleDatabase[2])["Reads from", "JDBC"], - (Containers.OracleDatabase[1] > Containers.OracleDatabase[2])["Replicates data to", "JDBC"][Position.Right], - } - }; - - private static DeploymentNode BigBankNode() => new("plc", "Big Bank plc") - { - Description = "Big Bank plc data center", - Nodes = new[] - { - Nodes.Ubuntu("dn", "bigbank-api***\tx8", Nodes.ApacheTomCat("apache", Containers.BackendApi)), - Nodes.Ubuntu("bigbankdb01", "bigbank-db01", Nodes.OracleNode("oracle", Containers.OracleDatabase[1])), - Nodes.Ubuntu("bigbankdb02", "bigbank-db02", Nodes.OracleNode("oracle2", Containers.OracleDatabase[2])), - Nodes.Ubuntu("bb2", "bigbank-web***\tx4", Nodes.ApacheTomCat("apache2", Containers.WebApp)), - } - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Models/Components.cs b/tests/C4Sharp.IntegratedTests/Stubs/Models/Components.cs deleted file mode 100644 index b7be08f..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Models/Components.cs +++ /dev/null @@ -1,39 +0,0 @@ -using C4Sharp.Models; - -namespace C4Sharp.IntegratedTests.Stubs.Models; - -public static class Components -{ - private static Component _sign; - - public static Component Sign => _sign ??= new Component("sign", "Sign In Controller") - { - Description = "Allows users to sign in to the internet banking system", - Technology = "MVC Rest Controller", - }; - - private static Component _accounts; - - public static Component Accounts => _accounts ??= new Component("accounts", "Accounts Summary Controller") - { - Description = "Provides customers with a summary of their bank accounts", - Technology = "MVC Rest Controller" - }; - - private static Component _security; - - public static Component Security => _security ??= new Component("security", "Security Component") - { - Description = "Provides functionality related to singing in, changing passwords, etc.", - Technology = "Spring Bean" - }; - - private static Component _mainframeFacade; - - public static Component MainframeFacade => _mainframeFacade ??= - new Component("mbsfacade", "Mainframe Banking System Facade") - { - Description = "A facade onto the mainframe banking system.", - Technology = "C#, Class Library" - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Models/Containers.cs b/tests/C4Sharp.IntegratedTests/Stubs/Models/Containers.cs deleted file mode 100644 index 99dbbee..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Models/Containers.cs +++ /dev/null @@ -1,67 +0,0 @@ -using C4Sharp.Models; - -namespace C4Sharp.IntegratedTests.Stubs.Models; - -public static class Containers -{ - private static Container _webApp; - - public static Container WebApp => _webApp ??= new Container( - "WebApp", "WebApp") - { - ContainerType = ContainerType.WebApplication, - Description = "Delivers the static content and the Internet banking SPA", - Technology = "C#, WebApi" - }; - - private static Container _spa; - - public static Container Spa => _spa ??= new Container( - "Spa", "SPA") - { - ContainerType = ContainerType.Spa, - Description = "Provides all the Internet banking functionality to customers via their web browser", - Technology = "JavaScript, Angular" - }; - - private static Container _mobileApp; - - public static Container MobileApp => _mobileApp ??= new Container( - "MobileApp", "MobileApp") - { - ContainerType = ContainerType.Mobile, - Description = - "Provides a limited subset of the Internet banking functionality to customers via their mobile device", - Technology = "C#, Xamarin" - }; - - private static Container _sqlDatabase; - - public static Container SqlDatabase => _sqlDatabase ??= new Container( - "Database", "SqlDatabase") - { - ContainerType = ContainerType.Database, - Description = "Stores user registration information, hashed auth credentials, access logs, etc.", - Technology = "SQL Database" - }; - - private static Container _oracleDatabase; - - public static Container OracleDatabase => _oracleDatabase ??= new Container( - "Database", "OracleDatabase") - { - ContainerType = ContainerType.Database, - Description = "Stores user registration information, hashed auth credentials, access logs, etc.", - Technology = "Oracle Database" - }; - - private static Container _backendApi; - - public static Container BackendApi => _backendApi ??= new Container( - "BackendApi", "BackendApi") - { - ContainerType = ContainerType.Api, - Description = "Provides Internet banking functionality via API.", - Technology = "Dotnet, Docker Container" - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Models/Nodes.cs b/tests/C4Sharp.IntegratedTests/Stubs/Models/Nodes.cs deleted file mode 100644 index ca00a6b..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Models/Nodes.cs +++ /dev/null @@ -1,56 +0,0 @@ -using C4Sharp.Models; - -namespace C4Sharp.IntegratedTests.Stubs.Models; - -public static class Nodes -{ - public static DeploymentNode ApacheTomCat(string alias, Container container) => new(alias, "Apache Tomcat") - { - Description = "Apache Tomcat 8.x", - Properties = new Dictionary - { - ["Java Version"] = "8", - ["Xmx"] = "512M", - ["Xms"] = "1024M", - }, - Container = container - }; - - public static DeploymentNode OracleNode(string alias, Container container) => new(alias, "Oracle - Primary") - { - Description = "Oracle 12c", - Container = container - }; - - public static DeploymentNode Ubuntu(string alias, string label, DeploymentNode node) => new(alias, label) - { - Description = "Ubuntu 16.04 LTS", - Nodes = new[] { node } - }; - - public static DeploymentNode Ios(string alias, Container container) => new(alias, "Customer's mobile device") - { - Description = "Apple IOS", - Container = container - }; - - public static DeploymentNode Android(string alias, Container container) => - new(alias, "Customer's mobile device") - { - Description = "Android", - Container = container - }; - - public static DeploymentNode PersonalComputer(string alias, DeploymentNode node) => - new(alias, "Customer's computer") - { - Description = "Mircosoft Windows and Apple macOS", - Nodes = new[] { node } - }; - - public static DeploymentNode Browser(string alias, Container container) => new(alias, "Web Browser") - { - Description = "Google Chrome, Mozilla Firefox, Apple Safari or Microsoft Edge", - Container = container - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Models/People.cs b/tests/C4Sharp.IntegratedTests/Stubs/Models/People.cs deleted file mode 100644 index d5824d0..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Models/People.cs +++ /dev/null @@ -1,13 +0,0 @@ -using C4Sharp.Models; - -namespace C4Sharp.IntegratedTests.Stubs.Models; - -public static class People -{ - private static Person _customer; - - public static Person Customer => _customer ??= new Person("customer", "Personal Banking Customer") - { - Description = "A customer of the bank, with personal bank accounts." - }; -} diff --git a/tests/C4Sharp.IntegratedTests/Stubs/Models/Systems.cs b/tests/C4Sharp.IntegratedTests/Stubs/Models/Systems.cs deleted file mode 100644 index 9c430a9..0000000 --- a/tests/C4Sharp.IntegratedTests/Stubs/Models/Systems.cs +++ /dev/null @@ -1,36 +0,0 @@ -using C4Sharp.Models; -using C4Sharp.Models.Relationships; - -namespace C4Sharp.IntegratedTests.Stubs.Models; - -public static class Systems -{ - private static SoftwareSystem _bankingSystem; - - public static SoftwareSystem BankingSystem => _bankingSystem ??= new SoftwareSystem( - "BankingSystem", - "Internet Banking System") - { - Description = "Allows customers to view information about their bank accounts, and make payments." - }; - - private static SoftwareSystem _mainframe; - - public static SoftwareSystem Mainframe => _mainframe ??= new SoftwareSystem( - "Mainframe", - "Mainframe Banking System") - { - Description = "Stores all of the core banking information about customers, accounts, transactions, etc.", - Boundary = Boundary.External - }; - - private static SoftwareSystem _mailSystem; - - public static SoftwareSystem MailSystem => _mailSystem ??= new SoftwareSystem( - "MailSystem", - "E-mail system") - { - Description = "The internal Microsoft Exchange e-mail system.", - Boundary = Boundary.External - }; -} From 01e85f2074a9908d6fa35313e356309206a1b7ed Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:13:12 -0300 Subject: [PATCH 11/12] Update sln --- C4Sharp.sln | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/C4Sharp.sln b/C4Sharp.sln index 7ba3524..ac947be 100644 --- a/C4Sharp.sln +++ b/C4Sharp.sln @@ -10,14 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Sharp", "src\C4Sharp\C4Sh EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Sharp.IntegratedTests", "tests\C4Sharp.IntegratedTests\C4Sharp.IntegratedTests.csproj", "{652679C0-4067-4ED5-8D97-48A765E7A965}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Sharp.UnitTests", "tests\C4Sharp.UnitTests\C4Sharp.UnitTests.csproj", "{4B6E0F06-65DA-43FB-A984-A08DC6B66665}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Sharp.Tools", "src\C4Sharp.Tools\C4Sharp.Tools.csproj", "{AEF17681-C9AB-4C49-8B06-06E5AF8C4237}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Bank.Deposit", "samples\C4Bank\C4Bank.Deposit\C4Bank.Deposit.csproj", "{DF24F4F5-0404-4B8F-9549-69222A1620A7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "C4Bank", "C4Bank", "{7F4EACE0-1CC1-44B0-A038-3D74E00A9572}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Basic", "Basic", "{EBA828C5-ACB9-4B6E-9513-BF4F612ECEAA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4Sharp.Sample", "samples\Basic\C4Sharp.Sample\C4Sharp.Sample.csproj", "{CEAA41B3-F197-4663-A845-E4F5DB7DC2E8}" @@ -36,18 +30,10 @@ Global {652679C0-4067-4ED5-8D97-48A765E7A965}.Debug|Any CPU.Build.0 = Debug|Any CPU {652679C0-4067-4ED5-8D97-48A765E7A965}.Release|Any CPU.ActiveCfg = Release|Any CPU {652679C0-4067-4ED5-8D97-48A765E7A965}.Release|Any CPU.Build.0 = Release|Any CPU - {4B6E0F06-65DA-43FB-A984-A08DC6B66665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B6E0F06-65DA-43FB-A984-A08DC6B66665}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B6E0F06-65DA-43FB-A984-A08DC6B66665}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B6E0F06-65DA-43FB-A984-A08DC6B66665}.Release|Any CPU.Build.0 = Release|Any CPU {AEF17681-C9AB-4C49-8B06-06E5AF8C4237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AEF17681-C9AB-4C49-8B06-06E5AF8C4237}.Debug|Any CPU.Build.0 = Debug|Any CPU {AEF17681-C9AB-4C49-8B06-06E5AF8C4237}.Release|Any CPU.ActiveCfg = Release|Any CPU {AEF17681-C9AB-4C49-8B06-06E5AF8C4237}.Release|Any CPU.Build.0 = Release|Any CPU - {DF24F4F5-0404-4B8F-9549-69222A1620A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF24F4F5-0404-4B8F-9549-69222A1620A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF24F4F5-0404-4B8F-9549-69222A1620A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF24F4F5-0404-4B8F-9549-69222A1620A7}.Release|Any CPU.Build.0 = Release|Any CPU {CEAA41B3-F197-4663-A845-E4F5DB7DC2E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CEAA41B3-F197-4663-A845-E4F5DB7DC2E8}.Debug|Any CPU.Build.0 = Debug|Any CPU {CEAA41B3-F197-4663-A845-E4F5DB7DC2E8}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -56,10 +42,7 @@ Global GlobalSection(NestedProjects) = preSolution {B3850A7A-EBB2-4C33-827B-98B88901A638} = {758DA496-3186-4129-B0FA-5C3205B52763} {652679C0-4067-4ED5-8D97-48A765E7A965} = {2EAFABEF-1FBB-4DEB-A620-52CBF42F1736} - {4B6E0F06-65DA-43FB-A984-A08DC6B66665} = {2EAFABEF-1FBB-4DEB-A620-52CBF42F1736} {AEF17681-C9AB-4C49-8B06-06E5AF8C4237} = {758DA496-3186-4129-B0FA-5C3205B52763} - {7F4EACE0-1CC1-44B0-A038-3D74E00A9572} = {53454ACB-CE39-4F53-AB32-C28C15720537} - {DF24F4F5-0404-4B8F-9549-69222A1620A7} = {7F4EACE0-1CC1-44B0-A038-3D74E00A9572} {EBA828C5-ACB9-4B6E-9513-BF4F612ECEAA} = {53454ACB-CE39-4F53-AB32-C28C15720537} {CEAA41B3-F197-4663-A845-E4F5DB7DC2E8} = {EBA828C5-ACB9-4B6E-9513-BF4F612ECEAA} EndGlobalSection From f42049cf07e1f1e1a479400b07e4db6fceac3566 Mon Sep 17 00:00:00 2001 From: yanjustino Date: Sun, 25 Dec 2022 23:26:00 -0300 Subject: [PATCH 12/12] update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ae1e352..ee839ba 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,7 @@ public class ContainerDiagram : DiagramBuildRunner protected override string Title => "C4Bank Context of Deposit Area"; protected override DiagramType DiagramType => DiagramType.Container; - - protected override IEnumerable Structures() => new Structure[] + protected override IEnumerable Structures => new Structure[] { new Person("Customer", "Customer", "Bank Customer"), new SoftwareSystem("OTBank.Finance", "Finance", "OTBank Finance System", Boundary.External), @@ -57,7 +56,7 @@ public class ContainerDiagram : DiagramBuildRunner ), }; - protected override IEnumerable Relationships() => new[] + protected override IEnumerable Relationships => new[] { It("Customer") > It("OTBank.Finance") | "send deposit", It("OTBank.Finance") > It() | ("POST", "HTTP"), @@ -73,7 +72,6 @@ public class ContainerDiagram : DiagramBuildRunner } ``` Code 1 - container diagram as code -see the complete code [here](./samples/C4Bank/C4Bank.Deposit/Architecure/ContainerDiagram.cs) ### Compiling There are two strategies for compiling diagrams in your project: self-compiling and using the `C4SCLI` tool. @@ -94,8 +92,6 @@ internal static class Program new PlantumlSession() .UseDiagramImageBuilder() .UseDiagramSvgImageBuilder() - .UseStandardLibraryBaseUrl() - .UseHtmlPageBuilder() .Export(diagrams); } } @@ -107,7 +103,7 @@ internal static class Program The `C4SCLI` can be used in DevOps pipelines, removing the need to manually compile diagrams. For this, install `C4SCLI` tool and execute de the following command: ```shell -$ c4scli build [-o ] [-d ] +$ c4scli build [-o ] ``` ⚠️ *only compatible with projects using c4sharp version 5.0+*