@gruum/cli 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/gruum.mjs +105 -98
- package/package.json +1 -1
package/gruum.mjs
CHANGED
|
@@ -1,124 +1,125 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{chmodSync as
|
|
3
|
-
`),process.exit(130)})}var ri=new Set(["display","position","inset","top","right","bottom","left","z-index","order","flex","flex-grow","flex-shrink","flex-basis","align-self","justify-self","align-items","justify-content","place-items","place-content","gap","text-align","min-width","max-width","overflow","white-space","cursor"]),oi=new Set(["page","index","layout","route","default"]);function ii(e){return ri.has(e.property)||/^(margin|transition|grid-)/.test(e.property)?!0:(e.property==="width"||e.property==="height")&&/^(100%|auto)$/.test(e.value)}function Ve(e){return e.flatMap(t=>t.declarations.filter(n=>!ii(n)).map(n=>`${t.state}|${t.context}|${n.property}:${n.value}`)).sort().join(";")}function ai(e){return Ve(e.states)}function li(e){return e.states.filter(t=>t.state==="default"&&t.context==="").flatMap(t=>t.declarations)}function ns(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ci(e){let t=e.via?/^bg-([\w-]+?)(?:\/(\d+))?$/.exec(e.via):null;if(t){let s=t[1].replace(/-/g," ");return ns(t[2]?`${s} ${t[2]}%`:s)}let n=/var\(\s*--(?:color-)?([\w-]+)/.exec(e.value)?.[1];return ns((n??e.value).replace(/-/g," "))}function ui(e){let t=li(e),n=p=>t.findLast(f=>f.property===p),s=n("background-color")??n("background"),r=s!==void 0&&!/^(transparent|none|initial|inherit)\b/.test(s.value),o=n("border-width")?.value,i=o!==void 0&&!/^0(px)?$/.test(o)&&n("border-style")?.value!=="none",a=n("width")?.value,l=a!==void 0&&a===n("height")?.value&&!/^(auto|100%|fit-content)$/.test(a);return n("inset")?.value==="0"?"Overlay":i?l?"Outline icon":"Outline":r?`${ci(s)} ${l?"icon":"fill"}`:l?"Icon":t.some(p=>p.property.startsWith("padding")||p.property==="border-radius"||p.property==="height"&&p.value!=="auto")?"Ghost":"Text"}function pi(e){let t=e.split("/"),n=(t.pop()??e).replace(/\.[^.]+$/,""),s=t.pop();return oi.has(n)&&s?`${s}/${n}`:n}function fi(e){let t=[...new Set(e.map(s=>pi(s.path)))],n=t.slice(0,2).join(", ");return t.length>2?`${n} +${t.length-2}`:n}var ss=(e,t)=>e.path.localeCompare(t.path)||e.line-t.line;function rs(e){let t=new Map;for(let r of e){let o=ui(r.variant),i=t.get(o)??new Map,a=ai(r.variant),l=i.get(a)??{looks:[],sites:[]};l.looks.push(r.variant),l.sites.push(...r.sites),i.set(a,l),t.set(o,i)}let n=[],s=new Map;for(let[r,o]of t){let i=[...o.values()];for(let h of i)h.sites.sort(ss);i.sort((h,C)=>C.sites.length-h.sites.length||ss(h.sites[0],C.sites[0]));let[a,...l]=i,c=a.looks[0],p=l.map(h=>fi(h.sites)),f=l.map((h,C)=>{let w=h.looks[0],d={title:p.filter(u=>u===p[C]).length>1?`${p[C]} \xB7 line ${h.sites[0].line}`:p[C],selector:w.selector,path:h.sites[0].path,line:h.sites[0].line,element:w.element,usage:w.usage,states:w.states,alike:!0};return s.set(d,h.sites),d}),m={...c,title:r,axis:null,base:!1,path:a.sites[0].path,line:a.sites[0].line,markup:!0,...f.length?{modifiers:f}:{}};s.set(m,a.sites),n.push(m)}return{variants:n,sites:s}}var as=1,ls=["style.new","state.changed","state.missing","token.unknown","value.hardcoded","native.element","prop.unknown","style.removed","guidance.rule"],Bt={"style.new":"block","state.changed":"block","state.missing":"block","token.unknown":"block","value.hardcoded":"block","native.element":"block","prop.unknown":"block","style.removed":"warn","guidance.rule":"warn"};function Vt(e){let t=0;for(let n=0;n<e.length;n++)t=t*33+e.charCodeAt(n)>>>0;return t.toString(36)}function os(e){let t=`${e.path}::${e.selector}`;return`v2-style-${t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)}-${Vt(t)}`}function le(e){return e.context?`${e.state} @ ${e.context}`:e.state}var di=/var\(\s*(--[\w-]+)/g;function gi(e){let t=new Set;for(let n of e)for(let s of n.declarations)for(let r of s.value.matchAll(di))t.add(r[1]);return[...t].sort()}function mi(e){let t=new Map;for(let n of e)t.set(n.property,n.value.trim());return[...t].map(([n,s])=>({property:n,value:s})).sort((n,s)=>n.property.localeCompare(s.property))}function hi(e){let t=new Map;for(let n of e){let s=le(n),r=t.get(s),o=mi([...r?.declarations??[],...n.declarations]);t.set(s,{state:n.state,context:n.context,declarations:o})}return[...t.values()]}function cs(e){let t=new Map,n=(s,r,o)=>{let i=os(s),a=t.get(i),l=hi([...a?bi(a.states):[],...r]),c=a?.stateLines??new Map;for(let p of r)c.has(le(p))||c.set(le(p),p.line);t.set(i,{...a??s,id:i,states:l,tokens:gi(l),line:a?.line??o,stateLines:c})};for(let s of e){let r=os(s);n({kind:"look",title:s.title,selector:s.selector,path:s.path,axis:s.axis,...s.usage.via?{selectedBy:s.usage.via}:{},...s.element?{element:s.element.tag}:{},...s.markup?{markup:!0}:{}},s.states,s.line);for(let o of s.modifiers??[])n({kind:"modifier",title:`${s.title} \xB7 ${o.title}`,selector:o.selector,path:o.path,hostId:r,...o.usage.via?{selectedBy:o.usage.via}:{},...o.element?{element:o.element.tag}:{},...o.alike?{markup:!0}:{}},o.states,o.line);for(let o of s.contexts??[])n({kind:"context",title:`${s.title} in ${o.selector}`,selector:o.selector,path:o.path,hostId:r,role:o.role,...o.element?{element:o.element.tag}:{}},o.states,o.line)}return t}function bi(e){return e.map(t=>({state:t.state,context:t.context,line:0,declarations:t.declarations}))}function yi(e){let t=new Map,n=/^:root\{([^}]*)\}/.exec(e);if(!n)return t;for(let s of n[1].split(";")){let r=s.indexOf(":");if(r<=0)continue;let o=s.slice(0,r).trim();o.startsWith("--")&&t.set(o,s.slice(r+1).trim())}return t}var is=/^(\d+) native /;function xi(e,t){if(e==="native")return`native:${t.refs[0]?.path??""}`;if(t.styles?.length){let n=[...new Set(t.refs.map(s=>s.path))].sort().join(",");return`${e}:${[...t.styles].sort().join(",")}:${n}`}return`${e}:${t.refs.map(n=>n.path).join(",")}:${t.message}`}var tt={hardcoded:"value.hardcoded",native:"native.element",props:"prop.unknown"},wi=new Set(Object.values(tt));var ki={"value.hardcoded":()=>"Replace each literal with the spec token named, or with a spec token for that property.","native.element":e=>`Render ${e.components[0]??"the shared component"} instead of a raw <button>, or ask for an exception.`,"prop.unknown":()=>"Use one of the values listed, or ask for an exception to add the look."};function us(e){let t=[];for(let n of e.audit)if(n.status==="attention")for(let s of n.findings)t.push({check:n.id,finding:s,key:xi(n.id,s)});return t}function Tt(e){return`${e.path}#${Vt(e.text.replace(/\s+/g," ").trim())}`}function ps(e,t={}){let n=yi(e.previewCss),s=[...cs(e.variants).values()].map(({line:i,stateLines:a,...l})=>l),r=new Set(e.tokens.map(i=>i.name)),o=[];for(let i of e.guidance.files)if(i.kind!=="record")for(let a of i.passages)a.rule&&o.push({path:a.path,headings:a.headings,text:a.text,styles:a.styles});return{schema:as,concept:e.concept,label:e.label,version:t.version??0,sourceRef:e.repo.ref,publishedAt:t.publishedAt??null,components:[...e.components].sort(),tokens:[...new Set([...e.tokens.map(i=>i.name),...s.flatMap(i=>i.tokens).filter(i=>!r.has(i))])].map(i=>{let a=n.get(i);return a===void 0?{name:i}:{name:i,value:a}}).sort((i,a)=>i.name.localeCompare(a.name)),styles:s,rules:o,content:e.content.map(i=>i.id),acceptedFindings:us(e).filter(({check:i})=>i in tt).map(({check:i,finding:a,key:l})=>({check:i,key:l,message:a.message})),settings:{severity:{...Bt,...t.settings?.severity??{}}}}}function vi(e,t){let n=new Map(e.map(o=>[o.property,o.value])),s=new Map(t.map(o=>[o.property,o.value])),r=[];for(let[o,i]of s){let a=n.get(o);a===void 0?r.push(`added ${o}: ${i}`):a!==i&&r.push(`${o}: ${a} \u2192 ${i}`)}for(let[o,i]of n)s.has(o)||r.push(`removed ${o}: ${i}`);return r}function Ft(e){return e.map(t=>`${t.property}: ${t.value}`).join("; ")}function Dt(e,t){return e.length>t?`${e.slice(0,t).join(", ")}, and ${e.length-t} more`:e.join(", ")}function $i(e,t){let n=e.replace(/^--/,"").split("-")[0]??"",s=n?t.filter(r=>r.startsWith(`--${n}`)):[];return(s.length?s:t).slice(0,3)}function fs(e,t){let n={...Bt,...t.settings.severity},s=[],r=(u,g="")=>{s.push({id:`${u.kind}:${Vt(`${u.styleId??""}|${u.state??""}|${g}`)}`,severity:n[u.kind],...u})},o=cs(e.variants),i=new Map(t.styles.map(u=>[u.id,u])),a=t.styles.filter(u=>u.kind==="look"),l=new Set([...t.tokens.map(u=>u.name),...t.styles.flatMap(u=>u.tokens)]),c=[...l],p=new Map;for(let u of t.styles)u.markup&&p.set(Ve(u.states),u);let f=new Map;for(let u of o.values()){if(!u.markup)continue;let g=p.get(Ve(u.states));g&&f.set(u.id,g)}let m=new Set([...f.values()].map(u=>u.id)),h=u=>u.markup?`${u.title} (as in ${u.path})`:u.selector;for(let u of o.values()){if(i.has(u.id)||f.has(u.id))continue;let g=u.hostId?i.get(u.hostId):void 0,y=u.markup?a.filter(I=>I.markup):a,k=y.filter(I=>I.path===u.path),x=(k.length?k:y).map(h),$=u.markup?`This one-off ${u.element??"button"} (${Dt((u.states[0]?.declarations??[]).map(I=>`${I.property}: ${I.value}`),3)})`:u.selector,j=u.markup?t.components.length?`render ${t.components[0]} with a spec look,`:x.length?`copy ${Dt(x,3)},`:"use a spec style,":g?`restyle ${g.selector} only through spec modifiers`:x.length?`use ${Dt(x,3)},`:"use a spec style,";r({kind:"style.new",styleId:u.id,title:`${u.title} is not in the spec`,baseline:null,observed:{declarations:u.states[0]?.declarations??[],states:u.states,...u.markup?{markup:!0}:{}},refs:[{path:u.path,line:u.line}],fix:`${$} is not in the spec; ${j} or ask for an exception.`},u.markup?Ve(u.states):u.selector)}for(let u of o.values()){let g=i.get(u.id);if(!g)continue;let y=new Map(g.states.map(k=>[le(k),k]));for(let k of u.states){let x=le(k),$=y.get(x),j=vi($?.declarations??[],k.declarations);j.length!==0&&r({kind:"state.changed",styleId:u.id,title:$?`${u.title}: ${x} changed`:`${u.title}: new ${x} state`,state:x,baseline:$?{declarations:$.declarations}:null,observed:{declarations:k.declarations},refs:[{path:u.path,line:u.stateLines.get(x)??u.line}],fix:$?`Restore ${u.selector} ${x} to the spec (${j.slice(0,3).join("; ")}), or ask for an exception.`:`${x} is not a spec state of ${u.selector}; remove it, or ask for an exception.`},Ft(k.declarations))}}for(let u of o.values()){let g=i.get(u.id);if(!g)continue;let y=new Set(u.states.map(le));for(let k of g.states){let x=le(k);y.has(x)||r({kind:"state.missing",styleId:u.id,title:`${u.title}: ${x} state is missing`,state:x,baseline:{declarations:k.declarations},observed:null,refs:[{path:u.path,line:u.line}],fix:`Define ${u.selector} ${x} again: ${Ft(k.declarations)||"as in the spec"}.`})}}for(let u of o.values())for(let g of u.tokens){if(l.has(g))continue;let y=$i(g,c);r({kind:"token.unknown",styleId:u.id,title:`${u.title} reads ${g}, which is not a spec token`,baseline:null,observed:{token:g},refs:[{path:u.path,line:u.line}],fix:y.length?`Use a spec token such as ${y.join(", ")} instead of ${g}, or ask for an exception.`:`${g} is not a spec token; ask for an exception to add it.`},g)}let C=new Map;for(let u of t.acceptedFindings)C.set(u.key,[...C.get(u.key)??[],u]);let w=us(e).filter(({check:u})=>u in tt);for(let u of ls)if(wi.has(u))for(let{check:g,finding:y,key:k}of w){if(tt[g]!==u)continue;let x=C.get(k)??[];if(x.some(A=>!Ci(g,A.message,y.message)))continue;let $=x[0],j=y.styles?.[0],I=j?[...o.values()].find(A=>A.title===j):void 0;r({kind:u,styleId:I?.id??null,title:y.message,baseline:$?{message:$.message}:null,observed:{message:y.message,...u==="native.element"?{element:"button"}:{}},waiverKey:k,refs:y.refs.map(({path:A,line:R})=>({path:A,line:R})),fix:ki[u](t)},k)}for(let u of t.styles)o.has(u.id)||m.has(u.id)||r({kind:"style.removed",styleId:u.id,title:u.markup?`${u.title} is in the spec but no longer written anywhere`:`${u.title} is in the spec but no longer in CSS`,baseline:{declarations:u.states[0]?.declarations??[]},observed:null,refs:[{path:u.path,line:0}],fix:u.markup?`Nothing renders ${u.title} any more; ask the designer to retire it from the spec if that is intended.`:`Restore ${u.selector} in ${u.path}, or ask the designer to retire it from the spec.`});let v=new Map(e.guidance.files.map(u=>[u.path,u])),d=new Set;for(let u of e.guidance.files)for(let g of u.passages)g.rule&&d.add(Tt(g));for(let u of t.rules){if(d.has(Tt(u)))continue;let g=v.get(u.path);g&&g.total>g.passages.length||r({kind:"guidance.rule",styleId:null,title:`A written rule in ${u.path} changed or was removed`,baseline:{text:u.text},observed:null,refs:[{path:u.path,line:0}],fix:`Restore the rule under ${u.headings.join(" \u203A ")||u.path}, or publish a new spec.`},Tt(u))}return s}function Ci(e,t,n){if(t===n)return!1;if(e==="native"){let s=is.exec(t)?.[1],r=is.exec(n)?.[1];if(s&&r)return Number(r)>Number(s)}return!0}var Si={product:"Gruum button spec",what:"The designer-published spec for this repository's buttons. Write buttons against it; drift from it is checked deterministically.",howToUse:["Use the components listed in `components`; do not render a raw <button> where a component exists.","Pick a look from `looks`. `selectedBy` says which prop or attribute value selects it.","Use only the tokens listed in `tokens`. Do not write a literal color or size a token already has.","Follow `rules`; they are the repository's written rules, quoted.","Do not add a look, modifier, or state, and do not change a state's declarations.",'If the spec has no button for the job, stop and ask the user: "You asked for a design element that is not in the spec. 1. Use an existing spec style for it. 2. Add it as it is and request review." Do not write that look, and do not request a review, until they answer. Never edit generated Gruum files to make a check pass.']};function Ut(e){let t=(n,s)=>e.styles.filter(r=>r.hostId===n&&r.kind===s).map(r=>r.selector);return{about:{...Si,drift:ls.map(n=>({kind:n,severity:e.settings.severity[n]??Bt[n]}))},spec:{concept:e.concept,version:e.version,sourceRef:e.sourceRef,components:e.components,looks:e.styles.filter(n=>n.kind==="look").map(n=>({title:n.title,selector:n.selector,path:n.path,...n.selectedBy?{selectedBy:n.selectedBy}:{},tokens:n.tokens,states:Object.fromEntries(n.states.map(s=>[le(s),Ft(s.declarations)])),modifiers:t(n.id,"modifier"),contexts:t(n.id,"context")})),tokens:e.tokens,rules:e.rules.map(n=>({path:n.path,under:n.headings.join(" \u203A "),text:n.text}))}}}function Ue(e){if(!e||typeof e!="object")return null;let t=e;return t.schema!==as||typeof t.concept!="string"||!Array.isArray(t.styles)||!Array.isArray(t.tokens)||!Array.isArray(t.acceptedFindings)||!Array.isArray(t.rules)||!t.settings?.severity?null:t}function Ri(e){let t=new Map;for(let n of e){let s=n.refs[0]?.path??"(no file)";t.set(s,[...t.get(s)??[],n])}return[...t].sort(([n],[s])=>n.localeCompare(s))}function zt(e,t){if(t.length===0)return e;let n=new Set(t.map(s=>s.replace(/^\.\//,"")));return e.filter(s=>s.refs.some(r=>n.has(r.path)))}function ds(e,t,n={}){let s=[];if(e.length===0)return s.push(`No drift against spec v${t.baselineVersion} (${t.files} files indexed, ${t.skipped} skipped).`),s.join(`
|
|
4
|
-
`);for(let[o,i]of
|
|
5
|
-
`)}function
|
|
6
|
-
`)}var
|
|
7
|
-
${
|
|
2
|
+
import{chmodSync as gu,existsSync as De,rmSync as Xn}from"node:fs";import T from"node:path";import{createInterface as Yn}from"node:readline";function Fe(e){return e instanceof Error&&e.name==="AbortError"&&(e.message==="Aborted with Ctrl+C"||e.message==="Aborted with Ctrl+D")}function _e(e){e.on("SIGINT",()=>{process.stderr.write(`
|
|
3
|
+
`),process.exit(130)})}var ci=new Set(["display","position","inset","top","right","bottom","left","z-index","order","flex","flex-grow","flex-shrink","flex-basis","align-self","justify-self","align-items","justify-content","place-items","place-content","gap","text-align","min-width","max-width","overflow","white-space","cursor"]),ui=new Set(["page","index","layout","route","default"]);function pi(e){return ci.has(e.property)||/^(margin|transition|grid-)/.test(e.property)?!0:(e.property==="width"||e.property==="height")&&/^(100%|auto)$/.test(e.value)}function Be(e){return e.flatMap(t=>t.declarations.filter(n=>!pi(n)).map(n=>`${t.state}|${t.context}|${n.property}:${n.value}`)).sort().join(";")}function fi(e){return Be(e.states)}function di(e){return e.states.filter(t=>t.state==="default"&&t.context==="").flatMap(t=>t.declarations)}function rs(e){return e.charAt(0).toUpperCase()+e.slice(1)}function gi(e){let t=e.via?/^bg-([\w-]+?)(?:\/(\d+))?$/.exec(e.via):null;if(t){let s=t[1].replace(/-/g," ");return rs(t[2]?`${s} ${t[2]}%`:s)}let n=/var\(\s*--(?:color-)?([\w-]+)/.exec(e.value)?.[1];return rs((n??e.value).replace(/-/g," "))}function mi(e){let t=di(e),n=u=>t.findLast(f=>f.property===u),s=n("background-color")??n("background"),r=s!==void 0&&!/^(transparent|none|initial|inherit)\b/.test(s.value),o=n("border-width")?.value,i=o!==void 0&&!/^0(px)?$/.test(o)&&n("border-style")?.value!=="none",a=n("width")?.value,l=a!==void 0&&a===n("height")?.value&&!/^(auto|100%|fit-content)$/.test(a);return n("inset")?.value==="0"?"Overlay":i?l?"Outline icon":"Outline":r?`${gi(s)} ${l?"icon":"fill"}`:l?"Icon":t.some(u=>u.property.startsWith("padding")||u.property==="border-radius"||u.property==="height"&&u.value!=="auto")?"Ghost":"Text"}function hi(e){let t=e.split("/"),n=(t.pop()??e).replace(/\.[^.]+$/,""),s=t.pop();return ui.has(n)&&s?`${s}/${n}`:n}function bi(e){let t=[...new Set(e.map(s=>hi(s.path)))],n=t.slice(0,2).join(", ");return t.length>2?`${n} +${t.length-2}`:n}var os=(e,t)=>e.path.localeCompare(t.path)||e.line-t.line;function is(e){let t=new Map;for(let r of e){let o=mi(r.variant),i=t.get(o)??new Map,a=fi(r.variant),l=i.get(a)??{looks:[],sites:[]};l.looks.push(r.variant),l.sites.push(...r.sites),i.set(a,l),t.set(o,i)}let n=[],s=new Map;for(let[r,o]of t){let i=[...o.values()];for(let h of i)h.sites.sort(os);i.sort((h,w)=>w.sites.length-h.sites.length||os(h.sites[0],w.sites[0]));let[a,...l]=i,c=a.looks[0],u=l.map(h=>bi(h.sites)),f=l.map((h,w)=>{let C=h.looks[0],g={title:u.filter(p=>p===u[w]).length>1?`${u[w]} \xB7 line ${h.sites[0].line}`:u[w],selector:C.selector,path:h.sites[0].path,line:h.sites[0].line,element:C.element,usage:C.usage,states:C.states,alike:!0};return s.set(g,h.sites),g}),m={...c,title:r,axis:null,base:!1,path:a.sites[0].path,line:a.sites[0].line,markup:!0,places:a.sites.map(h=>({path:h.path,line:h.line})),...f.length?{modifiers:f}:{}};s.set(m,a.sites),n.push(m)}return{variants:n,sites:s}}var ls=1,cs=["style.new","state.changed","state.missing","token.unknown","value.hardcoded","native.element","prop.unknown","style.removed","guidance.rule"],Vt={"style.new":"block","state.changed":"block","state.missing":"block","token.unknown":"block","value.hardcoded":"block","native.element":"block","prop.unknown":"block","style.removed":"warn","guidance.rule":"warn"};function zt(e){let t=0;for(let n=0;n<e.length;n++)t=t*33+e.charCodeAt(n)>>>0;return t.toString(36)}function as(e){let t=`${e.path}::${e.selector}`;return`v2-style-${t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)}-${zt(t)}`}function le(e){return e.context?`${e.state} @ ${e.context}`:e.state}var yi=/var\(\s*(--[\w-]+)/g;function xi(e){let t=new Set;for(let n of e)for(let s of n.declarations)for(let r of s.value.matchAll(yi))t.add(r[1]);return[...t].sort()}function ki(e){let t=new Map;for(let n of e)t.set(n.property,n.value.trim());return[...t].map(([n,s])=>({property:n,value:s})).sort((n,s)=>n.property.localeCompare(s.property))}function wi(e){let t=new Map;for(let n of e){let s=le(n),r=t.get(s),o=ki([...r?.declarations??[],...n.declarations]);t.set(s,{state:n.state,context:n.context,declarations:o})}return[...t.values()]}function vi(e){let t=[{path:e.path,line:e.line},...e.places??[]],n=new Set;return t.filter(s=>{let r=`${s.path}:${s.line}`;return n.has(r)?!1:(n.add(r),!0)})}function us(e){let t=new Map,n=(s,r,o)=>{let i=as(s),a=t.get(i),l=wi([...a?$i(a.states):[],...r]),c=a?.stateLines??new Map;for(let u of r)c.has(le(u))||c.set(le(u),u.line);t.set(i,{...a??s,id:i,states:l,tokens:xi(l),line:a?.line??o,stateLines:c})};for(let s of e){let r=as(s);if(n({kind:"look",title:s.title,selector:s.selector,path:s.path,axis:s.axis,...s.usage.via?{selectedBy:s.usage.via}:{},...s.element?{element:s.element.tag}:{},...s.markup?{markup:!0}:{}},s.states,s.line),s.places?.length){let o=t.get(r);o&&(o.places=s.places)}for(let o of s.modifiers??[])n({kind:"modifier",title:`${s.title} \xB7 ${o.title}`,selector:o.selector,path:o.path,hostId:r,...o.usage.via?{selectedBy:o.usage.via}:{},...o.element?{element:o.element.tag}:{},...o.alike?{markup:!0}:{}},o.states,o.line);for(let o of s.contexts??[])n({kind:"context",title:`${s.title} in ${o.selector}`,selector:o.selector,path:o.path,hostId:r,role:o.role,...o.element?{element:o.element.tag}:{}},o.states,o.line)}return t}function $i(e){return e.map(t=>({state:t.state,context:t.context,line:0,declarations:t.declarations}))}function Ci(e){let t=new Map,n=/^:root\{([^}]*)\}/.exec(e);if(!n)return t;for(let s of n[1].split(";")){let r=s.indexOf(":");if(r<=0)continue;let o=s.slice(0,r).trim();o.startsWith("--")&&t.set(o,s.slice(r+1).trim())}return t}var Bt=/^(\d+) native /;function Si(e,t){if(e==="native")return`native:${t.refs[0]?.path??""}`;if(t.styles?.length){let n=[...new Set(t.refs.map(s=>s.path))].sort().join(",");return`${e}:${[...t.styles].sort().join(",")}:${n}`}return`${e}:${t.refs.map(n=>n.path).join(",")}:${t.message}`}var nt={hardcoded:"value.hardcoded",native:"native.element",props:"prop.unknown"},Ri=new Set(Object.values(nt));function ps(e){let t=e.find(n=>n.toLowerCase()==="button");return t||(e.length===1?e[0]:null)}var Ai={"value.hardcoded":()=>"Replace each literal with the spec token named, or with a spec token for that property.","native.element":e=>{let t=ps(e.components);return t?`Render ${t} instead of a raw <button>, or ask for an exception.`:"Use a spec button instead of a raw <button>, or ask for an exception."},"prop.unknown":()=>"Use one of the values listed, or ask for an exception to add the look."};function fs(e){let t=[];for(let n of e.audit)if(n.status==="attention")for(let s of n.findings)t.push({check:n.id,finding:s,key:Si(n.id,s)});return t}function Tt(e){return`${e.path}#${zt(e.text.replace(/\s+/g," ").trim())}`}function ds(e,t={}){let n=Ci(e.previewCss),s=[...us(e.variants).values()].map(({line:i,stateLines:a,places:l,...c})=>c),r=new Set(e.tokens.map(i=>i.name)),o=[];for(let i of e.guidance.files)if(i.kind!=="record")for(let a of i.passages)a.rule&&o.push({path:a.path,headings:a.headings,text:a.text,styles:a.styles});return{schema:ls,concept:e.concept,label:e.label,version:t.version??0,sourceRef:e.repo.ref,publishedAt:t.publishedAt??null,components:[...e.components].sort(),tokens:[...new Set([...e.tokens.map(i=>i.name),...s.flatMap(i=>i.tokens).filter(i=>!r.has(i))])].map(i=>{let a=n.get(i);return a===void 0?{name:i}:{name:i,value:a}}).sort((i,a)=>i.name.localeCompare(a.name)),styles:s,rules:o,content:e.content.map(i=>i.id),acceptedFindings:fs(e).filter(({check:i})=>i in nt).map(({check:i,finding:a,key:l})=>({check:i,key:l,message:a.message})),settings:{severity:{...Vt,...t.settings?.severity??{}}}}}function _i(e,t){let n=new Map(e.map(o=>[o.property,o.value])),s=new Map(t.map(o=>[o.property,o.value])),r=[];for(let[o,i]of s){let a=n.get(o);a===void 0?r.push(`added ${o}: ${i}`):a!==i&&r.push(`${o}: ${a} \u2192 ${i}`)}for(let[o,i]of n)s.has(o)||r.push(`removed ${o}: ${i}`);return r}function Ut(e){return e.map(t=>`${t.property}: ${t.value}`).join("; ")}function Ft(e,t){return e.length>t?`${e.slice(0,t).join(", ")}, and ${e.length-t} more`:e.join(", ")}function Ii(e,t){let n=e.replace(/^--/,"").split("-")[0]??"",s=n?t.filter(r=>r.startsWith(`--${n}`)):[];return(s.length?s:t).slice(0,3)}function gs(e,t){let n={...Vt,...t.settings.severity},s=[],r=(p,d="")=>{s.push({id:`${p.kind}:${zt(`${p.styleId??""}|${p.state??""}|${d}`)}`,severity:n[p.kind],...p})},o=us(e.variants),i=new Map(t.styles.map(p=>[p.id,p])),a=t.styles.filter(p=>p.kind==="look"),l=new Set([...t.tokens.map(p=>p.name),...t.styles.flatMap(p=>p.tokens)]),c=[...l],u=new Map;for(let p of t.styles)p.markup&&u.set(Be(p.states),p);let f=new Map;for(let p of o.values()){if(!p.markup)continue;let d=u.get(Be(p.states));d&&f.set(p.id,d)}let m=new Set([...f.values()].map(p=>p.id)),h=p=>p.markup?`${p.title} (as in ${p.path})`:p.selector;for(let p of o.values()){if(i.has(p.id)||f.has(p.id))continue;let d=p.hostId?i.get(p.hostId):void 0,y=p.markup?a.filter(R=>R.markup):a,k=y.filter(R=>R.path===p.path),x=(k.length?k:y).map(h),v=p.markup?`This one-off ${p.element??"button"} (${Ft((p.states[0]?.declarations??[]).map(R=>`${R.property}: ${R.value}`),3)})`:p.selector,E=ps(t.components),j=p.markup?E?`render ${E} with a spec look,`:x.length?`copy ${Ft(x,3)},`:"use a spec style,":d?`restyle ${d.selector} only through spec modifiers`:x.length?`use ${Ft(x,3)},`:"use a spec style,";r({kind:"style.new",styleId:p.id,title:`${p.title} is not in the spec`,baseline:null,observed:{declarations:p.states[0]?.declarations??[],states:p.states,...p.markup?{markup:!0}:{}},refs:vi(p),fix:`${v} is not in the spec; ${j} or ask for an exception.`},p.markup?Be(p.states):p.selector)}for(let p of o.values()){let d=i.get(p.id);if(!d)continue;let y=new Map(d.states.map(k=>[le(k),k]));for(let k of p.states){let x=le(k),v=y.get(x),E=_i(v?.declarations??[],k.declarations);E.length!==0&&r({kind:"state.changed",styleId:p.id,title:v?`${p.title}: ${x} changed`:`${p.title}: new ${x} state`,state:x,baseline:v?{declarations:v.declarations}:null,observed:{declarations:k.declarations},refs:[{path:p.path,line:p.stateLines.get(x)??p.line}],fix:v?`Restore ${p.selector} ${x} to the spec (${E.slice(0,3).join("; ")}), or ask for an exception.`:`${x} is not a spec state of ${p.selector}; remove it, or ask for an exception.`},Ut(k.declarations))}}for(let p of o.values()){let d=i.get(p.id);if(!d)continue;let y=new Set(p.states.map(le));for(let k of d.states){let x=le(k);y.has(x)||r({kind:"state.missing",styleId:p.id,title:`${p.title}: ${x} state is missing`,state:x,baseline:{declarations:k.declarations},observed:null,refs:[{path:p.path,line:p.line}],fix:`Define ${p.selector} ${x} again: ${Ut(k.declarations)||"as in the spec"}.`})}}for(let p of o.values())for(let d of p.tokens){if(l.has(d))continue;let y=Ii(d,c);r({kind:"token.unknown",styleId:p.id,title:`${p.title} reads ${d}, which is not a spec token`,baseline:null,observed:{token:d},refs:[{path:p.path,line:p.line}],fix:y.length?`Use a spec token such as ${y.join(", ")} instead of ${d}, or ask for an exception.`:`${d} is not a spec token; ask for an exception to add it.`},d)}let w=new Map;for(let p of t.acceptedFindings)w.set(p.key,[...w.get(p.key)??[],p]);let C=fs(e).filter(({check:p})=>p in nt);for(let p of cs)if(Ri.has(p))for(let{check:d,finding:y,key:k}of C){if(nt[d]!==p)continue;let x=w.get(k)??[];if(x.some(R=>!Ei(d,R.message,y.message)))continue;let v=x[0],E=y.styles?.[0],j=E?[...o.values()].find(R=>R.title===E):void 0;if(p==="native.element"){let R=y.refs[0]?.path??"",A=Number(Bt.exec(y.message)?.[1]??"1");if(s.filter(N=>N.kind==="style.new"&&N.observed?.markup===!0&&N.refs.some(V=>V.path===R)).length>=A)continue}r({kind:p,styleId:j?.id??null,title:y.message,baseline:v?{message:v.message}:null,observed:{message:y.message,...p==="native.element"?{element:"button"}:{}},waiverKey:k,refs:y.refs.map(({path:R,line:A})=>({path:R,line:A})),fix:Ai[p](t)},k)}for(let p of t.styles)o.has(p.id)||m.has(p.id)||r({kind:"style.removed",styleId:p.id,title:p.markup?`${p.title} is in the spec but no longer written anywhere`:`${p.title} is in the spec but no longer in CSS`,baseline:{declarations:p.states[0]?.declarations??[]},observed:null,refs:[{path:p.path,line:0}],fix:p.markup?`Nothing renders ${p.title} any more; ask the designer to retire it from the spec if that is intended.`:`Restore ${p.selector} in ${p.path}, or ask the designer to retire it from the spec.`});let $=new Map(e.guidance.files.map(p=>[p.path,p])),g=new Set;for(let p of e.guidance.files)for(let d of p.passages)d.rule&&g.add(Tt(d));for(let p of t.rules){if(g.has(Tt(p)))continue;let d=$.get(p.path);d&&d.total>d.passages.length||r({kind:"guidance.rule",styleId:null,title:`A written rule in ${p.path} changed or was removed`,baseline:{text:p.text},observed:null,refs:[{path:p.path,line:0}],fix:`Restore the rule under ${p.headings.join(" \u203A ")||p.path}, or publish a new spec.`},Tt(p))}return s}function Ei(e,t,n){if(t===n)return!1;if(e==="native"){let s=Bt.exec(t)?.[1],r=Bt.exec(n)?.[1];if(s&&r)return Number(r)>Number(s)}return!0}var ji={product:"Gruum button spec",what:"The designer-published spec for this repository's buttons. Write buttons against it; drift from it is checked deterministically.",howToUse:["Use the components listed in `components`; do not render a raw <button> where a component exists.","Pick a look from `looks`. `selectedBy` says which prop or attribute value selects it.","Use only the tokens listed in `tokens`. Do not write a literal color or size a token already has.","Follow `rules`; they are the repository's written rules, quoted.","Do not add a look, modifier, or state, and do not change a state's declarations.",'If the spec has no button for the job, stop and ask the user: "You asked for a design element that is not in the spec. 1. Use an existing spec style for it. 2. Add it as it is and request review." Do not write that look, and do not request a review, until they answer. After they choose review, call gruum_request_exception, or run `npx @gruum/cli request <drift id> --reason "..."`. Never edit generated Gruum files, including .gruum/project.json, to make a check pass.']};function Wt(e){let t=(n,s)=>e.styles.filter(r=>r.hostId===n&&r.kind===s).map(r=>r.selector);return{about:{...ji,drift:cs.map(n=>({kind:n,severity:e.settings.severity[n]??Vt[n]}))},spec:{concept:e.concept,version:e.version,sourceRef:e.sourceRef,components:e.components,looks:e.styles.filter(n=>n.kind==="look").map(n=>({title:n.title,selector:n.selector,path:n.path,...n.selectedBy?{selectedBy:n.selectedBy}:{},tokens:n.tokens,states:Object.fromEntries(n.states.map(s=>[le(s),Ut(s.declarations)])),modifiers:t(n.id,"modifier"),contexts:t(n.id,"context")})),tokens:e.tokens,rules:e.rules.map(n=>({path:n.path,under:n.headings.join(" \u203A "),text:n.text}))}}}function Ue(e){if(!e||typeof e!="object")return null;let t=e;return t.schema!==ls||typeof t.concept!="string"||!Array.isArray(t.styles)||!Array.isArray(t.tokens)||!Array.isArray(t.acceptedFindings)||!Array.isArray(t.rules)||!t.settings?.severity?null:t}function Pi(e){let t=new Map;for(let n of e){let s=n.refs[0]?.path??"(no file)";t.set(s,[...t.get(s)??[],n])}return[...t].sort(([n],[s])=>n.localeCompare(s))}function Gt(e,t){if(t.length===0)return e;let n=new Set(t.map(s=>s.replace(/^\.\//,"")));return e.filter(s=>s.refs.some(r=>n.has(r.path)))}function ms(e,t,n={}){let s=[];if(e.length===0)return s.push(`No drift against spec v${t.baselineVersion} (${t.files} files indexed, ${t.skipped} skipped).`),s.join(`
|
|
4
|
+
`);for(let[o,i]of Pi(e)){s.push(o);for(let a of i){let l=a.refs[0]?.line,c=n[a.id],u=c?`${a.severity}, exception ${c}`:a.severity;s.push(` ${l?`${l}: `:""}[${u}] ${a.kind} ${a.title}`),s.push(` fix: ${a.fix}`)}s.push("")}let r=e.filter(o=>o.severity==="block").length;return s.push(`${e.length} drift item${e.length===1?"":"s"} against spec v${t.baselineVersion}: ${r} block, ${e.length-r} warn (${t.files} files indexed, ${t.skipped} skipped).`),s.join(`
|
|
5
|
+
`)}function hs(e){return{schema:1,checkedAt:e,baselineVersion:null,items:[],followups:{}}}function bs(e,t){if(!e||typeof e!="object")return hs(t);let n=e;return n.schema!==1||!Array.isArray(n.items)?hs(t):{schema:1,checkedAt:typeof n.checkedAt=="string"?n.checkedAt:t,baselineVersion:typeof n.baselineVersion=="number"?n.baselineVersion:null,items:n.items,followups:n.followups&&typeof n.followups=="object"?n.followups:{}}}function ze(e,t={}){return e.filter(n=>{if(n.severity!=="block")return!1;let s=t[n.id];return s!=="pending"&&s!=="accepted"})}var Ve={exceptions:!1,denyGit:[],maxFollowups:2};function ys(e){let t=e?.block===!0,n=Array.isArray(e?.denyGit)?e.denyGit.filter(r=>r==="commit"||r==="push"):t?["commit","push"]:Ve.denyGit,s=typeof e?.maxFollowups=="number"&&e.maxFollowups>=0?Math.floor(e.maxFollowups):Ve.maxFollowups;return{block:t,hooks:{...Ve,denyGit:n,maxFollowups:s}}}var Ht=8;function xs(e){let t=e.slice(0,Ht).map(n=>{let s=n.refs[0],r=s?` (${s.path}${s.line?`:${s.line}`:""})`:"";return`- ${n.title}${r}. ${n.fix}`});return e.length>Ht&&t.push(`- and ${e.length-Ht} more; run \`gruum check\`.`),t.join(`
|
|
6
|
+
`)}var Kt="You asked for a design element that is not in the spec. 1. Use an existing spec style for it. 2. Add it as it is and request review.";function ks(e){let t="If gruum_button_spec is not available, read .gruum/baseline.json. Do not search the computer for a gruum program, and do not read the CLI package.",n=`Ask the user before you do anything else: "${Kt}" If they choose 1, restyle it to a spec look (call gruum_button_spec).`,s=e.exceptions?'If they choose 2, keep it and call gruum_request_exception with the drift id and a reason. If that tool is not available, run `npx @gruum/cli request <drift id> --reason "..."`. Do not request a review until they choose 2. Do not edit .gruum files.':"If they choose 2, stop and tell the developer which review you need. Do not invent a style.";return`${n} ${s} ${t}`}function ws(e,t,n=Ve,s={}){let r=ze(e.items,s),o=t.conversation_id??"",i=typeof t.loop_count=="number"?t.loop_count:e.followups[o]??0;return r.length===0||t.status==="aborted"?{output:{},ledger:e}:i>=n.maxFollowups?{output:{},ledger:e}:{output:{followup_message:`Gruum found ${r.length} button${r.length===1?"":"s"} that drift from the published spec:
|
|
7
|
+
${xs(r)}
|
|
8
8
|
|
|
9
|
-
${
|
|
10
|
-
${
|
|
9
|
+
${ks(n)}`},ledger:{...e,followups:{...e.followups,[o]:i+1}}}}function Jt(e){let t=[];for(let n of e.split(/&&|\|\||[;|\n]/)){let s=n.trim().split(/\s+/).filter(Boolean),r=0;for(;r<s.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(s[r]);)r++;if((s[r]==="command"||s[r]==="exec")&&r++,!!/(^|\/)git$/.test(s[r]??"")){for(r++;r<s.length&&s[r].startsWith("-");){let o=s[r];r+=/^(-C|-c|--git-dir|--work-tree|--namespace)$/.test(o)?2:1}s[r]&&t.push(s[r])}}return t}function vs(e,t,n=Ve,s={}){let r=Jt(t.command??"").filter(i=>n.denyGit.includes(i));if(r.length===0)return{permission:"allow"};let o=ze(e.items,s);return o.length===0?{permission:"allow"}:{permission:"deny",user_message:`Gruum blocked git ${r[0]}: ${o.length} button drift item${o.length===1?"":"s"} against the spec. Run \`gruum check\` for details.`,agent_message:`git ${r[0]} is blocked until button drift is resolved:
|
|
10
|
+
${xs(o)}
|
|
11
11
|
|
|
12
|
-
${
|
|
13
|
-
`}function
|
|
14
|
-
`)}function
|
|
12
|
+
${ks(n)}`}}var We="npx --no-install @gruum/cli",Cs="npx --yes @gruum/cli",qt="npx --yes @gruum/cli",$s={afterFileEdit:"after-file-edit",stop:"stop",beforeShellExecution:"before-shell"},Li=/(^|[\s/])(?:@gruum\/cli|gruum(?:\.m?js)?)\s+hook\s+(after-file-edit|stop|before-shell)\s*$/;function Zt(e){return typeof e=="string"&&Li.test(e)}function st(e,t){if(e===null||e.trim()==="")return{ok:!0,value:{}};try{let n=JSON.parse(e);return!n||typeof n!="object"||Array.isArray(n)?{ok:!1,error:`${t} is not a JSON object; fix it or move it aside, then run init again.`}:{ok:!0,value:n}}catch{return{ok:!1,error:`${t} is not valid JSON; fix it or move it aside, then run init again.`}}}function rt(e){return`${JSON.stringify(e,null,2)}
|
|
13
|
+
`}function Ss(e,t){let n=Xt(e),s=Yt(t);return!n.ok||!s.ok?!1:n.changed||s.changed}function Xt(e,t=We){let n=".cursor/hooks.json",s=st(e,n);if(!s.ok)return s;let r=s.value;if(r.hooks!==void 0&&(typeof r.hooks!="object"||Array.isArray(r.hooks)||r.hooks===null))return{ok:!1,error:`${n} has a "hooks" value that is not an object.`};let o={...r.hooks??{}},i=e===null||e.trim()==="";for(let a of Object.keys($s)){let l=o[a]??[];if(!Array.isArray(l))return{ok:!1,error:`${n} has a "${a}" value that is not an array.`};let c=`${t} hook ${$s[a]}`,u=l.filter(f=>Zt(f?.command));u.length===1&&u[0].command===c||(o[a]=[...l.filter(f=>!Zt(f?.command)),{command:c}],i=!0)}return i?{ok:!0,text:rt({version:r.version??1,...r,hooks:o}),changed:!0}:{ok:!0,text:e,changed:!1}}function Rs(e){let t=".cursor/hooks.json";if(e===null)return{ok:!0,text:"",changed:!1};let n=st(e,t);if(!n.ok)return n;let s=n.value,r={...s.hooks??{}},o=!1;for(let a of Object.keys(r)){let l=r[a];if(!Array.isArray(l))continue;let c=l.filter(u=>!Zt(u?.command));c.length!==l.length&&(o=!0,c.length?r[a]=c:delete r[a])}if(!o)return{ok:!0,text:e,changed:!1};let i=Object.keys(s).every(a=>a==="version"||a==="hooks");return Object.keys(r).length===0&&i?{ok:!0,text:"",changed:!0}:{ok:!0,text:rt({...s,hooks:r}),changed:!0}}function Oi(e){let[t,...n]=e.trim().split(/\s+/);return{command:t,args:[...n,"mcp"]}}function Yt(e,t=qt){let n=".cursor/mcp.json",s=st(e,n);if(!s.ok)return s;let r=s.value,o=r.mcpServers??{};if(typeof o!="object"||Array.isArray(o)||o===null)return{ok:!1,error:`${n} has an "mcpServers" value that is not an object.`};let i=Oi(t),a=o.gruum;return JSON.stringify(a)===JSON.stringify(i)?{ok:!0,text:e,changed:!1}:{ok:!0,text:rt({...r,mcpServers:{...o,gruum:i}}),changed:!0}}function As(e){let t=".cursor/mcp.json";if(e===null)return{ok:!0,text:"",changed:!1};let n=st(e,t);if(!n.ok)return n;let s=n.value,r={...s.mcpServers??{}};return"gruum"in r?(delete r.gruum,Object.keys(r).length===0&&Object.keys(s).every(o=>o==="mcpServers")?{ok:!0,text:"",changed:!0}:{ok:!0,text:rt({...s,mcpServers:r}),changed:!0}):{ok:!0,text:e,changed:!1}}var Y=".cursor/rules/gruum-buttons.mdc",_s="<!-- written by gruum init cursor -->",Mi=20,Is=["**/*.css","**/*.scss","**/*.tsx","**/*.jsx"];function Es(e){let t=(e?.findings??[]).filter(s=>s.role==="implements"||s.role==="styles").map(s=>s.path).filter(s=>!/[,"\n]/.test(s)),n=[...new Set(t)].sort().slice(0,Mi);return n.length?n:Is}var Ni=["The button spec for this repository lives in Gruum. Before writing or restyling a button, call the Cursor tool `gruum_button_spec`.","Before you stop, call the Cursor tool `gruum_check_buttons` and fix every drift item it reports to the spec.","If those tools are not available, read `.gruum/baseline.json` and follow that spec. Do not search the computer for a gruum program, and do not read the CLI package.",`When the request needs a button the spec does not have, stop and ask the user exactly: "${Kt}" Do not write that look, and do not request a review, until they answer. After they choose review, call gruum_request_exception, or run \`npx @gruum/cli request <drift id> --reason "..."\`. Never edit Gruum's generated files, including .gruum/project.json, to make a check pass.`];function Qt(e){return["---","description: Buttons in this repository follow a spec published in Gruum.",`globs: ${e.join(",")}`,"alwaysApply: false","---",_s,"",...Ni,""].join(`
|
|
14
|
+
`)}function js(e){let n=(e.match(/^globs: (.*)$/m)?.[1]??"").split(",").map(r=>r.trim()).filter(Boolean),s=Qt(n.length?n:Is);return{text:s,changed:s!==e}}function en(e){return e.includes(_s)}function Di(e){let t=e.trim();if(!t||t.startsWith("#")||t.startsWith("!"))return!1;let n=t.replace(/\s+#.*$/,"").trim();return/^(?:\/|\*\*\/)?\.gruum(?:\/|\*\*|\/\*\*|\/\*)?$/.test(n)}function ot(e){let t=e??"";if(t.split(/\r?\n/).some(Di))return{text:t,changed:!1};let n=t===""||t.endsWith(`
|
|
15
15
|
`)?"":`
|
|
16
16
|
`;return{text:`${t}${n}# Gruum local state
|
|
17
17
|
.gruum/
|
|
18
|
-
`,changed:!0}}function
|
|
18
|
+
`,changed:!0}}function Ps(e){if(e===null)return{text:"",changed:!1};let t=e.replace(/(^|\n)# Gruum local state\n\.gruum\/\n/,"$1");return{text:t,changed:t!==e}}var Ti=e=>`${e} check --staged`;function Ls(e,t=We){let n=Ti(t);if(e.lefthook)return{kind:"print",reason:"lefthook config found; add this to the pre-commit commands",snippet:`pre-commit:
|
|
19
19
|
commands:
|
|
20
20
|
gruum:
|
|
21
21
|
run: ${n}
|
|
22
22
|
`};let s=e.husky?"husky":e.gitHooksDir?"git":null;if(!s)return{kind:"print",reason:"no hook directory found; add this to your pre-commit hook",snippet:`${n}
|
|
23
|
-
`};let r=e.husky?".husky/pre-commit":`${e.gitHooksDir}/pre-commit`,o=e.hookText;if(o!==null
|
|
23
|
+
`};let r=e.husky?".husky/pre-commit":`${e.gitHooksDir}/pre-commit`,o=e.hookText;if(o!==null){let l=o.split(/\r?\n/).map(u=>u.trim());if(l.includes(n))return{kind:s,path:r,text:o,changed:!1};let c=`${We} check --staged`;if(n!==c&&l.includes(c))return{kind:s,path:r,text:o.replace(c,n),changed:!0};if(l.some(u=>Os(u)))return{kind:s,path:r,text:o,changed:!1}}let i=o===null?s==="git"?`#!/bin/sh
|
|
24
24
|
`:"":o,a=i===""||i.endsWith(`
|
|
25
25
|
`)?"":`
|
|
26
26
|
`;return{kind:s,path:r,text:`${i}${a}${n}
|
|
27
|
-
`,changed:!0}}function
|
|
28
|
-
`),n=t.filter(o=>!
|
|
29
|
-
`);return s&&/^(#!\/bin\/sh)?\s*$/.test(r)?{text:"",changed:s}:{text:r,changed:s}}var
|
|
27
|
+
`,changed:!0}}function Os(e){return/(^|[\s/])(?:@gruum\/cli|gruum(?:\.m?js)?)\s+check\s+--staged\s*$/.test(e.trim())}function Ms(e){let t=e.split(`
|
|
28
|
+
`),n=t.filter(o=>!Os(o)),s=n.length!==t.length,r=n.join(`
|
|
29
|
+
`);return s&&/^(#!\/bin\/sh)?\s*$/.test(r)?{text:"",changed:s}:{text:r,changed:s}}var Ie=[{name:"login",args:[],blurb:"Sign this computer in",usage:"npx @gruum/cli login"},{name:"check",args:[],blurb:"Compare this checkout to the spec",usage:"npx @gruum/cli check"},{name:"baseline",args:["--write"],blurb:"Draft a spec from this checkout and publish it",usage:"npx @gruum/cli baseline --write"}];function Ns(e){let t=Ie.map((n,s)=>` ${s+1} ${n.name.padEnd(10)} ${n.blurb}`);return`gruum ${e}
|
|
30
30
|
|
|
31
31
|
${t.join(`
|
|
32
32
|
`)}
|
|
33
|
-
`}var
|
|
34
|
-
Choose 1\u20133, or press Enter to quit: `,
|
|
35
|
-
Would you like to run a (c) check, (b) baseline, or (q) quit? `,
|
|
36
|
-
You have no baseline. Would you like to run it? (b) baseline, (q) quit: `;function
|
|
33
|
+
`}var Ds=`
|
|
34
|
+
Choose 1\u20133, or press Enter to quit: `,Ts=`
|
|
35
|
+
Would you like to run a (c) check, (b) baseline, or (q) quit? `,Fs=`
|
|
36
|
+
You have no baseline. Would you like to run it? (b) baseline, (q) quit: `;function Bs(e){return`
|
|
37
37
|
${e?"This repo uses Cursor and Claude. Gruum can set up Cursor.":"This repo uses Cursor."}
|
|
38
38
|
|
|
39
|
-
Set up Gruum in Cursor so checks run while you edit and before a commit? (y) yes, (n) no: `}function Ts(e){let t=e.trim().toLowerCase();return!t||t==="n"||t==="no"||t==="q"||t==="quit"?"no":t==="y"||t==="yes"?"yes":null}function Ds(e){let t=e.trim().toLowerCase();return!t||t==="q"||t==="quit"?"quit":t==="c"||t==="check"?"check":t==="b"||t==="baseline"?"baseline":null}function Fs(e){let t=e.trim().toLowerCase();return!t||t==="q"||t==="quit"||t==="n"||t==="no"?"quit":t==="b"||t==="baseline"||t==="y"||t==="yes"?"baseline":null}function Bs(e){let t=e.trim().toLowerCase();if(!t)return"quit";let n=Number(t);return Number.isInteger(n)&&n>=1&&n<=Ee.length?Ee[n-1]:Ee.find(s=>s.name===t)??null}var Li="2025-06-18",it=`Check before you finish. If the request needs a button the spec does not have, ask the user: "You asked for a design element that is not in the spec. 1. Use an existing spec style for it. 2. Add it as it is and request review." Do not request a review until they choose 2. Never edit Gruum's generated files to make a check pass.`,at={gruum_button_spec:`The designer-published button spec for this repository: components, looks and how to select them, tokens, and written rules. Read it before writing or restyling a button. ${it}`,gruum_check_buttons:`Check the working tree's buttons against the spec and list drift items with a one-line fix each. Run it before you stop. ${it}`,gruum_request_exception:`Ask a designer to review one drift item. Call this only after the user chooses to add the element as it is and request review. Send the drift id from gruum_check_buttons and a reason. ${it}`,gruum_exception_status:`Pending, accepted, or rejected for this branch's exception requests. Pass an id to read one. ${it}`};function Vs(e){return[{name:"gruum_button_spec",description:at.gruum_button_spec,inputSchema:{type:"object",properties:{},additionalProperties:!1},run:()=>e.spec()},{name:"gruum_check_buttons",description:at.gruum_check_buttons,inputSchema:{type:"object",properties:{paths:{type:"array",items:{type:"string"},description:"Only report drift in these files (relative to the repository root). Omit to check everything."}},additionalProperties:!1},run:t=>{let n=Array.isArray(t.paths)?t.paths.filter(s=>typeof s=="string"):[];return e.check(n)}},{name:"gruum_request_exception",description:at.gruum_request_exception,inputSchema:{type:"object",properties:{driftId:{type:"string",description:"The drift item id from gruum_check_buttons."},reason:{type:"string",description:"Why the spec has no button for this job."}},required:["driftId","reason"],additionalProperties:!1},run:t=>e.request(typeof t.driftId=="string"?t.driftId:"",typeof t.reason=="string"?t.reason:"")},{name:"gruum_exception_status",description:at.gruum_exception_status,inputSchema:{type:"object",properties:{id:{type:"string",description:"One request id. Omit to list this branch."}},additionalProperties:!1},run:t=>e.status(typeof t.id=="string"?t.id:void 0)}]}function We(e,t){return{jsonrpc:"2.0",id:e,result:t}}function lt(e,t,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:n}}}async function Us(e,t,n){if(!e||typeof e!="object")return lt(null,-32600,"Invalid request");let s=e,r=!("id"in s),o=s.id??null;if(typeof s.method!="string")return r?null:lt(o,-32600,"Invalid request");let i=s.params??{};switch(s.method){case"initialize":{let a=i.protocolVersion;return We(o,{protocolVersion:typeof a=="string"?a:Li,capabilities:{tools:{listChanged:!1}},serverInfo:n})}case"ping":return We(o,{});case"tools/list":return We(o,{tools:t.map(({name:a,description:l,inputSchema:c})=>({name:a,description:l,inputSchema:c}))});case"tools/call":{let a=t.find(c=>c.name===i.name);if(!a)return lt(o,-32602,`Unknown tool: ${String(i.name)}`);let l=i.arguments&&typeof i.arguments=="object"?i.arguments:{};try{let c=await a.run(l);return We(o,{content:[{type:"text",text:c.text}],isError:c.isError??!1})}catch(c){return We(o,{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0})}}default:return r?null:lt(o,-32601,`Method not found: ${s.method}`)}}var Oi=/(^|\/)(node_modules|\.git|\.next|dist|build|out|coverage|vendor|\.turbo|\.cache|__pycache__|target|\.venv|venv)\//,Mi=/(^|\/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb|Cargo\.lock|poetry\.lock|composer\.lock|Gemfile\.lock)$/,Ni=/\.(png|jpe?g|gif|webp|avif|ico|icns|bmp|tiff?|svgz|woff2?|ttf|otf|eot|mp[34]|wav|ogg|webm|mov|zip|gz|tgz|bz2|7z|rar|jar|pdf|docx?|xlsx?|pptx?|exe|dll|so|dylib|wasm|bin|dat|sqlite|db|psd|ai|sketch|fig)$/i,Ti=/(^|\/)\.gruum\//;function Qt(e){return!Oi.test(`${e}/`)&&!Ti.test(`${e}/`)}function en(e,t){return Mi.test(e)||Ni.test(e)?!1:t<=3e5}function zs(e){let t=Math.min(e.length,8e3);for(let n=0;n<t;n++)if(e[n]===0)return!0;return!1}var Di=/\.(css|scss|sass|less|styl|tsx?|jsx?|mjs|cjs|vue|svelte|astro|html?|mdx?|erb|php|hbs|njk|liquid|twig|ejs|pug|cshtml|razor|jinja2?|j2|json)$/i;function Ws(e){return Di.test(e)}function tn(e){return e.replace(/\\/g,"/").replace(/^\.\/?/,"").replace(/^\/+|\/+$/g,"")}function nn(e,t){let n=tn(t),s=e.replace(/\\/g,"/");return n?s.startsWith(`${n}/`)?s.slice(n.length+1):null:s}function Gs(e,t,n){let s=new Map(e);for(let r of t){let o=nn(r.path,n);o===null||!Qt(o.split("/").slice(0,-1).join("/")||".")||(r.content===null?s.delete(o):en(o,r.content.length)&&s.set(o,r.content))}return s}function Hs(e){let t=e.split("\0").filter(Boolean),n=[];for(let s=0;s<t.length;s++){let r=t[s];if(/^[RC]/.test(r)){let i=t[++s],a=t[++s];r.startsWith("R")&&i&&n.push({path:i,deleted:!0}),a&&n.push({path:a,deleted:!1});continue}let o=t[++s];o&&n.push({path:o,deleted:r.startsWith("D")})}return n}function ct(e){let t=/^(?:git@|ssh:\/\/git@|https?:\/\/(?:[^@/]+@)?)github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?\/?$/i.exec(e.trim());return t?`${t[1]}/${t[2]}`:null}var Ks=e=>e.replace(/\\(.)/g,"$1");function Fi(e){let t=e;for(;;){let n=/:(?:global|local)\(/i.exec(t);if(!n)break;let s=0,r=-1;for(let i=n.index+n[0].length-1;i<t.length;i++){let a=t[i];if(a==="(")s++;else if(a===")"&&--s===0){r=i;break}}if(r<0)break;let o=t.slice(n.index+n[0].length,r).trim();t=`${t.slice(0,n.index)}${o}${t.slice(r+1)}`}return t.replace(/:(?:global|local)(?=\s|$)/gi,"").trim()}var sn=/\*|[a-z][\w-]*|\.((?:\\.|[\w-])+)|#((?:\\.|[\w-])+)|\[\s*([\w-]+)\s*(?:([~|^$*]?=)\s*(?:"([^"]*)"|'([^']*)'|([^\]\s]*)))?\s*[is]?\s*\]|::([\w-]+)|:([\w-]+)(\((?:[^()]|\([^()]*\))*\))?/giy;function Xs(e){let t=[];sn.lastIndex=0;let n=0;for(;n<e.length;){sn.lastIndex=n;let s=sn.exec(e);if(!s||s.index!==n)return null;let r=s[0];if(n+=r.length,r==="*")t.push({kind:"universal",raw:r});else if(s[1]!==void 0)t.push({kind:"class",raw:r,name:Ks(s[1])});else if(s[2]!==void 0)t.push({kind:"id",raw:r,name:Ks(s[2])});else if(s[3]!==void 0)t.push({kind:"attr",raw:r,name:s[3],op:s[4]??null,value:s[4]?s[5]??s[6]??s[7]??"":null});else if(s[8]!==void 0)t.push({kind:"pseudoElement",raw:r,name:s[8].toLowerCase()});else if(s[9]!==void 0){let o=s[9].toLowerCase();/^(?:before|after|first-line|first-letter)$/.test(o)?t.push({kind:"pseudoElement",raw:r,name:o}):t.push({kind:"pseudo",raw:r,name:o,args:s[10]?s[10].slice(1,-1).trim():null})}else if(t.length===0)t.push({kind:"tag",raw:r,name:r.toLowerCase()});else return null}return t.length?t:null}function Y(e){let t=Fi(e),n=[],s=0,r=0,o=null,i=!0,a=l=>{let c=t.slice(r,l).trim();if(!c)return!0;let p=Xs(c);return p?(n.push({combinator:i?null:o??" ",simples:p}),i=!1,o=null,!0):!1};for(let l=0;l<t.length;l++){let c=t[l];if(c==="("||c==="[")s++;else if(c===")"||c==="]")s=Math.max(0,s-1);else if(s===0&&(c===">"||c==="+"||c==="~")){if(!a(l)||o)return null;o=c,r=l+1}else if(s===0&&/\s/.test(c)){if(!a(l))return null;r=l+1}}return!a(t.length)||o?null:n.length?n:null}function Ge(e){return e.map(t=>t.raw).join("")}function He(e){return e.map((t,n)=>{let s=Ge(t.simples);return n===0?s:t.combinator===" "?` ${s}`:` ${t.combinator} ${s}`}).join("")}function z(e){let t=[],n=0,s=0;for(let r=0;r<e.length;r++){let o=e[r];o==="("||o==="["?n++:o===")"||o==="]"?n=Math.max(0,n-1):o===","&&n===0&&(t.push(e.slice(s,r).trim()),s=r+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}var qs=e=>e.replace(/([a-z\d])([A-Z])/g,"$1-$2").split(/[^a-z0-9]+/i).filter(Boolean).map(t=>t.toLowerCase());function Js(e,t){let n=e.toLowerCase();return t.some(s=>n.includes(s.toLowerCase()))}function rn(e,t){let n=t.excludeClassKeywords;if(!n?.length)return!1;let s=new Set(n.flatMap(r=>[r.toLowerCase(),`${r.toLowerCase()}s`]));return e.some(r=>r.kind==="class"&&qs(r.name).some(o=>s.has(o)))}var Bi=new Set(["html","body"]),Vi=new Set(["svg","path","use","img","picture","video","i","em","strong","b","small","kbd","sup","sub"]);function pt(e,t){for(let n of e)switch(n.kind){case"tag":if(t.elements.includes(n.name))return!0;break;case"class":if(Js(n.name,t.classKeywords))return!0;break;case"attr":if(n.name==="role"&&n.value!==null&&t.roles.includes(n.value.toLowerCase())||n.name==="data-component"&&n.value!==null&&Js(n.value,t.classKeywords))return!0;break;case"pseudo":if((n.name==="is"||n.name==="where")&&n.args){let s=z(n.args).map(Y);if(s.length>0&&s.every(r=>r!==null&&pt(r[r.length-1].simples,t)))return!0}break;default:break}return!1}function Ys(e){return e.some(n=>n.kind==="universal")?e.length===1:e.some(n=>n.kind==="tag"&&Bi.has(n.name))?!0:!e.some(n=>n.kind==="tag"||n.kind==="class"||n.kind==="attr"||n.kind==="id"||n.kind==="pseudo"&&(n.name==="is"||n.name==="where"))}function Qs(e){return e.some(t=>t.kind==="tag"&&Vi.has(t.name))}var ut=["hover","focus","active","selected","current","loading","disabled"],Ui={hover:"hover",hovered:"hover",focus:"focus",focused:"focus","focus-visible":"focus","focus-within":"focus",active:"selected",pressed:"selected",selected:"selected",checked:"selected",on:"selected",current:"current",loading:"loading",busy:"loading",pending:"loading",disabled:"disabled"},zi={hover:"hover",focus:"focus","focus-visible":"focus","focus-within":"focus",active:"active",checked:"selected",disabled:"disabled"},Wi={disabled:"disabled","aria-disabled":"disabled","data-disabled":"disabled","aria-pressed":"selected","aria-selected":"selected","aria-expanded":"selected","aria-checked":"selected","data-active":"selected","data-selected":"selected","data-pressed":"selected","data-checked":"selected","data-highlighted":"selected","aria-current":"current","aria-busy":"loading","data-loading":"loading","data-busy":"loading","data-hover":"hover","data-hovered":"hover","data-focus":"focus","data-focused":"focus","data-focus-visible":"focus","data-open":"open","data-expanded":"open"},Gi=new Set(["active","selected","pressed","checked","loading","busy","disabled","open","current","hover","focus","show","expanded","collapsed"]),Zs=e=>Ui[e.toLowerCase()]??e.toLowerCase(),ce={hover:"__gs-hover",focus:"__gs-focus",active:"__gs-active"};function er(e){if(e.kind==="pseudo"){let t=zi[e.name];if(!t)return null;let n=ce[t];return{state:t,marker:n?{classes:[n],attrs:{}}:{classes:[],attrs:{[e.name==="checked"?"checked":"disabled"]:""}}}}if(e.kind==="attr"){if(e.name==="data-state"&&e.value!==null)return{state:Zs(e.value),marker:{classes:[],attrs:{"data-state":e.value}}};let t=Wi[e.name];if(!t||e.value!==null&&/^(?:false|off|0)$/i.test(e.value))return null;let n=e.value??(e.name.startsWith("aria-")?"true":"");return{state:t,marker:{classes:[],attrs:{[e.name]:n}}}}if(e.kind==="class"){let t=/^(?:is|has)-(.+)$/i.exec(e.name),n=t?t[1]:Gi.has(e.name.toLowerCase())?e.name:null;return n?{state:Zs(n),marker:{classes:[e.name],attrs:{}}}:null}return null}function Hi(e){return e.kind!=="pseudo"||e.name!=="not"||!e.args?!1:z(e.args).every(t=>{let n=Xs(t);return n!==null&&n.every(s=>er(s)!==null)})}function ft(e){let t=[],n=new Map;for(let o of e){if(Hi(o))continue;let i=er(o);if(!i){t.push(o);continue}let a=n.get(i.state)??{classes:[],attrs:{}};for(let l of i.marker.classes)a.classes.includes(l)||a.classes.push(l);Object.assign(a.attrs,i.marker.attrs),n.set(i.state,a)}let s=[...n.keys()].sort((o,i)=>H(o)-H(i)||o.localeCompare(i)),r={classes:[],attrs:{}};for(let o of s){let i=n.get(o);r.classes.push(...i.classes),Object.assign(r.attrs,i.attrs)}return{identity:t,states:s,marker:r}}function H(e){if(e==="default")return-1;let t=ut.indexOf(e);return t===-1?ut.length:t}function be(e){return e.length?e.join(" + "):"default"}function on(e){return e.replace(/:hover\b/g,`.${ce.hover}`).replace(/:focus(?:-visible|-within)?\b/g,`.${ce.focus}`).replace(/:active\b/g,`.${ce.active}`)}var Ki=new Set(["background","background-color","background-image","background-position","background-size","background-repeat","background-clip","background-origin","background-attachment","color","border-color","border-top-color","border-right-color","border-bottom-color","border-left-color","outline","outline-color","outline-offset","box-shadow","filter","backdrop-filter","opacity","fill","stroke","caret-color","accent-color","text-decoration-color","mix-blend-mode"]),Ji=new Set(["width","min-width","max-width","flex","flex-grow","flex-shrink","flex-basis","align-self","justify-self","order","margin","margin-top","margin-right","margin-bottom","margin-left","margin-inline","margin-block","margin-inline-start","margin-inline-end","margin-block-start","margin-block-end","position","inset","inset-inline","inset-block","top","right","bottom","left","z-index","float","clear","grid-column","grid-row","grid-area","place-self"]),Zi=new Set(["cursor","user-select","pointer-events","transition","transition-property","transition-duration","transition-timing-function","transition-delay","will-change","touch-action","-webkit-tap-highlight-color","appearance","-webkit-appearance","scroll-margin","scroll-margin-top"]);function Ke(e){let t=e.toLowerCase();return Ki.has(t)?"paint":Ji.has(t)?"layout":Zi.has(t)?"hint":"box"}var Xi={shadow:/^box-shadow$/,cursor:/^cursor$/,rounded:/^border(?:-[a-z]+)*-radius$/,radius:/^border(?:-[a-z]+)*-radius$/};function tr(e,t){let n=e.filter(o=>o.kind==="class");if(n.length!==1||e.length!==1)return!1;let s=qs(n[0].name)[0],r=s?Xi[s]:void 0;return r?t.length>0&&t.every(o=>r.test(o.property.toLowerCase())):!1}var Pu={hover:{classes:[ce.hover],attrs:{}},focus:{classes:[ce.focus],attrs:{}},active:{classes:[ce.active],attrs:{}},selected:{classes:[],attrs:{"aria-pressed":"true"}},current:{classes:[],attrs:{"aria-current":"true"}},loading:{classes:[],attrs:{"aria-busy":"true"}},disabled:{classes:[],attrs:{disabled:""}}};var qi="data-gs-sheet";function sr(e){return`[${qi}="${e.replace(/["\\]/g,"")}"]`}function nr(e){return/\.module\.[a-z]+$/i.test(e)}var Yi=new Set(["button","a","div","span","input","summary","label"]);function ye(e){let t=0,n=0;for(let s=0;s<e.length;s++){let r=e[s];r==="("||r==="["?t++:r===")"||r==="]"?t=Math.max(0,t-1):t===0&&/[\s>+~]/.test(r)&&(n=s+1)}return n}function Qi(e){let t={tag:"",classes:[],attrs:{}};for(let n of e)switch(n.kind){case"pseudoElement":return null;case"tag":t.tag=n.name;break;case"class":t.classes.push(n.name);break;case"attr":t.attrs[n.name]=n.value??"";break;default:break}return t}function dt(e,t){let n=Y(e);if(!n||n.some(c=>c.combinator==="+"||c.combinator==="~"))return null;let s=n.map(c=>Qi(c.simples));if(s.some(c=>c===null))return null;let r=s,o=r[r.length-1],i=o.tag&&o.tag!=="*"?o.tag:"button";if(!Yi.has(i)||o.classes.length===0&&Object.keys(o.attrs).length===0&&!o.tag)return null;let a=[...new Set([...t,...o.classes])],l=r.slice(0,-1).filter(c=>c.tag||c.classes.length||Object.keys(c.attrs).length).map(c=>({...c,tag:c.tag&&c.tag!=="*"?c.tag:"div"}));return{tag:i,classes:a,attrs:o.attrs,ancestors:l}}function an(e,t){let n="";for(let s of e)s.property.toLowerCase()===t&&(n=s.value.replace(/!important\s*$/i,"").trim());return n}function gt(e){let t=an(e,"display");if(/^none\b/i.test(t))return"display: none";let n=an(e,"visibility");if(/^(hidden|collapse)\b/i.test(n))return`visibility: ${n.split(/\s+/)[0].toLowerCase()}`;let s=an(e,"opacity");return/^(0|0\.0+)$/.test(s)?"opacity: 0":null}function rr(e,t){return e===t||!nr(e)&&!nr(t)}function se(e,t){if(/[<>]|@import|expression\(|javascript:|behavior\s*:/i.test(t))return!1;for(let n of t.matchAll(/url\(\s*(['"]?)([^'")]*)\1\s*\)/gi))if(!/^data:image\//i.test(n[2]))return!1;return/^-{0,2}[a-z][\w-]*$/i.test(e)}var ea=40,Q=(e,t)=>({path:e,line:t});function ee(e,t,n,s){return{...e,status:t.length===0?"ok":"attention",summary:t.length===0?n:s(t.length),findings:t.slice(0,ea)}}function xe(e,t){return{...e,status:"na",summary:t,findings:[]}}var ln=e=>e.state.split(" + ");function cr(e,t){if(!e.element||!t.element||e!==t&&!rr(e.path,t.path)||e.element.ancestors.length>0||e.element.tag!==t.element.tag)return!1;let n=new Set(t.element.classes);return e.element.classes.every(s=>n.has(s))?Object.entries(e.element.attrs).every(([s,r])=>t.element.attrs[s]===r):!1}function ur(e,t){return t.filter(n=>cr(n,e)).flatMap(n=>n.states)}function ta(e,t,n){return ur(e,t).some(s=>ln(s).includes(n))||t.filter(s=>cr(s,e)).some(s=>(s.parts??[]).some(r=>r.state.split(" + ").includes(n)))}var na=[{state:"hover",severity:"issue"},{state:"focus",severity:"issue"},{state:"disabled",severity:"issue"},{state:"active",severity:"note"}];function sa(e){let t={id:"states",title:"Missing states",description:"Styles with no hover, focus, disabled, or active rule, counting rules they inherit from a shared base class."},n=e.variants.filter(r=>r.element&&r.element.ancestors.length===0);if(n.length===0)return xe(t,"No styles that can be drawn on their own.");let s=[];for(let{state:r,severity:o}of na){let i=n.filter(a=>!ta(a,e.variants,r));i.length!==0&&s.push({severity:o,message:i.length===n.length?`No style defines a ${r} state.`:`${i.length} of ${n.length} styles have no ${r} state.`,styles:i.length===n.length?void 0:i.map(a=>a.title),refs:i.slice(0,6).map(a=>Q(a.path,a.line))})}return ee(t,s,"Every style has hover, focus, disabled, and active rules.",r=>`${r} state${r===1?"":"s"} missing on some styles.`)}var or=new Set(["outline","outline-style","outline-width"]),ir=/^(?:none|0|0px)(?:\s+(?:none|0|0px))*$/i,ra=/^(?:outline(?:-color|-width|-style)?|box-shadow|border(?:-[a-z]+)*|background(?:-color)?|text-decoration(?:-[a-z]+)?|color)$/;function oa(e){let t={id:"focus",title:"Focus indicator removed",description:"Styles that remove the outline and give keyboard focus nothing in its place."},n=e.variants.filter(r=>r.element&&r.element.ancestors.length===0);if(n.length===0)return xe(t,"No styles that can be drawn on their own.");let s=[];for(let r of n){let o=ur(r,e.variants),i=o.filter(l=>{let c=ln(l);return c.includes("default")||c.includes("focus")}).flatMap(l=>l.declarations.map(c=>({s:l,d:c}))).find(({d:l})=>or.has(l.property)&&ir.test(l.value.replace(/\s*!important/i,"")));!i||o.filter(l=>ln(l).includes("focus")).some(l=>l.declarations.some(c=>ra.test(c.property)&&!(or.has(c.property)&&ir.test(c.value))&&!/^(?:none|0|0px)$/i.test(c.value)&&!(c.property==="box-shadow"&&/^none$/i.test(c.value))))||s.push({severity:"issue",message:`${r.title} removes the outline (${i.d.property}: ${i.d.value}) and no focus rule replaces it.`,styles:[r.title],refs:[Q(r.path,i.s.line)]})}return ee(t,s,"No style removes the outline without a focus replacement.",r=>`${r} style${r===1?"":"s"} lose the focus indicator.`)}function ia(e){let t={id:"tokens",title:"Undefined tokens",description:`Custom properties the ${e.noun} styles read that no scanned stylesheet defines.`};if(e.tokens.length===0)return xe(t,`The ${e.noun} styles read no custom properties.`);let s=e.tokens.filter(r=>r.definedIn.length===0&&!r.name.startsWith("--tw-")).map(r=>{let o=e.variants.filter(i=>i.states.some(a=>a.declarations.some(l=>l.value.includes(`var(${r.name}`)||new RegExp(`var\\(\\s*${r.name}\\b`).test(l.value))));return{severity:"note",message:`${r.name} is read but never defined here. It may be set outside the scanned files (a framework, a theme provider).`,styles:o.slice(0,8).map(i=>i.title),refs:o.slice(0,3).map(i=>Q(i.path,i.line))}});return ee(t,s,`All ${e.tokens.length} tokens read are defined.`,r=>`${r} token${r===1?"":"s"} with no definition.`)}var aa=/var\((?:[^()]|\([^()]*\))*\)/g,ar=/#[0-9a-f]{3,8}\b|\b(?:rgba?|hsla?)\([^)]*\)/gi,la=/^(?:padding|margin|gap|row-gap|column-gap|height|min-height|max-height|border-radius|font-size|letter-spacing)(?:-[a-z]+)*$/,ca=/(?<![\w.-])(\d+(?:\.\d+)?)px\b/g;function lr(e){let t=e.trim().toLowerCase().replace(/\s+/g,""),n=/^#([0-9a-f]{3})$/.exec(t);return n?`#${[...n[1]].map(s=>s+s).join("")}`:t}function cn(e,t,n=0){return n>6?e:e.replace(/var\(\s*(--[\w-]+)\s*(?:,\s*([^)]*))?\)/g,(s,r,o)=>{let i=t.get(r);return i!==void 0?cn(i,t,n+1):o!==void 0?cn(o.trim(),t,n+1):s})}var ua=[[/^(?:padding|margin|gap|row-gap|column-gap)/,/space|spacing|gap|pad|inset|gutter/i],[/height$/,/height|control|size/i],[/^border-radius/,/radius|round|corner/i],[/^font-size$/,/text|font|size|type/i],[/^letter-spacing$/,/tracking|letter|spacing/i]];function pa(e,t){if(!t)return null;let n=ua.find(([s])=>s.test(e))?.[1];return t.find(s=>!n||n.test(s))??null}function fa(e){let t={id:"hardcoded",title:"Hard-coded values",description:`Raw colors, and pixel sizes that exactly match a token, written into ${e.noun} styles instead of using the token.`},n=new Map,s=new Map;for(let[o,i]of e.tokenValues){let a=cn(i,e.tokenValues).trim();if(new RegExp(`^(?:${ar.source})$`,"i").test(a)){let l=lr(a);n.set(l,[...n.get(l)??[],o])}else/^\d+(?:\.\d+)?px$/.test(a)&&s.set(a,[...s.get(a)??[],o])}if(n.size===0&&s.size===0)return xe(t,"No color or size tokens were found to compare against.");let r=[];for(let o of e.variants){let i=[],a=null;for(let c of o.states)for(let p of c.declarations){if(p.via)continue;let f=p.value.replace(aa," ");for(let m of f.matchAll(ar)){let h=n.get(lr(m[0]));i.push(h?`${m[0]} in ${p.property} is the value of ${h[0]}`:`${m[0]} in ${p.property} is not a token`),a??=c}if(la.test(p.property))for(let m of f.matchAll(ca)){let h=pa(p.property,s.get(`${m[1]}px`));!h||Number(m[1])<=1||(i.push(`${m[1]}px in ${p.property} is the value of ${h}`),a??=c)}}if(i.length===0||!a)continue;let l=[...new Set(i)];r.push({severity:"issue",message:`${o.title}: ${l.slice(0,4).join("; ")}${l.length>4?`; and ${l.length-4} more`:""}.`,styles:[o.title],refs:[Q(o.path,a.line)]})}return ee(t,r,`No ${e.noun} style hard-codes a value a token already has.`,o=>`${o} style${o===1?"":"s"} hard-code values.`)}function da(e){let t={id:"unused",title:"Unused styles",description:"Styles defined in CSS that no component, page, or template references."},n=e.variants.filter(r=>r.element&&r.usage.status!=="unknown");if(n.length===0)return xe(t,"No styles with a class name to look for.");let s=[];for(let r of n)r.usage.status==="unreferenced"?s.push({severity:"issue",message:`${r.title} (${r.selector}) is defined but no reference to it was found.`,styles:[r.title],refs:[Q(r.path,r.line)]}):r.usage.status==="dynamic"&&s.push({severity:"note",message:`${r.title} (${r.selector}) is built at runtime and nothing selects it by value.`,styles:[r.title],refs:[Q(r.path,r.line),...r.usage.files.slice(0,2)]});return s.sort((r,o)=>+(o.severity==="issue")-+(r.severity==="issue")),ee(t,s,`All ${n.length} styles are referenced.`,r=>`${r} style${r===1?"":"s"} unreferenced or unconfirmed.`)}function ga(e){let t={id:"duplicates",title:"Duplicate styles",description:"Different styles whose default declarations are identical."},n=new Map;for(let r of e.variants){if(!r.element)continue;let o=r.states.filter(a=>a.state==="default"&&a.context==="").flatMap(a=>a.declarations).map(a=>`${a.property}:${a.value.replace(/\s+/g," ").trim()}`);if(o.length<2)continue;let i=[...new Set(o)].sort().join(";");n.set(i,[...n.get(i)??[],r])}let s=[...n.values()].filter(r=>r.length>1).map(r=>({severity:"issue",message:`${r.map(o=>o.title).join(", ")} declare the same default styles (${r.map(o=>o.selector).join(", ")}).`,styles:r.map(o=>o.title),refs:r.map(o=>Q(o.path,o.line))}));return ee(t,s,"No two styles share the same default declarations.",r=>`${r} group${r===1?"":"s"} of identical styles.`)}function ma(e){let t={id:"native",title:`Native <${e.element}> instead of the component`,description:`Files that render a raw <${e.element}> although the repository has a shared ${e.element} component.`};if(!e.hasComponent)return xe(t,`No shared ${e.element} component was found, so native elements are expected.`);let n=e.nativeUses.map(s=>({severity:"issue",message:`${s.count} native <${e.element}> element${s.count===1?"":"s"} in ${s.path}.`,refs:[Q(s.path,s.line)]}));return ee(t,n,`Every <${e.element}> goes through the component.`,s=>`${s} file${s===1?"":"s"} bypass the component.`)}function ha(e){let t={id:"props",title:"Prop values with no look",description:`Calls to a ${e.element} component with a literal prop value the component has no style for.`};if(!e.hasComponent)return xe(t,`No shared ${e.element} component was found.`);let n=(e.unknownProps??[]).map(s=>({severity:"issue",message:`<${s.component} ${s.prop}="${s.value}"> in ${s.path}: ${s.component} has no ${s.prop} "${s.value}" (it has ${s.known.join(", ")}).`,refs:[Q(s.path,s.line)]}));return ee(t,n,"Every literal prop value picks a look the component has.",s=>`${s} call${s===1?"":"s"} ask for a look the component does not have.`)}function ba(e){let t={id:"undocumented",title:"Styles without written guidance",description:"Styles that no instruction file or doc names, so nothing written says how they should be used."},{guidance:n}=e;if(n.files.length===0)return{...t,status:"attention",summary:`Nothing in the repository mentions ${e.noun}.`,findings:[{severity:"note",message:`No instruction file or doc says how ${e.noun} should look or be built.`,refs:[]}]};if(n.undocumented.length===0)return ee(t,[],"Every style is named in written guidance.",()=>"");let s=e.variants.filter(r=>r.element&&n.undocumented.includes(r.title));return ee(t,[{severity:"note",message:`${n.undocumented.length} of ${n.documented.length+n.undocumented.length} styles are named in no guidance.`,styles:n.undocumented,refs:s.slice(0,6).map(r=>Q(r.path,r.line))}],"",r=>`${r} finding${r===1?"":"s"}.`)}function pr(e){return[sa(e),oa(e),da(e),ga(e),ia(e),fa(e),ma(e),ha(e),ba(e)]}var ya=/\.(erb|php|hbs|njk|liquid|twig|ejs|pug|cshtml|razor|jinja2?|j2)$/i,fr=/^<([A-Za-z][\w.-]*)\b((?:[^<>"'`{}]|"[^"]*"|'[^']*'|`[^`]*`|\{(?:[^{}]|\{[^{}]*\})*\})*)>/,xa=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]),wa=new Set(["span","svg","i","img","em","strong","small","b","p","kbd","abbr","sup","sub","picture","use","path"]),ka=new Set(["classNames","classnames","clsx","cn","cx"]),va=/^(?:ref|key|style|dangerouslySetInnerHTML)$/i;function mr(e,t){let n=1;for(let s=0;s<t&&s<e.length;s++)e[s]===`
|
|
40
|
-
`&&n++;return n}function
|
|
41
|
-
`)}function
|
|
39
|
+
Set up Gruum in Cursor so checks run while you edit and before a commit? (y) yes, (n) no: `}function Us(e){let t=e.trim().toLowerCase();return!t||t==="n"||t==="no"||t==="q"||t==="quit"?"no":t==="y"||t==="yes"?"yes":null}function Vs(e){let t=e.trim().toLowerCase();return!t||t==="q"||t==="quit"?"quit":t==="c"||t==="check"?"check":t==="b"||t==="baseline"?"baseline":null}function zs(e){let t=e.trim().toLowerCase();return!t||t==="q"||t==="quit"||t==="n"||t==="no"?"quit":t==="b"||t==="baseline"||t==="y"||t==="yes"?"baseline":null}function Ws(e){let t=e.trim().toLowerCase();if(!t)return"quit";let n=Number(t);return Number.isInteger(n)&&n>=1&&n<=Ie.length?Ie[n-1]:Ie.find(s=>s.name===t)??null}var Fi="2025-06-18",it=`Check before you finish. If the request needs a button the spec does not have, ask the user: "You asked for a design element that is not in the spec. 1. Use an existing spec style for it. 2. Add it as it is and request review." Do not request a review until they choose 2. Never edit Gruum's generated files, including .gruum/project.json, to make a check pass.`,at={gruum_button_spec:`The designer-published button spec for this repository: components, looks and how to select them, tokens, and written rules. Read it before writing or restyling a button. ${it}`,gruum_check_buttons:`Check the working tree's buttons against the spec and list drift items with a one-line fix each. Run it before you stop. ${it}`,gruum_request_exception:`Ask a designer to review one drift item. Call this only after the user chooses to add the element as it is and request review. Send the drift id from gruum_check_buttons and a reason. If this tool is missing, run \`npx @gruum/cli request <drift id> --reason "..."\` instead of reading the CLI package. ${it}`,gruum_exception_status:`Pending, accepted, or rejected for this branch's exception requests. Pass an id to read one. ${it}`};function Gs(e){return[{name:"gruum_button_spec",description:at.gruum_button_spec,inputSchema:{type:"object",properties:{},additionalProperties:!1},run:()=>e.spec()},{name:"gruum_check_buttons",description:at.gruum_check_buttons,inputSchema:{type:"object",properties:{paths:{type:"array",items:{type:"string"},description:"Only report drift in these files (relative to the repository root). Omit to check everything."}},additionalProperties:!1},run:t=>{let n=Array.isArray(t.paths)?t.paths.filter(s=>typeof s=="string"):[];return e.check(n)}},{name:"gruum_request_exception",description:at.gruum_request_exception,inputSchema:{type:"object",properties:{driftId:{type:"string",description:"The drift item id from gruum_check_buttons."},reason:{type:"string",description:"Why the spec has no button for this job."}},required:["driftId","reason"],additionalProperties:!1},run:t=>e.request(typeof t.driftId=="string"?t.driftId:"",typeof t.reason=="string"?t.reason:"")},{name:"gruum_exception_status",description:at.gruum_exception_status,inputSchema:{type:"object",properties:{id:{type:"string",description:"One request id. Omit to list this branch."}},additionalProperties:!1},run:t=>e.status(typeof t.id=="string"?t.id:void 0)}]}function Ge(e,t){return{jsonrpc:"2.0",id:e,result:t}}function lt(e,t,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:n}}}async function Hs(e,t,n){if(!e||typeof e!="object")return lt(null,-32600,"Invalid request");let s=e,r=!("id"in s),o=s.id??null;if(typeof s.method!="string")return r?null:lt(o,-32600,"Invalid request");let i=s.params??{};switch(s.method){case"initialize":{let a=i.protocolVersion;return Ge(o,{protocolVersion:typeof a=="string"?a:Fi,capabilities:{tools:{listChanged:!1}},serverInfo:n})}case"ping":return Ge(o,{});case"tools/list":return Ge(o,{tools:t.map(({name:a,description:l,inputSchema:c})=>({name:a,description:l,inputSchema:c}))});case"tools/call":{let a=t.find(c=>c.name===i.name);if(!a)return lt(o,-32602,`Unknown tool: ${String(i.name)}`);let l=i.arguments&&typeof i.arguments=="object"?i.arguments:{};try{let c=await a.run(l);return Ge(o,{content:[{type:"text",text:c.text}],isError:c.isError??!1})}catch(c){return Ge(o,{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0})}}default:return r?null:lt(o,-32601,`Method not found: ${s.method}`)}}var Bi=/(^|\/)(node_modules|\.git|\.next|dist|build|out|coverage|vendor|\.turbo|\.cache|__pycache__|target|\.venv|venv)\//,Ui=/(^|\/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb|Cargo\.lock|poetry\.lock|composer\.lock|Gemfile\.lock)$/,Vi=/\.(png|jpe?g|gif|webp|avif|ico|icns|bmp|tiff?|svgz|woff2?|ttf|otf|eot|mp[34]|wav|ogg|webm|mov|zip|gz|tgz|bz2|7z|rar|jar|pdf|docx?|xlsx?|pptx?|exe|dll|so|dylib|wasm|bin|dat|sqlite|db|psd|ai|sketch|fig)$/i,zi=/(^|\/)\.gruum\//;function tn(e){return!Bi.test(`${e}/`)&&!zi.test(`${e}/`)}function nn(e,t){return Ui.test(e)||Vi.test(e)?!1:t<=3e5}function Ks(e){let t=Math.min(e.length,8e3);for(let n=0;n<t;n++)if(e[n]===0)return!0;return!1}var Wi=/\.(css|scss|sass|less|styl|tsx?|jsx?|mjs|cjs|vue|svelte|astro|html?|mdx?|erb|php|hbs|njk|liquid|twig|ejs|pug|cshtml|razor|jinja2?|j2|json)$/i;function Js(e){return Wi.test(e)}function sn(e){return e.replace(/\\/g,"/").replace(/^\.\/?/,"").replace(/^\/+|\/+$/g,"")}function rn(e,t){let n=sn(t),s=e.replace(/\\/g,"/");return n?s.startsWith(`${n}/`)?s.slice(n.length+1):null:s}function Zs(e,t,n){let s=new Map(e);for(let r of t){let o=rn(r.path,n);o===null||!tn(o.split("/").slice(0,-1).join("/")||".")||(r.content===null?s.delete(o):nn(o,r.content.length)&&s.set(o,r.content))}return s}function qs(e){let t=e.split("\0").filter(Boolean),n=[];for(let s=0;s<t.length;s++){let r=t[s];if(/^[RC]/.test(r)){let i=t[++s],a=t[++s];r.startsWith("R")&&i&&n.push({path:i,deleted:!0}),a&&n.push({path:a,deleted:!1});continue}let o=t[++s];o&&n.push({path:o,deleted:r.startsWith("D")})}return n}function ct(e){let t=/^(?:git@|ssh:\/\/git@|https?:\/\/(?:[^@/]+@)?)github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?\/?$/i.exec(e.trim());return t?`${t[1]}/${t[2]}`:null}var Xs=e=>e.replace(/\\(.)/g,"$1");function Gi(e){let t=e;for(;;){let n=/:(?:global|local)\(/i.exec(t);if(!n)break;let s=0,r=-1;for(let i=n.index+n[0].length-1;i<t.length;i++){let a=t[i];if(a==="(")s++;else if(a===")"&&--s===0){r=i;break}}if(r<0)break;let o=t.slice(n.index+n[0].length,r).trim();t=`${t.slice(0,n.index)}${o}${t.slice(r+1)}`}return t.replace(/:(?:global|local)(?=\s|$)/gi,"").trim()}var on=/\*|[a-z][\w-]*|\.((?:\\.|[\w-])+)|#((?:\\.|[\w-])+)|\[\s*([\w-]+)\s*(?:([~|^$*]?=)\s*(?:"([^"]*)"|'([^']*)'|([^\]\s]*)))?\s*[is]?\s*\]|::([\w-]+)|:([\w-]+)(\((?:[^()]|\([^()]*\))*\))?/giy;function er(e){let t=[];on.lastIndex=0;let n=0;for(;n<e.length;){on.lastIndex=n;let s=on.exec(e);if(!s||s.index!==n)return null;let r=s[0];if(n+=r.length,r==="*")t.push({kind:"universal",raw:r});else if(s[1]!==void 0)t.push({kind:"class",raw:r,name:Xs(s[1])});else if(s[2]!==void 0)t.push({kind:"id",raw:r,name:Xs(s[2])});else if(s[3]!==void 0)t.push({kind:"attr",raw:r,name:s[3],op:s[4]??null,value:s[4]?s[5]??s[6]??s[7]??"":null});else if(s[8]!==void 0)t.push({kind:"pseudoElement",raw:r,name:s[8].toLowerCase()});else if(s[9]!==void 0){let o=s[9].toLowerCase();/^(?:before|after|first-line|first-letter)$/.test(o)?t.push({kind:"pseudoElement",raw:r,name:o}):t.push({kind:"pseudo",raw:r,name:o,args:s[10]?s[10].slice(1,-1).trim():null})}else if(t.length===0)t.push({kind:"tag",raw:r,name:r.toLowerCase()});else return null}return t.length?t:null}function Q(e){let t=Gi(e),n=[],s=0,r=0,o=null,i=!0,a=l=>{let c=t.slice(r,l).trim();if(!c)return!0;let u=er(c);return u?(n.push({combinator:i?null:o??" ",simples:u}),i=!1,o=null,!0):!1};for(let l=0;l<t.length;l++){let c=t[l];if(c==="("||c==="[")s++;else if(c===")"||c==="]")s=Math.max(0,s-1);else if(s===0&&(c===">"||c==="+"||c==="~")){if(!a(l)||o)return null;o=c,r=l+1}else if(s===0&&/\s/.test(c)){if(!a(l))return null;r=l+1}}return!a(t.length)||o?null:n.length?n:null}function He(e){return e.map(t=>t.raw).join("")}function Ke(e){return e.map((t,n)=>{let s=He(t.simples);return n===0?s:t.combinator===" "?` ${s}`:` ${t.combinator} ${s}`}).join("")}function W(e){let t=[],n=0,s=0;for(let r=0;r<e.length;r++){let o=e[r];o==="("||o==="["?n++:o===")"||o==="]"?n=Math.max(0,n-1):o===","&&n===0&&(t.push(e.slice(s,r).trim()),s=r+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}var tr=e=>e.replace(/([a-z\d])([A-Z])/g,"$1-$2").split(/[^a-z0-9]+/i).filter(Boolean).map(t=>t.toLowerCase());function Ys(e,t){let n=e.toLowerCase();return t.some(s=>n.includes(s.toLowerCase()))}function an(e,t){let n=t.excludeClassKeywords;if(!n?.length)return!1;let s=new Set(n.flatMap(r=>[r.toLowerCase(),`${r.toLowerCase()}s`]));return e.some(r=>r.kind==="class"&&tr(r.name).some(o=>s.has(o)))}var Hi=new Set(["html","body"]),Ki=new Set(["svg","path","use","img","picture","video","i","em","strong","b","small","kbd","sup","sub"]);function pt(e,t){for(let n of e)switch(n.kind){case"tag":if(t.elements.includes(n.name))return!0;break;case"class":if(Ys(n.name,t.classKeywords))return!0;break;case"attr":if(n.name==="role"&&n.value!==null&&t.roles.includes(n.value.toLowerCase())||n.name==="data-component"&&n.value!==null&&Ys(n.value,t.classKeywords))return!0;break;case"pseudo":if((n.name==="is"||n.name==="where")&&n.args){let s=W(n.args).map(Q);if(s.length>0&&s.every(r=>r!==null&&pt(r[r.length-1].simples,t)))return!0}break;default:break}return!1}function nr(e){return e.some(n=>n.kind==="universal")?e.length===1:e.some(n=>n.kind==="tag"&&Hi.has(n.name))?!0:!e.some(n=>n.kind==="tag"||n.kind==="class"||n.kind==="attr"||n.kind==="id"||n.kind==="pseudo"&&(n.name==="is"||n.name==="where"))}function sr(e){return e.some(t=>t.kind==="tag"&&Ki.has(t.name))}var ut=["hover","focus","active","selected","current","loading","disabled"],Ji={hover:"hover",hovered:"hover",focus:"focus",focused:"focus","focus-visible":"focus","focus-within":"focus",active:"selected",pressed:"selected",selected:"selected",checked:"selected",on:"selected",current:"current",loading:"loading",busy:"loading",pending:"loading",disabled:"disabled"},Zi={hover:"hover",focus:"focus","focus-visible":"focus","focus-within":"focus",active:"active",checked:"selected",disabled:"disabled"},qi={disabled:"disabled","aria-disabled":"disabled","data-disabled":"disabled","aria-pressed":"selected","aria-selected":"selected","aria-expanded":"selected","aria-checked":"selected","data-active":"selected","data-selected":"selected","data-pressed":"selected","data-checked":"selected","data-highlighted":"selected","aria-current":"current","aria-busy":"loading","data-loading":"loading","data-busy":"loading","data-hover":"hover","data-hovered":"hover","data-focus":"focus","data-focused":"focus","data-focus-visible":"focus","data-open":"open","data-expanded":"open"},Xi=new Set(["active","selected","pressed","checked","loading","busy","disabled","open","current","hover","focus","show","expanded","collapsed"]),Qs=e=>Ji[e.toLowerCase()]??e.toLowerCase(),ce={hover:"__gs-hover",focus:"__gs-focus",active:"__gs-active"};function rr(e){if(e.kind==="pseudo"){let t=Zi[e.name];if(!t)return null;let n=ce[t];return{state:t,marker:n?{classes:[n],attrs:{}}:{classes:[],attrs:{[e.name==="checked"?"checked":"disabled"]:""}}}}if(e.kind==="attr"){if(e.name==="data-state"&&e.value!==null)return{state:Qs(e.value),marker:{classes:[],attrs:{"data-state":e.value}}};let t=qi[e.name];if(!t||e.value!==null&&/^(?:false|off|0)$/i.test(e.value))return null;let n=e.value??(e.name.startsWith("aria-")?"true":"");return{state:t,marker:{classes:[],attrs:{[e.name]:n}}}}if(e.kind==="class"){let t=/^(?:is|has)-(.+)$/i.exec(e.name),n=t?t[1]:Xi.has(e.name.toLowerCase())?e.name:null;return n?{state:Qs(n),marker:{classes:[e.name],attrs:{}}}:null}return null}function Yi(e){return e.kind!=="pseudo"||e.name!=="not"||!e.args?!1:W(e.args).every(t=>{let n=er(t);return n!==null&&n.every(s=>rr(s)!==null)})}function ft(e){let t=[],n=new Map;for(let o of e){if(Yi(o))continue;let i=rr(o);if(!i){t.push(o);continue}let a=n.get(i.state)??{classes:[],attrs:{}};for(let l of i.marker.classes)a.classes.includes(l)||a.classes.push(l);Object.assign(a.attrs,i.marker.attrs),n.set(i.state,a)}let s=[...n.keys()].sort((o,i)=>H(o)-H(i)||o.localeCompare(i)),r={classes:[],attrs:{}};for(let o of s){let i=n.get(o);r.classes.push(...i.classes),Object.assign(r.attrs,i.attrs)}return{identity:t,states:s,marker:r}}function H(e){if(e==="default")return-1;let t=ut.indexOf(e);return t===-1?ut.length:t}function be(e){return e.length?e.join(" + "):"default"}function ln(e){return e.replace(/:hover\b/g,`.${ce.hover}`).replace(/:focus(?:-visible|-within)?\b/g,`.${ce.focus}`).replace(/:active\b/g,`.${ce.active}`)}var Qi=new Set(["background","background-color","background-image","background-position","background-size","background-repeat","background-clip","background-origin","background-attachment","color","border-color","border-top-color","border-right-color","border-bottom-color","border-left-color","outline","outline-color","outline-offset","box-shadow","filter","backdrop-filter","opacity","fill","stroke","caret-color","accent-color","text-decoration-color","mix-blend-mode"]),ea=new Set(["width","min-width","max-width","flex","flex-grow","flex-shrink","flex-basis","align-self","justify-self","order","margin","margin-top","margin-right","margin-bottom","margin-left","margin-inline","margin-block","margin-inline-start","margin-inline-end","margin-block-start","margin-block-end","position","inset","inset-inline","inset-block","top","right","bottom","left","z-index","float","clear","grid-column","grid-row","grid-area","place-self"]),ta=new Set(["cursor","user-select","pointer-events","transition","transition-property","transition-duration","transition-timing-function","transition-delay","will-change","touch-action","-webkit-tap-highlight-color","appearance","-webkit-appearance","scroll-margin","scroll-margin-top"]);function Je(e){let t=e.toLowerCase();return Qi.has(t)?"paint":ea.has(t)?"layout":ta.has(t)?"hint":"box"}var na={shadow:/^box-shadow$/,cursor:/^cursor$/,rounded:/^border(?:-[a-z]+)*-radius$/,radius:/^border(?:-[a-z]+)*-radius$/};function or(e,t){let n=e.filter(o=>o.kind==="class");if(n.length!==1||e.length!==1)return!1;let s=tr(n[0].name)[0],r=s?na[s]:void 0;return r?t.length>0&&t.every(o=>r.test(o.property.toLowerCase())):!1}var Fu={hover:{classes:[ce.hover],attrs:{}},focus:{classes:[ce.focus],attrs:{}},active:{classes:[ce.active],attrs:{}},selected:{classes:[],attrs:{"aria-pressed":"true"}},current:{classes:[],attrs:{"aria-current":"true"}},loading:{classes:[],attrs:{"aria-busy":"true"}},disabled:{classes:[],attrs:{disabled:""}}};var sa="data-gs-sheet";function ar(e){return`[${sa}="${e.replace(/["\\]/g,"")}"]`}function ir(e){return/\.module\.[a-z]+$/i.test(e)}var ra=new Set(["button","a","div","span","input","summary","label"]);function ye(e){let t=0,n=0;for(let s=0;s<e.length;s++){let r=e[s];r==="("||r==="["?t++:r===")"||r==="]"?t=Math.max(0,t-1):t===0&&/[\s>+~]/.test(r)&&(n=s+1)}return n}function oa(e){let t={tag:"",classes:[],attrs:{}};for(let n of e)switch(n.kind){case"pseudoElement":return null;case"tag":t.tag=n.name;break;case"class":t.classes.push(n.name);break;case"attr":t.attrs[n.name]=n.value??"";break;default:break}return t}function dt(e,t){let n=Q(e);if(!n||n.some(c=>c.combinator==="+"||c.combinator==="~"))return null;let s=n.map(c=>oa(c.simples));if(s.some(c=>c===null))return null;let r=s,o=r[r.length-1],i=o.tag&&o.tag!=="*"?o.tag:"button";if(!ra.has(i)||o.classes.length===0&&Object.keys(o.attrs).length===0&&!o.tag)return null;let a=[...new Set([...t,...o.classes])],l=r.slice(0,-1).filter(c=>c.tag||c.classes.length||Object.keys(c.attrs).length).map(c=>({...c,tag:c.tag&&c.tag!=="*"?c.tag:"div"}));return{tag:i,classes:a,attrs:o.attrs,ancestors:l}}function cn(e,t){let n="";for(let s of e)s.property.toLowerCase()===t&&(n=s.value.replace(/!important\s*$/i,"").trim());return n}function gt(e){let t=cn(e,"display");if(/^none\b/i.test(t))return"display: none";let n=cn(e,"visibility");if(/^(hidden|collapse)\b/i.test(n))return`visibility: ${n.split(/\s+/)[0].toLowerCase()}`;let s=cn(e,"opacity");return/^(0|0\.0+)$/.test(s)?"opacity: 0":null}function lr(e,t){return e===t||!ir(e)&&!ir(t)}function se(e,t){if(/[<>]|@import|expression\(|javascript:|behavior\s*:/i.test(t))return!1;for(let n of t.matchAll(/url\(\s*(['"]?)([^'")]*)\1\s*\)/gi))if(!/^data:image\//i.test(n[2]))return!1;return/^-{0,2}[a-z][\w-]*$/i.test(e)}var ia=40,ee=(e,t)=>({path:e,line:t});function te(e,t,n,s){return{...e,status:t.length===0?"ok":"attention",summary:t.length===0?n:s(t.length),findings:t.slice(0,ia)}}function xe(e,t){return{...e,status:"na",summary:t,findings:[]}}var un=e=>e.state.split(" + ");function dr(e,t){if(!e.element||!t.element||e!==t&&!lr(e.path,t.path)||e.element.ancestors.length>0||e.element.tag!==t.element.tag)return!1;let n=new Set(t.element.classes);return e.element.classes.every(s=>n.has(s))?Object.entries(e.element.attrs).every(([s,r])=>t.element.attrs[s]===r):!1}function gr(e,t){return t.filter(n=>dr(n,e)).flatMap(n=>n.states)}function aa(e,t,n){return gr(e,t).some(s=>un(s).includes(n))||t.filter(s=>dr(s,e)).some(s=>(s.parts??[]).some(r=>r.state.split(" + ").includes(n)))}var la=[{state:"hover",severity:"issue"},{state:"focus",severity:"issue"},{state:"disabled",severity:"issue"},{state:"active",severity:"note"}];function ca(e){let t={id:"states",title:"Missing states",description:"Styles with no hover, focus, disabled, or active rule, counting rules they inherit from a shared base class."},n=e.variants.filter(r=>r.element&&r.element.ancestors.length===0);if(n.length===0)return xe(t,"No styles that can be drawn on their own.");let s=[];for(let{state:r,severity:o}of la){let i=n.filter(a=>!aa(a,e.variants,r));i.length!==0&&s.push({severity:o,message:i.length===n.length?`No style defines a ${r} state.`:`${i.length} of ${n.length} styles have no ${r} state.`,styles:i.length===n.length?void 0:i.map(a=>a.title),refs:i.slice(0,6).map(a=>ee(a.path,a.line))})}return te(t,s,"Every style has hover, focus, disabled, and active rules.",r=>`${r} state${r===1?"":"s"} missing on some styles.`)}var cr=new Set(["outline","outline-style","outline-width"]),ur=/^(?:none|0|0px)(?:\s+(?:none|0|0px))*$/i,ua=/^(?:outline(?:-color|-width|-style)?|box-shadow|border(?:-[a-z]+)*|background(?:-color)?|text-decoration(?:-[a-z]+)?|color)$/;function pa(e){let t={id:"focus",title:"Focus indicator removed",description:"Styles that remove the outline and give keyboard focus nothing in its place."},n=e.variants.filter(r=>r.element&&r.element.ancestors.length===0);if(n.length===0)return xe(t,"No styles that can be drawn on their own.");let s=[];for(let r of n){let o=gr(r,e.variants),i=o.filter(l=>{let c=un(l);return c.includes("default")||c.includes("focus")}).flatMap(l=>l.declarations.map(c=>({s:l,d:c}))).find(({d:l})=>cr.has(l.property)&&ur.test(l.value.replace(/\s*!important/i,"")));!i||o.filter(l=>un(l).includes("focus")).some(l=>l.declarations.some(c=>ua.test(c.property)&&!(cr.has(c.property)&&ur.test(c.value))&&!/^(?:none|0|0px)$/i.test(c.value)&&!(c.property==="box-shadow"&&/^none$/i.test(c.value))))||s.push({severity:"issue",message:`${r.title} removes the outline (${i.d.property}: ${i.d.value}) and no focus rule replaces it.`,styles:[r.title],refs:[ee(r.path,i.s.line)]})}return te(t,s,"No style removes the outline without a focus replacement.",r=>`${r} style${r===1?"":"s"} lose the focus indicator.`)}function fa(e){let t={id:"tokens",title:"Undefined tokens",description:`Custom properties the ${e.noun} styles read that no scanned stylesheet defines.`};if(e.tokens.length===0)return xe(t,`The ${e.noun} styles read no custom properties.`);let s=e.tokens.filter(r=>r.definedIn.length===0&&!r.name.startsWith("--tw-")).map(r=>{let o=e.variants.filter(i=>i.states.some(a=>a.declarations.some(l=>l.value.includes(`var(${r.name}`)||new RegExp(`var\\(\\s*${r.name}\\b`).test(l.value))));return{severity:"note",message:`${r.name} is read but never defined here. It may be set outside the scanned files (a framework, a theme provider).`,styles:o.slice(0,8).map(i=>i.title),refs:o.slice(0,3).map(i=>ee(i.path,i.line))}});return te(t,s,`All ${e.tokens.length} tokens read are defined.`,r=>`${r} token${r===1?"":"s"} with no definition.`)}var da=/var\((?:[^()]|\([^()]*\))*\)/g,pr=/#[0-9a-f]{3,8}\b|\b(?:rgba?|hsla?)\([^)]*\)/gi,ga=/^(?:padding|margin|gap|row-gap|column-gap|height|min-height|max-height|border-radius|font-size|letter-spacing)(?:-[a-z]+)*$/,ma=/(?<![\w.-])(\d+(?:\.\d+)?)px\b/g;function fr(e){let t=e.trim().toLowerCase().replace(/\s+/g,""),n=/^#([0-9a-f]{3})$/.exec(t);return n?`#${[...n[1]].map(s=>s+s).join("")}`:t}function pn(e,t,n=0){return n>6?e:e.replace(/var\(\s*(--[\w-]+)\s*(?:,\s*([^)]*))?\)/g,(s,r,o)=>{let i=t.get(r);return i!==void 0?pn(i,t,n+1):o!==void 0?pn(o.trim(),t,n+1):s})}var ha=[[/^(?:padding|margin|gap|row-gap|column-gap)/,/space|spacing|gap|pad|inset|gutter/i],[/height$/,/height|control|size/i],[/^border-radius/,/radius|round|corner/i],[/^font-size$/,/text|font|size|type/i],[/^letter-spacing$/,/tracking|letter|spacing/i]];function ba(e,t){if(!t)return null;let n=ha.find(([s])=>s.test(e))?.[1];return t.find(s=>!n||n.test(s))??null}function ya(e){let t={id:"hardcoded",title:"Hard-coded values",description:`Raw colors, and pixel sizes that exactly match a token, written into ${e.noun} styles instead of using the token.`},n=new Map,s=new Map;for(let[o,i]of e.tokenValues){let a=pn(i,e.tokenValues).trim();if(new RegExp(`^(?:${pr.source})$`,"i").test(a)){let l=fr(a);n.set(l,[...n.get(l)??[],o])}else/^\d+(?:\.\d+)?px$/.test(a)&&s.set(a,[...s.get(a)??[],o])}if(n.size===0&&s.size===0)return xe(t,"No color or size tokens were found to compare against.");let r=[];for(let o of e.variants){let i=[],a=null;for(let c of o.states)for(let u of c.declarations){if(u.via)continue;let f=u.value.replace(da," ");for(let m of f.matchAll(pr)){let h=n.get(fr(m[0]));i.push(h?`${m[0]} in ${u.property} is the value of ${h[0]}`:`${m[0]} in ${u.property} is not a token`),a??=c}if(ga.test(u.property))for(let m of f.matchAll(ma)){let h=ba(u.property,s.get(`${m[1]}px`));!h||Number(m[1])<=1||(i.push(`${m[1]}px in ${u.property} is the value of ${h}`),a??=c)}}if(i.length===0||!a)continue;let l=[...new Set(i)];r.push({severity:"issue",message:`${o.title}: ${l.slice(0,4).join("; ")}${l.length>4?`; and ${l.length-4} more`:""}.`,styles:[o.title],refs:[ee(o.path,a.line)]})}return te(t,r,`No ${e.noun} style hard-codes a value a token already has.`,o=>`${o} style${o===1?"":"s"} hard-code values.`)}function xa(e){let t={id:"unused",title:"Unused styles",description:"Styles defined in CSS that no component, page, or template references."},n=e.variants.filter(r=>r.element&&r.usage.status!=="unknown");if(n.length===0)return xe(t,"No styles with a class name to look for.");let s=[];for(let r of n)r.usage.status==="unreferenced"?s.push({severity:"issue",message:`${r.title} (${r.selector}) is defined but no reference to it was found.`,styles:[r.title],refs:[ee(r.path,r.line)]}):r.usage.status==="dynamic"&&s.push({severity:"note",message:`${r.title} (${r.selector}) is built at runtime and nothing selects it by value.`,styles:[r.title],refs:[ee(r.path,r.line),...r.usage.files.slice(0,2)]});return s.sort((r,o)=>+(o.severity==="issue")-+(r.severity==="issue")),te(t,s,`All ${n.length} styles are referenced.`,r=>`${r} style${r===1?"":"s"} unreferenced or unconfirmed.`)}function ka(e){let t={id:"duplicates",title:"Duplicate styles",description:"Different styles whose default declarations are identical."},n=new Map;for(let r of e.variants){if(!r.element)continue;let o=r.states.filter(a=>a.state==="default"&&a.context==="").flatMap(a=>a.declarations).map(a=>`${a.property}:${a.value.replace(/\s+/g," ").trim()}`);if(o.length<2)continue;let i=[...new Set(o)].sort().join(";");n.set(i,[...n.get(i)??[],r])}let s=[...n.values()].filter(r=>r.length>1).map(r=>({severity:"issue",message:`${r.map(o=>o.title).join(", ")} declare the same default styles (${r.map(o=>o.selector).join(", ")}).`,styles:r.map(o=>o.title),refs:r.map(o=>ee(o.path,o.line))}));return te(t,s,"No two styles share the same default declarations.",r=>`${r} group${r===1?"":"s"} of identical styles.`)}function wa(e){let t={id:"native",title:`Native <${e.element}> instead of the component`,description:`Files that render a raw <${e.element}> although the repository has a shared ${e.element} component.`};if(!e.hasComponent)return xe(t,`No shared ${e.element} component was found, so native elements are expected.`);let n=e.nativeUses.map(s=>({severity:"issue",message:`${s.count} native <${e.element}> element${s.count===1?"":"s"} in ${s.path}.`,refs:[ee(s.path,s.line)]}));return te(t,n,`Every <${e.element}> goes through the component.`,s=>`${s} file${s===1?"":"s"} bypass the component.`)}function va(e){let t={id:"props",title:"Prop values with no look",description:`Calls to a ${e.element} component with a literal prop value the component has no style for.`};if(!e.hasComponent)return xe(t,`No shared ${e.element} component was found.`);let n=(e.unknownProps??[]).map(s=>({severity:"issue",message:`<${s.component} ${s.prop}="${s.value}"> in ${s.path}: ${s.component} has no ${s.prop} "${s.value}" (it has ${s.known.join(", ")}).`,refs:[ee(s.path,s.line)]}));return te(t,n,"Every literal prop value picks a look the component has.",s=>`${s} call${s===1?"":"s"} ask for a look the component does not have.`)}function $a(e){let t={id:"undocumented",title:"Styles without written guidance",description:"Styles that no instruction file or doc names, so nothing written says how they should be used."},{guidance:n}=e;if(n.files.length===0)return{...t,status:"attention",summary:`Nothing in the repository mentions ${e.noun}.`,findings:[{severity:"note",message:`No instruction file or doc says how ${e.noun} should look or be built.`,refs:[]}]};if(n.undocumented.length===0)return te(t,[],"Every style is named in written guidance.",()=>"");let s=e.variants.filter(r=>r.element&&n.undocumented.includes(r.title));return te(t,[{severity:"note",message:`${n.undocumented.length} of ${n.documented.length+n.undocumented.length} styles are named in no guidance.`,styles:n.undocumented,refs:s.slice(0,6).map(r=>ee(r.path,r.line))}],"",r=>`${r} finding${r===1?"":"s"}.`)}function mr(e){return[ca(e),pa(e),xa(e),ka(e),fa(e),ya(e),wa(e),va(e),$a(e)]}var Ca=/\.(erb|php|hbs|njk|liquid|twig|ejs|pug|cshtml|razor|jinja2?|j2)$/i,hr=/^<([A-Za-z][\w.-]*)\b((?:[^<>"'`{}]|"[^"]*"|'[^']*'|`[^`]*`|\{(?:[^{}]|\{[^{}]*\})*\})*)>/,Sa=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]),Ra=new Set(["span","svg","i","img","em","strong","small","b","p","kbd","abbr","sup","sub","picture","use","path"]),Aa=new Set(["classNames","classnames","clsx","cn","cx"]),_a=/^(?:ref|key|style|dangerouslySetInnerHTML)$/i;function xr(e,t){let n=1;for(let s=0;s<t&&s<e.length;s++)e[s]===`
|
|
40
|
+
`&&n++;return n}function br(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function kr(e){let t=e.filter(s=>s.trim()).map(s=>/^ */.exec(s)?.[0].length??0),n=t.length?Math.min(...t):0;return e.map(s=>{let r=s.slice(n);return r.length>200?`${r.slice(0,200)}\u2026`:r}).join(`
|
|
41
|
+
`)}function Ia(e,t,n){let s=Math.max(0,Math.min(t,e.length)),r=Math.max(s,Math.min(n,e.length)),o=xr(e,s),i=e.slice(s,r).split(`
|
|
42
42
|
`).slice(0,12),a=e.slice(s,r).split(`
|
|
43
|
-
`).length>12;return{source:
|
|
44
|
-
\u2026`:""),startLine:o}}function
|
|
45
|
-
`),r=Math.max(0,n-1);return{source:hr(s.slice(r,r+12)),startLine:r+1}}function gr(e,t){return{kind:"other",...Ca(e,t)}}function yt(e,t){let n=fr.exec(e.slice(t));if(!n)return null;let s=n[1],r=n[2]??"",o=t+n[0].length;if(/\/\s*$/.test(r)||xa.has(s.toLowerCase()))return{tag:s,attrs:r,openStart:t,openEnd:o,closeEnd:o,body:""};let a=1,l=o,c=Math.min(e.length,t+4e3);for(;l<c;){if(e[l]!=="<"){l++;continue}if(e.startsWith("</",l)){let f=/^<\/([A-Za-z][\w.-]*)\s*>/.exec(e.slice(l));if(f&&f[1].toLowerCase()===s.toLowerCase()){if(a--,a===0){let m=l+f[0].length;return{tag:s,attrs:r,openStart:t,openEnd:o,closeEnd:m,body:e.slice(o,l)}}l+=f?f[0].length:2;continue}l+=f?f[0].length:2;continue}let p=fr.exec(e.slice(l));if(p&&p[1].toLowerCase()===s.toLowerCase()&&!/\/\s*$/.test(p[2]??"")&&(a++,a>6))return"too-big";l+=p?p[0].length:1}return l>=c&&o+(c-t)>=4e3?"too-big":null}function pn(e,t){let n=Math.max(0,t-8e3),s=Math.min(t,e.length-1);for(;s>=n;){let r=e.lastIndexOf("<",s);if(r<n)return null;if(e[r+1]==="/"||e[r+1]==="!"||e[r+1]==="?"){s=r-1;continue}let o=yt(e,r);if(o==="too-big")return"too-big";if(o&&t>=o.openStart&&t<o.closeEnd)return o;s=r-1}return null}function br(e){return e.replace(/([a-z\d])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}function je(e){return e.split(/\s+/).filter(Boolean)}function ue(e,t){let n=e[t];if(n!=='"'&&n!=="'"&&n!=="`")return null;let s="";for(let r=t+1;r<e.length;r++){let o=e[r];if(o==="\\"){s+=e[r+1]??"",r++;continue}if(n==="`"&&o==="$"&&e[r+1]==="{")return null;if(o===n)return{value:s,end:r+1};s+=o}return null}function yr(e){let t=[],n="",s=0,r=null;for(let o=0;o<e.length;o++){let i=e[o];if(r){if(n+=i,i==="\\"){n+=e[o+1]??"",o++;continue}i===r&&(r=null);continue}if(i==='"'||i==="'"||i==="`"){r=i,n+=i;continue}if(i==="("||i==="["||i==="{")s++;else if(i===")"||i==="]"||i==="}")s=Math.max(0,s-1);else if(i===","&&s===0){n.trim()&&t.push(n.trim()),n="";continue}n+=i}return n.trim()&&t.push(n.trim()),t}function ht(e=new Map,t=new Map){return{values:e,aliases:t,flags:new Set,strings:new Set,prefixes:new Map}}var un=/^[A-Za-z_$][\w$]*$/;function fn(e,t){let n=0,s=null;for(let r=0;r<e.length;r++){let o=e[r];if(s){o==="\\"?r++:o===s&&(s=null);continue}if(o==='"'||o==="'"||o==="`"){s=o;continue}if(o==="("||o==="["||o==="{")n++;else if(o===")"||o==="]"||o==="}")n--;else if(n===0&&e.startsWith(t,r))return r}return-1}function dn(e){let t=e.trim();for(;t.startsWith("(")&&t.endsWith(")");){let n=0,s=!0;for(let r=0;r<t.length-1&&s;r++)t[r]==="("?n++:t[r]===")"&&n--,n===0&&(s=!1);if(!s)break;t=t.slice(1,-1).trim()}return t}function xr(e,t,n){if(e==="true")return!0;if(e==="false"||e==="undefined"||e==="null")return!1;let s=t.aliases.get(e);return s!==void 0&&!t.values.has(e)?Pe(s,t,n+1):(t.flags.add(e),!!t.values.get(e))}function Pe(e,t,n=0){if(n>4)return null;let s=dn(e);for(let c of["||","&&"]){let p=fn(s,c);if(p<0)continue;let f=Pe(s.slice(0,p),t,n+1),m=Pe(s.slice(p+2),t,n+1);return f===null||m===null?null:c==="||"?f||m:f&&m}let r=/^(!\s*)?([A-Za-z_$][\w$]*)$/.exec(s);if(r){let c=xr(r[2],t,n);return c===null?null:r[1]?!c:c}let o=/^([A-Za-z_$][\w$]*)\s*(===|==|!==|!=)\s*(["'])(.*?)\3$/.exec(s);if(!o)return null;let i=t.values.get(o[1]);typeof i=="string"&&t.strings.add(o[1]);let a=typeof i=="string"?i:"";return o[2]==="==="||o[2]==="=="?a===o[4]:a!==o[4]}function wr(e){let t=0,n=null,s=-1;for(let r=0;r<e.length;r++){let o=e[r];if(n){o==="\\"?r++:o===n&&(n=null);continue}if(o==='"'||o==="'"||o==="`"){n=o;continue}if(o==="("||o==="["||o==="{")t++;else if(o===")"||o==="]"||o==="}")t--;else if(o==="?"&&t===0){s=r;break}}if(s<0)return null;t=0,n=null;for(let r=s+1;r<e.length;r++){let o=e[r];if(n){o==="\\"?r++:o===n&&(n=null);continue}if(o==='"'||o==="'"||o==="`"){n=o;continue}if(o==="("||o==="["||o==="{")t++;else if(o===")"||o==="]"||o==="}")t--;else if(o===":"&&t===0)return{condition:e.slice(0,s),yes:e.slice(s+1,r),no:e.slice(r+1)}}return null}function Ie(e,t=ht()){let n=dn(e);if(!n)return{classes:[],dynamic:!1};let s=wr(n);if(s){let c=Pe(s.condition,t);return c===null?{classes:[],dynamic:!0}:Ie(c?s.yes:s.no,t)}let r=fn(n,"&&");if(r>=0){let c=Pe(n.slice(0,r),t);return c===null?{classes:[],dynamic:!0}:c?Ie(n.slice(r+2),t):{classes:[],dynamic:!1}}if(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))return{classes:je(n.slice(1,-1)),dynamic:!1};if(n.startsWith("`")&&n.endsWith("`")){let c=n.slice(1,-1),p="",f=0;for(;f<c.length;){let m=c.indexOf("${",f);if(m<0){p+=c.slice(f);break}p+=c.slice(f,m);let h=c.indexOf("}",m+2);if(h<0)return{classes:[],dynamic:!0};let C=c.slice(m+2,h).trim();if(un.test(C)){let w=t.values.get(C);if(typeof w!="string")return{classes:[],dynamic:!0};t.strings.add(C);let v=/[\w-]*$/.exec(p)?.[0];v&&t.prefixes.set(C,v),p+=w}else{let w=Ie(C,t);if(w.dynamic)return{classes:[],dynamic:!0};p+=w.classes.join(" ")}f=h+1}return{classes:je(p),dynamic:!1}}if(un.test(n)&&t.values.has(n)){let c=t.values.get(n);return typeof c!="string"?{classes:[],dynamic:!1}:(t.strings.add(n),{classes:je(c),dynamic:!1})}let o=/^(?:styles?|classes|css|cls)\.([A-Za-z_]\w*)$/.exec(n);if(o)return{classes:[br(o[1])],dynamic:!1};let i=/^(?:styles?|classes|css|cls)\[\s*["']([\w-]+)["']\s*\]$/.exec(n);if(i)return{classes:[i[1]],dynamic:!1};let a=/^(?:styles?|classes|css|cls)\[\s*(`[^`]*`)\s*\]$/.exec(n);if(a){let c=Ie(a[1],t);return c.dynamic||c.classes.length!==1?{classes:[],dynamic:!0}:c}let l=/^([A-Za-z_][\w]*)\s*\(([\s\S]*)\)$/.exec(n);if(l&&ka.has(l[1])){let c=[];for(let p of yr(l[2])){let f=Ie(p,t);if(f.dynamic)return{classes:[],dynamic:!0};c.push(...f.classes)}return{classes:c,dynamic:!1}}return{classes:[],dynamic:!0}}function xt(e){let t=[],n=!1,s=0;for(;s<e.length;){if(/\s/.test(e[s])){s++;continue}if(e[s]==="{"){let i=0,a=s;for(let l=s;l<e.length;l++)if(e[l]==="{")i++;else if(e[l]==="}"&&(i--,i===0)){s=l+1;break}s===a&&(s=e.length),/^\{\s*\.\.\./.test(e.slice(a))&&(n=!0);continue}let r=/^([A-Za-z_:][\w:.-]*)/.exec(e.slice(s));if(!r){s++;continue}for(s+=r[0].length;s<e.length&&/\s/.test(e[s]);)s++;if(e[s]!=="="){t.push({name:r[1]});continue}for(s++;s<e.length&&/\s/.test(e[s]);)s++;let o=ue(e,s);if(o){t.push({name:r[1],value:o.value}),s=o.end;continue}if(e[s]==="{"){let i=0,a=s;for(let p=s;p<e.length;p++)if(e[p]==="{")i++;else if(e[p]==="}"&&(i--,i===0)){s=p+1;break}s===a&&(s=e.length);let l=e.slice(a+1,s-1).trim(),c=ue(l,0);c&&c.end===l.length?t.push({name:r[1],value:c.value}):t.push({name:r[1],expr:l});continue}s++}return{list:t,spread:n}}function gn(e,t){let n=xt(e).list.find(s=>s.name==="class"||s.name==="className");return n?n.value!==void 0?{classes:je(n.value),dynamic:!1}:n.expr===void 0?{classes:[],dynamic:!0}:Ie(n.expr,t):null}function kr(e,t){return/[<>]/.test(t)?!1:e==="href"||e==="src"||e==="action"?/^(?:https?:|mailto:|\/|#)/i.test(t):!0}function Sa(e){return e==="class"||e==="className"?!1:!va.test(e)&&!/^on/i.test(e)}function vr(e){let t={};for(let n of xt(e).list){if(!Sa(n.name)||n.expr!==void 0)continue;let s=n.value??"";kr(n.name,s)&&(t[n.name]=s)}return t}var Ra=/^(?:data-[\w-]+|aria-[\w-]+|disabled|hidden)$/,Aa=new Set(["disabled","hidden"]);function mt(e,t,n=0){if(n>4)return null;let s=dn(e),r=ue(s,0);if(r&&r.end===s.length)return r.value;let o=wr(s);if(o){let l=Pe(o.condition,t);return l===null?null:mt(l?o.yes:o.no,t,n+1)}let i=fn(s,"||");if(i>=0){let l=mt(s.slice(0,i),t,n+1);return l===null?null:l!==void 0?l:mt(s.slice(i+2),t,n+1)}if(s==="undefined"||s==="null"||s==="false")return;if(s==="true")return"true";if(!un.test(s))return null;let a=t.values.get(s);if(typeof a=="string")return t.strings.add(s),a;if(typeof a=="boolean"||t.aliases.has(s)){let l=xr(s,t,n);return l===null?null:l?"true":void 0}return t.values.has(s)?void 0:null}function _a(e,t){let n={};for(let s of xt(e).list){if(s.expr===void 0||!Ra.test(s.name))continue;let r=mt(s.expr,t);if(r!=null){if(Aa.has(s.name)){r!=="false"&&(n[s.name]="");continue}kr(s.name,r)&&(n[s.name]=r)}}return n}function Ea(e,t){let n=/([A-Za-z_][\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|\{\s*["']([^"']*)["']\s*\})/g;for(let s of e.matchAll(n)){let r=s.index??0;if(t>=r&&t<r+s[0].length){let o=s[1];return o==="class"||o==="className"?{}:{prop:o,value:s[2]??s[3]??s[4]}}}return{}}function bt(e,t=0){if(t>6)return"";let n="",s=0;for(;s<e.length;){if(e[s]==="{"){let i=0,a=s;for(let p=s;p<e.length;p++)if(e[p]==="{")i++;else if(e[p]==="}"&&(i--,i===0)){a=p+1;break}if(a===s)break;let l=e.slice(s+1,a-1).trim();/^[A-Za-z_$][\w$]*$/.exec(l)?.[0]&&(n+='<span class="__gs-slot">Text</span>'),s=a;continue}if(e[s]==="<"){if(e.startsWith("<!--",s)){let l=e.indexOf("-->",s);s=l===-1?e.length:l+3;continue}if(e.startsWith("</",s)){let l=/^<\/[A-Za-z][\w.-]*\s*>/.exec(e.slice(s));s+=l?l[0].length:1;continue}let i=yt(e,s);if(!i||i==="too-big"){s++;continue}let a=i.tag.toLowerCase();if(/^[A-Z]/.test(i.tag))n+=bt(i.body,t+1);else if(wa.has(a)){let l=gn(i.attrs),c=l&&!l.dynamic&&l.classes.length?` class="${dr(l.classes.join(" "))}"`:"",p=bt(i.body,t+1);n+=`<${a}${c}>${p}</${a}>`}s=i.closeEnd;continue}let r=e.slice(s).search(/[<{}]/),o=r===-1?e.length:s+r;n+=dr(e.slice(s,o)),s=o}return n}function Ia(e){let t=gn(e.attrs);return!t||t.dynamic||t.classes.length===0?null:{tag:e.tag.toLowerCase(),classes:t.classes,attrs:vr(e.attrs)}}function $r(e,t){let n=[],s=t-1;for(;n.length<3&&s>=0;){let r=pn(e,s);if(!r||r==="too-big"||/^[A-Z]/.test(r.tag))break;let o=Ia(r);if(!o)break;n.push(o),s=r.openStart-1}return n.reverse()}var ja=8;function Pa(e){let t=e.trim(),n=ue(t,0);return n&&n.end===t.length?n.value:t==="true"?!0:t==="false"?!1:/^-?\d+(?:\.\d+)?$/.test(t)?t:null}function La(e,t){let n=0,s=-1;for(let i=t;i<e.length&&i<t+2e3;i++){let a=e[i];if(a==='"'||a==="'"||a==="`"){let l=ue(e,i);if(!l)return null;i=l.end-1;continue}if(a==="{")n++;else if(a==="}"&&(n--,n===0)){s=i;break}}if(s<0)return null;let r=e.slice(s+1).trimStart()[0];if(r!==")"&&r!==":")return null;let o=new Map;for(let i of yr(e.slice(t+1,s))){if(i.startsWith("..."))continue;let a=/^([A-Za-z_$][\w$]*)(?:\s*:\s*([A-Za-z_$][\w$]*))?(?:\s*=\s*([\s\S]+))?$/.exec(i);if(!a)continue;let l=a[2]??a[1];if(a[3]===void 0){o.set(l,void 0);continue}let c=Pa(a[3]);c!==null&&o.set(l,c)}return{values:o,end:s}}function Oa(e,t){let n=new Set(t.attrs.match(/[A-Za-z_$][\w$]*/g)??[]),s=Math.max(0,t.openStart-8e3),o=[...e.slice(s,t.openStart).matchAll(/\(\s*\{/g)].reverse();for(let i of o){let a=s+(i.index??0)+i[0].length-1,l=La(e,a);if(!l||![...l.values.keys()].some(f=>n.has(f)))continue;let c=new Map,p=e.slice(l.end,t.openStart);for(let f of p.matchAll(/\bconst\s+([A-Za-z_$][\w$]*)\s*=\s*([^;\n]+);/g))n.has(f[1])&&c.set(f[1],f[2].trim());return ht(l.values,c)}return ht()}function Ma(e,t){let n=new Map;for(let s of e.matchAll(/([\w-]+)\$\{\s*([A-Za-z_$][\w$]*)\s*\}/g)){let r=s[1],o=t.find(i=>i.startsWith(r)&&i.length>r.length);o&&n.set(s[2],o.slice(r.length))}return n}function Na(e,t,n,s){let r=$a(e,t.openStart,t.closeEnd);if(/^[A-Z]/.test(t.tag)){let m=Ea(e.slice(t.openStart,t.openEnd),n-t.openStart);return{kind:"component",...r,component:{tag:t.tag,...m}}}let o=Oa(e,t);for(let[m,h]of Ma(t.attrs,s))o.values.set(m,h);let i={};for(let[m,h]of o.values)i[m]=h??null;let a={attrs:t.attrs,values:i,aliases:Object.fromEntries(o.aliases)},l=ht(new Map(o.values),o.aliases),c=Ta(a.attrs,l);if(!c)return{kind:"dynamic",...r};let p={tag:t.tag.toLowerCase(),...c,ancestors:$r(e,t.openStart),bodyHtml:bt(t.body)},f=[...[...l.strings].filter(m=>typeof o.values.get(m)=="string").map(m=>({name:m,kind:"text",...l.prefixes.has(m)?{prefix:l.prefixes.get(m)}:{}})),...[...l.flags].slice(0,ja).map(m=>({name:m,kind:"flag"}))];return f.length===0?{kind:"markup",...r,element:p}:{kind:"markup",...r,element:p,params:f,redraw:a}}function Ta(e,t){let n=gn(e,t);return n?.dynamic?null:{classes:n?.classes??[],attrs:{...vr(e),..._a(e,t)}}}function mn(e,t,n,s){if(ya.test(s))return gr(e,t);let r=pn(e,t);return r==="too-big"||!r?gr(e,t):Na(e,r,t,n)}function Da(e){let t={},n=new Set,{list:s,spread:r}=xt(e);for(let o of s)o.expr===void 0?t[o.name]=o.value??"true":o.expr==="true"||o.expr==="false"?t[o.name]=o.expr:n.add(o.name);return{literals:t,dynamic:n,spread:r}}function Cr(e,t){let n=Da(t),s=new Map,r=[],o=[],i=[],a=n.spread;for(let l of e.axes){if(l.opaque){a=!0;continue}if(!l.locked&&n.dynamic.has(l.prop)){a=!0;continue}let c=l.locked?l.defaultValue:n.literals[l.prop]??(n.spread?void 0:l.defaultValue);if(c===void 0)continue;s.set(l.prop,c);let p=!l.locked&&n.literals[l.prop]===c;if(l.prefix){o.push(`${l.prefix}${c}`),p&&c!==l.defaultValue&&i.push({prop:l.prop,value:c,known:l.defaultValue?[l.defaultValue]:[],cls:`${l.prefix}${c}`});continue}let f=l.values.find(m=>m.value===c);if(!f){a=!0,p&&l.values.length>0&&i.push({prop:l.prop,value:c,known:l.values.map(m=>m.value)});continue}for(let m of f.classes)m.startsWith("__gs-recipe-")&&r.push(m),o.push(m)}if(!a){for(let l of e.compounds)if(l.when.every(p=>s.get(p.prop)===p.value))for(let p of l.classes)p.startsWith("__gs-recipe-")&&r.push(p),o.push(p)}return e.classNameProp&&(n.dynamic.has("className")?a=!0:n.literals.className&&o.push(...je(n.literals.className))),{draw:a?null:[...e.staticClasses,...o],selects:r,unknown:i}}function hn(e){let t=[],n=/import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;for(let s of e.matchAll(n)){let r=s[2];for(let o of s[1].split(",")){let i=o.trim().split(/\s+as\s+/),a=i[0]?.trim(),l=(i[1]??i[0])?.trim();a&&l&&t.push({local:l,imported:a,spec:r})}}return t}function Fa(e,t,n,s,r){for(let o of hn(t)){if(o.local!==n)continue;let i=r(e,o.spec),a=s.find(l=>l.path===i&&l.component===o.imported);if(a)return a}return s.find(o=>o.path===e&&o.component===n)}function Sr(e,t,n,s,r,o){if(e.kind!=="component"||!e.component||r.length===0)return e;let i=Fa(s,t,e.component.tag,r,o);if(!i)return e;let a=pn(t,n),l=e.component.tag;if(!a||a==="too-big"||a.tag!==l&&a.tag!==i.component)return e;let c=Cr(i,a.attrs);return c.draw?{kind:"markup",source:e.source,startLine:e.startLine,component:e.component,element:{tag:i.rootTag,classes:c.draw,attrs:{},ancestors:$r(t,a.openStart),bodyHtml:bt(a.body)}}:e}function wt(e,t,n,s){let r=[],o=new Set,i=(l,c)=>{let p=`${l}\0${c.path}`;o.has(p)||(o.add(p),r.push({local:l,binding:c}))};for(let l of hn(t)){let c=s(e,l.spec),p=n.find(f=>f.path===c&&f.component===l.imported);p&&i(l.local,p)}for(let l of n)l.path===e&&i(l.component,l);let a=[];for(let{local:l,binding:c}of r){let p=0,f=`<${l}`;for(;p<t.length;){let m=t.indexOf(f,p);if(m<0)break;let h=t[m+f.length];if(h&&/[\w.]/.test(h)){p=m+f.length;continue}let C=yt(t,m);if(!C||C==="too-big"){p=m+f.length;continue}let w=Cr(c,C.attrs);(w.selects.length||w.unknown.length)&&a.push({offset:m,component:l,selects:w.selects,unknown:w.unknown}),p=Math.max(C.closeEnd,m+f.length)}}return a}function Ba(e,t){let n=e.slice(t,t+700),s=n.indexOf("{");if(s<0)return{};let r=n.indexOf("}",s),o=n.slice(s,r<0?s+400:r+1),i={};for(let a of o.matchAll(/([A-Za-z_$][\w$]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g))i[a[1]]=a[2]??a[3]??"";return i}function Va(e){let t=/\bclassName\s*=\s*/.exec(e);if(!t)return null;let n=t.index+t[0].length,s=ue(e,n);if(s)return s.value;if(e[n]!=="{")return null;let r=0;for(let o=n;o<e.length;o++)if(e[o]==="{")r++;else if(e[o]==="}"&&(r--,r===0))return e.slice(n+1,o);return null}function Ua(e,t){let n=t+1;for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]===")")return{rename:{},fixed:{},opaque:[]};if(e[n]!=="{")return null;let s={rename:{},fixed:{},opaque:[]};for(n++;n<e.length;){for(;n<e.length&&/[\s,]/.test(e[n]);)n++;if(e[n]==="}")return s;if(e.startsWith("...",n))return null;let r=/^[A-Za-z_$][\w$]*/.exec(e.slice(n));if(!r)return null;for(n+=r[0].length;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]===","||e[n]==="}"){s.rename[r[0]]=r[0];continue}if(e[n]!==":")return null;for(n++;n<e.length&&/\s/.test(e[n]);)n++;let o=ue(e,n);if(o){s.fixed[r[0]]=o.value,n=o.end;continue}let i=/^[A-Za-z_$][\w$]*/.exec(e.slice(n));if(i){s.rename[r[0]]=i[0],n+=i[0].length;continue}s.opaque.push(r[0]);let a=0;for(;n<e.length;){let l=e[n];if(l==='"'||l==="'"||l==="`"){let c=ue(e,n);if(!c)return null;n=c.end;continue}if(l==="("||l==="["||l==="{")a++;else if(l===")"||l==="]"||l==="}"){if(a===0)break;a--}else if(l===","&&a===0)break;n++}}return null}function za(e,t,n,s){let r=[];for(let o of hn(e)){let i=s(t,o.spec),a=n.find(l=>l.path===i&&l.name===o.imported);a&&r.push({local:o.local,recipe:a})}for(let o of n)o.path===t&&o.name&&r.push({local:o.name,recipe:o});return r}function Wa(e){let t=[],n=/(?:styles?|classes|css|cls)\s*\.\s*([A-Za-z_]\w*)/g;for(let c of e.matchAll(n))t.push({at:c.index??0,kind:"static",text:br(c[1])});let s=/(?:styles?|classes|css|cls)\s*\[\s*["']([^"']+)["']\s*\]/g;for(let c of e.matchAll(s))t.push({at:c.index??0,kind:"static",text:c[1]});let r=/(?:styles?|classes|css|cls)\s*\[\s*`([^`$]*)\$\{\s*([A-Za-z_$][\w$]*)\s*\}`\s*\]/g;for(let c of e.matchAll(r))t.push({at:c.index??0,kind:"prefix",text:c[1],prop:c[2]});let o=/(?:styles?|classes|css|cls)\s*\[\s*["']([^"']+)["']\s*\+\s*([A-Za-z_$][\w$]*)\s*\]/g;for(let c of e.matchAll(o))t.push({at:c.index??0,kind:"prefix",text:c[1],prop:c[2]});/[[{(]/.test(e)||t.push({at:0,kind:"static",text:e.trim()}),t.sort((c,p)=>c.at-p.at);let i=[],a=[];for(let c of t)c.kind==="prefix"&&c.prop?a.push({prop:c.prop,prefix:c.text}):i.push(...je(c.text));let l=/(?:^|[(,\s])className\s*(?:[,)]|$)/.test(e);return{staticClasses:i,prefixes:a,classNameProp:l}}function Ga(e,t,n,s,r){let o=l=>t.rename[l]??l,i=e.axes.map(l=>{let c=t.fixed[l.prop],p=o(l.prop);return{prop:p,values:c?l.values.filter(f=>f.value===c):l.values,defaultValue:c??n[p]??l.defaultValue,opaque:t.opaque.includes(l.prop),locked:!!c}}),a=e.compounds.map(l=>({classes:l.classes,when:l.when.map(c=>({prop:o(c.prop),value:t.fixed[c.prop]??c.value}))}));return{staticClasses:[...e.staticClasses,...s],axes:i,compounds:a,classNameProp:r}}function Rr(e,t,n){let s=[];for(let r of e){let o=za(r.source,r.path,t,n);for(let i of r.names){let a=new RegExp(`(?:function\\s+${i}\\b|(?:const|let|var)\\s+${i}\\b)`,"g"),l=[...r.source.matchAll(a)],c=null;for(let p of l){let f=p.index??0,h=r.source.slice(f+p[0].length).search(/\nexport\s/),C=r.source.slice(f,f+p[0].length+(h<0?8e3:h)),w=Ba(r.source,f),v=0;for(;v<C.length;){if(C[v]!=="<"||C[v+1]==="/"||C[v+1]==="!"){v++;continue}let d=yt(C,v);if(!d||d==="too-big"){v++;continue}if(v=d.openEnd,/^[A-Z]/.test(d.tag))continue;let u=Va(d.attrs);if(!u)continue;let g=Wa(u),y=g.prefixes.length?2:g.staticClasses.length?1:0,k=null,x=o.find($=>new RegExp(`(?:^|[^\\w$])${$.local}\\s*\\(`).test(u));if(x){let $=u.search(new RegExp(`(?:^|[^\\w$])${x.local}\\s*\\(`)),j=u.indexOf("(",$),I=j<0?null:Ua(u,j);if(I){y=3,k=Ga(x.recipe,I,w,g.staticClasses,g.classNameProp);for(let A of g.prefixes)k.axes.push({prop:A.prop,values:[],prefix:A.prefix,defaultValue:w[A.prop]})}}!k&&(g.prefixes.length||g.staticClasses.length)&&(k={staticClasses:g.staticClasses,axes:g.prefixes.map($=>({prop:$.prop,values:[],prefix:$.prefix,defaultValue:w[$.prop]})),compounds:[],classNameProp:g.classNameProp}),k&&(!c||y>c.score)&&(c={score:y,tag:d.tag.toLowerCase(),body:k})}}c&&s.push({component:i,path:r.path,rootTag:c.tag,...c.body})}}return s}var Ha=/<([A-Za-z][\w.-]*)\b((?:[^<>"'`{}]|"[^"]*"|'[^']*'|`[^`]*`|\{(?:[^{}]|\{[^{}]*\})*\})*)>/g,Ka=/\b(?:styles?|classes|css|cls)\s*(?:\.([A-Za-z_]\w*)|\[\s*["']([\w-]+)["']\s*\])/g,Ja=new Set(["span","svg","i","img","em","strong","small","b","p","kbd","abbr","sup","sub","picture","use","path"]),Za=new Set(["icon","glyph","svg"]),Xa=new Set(["label","text","title","caption"]),qa=e=>e.replace(/([a-z\d])([A-Z])/g,"$1-$2").split(/[^a-z0-9]+/i).filter(Boolean).map(t=>t.toLowerCase());function _r(e){let t=e.flatMap(qa);return t.some(n=>Za.has(n))?"icon":t.some(n=>Xa.has(n))?"label":null}function Ya(e){let t=e.replace(/\{\s*\/\*[\s\S]*?\*\/\s*\}/g," "),n=[];for(let s of t.matchAll(Ha)){let r=s[1];if(!Ja.has(r.toLowerCase())||r!==r.toLowerCase())continue;let o=[...s[2].matchAll(Ka)].map(a=>a[1]??a[2]),i=_r(o);i&&n.push({index:s.index??0,role:i,tag:r.toLowerCase(),classes:o})}return n}function Qa(e,t,n){if(!t.some(r=>r.property.toLowerCase()==="display"&&/^none\b/i.test(r.value.trim()))||n.size===0)return null;for(let r of z(e)){let o=Y(r);if(!o||o.length<2)continue;let i=o[o.length-1];if(i.combinator!==" "&&i.combinator!==">")continue;let a=i.simples.filter(m=>m.kind==="class");if(a.length!==1||a[0].kind!=="class"||!n.has(a[0].name))continue;let l=o[o.length-2];if(l.simples.filter(m=>m.kind!=="class"&&m.kind!=="attr"&&m.kind!=="tag").length>0)continue;let p=l.simples.filter(m=>m.kind==="class"),f=l.simples.filter(m=>m.kind==="attr");if(p.length===1&&f.length===0&&p[0].kind==="class"&&!/^(?:is|has)-/.test(p[0].name))return{classes:[p[0].name],attrs:{}};if(p.length===0&&f.length===1&&f[0].kind==="attr"&&f[0].value)return{classes:[],attrs:{[f[0].name]:f[0].value}}}return null}var el=["text","icon-start","icon-end","icon"],Ar={text:"Text","icon-start":"Icon left","icon-end":"Icon right",icon:"Icon"};function tl(e,t){let n=null,s=null;for(let i of t)i.index<e.index?n=i:s||(s=i);if(!n&&!s)return null;let r=n?e.index-n.index:1/0;return(s?s.index-e.index:1/0)<=r?"start":"end"}function Le(e){return{role:e.role,tag:e.tag,classes:e.classes}}function Er(e){let t=new Map,n=(s,r)=>{let o=t.get(s)??[];o.some(i=>i.path===r.path)||o.push(r),t.set(s,o)};for(let s of e){let r=s.sources.flatMap(Ya),o=r.filter(h=>h.role==="label"),i=r.filter(h=>h.role==="icon"),a=o[0];a&&n("text",{path:s.sheet,slots:[Le(a)],classes:[],attrs:{}});let l=new Set(o.flatMap(h=>h.classes.filter(C=>_r([C])==="label"))),c=null,p=null;for(let h of i){let C=tl(h,o),w=o.reduce((v,d)=>{let u=Math.abs(d.index-h.index);return!v||u<v.dist?{hit:d,dist:u}:v},null);C==="start"&&w&&!c&&(c={icon:h,label:w.hit}),C==="end"&&w&&!p&&(p={icon:h,label:w.hit})}c&&n("icon-start",{path:s.sheet,slots:[Le(c.icon),Le(c.label)],classes:[],attrs:{}}),p&&n("icon-end",{path:s.sheet,slots:[Le(p.label),Le(p.icon)],classes:[],attrs:{}});let f=null;for(let h of s.rules)if(f=Qa(h.selector,h.declarations,l),f)break;let m=c?.icon??p?.icon??i[0]??null;f&&m&&n("icon",{path:s.sheet,slots:[Le(m)],classes:f.classes,attrs:f.attrs})}return[{id:"text",label:Ar.text,sheets:t.get("text")??[]},...el.filter(s=>s!=="text"&&t.has(s)).map(s=>({id:s,label:Ar[s],sheets:t.get(s)??[]}))]}function nl(e,t){if(!e)return t;let n=z(e);return z(t).flatMap(s=>n.map(r=>s.includes("&")?s.replaceAll("&",r):`${r} ${s}`)).join(", ")}var sl=/^@(?:-\w+-)?(?:keyframes|font-face|property)\b/i;function we(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,i=>i.replace(/[^\n]/g," ")),n=[],s=[],r=0,o=1;for(let i=0;i<t.length;i++){let a=t[i];if(a===`
|
|
46
|
-
`&&o++,a==="{"){let l=t.slice(r,i).trim(),c=s[s.length-1];c&&(c.own+=t.slice(c.segStart,r));let
|
|
47
|
-
`),n=[],s=[],r=null,o=null,i=0;if(t[0]?.trim()==="---"){let l=t.findIndex((c,
|
|
48
|
-
`).trimEnd(),headings:r.headings}),r=null)};for(;i<t.length;i++){let l=t[i],c=i+1,p=/^\s*(```|~~~)/.exec(l)?.[1];if(o){r.lines.push(l),p===o&&(o=null,a(c));continue}if(p){a(c-1),o=p,r={start:c,lines:[l],headings:[...s]};continue}let f=/^(#{1,6})\s+(.+?)\s*#*\s*$/.exec(l);if(f){a(c-1),s=[...s.slice(0,f[1].length-1),f[2]];continue}if(l.trim()===""){a(c-1);continue}r??={start:c,lines:[],headings:[...s]},r.lines.push(l)}return a(t.length),n}function ll(e,t){let n=e.map(re).join("|"),s=e.map(r=>re(r.charAt(0).toUpperCase()+r.slice(1))).join("|");return new RegExp(`${t.source}|\\b(?:${n})s?\\b|[a-z](?:${s})s?\\b|\\b(?:${n})[-_]|[-_](?:${n})\\b`,"i")}function cl(e,t){let n=t.map(re).join("|"),s=new Map;for(let r of e){if(r.base||r.title==="Unnamed"||r.title.startsWith("In ")||!r.element)continue;let i=s.get(r.title)??{title:r.title,tests:[],heading:null},a=r.selector.slice(ye(r.selector));for(let l of a.matchAll(/\.((?:\\.|[\w-])+)/g)){let c=l[1].replace(/\\(.)/g,"$1");if(t.includes(c.toLowerCase()))continue;let p=/[-_]|[a-z][A-Z]/.test(c);i.tests.push(new RegExp(p?`(?<![\\w-])${re(c)}(?![\\w-])`:`(?:\\.|["'\`])${re(c)}(?![\\w-])`))}if(!r.title.includes(" + ")){let l=r.title.toLowerCase().split(/\s+/).map(re).join("[\\s_-]+");i.tests.push(new RegExp(`\\b${l}[\\s_-]+(?:${n})s?\\b|\\b(?:${n})s?[_-]+${l}\\b`,"i")),r.axis&&/^[a-z]+$/i.test(r.title)&&i.tests.push(new RegExp(`\\b${re(r.axis)}\\s*[=:]\\s*\\{?\\s*["'\`]${re(r.title.toLowerCase())}["'\`]`,"i")),i.heading=r.title.toLowerCase()}s.set(r.title,i)}return[...s.values()]}function ul(e,t){return e.toLowerCase().replace(new RegExp(`\\b(?:${t.map(re).join("|")})s?\\b`,"g")," ").replace(/[^a-z0-9]+/g," ").trim()}function pl(e){return e.length>Ir?`${e.slice(0,Ir).trimEnd()}\u2026`:e}function jr(e,t,n,s){let r=ll(n.classKeywords,n.prose),o=cl(s,n.classKeywords),i=new Set,a=[];for(let p of t){let f=e.get(p.path);if(f===void 0)continue;let m=[];for(let h of al(f)){if(!r.test(h.text)&&!h.headings.some(v=>r.test(v)))continue;let C=h.headings.length?ul(h.headings[h.headings.length-1],n.classKeywords):"",w=o.filter(v=>v.tests.some(d=>d.test(h.text))||C!==""&&v.heading===C).map(v=>v.title);for(let v of w)i.add(v);m.push({path:p.path,line:h.start,endLine:h.end,headings:h.headings,text:pl(h.text),rule:il.test(h.text),styles:w})}m.length!==0&&a.push({path:p.path,kind:p.kind,passages:m.slice(0,ol),total:m.length,rules:m.filter(h=>h.rule).length})}let l={instruction:0,documentation:1,record:2};a.sort((p,f)=>l[p.kind]-l[f.kind]||f.rules-p.rules||f.total-p.total||p.path.localeCompare(f.path));let c=new Map;for(let p of s)p.element&&!p.base&&p.title!=="Unnamed"&&!p.title.startsWith("In ")&&c.set(p.title,!0);return{files:a.slice(0,rl).map(({rules:p,...f})=>f),documented:[...i].sort(),undocumented:[...c.keys()].filter(p=>!i.has(p))}}var Pr=new Set(["tone","size","variant","kind","type","style","theme","color","colour","appearance","intent","emphasis","shape","level"]),fl=new Set(["is","has","js","c","component","comp","el","ui","the","root"]),dl={xs:["extra","small"],sm:["small"],md:["medium"],lg:["large"],xl:["extra","large"],xxl:["extra","extra","large"]},gl=new Set(["cta","ui","ux","faq","cms","api","url","ios"]);function yn(e){return e.replace(/\\(.)/g,"$1").replace(/([a-z\d])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map(t=>t.toLowerCase())}function ml(e){return new Set(e.flatMap(t=>[t,`${t}s`]))}function bn(e){let t=e.map(n=>gl.has(n)?n.toUpperCase():n).join(" ");return t.charAt(0).toUpperCase()+t.slice(1)}function Oe(e,t){let n=yn(e).filter(r=>!t.has(r)&&!fl.has(r)),s=null;return n.length>1&&Pr.has(n[0])&&(s=n[0],n=n.slice(1)),{words:n.flatMap(r=>dl[r]??[r]),axis:s}}var Lr=/\.((?:\\.|[\w-])+)/g,hl=/\[\s*([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\]\s]*))\s*\]/g;function bl(e,t){let n=e.split("/"),s=(n.pop()??"").replace(/(\.module)?\.[a-z]+$/i,""),r=n.pop()??"";return yn(s).some(a=>t.has(a))||yn(r).some(a=>t.has(a))?Oe(s,t).words:[]}function yl(e,t){let n=[];for(let s of e.split(/[\s>+~]+/).filter(Boolean)){let r=[...s.matchAll(Lr)].map(o=>o[1]);if(r.length)for(let o of r)n.push(...Oe(o,t).words);else{let o=/^[a-z][\w-]*/i.exec(s)?.[0]?.toLowerCase();o&&!["div","span","html","body"].includes(o)&&n.push(...Oe(o,t).words)}}return n}function Me(e,t){let n=ml(t),s=ye(e.selector),r=e.selector.slice(0,s),o=e.selector.slice(s),i=[...o.matchAll(Lr)].map(p=>Oe(p[1],n));for(let p of o.matchAll(hl)){let f=p[1].replace(/^data-/,"").toLowerCase();if(!Pr.has(f))continue;let m=p[2]??p[3]??p[4]??"",h=Oe(m,n);i.push({words:h.words,axis:f})}let a=i.filter(p=>p.words.length>0);if(a.length>0)return{title:a.map(p=>bn(p.words)).join(" + "),axis:a.length===1?a[0].axis:null};let l=yl(r,n);if(l.length>0)return{title:`In ${l.join(" ")}`,axis:null};let c=bl(e.path,n);if(c.length>0)return{title:bn(c),axis:null};if(e.base){let p=xl(e.path,n);return p.length>0?{title:`${bn(p)} Base`,axis:null}:{title:"Base",axis:null}}return{title:"Unnamed",axis:null}}function xl(e,t){let n=e.split("/").pop()??"";if(!/\.module\.[a-z]+$/i.test(n))return[];let s=n.replace(/\.module\.[a-z]+$/i,"");return Oe(s,t).words}var wl=60;function Je(e,t,n){let s=Y(e);if(!s)return null;let r=s.length-1,o=s[r].simples;if(Ys(o)||rn(o,t))return null;if(pt(o,t))return{compounds:s,at:r};for(let i=r-1;i>=0;i--){let a=s[i].simples;if(pt(a,t)&&!rn(a,t))return{compounds:s,at:i}}return!n||r===0&&Qs(o)?null:{compounds:s,at:0}}function Or(e,t,n){return He([...e,{combinator:e.length?t.combinator:null,simples:n}])}function Mr(e,t){return e.kind!==t.kind?!1:e.kind==="attr"&&t.kind==="attr"?e.name===t.name&&e.op===t.op&&e.value===t.value:e.raw===t.raw}function kl(e,t){return e.length>=t.length?!1:e.every(n=>t.some(s=>Mr(n,s)))}function vl(e,t){if(e.length!==1)return!1;let n=e[0];return n.kind==="tag"?t.elements.includes(n.name):n.kind==="class"?t.classKeywords.some(s=>s.toLowerCase()===n.name.toLowerCase()):!1}function $l(e,t){for(let n of t.classes)e.classes.includes(n)||e.classes.push(n);Object.assign(e.attrs,t.attrs)}function Nr(e){let t=new Set(e.map(n=>Ke(n.property)).filter(n=>n!=="hint"));return t.size===0||t.size===1&&t.has("layout")?"placement":t.size===1&&t.has("paint")?"effect":"override"}function Cl(e){let t=e.filter(o=>o.context===""),n=t.length?t:e;if(n.some(o=>o.state==="default"))return null;let r=[...n.map(o=>new Set(o.state.split(" + "))).reduce((o,i)=>o?new Set([...o].filter(a=>i.has(a))):i,null)??[]].filter(o=>H(o)===ut.length);return r.length===1?r[0]:null}function xn(e){return e.sort((t,n)=>+(t.context!=="")-+(n.context!=="")||H(t.state.split(" + ")[0])-H(n.state.split(" + ")[0])||t.state.localeCompare(n.state))}function Tr(e,t,n,s,r={parts:new Set,controls:new Set}){let o=new Map,i=[];for(let d of t)if(d.declarations.length!==0)for(let u of z(d.selector)){let g=Je(u,n,s);if(!g)continue;let{compounds:y,at:k}=g,x=y[k],$=ft(x.simples);if($.identity.length===0)continue;let j=y.slice(0,k),I=Or(j,x,$.identity),A=be($.states);if(k<y.length-1){i.push({hostKey:I,part:{selector:He(y),path:e,line:d.line,state:A}});continue}if(tr($.identity,d.declarations))continue;let R=o.get(I);if(!R){if(o.size>=wl)continue;R={key:I,prefix:j,identity:$.identity,line:d.line,states:[],modifiers:[],contexts:[],parts:[],movedInto:null},o.set(I,R)}let P=R.states.find(D=>D.state===A&&D.context===d.context);P||(P={state:A,context:d.context,line:d.line,declarations:[]},$.states.length&&(P.marker={classes:[],attrs:{}}),R.states.push(P)),P.marker&&$l(P.marker,$.marker),P.declarations.push(...d.declarations)}for(let[d,u]of o){let g=u.states.flatMap(x=>x.declarations),y=u.states.every(x=>gt(x.declarations)),k=g.every(x=>Ke(x.property)==="hint");(y||k)&&o.delete(d)}let a=new Map;for(let d of o.values()){let u=Ge(d.identity);a.set(u,[...a.get(u)??[],d])}for(let d of a.values()){let u=d.map(x=>Cl(x.states)),g=u[0];if(!g||u.some(x=>x!==g))continue;let y=d.flatMap(x=>x.states).find(x=>x.marker&&x.state.split(" + ").includes(g))?.marker;if(!y)continue;let k=[...y.classes.map(x=>({kind:"class",raw:`.${x}`,name:x})),...Object.entries(y.attrs).map(([x,$])=>({kind:"attr",raw:`[${x}="${$}"]`,name:x,op:"=",value:$}))];for(let x of d){let $=[...x.identity,...k],j={combinator:x.prefix.length?" ":null,simples:$},I=Or(x.prefix,j,$);for(let A of x.states){let R=A.state.split(" + ").filter(P=>P!==g);if(A.state=be(R),R.length===0)delete A.marker;else if(A.marker){A.marker.classes=A.marker.classes.filter(P=>!y.classes.includes(P));for(let P of Object.keys(y.attrs))delete A.marker.attrs[P]}}o.delete(x.key),o.set(I,{...x,key:I,identity:$})}}let l=()=>[...o.values()].filter(d=>d.prefix.length===0),c=d=>d.states.filter(u=>u.state==="default").reduce((u,g)=>u+g.declarations.length,0),p=l().find(d=>vl(d.identity,n))??(s?l().filter(d=>{let u=d.identity.length===1?d.identity[0]:null;return u?.kind==="class"&&r.controls.has(u.name)}).sort((d,u)=>c(u)-c(d)||d.line-u.line)[0]??null:null),f=p&&p.identity[0].kind==="class"?[p.identity[0].name]:[],m=(d,u,g)=>{u[g].push(d),d.movedInto=u,o.delete(d.key)},h=[...o.values()],C=d=>{let u=h.find(g=>g.key===d)??null;for(;u?.movedInto;)u=u.movedInto;return u};for(let d of l()){let u=d.identity.length===1?d.identity[0]:null;if(!(u?.kind!=="class"||!r.parts.has(u.name))&&(o.delete(d.key),p&&d!==p)){d.movedInto=p;for(let g of d.states)p.parts.push({selector:d.key,path:e,line:g.line,state:g.state})}}let w=l().filter(d=>d.identity.filter(u=>u.kind!=="tag"&&u.kind!=="universal").length>=2).sort((d,u)=>d.identity.length-u.identity.length);for(let d of w){let u=h.filter(y=>y!==d&&y!==p&&y.prefix.length===0&&kl(y.identity,d.identity));if(u.length===0)continue;u.sort((y,k)=>k.identity.length-y.identity.length||c(k)-c(y)||y.line-k.line);let g=C(u[0].key);g&&g!==d&&m(d,g,"modifiers")}for(let{hostKey:d,part:u}of i){let g=C(d)??(s?p:null);g&&o.has(g.key)&&g.parts.push(u)}let v=d=>{let u=d===p,g=dt(d.key,f);return{...Me({selector:d.key,path:e,base:u},n.classKeywords),element:g,usage:{status:"unknown",files:[],fileCount:0},selector:d.key,path:e,line:d.line,base:u,states:xn(d.states),modifiers:d.modifiers.length?d.modifiers.map(y=>{let k=y.identity.filter(x=>!d.identity.some($=>Mr($,x)));return{title:Me({selector:k.map(x=>x.raw).join(""),path:e,base:!1},n.classKeywords).title,selector:y.key,path:e,line:y.line,element:dt(y.key,f),usage:{status:"unknown",files:[],fileCount:0},states:xn(y.states)}}):void 0,contexts:d.contexts.length?d.contexts.map(y=>{let k=Nr(y.states.flatMap(x=>x.declarations));return{selector:y.key,path:e,line:y.line,role:k,element:k==="override"?dt(y.key,f):null,states:xn(y.states)}}):void 0,parts:d.parts.length?d.parts:void 0}};return[...o.values()].map(v)}function Dr(e){let t=new Map;for(let i of e){let a=i.base?/^\.([\w-]+)$/.exec(i.selector):null;a&&t.set(i.path,[...t.get(i.path)??[],a[1]])}let n=i=>{let a=Y(i.selector);if(!a)return null;let l=a[a.length-1].simples,c=t.get(i.path)??[],p=l.filter(f=>!(f.kind==="class"&&c.includes(f.name)));return{depth:a.length-1,subject:Ge(l),bareTag:!l.some(f=>f.kind==="class"||f.kind==="attr"||f.kind==="id"),bare:p.length&&p.length<l.length?Ge(p):null}},s=new Map(e.map(i=>[i,n(i)])),r=new Set,o=i=>{let a=s.get(i);if(!a||a.depth===0)return null;let l=e.filter(c=>{if(c===i||r.has(c))return!1;let p=s.get(c);return p!=null&&p.depth<a.depth&&(!a.bareTag||p.depth===0)&&(p.subject===a.subject||a.bare!==null&&p.subject===a.bare)});return l.sort((c,p)=>+(p.path===i.path)-+(c.path===i.path)||s.get(c).depth-s.get(p).depth),l[0]??null};for(let i of[...e].sort((a,l)=>(s.get(l)?.depth??0)-(s.get(a)?.depth??0))){let a=o(i);if(!a)continue;for(;r.has(a);)a=o(a)??a;let l=Nr(i.states.flatMap(c=>c.declarations));a.contexts=[...a.contexts??[],{selector:i.selector,path:i.path,line:i.line,role:l,element:l==="override"?i.element:null,states:i.states}],i.parts?.length&&(a.parts=[...a.parts??[],...i.parts]),i.modifiers?.length&&(a.modifiers=[...a.modifiers??[],...i.modifiers]),r.add(i)}return e.filter(i=>!r.has(i))}var Sl={slate:{50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a",950:"#020617"},gray:{50:"#f9fafb",100:"#f3f4f6",200:"#e5e7eb",300:"#d1d5db",400:"#9ca3af",500:"#6b7280",600:"#4b5563",700:"#374151",800:"#1f2937",900:"#111827",950:"#030712"},zinc:{50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b",950:"#09090b"},neutral:{50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717",950:"#0a0a0a"},stone:{50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917",950:"#0c0a09"},red:{50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d",950:"#450a0a"},orange:{50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12",950:"#431407"},amber:{50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},yellow:{50:"#fefce8",100:"#fef9c3",200:"#fef08a",300:"#fde047",400:"#facc15",500:"#eab308",600:"#ca8a04",700:"#a16207",800:"#854d0e",900:"#713f12",950:"#422006"},lime:{50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314",950:"#1a2e05"},green:{50:"#f0fdf4",100:"#dcfce7",200:"#bbf7d0",300:"#86efac",400:"#4ade80",500:"#22c55e",600:"#16a34a",700:"#15803d",800:"#166534",900:"#14532d",950:"#052e16"},emerald:{50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b",950:"#022c22"},teal:{50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},cyan:{50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63",950:"#083344"},sky:{50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e",950:"#082f49"},blue:{50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a",950:"#172554"},indigo:{50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81",950:"#1e1b4b"},violet:{50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95",950:"#2e1065"},purple:{50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87",950:"#3b0764"},fuchsia:{50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75",950:"#4a044e"},pink:{50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843",950:"#500724"},rose:{50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337",950:"#4c0519"}};function Fr(e){let t=e.lastIndexOf("-");return t<=0?null:Sl[e.slice(0,t)]?.[e.slice(t+1)]??null}var E=(e,t)=>({property:e,value:t});function Cn(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let t=e.slice(1,-1).replace(/_/g," ").trim();return/^-?[\d.]+(?:px|rem|em|%|vh|vw)$/.test(t)||/^var\(\s*--[\w-]+\s*\)$/.test(t)?t.replace(/\s+/g,""):null}function $n(e){let t=Cn(e);if(t)return t;if(e==="px")return"1px";if(!/^\d+(?:\.\d+)?$/.test(e))return null;let n=Number(e);if(n>96)return null;let s=Math.round(n*2);if(Math.abs(n*2-s)>1e-6)return null;if(s===0)return"0";let r=Math.floor(s/8),o=["",".125",".25",".375",".5",".625",".75",".875"][s%8];return r===0?`0${o}rem`:`${r}${o}rem`}function Rl(e){let t=/^(\d+)\/(\d+)$/.exec(e);if(!t)return null;let n=Number(t[1])/Number(t[2])*100;return Number.isFinite(n)?`${Number(n.toFixed(4))}%`:null}function Br(e,t){return{full:"100%",screen:t==="w"?"100vw":"100vh",auto:"auto",fit:"fit-content",min:"min-content",max:"max-content"}[e]??Rl(e)??Cn(e)??$n(e)}var Al={xs:{size:"0.75rem",leading:"1rem"},sm:{size:"0.875rem",leading:"1.25rem"},base:{size:"1rem",leading:"1.5rem"},lg:{size:"1.125rem",leading:"1.75rem"},xl:{size:"1.25rem",leading:"1.75rem"},"2xl":{size:"1.5rem",leading:"2rem"},"3xl":{size:"1.875rem",leading:"2.25rem"},"4xl":{size:"2.25rem",leading:"2.5rem"},"5xl":{size:"3rem",leading:"1"},"6xl":{size:"3.75rem",leading:"1"}},_l={thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},El={none:"1",tight:"1.25",snug:"1.375",normal:"1.5",relaxed:"1.625",loose:"2"},Il={none:"0",sm:"0.125rem","":"0.25rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},jl={sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)","":"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"},Pl={"":"3px",0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"};function wn(e,t){let n=null;if(e.startsWith("[")&&e.endsWith("]")){let r=e.slice(1,-1).replace(/_/g," ").trim();if(r.startsWith("--"))n=`var(${r})`;else if(/^var\(\s*--[\w-]+\s*\)$/.test(r))n=r.replace(/\s+/g,"");else if(/^#[0-9a-f]{3,8}$/i.test(r)||/^(?:rgb|hsl|oklch|oklab|color)\(/i.test(r))n=r;else return null}else e==="white"?n="#fff":e==="black"?n="#000":e==="transparent"?n="transparent":e==="current"?n="currentColor":e==="inherit"?n="inherit":n=Fr(e)??(/^[a-z][\w-]*$/i.test(e)?`var(--${e}, var(--color-${e}))`:null);if(!n)return null;if(!t)return n;if(!/^\d+(?:\.\d+)?$/.test(t))return null;let s=Number(t)<=1?Number(t)*100:Number(t);return s<0||s>100?null:s===100?n:`color-mix(in srgb, ${n} ${s}%, transparent)`}function Ll(e){let t=0,n=-1;for(let s=0;s<e.length;s++){let r=e[s];r==="["?t++:r==="]"?t=Math.max(0,t-1):r==="/"&&t===0&&(n=s)}return n<0?{body:e,opacity:null}:{body:e.slice(0,n),opacity:e.slice(n+1)}}function kn(){return E("box-shadow","0 0 0 var(--gs-ring-w, 3px) var(--gs-ring-c, currentColor)")}var Ol={flex:"flex","inline-flex":"inline-flex",block:"block","inline-block":"inline-block",inline:"inline",grid:"grid","inline-grid":"inline-grid",hidden:"none",contents:"contents"},vn={start:"flex-start",end:"flex-end",center:"center",baseline:"baseline",stretch:"stretch",between:"space-between",around:"space-around",evenly:"space-evenly"};function Vr(e){let t=e.startsWith("-"),n=t?e.slice(1):e,{body:s,opacity:r}=Ll(n),o=Ol[s];if(o&&!t&&!r)return[E("display",o)];let i=/^flex-(row|col|row-reverse|col-reverse)$/.exec(s);if(i&&!t&&!r){let R=i[1]==="col"?"column":i[1]==="col-reverse"?"column-reverse":i[1];return[E("flex-direction",R)]}if(s==="flex-wrap"&&!t)return[E("flex-wrap","wrap")];if(s==="flex-nowrap"&&!t)return[E("flex-wrap","nowrap")];if(s==="flex-1"&&!t)return[E("flex","1 1 0%")];if(s==="shrink-0"&&!t)return[E("flex-shrink","0")];if(s==="grow-0"&&!t)return[E("flex-grow","0")];if(s==="grow"&&!t)return[E("flex-grow","1")];let a=/^items-(start|end|center|baseline|stretch)$/.exec(s);if(a&&!t)return[E("align-items",vn[a[1]])];let l=/^justify-(start|end|center|between|around|evenly)$/.exec(s);if(l&&!t)return[E("justify-content",vn[l[1]])];let c=/^self-(start|end|center|stretch|auto)$/.exec(s);if(c&&!t)return[E("align-self",c[1]==="auto"?"auto":vn[c[1]])];if(s==="whitespace-nowrap")return[E("white-space","nowrap")];if(s==="whitespace-normal")return[E("white-space","normal")];if(s==="truncate")return[E("overflow","hidden"),E("text-overflow","ellipsis"),E("white-space","nowrap")];if(s==="underline")return[E("text-decoration-line","underline")];if(s==="no-underline")return[E("text-decoration-line","none")];if(s==="line-through")return[E("text-decoration-line","line-through")];let p=/^(uppercase|lowercase|capitalize|normal-case)$/.exec(s);if(p)return[E("text-transform",p[1]==="normal-case"?"none":p[1])];let f=/^text-(left|center|right|justify|start|end)$/.exec(s);if(f&&!r)return[E("text-align",f[1])];let m=Al[s.replace(/^text-/,"")];if(s.startsWith("text-")&&m&&!r&&!t)return[E("font-size",m.size),E("line-height",m.leading)];let h=_l[s.replace(/^font-/,"")];if(s.startsWith("font-")&&h&&!r)return[E("font-weight",h)];if(s.startsWith("leading-")&&!r){let R=s.slice(8),D=El[R]??$n(R);if(D)return[E("line-height",D)]}let C=/^cursor-(pointer|default|not-allowed|wait|text|move)$/.exec(s);if(C)return[E("cursor",C[1])];if(s==="pointer-events-none")return[E("pointer-events","none")];if(s==="pointer-events-auto")return[E("pointer-events","auto")];if(s==="select-none")return[E("user-select","none")];let w=/^opacity-(\d+)$/.exec(s);if(w&&!t)return[E("opacity",String(Number(w[1])/100))];if(s==="transition"||s==="transition-colors"||s==="transition-all")return[E("transition-property",s==="transition-colors"?"color, background-color, border-color, text-decoration-color, fill, stroke":s==="transition-all"?"all":"color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter"),E("transition-timing-function","cubic-bezier(0.4, 0, 0.2, 1)"),E("transition-duration","150ms")];let v=/^duration-(\d+)$/.exec(s);if(v)return[E("transition-duration",`${v[1]}ms`)];let d={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)"};if(s.startsWith("ease-")&&d[s.slice(4)])return[E("transition-timing-function",d[s.slice(4)])];if(s==="outline-none")return[E("outline","2px solid transparent"),E("outline-offset","2px")];if(s==="outline")return[E("outline-style","solid")];let u=/^outline-(\d+)$/.exec(s);if(u)return[E("outline-width",`${u[1]}px`)];if(s==="shadow"||s.startsWith("shadow-")){let R=s==="shadow"?"":s.slice(7),P=jl[R];if(P)return[E("box-shadow",P)]}if(s==="ring"||/^ring(?:-(?:0|1|2|4|8))?$/.test(s)){let R=s==="ring"?"":s.slice(5),P=Pl[R];if(P)return[E("--gs-ring-w",P),kn()]}if(s.startsWith("ring-")&&r===null){let R=wn(s.slice(5),null);if(R)return[E("--gs-ring-c",R),kn()]}if(s.startsWith("ring-")&&r){let R=wn(s.slice(5),r);if(R)return[E("--gs-ring-c",R),kn()]}let g=s==="rounded"?"":s.startsWith("rounded-")?s.slice(8):null;if(g!==null&&!t){let R=/^(t|r|b|l|s|e|tl|tr|bl|br|ss|se)(?:-(.+))?$/.exec(g),P=R?R[2]??"":g,D=Il[P];if(!D)return null;if(!R)return[E("border-radius",D)];let X={t:["border-top-left-radius","border-top-right-radius"],r:["border-top-right-radius","border-bottom-right-radius"],b:["border-bottom-left-radius","border-bottom-right-radius"],l:["border-top-left-radius","border-bottom-left-radius"],s:["border-start-start-radius","border-end-start-radius"],e:["border-start-end-radius","border-end-end-radius"],tl:["border-top-left-radius"],tr:["border-top-right-radius"],bl:["border-bottom-left-radius"],br:["border-bottom-right-radius"],ss:["border-start-start-radius"],se:["border-start-end-radius"]}[R[1]];return X?X.map(et=>E(et,D)):null}if(/^border(?:-[trblxy])?$/.test(s)&&!r)return[E("border-width","1px"),E("border-style","solid")];let y=/^border-(\d+)$/.exec(s);if(y&&!r)return[E("border-width",`${y[1]}px`),E("border-style","solid")];let k=/^border-(solid|dashed|dotted|double|none|hidden)$/.exec(s);if(k)return[E("border-style",k[1])];let x=/^(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|w|h|min-w|min-h|max-w|max-h|size|inset|top|right|bottom|left)-(.+)$/.exec(s),$=x?.[1],j=x?.[2];if($&&j&&!r){let R=$==="w"||$==="min-w"||$==="max-w"?Br(j,"w"):$==="h"||$==="min-h"||$==="max-h"?Br(j,"h"):$n(j);if(!R)return null;let P=t?R==="0"?"0":`-${R}`:R,G={p:["padding"],px:["padding-inline"],py:["padding-block"],pt:["padding-top"],pr:["padding-right"],pb:["padding-bottom"],pl:["padding-left"],ps:["padding-inline-start"],pe:["padding-inline-end"],m:["margin"],mx:["margin-inline"],my:["margin-block"],mt:["margin-top"],mr:["margin-right"],mb:["margin-bottom"],ml:["margin-left"],ms:["margin-inline-start"],me:["margin-inline-end"],gap:["gap"],"gap-x":["column-gap"],"gap-y":["row-gap"],w:["width"],h:["height"],"min-w":["min-width"],"min-h":["min-height"],"max-w":["max-width"],"max-h":["max-height"],size:["width","height"],inset:["inset"],top:["top"],right:["right"],bottom:["bottom"],left:["left"]}[$];return G?G.map(X=>E(X,P)):null}let I={bg:"background-color",text:"color",border:"border-color",outline:"outline-color",decoration:"text-decoration-color",accent:"accent-color",caret:"caret-color",fill:"fill",stroke:"stroke"};for(let[R,P]of Object.entries(I))if(s===R||s.startsWith(`${R}-`)){let D=s===R?"":s.slice(R.length+1);if(!D||/^(?:gradient|clip|ellipsis|wrap|nowrap|balance|pretty|opacity)/.test(D))return null;if(R==="text"&&!t){let X=Cn(D);if(X)return[E("font-size",X)]}let G=wn(D,r);return!G||t?null:[E(P,G)]}let A=/^\[([a-z-]+):(.+)\]$/i.exec(s);if(A&&!t&&!r){let R=A[1].toLowerCase(),P=A[2].replace(/_/g," ").trim();if(/^[a-z][\w-]*$/.test(R)&&P&&!/[<>]/.test(P))return[E(R,P)]}return null}var Ml=48,Nl={hover:"hover",focus:"focus","focus-visible":"focus","focus-within":"focus",active:"active",disabled:"disabled"},Tl=new Set(["cn","clsx","classNames","classnames","cx","twMerge"]);function fe(e,t){let n=1;for(let s=0;s<t&&s<e.length;s++)e[s]===`
|
|
49
|
-
`&&n++;return n}function
|
|
50
|
-
`:a,o++;continue}if(n==="`"&&i==="$"&&e[o+1]==="{"){r=!0;let a=1;for(o+=2;o<e.length&&a>0;o++)e[o]==="{"?a++:e[o]==="}"&&a--;o--;continue}if(i===n)return{v:r?null:s,end:o+1};s+=i}return null}function
|
|
51
|
-
`:o,s++;continue}if(r==="$"&&e[s+1]==="{"){let o=1;for(s+=2;s<e.length&&o>0;s++)e[s]==="{"?o++:e[s]==="}"&&o--;s--,n+=" ";continue}if(r==="`")return{css:n,end:s+1};n+=r}return null}function
|
|
43
|
+
`).length>12;return{source:kr(i)+(a?`
|
|
44
|
+
\u2026`:""),startLine:o}}function Ea(e,t){let n=xr(e,Math.max(0,t)),s=e.split(`
|
|
45
|
+
`),r=Math.max(0,n-1);return{source:kr(s.slice(r,r+12)),startLine:r+1}}function yr(e,t){return{kind:"other",...Ea(e,t)}}function yt(e,t){let n=hr.exec(e.slice(t));if(!n)return null;let s=n[1],r=n[2]??"",o=t+n[0].length;if(/\/\s*$/.test(r)||Sa.has(s.toLowerCase()))return{tag:s,attrs:r,openStart:t,openEnd:o,closeEnd:o,body:""};let a=1,l=o,c=Math.min(e.length,t+4e3);for(;l<c;){if(e[l]!=="<"){l++;continue}if(e.startsWith("</",l)){let f=/^<\/([A-Za-z][\w.-]*)\s*>/.exec(e.slice(l));if(f&&f[1].toLowerCase()===s.toLowerCase()){if(a--,a===0){let m=l+f[0].length;return{tag:s,attrs:r,openStart:t,openEnd:o,closeEnd:m,body:e.slice(o,l)}}l+=f?f[0].length:2;continue}l+=f?f[0].length:2;continue}let u=hr.exec(e.slice(l));if(u&&u[1].toLowerCase()===s.toLowerCase()&&!/\/\s*$/.test(u[2]??"")&&(a++,a>6))return"too-big";l+=u?u[0].length:1}return l>=c&&o+(c-t)>=4e3?"too-big":null}function dn(e,t){let n=Math.max(0,t-8e3),s=Math.min(t,e.length-1);for(;s>=n;){let r=e.lastIndexOf("<",s);if(r<n)return null;if(e[r+1]==="/"||e[r+1]==="!"||e[r+1]==="?"){s=r-1;continue}let o=yt(e,r);if(o==="too-big")return"too-big";if(o&&t>=o.openStart&&t<o.closeEnd)return o;s=r-1}return null}function wr(e){return e.replace(/([a-z\d])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}function je(e){return e.split(/\s+/).filter(Boolean)}function ue(e,t){let n=e[t];if(n!=='"'&&n!=="'"&&n!=="`")return null;let s="";for(let r=t+1;r<e.length;r++){let o=e[r];if(o==="\\"){s+=e[r+1]??"",r++;continue}if(n==="`"&&o==="$"&&e[r+1]==="{")return null;if(o===n)return{value:s,end:r+1};s+=o}return null}function vr(e){let t=[],n="",s=0,r=null;for(let o=0;o<e.length;o++){let i=e[o];if(r){if(n+=i,i==="\\"){n+=e[o+1]??"",o++;continue}i===r&&(r=null);continue}if(i==='"'||i==="'"||i==="`"){r=i,n+=i;continue}if(i==="("||i==="["||i==="{")s++;else if(i===")"||i==="]"||i==="}")s=Math.max(0,s-1);else if(i===","&&s===0){n.trim()&&t.push(n.trim()),n="";continue}n+=i}return n.trim()&&t.push(n.trim()),t}function ht(e=new Map,t=new Map){return{values:e,aliases:t,flags:new Set,strings:new Set,prefixes:new Map}}var fn=/^[A-Za-z_$][\w$]*$/;function gn(e,t){let n=0,s=null;for(let r=0;r<e.length;r++){let o=e[r];if(s){o==="\\"?r++:o===s&&(s=null);continue}if(o==='"'||o==="'"||o==="`"){s=o;continue}if(o==="("||o==="["||o==="{")n++;else if(o===")"||o==="]"||o==="}")n--;else if(n===0&&e.startsWith(t,r))return r}return-1}function mn(e){let t=e.trim();for(;t.startsWith("(")&&t.endsWith(")");){let n=0,s=!0;for(let r=0;r<t.length-1&&s;r++)t[r]==="("?n++:t[r]===")"&&n--,n===0&&(s=!1);if(!s)break;t=t.slice(1,-1).trim()}return t}function $r(e,t,n){if(e==="true")return!0;if(e==="false"||e==="undefined"||e==="null")return!1;let s=t.aliases.get(e);return s!==void 0&&!t.values.has(e)?Pe(s,t,n+1):(t.flags.add(e),!!t.values.get(e))}function Pe(e,t,n=0){if(n>4)return null;let s=mn(e);for(let c of["||","&&"]){let u=gn(s,c);if(u<0)continue;let f=Pe(s.slice(0,u),t,n+1),m=Pe(s.slice(u+2),t,n+1);return f===null||m===null?null:c==="||"?f||m:f&&m}let r=/^(!\s*)?([A-Za-z_$][\w$]*)$/.exec(s);if(r){let c=$r(r[2],t,n);return c===null?null:r[1]?!c:c}let o=/^([A-Za-z_$][\w$]*)\s*(===|==|!==|!=)\s*(["'])(.*?)\3$/.exec(s);if(!o)return null;let i=t.values.get(o[1]);typeof i=="string"&&t.strings.add(o[1]);let a=typeof i=="string"?i:"";return o[2]==="==="||o[2]==="=="?a===o[4]:a!==o[4]}function Cr(e){let t=0,n=null,s=-1;for(let r=0;r<e.length;r++){let o=e[r];if(n){o==="\\"?r++:o===n&&(n=null);continue}if(o==='"'||o==="'"||o==="`"){n=o;continue}if(o==="("||o==="["||o==="{")t++;else if(o===")"||o==="]"||o==="}")t--;else if(o==="?"&&t===0){s=r;break}}if(s<0)return null;t=0,n=null;for(let r=s+1;r<e.length;r++){let o=e[r];if(n){o==="\\"?r++:o===n&&(n=null);continue}if(o==='"'||o==="'"||o==="`"){n=o;continue}if(o==="("||o==="["||o==="{")t++;else if(o===")"||o==="]"||o==="}")t--;else if(o===":"&&t===0)return{condition:e.slice(0,s),yes:e.slice(s+1,r),no:e.slice(r+1)}}return null}function Ee(e,t=ht()){let n=mn(e);if(!n)return{classes:[],dynamic:!1};let s=Cr(n);if(s){let c=Pe(s.condition,t);return c===null?{classes:[],dynamic:!0}:Ee(c?s.yes:s.no,t)}let r=gn(n,"&&");if(r>=0){let c=Pe(n.slice(0,r),t);return c===null?{classes:[],dynamic:!0}:c?Ee(n.slice(r+2),t):{classes:[],dynamic:!1}}if(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))return{classes:je(n.slice(1,-1)),dynamic:!1};if(n.startsWith("`")&&n.endsWith("`")){let c=n.slice(1,-1),u="",f=0;for(;f<c.length;){let m=c.indexOf("${",f);if(m<0){u+=c.slice(f);break}u+=c.slice(f,m);let h=c.indexOf("}",m+2);if(h<0)return{classes:[],dynamic:!0};let w=c.slice(m+2,h).trim();if(fn.test(w)){let C=t.values.get(w);if(typeof C!="string")return{classes:[],dynamic:!0};t.strings.add(w);let $=/[\w-]*$/.exec(u)?.[0];$&&t.prefixes.set(w,$),u+=C}else{let C=Ee(w,t);if(C.dynamic)return{classes:[],dynamic:!0};u+=C.classes.join(" ")}f=h+1}return{classes:je(u),dynamic:!1}}if(fn.test(n)&&t.values.has(n)){let c=t.values.get(n);return typeof c!="string"?{classes:[],dynamic:!1}:(t.strings.add(n),{classes:je(c),dynamic:!1})}let o=/^(?:styles?|classes|css|cls)\.([A-Za-z_]\w*)$/.exec(n);if(o)return{classes:[wr(o[1])],dynamic:!1};let i=/^(?:styles?|classes|css|cls)\[\s*["']([\w-]+)["']\s*\]$/.exec(n);if(i)return{classes:[i[1]],dynamic:!1};let a=/^(?:styles?|classes|css|cls)\[\s*(`[^`]*`)\s*\]$/.exec(n);if(a){let c=Ee(a[1],t);return c.dynamic||c.classes.length!==1?{classes:[],dynamic:!0}:c}let l=/^([A-Za-z_][\w]*)\s*\(([\s\S]*)\)$/.exec(n);if(l&&Aa.has(l[1])){let c=[];for(let u of vr(l[2])){let f=Ee(u,t);if(f.dynamic)return{classes:[],dynamic:!0};c.push(...f.classes)}return{classes:c,dynamic:!1}}return{classes:[],dynamic:!0}}function xt(e){let t=[],n=!1,s=0;for(;s<e.length;){if(/\s/.test(e[s])){s++;continue}if(e[s]==="{"){let i=0,a=s;for(let l=s;l<e.length;l++)if(e[l]==="{")i++;else if(e[l]==="}"&&(i--,i===0)){s=l+1;break}s===a&&(s=e.length),/^\{\s*\.\.\./.test(e.slice(a))&&(n=!0);continue}let r=/^([A-Za-z_:][\w:.-]*)/.exec(e.slice(s));if(!r){s++;continue}for(s+=r[0].length;s<e.length&&/\s/.test(e[s]);)s++;if(e[s]!=="="){t.push({name:r[1]});continue}for(s++;s<e.length&&/\s/.test(e[s]);)s++;let o=ue(e,s);if(o){t.push({name:r[1],value:o.value}),s=o.end;continue}if(e[s]==="{"){let i=0,a=s;for(let u=s;u<e.length;u++)if(e[u]==="{")i++;else if(e[u]==="}"&&(i--,i===0)){s=u+1;break}s===a&&(s=e.length);let l=e.slice(a+1,s-1).trim(),c=ue(l,0);c&&c.end===l.length?t.push({name:r[1],value:c.value}):t.push({name:r[1],expr:l});continue}s++}return{list:t,spread:n}}function hn(e,t){let n=xt(e).list.find(s=>s.name==="class"||s.name==="className");return n?n.value!==void 0?{classes:je(n.value),dynamic:!1}:n.expr===void 0?{classes:[],dynamic:!0}:Ee(n.expr,t):null}function Sr(e,t){return/[<>]/.test(t)?!1:e==="href"||e==="src"||e==="action"?/^(?:https?:|mailto:|\/|#)/i.test(t):!0}function ja(e){return e==="class"||e==="className"?!1:!_a.test(e)&&!/^on/i.test(e)}function Rr(e){let t={};for(let n of xt(e).list){if(!ja(n.name)||n.expr!==void 0)continue;let s=n.value??"";Sr(n.name,s)&&(t[n.name]=s)}return t}var Pa=/^(?:data-[\w-]+|aria-[\w-]+|disabled|hidden)$/,La=new Set(["disabled","hidden"]);function mt(e,t,n=0){if(n>4)return null;let s=mn(e),r=ue(s,0);if(r&&r.end===s.length)return r.value;let o=Cr(s);if(o){let l=Pe(o.condition,t);return l===null?null:mt(l?o.yes:o.no,t,n+1)}let i=gn(s,"||");if(i>=0){let l=mt(s.slice(0,i),t,n+1);return l===null?null:l!==void 0?l:mt(s.slice(i+2),t,n+1)}if(s==="undefined"||s==="null"||s==="false")return;if(s==="true")return"true";if(!fn.test(s))return null;let a=t.values.get(s);if(typeof a=="string")return t.strings.add(s),a;if(typeof a=="boolean"||t.aliases.has(s)){let l=$r(s,t,n);return l===null?null:l?"true":void 0}return t.values.has(s)?void 0:null}function Oa(e,t){let n={};for(let s of xt(e).list){if(s.expr===void 0||!Pa.test(s.name))continue;let r=mt(s.expr,t);if(r!=null){if(La.has(s.name)){r!=="false"&&(n[s.name]="");continue}Sr(s.name,r)&&(n[s.name]=r)}}return n}function Ma(e,t){let n=/([A-Za-z_][\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|\{\s*["']([^"']*)["']\s*\})/g;for(let s of e.matchAll(n)){let r=s.index??0;if(t>=r&&t<r+s[0].length){let o=s[1];return o==="class"||o==="className"?{}:{prop:o,value:s[2]??s[3]??s[4]}}}return{}}function bt(e,t=0){if(t>6)return"";let n="",s=0;for(;s<e.length;){if(e[s]==="{"){let i=0,a=s;for(let u=s;u<e.length;u++)if(e[u]==="{")i++;else if(e[u]==="}"&&(i--,i===0)){a=u+1;break}if(a===s)break;let l=e.slice(s+1,a-1).trim();/^[A-Za-z_$][\w$]*$/.exec(l)?.[0]&&(n+='<span class="__gs-slot">Text</span>'),s=a;continue}if(e[s]==="<"){if(e.startsWith("<!--",s)){let l=e.indexOf("-->",s);s=l===-1?e.length:l+3;continue}if(e.startsWith("</",s)){let l=/^<\/[A-Za-z][\w.-]*\s*>/.exec(e.slice(s));s+=l?l[0].length:1;continue}let i=yt(e,s);if(!i||i==="too-big"){s++;continue}let a=i.tag.toLowerCase();if(/^[A-Z]/.test(i.tag))n+=bt(i.body,t+1);else if(Ra.has(a)){let l=hn(i.attrs),c=l&&!l.dynamic&&l.classes.length?` class="${br(l.classes.join(" "))}"`:"",u=bt(i.body,t+1);n+=`<${a}${c}>${u}</${a}>`}s=i.closeEnd;continue}let r=e.slice(s).search(/[<{}]/),o=r===-1?e.length:s+r;n+=br(e.slice(s,o)),s=o}return n}function Na(e){let t=hn(e.attrs);return!t||t.dynamic||t.classes.length===0?null:{tag:e.tag.toLowerCase(),classes:t.classes,attrs:Rr(e.attrs)}}function Ar(e,t){let n=[],s=t-1;for(;n.length<3&&s>=0;){let r=dn(e,s);if(!r||r==="too-big"||/^[A-Z]/.test(r.tag))break;let o=Na(r);if(!o)break;n.push(o),s=r.openStart-1}return n.reverse()}var Da=8;function Ta(e){let t=e.trim(),n=ue(t,0);return n&&n.end===t.length?n.value:t==="true"?!0:t==="false"?!1:/^-?\d+(?:\.\d+)?$/.test(t)?t:null}function Fa(e,t){let n=0,s=-1;for(let i=t;i<e.length&&i<t+2e3;i++){let a=e[i];if(a==='"'||a==="'"||a==="`"){let l=ue(e,i);if(!l)return null;i=l.end-1;continue}if(a==="{")n++;else if(a==="}"&&(n--,n===0)){s=i;break}}if(s<0)return null;let r=e.slice(s+1).trimStart()[0];if(r!==")"&&r!==":")return null;let o=new Map;for(let i of vr(e.slice(t+1,s))){if(i.startsWith("..."))continue;let a=/^([A-Za-z_$][\w$]*)(?:\s*:\s*([A-Za-z_$][\w$]*))?(?:\s*=\s*([\s\S]+))?$/.exec(i);if(!a)continue;let l=a[2]??a[1];if(a[3]===void 0){o.set(l,void 0);continue}let c=Ta(a[3]);c!==null&&o.set(l,c)}return{values:o,end:s}}function Ba(e,t){let n=new Set(t.attrs.match(/[A-Za-z_$][\w$]*/g)??[]),s=Math.max(0,t.openStart-8e3),o=[...e.slice(s,t.openStart).matchAll(/\(\s*\{/g)].reverse();for(let i of o){let a=s+(i.index??0)+i[0].length-1,l=Fa(e,a);if(!l||![...l.values.keys()].some(f=>n.has(f)))continue;let c=new Map,u=e.slice(l.end,t.openStart);for(let f of u.matchAll(/\bconst\s+([A-Za-z_$][\w$]*)\s*=\s*([^;\n]+);/g))n.has(f[1])&&c.set(f[1],f[2].trim());return ht(l.values,c)}return ht()}function Ua(e,t){let n=new Map;for(let s of e.matchAll(/([\w-]+)\$\{\s*([A-Za-z_$][\w$]*)\s*\}/g)){let r=s[1],o=t.find(i=>i.startsWith(r)&&i.length>r.length);o&&n.set(s[2],o.slice(r.length))}return n}function Va(e,t,n,s){let r=Ia(e,t.openStart,t.closeEnd);if(/^[A-Z]/.test(t.tag)){let m=Ma(e.slice(t.openStart,t.openEnd),n-t.openStart);return{kind:"component",...r,component:{tag:t.tag,...m}}}let o=Ba(e,t);for(let[m,h]of Ua(t.attrs,s))o.values.set(m,h);let i={};for(let[m,h]of o.values)i[m]=h??null;let a={attrs:t.attrs,values:i,aliases:Object.fromEntries(o.aliases)},l=ht(new Map(o.values),o.aliases),c=za(a.attrs,l);if(!c)return{kind:"dynamic",...r};let u={tag:t.tag.toLowerCase(),...c,ancestors:Ar(e,t.openStart),bodyHtml:bt(t.body)},f=[...[...l.strings].filter(m=>typeof o.values.get(m)=="string").map(m=>({name:m,kind:"text",...l.prefixes.has(m)?{prefix:l.prefixes.get(m)}:{}})),...[...l.flags].slice(0,Da).map(m=>({name:m,kind:"flag"}))];return f.length===0?{kind:"markup",...r,element:u}:{kind:"markup",...r,element:u,params:f,redraw:a}}function za(e,t){let n=hn(e,t);return n?.dynamic?null:{classes:n?.classes??[],attrs:{...Rr(e),...Oa(e,t)}}}function bn(e,t,n,s){if(Ca.test(s))return yr(e,t);let r=dn(e,t);return r==="too-big"||!r?yr(e,t):Va(e,r,t,n)}function Wa(e){let t={},n=new Set,{list:s,spread:r}=xt(e);for(let o of s)o.expr===void 0?t[o.name]=o.value??"true":o.expr==="true"||o.expr==="false"?t[o.name]=o.expr:n.add(o.name);return{literals:t,dynamic:n,spread:r}}function _r(e,t){let n=Wa(t),s=new Map,r=[],o=[],i=[],a=n.spread;for(let l of e.axes){if(l.opaque){a=!0;continue}if(!l.locked&&n.dynamic.has(l.prop)){a=!0;continue}let c=l.locked?l.defaultValue:n.literals[l.prop]??(n.spread?void 0:l.defaultValue);if(c===void 0)continue;s.set(l.prop,c);let u=!l.locked&&n.literals[l.prop]===c;if(l.prefix){o.push(`${l.prefix}${c}`),u&&c!==l.defaultValue&&i.push({prop:l.prop,value:c,known:l.defaultValue?[l.defaultValue]:[],cls:`${l.prefix}${c}`});continue}let f=l.values.find(m=>m.value===c);if(!f){a=!0,u&&l.values.length>0&&i.push({prop:l.prop,value:c,known:l.values.map(m=>m.value)});continue}for(let m of f.classes)m.startsWith("__gs-recipe-")&&r.push(m),o.push(m)}if(!a){for(let l of e.compounds)if(l.when.every(u=>s.get(u.prop)===u.value))for(let u of l.classes)u.startsWith("__gs-recipe-")&&r.push(u),o.push(u)}return e.classNameProp&&(n.dynamic.has("className")?a=!0:n.literals.className&&o.push(...je(n.literals.className))),{draw:a?null:[...e.staticClasses,...o],selects:r,unknown:i}}function yn(e){let t=[],n=/import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;for(let s of e.matchAll(n)){let r=s[2];for(let o of s[1].split(",")){let i=o.trim().split(/\s+as\s+/),a=i[0]?.trim(),l=(i[1]??i[0])?.trim();a&&l&&t.push({local:l,imported:a,spec:r})}}return t}function Ga(e,t,n,s,r){for(let o of yn(t)){if(o.local!==n)continue;let i=r(e,o.spec),a=s.find(l=>l.path===i&&l.component===o.imported);if(a)return a}return s.find(o=>o.path===e&&o.component===n)}function Ir(e,t,n,s,r,o){if(e.kind!=="component"||!e.component||r.length===0)return e;let i=Ga(s,t,e.component.tag,r,o);if(!i)return e;let a=dn(t,n),l=e.component.tag;if(!a||a==="too-big"||a.tag!==l&&a.tag!==i.component)return e;let c=_r(i,a.attrs);return c.draw?{kind:"markup",source:e.source,startLine:e.startLine,component:e.component,element:{tag:i.rootTag,classes:c.draw,attrs:{},ancestors:Ar(t,a.openStart),bodyHtml:bt(a.body)}}:e}function kt(e,t,n,s){let r=[],o=new Set,i=(l,c)=>{let u=`${l}\0${c.path}`;o.has(u)||(o.add(u),r.push({local:l,binding:c}))};for(let l of yn(t)){let c=s(e,l.spec),u=n.find(f=>f.path===c&&f.component===l.imported);u&&i(l.local,u)}for(let l of n)l.path===e&&i(l.component,l);let a=[];for(let{local:l,binding:c}of r){let u=0,f=`<${l}`;for(;u<t.length;){let m=t.indexOf(f,u);if(m<0)break;let h=t[m+f.length];if(h&&/[\w.]/.test(h)){u=m+f.length;continue}let w=yt(t,m);if(!w||w==="too-big"){u=m+f.length;continue}let C=_r(c,w.attrs);(C.selects.length||C.unknown.length)&&a.push({offset:m,component:l,selects:C.selects,unknown:C.unknown}),u=Math.max(w.closeEnd,m+f.length)}}return a}function Ha(e,t){let n=e.slice(t,t+700),s=n.indexOf("{");if(s<0)return{};let r=n.indexOf("}",s),o=n.slice(s,r<0?s+400:r+1),i={};for(let a of o.matchAll(/([A-Za-z_$][\w$]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g))i[a[1]]=a[2]??a[3]??"";return i}function Ka(e){let t=/\bclassName\s*=\s*/.exec(e);if(!t)return null;let n=t.index+t[0].length,s=ue(e,n);if(s)return s.value;if(e[n]!=="{")return null;let r=0;for(let o=n;o<e.length;o++)if(e[o]==="{")r++;else if(e[o]==="}"&&(r--,r===0))return e.slice(n+1,o);return null}function Ja(e,t){let n=t+1;for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]===")")return{rename:{},fixed:{},opaque:[]};if(e[n]!=="{")return null;let s={rename:{},fixed:{},opaque:[]};for(n++;n<e.length;){for(;n<e.length&&/[\s,]/.test(e[n]);)n++;if(e[n]==="}")return s;if(e.startsWith("...",n))return null;let r=/^[A-Za-z_$][\w$]*/.exec(e.slice(n));if(!r)return null;for(n+=r[0].length;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]===","||e[n]==="}"){s.rename[r[0]]=r[0];continue}if(e[n]!==":")return null;for(n++;n<e.length&&/\s/.test(e[n]);)n++;let o=ue(e,n);if(o){s.fixed[r[0]]=o.value,n=o.end;continue}let i=/^[A-Za-z_$][\w$]*/.exec(e.slice(n));if(i){s.rename[r[0]]=i[0],n+=i[0].length;continue}s.opaque.push(r[0]);let a=0;for(;n<e.length;){let l=e[n];if(l==='"'||l==="'"||l==="`"){let c=ue(e,n);if(!c)return null;n=c.end;continue}if(l==="("||l==="["||l==="{")a++;else if(l===")"||l==="]"||l==="}"){if(a===0)break;a--}else if(l===","&&a===0)break;n++}}return null}function Za(e,t,n,s){let r=[];for(let o of yn(e)){let i=s(t,o.spec),a=n.find(l=>l.path===i&&l.name===o.imported);a&&r.push({local:o.local,recipe:a})}for(let o of n)o.path===t&&o.name&&r.push({local:o.name,recipe:o});return r}function qa(e){let t=[],n=/(?:styles?|classes|css|cls)\s*\.\s*([A-Za-z_]\w*)/g;for(let c of e.matchAll(n))t.push({at:c.index??0,kind:"static",text:wr(c[1])});let s=/(?:styles?|classes|css|cls)\s*\[\s*["']([^"']+)["']\s*\]/g;for(let c of e.matchAll(s))t.push({at:c.index??0,kind:"static",text:c[1]});let r=/(?:styles?|classes|css|cls)\s*\[\s*`([^`$]*)\$\{\s*([A-Za-z_$][\w$]*)\s*\}`\s*\]/g;for(let c of e.matchAll(r))t.push({at:c.index??0,kind:"prefix",text:c[1],prop:c[2]});let o=/(?:styles?|classes|css|cls)\s*\[\s*["']([^"']+)["']\s*\+\s*([A-Za-z_$][\w$]*)\s*\]/g;for(let c of e.matchAll(o))t.push({at:c.index??0,kind:"prefix",text:c[1],prop:c[2]});/[[{(]/.test(e)||t.push({at:0,kind:"static",text:e.trim()}),t.sort((c,u)=>c.at-u.at);let i=[],a=[];for(let c of t)c.kind==="prefix"&&c.prop?a.push({prop:c.prop,prefix:c.text}):i.push(...je(c.text));let l=/(?:^|[(,\s])className\s*(?:[,)]|$)/.test(e);return{staticClasses:i,prefixes:a,classNameProp:l}}function Xa(e,t,n,s,r){let o=l=>t.rename[l]??l,i=e.axes.map(l=>{let c=t.fixed[l.prop],u=o(l.prop);return{prop:u,values:c?l.values.filter(f=>f.value===c):l.values,defaultValue:c??n[u]??l.defaultValue,opaque:t.opaque.includes(l.prop),locked:!!c}}),a=e.compounds.map(l=>({classes:l.classes,when:l.when.map(c=>({prop:o(c.prop),value:t.fixed[c.prop]??c.value}))}));return{staticClasses:[...e.staticClasses,...s],axes:i,compounds:a,classNameProp:r}}function Er(e,t,n){let s=[];for(let r of e){let o=Za(r.source,r.path,t,n);for(let i of r.names){let a=new RegExp(`(?:function\\s+${i}\\b|(?:const|let|var)\\s+${i}\\b)`,"g"),l=[...r.source.matchAll(a)],c=null;for(let u of l){let f=u.index??0,h=r.source.slice(f+u[0].length).search(/\nexport\s/),w=r.source.slice(f,f+u[0].length+(h<0?8e3:h)),C=Ha(r.source,f),$=0;for(;$<w.length;){if(w[$]!=="<"||w[$+1]==="/"||w[$+1]==="!"){$++;continue}let g=yt(w,$);if(!g||g==="too-big"){$++;continue}if($=g.openEnd,/^[A-Z]/.test(g.tag))continue;let p=Ka(g.attrs);if(!p)continue;let d=qa(p),y=d.prefixes.length?2:d.staticClasses.length?1:0,k=null,x=o.find(v=>new RegExp(`(?:^|[^\\w$])${v.local}\\s*\\(`).test(p));if(x){let v=p.search(new RegExp(`(?:^|[^\\w$])${x.local}\\s*\\(`)),E=p.indexOf("(",v),j=E<0?null:Ja(p,E);if(j){y=3,k=Xa(x.recipe,j,C,d.staticClasses,d.classNameProp);for(let R of d.prefixes)k.axes.push({prop:R.prop,values:[],prefix:R.prefix,defaultValue:C[R.prop]})}}!k&&(d.prefixes.length||d.staticClasses.length)&&(k={staticClasses:d.staticClasses,axes:d.prefixes.map(v=>({prop:v.prop,values:[],prefix:v.prefix,defaultValue:C[v.prop]})),compounds:[],classNameProp:d.classNameProp}),k&&(!c||y>c.score)&&(c={score:y,tag:g.tag.toLowerCase(),body:k})}}c&&s.push({component:i,path:r.path,rootTag:c.tag,...c.body})}}return s}var Ya=/<([A-Za-z][\w.-]*)\b((?:[^<>"'`{}]|"[^"]*"|'[^']*'|`[^`]*`|\{(?:[^{}]|\{[^{}]*\})*\})*)>/g,Qa=/\b(?:styles?|classes|css|cls)\s*(?:\.([A-Za-z_]\w*)|\[\s*["']([\w-]+)["']\s*\])/g,el=new Set(["span","svg","i","img","em","strong","small","b","p","kbd","abbr","sup","sub","picture","use","path"]),tl=new Set(["icon","glyph","svg"]),nl=new Set(["label","text","title","caption"]),sl=e=>e.replace(/([a-z\d])([A-Z])/g,"$1-$2").split(/[^a-z0-9]+/i).filter(Boolean).map(t=>t.toLowerCase());function Pr(e){let t=e.flatMap(sl);return t.some(n=>tl.has(n))?"icon":t.some(n=>nl.has(n))?"label":null}function rl(e){let t=e.replace(/\{\s*\/\*[\s\S]*?\*\/\s*\}/g," "),n=[];for(let s of t.matchAll(Ya)){let r=s[1];if(!el.has(r.toLowerCase())||r!==r.toLowerCase())continue;let o=[...s[2].matchAll(Qa)].map(a=>a[1]??a[2]),i=Pr(o);i&&n.push({index:s.index??0,role:i,tag:r.toLowerCase(),classes:o})}return n}function ol(e,t,n){if(!t.some(r=>r.property.toLowerCase()==="display"&&/^none\b/i.test(r.value.trim()))||n.size===0)return null;for(let r of W(e)){let o=Q(r);if(!o||o.length<2)continue;let i=o[o.length-1];if(i.combinator!==" "&&i.combinator!==">")continue;let a=i.simples.filter(m=>m.kind==="class");if(a.length!==1||a[0].kind!=="class"||!n.has(a[0].name))continue;let l=o[o.length-2];if(l.simples.filter(m=>m.kind!=="class"&&m.kind!=="attr"&&m.kind!=="tag").length>0)continue;let u=l.simples.filter(m=>m.kind==="class"),f=l.simples.filter(m=>m.kind==="attr");if(u.length===1&&f.length===0&&u[0].kind==="class"&&!/^(?:is|has)-/.test(u[0].name))return{classes:[u[0].name],attrs:{}};if(u.length===0&&f.length===1&&f[0].kind==="attr"&&f[0].value)return{classes:[],attrs:{[f[0].name]:f[0].value}}}return null}var il=["text","icon-start","icon-end","icon"],jr={text:"Text","icon-start":"Icon left","icon-end":"Icon right",icon:"Icon"};function al(e,t){let n=null,s=null;for(let i of t)i.index<e.index?n=i:s||(s=i);if(!n&&!s)return null;let r=n?e.index-n.index:1/0;return(s?s.index-e.index:1/0)<=r?"start":"end"}function Le(e){return{role:e.role,tag:e.tag,classes:e.classes}}function Lr(e){let t=new Map,n=(s,r)=>{let o=t.get(s)??[];o.some(i=>i.path===r.path)||o.push(r),t.set(s,o)};for(let s of e){let r=s.sources.flatMap(rl),o=r.filter(h=>h.role==="label"),i=r.filter(h=>h.role==="icon"),a=o[0];a&&n("text",{path:s.sheet,slots:[Le(a)],classes:[],attrs:{}});let l=new Set(o.flatMap(h=>h.classes.filter(w=>Pr([w])==="label"))),c=null,u=null;for(let h of i){let w=al(h,o),C=o.reduce(($,g)=>{let p=Math.abs(g.index-h.index);return!$||p<$.dist?{hit:g,dist:p}:$},null);w==="start"&&C&&!c&&(c={icon:h,label:C.hit}),w==="end"&&C&&!u&&(u={icon:h,label:C.hit})}c&&n("icon-start",{path:s.sheet,slots:[Le(c.icon),Le(c.label)],classes:[],attrs:{}}),u&&n("icon-end",{path:s.sheet,slots:[Le(u.label),Le(u.icon)],classes:[],attrs:{}});let f=null;for(let h of s.rules)if(f=ol(h.selector,h.declarations,l),f)break;let m=c?.icon??u?.icon??i[0]??null;f&&m&&n("icon",{path:s.sheet,slots:[Le(m)],classes:f.classes,attrs:f.attrs})}return[{id:"text",label:jr.text,sheets:t.get("text")??[]},...il.filter(s=>s!=="text"&&t.has(s)).map(s=>({id:s,label:jr[s],sheets:t.get(s)??[]}))]}function ll(e,t){if(!e)return t;let n=W(e);return W(t).flatMap(s=>n.map(r=>s.includes("&")?s.replaceAll("&",r):`${r} ${s}`)).join(", ")}var cl=/^@(?:-\w+-)?(?:keyframes|font-face|property)\b/i;function ke(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,i=>i.replace(/[^\n]/g," ")),n=[],s=[],r=0,o=1;for(let i=0;i<t.length;i++){let a=t[i];if(a===`
|
|
46
|
+
`&&o++,a==="{"){let l=t.slice(r,i).trim(),c=s[s.length-1];c&&(c.own+=t.slice(c.segStart,r));let u=/^@theme\b/i.test(l),f=l.startsWith("@")&&!u,m=[...s].reverse().find(h=>!h.isAt)??null;s.push({selector:l,resolved:f?l:u?":root":ll(m?.resolved??null,l),isAt:f,skip:(c?.skip??!1)||f&&cl.test(l),start:i+1,line:o,own:"",segStart:i+1}),r=i+1}else if(a==="}"){let l=s.pop();if(l){l.own+=t.slice(l.segStart,i),!l.isAt&&!l.skip&&n.push({selector:l.resolved,body:t.slice(l.start,i),ownBody:l.own,line:l.line,context:s.filter(u=>u.isAt).map(u=>u.selector.replace(/\s+/g," ")).join(" \xB7 ")});let c=s[s.length-1];c&&(c.segStart=i+1)}r=i+1}else a===";"&&(r=i+1)}return n}function pe(e){let t=[],n=0,s=0,r=o=>{let i=o.indexOf(":");if(i<=0)return;let a=o.slice(0,i).trim(),l=o.slice(i+1).replace(/\s+/g," ").trim();/^-{0,2}[a-z][\w-]*$/i.test(a)&&l&&a!=="composes"&&t.push({property:a,value:l})};for(let o=0;o<e.length;o++){let i=e[o];i==="("?n++:i===")"?n=Math.max(0,n-1):i===";"&&n===0&&(r(e.slice(s,o)),s=o+1)}return r(e.slice(s)),t}var ul=25,pl=12,Or=700,fl=/\b(?:must(?: not)?|never|always|should(?: not|n't)?|do not|don't|avoid|prefer|forbidden|not allowed|no more than)\b/i,re=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function dl(e){let t=e.split(`
|
|
47
|
+
`),n=[],s=[],r=null,o=null,i=0;if(t[0]?.trim()==="---"){let l=t.findIndex((c,u)=>u>0&&c.trim()==="---");l>0&&(i=l+1)}let a=l=>{r&&(n.push({start:r.start,end:l,text:r.lines.join(`
|
|
48
|
+
`).trimEnd(),headings:r.headings}),r=null)};for(;i<t.length;i++){let l=t[i],c=i+1,u=/^\s*(```|~~~)/.exec(l)?.[1];if(o){r.lines.push(l),u===o&&(o=null,a(c));continue}if(u){a(c-1),o=u,r={start:c,lines:[l],headings:[...s]};continue}let f=/^(#{1,6})\s+(.+?)\s*#*\s*$/.exec(l);if(f){a(c-1),s=[...s.slice(0,f[1].length-1),f[2]];continue}if(l.trim()===""){a(c-1);continue}r??={start:c,lines:[],headings:[...s]},r.lines.push(l)}return a(t.length),n}function gl(e,t){let n=e.map(re).join("|"),s=e.map(r=>re(r.charAt(0).toUpperCase()+r.slice(1))).join("|");return new RegExp(`${t.source}|\\b(?:${n})s?\\b|[a-z](?:${s})s?\\b|\\b(?:${n})[-_]|[-_](?:${n})\\b`,"i")}function ml(e,t){let n=t.map(re).join("|"),s=new Map;for(let r of e){if(r.base||r.title==="Unnamed"||r.title.startsWith("In ")||!r.element)continue;let i=s.get(r.title)??{title:r.title,tests:[],heading:null},a=r.selector.slice(ye(r.selector));for(let l of a.matchAll(/\.((?:\\.|[\w-])+)/g)){let c=l[1].replace(/\\(.)/g,"$1");if(t.includes(c.toLowerCase()))continue;let u=/[-_]|[a-z][A-Z]/.test(c);i.tests.push(new RegExp(u?`(?<![\\w-])${re(c)}(?![\\w-])`:`(?:\\.|["'\`])${re(c)}(?![\\w-])`))}if(!r.title.includes(" + ")){let l=r.title.toLowerCase().split(/\s+/).map(re).join("[\\s_-]+");i.tests.push(new RegExp(`\\b${l}[\\s_-]+(?:${n})s?\\b|\\b(?:${n})s?[_-]+${l}\\b`,"i")),r.axis&&/^[a-z]+$/i.test(r.title)&&i.tests.push(new RegExp(`\\b${re(r.axis)}\\s*[=:]\\s*\\{?\\s*["'\`]${re(r.title.toLowerCase())}["'\`]`,"i")),i.heading=r.title.toLowerCase()}s.set(r.title,i)}return[...s.values()]}function hl(e,t){return e.toLowerCase().replace(new RegExp(`\\b(?:${t.map(re).join("|")})s?\\b`,"g")," ").replace(/[^a-z0-9]+/g," ").trim()}function bl(e){return e.length>Or?`${e.slice(0,Or).trimEnd()}\u2026`:e}function Mr(e,t,n,s){let r=gl(n.classKeywords,n.prose),o=ml(s,n.classKeywords),i=new Set,a=[];for(let u of t){let f=e.get(u.path);if(f===void 0)continue;let m=[];for(let h of dl(f)){if(!r.test(h.text)&&!h.headings.some($=>r.test($)))continue;let w=h.headings.length?hl(h.headings[h.headings.length-1],n.classKeywords):"",C=o.filter($=>$.tests.some(g=>g.test(h.text))||w!==""&&$.heading===w).map($=>$.title);for(let $ of C)i.add($);m.push({path:u.path,line:h.start,endLine:h.end,headings:h.headings,text:bl(h.text),rule:fl.test(h.text),styles:C})}m.length!==0&&a.push({path:u.path,kind:u.kind,passages:m.slice(0,pl),total:m.length,rules:m.filter(h=>h.rule).length})}let l={instruction:0,documentation:1,record:2};a.sort((u,f)=>l[u.kind]-l[f.kind]||f.rules-u.rules||f.total-u.total||u.path.localeCompare(f.path));let c=new Map;for(let u of s)u.element&&!u.base&&u.title!=="Unnamed"&&!u.title.startsWith("In ")&&c.set(u.title,!0);return{files:a.slice(0,ul).map(({rules:u,...f})=>f),documented:[...i].sort(),undocumented:[...c.keys()].filter(u=>!i.has(u))}}var Nr=new Set(["tone","size","variant","kind","type","style","theme","color","colour","appearance","intent","emphasis","shape","level"]),yl=new Set(["is","has","js","c","component","comp","el","ui","the","root"]),xl={xs:["extra","small"],sm:["small"],md:["medium"],lg:["large"],xl:["extra","large"],xxl:["extra","extra","large"]},kl=new Set(["cta","ui","ux","faq","cms","api","url","ios"]);function kn(e){return e.replace(/\\(.)/g,"$1").replace(/([a-z\d])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map(t=>t.toLowerCase())}function wl(e){return new Set(e.flatMap(t=>[t,`${t}s`]))}function xn(e){let t=e.map(n=>kl.has(n)?n.toUpperCase():n).join(" ");return t.charAt(0).toUpperCase()+t.slice(1)}function Oe(e,t){let n=kn(e).filter(r=>!t.has(r)&&!yl.has(r)),s=null;return n.length>1&&Nr.has(n[0])&&(s=n[0],n=n.slice(1)),{words:n.flatMap(r=>xl[r]??[r]),axis:s}}var Dr=/\.((?:\\.|[\w-])+)/g,vl=/\[\s*([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\]\s]*))\s*\]/g;function $l(e,t){let n=e.split("/"),s=(n.pop()??"").replace(/(\.module)?\.[a-z]+$/i,""),r=n.pop()??"";return kn(s).some(a=>t.has(a))||kn(r).some(a=>t.has(a))?Oe(s,t).words:[]}function Cl(e,t){let n=[];for(let s of e.split(/[\s>+~]+/).filter(Boolean)){let r=[...s.matchAll(Dr)].map(o=>o[1]);if(r.length)for(let o of r)n.push(...Oe(o,t).words);else{let o=/^[a-z][\w-]*/i.exec(s)?.[0]?.toLowerCase();o&&!["div","span","html","body"].includes(o)&&n.push(...Oe(o,t).words)}}return n}function Me(e,t){let n=wl(t),s=ye(e.selector),r=e.selector.slice(0,s),o=e.selector.slice(s),i=[...o.matchAll(Dr)].map(u=>Oe(u[1],n));for(let u of o.matchAll(vl)){let f=u[1].replace(/^data-/,"").toLowerCase();if(!Nr.has(f))continue;let m=u[2]??u[3]??u[4]??"",h=Oe(m,n);i.push({words:h.words,axis:f})}let a=i.filter(u=>u.words.length>0);if(a.length>0)return{title:a.map(u=>xn(u.words)).join(" + "),axis:a.length===1?a[0].axis:null};let l=Cl(r,n);if(l.length>0)return{title:`In ${l.join(" ")}`,axis:null};let c=$l(e.path,n);if(c.length>0)return{title:xn(c),axis:null};if(e.base){let u=Sl(e.path,n);return u.length>0?{title:`${xn(u)} Base`,axis:null}:{title:"Base",axis:null}}return{title:"Unnamed",axis:null}}function Sl(e,t){let n=e.split("/").pop()??"";if(!/\.module\.[a-z]+$/i.test(n))return[];let s=n.replace(/\.module\.[a-z]+$/i,"");return Oe(s,t).words}var Rl=60;function Ze(e,t,n){let s=Q(e);if(!s)return null;let r=s.length-1,o=s[r].simples;if(nr(o)||an(o,t))return null;if(pt(o,t))return{compounds:s,at:r};for(let i=r-1;i>=0;i--){let a=s[i].simples;if(pt(a,t)&&!an(a,t))return{compounds:s,at:i}}return!n||r===0&&sr(o)?null:{compounds:s,at:0}}function Tr(e,t,n){return Ke([...e,{combinator:e.length?t.combinator:null,simples:n}])}function Fr(e,t){return e.kind!==t.kind?!1:e.kind==="attr"&&t.kind==="attr"?e.name===t.name&&e.op===t.op&&e.value===t.value:e.raw===t.raw}function Al(e,t){return e.length>=t.length?!1:e.every(n=>t.some(s=>Fr(n,s)))}function _l(e,t){if(e.length!==1)return!1;let n=e[0];return n.kind==="tag"?t.elements.includes(n.name):n.kind==="class"?t.classKeywords.some(s=>s.toLowerCase()===n.name.toLowerCase()):!1}function Il(e,t){for(let n of t.classes)e.classes.includes(n)||e.classes.push(n);Object.assign(e.attrs,t.attrs)}function Br(e){let t=new Set(e.map(n=>Je(n.property)).filter(n=>n!=="hint"));return t.size===0||t.size===1&&t.has("layout")?"placement":t.size===1&&t.has("paint")?"effect":"override"}function El(e){let t=e.filter(o=>o.context===""),n=t.length?t:e;if(n.some(o=>o.state==="default"))return null;let r=[...n.map(o=>new Set(o.state.split(" + "))).reduce((o,i)=>o?new Set([...o].filter(a=>i.has(a))):i,null)??[]].filter(o=>H(o)===ut.length);return r.length===1?r[0]:null}function wn(e){return e.sort((t,n)=>+(t.context!=="")-+(n.context!=="")||H(t.state.split(" + ")[0])-H(n.state.split(" + ")[0])||t.state.localeCompare(n.state))}function Ur(e,t,n,s,r={parts:new Set,controls:new Set}){let o=new Map,i=[];for(let g of t)if(g.declarations.length!==0)for(let p of W(g.selector)){let d=Ze(p,n,s);if(!d)continue;let{compounds:y,at:k}=d,x=y[k],v=ft(x.simples);if(v.identity.length===0)continue;let E=y.slice(0,k),j=Tr(E,x,v.identity),R=be(v.states);if(k<y.length-1){i.push({hostKey:j,part:{selector:Ke(y),path:e,line:g.line,state:R}});continue}if(or(v.identity,g.declarations))continue;let A=o.get(j);if(!A){if(o.size>=Rl)continue;A={key:j,prefix:E,identity:v.identity,line:g.line,states:[],modifiers:[],contexts:[],parts:[],movedInto:null},o.set(j,A)}let P=A.states.find(N=>N.state===R&&N.context===g.context);P||(P={state:R,context:g.context,line:g.line,declarations:[]},v.states.length&&(P.marker={classes:[],attrs:{}}),A.states.push(P)),P.marker&&Il(P.marker,v.marker),P.declarations.push(...g.declarations)}for(let[g,p]of o){let d=p.states.flatMap(x=>x.declarations),y=p.states.every(x=>gt(x.declarations)),k=d.every(x=>Je(x.property)==="hint");(y||k)&&o.delete(g)}let a=new Map;for(let g of o.values()){let p=He(g.identity);a.set(p,[...a.get(p)??[],g])}for(let g of a.values()){let p=g.map(x=>El(x.states)),d=p[0];if(!d||p.some(x=>x!==d))continue;let y=g.flatMap(x=>x.states).find(x=>x.marker&&x.state.split(" + ").includes(d))?.marker;if(!y)continue;let k=[...y.classes.map(x=>({kind:"class",raw:`.${x}`,name:x})),...Object.entries(y.attrs).map(([x,v])=>({kind:"attr",raw:`[${x}="${v}"]`,name:x,op:"=",value:v}))];for(let x of g){let v=[...x.identity,...k],E={combinator:x.prefix.length?" ":null,simples:v},j=Tr(x.prefix,E,v);for(let R of x.states){let A=R.state.split(" + ").filter(P=>P!==d);if(R.state=be(A),A.length===0)delete R.marker;else if(R.marker){R.marker.classes=R.marker.classes.filter(P=>!y.classes.includes(P));for(let P of Object.keys(y.attrs))delete R.marker.attrs[P]}}o.delete(x.key),o.set(j,{...x,key:j,identity:v})}}let l=()=>[...o.values()].filter(g=>g.prefix.length===0),c=g=>g.states.filter(p=>p.state==="default").reduce((p,d)=>p+d.declarations.length,0),u=l().find(g=>_l(g.identity,n))??(s?l().filter(g=>{let p=g.identity.length===1?g.identity[0]:null;return p?.kind==="class"&&r.controls.has(p.name)}).sort((g,p)=>c(p)-c(g)||g.line-p.line)[0]??null:null),f=u&&u.identity[0].kind==="class"?[u.identity[0].name]:[],m=(g,p,d)=>{p[d].push(g),g.movedInto=p,o.delete(g.key)},h=[...o.values()],w=g=>{let p=h.find(d=>d.key===g)??null;for(;p?.movedInto;)p=p.movedInto;return p};for(let g of l()){let p=g.identity.length===1?g.identity[0]:null;if(!(p?.kind!=="class"||!r.parts.has(p.name))&&(o.delete(g.key),u&&g!==u)){g.movedInto=u;for(let d of g.states)u.parts.push({selector:g.key,path:e,line:d.line,state:d.state})}}let C=l().filter(g=>g.identity.filter(p=>p.kind!=="tag"&&p.kind!=="universal").length>=2).sort((g,p)=>g.identity.length-p.identity.length);for(let g of C){let p=h.filter(y=>y!==g&&y!==u&&y.prefix.length===0&&Al(y.identity,g.identity));if(p.length===0)continue;p.sort((y,k)=>k.identity.length-y.identity.length||c(k)-c(y)||y.line-k.line);let d=w(p[0].key);d&&d!==g&&m(g,d,"modifiers")}for(let{hostKey:g,part:p}of i){let d=w(g)??(s?u:null);d&&o.has(d.key)&&d.parts.push(p)}let $=g=>{let p=g===u,d=dt(g.key,f);return{...Me({selector:g.key,path:e,base:p},n.classKeywords),element:d,usage:{status:"unknown",files:[],fileCount:0},selector:g.key,path:e,line:g.line,base:p,states:wn(g.states),modifiers:g.modifiers.length?g.modifiers.map(y=>{let k=y.identity.filter(x=>!g.identity.some(v=>Fr(v,x)));return{title:Me({selector:k.map(x=>x.raw).join(""),path:e,base:!1},n.classKeywords).title,selector:y.key,path:e,line:y.line,element:dt(y.key,f),usage:{status:"unknown",files:[],fileCount:0},states:wn(y.states)}}):void 0,contexts:g.contexts.length?g.contexts.map(y=>{let k=Br(y.states.flatMap(x=>x.declarations));return{selector:y.key,path:e,line:y.line,role:k,element:k==="override"?dt(y.key,f):null,states:wn(y.states)}}):void 0,parts:g.parts.length?g.parts:void 0}};return[...o.values()].map($)}function Vr(e){let t=new Map;for(let i of e){let a=i.base?/^\.([\w-]+)$/.exec(i.selector):null;a&&t.set(i.path,[...t.get(i.path)??[],a[1]])}let n=i=>{let a=Q(i.selector);if(!a)return null;let l=a[a.length-1].simples,c=t.get(i.path)??[],u=l.filter(f=>!(f.kind==="class"&&c.includes(f.name)));return{depth:a.length-1,subject:He(l),bareTag:!l.some(f=>f.kind==="class"||f.kind==="attr"||f.kind==="id"),bare:u.length&&u.length<l.length?He(u):null}},s=new Map(e.map(i=>[i,n(i)])),r=new Set,o=i=>{let a=s.get(i);if(!a||a.depth===0)return null;let l=e.filter(c=>{if(c===i||r.has(c))return!1;let u=s.get(c);return u!=null&&u.depth<a.depth&&(!a.bareTag||u.depth===0)&&(u.subject===a.subject||a.bare!==null&&u.subject===a.bare)});return l.sort((c,u)=>+(u.path===i.path)-+(c.path===i.path)||s.get(c).depth-s.get(u).depth),l[0]??null};for(let i of[...e].sort((a,l)=>(s.get(l)?.depth??0)-(s.get(a)?.depth??0))){let a=o(i);if(!a)continue;for(;r.has(a);)a=o(a)??a;let l=Br(i.states.flatMap(c=>c.declarations));a.contexts=[...a.contexts??[],{selector:i.selector,path:i.path,line:i.line,role:l,element:l==="override"?i.element:null,states:i.states}],i.parts?.length&&(a.parts=[...a.parts??[],...i.parts]),i.modifiers?.length&&(a.modifiers=[...a.modifiers??[],...i.modifiers]),r.add(i)}return e.filter(i=>!r.has(i))}var jl={slate:{50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a",950:"#020617"},gray:{50:"#f9fafb",100:"#f3f4f6",200:"#e5e7eb",300:"#d1d5db",400:"#9ca3af",500:"#6b7280",600:"#4b5563",700:"#374151",800:"#1f2937",900:"#111827",950:"#030712"},zinc:{50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b",950:"#09090b"},neutral:{50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717",950:"#0a0a0a"},stone:{50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917",950:"#0c0a09"},red:{50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d",950:"#450a0a"},orange:{50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12",950:"#431407"},amber:{50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},yellow:{50:"#fefce8",100:"#fef9c3",200:"#fef08a",300:"#fde047",400:"#facc15",500:"#eab308",600:"#ca8a04",700:"#a16207",800:"#854d0e",900:"#713f12",950:"#422006"},lime:{50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314",950:"#1a2e05"},green:{50:"#f0fdf4",100:"#dcfce7",200:"#bbf7d0",300:"#86efac",400:"#4ade80",500:"#22c55e",600:"#16a34a",700:"#15803d",800:"#166534",900:"#14532d",950:"#052e16"},emerald:{50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b",950:"#022c22"},teal:{50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},cyan:{50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63",950:"#083344"},sky:{50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e",950:"#082f49"},blue:{50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a",950:"#172554"},indigo:{50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81",950:"#1e1b4b"},violet:{50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95",950:"#2e1065"},purple:{50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87",950:"#3b0764"},fuchsia:{50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75",950:"#4a044e"},pink:{50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843",950:"#500724"},rose:{50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337",950:"#4c0519"}};function zr(e){let t=e.lastIndexOf("-");return t<=0?null:jl[e.slice(0,t)]?.[e.slice(t+1)]??null}var I=(e,t)=>({property:e,value:t});function Rn(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let t=e.slice(1,-1).replace(/_/g," ").trim();return/^-?[\d.]+(?:px|rem|em|%|vh|vw)$/.test(t)||/^var\(\s*--[\w-]+\s*\)$/.test(t)?t.replace(/\s+/g,""):null}function Sn(e){let t=Rn(e);if(t)return t;if(e==="px")return"1px";if(!/^\d+(?:\.\d+)?$/.test(e))return null;let n=Number(e);if(n>96)return null;let s=Math.round(n*2);if(Math.abs(n*2-s)>1e-6)return null;if(s===0)return"0";let r=Math.floor(s/8),o=["",".125",".25",".375",".5",".625",".75",".875"][s%8];return r===0?`0${o}rem`:`${r}${o}rem`}function Pl(e){let t=/^(\d+)\/(\d+)$/.exec(e);if(!t)return null;let n=Number(t[1])/Number(t[2])*100;return Number.isFinite(n)?`${Number(n.toFixed(4))}%`:null}function Wr(e,t){return{full:"100%",screen:t==="w"?"100vw":"100vh",auto:"auto",fit:"fit-content",min:"min-content",max:"max-content"}[e]??Pl(e)??Rn(e)??Sn(e)}var Ll={xs:{size:"0.75rem",leading:"1rem"},sm:{size:"0.875rem",leading:"1.25rem"},base:{size:"1rem",leading:"1.5rem"},lg:{size:"1.125rem",leading:"1.75rem"},xl:{size:"1.25rem",leading:"1.75rem"},"2xl":{size:"1.5rem",leading:"2rem"},"3xl":{size:"1.875rem",leading:"2.25rem"},"4xl":{size:"2.25rem",leading:"2.5rem"},"5xl":{size:"3rem",leading:"1"},"6xl":{size:"3.75rem",leading:"1"}},Ol={thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},Ml={none:"1",tight:"1.25",snug:"1.375",normal:"1.5",relaxed:"1.625",loose:"2"},Nl={none:"0",sm:"0.125rem","":"0.25rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},Dl={sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)","":"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"},Tl={"":"3px",0:"0px",1:"1px",2:"2px",4:"4px",8:"8px"};function vn(e,t){let n=null;if(e.startsWith("[")&&e.endsWith("]")){let r=e.slice(1,-1).replace(/_/g," ").trim();if(r.startsWith("--"))n=`var(${r})`;else if(/^var\(\s*--[\w-]+\s*\)$/.test(r))n=r.replace(/\s+/g,"");else if(/^#[0-9a-f]{3,8}$/i.test(r)||/^(?:rgb|hsl|oklch|oklab|color)\(/i.test(r))n=r;else return null}else e==="white"?n="#fff":e==="black"?n="#000":e==="transparent"?n="transparent":e==="current"?n="currentColor":e==="inherit"?n="inherit":n=zr(e)??(/^[a-z][\w-]*$/i.test(e)?`var(--${e}, var(--color-${e}))`:null);if(!n)return null;if(!t)return n;if(!/^\d+(?:\.\d+)?$/.test(t))return null;let s=Number(t)<=1?Number(t)*100:Number(t);return s<0||s>100?null:s===100?n:`color-mix(in srgb, ${n} ${s}%, transparent)`}function Fl(e){let t=0,n=-1;for(let s=0;s<e.length;s++){let r=e[s];r==="["?t++:r==="]"?t=Math.max(0,t-1):r==="/"&&t===0&&(n=s)}return n<0?{body:e,opacity:null}:{body:e.slice(0,n),opacity:e.slice(n+1)}}function $n(){return I("box-shadow","0 0 0 var(--gs-ring-w, 3px) var(--gs-ring-c, currentColor)")}var Bl={flex:"flex","inline-flex":"inline-flex",block:"block","inline-block":"inline-block",inline:"inline",grid:"grid","inline-grid":"inline-grid",hidden:"none",contents:"contents"},Cn={start:"flex-start",end:"flex-end",center:"center",baseline:"baseline",stretch:"stretch",between:"space-between",around:"space-around",evenly:"space-evenly"};function Gr(e){let t=e.startsWith("-"),n=t?e.slice(1):e,{body:s,opacity:r}=Fl(n),o=Bl[s];if(o&&!t&&!r)return[I("display",o)];let i=/^flex-(row|col|row-reverse|col-reverse)$/.exec(s);if(i&&!t&&!r){let A=i[1]==="col"?"column":i[1]==="col-reverse"?"column-reverse":i[1];return[I("flex-direction",A)]}if(s==="flex-wrap"&&!t)return[I("flex-wrap","wrap")];if(s==="flex-nowrap"&&!t)return[I("flex-wrap","nowrap")];if(s==="flex-1"&&!t)return[I("flex","1 1 0%")];if(s==="shrink-0"&&!t)return[I("flex-shrink","0")];if(s==="grow-0"&&!t)return[I("flex-grow","0")];if(s==="grow"&&!t)return[I("flex-grow","1")];let a=/^items-(start|end|center|baseline|stretch)$/.exec(s);if(a&&!t)return[I("align-items",Cn[a[1]])];let l=/^justify-(start|end|center|between|around|evenly)$/.exec(s);if(l&&!t)return[I("justify-content",Cn[l[1]])];let c=/^self-(start|end|center|stretch|auto)$/.exec(s);if(c&&!t)return[I("align-self",c[1]==="auto"?"auto":Cn[c[1]])];if(s==="whitespace-nowrap")return[I("white-space","nowrap")];if(s==="whitespace-normal")return[I("white-space","normal")];if(s==="truncate")return[I("overflow","hidden"),I("text-overflow","ellipsis"),I("white-space","nowrap")];if(s==="underline")return[I("text-decoration-line","underline")];if(s==="no-underline")return[I("text-decoration-line","none")];if(s==="line-through")return[I("text-decoration-line","line-through")];let u=/^(uppercase|lowercase|capitalize|normal-case)$/.exec(s);if(u)return[I("text-transform",u[1]==="normal-case"?"none":u[1])];let f=/^text-(left|center|right|justify|start|end)$/.exec(s);if(f&&!r)return[I("text-align",f[1])];let m=Ll[s.replace(/^text-/,"")];if(s.startsWith("text-")&&m&&!r&&!t)return[I("font-size",m.size),I("line-height",m.leading)];let h=Ol[s.replace(/^font-/,"")];if(s.startsWith("font-")&&h&&!r)return[I("font-weight",h)];if(s.startsWith("leading-")&&!r){let A=s.slice(8),N=Ml[A]??Sn(A);if(N)return[I("line-height",N)]}let w=/^cursor-(pointer|default|not-allowed|wait|text|move)$/.exec(s);if(w)return[I("cursor",w[1])];if(s==="pointer-events-none")return[I("pointer-events","none")];if(s==="pointer-events-auto")return[I("pointer-events","auto")];if(s==="select-none")return[I("user-select","none")];let C=/^opacity-(\d+)$/.exec(s);if(C&&!t)return[I("opacity",String(Number(C[1])/100))];if(s==="transition"||s==="transition-colors"||s==="transition-all")return[I("transition-property",s==="transition-colors"?"color, background-color, border-color, text-decoration-color, fill, stroke":s==="transition-all"?"all":"color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter"),I("transition-timing-function","cubic-bezier(0.4, 0, 0.2, 1)"),I("transition-duration","150ms")];let $=/^duration-(\d+)$/.exec(s);if($)return[I("transition-duration",`${$[1]}ms`)];let g={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)"};if(s.startsWith("ease-")&&g[s.slice(4)])return[I("transition-timing-function",g[s.slice(4)])];if(s==="outline-none")return[I("outline","2px solid transparent"),I("outline-offset","2px")];if(s==="outline")return[I("outline-style","solid")];let p=/^outline-(\d+)$/.exec(s);if(p)return[I("outline-width",`${p[1]}px`)];if(s==="shadow"||s.startsWith("shadow-")){let A=s==="shadow"?"":s.slice(7),P=Dl[A];if(P)return[I("box-shadow",P)]}if(s==="ring"||/^ring(?:-(?:0|1|2|4|8))?$/.test(s)){let A=s==="ring"?"":s.slice(5),P=Tl[A];if(P)return[I("--gs-ring-w",P),$n()]}if(s.startsWith("ring-")&&r===null){let A=vn(s.slice(5),null);if(A)return[I("--gs-ring-c",A),$n()]}if(s.startsWith("ring-")&&r){let A=vn(s.slice(5),r);if(A)return[I("--gs-ring-c",A),$n()]}let d=s==="rounded"?"":s.startsWith("rounded-")?s.slice(8):null;if(d!==null&&!t){let A=/^(t|r|b|l|s|e|tl|tr|bl|br|ss|se)(?:-(.+))?$/.exec(d),P=A?A[2]??"":d,N=Nl[P];if(!N)return null;if(!A)return[I("border-radius",N)];let X={t:["border-top-left-radius","border-top-right-radius"],r:["border-top-right-radius","border-bottom-right-radius"],b:["border-bottom-left-radius","border-bottom-right-radius"],l:["border-top-left-radius","border-bottom-left-radius"],s:["border-start-start-radius","border-end-start-radius"],e:["border-start-end-radius","border-end-end-radius"],tl:["border-top-left-radius"],tr:["border-top-right-radius"],bl:["border-bottom-left-radius"],br:["border-bottom-right-radius"],ss:["border-start-start-radius"],se:["border-start-end-radius"]}[A[1]];return X?X.map(tt=>I(tt,N)):null}if(/^border(?:-[trblxy])?$/.test(s)&&!r)return[I("border-width","1px"),I("border-style","solid")];let y=/^border-(\d+)$/.exec(s);if(y&&!r)return[I("border-width",`${y[1]}px`),I("border-style","solid")];let k=/^border-(solid|dashed|dotted|double|none|hidden)$/.exec(s);if(k)return[I("border-style",k[1])];let x=/^(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|w|h|min-w|min-h|max-w|max-h|size|inset|top|right|bottom|left)-(.+)$/.exec(s),v=x?.[1],E=x?.[2];if(v&&E&&!r){let A=v==="w"||v==="min-w"||v==="max-w"?Wr(E,"w"):v==="h"||v==="min-h"||v==="max-h"?Wr(E,"h"):Sn(E);if(!A)return null;let P=t?A==="0"?"0":`-${A}`:A,V={p:["padding"],px:["padding-inline"],py:["padding-block"],pt:["padding-top"],pr:["padding-right"],pb:["padding-bottom"],pl:["padding-left"],ps:["padding-inline-start"],pe:["padding-inline-end"],m:["margin"],mx:["margin-inline"],my:["margin-block"],mt:["margin-top"],mr:["margin-right"],mb:["margin-bottom"],ml:["margin-left"],ms:["margin-inline-start"],me:["margin-inline-end"],gap:["gap"],"gap-x":["column-gap"],"gap-y":["row-gap"],w:["width"],h:["height"],"min-w":["min-width"],"min-h":["min-height"],"max-w":["max-width"],"max-h":["max-height"],size:["width","height"],inset:["inset"],top:["top"],right:["right"],bottom:["bottom"],left:["left"]}[v];return V?V.map(X=>I(X,P)):null}let j={bg:"background-color",text:"color",border:"border-color",outline:"outline-color",decoration:"text-decoration-color",accent:"accent-color",caret:"caret-color",fill:"fill",stroke:"stroke"};for(let[A,P]of Object.entries(j))if(s===A||s.startsWith(`${A}-`)){let N=s===A?"":s.slice(A.length+1);if(!N||/^(?:gradient|clip|ellipsis|wrap|nowrap|balance|pretty|opacity)/.test(N))return null;if(A==="text"&&!t){let X=Rn(N);if(X)return[I("font-size",X)]}let V=vn(N,r);return!V||t?null:[I(P,V)]}let R=/^\[([a-z-]+):(.+)\]$/i.exec(s);if(R&&!t&&!r){let A=R[1].toLowerCase(),P=R[2].replace(/_/g," ").trim();if(/^[a-z][\w-]*$/.test(A)&&P&&!/[<>]/.test(P))return[I(A,P)]}return null}var Ul=48,Vl={hover:"hover",focus:"focus","focus-visible":"focus","focus-within":"focus",active:"active",disabled:"disabled"},zl=new Set(["cn","clsx","classNames","classnames","cx","twMerge"]);function fe(e,t){let n=1;for(let s=0;s<t&&s<e.length;s++)e[s]===`
|
|
49
|
+
`&&n++;return n}function Wl(e){let t=n=>n.replace(/[^\n]/g," ");return e.replace(/\/\*[\s\S]*?\*\//g,t).replace(/(^|\s)\/\/[^\n]*/g,(n,s)=>s+t(n.slice(s.length)))}function G(e,t){for(;t<e.length&&/\s/.test(e[t]);)t++;return t}function wt(e,t){let n=e[t];if(n!=='"'&&n!=="'"&&n!=="`")return null;let s="",r=!1;for(let o=t+1;o<e.length;o++){let i=e[o];if(i==="\\"){let a=e[o+1];if(a===void 0)return null;s+=a==="n"?`
|
|
50
|
+
`:a,o++;continue}if(n==="`"&&i==="$"&&e[o+1]==="{"){r=!0;let a=1;for(o+=2;o<e.length&&a>0;o++)e[o]==="{"?a++:e[o]==="}"&&a--;o--;continue}if(i===n)return{v:r?null:s,end:o+1};s+=i}return null}function In(e,t,n,s){let r=0;for(let o=t;o<e.length;o++){let i=e[o];if(i==='"'||i==="'"||i==="`"){let a=wt(e,o);if(!a)return e.length;o=a.end-1;continue}if(i===n)r++;else if(i===s&&(r--,r===0))return o+1}return e.length}function Gl(e,t){let n=0;for(let s=t;s<e.length;s++){let r=e[s];if(r==='"'||r==="'"||r==="`"){let o=wt(e,s);if(!o)return e.length;s=o.end-1;continue}if(r==="("||r==="["||r==="{")n++;else if(r===")"||r==="]"||r==="}"){if(n===0)return s;n--}else if(r===","&&n===0)return s}return e.length}function Hr(e){if(e.t==="str")return e.v;if(e.t==="arr"){let t=[];for(let n of e.items){let s=Hr(n);s&&t.push(s)}return t.join(" ")||null}return e.t==="obj"&&e.entries.filter(n=>n.value.t==="bool"&&n.value.v).map(n=>n.key).join(" ")||null}function Hl(e,t){let n=t+1,s=[];for(;n<e.length;){if(n=G(e,n),e[n]===")")return{v:s.join(" ").replace(/\s+/g," ").trim()||null,end:n+1};if(e[n]===","){n++;continue}let r=ne(e,n);if(!r)return null;let o=G(e,r.end);if(e[o]===","||e[o]===")"){let i=Hr(r.val);i&&s.push(i),n=r.end;continue}n=Gl(e,n)}return null}function ne(e,t){if(t=G(e,t),t>=e.length)return null;let n=e[t];if(n==='"'||n==="'"||n==="`"){let r=wt(e,t);return r?{val:{t:"str",v:r.v,at:t},end:r.end}:null}if(n==="["){let r=t+1,o=[];for(;r<e.length;){if(r=G(e,r),e[r]==="]")return{val:{t:"arr",items:o,at:t},end:r+1};if(e[r]===","){r++;continue}let i=ne(e,r);if(!i)return null;o.push(i.val),r=i.end}return null}if(n==="{"){let r=t+1,o=[];for(;r<e.length;){if(r=G(e,r),e[r]==="}")return{val:{t:"obj",entries:o,at:t},end:r+1};if(e[r]===","){r++;continue}if(e.slice(r,r+3)==="..."){let c=ne(e,r+3);if(!c)return null;r=c.end;continue}let i="",a=r;if(e[r]==='"'||e[r]==="'"||e[r]==="`"){let c=wt(e,r);if(!c||c.v===null)return null;i=c.v,r=c.end}else if(/[\w$]/.test(e[r])){for(a=r;r<e.length&&/[\w$]/.test(e[r]);)r++;i=e.slice(a,r)}else return null;if(r=G(e,r),e[r]!==":"){e[r]==="("&&(r=In(e,r,"(",")"));continue}let l=ne(e,r+1);if(!l)return null;o.push({key:i,at:a,value:l.val}),r=l.end}return null}let s=t;if(n==="."||n==="-"||/\d/.test(n)){let r=t+1;for(;r<e.length&&/[\d.]/.test(e[r]);)r++;let o=e.slice(t,r);if(/^-?\d+(?:\.\d+)?$/.test(o))return{val:{t:"num",v:Number(o),at:s},end:r};for(;r<e.length&&/[\w$.+-]/.test(e[r]);)r++;return{val:{t:"other",at:s},end:r}}if(/[\w$]/.test(n)){let r=t;for(;r<e.length&&/[\w$]/.test(e[r]);)r++;let o=e.slice(t,r),i=G(e,r);if(e[i]==="("){if(zl.has(o)){let a=Hl(e,i);return a?{val:{t:"str",v:a.v,at:s},end:a.end}:null}return{val:{t:"other",at:s},end:In(e,i,"(",")")}}return o==="true"||o==="false"?{val:{t:"bool",v:o==="true",at:s},end:r}:{val:{t:"other",at:s},end:i}}return null}function vt(e){if(e.t==="str")return e.v;if(e.t==="arr"){let t=[];for(let n of e.items){if(n.t!=="str"||n.v===null)return null;t.push(n.v)}return t.join(" ")}return null}function Kr(e){let t=[],n="",s=0;for(let r of e)r==="["?s++:r==="]"&&(s=Math.max(0,s-1)),/\s/.test(r)&&s===0?(n&&t.push(n),n=""):(!/\s/.test(r)||s>0)&&(n+=r);return n&&t.push(n),t}var An={sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"};function Kl(e,t,n,s){let r=Vl[e];if(r)return t.includes(r)||t.push(r),!0;if(e==="dark")return s.on=!0,!0;if(An[e])return n.min.push(An[e]),!0;let o=/^max-(sm|md|lg|xl|2xl)$/.exec(e);if(o)return n.below.push(An[o[1]]),!0;let i=/^min-\[([\d.]+(?:px|rem|em))\]$/.exec(e);if(i)return n.min.push(i[1]),!0;let a=/^max-\[([\d.]+(?:px|rem|em))\]$/.exec(e);return a?(n.max.push(a[1]),!0):!1}function Jl(e,t){let n=[];for(let s of e.min)n.push(`(min-width: ${s})`);for(let s of e.max)n.push(`(max-width: ${s})`);for(let s of e.below)n.push(`not all and (min-width: ${s})`);return t&&n.push("(prefers-color-scheme: dark)"),n.length?`@media ${n.join(" and ")}`:""}function Jr(e){let t=e.trim();if(!t)return null;let n=!1;t.startsWith("!")&&(n=!0,t=t.slice(1)),t.endsWith("!")&&(n=!0,t=t.slice(0,-1));let s=[],r="",o=0;for(let f of t)f==="["?o++:f==="]"&&(o=Math.max(0,o-1)),f===":"&&o===0?(s.push(r),r=""):r+=f;s.push(r);let i=s.pop()??"";if(!i)return null;let a=[],l={min:[],max:[],below:[]},c={on:!1};for(let f of s)if(!f||!Kl(f,a,l,c))return null;a.sort((f,m)=>H(f)-H(m));let u=/^[\w-]+$/.test(i)?i:null;return{token:e,state:be(a),context:Jl(l,c.on),utility:i,important:n,stem:u}}function Zr(e){let t=Gr(e.utility);return t?t.map(n=>({property:n.property,value:e.important?`${n.value} !important`:n.value,via:e.token})):[]}function Zl(e){return e.some(t=>Je(t.property)!=="hint")}function $t(e){let t=[];for(let n of e.matchAll(/@apply\s+([^;{}]+)/g))for(let s of Kr(n[1])){let r=Jr(s);if(!r)continue;let o=Zr(r).filter(i=>se(i.property,i.value));o.length!==0&&t.push({state:r.state,context:r.context,declarations:o})}return t}function qr(e){return e==="default"?"":e.split(" + ").map(t=>t==="hover"?":hover":t==="focus"?":focus":t==="active"?":active":t==="disabled"?":disabled":"").join("")}function Pn(e,t,n){let s=t.map(f=>`${f.property}:${f.value}`).join(";");if(!s)return[];let r=ln(e),o=`${r}{${s}}`,i=n.split(" \xB7 ").map(f=>f.trim()).filter(f=>f&&!/^@layer\b/i.test(f));if(i.length===0)return[o];if(i.length!==1||!i[0].startsWith("@media"))return[];let a=i[0],l=[`${a}{${o}}`];if(!a.includes("prefers-color-scheme: dark"))return l;let c=a.replace(/^@media\s+/,"").split(/\s+and\s+/).filter(f=>!f.includes("prefers-color-scheme")).join(" and "),u=`html[data-theme="dark"] ${r}{${s}}`;return l.push(c?`@media ${c}{${u}}`:u),l}function ql(e,t){let n=e.slice(Math.max(0,t-160),t);return/(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:await\s+)?$/.exec(n)?.[1]??null}function Xl(e){if(e.t!=="obj")return{};let t=e.entries.find(s=>s.key==="defaultVariants")?.value;if(!t||t.t!=="obj")return{};let n={};for(let s of t.entries)s.value.t==="str"&&s.value.v?n[s.key]=s.value.v:s.value.t==="bool"&&(n[s.key]=s.value.v?"true":"false");return n}function Yl(e,t,n,s,r){let o=ne(e,t),i={slots:[],defaults:{}};if(!o)return i;let a=vt(o.val)??"",l=G(e,o.end);if(e[l]!==",")return a.trim()?{slots:[_n(a,fe(e,t),r)],defaults:{}}:i;let c=ne(e,l+1);if(!c||c.val.t!=="obj")return a.trim()?{slots:[_n(a,fe(e,t),r)],defaults:{}}:i;let u=c.val.entries.find(h=>h.key==="variants")?.value,f=[],m=new Map;if(a.trim()&&f.push(_n(a,fe(e,t),r)),u&&u.t==="obj"){for(let h of u.entries)if(h.value.t==="obj")for(let w of h.value.entries){let C=vt(w.value);if(!C||!C.trim()||w.key==="false")continue;m.set(`${h.key}\0${w.key}`,C);let $=w.key==="true"?`.${h.key}`:`.${h.key}-${w.key}`,g=Me({selector:$,path:s,base:!1},n.classKeywords);f.push({title:g.title,axis:w.key==="true"?h.key:g.axis??h.key,base:!1,classes:`${a} ${C}`.trim(),line:fe(e,w.at),group:r,prop:h.key,value:w.key})}}return f.push(...Ql(c.val,a,m,n,s,e,r)),{slots:f,defaults:Xl(c.val)}}function Xr(e){if(e.t==="str"&&e.v)return[e.v];if(e.t==="bool")return[e.v?"true":"false"];if(e.t==="arr"){let t=[];for(let n of e.items){let s=Xr(n);if(!s||s.length!==1)return null;t.push(s[0])}return t.length?t:null}return null}function Ql(e,t,n,s,r,o,i){let a=e.entries.find(c=>c.key==="compoundVariants")?.value;if(!a||a.t!=="arr")return[];let l=[];for(let c of a.items){if(c.t!=="obj")continue;let u=[],f="",m=c.at,h=!1;for(let C of c.entries){if(C.key==="class"||C.key==="className"){f=vt(C.value)??"",m=C.at,C.value.t!=="str"&&C.value.t!=="arr"&&f===""&&(h=!0);continue}let $=Xr(C.value);if(!$){h=!0;break}u.push({axis:C.key,values:$})}if(h)continue;let w=[[]];for(let C of u){let $=[];for(let g of w){for(let p of C.values)if($.push([...g,{axis:C.axis,value:p}]),$.length>=8)break;if($.length>=8)break}w=$}for(let C of w){if(C.length<2&&!f.trim())continue;let $=[t],g=[];for(let y of C){let k=n.get(`${y.axis}\0${y.value}`);k&&$.push(k),g.push(y.value==="true"?y.axis:y.value)}f.trim()&&$.push(f);let p=$.join(" ").replace(/\s+/g," ").trim();if(!p)continue;let d=Me({selector:`.${g.join("-")}`,path:r,base:!1},s.classKeywords);l.push({title:d.title,axis:d.axis,base:!1,classes:p,line:fe(o,m),group:i,when:C.map(y=>({prop:y.axis,value:y.value}))})}}return l}function _n(e,t,n){return{title:"Base",axis:null,base:!0,classes:e,line:t,group:n}}function Yr(e,t){return t.elements.includes(e.toLowerCase())?!0:t.identifier.test(e)}function ec(e){let t=e.match(/\bclassName\s*=\s*(?:"([^"]*)"|'([^']*)'|\{\s*"([^"]*)"\s*\}|\{\s*'([^']*)'\s*\})/);return t?.[1]??t?.[2]??t?.[3]??t?.[4]??null}var tc=new Set(["opacity","z-index","font-weight","line-height","flex","flex-grow","flex-shrink","order","zoom"]);function nc(e){return e.replace(/^[A-Z]/,t=>`-${t.toLowerCase()}`).replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function sc(e,t){return t.t==="str"?t.v:t.t==="num"?tc.has(e)?String(t.v):`${t.v}px`:null}function Ct(e,t){if(e.t!=="obj")return[];let n=[],s=[];for(let o of e.entries){if(o.value.t==="obj"){let l=o.key.replace(/^&/,""),c=l===":hover"?"hover":l===":focus"||l===":focus-visible"?"focus":l===":active"?"active":l===":disabled"?"disabled":null;c&&s.push(...Ct(o.value,c));continue}let i=nc(o.key),a=sc(i,o.value);!a||!se(i,a)||n.push({property:i,value:a,via:"style"})}return[...n.length?[{state:t,context:"",declarations:n}]:[],...s]}function En(e,t){if(e[t]!=="`")return null;let n="";for(let s=t+1;s<e.length;s++){let r=e[s];if(r==="\\"){let o=e[s+1];if(o===void 0)return null;n+=o==="n"?`
|
|
51
|
+
`:o,s++;continue}if(r==="$"&&e[s+1]==="{"){let o=1;for(s+=2;s<e.length&&o>0;s++)e[s]==="{"?o++:e[s]==="}"&&o--;s--,n+=" ";continue}if(r==="`")return{css:n,end:s+1};n+=r}return null}function rc(e,t){if(e==="default")return t;if(t==="default")return e;let n=[...new Set([...e.split(" + "),...t.split(" + ")])];return n.sort((s,r)=>H(s)-H(r)||s.localeCompare(r)),be(n)}function jn(e){let t=[];for(let n of ke(`.__gs {
|
|
52
52
|
${e}
|
|
53
|
-
}`)){let s=
|
|
53
|
+
}`)){let s=Q(n.selector),r=s?.[s.length-1];if(!r)continue;let o=ft(r.simples),i=be(o.states),a=pe(n.ownBody).filter(l=>se(l.property,l.value));a.length&&t.push({state:i,context:n.context,declarations:a});for(let l of $t(n.ownBody))t.push({state:rc(i,l.state),context:[n.context,l.context].filter(Boolean).join(" \xB7 "),declarations:l.declarations})}return t}function oc(e){let t=e.match(/\bstyle\s*=\s*"([^"]*)"/);if(t){let i=pe(t[1]).filter(a=>se(a.property,a.value));return i.length?[{state:"default",context:"",declarations:i}]:[]}let n=e.search(/\bstyle\s*=\s*\{/);if(n<0)return[];let s=e.indexOf("{",n),r=G(e,s+1);e[r]==="{"&&(s=r);let o=ne(e,s);return o?Ct(o.val,"default"):[]}function ic(e){let t=ec(e);if(t)return{classes:t,painted:[]};let n=e.search(/\bclassName\s*=\s*\{/);if(n<0)return{classes:"",painted:[]};let s=e.indexOf("{",n),r=G(e,s+1);if(e.startsWith("css",r)&&!/[\w$]/.test(e[r+3]??"")){let i=G(e,r+3);if(e[i]==="`"){let a=En(e,i);return{classes:"",painted:a?jn(a.css):[]}}if(e[i]==="("){let a=ne(e,i+1);return{classes:"",painted:a?Ct(a.val,"default"):[]}}}let o=ne(e,r);return o?{classes:vt(o.val)??"",painted:[]}:{classes:"",painted:[]}}function ac(e,t){if(t.identifier.test(e))return!0;let n=e.replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);return t.classKeywords.some(s=>n.includes(s.toLowerCase()))}function lc(e,t){let n=[],s=/(?:^|[^\w$])styled(?:\.([A-Za-z][\w]*)|\(\s*(?:["']([A-Za-z][\w]*)["']|([A-Za-z][\w]*))\s*\))/g;for(let o of e.matchAll(s)){let i=o[1]??o[2]??o[3]??"";if(!Yr(i,t))continue;let a=G(e,(o.index??0)+o[0].length);e.startsWith(".attrs",a)&&(a=G(e,a+6),e[a]==="("&&(a=In(e,a,"(",")")),a=G(e,a));let l=[];if(e[a]==="`"){let c=En(e,a);c&&(l=jn(c.css))}else if(e[a]==="("){let c=ne(e,a+1);c&&(l=Ct(c.val,"default"))}l.length!==0&&n.push({title:"Styled",axis:null,base:!0,classes:"",line:fe(e,o.index??0),painted:l})}let r=/(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*css\s*`/g;for(let o of e.matchAll(r)){let i=o[1]??"";if(!ac(i,t))continue;let a=e.indexOf("`",o.index??0),l=a<0?null:En(e,a);if(!l)continue;let c=jn(l.css);c.length!==0&&n.push({title:"Css",axis:null,base:!0,classes:"",line:fe(e,o.index??0),painted:c})}return n}function cc(e,t){if(t==="default")return`.${e}`;let n=`.${e}`;for(let s of t.split(" + "))s==="hover"?n+=":hover":s==="focus"?n+=":focus":s==="active"?n+=":active":s==="disabled"&&(n+=":disabled");return n}function uc(e,t,n,s,r){let o=Kr(e.classes).map(Jr).filter(d=>d!==null),i=o.filter(d=>d.stem===null||!s.has(d.stem)),a=(e.painted??[]).filter(d=>d.declarations.length>0);if(i.length===0&&a.length===0)return null;let l=new Map,c=(d,y,k)=>{if(k.length===0)return;let x=`${d}\0${y}`,v=l.get(x)??{state:d,context:y,declarations:[]};v.declarations.push(...k),l.set(x,v)},u=[r];for(let d of o){let y=Zr(d).filter(k=>se(k.property,k.value));c(d.state,d.context,y),d.state==="default"&&d.context===""&&d.stem&&u.push(d.stem)}for(let d of a)c(d.state,d.context,d.declarations);let f=[...l.values()].flatMap(d=>d.declarations);if(!Zl(f))return null;let m=l.get("default\0")?.declarations??[];if(gt(m))return null;let h=[...l.values()].map(d=>({state:d.state,context:d.context,line:e.line,declarations:d.declarations})).sort((d,y)=>d.state!==y.state?d.state==="default"?-1:y.state==="default"?1:H(d.state.split(" + ")[0])-H(y.state.split(" + ")[0])||d.state.localeCompare(y.state):d.context===""?-1:y.context===""?1:d.context.localeCompare(y.context)),w=[...new Set(o.map(d=>d.stem).filter(d=>d!==null))],C=w.length?w.map(d=>`.${d}`).join(""):n.elements[0]??"button",$=h.flatMap(d=>Pn(cc(r,d.state),d.declarations,d.context)),g=n.elements[0]??"button";return{variant:{title:e.title,axis:e.axis,element:{tag:g,classes:u,attrs:{},ancestors:[]},usage:{status:"unknown",files:[],fileCount:0},selector:C,path:t,line:e.line,base:e.base,states:h},rules:$}}function Qr(e,t,n,s,r){let o=Wl(t),i=[],a=[],l=/(?:^|[^\w$])(cva|tv)\s*\(/g;for(let p of o.matchAll(l)){let d=(p.index??0)+Math.max(0,p[0].indexOf(p[1])),y=(p.index??0)+p[0].length,k=a.length,x=Yl(o,y,n,e,k);a.push({name:ql(o,d),defaults:x.defaults}),i.push(...x.slots)}i.push(...lc(o,n));let c=/<([A-Za-z][\w.]*)\b([^>]*?)>/g;for(let p of o.matchAll(c)){let d=p[1];if(!Yr(d,n))continue;let y=p[2]??"",k=ic(y),x=[...k.painted,...oc(y)],v=k.classes.trim();if(!v&&x.length===0)continue;let E=p.index??0,j=fe(o,E);i.push({title:v?"Base":k.painted.length?"Css":"Inline",axis:null,base:!0,classes:v,line:j,painted:x,...v&&x.length===0?{site:{path:e,line:j,offset:E}}:{}})}let u=[],f=[],m=new Map,h=[],w=new Map,C=new Map,$=r;for(let p=0;p<i.length;p++){let d=i[p];if(u.length+f.length>=Ul)break;let y=(d.painted??[]).map(j=>`${j.state}|${j.context}|${j.declarations.map(R=>`${R.property}:${R.value}`).join(";")}`).join("||"),k=`${d.classes.replace(/\s+/g," ").trim()}##${y}`,x=w.get(k);if(x){d.group!==void 0&&C.set(p,x),d.site&&m.get(x)?.sites.push(d.site);continue}$+=1;let v=`__gs-recipe-${$}`,E=uc(d,e,n,s,v);if(E){if(w.set(k,v),d.group!==void 0&&C.set(p,v),d.site){let j={variant:E.variant,sites:[d.site]};m.set(v,j),f.push(j)}else u.push(E.variant);h.push(...E.rules)}}let g=[];for(let p=0;p<a.length;p++){let d=a[p],y={path:e,name:d.name,staticClasses:[],axes:[],compounds:[]},k=new Map;for(let x=0;x<i.length;x++){let v=i[x];if(v.group!==p)continue;let E=C.get(x);if(!E)continue;if(!v.prop&&!v.when){y.staticClasses.push(E);continue}if(v.when){y.compounds.push({when:v.when,classes:[E]});continue}let j=k.get(v.prop)??[];j.push({value:v.value,classes:[E]}),k.set(v.prop,j)}for(let[x,v]of k)y.axes.push({prop:x,values:v,...d.defaults[x]?{defaultValue:d.defaults[x]}:{}});(y.staticClasses.length||y.axes.length||y.compounds.length)&&g.push(y)}return{variants:u,inline:f,previewRules:h,nextId:$,recipes:g}}function eo(e,t){let s=(e.split("/").pop()??"").replace(/(\.module)?\.[^.]+$/i,"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);return t.some(r=>{let o=r.toLowerCase();return s.includes(o)||s.includes(`${o}s`)})}var Ln=6,pc=/"([^"\\\n]{0,400})"|'([^'\\\n]{0,400})'|`([^`\\]{0,400})`/g,fc=/\bclass(?:Name)?\s*=\s*(?:"([^"]*)"|'([^']*)')/g,dc=/\b(?:styles?|classes|css|cls|s)\.([A-Za-z_]\w*)/g,qe=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function gc(e){let t=n=>n.replace(/[^\n]/g," ");return e.replace(/\/\*[\s\S]*?\*\//g,t).replace(/<!--[\s\S]*?-->/g,t).replace(/(^|\s)\/\/[^\n]*/g,(n,s)=>s+t(n.slice(s.length)))}function mc(e,t){let n=gc(t),s=new Map,r=new Map,o=(a,l,c)=>{let u=a.get(l);u?u.push(c):a.set(l,[c])},i=(a,l)=>{for(let c of a.matchAll(/[\w-]+/g))o(s,c[0],l)};for(let a of n.matchAll(pc))i(a[1]??a[2]??a[3]??"",a.index);for(let a of n.matchAll(fc))i(a[1]??a[2]??"",a.index);for(let a of n.matchAll(dc))o(r,a[1],a.index);return{path:e,text:n,original:t,words:s,ids:r}}function to(e,t){let n=1;for(let s=e.indexOf(`
|
|
54
54
|
`);s!==-1&&s<t;)n++,s=e.indexOf(`
|
|
55
|
-
`,s+1);return n}var
|
|
56
|
-
`),s=0,r=[];for(let o=0;o<n.length;o++){let i=n[o];if(t.lastIndex=0,!!t.test(i)&&(s++,r.length<
|
|
55
|
+
`,s+1);return n}var hc=e=>e.replace(/[-_]+(\w)/g,(t,n)=>n.toUpperCase()),bc=/\[\s*([\w-]+)\s*(?:=\s*(?:"([^"]*)"|'([^']*)'|([^\]\s]*)))?\s*\]/g,yc=new Set(["data-component","data-slot","role"]);function xc(e,t){return[...e.slice(ye(e)).matchAll(bc)].map(s=>({name:s[1],value:s[2]??s[3]??s[4]??null})).filter(s=>!yc.has(s.name)&&!(s.value!==null&&t.has(s.value.toLowerCase())))}function kc(e){return[...e.slice(ye(e)).matchAll(/\.((?:\\.|[\w-])+)/g)].map(n=>n[1].replace(/\\(.)/g,"$1"))}function On(e,t,n,s,r=!1,o=[],i=()=>null){let a=null,l=()=>a??=t.map(g=>mc(g,e.get(g)??"")),c=new Map,u=g=>{let p=c.get(g);if(!p){let d=new RegExp(`["'\`]${qe(g)}["'\`]\\s*\\+`);p=l().filter(y=>y.text.includes(`${g}\${`)||d.test(y.text)),c.set(g,p)}return p},f=(g,p,d)=>Ir(bn(g.original,p,d,g.path),g.original,p,g.path,o,i),m=(g,p)=>({files:g.slice(0,Ln).map(({file:d,offset:y,example:k})=>({path:d.path,line:to(d.text,y),...r?{example:k??f(d,y,p)}:{}})),fileCount:g.length}),h=(g,p)=>{let d=[],y=hc(g);for(let k of l()){let x=[...s.has(g)?[]:k.words.get(g)??[],...k.ids.get(y)??k.ids.get(g)??[]],v=x[0];if(v===void 0)continue;let E=v,j;if(r)for(let R of x){let A=f(k,R,p);if(A.kind!=="other"){E=R,j=A;break}}d.push({file:k,offset:E,example:j})}if(d.length)return{status:"used",...m(d,p)};for(let k=g.length-1;k>0;k--){if(g[k]!=="-"&&g[k]!=="_")continue;let x=g.slice(0,k+1),v=g.slice(k+1),E=u(x);if(E.length===0||!v)continue;let j=x.slice(0,-1),R=new RegExp(`\\b${qe(j)}\\s*[=:]\\s*\\{?\\s*["'\`]${qe(v)}["'\`]`),A=[];for(let P of l()){let N=R.exec(P.text);N&&A.push({file:P,offset:N.index})}return A.length?{status:"used",via:`via ${j} prop`,...m(A,p)}:{status:"dynamic",via:`built as ${x}\${\u2026}`,...m(E.map(P=>({file:P,offset:0})),p)}}return{status:"unreferenced",files:[],fileCount:0}},w=(g,p)=>{let d=qe(g.name),y=g.value===null?new RegExp(`\\b${d}\\b`):new RegExp(`\\b${d}\\s*[=:]\\s*\\{?\\s*["'\`]${qe(g.value)}["'\`]`),k=[];for(let E of l()){let j=y.exec(E.text);j&&k.push({file:E,offset:j.index})}if(k.length)return{status:"used",via:`via ${g.name} attribute`,...m(k,p)};let x=new RegExp(`\\b${d}\\s*=\\s*\\{(?!\\s*["'\`])`),v=[];for(let E of l()){let j=x.exec(E.text);j&&v.push({file:E,offset:j.index})}return v.length?{status:"dynamic",via:`${g.name} is set from a variable`,...m(v,p)}:{status:"unreferenced",files:[],fileCount:0}},C=new Map;if(r&&o.length>0)for(let g of l())for(let p of kt(g.path,g.text,o,i))for(let d of p.selects){let y=C.get(d)??[];y.push({file:g,offset:p.offset}),C.set(d,y)}let $={used:0,unknown:0,dynamic:1,unreferenced:2};for(let g of n){let p=kc(g.selector),d=xc(g.selector,s);if(p.length===0&&d.length===0){g.usage={status:"unknown",files:[],fileCount:0};continue}let y=[...p.map(R=>h(R,p)),...d.map(R=>w(R,p))];g.usage=y.reduce((R,A)=>$[A.status]>=$[R.status]?A:R);let k=g.element?.classes.find(R=>R.startsWith("__gs-recipe-")),x=k?C.get(k):void 0;if(!x||x.length===0)continue;let v=new Set(g.usage.files.map(R=>R.path)),E=g.usage.fileCount,j=[...g.usage.files];for(let R of x)v.has(R.file.path)||(v.add(R.file.path),E+=1,!(j.length>=Ln)&&j.push({path:R.file.path,line:to(R.file.text,R.offset),...r?{example:f(R.file,R.offset,[])}:{}}));g.usage={...g.usage,status:g.usage.status==="unknown"?"unknown":"used",files:j,fileCount:E}}}function no(e,t,n){let s=[],r=new Set;for(let o of t)r.has(o.path)||(r.add(o.path),!(s.length>=Ln)&&s.push({path:o.path,line:o.line,...n?{example:bn(e.get(o.path)??"",o.offset,[],o.path)}:{}}));return{status:"used",files:s,fileCount:r.size}}var wc={id:"button",label:"Buttons",identifier:/^[A-Z][A-Za-z0-9]*Button[A-Za-z0-9]*$|^Button[A-Za-z0-9]*$/,elements:["button"],roles:["button"],classKeywords:["btn","button"],excludeClassKeywords:["switch","switcher"],prose:/\bbuttons?\b/i},lo={button:wc},co=12,Nn=200,we=/\.(tsx?|jsx?|mjs|cjs|vue|svelte|astro)$/i,so=/\.(tsx?|jsx?|mjs|cjs|vue|svelte|astro|html?|mdx|erb|php|hbs|njk|liquid|twig|ejs|pug|cshtml|razor|jinja2?|j2)$/i,Xe=/\.(css|scss|sass|less|styl)$/i,ro=/\.(mdx?|markdown|txt|rst|adoc)$/i,oo=/(^|\/)(tokens?|design-tokens?|theme)[^/]*\.json$/i,Z=/(^|\/)(__tests__|tests?|spec|e2e|cypress|playwright)(\/|$)|\.(test|spec)\.[a-z]+$/i,vc=/(^|\/)(plans?|results?|changelogs?|history|archive)(\/|\.|$)|(^|\/)CHANGELOG/i;function $c(e){return St.test(e)&&!/(^|\/)README\.md$/i.test(e)?"instruction":vc.test(e)?"record":"documentation"}var St=/(^|\/)(AGENTS|CLAUDE|CONTRIBUTING|README|GUIDELINES?)\.md$|(^|\/)(eslint|stylelint|\.eslintrc|\.stylelintrc)[^/]*$|(^|\/)\.cursor\/|(^|\/)\.claude\//i;function de(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Cc(e){return(e.split("/").pop()??"").replace(/(\.module)?\.[^.]+$/i,"")}function io(e,t){let n=Cc(e).toLowerCase();return t.some(s=>{let r=s.toLowerCase();return n===r||n===`${r}s`})}function Sc(e,t){let n=1;for(let s=0;s<t;s++)e.charCodeAt(s)===10&&n++;return n}function ge(e,t){let n=e.split(`
|
|
56
|
+
`),s=0,r=[];for(let o=0;o<n.length;o++){let i=n[o];if(t.lastIndex=0,!!t.test(i)&&(s++,r.length<co)){let a=i.trim();r.push({line:o+1,text:a.length>Nn?`${a.slice(0,Nn)}\u2026`:a})}}return{count:s,lines:r}}function uo(e){let t=e.lastIndexOf("/");return t<0?"":e.slice(0,t)}function po(e){let t=[];for(let n of e.split("/"))!n||n==="."||(n===".."?t.pop():t.push(n));return t.join("/")}var Rc=["",".tsx",".ts",".jsx",".js",".mjs",".vue",".svelte",".css",".module.css",".scss","/index.tsx","/index.ts","/index.js"];function ve(e,t,n){let s;if(t.startsWith("."))s=po(`${uo(e)}/${t}`);else if(t.startsWith("@/"))s=t.slice(2);else if(t.startsWith("~/"))s=t.slice(2);else if(t.startsWith("/"))s=t.slice(1);else return null;for(let r of Rc)if(n(s+r))return s+r;return null}var Ac=/import\s+(?:[^'"]*?\s+from\s+)?['"]([^'"]+)['"]|require\(\s*['"]([^'"]+)['"]\s*\)|@import\s+(?:url\()?['"]([^'"]+)['"]/g;function Mn(e){let t=[];for(let n of e.matchAll(Ac)){let s=n[1]??n[2]??n[3];s&&t.push(s)}return t}var _c=/export\s+(?:default\s+)?(?:async\s+)?(?:function|const|let|class|var)\s+([A-Za-z_$][\w$]*)|export\s*\{([^}]*)\}/g;function ao(e){let t=new Set;for(let n of e.matchAll(_c))if(n[1]&&t.add(n[1]),n[2])for(let s of n[2].split(",")){let r=s.trim().split(/\s+as\s+/).pop()?.trim();r&&t.add(r)}return[...t]}var Dn=/var\(\s*(--[\w-]+)/g;function Rt(e){return e.split(" \xB7 ").every(t=>t===""||/^@layer\b/i.test(t))}function fo(e){let t=[];for(let n of e.matchAll(/(?:^|[;{}])\s*composes\s*:\s*([^;]+)/g)){let s=n[1].trim(),r=/^(.*?)\s+from\s+(['"]?)([^'"]+)\2\s*$/.exec(s);r?t.push({names:r[1].split(/\s+/).filter(Boolean),from:r[3]}):t.push({names:s.split(/\s+/).filter(Boolean),from:null})}return t}function Ic(e,t,n){let s=t.startsWith(".")?po(`${uo(e)}/${t}`):t.startsWith("@/")?t.slice(2):t.startsWith("~/")||t.startsWith("/")?t.replace(/^~?\//,""):null;return s&&n(s)?s:ve(e,t.replace(/\.(?:module\.)?(?:css|scss|sass|less)$/i,""),n)}function Ec(e){let t=new Map;for(let[n,s]of e)if(Xe.test(n)){for(let r of ke(s))if(Rt(r.context))for(let o of W(r.selector)){let i=/^\.([\w-]+)$/.exec(o.trim())?.[1];if(!i)continue;let a=`${n}\0${i}`,l=t.get(a)??{decls:[],composes:[]};l.decls.push(...pe(r.ownBody));for(let c of $t(r.ownBody))c.state==="default"&&c.context===""&&l.decls.push(...c.declarations);l.composes.push(...fo(r.ownBody)),t.set(a,l)}}return t}function jc(e,t,n,s){let r=[],o=new Set,i=(l,c,u)=>{if(u>4)return;let f=`${l}\0${c}`;if(o.has(f))return;o.add(f);let m=n.get(f);if(m){for(let h of m.composes)a(l,h,u+1);r.push(...m.decls)}},a=(l,c,u)=>{for(let f of c.names)if(c.from==="global")for(let m of n.keys()){let h=m.indexOf("\0"),w=m.slice(0,h);m.slice(h+1)!==f||/\.module\./i.test(w)||i(w,f,u)}else if(c.from){let m=Ic(l,c.from,s);m&&i(m,f,u)}else i(l,f,u)};for(let l of fo(t))a(e,l,0);return r}function Pc(e,t){let n=qr(t);return n?W(e).map(s=>{let r=Math.max(s.lastIndexOf(" "),s.lastIndexOf(">"),s.lastIndexOf("+"),s.lastIndexOf("~"));return r<0?`${s}${n}`:`${s.slice(0,r+1)}${s.slice(r+1)}${n}`}).join(", "):e}var Lc=/^(?::root|html|body|\*)$/i,Oc=25e4,Mc=/<([A-Za-z][\w.-]*)\b((?:[^<>"'`{}]|"[^"]*"|'[^']*'|`[^`]*`|\{(?:[^{}]|\{[^{}]*\})*\})*)>/g,Nc=/\b(?:styles?|classes|css|cls)\s*(?:\.([A-Za-z_]\w*)|\[\s*["']([\w-]+)["']\s*\])/g,Dc=new Set(["span","svg","i","img","em","strong","small","b","p","kbd","abbr","sup","sub","picture","use","path"]);function Tc(e){let t=new Set,n=new Set;for(let s of e.matchAll(Mc)){let r=s[1],o=Dc.has(r.toLowerCase())&&r===r.toLowerCase()?t:n;for(let i of s[2].matchAll(Nc))o.add(i[1]??i[2])}return{parts:new Set([...t].filter(s=>!n.has(s))),controls:n}}function Fc(e,t){let n=new Map;for(let s of t)if(Xe.test(s)){for(let r of ke(e.get(s)))if(Rt(r.context)&&W(r.selector).some(o=>Lc.test(o)))for(let o of pe(r.ownBody))o.property.startsWith("--")&&!n.has(o.property)&&n.set(o.property,o.value)}return n}function Bc(e,t){let n=new Set,s=[],r=a=>{for(let l of a.matchAll(Dn))n.has(l[1])||(n.add(l[1]),s.push(l[1]))};for(let a of t)r(a);let o=[];for(let a=s.shift();a;a=s.shift()){let l=e.get(a);l===void 0||!se(a,l)||(o.push(`${a}:${l}`),r(l))}return`${o.length?`:root{${o.join(";")}}
|
|
57
57
|
`:""}${t.join(`
|
|
58
|
-
`)}`.slice(0,
|
|
59
|
-
`),
|
|
60
|
-
`))}var Re=e=>oe.join(e.stateDir,"baseline.json"),
|
|
58
|
+
`)}`.slice(0,Oc)}function go(e,t){let n=[...e.keys()].sort(),s=b=>e.has(b),r=new Map,o=(b,S,_,L)=>{let M=`${S}:${b}`,B=r.get(M);if(B){B.note.includes(_)||(B.note+=`; ${_}`);return}r.set(M,{path:b,role:S,note:_,matches:L.count,lines:L.lines})},i=new Set,a=new Set;for(let b of n){if(!we.test(b)||Z.test(b))continue;let S=e.get(b),_=ao(S).filter(O=>t.identifier.test(O)),L=b.split("/").pop()??"",M=new RegExp(t.classKeywords.join("|"),"i").test(L);if(_.length===0&&!M)continue;for(let O of _)i.add(O);a.add(b);let B=_.length?new RegExp(`\\b(?:${_.map(de).join("|")})\\b`,"g"):t.prose;o(b,"implements",_.length?`exports ${_.join(", ")}`:"named for the concept",ge(S,B))}let l=new Set,c=[],u=[],f=new Map,m=b=>io(b,t.classKeywords)||/\.module\.[a-z]+$/i.test(b)&&f.has(b),h=null,w=()=>h??=Ec(e),C=b=>{let S=m(b),_=[],L=0;for(let O of ke(e.get(b))){let U=W(O.selector).filter(D=>Ze(D,t,S));if(U.length===0)continue;L+=1;for(let D of O.ownBody.matchAll(Dn))l.add(D[1]);let z=$t(O.ownBody),ae=[...jc(b,O.ownBody,w(),s),...pe(O.ownBody),...z.filter(D=>D.state==="default"&&D.context==="").flatMap(D=>D.declarations)];for(let D of ae)for(let J of D.value.matchAll(Dn))l.add(J[1]);_.push({block:O,parts:U,declarations:ae,previewContext:Rt(O.context)?"":null,listed:!0});for(let D of z){if(D.state==="default"&&D.context==="")continue;let J=Pc(U.join(", "),D.state),Te=W(J).filter(li=>Ze(li,t,S));if(Te.length===0)continue;let ai=[O.context,D.context].filter(Boolean).join(" \xB7 ");_.push({block:{...O,selector:J,context:ai},parts:Te,declarations:D.declarations,previewContext:Rt(O.context)?D.context:null,listed:!1})}}let M={parts:new Set,controls:new Set};for(let O of f.get(b)??[]){let U=Tc(e.get(O)??"");for(let z of U.parts)M.parts.add(z);for(let z of U.controls)M.controls.add(z)}c.push(...Ur(b,_.map(({block:O,parts:U,declarations:z})=>({selector:U.join(", "),declarations:z,line:O.line,context:O.context})),t,S,M));let B=/\.module\.[a-z]+$/i.test(b)?`${ar(b)} `:"";for(let{parts:O,declarations:U,previewContext:z}of _){if(z===null)continue;let ae=O.flatMap(J=>{let Te=Ze(J,t,S);return Te?[`${B}${Ke(Te.compounds)}`]:[]}),D=U.filter(J=>se(J.property,J.value));if(!(ae.length===0||D.length===0))for(let J of ae)u.push(...Pn(J,D,z))}return{count:L,lines:_.filter(O=>O.listed).slice(0,co).map(({block:O})=>({line:O.line,text:O.selector.replace(/\s+/g," ").slice(0,Nn)}))}},$=new Map;for(let b of a)for(let S of Mn(e.get(b))){let _=ve(b,S,s);if(_&&Xe.test(_)){let L=$.get(_)??[];L.push(b.split("/").pop()??b),$.set(_,L),io(b,t.classKeywords)&&f.set(_,[...f.get(_)??[],b])}}for(let b of n){if(!Xe.test(b))continue;let S=C(b),_=$.get(b);if(S.count===0)continue;let L=[];_&&L.push(`imported by ${_.join(", ")}`),S.count>0&&L.push(`${S.count} matching rule${S.count===1?"":"s"}`),o(b,"styles",L.join("; "),S)}let g=new Set;for(let b of c)for(let S of b.selector.matchAll(/\.((?:\\.|[\w-])+)/g))g.add(S[1].replace(/\\(.)/g,"$1"));let p=new Set(a),d=new RegExp([...t.elements.map(b=>`<${de(b)}\\b`),...t.roles.map(b=>`role=["']${de(b)}["']`)].join("|"));for(let b of n)!we.test(b)||Z.test(b)||d.test(e.get(b)??"")&&p.add(b);for(let b of a)for(let S of Mn(e.get(b))){let _=ve(b,S,s);!_||!we.test(_)||Z.test(_)||eo(_,t.classKeywords)&&p.add(_)}let y=0,k=[],x=[];for(let b of p){let S=Qr(b,e.get(b)??"",t,g,y);y=S.nextId,k.push(...S.recipes),c.push(...S.variants),x.push(...S.inline),u.push(...S.previewRules)}let v=is(x);c.push(...v.variants);let E=Er([...a].map(b=>({path:b,source:e.get(b)??"",names:ao(e.get(b)??"").filter(S=>t.identifier.test(S))})),k,(b,S)=>ve(b,S,s)),j=[];if(l.size>0){let b=new RegExp(`(?:^|[\\s{;])(${[...l].map(de).join("|")})\\s*:`),S=new Map;for(let _ of n){if(!Xe.test(_)&&!oo.test(_))continue;let L=e.get(_),M=ge(L,b);if(M.count!==0){for(let B of L.matchAll(new RegExp(b.source,"gm"))){let O=S.get(B[1])??[];O.includes(_)||O.push(_),S.set(B[1],O)}o(_,"tokens",`defines ${M.count} token${M.count===1?"":"s"} read by ${t.label.toLowerCase()} styles`,M)}}for(let _ of[...l].sort())j.push({name:_,definedIn:S.get(_)??[]})}for(let b of n){if(!oo.test(b))continue;let S=ge(e.get(b),t.prose);S.count>0&&o(b,"tokens","token file mentions the concept",S)}let R=[...i],A=new RegExp([...R.length?[`<(?:${R.map(de).join("|")})\\b`]:[],...t.elements.map(b=>`<${de(b)}\\b`),...t.roles.map(b=>`role=["']${de(b)}["']`)].join("|"));for(let b of n){if(!we.test(b)||a.has(b))continue;let S=e.get(b),_=Z.test(b),L=ge(S,A),M=Mn(S).some(O=>{let U=ve(b,O,s);return U!=null&&a.has(U)});if(L.count===0&&!M)continue;let B=L.count>0?`${L.count} render${L.count===1?"":"s"}`:"imports a button component";o(b,_?"tests":"uses",B,L.count?L:ge(S,t.prose))}for(let b of n){if(!(ro.test(b)||St.test(b)))continue;let _=e.get(b),L=ge(_,t.prose);L.count!==0&&o(b,Z.test(b)?"tests":"describes",St.test(b)?"repo rules / instructions":"documentation",L)}for(let b of n){if(!Z.test(b)||r.has(`tests:${b}`)||!we.test(b))continue;let S=ge(e.get(b),t.prose);S.count>0&&o(b,"tests","mentions the concept",S)}let P=[...r.values()].sort((b,S)=>S.matches-b.matches||b.path.localeCompare(S.path)),N={implements:0,styles:0,tokens:0,uses:0,describes:0,tests:0};for(let b of P)N[b.role]++;let V=Vr(c);On(e,n.filter(b=>so.test(b)&&!Z.test(b)),V,new Set(t.elements),!0,E,(b,S)=>ve(b,S,s)),On(e,n.filter(b=>so.test(b)&&!Z.test(b)),V.flatMap(b=>b.modifiers??[]),new Set(t.elements));for(let[b,S]of v.sites)b.usage=no(e,S,!("alike"in b));let X=Fc(e,n),tt=[];if(i.size>0){let b=new RegExp(t.elements.map(S=>`<${de(S)}\\b`).join("|"),"g");for(let S of n){if(!we.test(S)||Z.test(S)||a.has(S))continue;let _=e.get(S),L=(_.match(b)??[]).length;if(L===0)continue;let M=ge(_,new RegExp(b.source));tt.push({path:S,line:M.lines[0]?.line??1,count:L})}}let ts=[],ns=new Set;for(let b of n){if(!we.test(b)||Z.test(b))continue;let S=e.get(b),_=kt(b,S,E,(L,M)=>ve(L,M,s));for(let L of _)for(let M of L.unknown){let B=[...M.known].sort();if(M.cls!==void 0){if(g.has(M.cls))continue;let z=M.cls.slice(0,M.cls.length-M.value.length),ae=[...g].filter(D=>D.startsWith(z)&&D.length>z.length).map(D=>D.slice(z.length));if(ae.length===0)continue;B=[...new Set([...M.known,...ae])].sort()}if(B.length===0)continue;let O=Sc(S,L.offset),U=`${b}\0${L.component}\0${M.prop}\0${M.value}`;ns.has(U)||(ns.add(U),ts.push({path:b,line:O,component:L.component,prop:M.prop,value:M.value,known:B}))}}let oi=n.filter(b=>(ro.test(b)||St.test(b))&&!Z.test(b)).map(b=>({path:b,kind:$c(b)}));V.sort((b,S)=>Number(S.base)-Number(b.base)||b.path.localeCompare(S.path)||b.line-S.line);let ss=Mr(e,oi,t,V),ii=Lr([...f.entries()].map(([b,S])=>({sheet:b,sources:S.map(_=>e.get(_)??""),rules:ke(e.get(b)??"").map(_=>({selector:_.selector,declarations:pe(_.ownBody)}))})));return{components:R.sort(),tokens:j,findings:P,variants:V,audit:mr({variants:V,tokens:j,tokenValues:X,hasComponent:i.size>0,nativeUses:tt,unknownProps:ts,guidance:ss,noun:t.label.toLowerCase(),element:t.elements[0]??t.id}),guidance:ss,content:ii,previewCss:Bc(X,u),counts:N}}import{execFileSync as Vc}from"node:child_process";import{readdirSync as zc,readFileSync as Wc,statSync as Gc}from"node:fs";import At from"node:path";function $e(e,t){try{return Vc("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"],maxBuffer:64*1024*1024})}catch{return null}}function Tn(e,t=""){let s=$e(e,["rev-parse","--show-toplevel"])?.trim()||e;return{repoDir:s,root:sn(t),stateDir:At.join(s,".gruum")}}function _t(e){let t=At.join(e.repoDir,e.root),n=new Map,s=new TextDecoder("utf-8",{fatal:!1}),r=0,o=0,i=!1,a=(l,c)=>{if(i)return;let u;try{u=zc(l).sort()}catch{return}for(let f of u){let m=c?`${c}/${f}`:f,h=At.join(l,f),w;try{w=Gc(h)}catch{continue}if(w.isDirectory()){tn(m)&&a(h,m);continue}if(!w.isFile())continue;if(!nn(m,w.size)){o++;continue}let C=Wc(h);if(Ks(C)){o++;continue}if(r+C.length>4e7){i=!0;return}r+=C.length,n.set(m,s.decode(C))}};return a(t,""),{files:n,truncated:i,skipped:o}}function mo(e,t){let n=$e(e.repoDir,["diff","--cached","--name-status","-z"]);if(n===null)return t;let s=qs(n).map(({path:r,deleted:o})=>({path:r,content:o?null:$e(e.repoDir,["show",`:${r}`])}));return{...t,files:Zs(t.files,s,e.root)}}function ho(e){let t=$e(e.repoDir,["remote","get-url","origin"])?.trim()??"",n=ct(t)??At.basename(e.repoDir),s=$e(e.repoDir,["rev-parse","HEAD"])?.trim()||"working-tree";return{fullName:n,ref:s,rootPath:e.root,htmlUrl:n.includes("/")?`https://github.com/${n}`:""}}function bo(e){let t=$e(e.repoDir,["config","--get","core.hooksPath"])?.trim();return t||$e(e.repoDir,["rev-parse","--git-path","hooks"])?.trim()||null}function It(e,t={}){let n=lo[t.concept??"button"],s=_t(e);return t.staged&&(s=mo(e,s)),{concept:n.id,label:n.label,...go(s.files,n),repo:ho(e),index:{files:s.files.size,truncated:s.truncated,skipped:s.skipped}}}function Ce(e,t,n={}){let s=It(e,{concept:t.concept,...n});return{result:s,baseline:t,items:gs(s,t)}}import{mkdirSync as Hc,readFileSync as Kc,writeFileSync as yo}from"node:fs";import oe from"node:path";function Se(e){try{return Kc(e,"utf8")}catch{return null}}function Et(e){let t=Se(e);if(t===null)return null;try{return JSON.parse(t)}catch{return null}}function me(e,t){Hc(oe.dirname(e),{recursive:!0}),yo(e,t)}function ie(e,t){me(e,`${JSON.stringify(t,null,2)}
|
|
59
|
+
`),Jc(e)}function Jc(e){let t=e.split(oe.sep),n=t.lastIndexOf(".gruum");if(n<=0)return;let s=oe.join(t.slice(0,n).join(oe.sep),".gitignore"),r=ot(Se(s));r.changed&&(yo(s,r.text),process.stderr.write(`Added .gruum/ to .gitignore.
|
|
60
|
+
`))}var Re=e=>oe.join(e.stateDir,"baseline.json"),xo=e=>oe.join(e.stateDir,"drift.json"),Fn=e=>oe.join(e.stateDir,"exceptions.json"),Zc=e=>oe.join(e.stateDir,"config.json");function he(e,t){return Ue(Et(t?oe.resolve(t):Re(e)))}function jt(e){return bs(Et(xo(e)),new Date().toISOString())}function Bn(e,t){ie(xo(e),t)}function qc(e){if(!e||typeof e!="object")return{};let t={};for(let[n,s]of Object.entries(e))(s==="pending"||s==="accepted"||s==="rejected")&&(t[n]=s);return t}function Pt(e){return qc(Et(Fn(e)))}function Lt(e){let t=Et(Zc(e)),{block:n,hooks:s}=ys(t);return{...typeof t?.root=="string"?{root:t.root}:{},block:n,hooks:s}}import{chmodSync as tu,mkdirSync as nu,readFileSync as Fo,writeFileSync as su}from"node:fs";import{hostname as ru,homedir as ou}from"node:os";import Wn from"node:path";import{createInterface as Bo}from"node:readline/promises";function ko(e){return`/v2/projects/${encodeURIComponent(e)}`}function Un(e,t,n,s){return!(!e||e.repo!==t||!e.workspaceId||!e.host&&s||n&&!n.includes(e.id))}function wo(e,t){if(e.length===0)return null;if(e.length===1)return e[0];let n=t.replace(/^\/+|\/+$/g,""),s=e.filter(r=>r.rootPath===n);if(s.length===1)return s[0];if(!n){let r=e.filter(o=>o.rootPath==="");if(r.length===1)return r[0]}return null}function vo(e){if(typeof e!="string")return{error:"Send a URL."};let t=e.trim();if(!t)return{error:"Enter a live URL."};if(!/^https:\/\//i.test(t))return{error:"URL must start with https://"};let n;try{n=new URL(t)}catch{return{error:"That doesn\u2019t look like a URL."}}if(n.protocol!=="https:")return{error:"URL must start with https://"};if(n.username||n.password)return{error:"That doesn\u2019t look like a URL."};let s=n.hostname.toLowerCase().replace(/^www\./,"");return!s||!s.includes(".")?{error:"That doesn\u2019t look like a URL."}:s==="localhost"||s==="127.0.0.1"?{error:"Public hosts only for Live URL (localhost needs the extension later)."}:{value:s}}var Xc="http://localhost:3000",Yc=/(^|\.)(github\.com|githubusercontent\.com|gitlab\.com|bitbucket\.org|npmjs\.com|npmjs\.org|unpkg\.com|jsdelivr\.net|googleapis\.com|gstatic\.com|google\.com|schema\.org|w3\.org|mozilla\.org|wikipedia\.org|example\.com|example\.org|sentry\.io|vercel\.com|cloudflare\.com|amazonaws\.com)$/i;function $o(e){return`https://${(e.split("/").pop()||e).toLowerCase().replace(/\.git$/,"").replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"")||"example"}.com`}function Co(e){return`
|
|
61
61
|
Live URL for this repo.
|
|
62
|
-
For example: ${
|
|
62
|
+
For example: ${Xc} or ${e}.
|
|
63
63
|
You may not use wildcards.
|
|
64
64
|
|
|
65
|
-
URL: `}function
|
|
65
|
+
URL: `}function So(e){let t=/https:\/\/[^\s"'<>)\]]+/gi;for(let n of e.matchAll(t)){let s;try{s=new URL(n[0])}catch{continue}let r=s.hostname.toLowerCase();if(!(!r.includes(".")||r.includes("*"))&&!(r==="localhost"||r==="127.0.0.1")&&!Yc.test(r))return`https://${r}`}return null}function Qc(e){let t=e.toLowerCase().replace(/:\d+$/,"");return t==="localhost"||t==="127.0.0.1"}function Ro(e){if(typeof e!="string")return{error:"Enter a live URL."};let t=e.trim();if(!t)return{error:"Enter a live URL."};if(t.includes("*"))return{error:"You may not use wildcards."};let n=eu(t);if(n)return n;let s=/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`;return vo(s)}function eu(e){let t=/^https?:\/\//i.test(e)?e:`http://${e}`,n;try{n=new URL(t)}catch{return null}let s=n.hostname.toLowerCase();if(s!=="localhost"&&s!=="127.0.0.1")return null;if(n.username||n.password)return{error:"That doesn\u2019t look like a URL."};let r=n.port;return{value:r&&r!=="80"&&r!=="443"?`${s}:${r}`:s}}function Ao(e){return Qc(e)?`http://${e}`:`https://${e}`}function _o(e,t){let n=e.filter(r=>r.workspaces.length>0);if(n.length===0)return{step:"none"};if(t){let r=n.find(o=>o.id===t);if(!r)return{step:"none"};if(r.workspaces.length===1){let o=r.workspaces[0];return{step:"use",workspaceId:o.id,orgName:r.name,workspaceName:o.name}}return{step:"workspace",orgId:r.id,orgName:r.name,workspaces:r.workspaces}}if(n.reduce((r,o)=>r+o.workspaces.length,0)===1){let r=n[0],o=r.workspaces[0];return{step:"use",workspaceId:o.id,orgName:r.name,workspaceName:o.name}}if(n.length===1){let r=n[0];return{step:"workspace",orgId:r.id,orgName:r.name,workspaces:r.workspaces}}return{step:"org",orgs:n.map(r=>({id:r.id,name:r.name}))}}var Io="No project for this repo found. Creating\u2026";function Eo(e,t){let n=t.workspaceId;if(n)for(let s of e){let r=s.workspaces.find(o=>o.id===n);if(r)return`${s.name} / ${r.name} / ${t.name}`}return t.name}function jo(e){let t=e.length===1?`Use ${e[0]}, or create a new one.`:"This repo is already in more than one project. Use one, or create a new one.",s=[...e,"Create a new one"].map((r,o)=>` ${o+1} ${r}`);return`
|
|
66
66
|
${t}
|
|
67
67
|
${s.join(`
|
|
68
68
|
`)}
|
|
69
69
|
|
|
70
|
-
Which project should this checkout use? `}function
|
|
70
|
+
Which project should this checkout use? `}function Vn(e){return((e.split("/").pop()||e).replace(/\.git$/i,"").replace(/[^a-zA-Z0-9]+/g," ").trim().split(/\s+/).filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(" ")||"New workspace").slice(0,80)}function Po(e,t){let n=t.trim().toLowerCase();if(!n)return null;let s=e.filter(r=>r.name.trim().toLowerCase()===n);return s.length===1?s[0]:null}function Lo(e,t,n){let s=[` C Create ${n}`,...t.map((r,o)=>` ${o+1} ${r.name}`)];return`
|
|
71
71
|
Select a workspace in ${e}, or create one.
|
|
72
72
|
${s.join(`
|
|
73
73
|
`)}
|
|
74
74
|
|
|
75
|
-
Which workspace should this project live in? `}function
|
|
75
|
+
Which workspace should this project live in? `}function Oo(e,t){let n=e.trim().toLowerCase();if(!n)return null;if(n==="c")return"create";let s=Number(n);if(Number.isInteger(s)&&s>=1&&s<=t.length)return s-1;let r=t.flatMap((o,i)=>o.name.trim().toLowerCase()===n?[i]:[]);return r.length===1?r[0]:null}function Mo(e,t,n){let s=t.map((r,o)=>` ${o+1} ${r.name}`);return`
|
|
76
76
|
${e}
|
|
77
77
|
${s.join(`
|
|
78
78
|
`)}
|
|
79
79
|
|
|
80
|
-
Which ${n} should this project live in? `}function
|
|
81
|
-
`,{mode:384}),
|
|
80
|
+
Which ${n} should this project live in? `}function No(e,t){let n=e.trim().toLowerCase();if(!n)return null;let s=Number(n);if(Number.isInteger(s)&&s>=1&&s<=t.length)return s-1;let r=t.flatMap((o,i)=>o.name.trim().toLowerCase()===n?[i]:[]);return r.length===1?r[0]:null}function Do(e){return`/workspace/${encodeURIComponent(e)}`}import{spawnSync as iu}from"node:child_process";var Ne="https://app.getgruum.com",Uo=()=>Wn.join(ou(),".config","gruum","credentials.json");function Gn(){let e=process.env.GRUUM_TOKEN?.trim();if(e)return{token:e,apiOrigin:process.env.GRUUM_API_ORIGIN?.trim()||Ne};try{let t=JSON.parse(Fo(Uo(),"utf8"));return typeof t.token!="string"||!t.token?null:{token:t.token,apiOrigin:typeof t.apiOrigin=="string"&&t.apiOrigin?t.apiOrigin:Ne}}catch{return null}}function au(e){let t=Uo();nu(Wn.dirname(t),{recursive:!0}),su(t,`${JSON.stringify(e,null,2)}
|
|
81
|
+
`,{mode:384}),tu(t,384)}function Ot(e){return(e?.apiOrigin||Ne).replace(/\/$/,"")}async function K(e,t,n={}){let s=new Headers(n.headers);return e&&s.set("Authorization",`Bearer ${e.token}`),n.body&&!s.has("Content-Type")&&s.set("Content-Type","application/json"),fetch(`${Ot(e)}${t}`,{...n,headers:s})}function Hn(e,t){let n=iu("git",t,{cwd:e,encoding:"utf8"});return n.status!==0?null:n.stdout.trim()||null}function lu(e){let t=Hn(e,["remote","get-url","origin"]);return t?ct(t):null}function Mt(e){let t=Hn(e,["rev-parse","--abbrev-ref","HEAD"]);return t&&t!=="HEAD"?t:""}function Vo(e){return Hn(e,["rev-parse","HEAD"])}function zo(e){return Wn.join(e.stateDir,"project.json")}function cu(e){try{let t=JSON.parse(Fo(zo(e),"utf8"));return typeof t.id!="string"||typeof t.repo!="string"||!("host"in t)?null:{id:t.id,name:typeof t.name=="string"?t.name:t.repo,repo:t.repo,rootPath:typeof t.rootPath=="string"?t.rootPath:"",host:typeof t.host=="string"&&t.host?t.host:null,workspaceId:typeof t.workspaceId=="string"&&t.workspaceId?t.workspaceId:null,hostDeclined:t.hostDeclined===!0}}catch{return null}}function Kn(e,t){return`${e}${ko(t)}`}function To(e,t,n,s){let r=Kn(e,t.id),o=s?` in ${s}`:"",i=t.workspaceId?`${e}${Do(t.workspaceId)}
|
|
82
82
|
`:"";process.stderr.write(n?`Created a Gruum project for ${t.repo}${o}.
|
|
83
83
|
${i}${r}
|
|
84
84
|
`:`Gruum project: ${r}
|
|
85
|
-
${i}`)}function
|
|
86
|
-
`)}async function
|
|
87
|
-
`),null;let n=await t.json();return
|
|
88
|
-
`);if(l!=="create"){let h=i.workspaces[l];return{workspaceId:h.id,label:`${i.orgName} / ${h.name}`}}let c=await K(e,"/api/v2/cli/workspaces",{method:"POST",body:JSON.stringify({orgId:i.orgId,name:a})}),
|
|
89
|
-
`);continue}return{workspaceId:f,label:`${i.orgName} / ${m}`}}}function
|
|
90
|
-
`);continue}return r}}finally{s.close()}}async function
|
|
85
|
+
${i}`)}function uu(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!="object")continue;let s=n;if(typeof s.id!="string"||typeof s.name!="string")continue;let r=Array.isArray(s.workspaces)?s.workspaces.flatMap(o=>{if(!o||typeof o!="object")return[];let i=o;return typeof i.id!="string"||typeof i.name!="string"?[]:[{id:i.id,name:i.name}]}):[];t.push({id:s.id,name:s.name,workspaces:r})}return t}async function Wo(e,t,n){let s=Bo({input:process.stdin,output:process.stderr});_e(s);try{for(;;){let r=t(await s.question(e));if(r!=null)return r;process.stderr.write(n)}}finally{s.close()}}async function Go(e,t){return Wo(e,n=>No(n,t),`gruum: enter one of the numbers.
|
|
86
|
+
`)}async function Ho(e){let t=await K(e,"/api/v2/cli/workspaces");if(t.status===401)return process.stderr.write("gruum: sign-in expired. Run `npx @gruum/cli login` again.\n"),null;if(!t.ok)return process.stderr.write(`gruum: couldn't list workspaces (${t.status}).
|
|
87
|
+
`),null;let n=await t.json();return uu(n.orgs)}async function pu(e,t,n,s){let r=s??await Ho(e);if(!r)return null;let o=null;for(;;){let i=_o(r,o);if(i.step==="none")return{workspaceId:"",label:""};if(i.step==="use")return{workspaceId:i.workspaceId,label:`${i.orgName} / ${i.workspaceName}`};if(i.step==="workspace"){let h=Po(i.workspaces,Vn(n));if(h)return{workspaceId:h.id,label:`${i.orgName} / ${h.name}`}}if(!t)return process.stderr.write("gruum: this account has more than one workspace. Run `npx @gruum/cli check` in a terminal and choose where the project should live.\n"),null;if(i.step==="org"){let h=await Go(Mo("This account has more than one organization.",i.orgs,"organization"),i.orgs);o=i.orgs[h].id;continue}let a=Vn(n),l=await Wo(Lo(i.orgName,i.workspaces,a),h=>Oo(h,i.workspaces),`gruum: enter C, or one of the numbers.
|
|
88
|
+
`);if(l!=="create"){let h=i.workspaces[l];return{workspaceId:h.id,label:`${i.orgName} / ${h.name}`}}let c=await K(e,"/api/v2/cli/workspaces",{method:"POST",body:JSON.stringify({orgId:i.orgId,name:a})}),u=await c.json().catch(()=>({})),f=u.workspace?.id,m=typeof u.workspace?.name=="string"?u.workspace.name:a;if(!c.ok||typeof f!="string"){process.stderr.write(`gruum: ${u.error||`couldn't create that workspace (${c.status})`}
|
|
89
|
+
`);continue}return{workspaceId:f,label:`${i.orgName} / ${m}`}}}function fu(e,t){let n=_t(e);for(let s of n.files.values()){let r=So(s);if(r)return r}return $o(t)}async function du(e,t){let n=Co(fu(e,t)),s=Bo({input:process.stdin,output:process.stderr});_e(s);try{for(;;){let r=(await s.question(n)).trim(),o=Ro(r);if("error"in o){process.stderr.write(`gruum: ${o.error}
|
|
90
|
+
`);continue}return r}}finally{s.close()}}async function Ko(){let e=`Cursor on ${ru()}`,t=await K(null,"/api/cli/pair/start",{method:"POST",body:JSON.stringify({label:e})});if(!t.ok)return process.stderr.write(`gruum: couldn't start sign-in (${t.status}). Is Gruum running at ${Ne}?
|
|
91
91
|
`),1;let n=await t.json(),s=`${Ne}/extension/connect?code=${encodeURIComponent(n.userCode)}`;process.stdout.write(`Sign in to Gruum to connect this CLI.
|
|
92
92
|
|
|
93
93
|
Code: ${n.userCode}
|
|
94
94
|
${s}
|
|
95
95
|
|
|
96
96
|
Waiting for confirmation\u2026
|
|
97
|
-
`);let r=Date.now()+600*1e3;for(;Date.now()<r;){await new Promise(a=>setTimeout(a,2e3));let o=await K(null,`/api/cli/pair/poll?pairingId=${encodeURIComponent(n.pairingId)}&verifier=${encodeURIComponent(n.verifier)}`);if(!o.ok)continue;let i=await o.json();if(i.status==="expired")return process.stderr.write("gruum: that code expired. Run `npx @gruum/cli login` again.\n"),1;if(i.status==="connected"&&i.token)return
|
|
98
|
-
`),0}return process.stderr.write("gruum: sign-in timed out. Run `npx @gruum/cli login` again.\n"),1}function
|
|
99
|
-
`),null;let s=!!process.stdin.isTTY,r=
|
|
100
|
-
`)):
|
|
101
|
-
`)
|
|
102
|
-
`),g&&process.stderr.write(
|
|
103
|
-
`),
|
|
104
|
-
|
|
97
|
+
`);let r=Date.now()+600*1e3;for(;Date.now()<r;){await new Promise(a=>setTimeout(a,2e3));let o=await K(null,`/api/cli/pair/poll?pairingId=${encodeURIComponent(n.pairingId)}&verifier=${encodeURIComponent(n.verifier)}`);if(!o.ok)continue;let i=await o.json();if(i.status==="expired")return process.stderr.write("gruum: that code expired. Run `npx @gruum/cli login` again.\n"),1;if(i.status==="connected"&&i.token)return au({token:i.token,apiOrigin:Ne}),process.stdout.write(`Signed in. This CLI can read specs for your projects.
|
|
98
|
+
`),0}return process.stderr.write("gruum: sign-in timed out. Run `npx @gruum/cli login` again.\n"),1}function zn(e){if(!e||typeof e!="object")return null;let t=e;return typeof t.id!="string"||typeof t.repo!="string"?null:{id:t.id,name:typeof t.name=="string"?t.name:t.repo,repo:t.repo,rootPath:typeof t.rootPath=="string"?t.rootPath:"",host:typeof t.host=="string"&&t.host?t.host:null,workspaceId:typeof t.workspaceId=="string"&&t.workspaceId?t.workspaceId:null}}async function Jn(e,t){let n=lu(e.repoDir);if(!n)return process.stderr.write(`gruum: this folder has no GitHub origin, so it can't be matched to a Gruum project.
|
|
99
|
+
`),null;let s=!!process.stdin.isTTY,r=cu(e),o=Ot(t),i=await K(t,`/api/v2/cli/projects?repo=${encodeURIComponent(n)}`);if(i.status===401)return process.stderr.write("gruum: sign-in expired. Run `npx @gruum/cli login` again.\n"),null;if(!i.ok)return Un(r,n,null,s)?r:null;let a=await i.json(),l=Array.isArray(a.projects)?a.projects.map(zn).filter($=>$!==null):[];if(Un(r,n,l.map($=>$.id),s))return r;if(!!r&&r.repo===n&&!!r.workspaceId&&!!(r.host||!s)&&(process.stderr.write(`gruum: the saved project was not found. Do not edit .gruum/project.json.
|
|
100
|
+
`),l.length===0&&!s))return process.stderr.write("gruum: this repo has no project this sign-in can see. Run `npx @gruum/cli check` in a terminal to choose one.\n"),null;let u=!1,f="",m;if(l.length>0&&s){let $=await Ho(t);if(!$)return null;m=$;let g=l.map(y=>Eo($,y)),p=[...g.map(y=>({name:y})),{name:"Create a new one"}],d=await Go(jo(g),p);d===g.length?(l=[],process.stderr.write(`Creating\u2026
|
|
101
|
+
`)):l=[l[d]]}if(l.length===0){m||process.stderr.write(`${Io}
|
|
102
|
+
`);let $=await pu(t,s,n,m);if(!$)return null;let g=await K(t,"/api/v2/cli/projects",{method:"POST",body:JSON.stringify({repo:n,rootPath:e.root,...$.workspaceId?{workspaceId:$.workspaceId}:{}})}),p=await g.json().catch(()=>({}));typeof p.place?.org=="string"&&typeof p.place.workspace=="string"?f=`${p.place.org} / ${p.place.workspace}`:f=$.label;let d=zn(p.project);if(u=p.created!==!1,!g.ok||!d){let y=typeof p.path=="string"?p.path:"";return process.stderr.write(`gruum: ${p.error||`couldn't create a project (${g.status})`}
|
|
103
|
+
`),y&&process.stderr.write(`${o}${y}
|
|
104
|
+
`),null}l=[d]}let h=wo(l,e.root);if(!h){let $=l.map(g=>` ${g.name}${g.rootPath?` #${g.rootPath}`:""}
|
|
105
|
+
${Kn(o,g.id)}`).join(`
|
|
105
106
|
`);return process.stderr.write(`gruum: ${n} matches more than one project. Set "root" in .gruum/config.json to the folder alias, then run \`npx @gruum/cli check\` again.
|
|
106
|
-
${
|
|
107
|
-
`),null}let h
|
|
108
|
-
`);continue}
|
|
109
|
-
`)}else
|
|
110
|
-
`);let C={...
|
|
107
|
+
${$}
|
|
108
|
+
`),null}let w=h.host??null;if(!w&&s)for(To(o,{...h,host:w},u,f);!w;){let $=await du(e,n),g=await K(t,`/api/v2/cli/projects/${encodeURIComponent(h.id)}/url`,{method:"POST",body:JSON.stringify({url:$})}),p=await g.json().catch(()=>({})),d=zn(p.project);if(!g.ok||!d?.host){process.stderr.write(`gruum: ${p.error||`couldn't save that URL (${g.status})`}
|
|
109
|
+
`);continue}w=d.host,process.stderr.write(`Live URL set to ${Ao(w)}.
|
|
110
|
+
`)}else To(o,{...h,host:w},u,f),!w&&!s&&process.stderr.write(`No live URL yet. Add one on that page.
|
|
111
|
+
`);let C={...h,host:w,workspaceId:h.workspaceId??null,hostDeclined:!1};return ie(zo(e),C),C}async function Zn(e,t,n={}){if(!t)return null;let s=Gn();if(!s)return n.announceLocal!==!1&&process.stderr.write("This spec is only on this computer. Sign in with `npx @gruum/cli login` to publish it.\n"),null;try{let r=await Jn(e,s);if(!r)return process.stderr.write(`This spec is only on this computer. It was not published.
|
|
111
112
|
`),null;let o=await K(s,`/api/v2/cli/projects/${encodeURIComponent(r.id)}/baseline`,{method:"POST",body:JSON.stringify({concept:"button",baseline:t})}),i=await o.json().catch(()=>({}));if(o.status===409)return process.stderr.write(`Gruum already has a published spec, so this draft was not published over it.
|
|
112
|
-
`),await
|
|
113
|
+
`),await Ye(e,!1),null;let a=Ue(i.baseline);return!o.ok||!a?(process.stderr.write(`gruum: ${i.error||`couldn't publish that spec (${o.status})`}. It is only on this computer.
|
|
113
114
|
`),null):(ie(Re(e),a),process.stdout.write(`Published it as v${a.version}.
|
|
114
|
-
${
|
|
115
|
-
`),a)}catch(r){if(
|
|
116
|
-
`),null}}async function
|
|
117
|
-
`),"local"}}async function
|
|
115
|
+
${Kn(Ot(s),r.id)}
|
|
116
|
+
`),a)}catch(r){if(Fe(r))throw r;return process.stderr.write(`gruum: couldn't reach Gruum to publish that spec. It is only on this computer.
|
|
117
|
+
`),null}}async function Ye(e,t){if(t)return"local";let n=Gn();if(!n)return"local";try{let s=await Jn(e,n);if(!s)return"local";let r=Mt(e.repoDir),o=await K(n,`/api/v2/cli/projects/${encodeURIComponent(s.id)}/baseline?concept=button&branch=${encodeURIComponent(r)}`);if(o.status===404||!o.ok)return"local";let i=await o.json(),a=Ue(i.baseline);return a?(ie(Re(e),a),ie(Fn(e),i.exceptions??{}),"remote"):"local"}catch(s){if(Fe(s))throw s;return process.stderr.write(`gruum: couldn't reach Gruum. Checking the spec cached in .gruum/baseline.json.
|
|
118
|
+
`),"local"}}async function qn(e){let t=Gn();if(!t)return null;let n=await Jn(e,t);return n?{credentials:t,project:n}:null}async function Jo(e,t,n,s){let r=await qn(e);if(!r)return;let o=Mt(e.repoDir);if(o)try{let i=await K(r.credentials,`/api/v2/cli/projects/${encodeURIComponent(r.project.id)}/drift`,{method:"POST",body:JSON.stringify({action:"observe",concept:"button",branch:o,commit:Vo(e.repoDir),baselineVersion:n,source:s,items:t})});i.ok||process.stderr.write(`gruum: couldn't report this check (${i.status}). The local result still stands.
|
|
118
119
|
`)}catch{process.stderr.write(`gruum: couldn't reach Gruum to report this check. The local result still stands.
|
|
119
|
-
`)}}async function
|
|
120
|
-
${a}`:l}}catch{return{ok:!1,text:"Couldn't reach Gruum to request an exception."}}}async function
|
|
121
|
-
`)}}catch{return{ok:!1,text:"Couldn't reach Gruum to read exception status."}}}var
|
|
120
|
+
`)}}async function Zo(e,t,n){let s=await qn(e);if(!s)return{ok:!1,text:"Sign in with gruum login before requesting an exception."};let r=Mt(e.repoDir);if(!r)return{ok:!1,text:"This folder is not on a named git branch."};try{let o=await K(s.credentials,`/api/v2/cli/projects/${encodeURIComponent(s.project.id)}/drift`,{method:"POST",body:JSON.stringify({action:"request",concept:"button",branch:r,commit:Vo(e.repoDir),reason:n,item:t})}),i=await o.json().catch(()=>({}));if(!o.ok){let c=i.error||`Request failed (${o.status}).`;return{ok:!1,text:o.status===404?`${c} Run \`npx @gruum/cli check\` so this folder points at a project that exists. Do not edit .gruum/project.json.`:c}}let a=i.reviewUrl?`${Ot(s.credentials)}${i.reviewUrl}`:"",l=i.created?`Exception request ${i.id} is pending review.`:`An exception for this change is already pending (${i.id}).`;return{ok:!0,text:a?`${l}
|
|
121
|
+
${a}`:l}}catch{return{ok:!1,text:"Couldn't reach Gruum to request an exception."}}}async function qo(e,t){let n=await qn(e);if(!n)return{ok:!1,text:"Sign in with gruum login to see exception status."};let s=Mt(e.repoDir);try{let r=await K(n.credentials,`/api/v2/cli/projects/${encodeURIComponent(n.project.id)}/drift?concept=button&branch=${encodeURIComponent(s)}`);if(!r.ok)return{ok:!1,text:`Couldn't load exceptions (${r.status}).`};let o=await r.json(),i=Array.isArray(o.requests)?o.requests:[],a=t?i.filter(l=>l.id===t):i;return a.length===0?{ok:!0,text:t?`No exception request ${t} on ${s||"this branch"}.`:`No exception requests on ${s||"this branch"}.`}:{ok:!0,text:a.map(l=>`${l.id} ${l.status} ${l.title} (${l.branch})`).join(`
|
|
122
|
+
`)}}catch{return{ok:!1,text:"Couldn't reach Gruum to read exception status."}}}var Dt="0.1.22",Xo=`gruum ${Dt}: keep buttons on the Gruum spec
|
|
122
123
|
|
|
123
124
|
Run it as \`npx @gruum/cli <command>\`.
|
|
124
125
|
|
|
@@ -126,8 +127,9 @@ Usage:
|
|
|
126
127
|
gruum login
|
|
127
128
|
Sign this computer in. Prints a code to confirm in the browser.
|
|
128
129
|
gruum check [--staged] [--files <path>...] [--json] [--baseline <file>] [--root <dir>] [--ci] [--strict] [--report]
|
|
129
|
-
Scan the working tree and list drift against the spec.
|
|
130
|
-
|
|
130
|
+
Scan the working tree and list drift against the spec. Prints drift
|
|
131
|
+
and exits 0. Exits 1 on unresolved block drift when --ci or --strict
|
|
132
|
+
is set, or when .gruum/config.json has "block": true. --staged checks
|
|
131
133
|
what is staged for commit. When you are signed in, refreshes the
|
|
132
134
|
published spec and this branch's exceptions first. --ci reports the
|
|
133
135
|
run (or set GRUUM_TOKEN) and prints pending exceptions without failing
|
|
@@ -144,39 +146,44 @@ Usage:
|
|
|
144
146
|
pre-commit line. --remove deletes exactly what init added.
|
|
145
147
|
gruum hook <after-file-edit|stop|before-shell>
|
|
146
148
|
Cursor hook entry points (read the event on stdin).
|
|
149
|
+
gruum request <drift id> --reason "<why>"
|
|
150
|
+
Ask a designer to review one drift item from \`gruum check\`. Use this
|
|
151
|
+
when the Cursor tool is not available. Do not edit .gruum files.
|
|
147
152
|
gruum mcp
|
|
148
153
|
Stdio MCP server: gruum_button_spec, gruum_check_buttons,
|
|
149
154
|
gruum_request_exception, and gruum_exception_status.
|
|
150
|
-
`,
|
|
151
|
-
`),n}function Qe(e,t,n){let s={...t,checkedAt:new Date().toISOString(),baselineVersion:n.baseline.version,items:n.items};return
|
|
152
|
-
`)}}finally{n.close()}}function
|
|
153
|
-
`),0}let r=Ce(n,s,{staged:F(e,"--staged")});F(e,"--staged")||Qe(n,jt(n),r);let o=(e.flags.get("--files")??[]).map(
|
|
154
|
-
`):process.stdout.write(`${
|
|
155
|
-
`);let l=ze(i,a),c=
|
|
156
|
-
`)}return
|
|
157
|
-
`),0):1}async function
|
|
158
|
-
`),2;let n=
|
|
155
|
+
`,mu=new Set(["--baseline","--root","--out","--cli","--files","--reason"]);function Qn(e){let t=[],n=new Map;for(let s=0;s<e.length;s++){let r=e[s];if(!r.startsWith("--")){t.push(r);continue}let o=r.indexOf("="),i=o===-1?r:r.slice(0,o),a=o===-1?void 0:r.slice(o+1),l=n.get(i)??[];if(a!==void 0)l.push(a);else if(i==="--files")for(;e[s+1]&&!e[s+1].startsWith("--");)l.push(e[++s]);else mu.has(i)&&e[s+1]!==void 0&&l.push(e[++s]);n.set(i,l)}return{positional:t,flags:n}}var F=(e,t)=>e.flags.has(t),q=(e,t)=>e.flags.get(t)?.[0];function Ae(e,t=process.cwd()){let n=Tn(t),s=q(e,"--root")??Lt(n).root??"";return Tn(t,s)}var et="No spec found. Publish one from Gruum, or draft one locally with `npx @gruum/cli baseline --write`.";function hu(e,t){let n=he(e,q(t,"--baseline"));return n||process.stderr.write(`gruum: ${et}
|
|
156
|
+
`),n}function Qe(e,t,n){let s={...t,checkedAt:new Date().toISOString(),baselineVersion:n.baseline.version,items:n.items};return Bn(e,s),s}async function es(e,t){let n=Yn({input:process.stdin,output:process.stdout});_e(n);try{for(;;){let s=await new Promise(o=>{n.question(e,o)}),r=t(s);if(r)return r;process.stdout.write(`Enter one of the letters in the question.
|
|
157
|
+
`)}}finally{n.close()}}function Yo(e){return!!process.stdin.isTTY&&!F(e,"--ci")&&!F(e,"--json")&&!F(e,"--staged")}async function ei(e){if(!process.stdin.isTTY||!De(T.join(e.repoDir,".cursor")))return;let t=Se(T.join(e.repoDir,".cursor/hooks.json")),n=Se(T.join(e.repoDir,".cursor/mcp.json"));if(!Ss(t,n))return;let s=De(T.join(e.repoDir,".claude"));await es(Bs(s),Us)==="yes"&&si(Qn(["init","cursor"]))}async function ti(e,t=!1){let n=Ae(e);await Ye(n,F(e,"--baseline"));let s=he(n,q(e,"--baseline"));if(s?.version===0&&!t&&!F(e,"--baseline")){let f=await Zn(n,s,{announceLocal:!1});f&&(s=f)}if(!s){if(!t&&Yo(e)){if(await es(Fs,zs)!=="baseline")return 0;let m=["baseline","--write"],h=q(e,"--root");h&&m.push("--root",h);let w=await ni(Qn(m),!1);return w!==0?w:ti(e,!0)}return process.stderr.write(`gruum: ${et}
|
|
158
|
+
`),0}let r=Ce(n,s,{staged:F(e,"--staged")});F(e,"--staged")||Qe(n,jt(n),r);let o=(e.flags.get("--files")??[]).map(f=>T.relative(T.join(n.repoDir,n.root),T.resolve(f)).split(T.sep).join("/")),i=Gt(r.items,o),a=Pt(n);(F(e,"--ci")||F(e,"--report"))&&await Jo(n,i,s.version,F(e,"--ci")?"ci":"local"),F(e,"--json")?process.stdout.write(`${JSON.stringify({baselineVersion:s.version,items:i,exceptions:a},null,2)}
|
|
159
|
+
`):process.stdout.write(`${ms(i,{baselineVersion:s.version,files:r.result.index.files,skipped:r.result.index.skipped},a)}
|
|
160
|
+
`);let l=ze(i,a),c=F(e,"--ci")||F(e,"--strict")||Lt(n).block,u=0;if(c&&F(e,"--strict")){let f=i.some(m=>m.severity==="block"&&a[m.id]==="pending");u=l.length>0||f?1:0}else c&&(u=l.length>0?1:0);if(F(e,"--ci")&&l.length===0){let f=i.filter(m=>a[m.id]==="pending");f.length>0&&process.stdout.write(`${f.length} pending exception${f.length===1?"":"s"}; this run does not fail on them.
|
|
161
|
+
`)}return Yo(e)&&await ei(n),u}async function bu(e){let t=Ae(e);await Ye(t,F(e,"--baseline"));let n=hu(t,e);return n?(process.stdout.write(`${JSON.stringify(Wt(n),null,2)}
|
|
162
|
+
`),0):1}async function ni(e,t=!0){if(!F(e,"--write"))return process.stderr.write(`gruum: pass --write to draft a spec from the working tree.
|
|
163
|
+
`),2;let n=Ae(e),s=It(n),r=ds(s,{version:0}),o=q(e,"--out")?T.resolve(q(e,"--out")):Re(n);ie(o,r);let i=T.relative(process.cwd(),o)||o;process.stdout.write(`Drafted a spec from ${s.index.files} files: ${r.styles.length} styles, ${r.tokens.length} tokens, ${r.rules.length} rules, ${r.acceptedFindings.length} accepted findings.
|
|
159
164
|
Wrote ${i}.
|
|
160
|
-
`);let a=await
|
|
161
|
-
`),!1;if(!n.changed)return s.push(`unchanged ${t}`),!0;let r=T.join(e.repoDir,t);return n.text===""?(
|
|
162
|
-
`),2;let t=
|
|
163
|
-
`),1;
|
|
164
|
-
${
|
|
165
|
+
`);let a=await Zn(n,r);return a&&o!==Re(n)&&ie(o,a),a&&t&&await ei(n),0}function Qo(e,t,n,s){if(!n.ok)return process.stderr.write(`gruum: ${n.error}
|
|
166
|
+
`),!1;if(!n.changed)return s.push(`unchanged ${t}`),!0;let r=T.join(e.repoDir,t);return n.text===""?(Xn(r,{force:!0}),s.push(`removed ${t}`)):(me(r,n.text),s.push(`wrote ${t}`)),!0}function si(e){if(e.positional[1]!=="cursor")return process.stderr.write(`gruum: usage: gruum init cursor [--remove] [--force] [--cli "<command>"]
|
|
167
|
+
`),2;let t=Ae(e),n=q(e,"--cli"),s=n??We,r=n??Cs,o=n??qt,i=F(e,"--remove"),a=d=>Se(T.join(t.repoDir,d)),l=[],c=i?Rs(a(".cursor/hooks.json")):Xt(a(".cursor/hooks.json"),s),u=i?As(a(".cursor/mcp.json")):Yt(a(".cursor/mcp.json"),o);for(let d of[c,u])if(!d.ok)return process.stderr.write(`gruum: ${d.error}
|
|
168
|
+
`),1;Qo(t,".cursor/hooks.json",c,l),Qo(t,".cursor/mcp.json",u,l);let f=a(Y);if(i)f!==null&&en(f)&&(Xn(T.join(t.repoDir,Y)),l.push(`removed ${Y}`));else if(f===null||F(e,"--force")){let d=he(t,q(e,"--baseline")),y=Es(d?null:yu(t)),k=d?[...new Set(d.styles.map(x=>x.path))].sort():[];me(T.join(t.repoDir,Y),Qt(k.length?k:y)),l.push(`wrote ${Y}`)}else if(en(f)){let d=js(f);d.changed?(me(T.join(t.repoDir,Y),d.text),l.push(`wrote ${Y}`)):l.push(`unchanged ${Y}`)}else l.push(`kept ${Y} (exists; --force replaces it)`);let m=i?Ps(a(".gitignore")):ot(a(".gitignore"));m.changed&&(me(T.join(t.repoDir,".gitignore"),m.text),l.push("wrote .gitignore"));let h=De(T.join(t.repoDir,".husky")),w=["lefthook.yml","lefthook.yaml",".lefthook.yml"].some(d=>De(T.join(t.repoDir,d))),C=bo(t),$=h?".husky/pre-commit":C?`${C}/pre-commit`:null,g=$?T.resolve(t.repoDir,$):null,p=g?Se(g):null;if(i){if(g&&p!==null){let d=Ms(p);d.changed&&d.text===""?(Xn(g,{force:!0}),l.push(`removed ${$}`)):d.changed&&(me(g,d.text),l.push(`edited ${$}`))}}else{let d=Ls({husky:h,lefthook:w,hookText:p,gitHooksDir:C},r);if(d.kind==="print")l.push(`pre-commit ${d.reason}:
|
|
169
|
+
${d.snippet}`);else if(d.changed&&g){if(me(g,d.text),d.kind==="git")try{gu(g,493)}catch{}l.push(`wrote ${$}${d.kind==="git"?" (local only; not shared through git)":""}`)}else l.push(`unchanged ${$}`)}return process.stdout.write(`${l.join(`
|
|
165
170
|
`)}
|
|
166
|
-
`),
|
|
171
|
+
`),i||process.stdout.write(`
|
|
167
172
|
Commit the .cursor/ files so teammates get the same guardrails. Tokens never go in the repository.
|
|
168
|
-
`),0}function
|
|
169
|
-
`),2;process.stdout.write(`${JSON.stringify(
|
|
173
|
+
`),0}function yu(e){try{return It(e)}catch{return null}}async function xu(){if(process.stdin.isTTY)return{};let e=[];for await(let t of process.stdin)e.push(t);try{let t=JSON.parse(Buffer.concat(e).toString("utf8")||"{}");return t&&typeof t=="object"?t:{}}catch{return{}}}function ku(e){let t=e.workspace_roots,n=Array.isArray(t)&&typeof t[0]=="string"&&De(t[0])?t[0]:typeof e.cwd=="string"&&De(e.cwd)?e.cwd:process.cwd();return Ae({positional:[],flags:new Map},n)}async function wu(e){let t=e.positional[1],n=await xu(),s=t==="before-shell"?{permission:"allow"}:{};try{let r=ku(n),o=Lt(r),i={...o.hooks,exceptions:!0},a=he(r),l=jt(r),c=Pt(r),u=s;if(t==="after-file-edit"){let f=typeof n.file_path=="string"?n.file_path:"",m=rn(T.relative(r.repoDir,T.resolve(r.repoDir,f)).split(T.sep).join("/"),r.root);a&&m!==null&&Js(m)&&Qe(r,l,Ce(r,a))}else if(t==="stop"){if(a){let f=Qe(r,l,Ce(r,a)),m=ws(f,n,i,c);Bn(r,m.ledger),u=m.output}}else if(t==="before-shell"){let f=typeof n.command=="string"?n.command:"",m=Jt(f).some(h=>o.hooks.denyGit.includes(h));if(a&&m){let h=Qe(r,l,Ce(r,a));u=vs(h,n,i,c)}}else return process.stderr.write(`gruum: unknown hook ${String(t)}
|
|
174
|
+
`),2;process.stdout.write(`${JSON.stringify(u)}
|
|
170
175
|
`)}catch(r){process.stderr.write(`gruum hook ${t}: ${r instanceof Error?r.message:String(r)}
|
|
171
176
|
`),process.stdout.write(`${JSON.stringify(s)}
|
|
172
|
-
`)}return 0}async function
|
|
173
|
-
`);
|
|
174
|
-
`)}return 0}async
|
|
175
|
-
|
|
177
|
+
`)}return 0}async function ri(e,t,n){await Ye(e,!1);let s=he(e);if(!s)return{ok:!1,text:et};let o=Ce(e,s).items.find(i=>i.id===t);return o?Zo(e,o,n):{ok:!1,text:`No drift item ${t}. Run gruum_check_buttons or \`npx @gruum/cli check\` and use an id from that list. Do not edit .gruum files.`}}async function vu(e){let t=e.positional[1]??"",n=q(e,"--reason")?.trim()??"";if(!t||!n)return process.stderr.write(`Usage: npx @gruum/cli request <drift id> --reason "why this button should stay"
|
|
178
|
+
`),2;let s=await ri(Ae(e),t,n);return(s.ok?process.stdout:process.stderr).write(`${s.text}
|
|
179
|
+
`),s.ok?0:1}async function $u(e){let t=Ae(e),n=Gs({spec:async()=>{let o=he(t,q(e,"--baseline"));return o?{text:JSON.stringify(Wt(o),null,2)}:{text:et,isError:!0}},check:async o=>{let i=he(t,q(e,"--baseline"));if(!i)return{text:et,isError:!0};let a=Ce(t,i);Qe(t,jt(t),a);let l=Gt(a.items,o);return{text:JSON.stringify({baselineVersion:i.version,blocking:ze(l,Pt(t)).length,items:l},null,2)}},request:async(o,i)=>{let a=await ri(t,o,i);return{text:a.text,isError:!a.ok}},status:async o=>{let i=await qo(t,o);return{text:i.text,isError:!i.ok}}}),s={name:"gruum",version:Dt},r=Yn({input:process.stdin,crlfDelay:1/0});for await(let o of r){if(!o.trim())continue;let i;try{i=JSON.parse(o)}catch{process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:null,error:{code:-32700,message:"Parse error"}})}
|
|
180
|
+
`);continue}let a=await Hs(i,n,s);a&&process.stdout.write(`${JSON.stringify(a)}
|
|
181
|
+
`)}return 0}async function Cu(){if(process.stdout.write(Ns(Dt)),!process.stdin.isTTY)return process.stdout.write(`
|
|
182
|
+
${Ie.map(n=>n.usage).join(`
|
|
176
183
|
`)}
|
|
177
|
-
`),0;let e=
|
|
178
|
-
`)}}finally{e.close()}return!t||t==="quit"?0:
|
|
179
|
-
`),0;if(F(t,"--help")||n==="help")return process.stdout.write(
|
|
184
|
+
`),0;let e=Yn({input:process.stdin,output:process.stdout});_e(e);let t=null;try{for(;;){let n=await new Promise(s=>{e.question(Ds,s)});if(t=Ws(n),t==="quit"||t)break;process.stdout.write(`Enter 1, 2, or 3.
|
|
185
|
+
`)}}finally{e.close()}return!t||t==="quit"?0:Nt([t.name,...t.args])}async function Nt(e){let t=Qn(e),n=t.positional[0];if(F(t,"--version"))return process.stdout.write(`${Dt}
|
|
186
|
+
`),0;if(F(t,"--help")||n==="help")return process.stdout.write(Xo),0;switch(n){case"login":{let s=await Ko();if(s!==0||!process.stdin.isTTY)return s;let r=await es(Ts,Vs);return r==="check"?Nt(["check"]):r==="baseline"?Nt(["baseline","--write"]):0}case"check":return ti(t);case"request":return vu(t);case"spec":return bu(t);case"baseline":return ni(t);case"init":return si(t);case"hook":return wu(t);case"mcp":return $u(t);case void 0:return Cu();default:return process.stderr.write(`gruum: unknown command ${n}
|
|
180
187
|
|
|
181
|
-
${
|
|
188
|
+
${Xo}`),2}}Nt(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{Fe(e)&&process.exit(130),process.stderr.write(`gruum: ${e instanceof Error?e.message:String(e)}
|
|
182
189
|
`),process.exitCode=1});
|