@firebuzz/design-mode 0.1.5 → 0.2.1
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/dist/index.d.mts +10 -17
- package/dist/index.d.ts +10 -17
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/overlay.js +3 -3
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.mjs +3 -3
- package/dist/overlay.mjs.map +1 -1
- package/package.json +59 -61
- package/LICENSE +0 -77
package/dist/overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tailwind-generator.ts","../src/overlay.ts"],"names":["TailwindCSSGenerator","config","existing","className","testDiv","computed","hasStyles","defaultColor","defaultFontSize","prop","side","propName","expectedDisplay","classNames","classes","css","responsiveMatch","breakpoint","baseClass","baseCss","minWidth","stateMatch","state","darkMatch","style","property","colors","prefix","parts","colorValue","colorName","shade","type","spacing","match","direction","value","spacingValue","properties","dirMap","sizeValue","fontSize","size","fontSizeValue","fSize","lineHeight","fontWeight","weight","weightValue","borderRadius","radiusValue","borderWidth","dirMatch","widthMatch","gapValue","spaceValue","lineHeightValue","letterSpacing","letterSpacingValue","numCols","numRows","numValue","shadows","shadowValue","generator","getTailwindGenerator","DesignModeOverlay","border","zIndex","overlay","label","children","child","index","data","allElements","el","source","element","elementWithFiber","fiberKey","key","fiber","firstSource","node","selectableElements","topElement","parent","i","now","timeSinceLastClick","distanceMoved","target","rect","tagName","relevantProps","styles","directTextNodes","directText","elementsState","actualElement","imgChild","textContent","message","sourceFile","sourceLine","sourceColumn","updates","textNode","theme","styleEl","configResponse","error"],"mappings":"aAYO,IAAMA,CAAAA,CAAN,KAA2B,CACzB,MAAA,CACA,eAAA,CAAkB,IAAI,GAAA,CACtB,YAAA,CAAwC,IAAA,CAEhD,WAAA,CAAYC,CAAAA,CAAyB,CAEhCA,EACH,IAAA,CAAK,MAAA,CAASA,CAAAA,CAGd,IAAA,CAAK,MAAA,CAAU,MAAA,CAAe,8BAAgC,EAAC,CAEhE,IAAA,CAAK,gBAAA,EAAiB,CACtB,OAAA,CAAQ,IAAI,+CAAA,CAAiD,CAC5D,MAAA,CAAQ,MAAA,CAAO,IAAA,CAAM,IAAA,CAAK,OAAO,KAAA,EAAO,MAAA,EAAkC,EAAE,CAAA,CAAE,MAAA,CAC9E,QAAS,MAAA,CAAO,IAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,OAAA,EAAmC,EAAE,CAAA,CAAE,MACjF,CAAC,EACF,CAKQ,kBAAmB,CAE1B,IAAMC,CAAAA,CAAW,QAAA,CAAS,cAAA,CAAe,qBAAqB,EAC9D,GAAIA,CAAAA,CAAU,CACb,OAAA,CAAQ,IAAA,CAAK,+DAA+D,EAC5E,IAAA,CAAK,YAAA,CAAeA,CAAAA,CACpB,MACD,CAEA,IAAA,CAAK,aAAe,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAClD,IAAA,CAAK,YAAA,CAAa,GAAK,qBAAA,CACvB,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,aAAA,CAAe,sBAAsB,EACpE,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA,CAC3C,QAAQ,GAAA,CAAI,wDAAwD,EACrE,CAMQ,uBAAA,CAAwBC,CAAAA,CAA4B,CAC3D,GAAI,CAEH,IAAMC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC5CA,CAAAA,CAAQ,SAAA,CAAYD,CAAAA,CACpBC,CAAAA,CAAQ,KAAA,CAAM,QAAU,+DAAA,CACxB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYA,CAAO,CAAA,CAGjC,IAAMC,CAAAA,CAAW,MAAA,CAAO,gBAAA,CAAiBD,CAAO,CAAA,CAG5CE,CAAAA,CAAY,GAGhB,GAAIH,CAAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAKE,CAAAA,CAAS,kBAAoB,kBAAA,CAC/DC,CAAAA,CAAY,CAAA,CAAA,CAAA,KAAA,GAGJH,CAAAA,CAAU,UAAA,CAAW,OAAO,GAAK,CAACA,CAAAA,CAAU,KAAA,CAAM,2DAA2D,CAAA,CAAG,CACxH,IAAMI,CAAAA,CAAe,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA,CAAE,MACxDF,CAAAA,CAAS,KAAA,GAAUE,CAAAA,EAAgBF,CAAAA,CAAS,KAAA,GAAU,cAAA,GACzDC,EAAY,CAAA,CAAA,EAEd,CAAA,KAAA,GAESH,CAAAA,CAAU,KAAA,CAAM,2DAA2D,CAAA,CAAG,CAEtF,IAAMK,CAAAA,CAAkB,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,IAAI,EAAE,QAAA,CAC3DH,CAAAA,CAAS,QAAA,GAAaG,CAAAA,GACzBF,CAAAA,CAAY,CAAA,CAAA,EAEd,SAESH,CAAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA,CAAG,CAC5C,IAAMM,EAAON,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,SAAA,CAAY,QAAA,CAC1CO,EAAOP,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,KAAA,CAAQA,CAAAA,CAAU,CAAC,CAAA,CAAE,WAAA,EAAY,CAC/DQ,CAAAA,CAAW,CAAA,EAAGF,CAAI,GAAGC,CAAAA,GAAS,GAAA,CAAM,KAAA,CAAQA,CAAI,CAAA,CAAA,CAClDL,CAAAA,CAASM,CAAQ,CAAA,EAAKN,CAAAA,CAASM,CAAQ,CAAA,GAAM,KAAA,GAChDL,CAAAA,CAAY,IAEd,CAAA,KAAA,GAESH,CAAAA,CAAU,UAAA,CAAW,MAAM,CAAA,CAAA,CAE/BE,CAAAA,CAAS,MAAQ,QAAA,EAAYA,CAAAA,CAAS,GAAA,GAAQ,KAAA,EAC9CA,CAAAA,CAAS,SAAA,GAAc,UAAYA,CAAAA,CAAS,SAAA,GAAc,KAAA,EAC1DA,CAAAA,CAAS,MAAA,GAAW,QAAA,EAAYA,EAAS,MAAA,GAAW,KAAA,IACvDC,CAAAA,CAAY,CAAA,CAAA,CAAA,CAAA,KAAA,GAILH,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CAGrCG,CAAAA,CAAY,CAAA,CAAA,CAAA,KAAA,GAGJH,CAAAA,CAAU,KAAA,CAAM,QAAQ,EAAG,CACnC,IAAMM,CAAAA,CAAON,CAAAA,CAAU,CAAC,CAAA,GAAM,IAAM,OAAA,CAAU,QAAA,CAC1CE,CAAAA,CAASI,CAAI,CAAA,GAAM,MAAA,EAAUJ,EAASI,CAAI,CAAA,GAAM,KAAA,GACnDH,CAAAA,CAAY,CAAA,CAAA,EAEd,CAAA,KAAA,GAES,CAAC,MAAA,CAAQ,aAAA,CAAe,MAAA,CAAQ,aAAA,CAAe,OAAA,CAAS,cAAA,CAAgB,QAAQ,CAAA,CAAE,QAAA,CAASH,CAAS,CAAA,CAAG,CAC/G,IAAMS,EAAkBT,CAAAA,GAAc,QAAA,CAAW,MAAA,CAASA,CAAAA,CAAU,OAAA,CAAQ,SAAA,CAAW,SAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CAAA,CAC7GE,CAAAA,CAAS,UAAYO,CAAAA,EACpBT,CAAAA,GAAc,MAAA,EAAUE,CAAAA,CAAS,OAAA,GAAY,MAAA,EAC7CF,IAAc,MAAA,EAAUE,CAAAA,CAAS,OAAA,GAAY,MAAA,EAC7CF,CAAAA,GAAc,OAAA,EAAWE,EAAS,OAAA,GAAY,OAAA,IAClDC,CAAAA,CAAY,CAAA,CAAA,EAEd,CAAA,KAES,CAAC,eAAgB,aAAA,CAAe,WAAA,CAAa,gBAAA,CAAkB,iBAAA,CAAmB,gBAAA,CAAkB,UAAA,CAAY,UAAU,CAAA,CAAE,QAAA,CAASH,CAAS,CAAA,GAElJA,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,EAAKE,CAAAA,CAAS,UAAA,GAAe,QAAA,EAEnDF,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,EAAKE,CAAAA,CAAS,cAAA,GAAmB,QAAA,EAEhEF,CAAAA,CAAU,UAAA,CAAW,OAAO,CAAA,EAAKE,CAAAA,CAAS,aAAA,GAAkB,KAAA,CAAA,GACtEC,CAAAA,CAAY,CAAA,CAAA,CAAA,CAId,gBAAS,IAAA,CAAK,WAAA,CAAYF,CAAO,CAAA,CAC1BE,CACR,CAAA,KAAY,CAEX,OAAO,MACR,CACD,CAMO,eAAA,CAAgBO,CAAAA,CAA0B,CAChD,IAAMC,CAAAA,CAAUD,CAAAA,CAAW,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA,CAEtD,IAAA,IAAWV,CAAAA,IAAaW,CAAAA,CAAS,CAEhC,GAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAIX,CAAS,CAAA,CACrC,SAID,GAAI,IAAA,CAAK,uBAAA,CAAwBA,CAAS,CAAA,CAAG,CAC5C,OAAA,CAAQ,IAAI,CAAA,8BAAA,EAAiCA,CAAS,CAAA,wBAAA,CAA0B,CAAA,CAChF,QACD,CAGA,IAAMY,CAAAA,CAAM,IAAA,CAAK,mBAAA,CAAoBZ,CAAS,CAAA,CAC1CY,CAAAA,GACH,KAAK,SAAA,CAAUA,CAAG,CAAA,CAClB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAIZ,CAAS,CAAA,CAClC,OAAA,CAAQ,GAAA,CAAI,CAAA,kDAAA,EAAqDA,CAAS,CAAA,CAAE,CAAA,EAE9E,CACD,CAKQ,mBAAA,CAAoBA,CAAAA,CAAkC,CAE7D,IAAMa,CAAAA,CAAkBb,EAAU,KAAA,CAAM,0BAA0B,CAAA,CAClE,GAAIa,CAAAA,CAAiB,CACpB,GAAM,EAAGC,CAAAA,CAAYC,CAAS,CAAA,CAAIF,CAAAA,CAC5BG,EAAU,IAAA,CAAK,eAAA,CAAgBD,CAAS,CAAA,CAC9C,GAAI,CAACC,EAAS,OAAO,IAAA,CAGrB,IAAMC,CAAAA,CAAAA,CADW,IAAA,CAAK,MAAA,CAAO,OAAO,OAAA,EAAsC,EAAC,EAClDH,CAAU,CAAA,CACnC,OAAKG,EAEE,CAAA,mBAAA,EAAsBA,CAAQ,CAAA,IAAA,EAAOD,CAAO,CAAA,EAAA,CAAA,CAF7B,IAGvB,CAGA,IAAME,CAAAA,CAAalB,CAAAA,CAAU,KAAA,CAAM,yEAAyE,CAAA,CAC5G,GAAIkB,CAAAA,CAAY,CACf,GAAM,EAAGC,CAAAA,CAAOJ,CAAS,CAAA,CAAIG,CAAAA,CACvBF,CAAAA,CAAU,IAAA,CAAK,eAAA,CAAgBD,CAAS,EAC9C,OAAKC,CAAAA,CAEEA,CAAAA,CAAQ,OAAA,CAAQ,aAAA,CAAe,CAAA,CAAA,EAAIhB,EAAU,OAAA,CAAQ,IAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAImB,CAAK,EAAE,CAAA,CAF9D,IAGtB,CAGA,IAAMC,CAAAA,CAAYpB,CAAAA,CAAU,MAAM,aAAa,CAAA,CAC/C,GAAIoB,CAAAA,CAAW,CACd,GAAM,EAAGL,CAAS,CAAA,CAAIK,CAAAA,CAChBJ,CAAAA,CAAU,IAAA,CAAK,gBAAgBD,CAAS,CAAA,CAC9C,OAAKC,CAAAA,CAEE,CAAA,MAAA,EAASA,CAAO,GAFF,IAGtB,CAEA,OAAO,IAAA,CAAK,eAAA,CAAgBhB,CAAS,CACtC,CAKQ,eAAA,CAAgBA,CAAAA,CAAkC,CAEzD,GAAIA,CAAAA,CAAU,WAAW,KAAK,CAAA,CAC7B,OAAO,IAAA,CAAK,gBAAA,CAAiBA,CAAAA,CAAW,kBAAkB,CAAA,CAI3D,GAAIA,CAAAA,CAAU,UAAA,CAAW,OAAO,CAAA,CAE/B,OAAIA,CAAAA,CAAU,KAAA,CAAM,2DAA2D,CAAA,CACvE,IAAA,CAAK,mBAAA,CAAoBA,CAAS,CAAA,CAEnC,IAAA,CAAK,gBAAA,CAAiBA,CAAAA,CAAW,OAAO,CAAA,CAIhD,GAAIA,CAAAA,CAAU,UAAA,CAAW,SAAS,CAAA,CAAG,CAEpC,GAAIA,EAAU,KAAA,CAAM,4BAA4B,CAAA,CAC/C,OAAO,IAAA,CAAK,sBAAA,CAAuBA,CAAS,CAAA,CAG7C,GAAI,CAAC,cAAA,CAAgB,eAAA,CAAiB,eAAA,CAAiB,gBAAiB,aAAa,CAAA,CAAE,QAAA,CAASA,CAAS,CAAA,CAAG,CAC3G,IAAMqB,CAAAA,CAAQrB,CAAAA,CAAU,OAAA,CAAQ,SAAA,CAAW,EAAE,CAAA,CAC7C,OAAO,CAAA,CAAA,EAAIA,CAAS,CAAA,iBAAA,EAAoBqB,CAAK,CAAA,EAAA,CAC9C,CACA,OAAO,IAAA,CAAK,gBAAA,CAAiBrB,CAAAA,CAAW,cAAc,CACvD,CAGA,OAAIA,CAAAA,CAAU,KAAA,CAAM,cAAc,CAAA,CAC1B,IAAA,CAAK,kBAAA,CAAmBA,EAAW,SAAS,CAAA,CAIhDA,CAAAA,CAAU,KAAA,CAAM,cAAc,CAAA,CAC1B,KAAK,kBAAA,CAAmBA,CAAAA,CAAW,QAAQ,CAAA,CAI/CA,CAAAA,CAAU,UAAA,CAAW,IAAI,CAAA,CACrB,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAW,OAAO,CAAA,CAI3CA,CAAAA,CAAU,WAAW,IAAI,CAAA,CACrB,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAW,QAAQ,EAI5CA,CAAAA,CAAU,UAAA,CAAW,OAAO,CAAA,CACxB,IAAA,CAAK,qBAAA,CAAsBA,CAAS,CAAA,CAIxCA,CAAAA,CAAU,UAAA,CAAW,SAAS,CAAA,CAC1B,IAAA,CAAK,wBAAwBA,CAAS,CAAA,CAI1C,CAAC,MAAA,CAAQ,aAAA,CAAe,MAAA,CAAQ,cAAe,OAAA,CAAS,cAAA,CAAgB,QAAQ,CAAA,CAAE,QAAA,CAASA,CAAS,EAChG,CAAA,CAAA,EAAIA,CAAS,CAAA,YAAA,EAAeA,CAAAA,CAAU,OAAA,CAAQ,SAAA,CAAW,SAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA,CAIzFA,EAAU,UAAA,CAAW,MAAM,CAAA,CACvB,IAAA,CAAK,cAAA,CAAeA,CAAS,EAIjCA,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CACzB,IAAA,CAAK,uBAAA,CAAwBA,CAAS,CAAA,CAI1CA,CAAAA,GAAc,UAAA,CAAmB,mCAAA,CACjCA,CAAAA,GAAc,kBAAA,CAA2B,oDACzCA,CAAAA,GAAc,UAAA,CAAmB,sCAAA,CACjCA,CAAAA,GAAc,kBAAA,CAA2B,sDAAA,CAGzCA,IAAc,eAAA,CAAwB,gDAAA,CACtCA,CAAAA,GAAc,gBAAA,CAAyB,6CAAA,CACvCA,CAAAA,GAAc,cAAsB,4CAAA,CACpCA,CAAAA,GAAc,iBAAA,CAA0B,qDAAA,CACxCA,CAAAA,GAAc,gBAAA,CAAyB,oDACvCA,CAAAA,GAAc,gBAAA,CAAyB,mDAAA,CAGvCA,CAAAA,GAAc,aAAA,CAAsB,0CAAA,CACpCA,IAAc,cAAA,CAAuB,uCAAA,CACrCA,CAAAA,GAAc,WAAA,CAAoB,sCAAA,CAClCA,CAAAA,GAAc,iBAAyB,2CAAA,CACvCA,CAAAA,GAAc,eAAA,CAAwB,yCAAA,CAGtCA,CAAAA,GAAc,WAAA,CAAoB,kCAClCA,CAAAA,GAAc,aAAA,CAAsB,qCAAA,CACpCA,CAAAA,GAAc,YAAA,CAAqB,mCAAA,CACnCA,IAAc,cAAA,CAAuB,uCAAA,CAGrCA,CAAAA,GAAc,WAAA,CAAoB,gDAAA,CAClCA,CAAAA,GAAc,WAAmB,8CAAA,CACjCA,CAAAA,GAAc,cAAA,CAAuB,sDAAA,CACrCA,CAAAA,GAAc,cAAA,CAAuB,+CAGrCA,CAAAA,GAAc,QAAA,CAAiB,gCAAA,CAC/BA,CAAAA,GAAc,YAAA,CAAqB,oCAAA,CAGnCA,EAAU,UAAA,CAAW,UAAU,CAAA,CAC3B,IAAA,CAAK,qBAAA,CAAsBA,CAAS,EAIxCA,CAAAA,CAAU,UAAA,CAAW,WAAW,CAAA,CAC5B,IAAA,CAAK,wBAAA,CAAyBA,CAAS,CAAA,CAI3CA,CAAAA,CAAU,UAAA,CAAW,YAAY,CAAA,CAC7B,IAAA,CAAK,uBAAuBA,CAAS,CAAA,CAIzCA,CAAAA,CAAU,UAAA,CAAW,YAAY,CAAA,CAC7B,KAAK,mBAAA,CAAoBA,CAAS,CAAA,CAItCA,CAAAA,CAAU,UAAA,CAAW,UAAU,EAC3B,IAAA,CAAK,kBAAA,CAAmBA,CAAS,CAAA,CAIrCA,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CACzB,IAAA,CAAK,iBAAA,CAAkBA,CAAS,CAAA,EAIxC,OAAA,CAAQ,KAAK,CAAA,oDAAA,EAAuDA,CAAS,CAAA,CAAE,CAAA,CACxE,IAAA,CACR,CAEQ,iBAAiBA,CAAAA,CAAmBsB,CAAAA,CAAiC,CAC5E,IAAMC,CAAAA,CAAU,IAAA,CAAK,OAAO,KAAA,EAAO,MAAA,EAAkC,EAAC,CAIhEC,CAAAA,CAASF,CAAAA,GAAa,mBAAqB,KAAA,CAClCA,CAAAA,GAAa,OAAA,CAAU,OAAA,CACvB,SAAA,CAGTG,CAAAA,CADYzB,CAAAA,CAAU,KAAA,CAAMwB,CAAAA,CAAO,MAAM,CAAA,CACvB,KAAA,CAAM,GAAG,CAAA,CAEjC,GAAIC,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,CAEvB,IAAMC,CAAAA,CAAaH,EAAOE,CAAAA,CAAM,CAAC,CAAC,CAAA,CAClC,GAAI,OAAOC,GAAe,QAAA,CACzB,OAAO,CAAA,CAAA,EAAI1B,CAAS,CAAA,GAAA,EAAMsB,CAAQ,KAAKI,CAAU,CAAA,EAAA,CAEnD,CAAA,KAAA,GAAWD,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,CAE9B,GAAM,CAACE,CAAAA,CAAWC,CAAK,CAAA,CAAIH,CAAAA,CACrBC,EAAaH,CAAAA,CAAOI,CAAS,CAAA,GAAIC,CAAK,CAAA,CAC5C,GAAIF,EACH,OAAO,CAAA,CAAA,EAAI1B,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,EAAA,EAAKI,CAAU,CAAA,EAAA,CAEnD,CAEA,OAAO,IACR,CAEQ,kBAAA,CAAmB1B,EAAmB6B,CAAAA,CAA2C,CACxF,IAAMC,CAAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,OAAA,EAAsC,EAAC,CACrEN,CAAAA,CAASK,CAAAA,GAAS,SAAA,CAAY,IAAM,GAAA,CAIpCE,CAAAA,CAAQ/B,CAAAA,CAAU,KAAA,CAAM,IAAI,MAAA,CAAO,IAAIwB,CAAM,CAAA,iBAAA,CAAmB,CAAC,CAAA,CACvE,GAAI,CAACO,EAAO,OAAO,IAAA,CAEnB,GAAM,EAAGC,CAAAA,CAAWC,CAAK,CAAA,CAAIF,CAAAA,CACvBG,CAAAA,CAAeJ,CAAAA,CAAQG,CAAK,CAAA,CAClC,GAAI,CAACC,CAAAA,CAAc,OAAO,IAAA,CAE1B,IAAMC,CAAAA,CAAuB,EAAC,CAC9B,GAAI,CAACH,CAAAA,CACJG,CAAAA,CAAW,IAAA,CAAK,GAAGN,CAAI,CAAA,EAAA,EAAKK,CAAY,CAAA,CAAE,CAAA,CAAA,KAAA,GAChCF,CAAAA,GAAc,IACxBG,CAAAA,CAAW,IAAA,CAAK,CAAA,EAAGN,CAAI,CAAA,OAAA,EAAUK,CAAY,GAAI,CAAA,EAAGL,CAAI,CAAA,QAAA,EAAWK,CAAY,CAAA,CAAE,CAAA,CAAA,KAAA,GACvEF,IAAc,GAAA,CACxBG,CAAAA,CAAW,IAAA,CAAK,CAAA,EAAGN,CAAI,CAAA,MAAA,EAASK,CAAY,CAAA,CAAA,CAAI,CAAA,EAAGL,CAAI,CAAA,SAAA,EAAYK,CAAY,CAAA,CAAE,OAC3E,CACN,IAAME,CAAAA,CAAiC,CAAE,CAAA,CAAG,KAAA,CAAO,EAAG,OAAA,CAAS,CAAA,CAAG,QAAA,CAAU,CAAA,CAAG,MAAO,CAAA,CACtFD,EAAW,IAAA,CAAK,CAAA,EAAGN,CAAI,CAAA,CAAA,EAAIO,CAAAA,CAAOJ,CAAS,CAAC,CAAA,EAAA,EAAKE,CAAY,CAAA,CAAE,EAChE,CAEA,OAAO,IAAIlC,CAAS,CAAA,GAAA,EAAMmC,CAAAA,CAAW,IAAA,CAAK,IAAI,CAAC,IAChD,CAEQ,eAAA,CAAgBnC,CAAAA,CAAmBsB,CAAAA,CAA6C,CACvF,IAAMQ,EAAW,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,OAAA,EAAsC,EAAC,CACrEN,EAASF,CAAAA,GAAa,OAAA,CAAU,IAAA,CAAO,IAAA,CACvCW,CAAAA,CAAQjC,CAAAA,CAAU,MAAMwB,CAAAA,CAAO,MAAM,CAAA,CAG3C,GAAIS,CAAAA,GAAU,MAAA,CAAQ,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,QAAA,CAAA,CACxD,GAAIW,IAAU,QAAA,CAAU,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,SAASA,CAAAA,CAAS,CAAC,CAAC,CAAA,EAAA,CAAA,CAC9E,GAAIW,CAAAA,GAAU,OAAQ,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,QAAA,CAAA,CACxD,GAAIW,CAAAA,GAAU,KAAA,CAAO,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,eAAA,CAAA,CACvD,GAAIW,CAAAA,GAAU,KAAA,CAAO,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,eAAA,CAAA,CACvD,GAAIW,CAAAA,GAAU,KAAA,CAAO,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,eAAA,CAAA,CAGvD,IAAMe,EAAYP,CAAAA,CAAQG,CAAK,CAAA,CAC/B,OAAII,CAAAA,CACI,CAAA,CAAA,EAAIrC,CAAS,CAAA,GAAA,EAAMsB,CAAQ,CAAA,EAAA,EAAKe,CAAS,CAAA,EAAA,CAAA,CAG1C,IACR,CAEQ,mBAAA,CAAoBrC,CAAAA,CAAkC,CAC7D,IAAMsC,CAAAA,CAAY,IAAA,CAAK,OAAO,KAAA,EAAO,QAAA,EAAoC,EAAC,CACpEC,CAAAA,CAAOvC,CAAAA,CAAU,MAAM,CAAc,CAAA,CACrCwC,CAAAA,CAAgBF,CAAAA,CAASC,CAAI,CAAA,CAEnC,GAAI,KAAA,CAAM,OAAA,CAAQC,CAAa,CAAA,CAAG,CACjC,GAAM,CAACC,CAAAA,CAAO,CAAE,UAAA,CAAAC,CAAW,CAAC,CAAA,CAAIF,EAChC,OAAO,CAAA,CAAA,EAAIxC,CAAS,CAAA,cAAA,EAAiByC,CAAK,CAAA,eAAA,EAAkBC,CAAU,CAAA,EAAA,CACvE,CACA,OAAI,OAAOF,CAAAA,EAAkB,QAAA,CACrB,IAAIxC,CAAS,CAAA,cAAA,EAAiBwC,CAAa,CAAA,EAAA,CAAA,CAG5C,IACR,CAEQ,sBAAsBxC,CAAAA,CAAkC,CAC/D,IAAM2C,CAAAA,CAAc,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAyC,EAAC,CAC3EC,CAAAA,CAAS5C,CAAAA,CAAU,KAAA,CAAM,CAAc,CAAA,CACvC6C,CAAAA,CAAcF,CAAAA,CAAWC,CAAM,CAAA,CAErC,OAAIC,EACI,CAAA,CAAA,EAAI7C,CAAS,CAAA,gBAAA,EAAmB6C,CAAW,CAAA,EAAA,CAAA,CAG5C,IACR,CAEQ,uBAAA,CAAwB7C,CAAAA,CAAkC,CACjE,IAAM8C,CAAAA,CAAgB,IAAA,CAAK,OAAO,KAAA,EAAO,YAAA,EAA2C,EAAC,CAGrF,GAAI9C,CAAAA,GAAc,UAAW,CAC5B,IAAMiC,CAAAA,CAAQa,CAAAA,CAAa,OAAA,EAAWA,CAAAA,CAAa,EAAE,CAAA,CACrD,GAAIb,CAAAA,CAAO,OAAO,CAAA,0BAAA,EAA6BA,CAAK,IACrD,CAGA,IAAMM,CAAAA,CAAOvC,CAAAA,CAAU,KAAA,CAAM,CAAiB,EACxC+C,CAAAA,CAAcD,CAAAA,CAAaP,CAAI,CAAA,CACrC,OAAIQ,CAAAA,CACI,IAAI/C,CAAS,CAAA,kBAAA,EAAqB+C,CAAW,CAAA,EAAA,CAAA,CAG9C,IACR,CAEQ,uBAAuB/C,CAAAA,CAAkC,CAChE,IAAMgD,CAAAA,CAAe,IAAA,CAAK,MAAA,CAAO,OAAO,WAAA,EAA0C,EAAC,CAGnF,GAAIhD,CAAAA,GAAc,QAAA,CAEjB,OAAO,CAAA,wBAAA,EADOgD,CAAAA,CAAY,OAAA,EAAW,KACE,CAAA,EAAA,CAAA,CAIxC,IAAMC,EAAWjD,CAAAA,CAAU,KAAA,CAAM,mBAAmB,CAAA,CACpD,GAAIiD,CAAAA,CAAU,CACb,IAAMb,CAAAA,CAAiC,CAAE,CAAA,CAAG,KAAA,CAAO,CAAA,CAAG,OAAA,CAAS,EAAG,QAAA,CAAU,CAAA,CAAG,MAAO,CAAA,CAChFH,CAAAA,CAAQe,CAAAA,CAAY,SAAW,KAAA,CACrC,OAAO,CAAA,CAAA,EAAIhD,CAAS,CAAA,UAAA,EAAaoC,CAAAA,CAAOa,EAAS,CAAC,CAAC,CAAC,CAAA,QAAA,EAAWhB,CAAK,CAAA,EAAA,CACrE,CAGA,IAAMiB,CAAAA,CAAalD,CAAAA,CAAU,KAAA,CAAM,gBAAgB,CAAA,CACnD,GAAIkD,CAAAA,CAAY,CACf,IAAMjB,CAAAA,CAAQe,CAAAA,CAAYE,CAAAA,CAAW,CAAC,CAAC,CAAA,CACvC,GAAIjB,CAAAA,CACH,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,iBAAA,EAAoBiC,CAAK,CAAA,EAAA,CAE/C,CAEA,OAAO,IACR,CAEQ,cAAA,CAAejC,CAAAA,CAAkC,CACxD,IAAM8B,CAAAA,CAAW,IAAA,CAAK,OAAO,KAAA,EAAO,OAAA,EAAsC,EAAC,CAG3E,GAAI9B,CAAAA,CAAU,WAAW,QAAQ,CAAA,CAAG,CACnC,IAAMiC,CAAAA,CAAQjC,CAAAA,CAAU,MAAM,CAAe,CAAA,CACvCmD,CAAAA,CAAWrB,CAAAA,CAAQG,CAAK,CAAA,CAC9B,GAAIkB,CAAAA,CACH,OAAO,CAAA,CAAA,EAAInD,CAAS,CAAA,eAAA,EAAkBmD,CAAQ,IAEhD,CAGA,GAAInD,CAAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CAAG,CACnC,IAAMiC,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAe,CAAA,CACvCmD,EAAWrB,CAAAA,CAAQG,CAAK,CAAA,CAC9B,GAAIkB,CAAAA,CACH,OAAO,IAAInD,CAAS,CAAA,YAAA,EAAemD,CAAQ,CAAA,EAAA,CAE7C,CAGA,IAAMlB,EAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAa,CAAA,CACrCmD,CAAAA,CAAWrB,CAAAA,CAAQG,CAAK,CAAA,CAC9B,OAAIkB,CAAAA,CACI,CAAA,CAAA,EAAInD,CAAS,CAAA,QAAA,EAAWmD,CAAQ,CAAA,EAAA,CAAA,CAGjC,IACR,CAMQ,uBAAA,CAAwBnD,CAAAA,CAAkC,CACjE,IAAM8B,CAAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,OAAA,EAAsC,GAG1E,GAAI9B,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CAAG,CACrC,IAAMiC,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAiB,CAAA,CACzCoD,CAAAA,CAAatB,EAAQG,CAAK,CAAA,CAChC,GAAImB,CAAAA,CAEH,OAAO,CAAA,CAAA,EAAIpD,CAAS,CAAA,iFAAA,EAAoFoD,CAAU,CAAA,iDAAA,EAAoDA,CAAU,CAAA,yCAAA,CAElL,CAGA,GAAIpD,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CAAG,CACrC,IAAMiC,EAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAiB,CAAA,CACzCoD,CAAAA,CAAatB,CAAAA,CAAQG,CAAK,CAAA,CAChC,GAAImB,CAAAA,CAEH,OAAO,CAAA,CAAA,EAAIpD,CAAS,kFAAkFoD,CAAU,CAAA,6DAAA,EAAgEA,CAAU,CAAA,+BAAA,CAE5L,CAGA,OAAIpD,IAAc,iBAAA,CACV,CAAA,CAAA,EAAIA,CAAS,CAAA,8DAAA,CAAA,CAEjBA,CAAAA,GAAc,iBAAA,CACV,IAAIA,CAAS,CAAA,8DAAA,CAAA,CAGd,IACR,CAEQ,qBAAA,CAAsBA,CAAAA,CAAkC,CAC/D,IAAM0C,CAAAA,CAAc,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,UAAA,EAAyC,EAAC,CAC3ET,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAiB,CAAA,CACzCqD,CAAAA,CAAkBX,EAAWT,CAAK,CAAA,CAExC,OAAIoB,CAAAA,CACI,CAAA,CAAA,EAAIrD,CAAS,mBAAmBqD,CAAe,CAAA,EAAA,CAAA,CAGhD,IACR,CAEQ,wBAAA,CAAyBrD,CAAAA,CAAkC,CAClE,IAAMsD,CAAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,aAAA,EAA4C,EAAC,CACjFrB,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,CAAkB,CAAA,CAC1CuD,EAAqBD,CAAAA,CAAcrB,CAAK,CAAA,CAE9C,OAAIsB,CAAAA,CACI,CAAA,CAAA,EAAIvD,CAAS,CAAA,mBAAA,EAAsBuD,CAAkB,CAAA,EAAA,CAAA,CAGtD,IACR,CAEQ,sBAAA,CAAuBvD,EAAkC,CAChE,IAAMiC,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,EAAmB,EAEjD,GAAIiC,CAAAA,GAAU,MAAA,CACb,OAAO,CAAA,CAAA,EAAIjC,CAAS,mCAErB,GAAIiC,CAAAA,GAAU,SAAA,CACb,OAAO,CAAA,CAAA,EAAIjC,CAAS,sCAGrB,IAAMwD,CAAAA,CAAU,MAAA,CAAO,QAAA,CAASvB,CAAAA,CAAO,EAAE,EACzC,OAAI,CAAC,MAAA,CAAO,KAAA,CAAMuB,CAAO,CAAA,EAAKA,GAAW,CAAA,EAAKA,CAAAA,EAAW,EAAA,CACjD,CAAA,CAAA,EAAIxD,CAAS,CAAA,iCAAA,EAAoCwD,CAAO,CAAA,mBAAA,CAAA,CAGzD,IACR,CAEQ,mBAAA,CAAoBxD,CAAAA,CAAkC,CAC7D,IAAMiC,CAAAA,CAAQjC,CAAAA,CAAU,KAAA,CAAM,EAAmB,CAAA,CAEjD,GAAIiC,IAAU,MAAA,CACb,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,6BAAA,CAAA,CAErB,GAAIiC,IAAU,SAAA,CACb,OAAO,CAAA,CAAA,EAAIjC,CAAS,CAAA,gCAAA,CAAA,CAGrB,IAAMyD,EAAU,MAAA,CAAO,QAAA,CAASxB,CAAAA,CAAO,EAAE,CAAA,CACzC,OAAI,CAAC,MAAA,CAAO,KAAA,CAAMwB,CAAO,CAAA,EAAKA,CAAAA,EAAW,CAAA,EAAKA,GAAW,CAAA,CACjD,CAAA,CAAA,EAAIzD,CAAS,CAAA,8BAAA,EAAiCyD,CAAO,CAAA,mBAAA,CAAA,CAGtD,IACR,CAEQ,kBAAA,CAAmBzD,CAAAA,CAAkC,CAC5D,IAAMiC,CAAAA,CAAQjC,EAAU,KAAA,CAAM,CAAiB,CAAA,CACzC0D,CAAAA,CAAW,MAAA,CAAO,QAAA,CAASzB,EAAO,EAAE,CAAA,CAE1C,OAAI,CAAC,MAAA,CAAO,KAAA,CAAMyB,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,EAAKA,CAAAA,EAAY,GAAA,CACpD,CAAA,CAAA,EAAI1D,CAAS,CAAA,YAAA,EAAe0D,CAAAA,CAAW,GAAG,CAAA,EAAA,CAAA,CAG3C,IACR,CAEQ,kBAAkB1D,CAAAA,CAAkC,CAC3D,IAAM2D,CAAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,SAAA,EAAwC,EAAC,CAG7E,GAAI3D,CAAAA,GAAc,QAAA,CAAU,CAC3B,IAAMiC,CAAAA,CAAQ0B,CAAAA,CAAQ,OAAA,EAAWA,CAAAA,CAAQ,EAAE,EAC3C,GAAI1B,CAAAA,CAAO,OAAO,CAAA,sBAAA,EAAyBA,CAAK,CAAA,EAAA,CACjD,CAGA,IAAMM,CAAAA,CAAOvC,CAAAA,CAAU,KAAA,CAAM,CAAgB,CAAA,CACvC4D,EAAcD,CAAAA,CAAQpB,CAAI,CAAA,CAChC,OAAIqB,CAAAA,CACI,CAAA,CAAA,EAAI5D,CAAS,CAAA,eAAA,EAAkB4D,CAAW,CAAA,EAAA,CAAA,CAG3C,IACR,CAKQ,SAAA,CAAUhD,CAAAA,CAAa,CAC1B,IAAA,CAAK,YAAA,GACR,IAAA,CAAK,YAAA,CAAa,WAAA,EAAe;AAAA,EAAKA,CAAG,IAE3C,CAKO,KAAA,EAAQ,CACd,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM,CACvB,IAAA,CAAK,YAAA,GACR,KAAK,YAAA,CAAa,WAAA,CAAc,EAAA,EAElC,CACD,CAAA,CAGIiD,CAAAA,CAAyC,KAEtC,SAASC,CAAAA,EAA6C,CAC5D,OAAKD,CAAAA,GACJA,CAAAA,CAAY,IAAIhE,CAAAA,CAAAA,CAEVgE,CACR,CC1qBA,IAAME,CAAAA,CAAN,KAAwB,CACf,SAAA,CAAY,KAAA,CACZ,eAAA,CAAsC,IAAA,CACtC,cAAA,CAAqC,IAAA,CAGrC,aACA,gBAAA,CACA,iBAAA,CACA,gBAAA,CAAqC,EAAC,CACtC,cAAA,CAAwC,KAEhD,WAAA,EAAc,CAEb,IAAA,CAAK,YAAA,CAAe,IAAA,CAAK,aAAA,CAAc,oBAAqB,MAAM,CAAA,CAClE,IAAA,CAAK,gBAAA,CAAmB,IAAA,CAAK,aAAA,CAAc,oBAAqB,MAAM,CAAA,CACtE,IAAA,CAAK,iBAAA,CAAoB,IAAA,CAAK,cAAA,GAE9B,IAAA,CAAK,MAAA,EAAO,CACZ,IAAA,CAAK,mBAAA,GACN,CAEQ,aAAA,CAAcC,CAAAA,CAAgBC,CAAAA,CAAgC,CACrE,IAAMC,CAAAA,CAAU,SAAS,aAAA,CAAc,KAAK,CAAA,CAC5C,OAAAA,CAAAA,CAAQ,SAAA,CAAY,yBACpB,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAO,CAC5B,QAAA,CAAU,WACV,MAAA,CAAAF,CAAAA,CACA,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,MAAA,CAAOC,CAAM,CAAA,CACrB,OAAA,CAAS,MAAA,CACT,SAAA,CAAW,mCAAA,CACX,UAAA,CAAY,mBACb,CAAC,CAAA,CACD,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYC,CAAO,EAC1BA,CACR,CAEQ,kBAAA,EAAqC,CAC5C,IAAMA,CAAAA,CAAU,SAAS,aAAA,CAAc,KAAK,CAAA,CAC5C,OAAAA,CAAAA,CAAQ,SAAA,CAAY,0CACpB,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAO,CAC5B,QAAA,CAAU,WACV,MAAA,CAAQ,oCAAA,CACR,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,QAAA,CACR,QAAS,MAAA,CACT,SAAA,CAAW,mCAAA,CACX,UAAA,CAAY,mBACb,CAAC,EACD,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYA,CAAO,CAAA,CAC1BA,CACR,CAEQ,cAAA,EAAiC,CACxC,IAAMC,CAAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC1C,OAAAA,CAAAA,CAAM,SAAA,CAAY,oBAAA,CAClB,MAAA,CAAO,OAAOA,CAAAA,CAAM,KAAA,CAAO,CAC1B,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,UACZ,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,MAAA,CACV,WAAY,WAAA,CACZ,UAAA,CAAY,KAAA,CACZ,YAAA,CAAc,WAAA,CACd,aAAA,CAAe,OACf,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,MACV,CAAC,CAAA,CACD,SAAS,IAAA,CAAK,WAAA,CAAYA,CAAK,CAAA,CACxBA,CACR,CAEQ,QAAS,CAChB,MAAA,CAAO,gBAAA,CAAiB,SAAA,CAAY,CAAA,EAAuC,CACtE,EAAE,IAAA,CAAK,IAAA,GAAS,oBAAA,CACnB,IAAA,CAAK,MAAA,EAAO,CACF,EAAE,IAAA,CAAK,IAAA,GAAS,sBAC1B,IAAA,CAAK,OAAA,GACK,CAAA,CAAE,IAAA,CAAK,IAAA,GAAS,mBAAA,CAC1B,IAAA,CAAK,mBAAA,CAAoB,EAAE,IAAI,CAAA,CACrB,CAAA,CAAE,IAAA,CAAK,IAAA,GAAS,2BAAA,CAC1B,KAAK,yBAAA,EAA0B,CACrB,CAAA,CAAE,IAAA,CAAK,IAAA,GAAS,iBAAA,CAC1B,KAAK,iBAAA,CAAkB,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,CACzB,CAAA,CAAE,KAAK,IAAA,GAAS,qBAAA,CAC1B,IAAA,CAAK,eAAA,EAAgB,CACX,CAAA,CAAE,KAAK,IAAA,GAAS,mBAAA,EAC1B,IAAA,CAAK,mBAAA,CAAoB,CAAA,CAAE,IAAI,EAEjC,CAAC,EACF,CAEQ,mBAAA,EAAsB,CAE7B,MAAA,CAAO,iBAAiB,QAAA,CAAU,IAAA,CAAK,sBAAsB,CAAA,CAC7D,MAAA,CAAO,gBAAA,CAAiB,SAAU,IAAA,CAAK,sBAAA,CAAwB,IAAI,CAAA,CAGnE,IAAA,CAAK,cAAA,CAAiB,IAAI,cAAA,CAAe,IAAM,CAC9C,IAAA,CAAK,sBAAA,GACN,CAAC,CAAA,CAGD,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAA,CAAS,IAAI,EAC1C,CAEQ,sBAAA,CAAyB,IAAM,CAElC,IAAA,CAAK,eAAA,EAAmB,KAAK,gBAAA,CAAiB,KAAA,CAAM,OAAA,GAAY,MAAA,GACnE,IAAA,CAAK,qBAAA,CAAsB,KAAK,gBAAA,CAAkB,IAAA,CAAK,eAAe,CAAA,CACtE,IAAA,CAAK,cAAA,CAAe,KAAK,eAAe,CAAA,CAAA,CAIrC,IAAA,CAAK,cAAA,EAAkB,IAAA,CAAK,YAAA,CAAa,MAAM,OAAA,GAAY,MAAA,EAC9D,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,YAAA,CAAc,KAAK,cAAc,CAAA,CAIlE,IAAA,IAAWD,CAAAA,IAAW,IAAA,CAAK,gBAAA,CAC1B,GAAIA,CAAAA,CAAQ,KAAA,CAAM,OAAA,GAAY,MAAA,EAAU,IAAA,CAAK,cAAA,CAAgB,CAE5D,IAAME,CAAAA,CAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,CAAOC,CAAAA,EACjD,IAAA,CAAK,mBAAA,CAAoBA,CAAoB,IAC1C,IAClB,CAAA,CAEKC,CAAAA,CAAQ,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQJ,CAAO,CAAA,CAC7CG,CAAAA,CAAQD,CAAAA,CAASE,CAAK,CAAA,CACxBD,CAAAA,EACH,KAAK,qBAAA,CAAsBH,CAAAA,CAASG,CAAK,EAE3C,CAEF,CAAA,CAEA,QAAS,CACJ,IAAA,CAAK,SAAA,GACT,IAAA,CAAK,SAAA,CAAY,IAAA,CAEjB,SAAS,gBAAA,CAAiB,WAAA,CAAa,IAAA,CAAK,eAAe,CAAA,CAC3D,QAAA,CAAS,iBAAiB,OAAA,CAAS,IAAA,CAAK,WAAA,CAAa,IAAI,CAAA,CACzD,QAAA,CAAS,iBAAiB,YAAA,CAAc,IAAA,CAAK,gBAAgB,CAAA,CAG7D,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,CAAS,WAAA,EAC9B,CAEA,OAAA,EAAU,CACJ,IAAA,CAAK,YACV,IAAA,CAAK,SAAA,CAAY,KAAA,CAEjB,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAa,KAAK,eAAe,CAAA,CAC9D,QAAA,CAAS,mBAAA,CAAoB,OAAA,CAAS,IAAA,CAAK,YAAa,IAAI,CAAA,CAC5D,QAAA,CAAS,mBAAA,CAAoB,YAAA,CAAc,IAAA,CAAK,gBAAgB,CAAA,CAGhE,IAAA,CAAK,aAAa,KAAA,CAAM,OAAA,CAAU,OAClC,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,OAAA,CAAU,MAAA,CACtC,IAAA,CAAK,kBAAkB,KAAA,CAAM,OAAA,CAAU,MAAA,CACvC,IAAA,CAAK,oBAAA,EAAqB,CAGtB,KAAK,eAAA,EACR,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,kBAAkB,CAAA,CAEpD,KAAK,cAAA,EACR,IAAA,CAAK,cAAA,CAAe,eAAA,CAAgB,iBAAiB,CAAA,CAGtD,SAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAS,EAAA,CAC7B,IAAA,CAAK,eAAA,CAAkB,KACvB,IAAA,CAAK,cAAA,CAAiB,IAAA,EACvB,CAMA,eAAA,EAAkB,CACZ,KAAK,eAAA,GAGV,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,kBAAkB,CAAA,CACvD,KAAK,eAAA,CAAkB,IAAA,CAGvB,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,OAAA,CAAU,OACtC,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,OAAA,CAAU,MAAA,EACxC,CAMQ,oBAAoBE,CAAAA,CAAyB,CACpD,GAAI,CAACA,CAAAA,CAAK,UAAA,EAAc,CAACA,CAAAA,CAAK,UAAA,EAAcA,CAAAA,CAAK,YAAA,GAAiB,MAAA,CACjE,OAID,IAAMC,CAAAA,CAAc,QAAA,CAAS,gBAAA,CAAiB,GAAG,CAAA,CACjD,IAAA,IAAWC,KAAMD,CAAAA,CAAa,CAE7B,GAAKC,CAAAA,CAAmB,SAAA,EAAW,QAAA,CAAS,wBAAwB,CAAA,EAC/DA,CAAAA,CAAmB,SAAA,EAAW,QAAA,CAAS,oBAAoB,CAAA,CAC/D,SAGD,IAAMC,CAAAA,CAAS,IAAA,CAAK,mBAAA,CAAoBD,CAAiB,CAAA,CACzD,GACCC,CAAAA,EACAA,CAAAA,CAAO,QAAA,GAAaH,CAAAA,CAAK,UAAA,EACzBG,CAAAA,CAAO,aAAeH,CAAAA,CAAK,UAAA,EAC3BG,CAAAA,CAAO,YAAA,GAAiBH,CAAAA,CAAK,YAAA,CAC5B,CACD,IAAMI,CAAAA,CAAUF,CAAAA,CAGZ,IAAA,CAAK,eAAA,EACR,IAAA,CAAK,gBAAgB,eAAA,CAAgB,kBAAkB,CAAA,CAGxD,IAAA,CAAK,eAAA,CAAkBE,CAAAA,CACvB,KAAK,eAAA,CAAgB,YAAA,CAAa,kBAAA,CAAoB,MAAM,CAAA,CAG5D,IAAA,CAAK,sBAAsB,IAAA,CAAK,gBAAA,CAAkBA,CAAO,CAAA,CACzD,IAAA,CAAK,gBAAA,CAAiB,MAAM,OAAA,CAAU,OAAA,CAEtC,IAAA,CAAK,cAAA,CAAeA,CAAO,CAAA,CAC3B,KAAK,iBAAA,CAAkB,KAAA,CAAM,OAAA,CAAU,OAAA,CAGvC,IAAA,CAAK,eAAA,CAAgBA,EAASD,CAAM,CAAA,CAEpC,MACD,CACD,CACD,CAUQ,oBAAoBC,CAAAA,CAA6C,CAExE,IAAMC,CAAAA,CAAmBD,CAAAA,CACnBE,CAAAA,CAAW,OAAO,IAAA,CAAKD,CAAgB,CAAA,CAAE,IAAA,CAAKE,CAAAA,EACnDA,CAAAA,CAAI,WAAW,eAAe,CAAA,EAC9BA,CAAAA,CAAI,UAAA,CAAW,0BAA0B,CAC1C,EAEA,GAAI,CAACD,CAAAA,CACJ,OAAO,IAAA,CAGR,IAAIE,EAAQH,CAAAA,CAAiBC,CAAQ,CAAA,CACjCG,CAAAA,CAAqC,IAAA,CAGzC,KAAOD,GAAO,CACb,GAAIA,CAAAA,CAAM,YAAA,CAAc,CACvB,IAAML,EAAyB,CAC9B,QAAA,CAAUK,CAAAA,CAAM,YAAA,CAAa,QAAA,CAC7B,UAAA,CAAYA,EAAM,YAAA,CAAa,UAAA,CAC/B,aAAcA,CAAAA,CAAM,YAAA,CAAa,cAAgB,CAClD,CAAA,CAYA,GATKC,CAAAA,GACJA,CAAAA,CAAcN,CAAAA,CAAAA,CAKSA,EAAO,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,EAC3CA,CAAAA,CAAO,QAAA,CAAS,SAAS,qBAAqB,CAAA,CAEhD,CAEpBK,CAAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,QACD,CAGA,OAAOL,CACR,CACAK,CAAAA,CAAQA,CAAAA,CAAM,OACf,CAGA,OAAOC,CACR,CAEQ,WAAA,CAAYL,CAAAA,CAA+B,CAElD,OADsB,CAAC,KAAA,CAAO,SAAA,CAAW,QAAA,CAAU,QAAA,CAAU,OAAQ,OAAA,CAAS,KAAA,CAAO,SAAA,CAAW,IAAA,CAAM,IAAA,CAAM,IAAI,EAC3F,QAAA,CAASA,CAAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAC5D,CAEQ,oBAAA,CAAqBA,CAAAA,CAA+B,CAC3D,OAAO,KAAA,CAAM,IAAA,CAAKA,EAAQ,UAAU,CAAA,CAAE,IAAA,CACrCM,CAAAA,EAAQA,CAAAA,CAAK,QAAA,GAAa,KAAK,SAAA,EAAaA,CAAAA,CAAK,WAAA,EAAa,IAAA,EAC/D,CACD,CAEQ,gBAAA,CAAmB,IAAM,CAC3B,IAAA,CAAK,SAAA,GAGN,IAAA,CAAK,gBACR,IAAA,CAAK,cAAA,CAAe,eAAA,CAAgB,iBAAiB,CAAA,CAEtD,IAAA,CAAK,eAAiB,IAAA,CACtB,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,CAAU,MAAA,CAClC,KAAK,oBAAA,EAAqB,EAC3B,CAAA,CAEQ,eAAA,CAAmB,CAAA,EAAkB,CAC5C,GAAI,CAAC,IAAA,CAAK,SAAA,CAAW,OAMrB,IAAMC,CAAAA,CAHkB,SAAS,iBAAA,CAAkB,CAAA,CAAE,OAAA,CAAS,CAAA,CAAE,OAAO,CAAA,CAG5B,OAAQT,CAAAA,EAC9CA,CAAAA,CAAG,SAAA,CAAU,QAAA,CAAS,wBAAwB,CAAA,EAC9CA,EAAG,SAAA,CAAU,QAAA,CAAS,oBAAoB,CAAA,CACtC,KAAA,CAIO,IAAA,CAAK,oBAAoBA,CAAiB,CAAA,GACvC,IAClB,CAAA,CAED,GAAIS,CAAAA,CAAmB,SAAW,CAAA,CAAG,CAChC,IAAA,CAAK,cAAA,EACR,IAAA,CAAK,cAAA,CAAe,gBAAgB,iBAAiB,CAAA,CAEtD,IAAA,CAAK,cAAA,CAAiB,IAAA,CACtB,IAAA,CAAK,aAAa,KAAA,CAAM,OAAA,CAAU,MAAA,CAClC,IAAA,CAAK,oBAAA,EAAqB,CAC1B,MACD,CAGA,IAAMC,CAAAA,CAAaD,CAAAA,CAAmB,CAAC,CAAA,CACvC,GAAKC,CAAAA,CAGL,CAAA,GAAIA,CAAAA,GAAe,IAAA,CAAK,eAAA,CAAiB,CACxC,KAAK,YAAA,CAAa,KAAA,CAAM,OAAA,CAAU,MAAA,CAClC,IAAA,CAAK,oBAAA,GACL,MACD,CAGI,IAAA,CAAK,cAAA,EAAkB,IAAA,CAAK,cAAA,GAAmBA,GAClD,IAAA,CAAK,cAAA,CAAe,eAAA,CAAgB,iBAAiB,CAAA,CAGtD,IAAA,CAAK,eAAiBA,CAAAA,CACtB,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,iBAAA,CAAmB,MAAM,EAG1D,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,YAAA,CAAcA,CAAU,CAAA,CACxD,KAAK,YAAA,CAAa,KAAA,CAAM,OAAA,CAAU,OAAA,CAG9B,IAAA,CAAK,WAAA,CAAYA,CAAU,CAAA,EAAK,CAAC,KAAK,oBAAA,CAAqBA,CAAU,EACxE,IAAA,CAAK,oBAAA,CAAqBA,CAAU,CAAA,CAEpC,IAAA,CAAK,oBAAA,IAEP,CAAA,CAEQ,oBAAA,CAAqBC,CAAAA,CAAqB,CAEjD,IAAMhB,CAAAA,CAAW,MAAM,IAAA,CAAKgB,CAAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAOf,CAAAA,EACpC,KAAK,mBAAA,CAAoBA,CAAoB,CAAA,GAC1C,IAClB,CAAA,CAGD,KAAO,KAAK,gBAAA,CAAiB,MAAA,CAASD,CAAAA,CAAS,MAAA,EAC9C,IAAA,CAAK,gBAAA,CAAiB,KAAK,IAAA,CAAK,kBAAA,EAAoB,CAAA,CAIrDA,CAAAA,CAAS,OAAA,CAAQ,CAACC,CAAAA,CAAOC,CAAAA,GAAU,CAClC,IAAMJ,CAAAA,CAAU,IAAA,CAAK,iBAAiBI,CAAK,CAAA,CACvCJ,CAAAA,GACH,IAAA,CAAK,qBAAA,CAAsBA,CAAAA,CAASG,CAAK,CAAA,CACzCH,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,OAAA,EAE1B,CAAC,EAGD,IAAA,IAASmB,CAAAA,CAAIjB,CAAAA,CAAS,MAAA,CAAQiB,CAAAA,CAAI,IAAA,CAAK,iBAAiB,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CACpE,IAAMnB,CAAAA,CAAU,IAAA,CAAK,iBAAiBmB,CAAC,CAAA,CACnCnB,CAAAA,GACHA,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,QAE1B,CACD,CAEQ,oBAAA,EAAuB,CAC9B,IAAA,IAAWA,CAAAA,IAAW,KAAK,gBAAA,CAC1BA,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,OAE1B,CAEQ,sBAAwB,CAAA,CACxB,aAAA,CAAgB,CAAA,CAChB,iBAAA,CAAoB,CAAE,CAAA,CAAG,EAAG,CAAA,CAAG,CAAE,CAAA,CAEjC,WAAA,CAAe,CAAA,EAAkB,CAMxC,GALI,CAAC,IAAA,CAAK,SAAA,GAEV,CAAA,CAAE,cAAA,EAAe,CACjB,EAAE,eAAA,EAAgB,CAEd,CAAC,IAAA,CAAK,cAAA,CAAA,CAAgB,OAE1B,IAAMoB,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACfC,CAAAA,CAAqBD,CAAAA,CAAM,KAAK,aAAA,CAChCE,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAC1B,CAAA,CAAE,OAAA,CAAU,KAAK,iBAAA,CAAkB,CAAA,CACnC,CAAA,CAAE,OAAA,CAAU,IAAA,CAAK,iBAAA,CAAkB,CACpC,CAAA,CAIMN,CAAAA,CADkB,QAAA,CAAS,iBAAA,CAAkB,CAAA,CAAE,OAAA,CAAS,EAAE,OAAO,CAAA,CAC5B,MAAA,CAAQT,CAAAA,EAC9CA,CAAAA,CAAG,SAAA,CAAU,SAAS,wBAAwB,CAAA,EAC9CA,CAAAA,CAAG,SAAA,CAAU,QAAA,CAAS,oBAAoB,EACtC,KAAA,CAIO,IAAA,CAAK,mBAAA,CAAoBA,CAAiB,CAAA,GACvC,IAClB,EAGGc,CAAAA,CAAqB,GAAA,EAAQC,CAAAA,CAAgB,EAAA,EAAMN,CAAAA,CAAmB,MAAA,CAAS,EAClF,IAAA,CAAK,qBAAA,CAAA,CAAyB,IAAA,CAAK,qBAAA,CAAwB,CAAA,EAAKA,CAAAA,CAAmB,OAEnF,IAAA,CAAK,qBAAA,CAAwB,CAAA,CAG9B,IAAMO,CAAAA,CAASP,CAAAA,CAAmB,KAAK,qBAAqB,CAAA,CAC5D,GAAI,CAACO,CAAAA,CAAQ,OAGb,IAAMf,CAAAA,CAAS,IAAA,CAAK,mBAAA,CAAoBe,CAAM,CAAA,CACzCf,CAAAA,GAKD,KAAK,eAAA,EACR,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,kBAAkB,CAAA,CAGxD,KAAK,eAAA,CAAkBe,CAAAA,CACvB,KAAK,eAAA,CAAgB,YAAA,CAAa,mBAAoB,MAAM,CAAA,CAG5D,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,gBAAA,CAAkBA,CAAM,CAAA,CACxD,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,OAAA,CAAU,OAAA,CAEtC,KAAK,cAAA,CAAeA,CAAM,CAAA,CAC1B,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,QAAU,OAAA,CAGvC,IAAA,CAAK,eAAA,CAAgBA,CAAAA,CAAQf,CAAM,CAAA,CAGnC,KAAK,aAAA,CAAgBY,CAAAA,CACrB,IAAA,CAAK,iBAAA,CAAoB,CAAE,CAAA,CAAG,EAAE,OAAA,CAAS,CAAA,CAAG,CAAA,CAAE,OAAQ,CAAA,EACvD,CAAA,CAEQ,sBAAsBpB,CAAAA,CAAyBS,CAAAA,CAAsB,CAC5E,IAAMe,CAAAA,CAAOf,CAAAA,CAAQ,uBAAsB,CAC3C,MAAA,CAAO,MAAA,CAAOT,CAAAA,CAAQ,KAAA,CAAO,CAC5B,IAAK,CAAA,EAAGwB,CAAAA,CAAK,GAAA,CAAM,MAAA,CAAO,OAAO,CAAA,EAAA,CAAA,CACjC,KAAM,CAAA,EAAGA,CAAAA,CAAK,IAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAA,CAAA,CACnC,MAAO,CAAA,EAAGA,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CACpB,MAAA,CAAQ,CAAA,EAAGA,EAAK,MAAM,CAAA,EAAA,CACvB,CAAC,EACF,CAEQ,cAAA,CAAef,EAAsB,CAC5C,IAAMe,CAAAA,CAAOf,CAAAA,CAAQ,qBAAA,EAAsB,CACrCgB,EAAUhB,CAAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY,CAE5C,IAAA,CAAK,iBAAA,CAAkB,YAAcgB,CAAAA,CACrC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAO,CAC3C,GAAA,CAAK,CAAA,EAAGD,CAAAA,CAAK,GAAA,CAAM,MAAA,CAAO,OAAO,KACjC,IAAA,CAAM,CAAA,EAAGA,CAAAA,CAAK,IAAA,CAAO,MAAA,CAAO,OAAO,IACpC,CAAC,EACF,CAEQ,iBAAA,CAAkBf,CAAAA,CAA8C,CACvE,IAAMzE,CAAAA,CAAW,MAAA,CAAO,gBAAA,CAAiByE,CAAO,CAAA,CAC1CiB,CAAAA,CAAgB,CACrB,SAAA,CACA,UAAA,CACA,OAAA,CACA,QAAA,CACA,SAAA,CACA,QAAA,CACA,kBACA,OAAA,CACA,UAAA,CACA,YACD,CAAA,CAEMC,CAAAA,CAAiC,GACvC,IAAA,IAAWvF,CAAAA,IAAQsF,CAAAA,CAClBC,CAAAA,CAAOvF,CAAI,CAAA,CAAIJ,EAAS,gBAAA,CAAiBI,CAAI,CAAA,CAE9C,OAAOuF,CACR,CAKQ,qBAAqBlB,CAAAA,CAAqC,CACjE,IAAMmB,CAAAA,CAAkB,KAAA,CAAM,IAAA,CAAKnB,EAAQ,UAAU,CAAA,CACnD,MAAA,CAAOM,CAAAA,EAAQA,CAAAA,CAAK,QAAA,GAAa,KAAK,SAAS,CAAA,CAC/C,GAAA,CAAIA,CAAAA,EAAQA,CAAAA,CAAK,WAAA,EAAa,MAAM,CAAA,CACpC,MAAA,CAAO,OAAO,CAAA,CAEhB,OAAOa,EAAgB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,CAAI,IACjE,CAEQ,eAAA,CAAgBnB,CAAAA,CAAsBD,CAAAA,CAAwB,CACrE,IAAMqB,EAAa,IAAA,CAAK,oBAAA,CAAqBpB,CAAO,CAAA,CAE9CJ,CAAAA,CAA+B,CACpC,KAAM,qBAAA,CACN,IAAA,CAAM,CAEL,UAAA,CAAYG,CAAAA,CAAO,QAAA,CACnB,WAAYA,CAAAA,CAAO,UAAA,CACnB,aAAcA,CAAAA,CAAO,YAAA,CAGrB,QAASC,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAWA,CAAAA,CAAQ,SAAA,CACnB,WAAA,CAAaoB,EACb,GAAA,CAAKpB,CAAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,EAAK,MAAA,CACpC,IAAKA,CAAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,EAAK,MAAA,CACpC,IAAA,CAAMA,EAAQ,YAAA,CAAa,MAAM,CAAA,EAAK,MAAA,CACtC,MAAA,CAAQA,CAAAA,CAAQ,aAAa,QAAQ,CAAA,EAAK,MAAA,CAC1C,GAAA,CAAKA,CAAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,EAAK,MAAA,CACpC,cAAA,CAAgB,IAAA,CAAK,iBAAA,CAAkBA,CAAO,CAC/C,CACD,CAAA,CAGA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAYJ,CAAAA,CAAM,GAAG,EACpC,CAMQ,yBAAA,EAA4B,CACnC,IAAMC,CAAAA,CAAc,SAAS,gBAAA,CAAiB,GAAG,CAAA,CAC3CwB,CAAAA,CAWD,EAAC,CAEN,QAAWvB,CAAAA,IAAMD,CAAAA,CAAa,CAE7B,GAAKC,CAAAA,CAAmB,SAAA,EAAW,SAAS,wBAAwB,CAAA,EAC/DA,CAAAA,CAAmB,SAAA,EAAW,QAAA,CAAS,oBAAoB,EAC/D,SAGD,IAAMC,CAAAA,CAAS,IAAA,CAAK,mBAAA,CAAoBD,CAAiB,EACzD,GAAI,CAACC,CAAAA,CAAQ,SAEb,IAAMC,CAAAA,CAAUF,EAGZwB,CAAAA,CAAgBtB,CAAAA,CACpB,GAAIA,CAAAA,CAAQ,OAAA,GAAY,KAAA,CAAO,CAC9B,IAAMuB,CAAAA,CAAWvB,CAAAA,CAAQ,aAAA,CAAc,KAAK,CAAA,CACxCuB,IACHD,CAAAA,CAAgBC,CAAAA,EAElB,CAEA,IAAMC,CAAAA,CAAc,IAAA,CAAK,qBAAqBxB,CAAO,CAAA,CAGjD3E,CAAAA,CAAY,EAAA,CACZ2E,CAAAA,CAAQ,SAAA,GAEP,OAAOA,CAAAA,CAAQ,SAAA,EAAc,QAAA,CAChC3E,CAAAA,CAAY2E,CAAAA,CAAQ,SAAA,CACV,YAAaA,CAAAA,CAAQ,SAAA,GAC/B3E,CAAAA,CAAa2E,CAAAA,CAAQ,SAAA,CAAkC,OAAA,CAAA,CAAA,CAIzDqB,EAAc,IAAA,CAAK,CAClB,UAAA,CAAYtB,CAAAA,CAAO,QAAA,CACnB,UAAA,CAAYA,EAAO,UAAA,CACnB,YAAA,CAAcA,CAAAA,CAAO,YAAA,CACrB,SAAA,CAAA1E,CAAAA,CACA,YAAAmG,CAAAA,CACA,GAAA,CAAKF,CAAAA,CAAc,YAAA,CAAa,KAAK,CAAA,EAAK,OAC1C,GAAA,CAAKA,CAAAA,CAAc,YAAA,CAAa,KAAK,CAAA,EAAK,MAAA,CAC1C,KAAMtB,CAAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,EAAK,MAAA,CACtC,MAAA,CAAQA,EAAQ,YAAA,CAAa,QAAQ,CAAA,EAAK,MAAA,CAC1C,GAAA,CAAKA,CAAAA,CAAQ,aAAa,KAAK,CAAA,EAAK,MACrC,CAAC,EACF,CAGA,OAAO,MAAA,CAAO,WAAA,CAAY,CACzB,IAAA,CAAM,uBAAA,CACN,IAAA,CAAMqB,CACP,CAAA,CAAG,GAAG,EACP,CAMQ,mBAAA,CAAoBI,CAAAA,CAA4B,CACvD,GAAM,CAAE,UAAA,CAAAC,CAAAA,CAAY,UAAA,CAAAC,CAAAA,CAAY,aAAAC,CAAAA,CAAc,OAAA,CAAAC,CAAQ,CAAA,CAAIJ,CAAAA,CAE1D,GAAI,CAACC,CAAAA,EAAc,CAACC,CAAAA,EAAc,CAACE,CAAAA,CAClC,OAID,IAAMhC,CAAAA,CAAc,QAAA,CAAS,iBAAiB,GAAG,CAAA,CAEjD,QAAWC,CAAAA,IAAMD,CAAAA,CAAa,CAC7B,IAAME,CAAAA,CAAS,IAAA,CAAK,oBAAoBD,CAAiB,CAAA,CACzD,GAAIC,CAAAA,EAAQ,QAAA,GAAa2B,CAAAA,EACrB3B,GAAQ,UAAA,GAAe4B,CAAAA,EACvB5B,CAAAA,EAAQ,YAAA,GAAiB6B,CAAAA,CAAc,CAE1C,IAAI5B,CAAAA,CAAUF,CAAAA,CAId,GAAA,CAAK+B,CAAAA,CAAQ,GAAA,GAAQ,MAAA,EAAaA,EAAQ,GAAA,GAAQ,MAAA,GAAc7B,CAAAA,CAAQ,OAAA,GAAY,KAAA,CAAO,CAC1F,IAAMuB,CAAAA,CAAWvB,CAAAA,CAAQ,aAAA,CAAc,KAAK,CAAA,CACxCuB,CAAAA,GACHvB,EAAUuB,CAAAA,EAEZ,CAYA,GATIM,CAAAA,CAAQ,SAAA,GAAc,MAAA,GAEP1C,GAAqB,CAC7B,eAAA,CAAgB0C,CAAAA,CAAQ,SAAS,CAAA,CAG3C7B,CAAAA,CAAQ,UAAY6B,CAAAA,CAAQ,SAAA,CAAA,CAGzBA,CAAAA,CAAQ,WAAA,GAAgB,MAAA,CAAW,CAEtC,IAAMC,CAAAA,CAAW,KAAA,CAAM,IAAA,CAAK9B,CAAAA,CAAQ,UAAU,CAAA,CAAE,KAC/CM,CAAAA,EAAQA,CAAAA,CAAK,QAAA,GAAa,IAAA,CAAK,SAChC,CAAA,CACIwB,EACHA,CAAAA,CAAS,WAAA,CAAcD,CAAAA,CAAQ,WAAA,CAE/B7B,CAAAA,CAAQ,WAAA,CAAc6B,EAAQ,YAEhC,CAEIA,CAAAA,CAAQ,GAAA,GAAQ,MAAA,EAAa,KAAA,GAAS7B,IAEzCA,CAAAA,CAAQ,YAAA,CAAa,KAAA,CAAO6B,CAAAA,CAAQ,GAAG,CAAA,CAEnC7B,EAAQ,YAAA,CAAa,QAAQ,CAAA,EAChCA,CAAAA,CAAQ,eAAA,CAAgB,QAAQ,GAI9B6B,CAAAA,CAAQ,GAAA,GAAQ,MAAA,EAAa,KAAA,GAAS7B,CAAAA,GACxCA,CAAAA,CAA6B,IAAM6B,CAAAA,CAAQ,GAAA,CAAA,CAGzCA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAa,MAAA,GAAU7B,GAC3CA,CAAAA,CAAQ,YAAA,CAAa,MAAA,CAAQ6B,CAAAA,CAAQ,IAAI,CAAA,CAGtCA,EAAQ,MAAA,GAAW,MAAA,EAAa,QAAA,GAAY7B,CAAAA,EAC/CA,CAAAA,CAAQ,YAAA,CAAa,SAAU6B,CAAAA,CAAQ,MAAM,CAAA,CAG1CA,CAAAA,CAAQ,GAAA,GAAQ,MAAA,EAAa,QAAS7B,CAAAA,EACzCA,CAAAA,CAAQ,YAAA,CAAa,KAAA,CAAO6B,CAAAA,CAAQ,GAAG,EAIpC7B,CAAAA,GAAY,IAAA,CAAK,cAAA,EACpB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,aAAcA,CAAO,CAAA,CAElDA,CAAAA,GAAY,IAAA,CAAK,eAAA,GACpB,IAAA,CAAK,sBAAsB,IAAA,CAAK,gBAAA,CAAkBA,CAAO,CAAA,CACzD,IAAA,CAAK,cAAA,CAAeA,CAAO,CAAA,CAAA,CAG5B,MACD,CACD,CACD,CAOQ,iBAAA,CAAkB+B,EAGvB,CACF,GAAI,CAACA,CAAAA,CAAO,OAGZ,IAAIC,EAAU,QAAA,CAAS,cAAA,CAAe,sBAAsB,CAAA,CACvDA,CAAAA,GACJA,CAAAA,CAAU,SAAS,aAAA,CAAc,OAAO,CAAA,CACxCA,CAAAA,CAAQ,EAAA,CAAK,sBAAA,CACb,SAAS,IAAA,CAAK,WAAA,CAAYA,CAAO,CAAA,CAAA,CAIlC,IAAI/F,CAAAA,CAAM,GAGV,GAAI8F,CAAAA,CAAM,cAAA,EAAkB,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAM,cAAc,CAAA,CAAE,MAAA,CAAS,CAAA,CAAG,CACzE9F,CAAAA,EAAO,CAAA;AAAA,CAAA,CACP,IAAA,GAAW,CAACkE,CAAAA,CAAK7C,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQyE,CAAAA,CAAM,cAAc,CAAA,CAC7D9F,CAAAA,EAAO,CAAA,EAAA,EAAKkE,CAAG,KAAK7C,CAAK,CAAA;AAAA,CAAA,CAE1BrB,CAAAA,EAAO,CAAA;;AAAA,EACR,CAGA,GAAI8F,CAAAA,CAAM,aAAA,EAAiB,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAM,aAAa,CAAA,CAAE,MAAA,CAAS,CAAA,CAAG,CACvE9F,CAAAA,EAAO,CAAA;AAAA,CAAA,CACP,IAAA,GAAW,CAACkE,CAAAA,CAAK7C,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQyE,CAAAA,CAAM,aAAa,CAAA,CAC5D9F,CAAAA,EAAO,CAAA,EAAA,EAAKkE,CAAG,KAAK7C,CAAK,CAAA;AAAA,CAAA,CAE1BrB,CAAAA,EAAO,CAAA;AAAA,EACR,CAGA+F,CAAAA,CAAQ,WAAA,CAAc/F,EACvB,CACD,CAAA,CAGI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,QAAA,CAAa,GAAA,EAAA,CAEvD,SAAY,CACZ,GAAI,CAEH,IAAMgG,CAAAA,CAAiB,MAAM,KAAA,CAAM,uCAAuC,CAAA,CAC1E,GAAIA,CAAAA,CAAe,EAAA,CAAI,CACtB,IAAM9G,CAAAA,CAAS,MAAM8G,CAAAA,CAAe,IAAA,EAAK,CAExC,MAAA,CAAe,4BAAA,CAA+B9G,CAAAA,CAC/C,OAAA,CAAQ,GAAA,CAAI,gDAAgD,EAC7D,CAAA,KACC,OAAA,CAAQ,IAAA,CAAK,wEAAwE,CAAA,CACpF,MAAA,CAAe,6BAA+B,GAEjD,CAAA,MAAS+G,CAAAA,CAAO,CACf,OAAA,CAAQ,IAAA,CAAK,8CAAA,CAAgDA,CAAK,CAAA,CACjE,MAAA,CAAe,4BAAA,CAA+B,GAChD,CAGA,IAAI9C,EACL,CAAA,GAAG","file":"overlay.js","sourcesContent":["/**\n * Client-side Tailwind CSS Generator\n *\n * Generates CSS for Tailwind classes at runtime using the resolved Tailwind config.\n * This allows design mode to support any Tailwind class without build-time compilation.\n *\n * Based on Lovable's approach: \"a client-side Tailwind generator that intelligently\n * reads custom configurations\"\n */\n\ntype TailwindConfig = any; // Generated config structure is dynamic\n\nexport class TailwindCSSGenerator {\n\tprivate config: TailwindConfig;\n\tprivate generatedStyles = new Set<string>();\n\tprivate styleElement: HTMLStyleElement | null = null;\n\n\tconstructor(config?: TailwindConfig) {\n\t\t// Load config dynamically - will be imported by the overlay\n\t\tif (config) {\n\t\t\tthis.config = config;\n\t\t} else {\n\t\t\t// @ts-expect-error - Config is generated at build time by Vite plugin\n\t\t\tthis.config = (window as any).__FIREBUZZ_TAILWIND_CONFIG__ || {};\n\t\t}\n\t\tthis.initStyleElement();\n\t\tconsole.log(\"[Tailwind Generator] Initialized with config:\", {\n\t\t\tcolors: Object.keys((this.config.theme?.colors as Record<string, any>) || {}).length,\n\t\t\tspacing: Object.keys((this.config.theme?.spacing as Record<string, any>) || {}).length,\n\t\t});\n\t}\n\n\t/**\n\t * Initialize a <style> element to inject generated CSS\n\t */\n\tprivate initStyleElement() {\n\t\t// Check if style element already exists (shouldn't happen with singleton, but safety check)\n\t\tconst existing = document.getElementById(\"fb-runtime-tailwind\");\n\t\tif (existing) {\n\t\t\tconsole.warn(\"[Tailwind Generator] Style element already exists, reusing it\");\n\t\t\tthis.styleElement = existing as HTMLStyleElement;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.styleElement = document.createElement(\"style\");\n\t\tthis.styleElement.id = \"fb-runtime-tailwind\";\n\t\tthis.styleElement.setAttribute(\"data-source\", \"firebuzz-design-mode\");\n\t\tdocument.head.appendChild(this.styleElement);\n\t\tconsole.log(\"[Tailwind Generator] Created <style> element in <head>\");\n\t}\n\n\t/**\n\t * Check if a CSS class already has styles in the built Tailwind CSS\n\t * Uses a simple heuristic: create a test element and check if it has the expected styles\n\t */\n\tprivate classExistsInStylesheet(className: string): boolean {\n\t\ttry {\n\t\t\t// Create a hidden test element\n\t\t\tconst testDiv = document.createElement(\"div\");\n\t\t\ttestDiv.className = className;\n\t\t\ttestDiv.style.cssText = \"position:absolute;top:-9999px;left:-9999px;visibility:hidden;\";\n\t\t\tdocument.body.appendChild(testDiv);\n\n\t\t\t// Get computed styles\n\t\t\tconst computed = window.getComputedStyle(testDiv);\n\n\t\t\t// Check if the class has any non-default styles applied\n\t\t\tlet hasStyles = false;\n\n\t\t\t// Background color classes\n\t\t\tif (className.startsWith(\"bg-\") && computed.backgroundColor !== \"rgba(0, 0, 0, 0)\") {\n\t\t\t\thasStyles = true;\n\t\t\t}\n\t\t\t// Text color classes\n\t\t\telse if (className.startsWith(\"text-\") && !className.match(/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/)) {\n\t\t\t\tconst defaultColor = window.getComputedStyle(document.body).color;\n\t\t\t\tif (computed.color !== defaultColor && computed.color !== \"rgb(0, 0, 0)\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Font size classes\n\t\t\telse if (className.match(/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/)) {\n\t\t\t\t// Check if font-size is different from body default\n\t\t\t\tconst defaultFontSize = window.getComputedStyle(document.body).fontSize;\n\t\t\t\tif (computed.fontSize !== defaultFontSize) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Padding/margin classes\n\t\t\telse if (className.match(/^[pm][trblxy]?-/)) {\n\t\t\t\tconst prop = className[0] === \"p\" ? \"padding\" : \"margin\";\n\t\t\t\tconst side = className[1] === \"-\" ? \"Top\" : className[1].toUpperCase();\n\t\t\t\tconst propName = `${prop}${side === \"-\" ? \"Top\" : side}` as any;\n\t\t\t\tif (computed[propName] && computed[propName] !== \"0px\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Gap classes (gap, gap-x, gap-y)\n\t\t\telse if (className.startsWith(\"gap-\")) {\n\t\t\t\t// Check if gap/column-gap/row-gap is set\n\t\t\t\tif (computed.gap !== \"normal\" && computed.gap !== \"0px\" ||\n\t\t\t\t computed.columnGap !== \"normal\" && computed.columnGap !== \"0px\" ||\n\t\t\t\t computed.rowGap !== \"normal\" && computed.rowGap !== \"0px\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Space classes (space-x, space-y)\n\t\t\telse if (className.startsWith(\"space-\")) {\n\t\t\t\t// For space classes, check if any margin is applied\n\t\t\t\t// These apply margin to children, so harder to detect - default to not existing\n\t\t\t\thasStyles = false;\n\t\t\t}\n\t\t\t// Width/height classes\n\t\t\telse if (className.match(/^[wh]-/)) {\n\t\t\t\tconst prop = className[0] === \"w\" ? \"width\" : \"height\";\n\t\t\t\tif (computed[prop] !== \"auto\" && computed[prop] !== \"0px\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Display utilities\n\t\t\telse if ([\"flex\", \"inline-flex\", \"grid\", \"inline-grid\", \"block\", \"inline-block\", \"hidden\"].includes(className)) {\n\t\t\t\tconst expectedDisplay = className === \"hidden\" ? \"none\" : className.replace(\"inline-\", \"inline-\").replace(\"-\", \"\");\n\t\t\t\tif (computed.display === expectedDisplay ||\n\t\t\t\t (className === \"flex\" && computed.display === \"flex\") ||\n\t\t\t\t (className === \"grid\" && computed.display === \"grid\") ||\n\t\t\t\t (className === \"block\" && computed.display === \"block\")) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Flex/grid layout utilities\n\t\t\telse if ([\"items-center\", \"items-start\", \"items-end\", \"justify-center\", \"justify-between\", \"justify-around\", \"flex-col\", \"flex-row\"].includes(className)) {\n\t\t\t\t// Check for corresponding CSS properties\n\t\t\t\tif (className.startsWith(\"items-\") && computed.alignItems !== \"normal\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t} else if (className.startsWith(\"justify-\") && computed.justifyContent !== \"normal\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t} else if (className.startsWith(\"flex-\") && computed.flexDirection !== \"row\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.body.removeChild(testDiv);\n\t\t\treturn hasStyles;\n\t\t} catch (e) {\n\t\t\t// If we can't check, assume it doesn't exist and generate it\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Generate CSS for a list of Tailwind classes\n\t * Only generates CSS for classes that don't already exist in stylesheets\n\t */\n\tpublic generateClasses(classNames: string): void {\n\t\tconst classes = classNames.split(/\\s+/).filter(Boolean);\n\n\t\tfor (const className of classes) {\n\t\t\t// Skip if we've already generated this class\n\t\t\tif (this.generatedStyles.has(className)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip if the class already exists in a stylesheet\n\t\t\tif (this.classExistsInStylesheet(className)) {\n\t\t\t\tconsole.log(`[Tailwind Generator] Skipping ${className} - already in stylesheet`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Generate CSS only for new/missing classes\n\t\t\tconst css = this.generateCSSForClass(className);\n\t\t\tif (css) {\n\t\t\t\tthis.appendCSS(css);\n\t\t\t\tthis.generatedStyles.add(className);\n\t\t\t\tconsole.log(`[Tailwind Generator] Generated CSS for new class: ${className}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate CSS for a single Tailwind class\n\t */\n\tprivate generateCSSForClass(className: string): string | null {\n\t\t// Handle responsive prefixes (sm:, md:, lg:, xl:, 2xl:)\n\t\tconst responsiveMatch = className.match(/^(sm|md|lg|xl|2xl):(.+)$/);\n\t\tif (responsiveMatch) {\n\t\t\tconst [, breakpoint, baseClass] = responsiveMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\tconst screens = (this.config.theme?.screens as Record<string, string>) || {};\n\t\t\tconst minWidth = screens[breakpoint];\n\t\t\tif (!minWidth) return null;\n\n\t\t\treturn `@media (min-width: ${minWidth}) { ${baseCss} }`;\n\t\t}\n\n\t\t// Handle state prefixes (hover:, focus:, active:, etc.)\n\t\tconst stateMatch = className.match(/^(hover|focus|active|disabled|focus-visible|focus-within|visited):(.+)$/);\n\t\tif (stateMatch) {\n\t\t\tconst [, state, baseClass] = stateMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\treturn baseCss.replace(/\\.([^\\s{]+)/, `.${className.replace(/:/g, \"\\\\:\")}:${state}`);\n\t\t}\n\n\t\t// Handle dark mode prefix\n\t\tconst darkMatch = className.match(/^dark:(.+)$/);\n\t\tif (darkMatch) {\n\t\t\tconst [, baseClass] = darkMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\treturn `.dark ${baseCss}`;\n\t\t}\n\n\t\treturn this.generateBaseCSS(className);\n\t}\n\n\t/**\n\t * Generate base CSS for a class (no prefixes)\n\t */\n\tprivate generateBaseCSS(className: string): string | null {\n\t\t// Background colors: bg-{color}-{shade}\n\t\tif (className.startsWith(\"bg-\")) {\n\t\t\treturn this.generateColorCSS(className, \"background-color\");\n\t\t}\n\n\t\t// Text colors: text-{color}-{shade}\n\t\tif (className.startsWith(\"text-\")) {\n\t\t\t// Check if it's a color or font size\n\t\t\tif (className.match(/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/)) {\n\t\t\t\treturn this.generateFontSizeCSS(className);\n\t\t\t}\n\t\t\treturn this.generateColorCSS(className, \"color\");\n\t\t}\n\n\t\t// Border colors: border-{color}-{shade}\n\t\tif (className.startsWith(\"border-\")) {\n\t\t\t// Check if it's a color, width, or style\n\t\t\tif (className.match(/^border-(\\d+|t|r|b|l|x|y)$/)) {\n\t\t\t\treturn this.generateBorderWidthCSS(className);\n\t\t\t}\n\t\t\t// Check for border styles\n\t\t\tif ([\"border-solid\", \"border-dashed\", \"border-dotted\", \"border-double\", \"border-none\"].includes(className)) {\n\t\t\t\tconst style = className.replace(\"border-\", \"\");\n\t\t\t\treturn `.${className} { border-style: ${style} }`;\n\t\t\t}\n\t\t\treturn this.generateColorCSS(className, \"border-color\");\n\t\t}\n\n\t\t// Padding: p-{size}, pt-{size}, pr-{size}, etc.\n\t\tif (className.match(/^p[trblxy]?-/)) {\n\t\t\treturn this.generateSpacingCSS(className, \"padding\");\n\t\t}\n\n\t\t// Margin: m-{size}, mt-{size}, mr-{size}, etc.\n\t\tif (className.match(/^m[trblxy]?-/)) {\n\t\t\treturn this.generateSpacingCSS(className, \"margin\");\n\t\t}\n\n\t\t// Width: w-{size}\n\t\tif (className.startsWith(\"w-\")) {\n\t\t\treturn this.generateSizeCSS(className, \"width\");\n\t\t}\n\n\t\t// Height: h-{size}\n\t\tif (className.startsWith(\"h-\")) {\n\t\t\treturn this.generateSizeCSS(className, \"height\");\n\t\t}\n\n\t\t// Font weight: font-{weight}\n\t\tif (className.startsWith(\"font-\")) {\n\t\t\treturn this.generateFontWeightCSS(className);\n\t\t}\n\n\t\t// Rounded: rounded-{size}\n\t\tif (className.startsWith(\"rounded\")) {\n\t\t\treturn this.generateBorderRadiusCSS(className);\n\t\t}\n\n\t\t// Flex, Grid, Display utilities\n\t\tif ([\"flex\", \"inline-flex\", \"grid\", \"inline-grid\", \"block\", \"inline-block\", \"hidden\"].includes(className)) {\n\t\t\treturn `.${className} { display: ${className.replace(\"inline-\", \"inline \").replace(\"-\", \" \")} }`;\n\t\t}\n\n\t\t// Gap: gap-{size}, gap-x-{size}, gap-y-{size}\n\t\tif (className.startsWith(\"gap-\")) {\n\t\t\treturn this.generateGapCSS(className);\n\t\t}\n\n\t\t// Space between: space-x-{size}, space-y-{size}\n\t\tif (className.startsWith(\"space-\")) {\n\t\t\treturn this.generateSpaceBetweenCSS(className);\n\t\t}\n\n\t\t// Flex direction utilities\n\t\tif (className === \"flex-row\") return \".flex-row { flex-direction: row }\";\n\t\tif (className === \"flex-row-reverse\") return \".flex-row-reverse { flex-direction: row-reverse }\";\n\t\tif (className === \"flex-col\") return \".flex-col { flex-direction: column }\";\n\t\tif (className === \"flex-col-reverse\") return \".flex-col-reverse { flex-direction: column-reverse }\";\n\n\t\t// Justify content utilities\n\t\tif (className === \"justify-start\") return \".justify-start { justify-content: flex-start }\";\n\t\tif (className === \"justify-center\") return \".justify-center { justify-content: center }\";\n\t\tif (className === \"justify-end\") return \".justify-end { justify-content: flex-end }\";\n\t\tif (className === \"justify-between\") return \".justify-between { justify-content: space-between }\";\n\t\tif (className === \"justify-around\") return \".justify-around { justify-content: space-around }\";\n\t\tif (className === \"justify-evenly\") return \".justify-evenly { justify-content: space-evenly }\";\n\n\t\t// Align items utilities\n\t\tif (className === \"items-start\") return \".items-start { align-items: flex-start }\";\n\t\tif (className === \"items-center\") return \".items-center { align-items: center }\";\n\t\tif (className === \"items-end\") return \".items-end { align-items: flex-end }\";\n\t\tif (className === \"items-baseline\") return \".items-baseline { align-items: baseline }\";\n\t\tif (className === \"items-stretch\") return \".items-stretch { align-items: stretch }\";\n\n\t\t// Text alignment utilities\n\t\tif (className === \"text-left\") return \".text-left { text-align: left }\";\n\t\tif (className === \"text-center\") return \".text-center { text-align: center }\";\n\t\tif (className === \"text-right\") return \".text-right { text-align: right }\";\n\t\tif (className === \"text-justify\") return \".text-justify { text-align: justify }\";\n\n\t\t// Text decoration utilities\n\t\tif (className === \"underline\") return \".underline { text-decoration-line: underline }\";\n\t\tif (className === \"overline\") return \".overline { text-decoration-line: overline }\";\n\t\tif (className === \"line-through\") return \".line-through { text-decoration-line: line-through }\";\n\t\tif (className === \"no-underline\") return \".no-underline { text-decoration-line: none }\";\n\n\t\t// Font style utilities\n\t\tif (className === \"italic\") return \".italic { font-style: italic }\";\n\t\tif (className === \"not-italic\") return \".not-italic { font-style: normal }\";\n\n\t\t// Line height utilities\n\t\tif (className.startsWith(\"leading-\")) {\n\t\t\treturn this.generateLineHeightCSS(className);\n\t\t}\n\n\t\t// Letter spacing utilities\n\t\tif (className.startsWith(\"tracking-\")) {\n\t\t\treturn this.generateLetterSpacingCSS(className);\n\t\t}\n\n\t\t// Grid columns: grid-cols-{number}\n\t\tif (className.startsWith(\"grid-cols-\")) {\n\t\t\treturn this.generateGridColumnsCSS(className);\n\t\t}\n\n\t\t// Grid rows: grid-rows-{number}\n\t\tif (className.startsWith(\"grid-rows-\")) {\n\t\t\treturn this.generateGridRowsCSS(className);\n\t\t}\n\n\t\t// Opacity: opacity-{value}\n\t\tif (className.startsWith(\"opacity-\")) {\n\t\t\treturn this.generateOpacityCSS(className);\n\t\t}\n\n\t\t// Shadow: shadow-{size}\n\t\tif (className.startsWith(\"shadow\")) {\n\t\t\treturn this.generateShadowCSS(className);\n\t\t}\n\n\t\t// If we can't generate CSS, return null\n\t\tconsole.warn(`[Tailwind Generator] Cannot generate CSS for class: ${className}`);\n\t\treturn null;\n\t}\n\n\tprivate generateColorCSS(className: string, property: string): string | null {\n\t\tconst colors = (this.config.theme?.colors as Record<string, any>) || {};\n\n\t\t// Extract color and shade from class name\n\t\t// e.g., \"bg-blue-500\" -> property=\"background\", color=\"blue\", shade=\"500\"\n\t\tconst prefix = property === \"background-color\" ? \"bg-\" :\n\t\t property === \"color\" ? \"text-\" :\n\t\t \"border-\";\n\n\t\tconst colorPart = className.slice(prefix.length);\n\t\tconst parts = colorPart.split(\"-\");\n\n\t\tif (parts.length === 1) {\n\t\t\t// Simple color like \"bg-black\"\n\t\t\tconst colorValue = colors[parts[0]];\n\t\t\tif (typeof colorValue === \"string\") {\n\t\t\t\treturn `.${className} { ${property}: ${colorValue} }`;\n\t\t\t}\n\t\t} else if (parts.length === 2) {\n\t\t\t// Color with shade like \"bg-blue-500\"\n\t\t\tconst [colorName, shade] = parts;\n\t\t\tconst colorValue = colors[colorName]?.[shade];\n\t\t\tif (colorValue) {\n\t\t\t\treturn `.${className} { ${property}: ${colorValue} }`;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateSpacingCSS(className: string, type: \"padding\" | \"margin\"): string | null {\n\t\tconst spacing = (this.config.theme?.spacing as Record<string, string>) || {};\n\t\tconst prefix = type === \"padding\" ? \"p\" : \"m\";\n\n\t\t// Extract direction and value\n\t\t// e.g., \"pt-4\" -> direction=\"t\", value=\"4\"\n\t\tconst match = className.match(new RegExp(`^${prefix}([trblxy])?-(.+)$`));\n\t\tif (!match) return null;\n\n\t\tconst [, direction, value] = match;\n\t\tconst spacingValue = spacing[value];\n\t\tif (!spacingValue) return null;\n\n\t\tconst properties: string[] = [];\n\t\tif (!direction) {\n\t\t\tproperties.push(`${type}: ${spacingValue}`);\n\t\t} else if (direction === \"x\") {\n\t\t\tproperties.push(`${type}-left: ${spacingValue}`, `${type}-right: ${spacingValue}`);\n\t\t} else if (direction === \"y\") {\n\t\t\tproperties.push(`${type}-top: ${spacingValue}`, `${type}-bottom: ${spacingValue}`);\n\t\t} else {\n\t\t\tconst dirMap: Record<string, string> = { t: \"top\", r: \"right\", b: \"bottom\", l: \"left\" };\n\t\t\tproperties.push(`${type}-${dirMap[direction]}: ${spacingValue}`);\n\t\t}\n\n\t\treturn `.${className} { ${properties.join(\"; \")} }`;\n\t}\n\n\tprivate generateSizeCSS(className: string, property: \"width\" | \"height\"): string | null {\n\t\tconst spacing = (this.config.theme?.spacing as Record<string, string>) || {};\n\t\tconst prefix = property === \"width\" ? \"w-\" : \"h-\";\n\t\tconst value = className.slice(prefix.length);\n\n\t\t// Handle special values\n\t\tif (value === \"full\") return `.${className} { ${property}: 100% }`;\n\t\tif (value === \"screen\") return `.${className} { ${property}: 100v${property[0]} }`;\n\t\tif (value === \"auto\") return `.${className} { ${property}: auto }`;\n\t\tif (value === \"min\") return `.${className} { ${property}: min-content }`;\n\t\tif (value === \"max\") return `.${className} { ${property}: max-content }`;\n\t\tif (value === \"fit\") return `.${className} { ${property}: fit-content }`;\n\n\t\t// Use spacing scale\n\t\tconst sizeValue = spacing[value];\n\t\tif (sizeValue) {\n\t\t\treturn `.${className} { ${property}: ${sizeValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateFontSizeCSS(className: string): string | null {\n\t\tconst fontSize = (this.config.theme?.fontSize as Record<string, any>) || {};\n\t\tconst size = className.slice(\"text-\".length);\n\t\tconst fontSizeValue = fontSize[size];\n\n\t\tif (Array.isArray(fontSizeValue)) {\n\t\t\tconst [fSize, { lineHeight }] = fontSizeValue;\n\t\t\treturn `.${className} { font-size: ${fSize}; line-height: ${lineHeight} }`;\n\t\t}\n\t\tif (typeof fontSizeValue === \"string\") {\n\t\t\treturn `.${className} { font-size: ${fontSizeValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateFontWeightCSS(className: string): string | null {\n\t\tconst fontWeight = (this.config.theme?.fontWeight as Record<string, string>) || {};\n\t\tconst weight = className.slice(\"font-\".length);\n\t\tconst weightValue = fontWeight[weight];\n\n\t\tif (weightValue) {\n\t\t\treturn `.${className} { font-weight: ${weightValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateBorderRadiusCSS(className: string): string | null {\n\t\tconst borderRadius = (this.config.theme?.borderRadius as Record<string, string>) || {};\n\n\t\t// Handle \"rounded\" (no suffix)\n\t\tif (className === \"rounded\") {\n\t\t\tconst value = borderRadius.DEFAULT || borderRadius[\"\"];\n\t\t\tif (value) return `.rounded { border-radius: ${value} }`;\n\t\t}\n\n\t\t// Handle \"rounded-{size}\"\n\t\tconst size = className.slice(\"rounded-\".length);\n\t\tconst radiusValue = borderRadius[size];\n\t\tif (radiusValue) {\n\t\t\treturn `.${className} { border-radius: ${radiusValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateBorderWidthCSS(className: string): string | null {\n\t\tconst borderWidth = (this.config.theme?.borderWidth as Record<string, string>) || {};\n\n\t\t// Handle \"border\" (default width)\n\t\tif (className === \"border\") {\n\t\t\tconst value = borderWidth.DEFAULT || \"1px\";\n\t\t\treturn `.border { border-width: ${value} }`;\n\t\t}\n\n\t\t// Handle directional borders: border-t, border-r, border-b, border-l\n\t\tconst dirMatch = className.match(/^border-([trbl])$/);\n\t\tif (dirMatch) {\n\t\t\tconst dirMap: Record<string, string> = { t: \"top\", r: \"right\", b: \"bottom\", l: \"left\" };\n\t\t\tconst value = borderWidth.DEFAULT || \"1px\";\n\t\t\treturn `.${className} { border-${dirMap[dirMatch[1]]}-width: ${value} }`;\n\t\t}\n\n\t\t// Handle border-{width}\n\t\tconst widthMatch = className.match(/^border-(\\d+)$/);\n\t\tif (widthMatch) {\n\t\t\tconst value = borderWidth[widthMatch[1]];\n\t\t\tif (value) {\n\t\t\t\treturn `.${className} { border-width: ${value} }`;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGapCSS(className: string): string | null {\n\t\tconst spacing = (this.config.theme?.spacing as Record<string, string>) || {};\n\n\t\t// Handle gap-x-{size}\n\t\tif (className.startsWith(\"gap-x-\")) {\n\t\t\tconst value = className.slice(\"gap-x-\".length);\n\t\t\tconst gapValue = spacing[value];\n\t\t\tif (gapValue) {\n\t\t\t\treturn `.${className} { column-gap: ${gapValue} }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle gap-y-{size}\n\t\tif (className.startsWith(\"gap-y-\")) {\n\t\t\tconst value = className.slice(\"gap-y-\".length);\n\t\t\tconst gapValue = spacing[value];\n\t\t\tif (gapValue) {\n\t\t\t\treturn `.${className} { row-gap: ${gapValue} }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle gap-{size}\n\t\tconst value = className.slice(\"gap-\".length);\n\t\tconst gapValue = spacing[value];\n\t\tif (gapValue) {\n\t\t\treturn `.${className} { gap: ${gapValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Generate CSS for space-between utilities (space-x, space-y)\n\t * These use margin and the child combinator selector\n\t */\n\tprivate generateSpaceBetweenCSS(className: string): string | null {\n\t\tconst spacing = (this.config.theme?.spacing as Record<string, string>) || {};\n\n\t\t// Handle space-x-{size}\n\t\tif (className.startsWith(\"space-x-\")) {\n\t\t\tconst value = className.slice(\"space-x-\".length);\n\t\t\tconst spaceValue = spacing[value];\n\t\t\tif (spaceValue) {\n\t\t\t\t// space-x uses margin-left on all children except first\n\t\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(${spaceValue} * var(--tw-space-x-reverse)); margin-left: calc(${spaceValue} * calc(1 - var(--tw-space-x-reverse))) }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle space-y-{size}\n\t\tif (className.startsWith(\"space-y-\")) {\n\t\t\tconst value = className.slice(\"space-y-\".length);\n\t\t\tconst spaceValue = spacing[value];\n\t\t\tif (spaceValue) {\n\t\t\t\t// space-y uses margin-top on all children except first\n\t\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(${spaceValue} * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(${spaceValue} * var(--tw-space-y-reverse)) }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle space-x-reverse and space-y-reverse\n\t\tif (className === \"space-x-reverse\") {\n\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 1 }`;\n\t\t}\n\t\tif (className === \"space-y-reverse\") {\n\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 1 }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateLineHeightCSS(className: string): string | null {\n\t\tconst lineHeight = (this.config.theme?.lineHeight as Record<string, string>) || {};\n\t\tconst value = className.slice(\"leading-\".length);\n\t\tconst lineHeightValue = lineHeight[value];\n\n\t\tif (lineHeightValue) {\n\t\t\treturn `.${className} { line-height: ${lineHeightValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateLetterSpacingCSS(className: string): string | null {\n\t\tconst letterSpacing = (this.config.theme?.letterSpacing as Record<string, string>) || {};\n\t\tconst value = className.slice(\"tracking-\".length);\n\t\tconst letterSpacingValue = letterSpacing[value];\n\n\t\tif (letterSpacingValue) {\n\t\t\treturn `.${className} { letter-spacing: ${letterSpacingValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGridColumnsCSS(className: string): string | null {\n\t\tconst value = className.slice(\"grid-cols-\".length);\n\n\t\tif (value === \"none\") {\n\t\t\treturn `.${className} { grid-template-columns: none }`;\n\t\t}\n\t\tif (value === \"subgrid\") {\n\t\t\treturn `.${className} { grid-template-columns: subgrid }`;\n\t\t}\n\n\t\tconst numCols = Number.parseInt(value, 10);\n\t\tif (!Number.isNaN(numCols) && numCols >= 1 && numCols <= 12) {\n\t\t\treturn `.${className} { grid-template-columns: repeat(${numCols}, minmax(0, 1fr)) }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGridRowsCSS(className: string): string | null {\n\t\tconst value = className.slice(\"grid-rows-\".length);\n\n\t\tif (value === \"none\") {\n\t\t\treturn `.${className} { grid-template-rows: none }`;\n\t\t}\n\t\tif (value === \"subgrid\") {\n\t\t\treturn `.${className} { grid-template-rows: subgrid }`;\n\t\t}\n\n\t\tconst numRows = Number.parseInt(value, 10);\n\t\tif (!Number.isNaN(numRows) && numRows >= 1 && numRows <= 6) {\n\t\t\treturn `.${className} { grid-template-rows: repeat(${numRows}, minmax(0, 1fr)) }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateOpacityCSS(className: string): string | null {\n\t\tconst value = className.slice(\"opacity-\".length);\n\t\tconst numValue = Number.parseInt(value, 10);\n\n\t\tif (!Number.isNaN(numValue) && numValue >= 0 && numValue <= 100) {\n\t\t\treturn `.${className} { opacity: ${numValue / 100} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateShadowCSS(className: string): string | null {\n\t\tconst shadows = (this.config.theme?.boxShadow as Record<string, string>) || {};\n\n\t\t// Handle \"shadow\" (default)\n\t\tif (className === \"shadow\") {\n\t\t\tconst value = shadows.DEFAULT || shadows[\"\"];\n\t\t\tif (value) return `.shadow { box-shadow: ${value} }`;\n\t\t}\n\n\t\t// Handle \"shadow-{size}\"\n\t\tconst size = className.slice(\"shadow-\".length);\n\t\tconst shadowValue = shadows[size];\n\t\tif (shadowValue) {\n\t\t\treturn `.${className} { box-shadow: ${shadowValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Append generated CSS to the style element\n\t */\n\tprivate appendCSS(css: string) {\n\t\tif (this.styleElement) {\n\t\t\tthis.styleElement.textContent += `\\n${css}`;\n\t\t}\n\t}\n\n\t/**\n\t * Clear all generated styles\n\t */\n\tpublic clear() {\n\t\tthis.generatedStyles.clear();\n\t\tif (this.styleElement) {\n\t\t\tthis.styleElement.textContent = \"\";\n\t\t}\n\t}\n}\n\n// Singleton instance\nlet generator: TailwindCSSGenerator | null = null;\n\nexport function getTailwindGenerator(): TailwindCSSGenerator {\n\tif (!generator) {\n\t\tgenerator = new TailwindCSSGenerator();\n\t}\n\treturn generator;\n}\n","/**\n * Design Mode Overlay Script\n * Injected into the preview iframe to enable element selection\n *\n * Uses React Fiber's _debugSource to track element source locations at runtime.\n * No build-time tagging required - everything is resolved from React's internal data.\n *\n * Includes client-side Tailwind CSS generation for runtime class support.\n */\n\nimport { getTailwindGenerator } from \"./tailwind-generator\";\nimport type { DesignModeMessage, ElementSelectedMessage, SourceLocation } from \"./types\";\n\n// Type for React Fiber internal structure\ninterface ReactFiber {\n\t_debugSource?: {\n\t\tfileName: string;\n\t\tlineNumber: number;\n\t\tcolumnNumber?: number;\n\t};\n\ttype?: string | { displayName?: string; name?: string };\n\treturn?: ReactFiber;\n}\n\n// Type for HTMLElement with React Fiber attached\ninterface HTMLElementWithFiber extends HTMLElement {\n\t[key: string]: unknown;\n}\n\nclass DesignModeOverlay {\n\tprivate isEnabled = false;\n\tprivate selectedElement: HTMLElement | null = null;\n\tprivate hoveredElement: HTMLElement | null = null;\n\n\t// Separate overlays for different states\n\tprivate hoverOverlay: HTMLDivElement;\n\tprivate selectionOverlay: HTMLDivElement;\n\tprivate selectionTagLabel: HTMLDivElement;\n\tprivate childrenOverlays: HTMLDivElement[] = [];\n\tprivate resizeObserver: ResizeObserver | null = null;\n\n\tconstructor() {\n\t\t// Create persistent overlay elements\n\t\tthis.hoverOverlay = this.createOverlay(\"2px solid #3b82f6\", 999991);\n\t\tthis.selectionOverlay = this.createOverlay(\"1px solid #3b82f6\", 999990);\n\t\tthis.selectionTagLabel = this.createTagLabel();\n\n\t\tthis.listen();\n\t\tthis.setupResizeObserver();\n\t}\n\n\tprivate createOverlay(border: string, zIndex: number): HTMLDivElement {\n\t\tconst overlay = document.createElement(\"div\");\n\t\toverlay.className = \"fb-design-mode-overlay\";\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tborder,\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: String(zIndex),\n\t\t\tdisplay: \"none\",\n\t\t\tboxShadow: \"0 0 0 1px rgba(59, 130, 246, 0.2)\",\n\t\t\ttransition: \"all 0.1s ease-out\",\n\t\t});\n\t\tdocument.body.appendChild(overlay);\n\t\treturn overlay;\n\t}\n\n\tprivate createChildOverlay(): HTMLDivElement {\n\t\tconst overlay = document.createElement(\"div\");\n\t\toverlay.className = \"fb-design-mode-overlay fb-child-overlay\";\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tborder: \"1px dashed rgba(59, 130, 246, 0.4)\",\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: \"999989\",\n\t\t\tdisplay: \"none\",\n\t\t\tboxShadow: \"0 0 0 1px rgba(59, 130, 246, 0.1)\",\n\t\t\ttransition: \"all 0.1s ease-out\",\n\t\t});\n\t\tdocument.body.appendChild(overlay);\n\t\treturn overlay;\n\t}\n\n\tprivate createTagLabel(): HTMLDivElement {\n\t\tconst label = document.createElement(\"div\");\n\t\tlabel.className = \"fb-design-mode-tag\";\n\t\tObject.assign(label.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tbackground: \"#3b82f6\",\n\t\t\tcolor: \"white\",\n\t\t\tpadding: \"2px 6px\",\n\t\t\tfontSize: \"11px\",\n\t\t\tfontFamily: \"monospace\",\n\t\t\tfontWeight: \"500\",\n\t\t\tborderRadius: \"0 0 4px 0\",\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: \"999999\",\n\t\t\tdisplay: \"none\",\n\t\t});\n\t\tdocument.body.appendChild(label);\n\t\treturn label;\n\t}\n\n\tprivate listen() {\n\t\twindow.addEventListener(\"message\", (e: MessageEvent<DesignModeMessage>) => {\n\t\t\tif (e.data.type === \"ENABLE_DESIGN_MODE\") {\n\t\t\t\tthis.enable();\n\t\t\t} else if (e.data.type === \"DISABLE_DESIGN_MODE\") {\n\t\t\t\tthis.disable();\n\t\t\t} else if (e.data.type === \"FB_UPDATE_ELEMENT\") {\n\t\t\t\tthis.handleUpdateElement(e.data);\n\t\t\t} else if (e.data.type === \"FB_GET_ALL_ELEMENTS_STATE\") {\n\t\t\t\tthis.handleGetAllElementsState();\n\t\t\t} else if (e.data.type === \"FB_UPDATE_THEME\") {\n\t\t\t\tthis.handleUpdateTheme(e.data.theme);\n\t\t\t} else if (e.data.type === \"FB_DESELECT_ELEMENT\") {\n\t\t\t\tthis.deselectElement();\n\t\t\t} else if (e.data.type === \"FB_SELECT_ELEMENT\") {\n\t\t\t\tthis.handleSelectElement(e.data);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setupResizeObserver() {\n\t\t// Listen for window resize and scroll events\n\t\twindow.addEventListener(\"resize\", this.updateOverlayPositions);\n\t\twindow.addEventListener(\"scroll\", this.updateOverlayPositions, true);\n\n\t\t// Use ResizeObserver to detect when elements change size\n\t\tthis.resizeObserver = new ResizeObserver(() => {\n\t\t\tthis.updateOverlayPositions();\n\t\t});\n\n\t\t// Observe the document body for any size changes\n\t\tthis.resizeObserver.observe(document.body);\n\t}\n\n\tprivate updateOverlayPositions = () => {\n\t\t// Update selected element overlay\n\t\tif (this.selectedElement && this.selectionOverlay.style.display !== \"none\") {\n\t\t\tthis.updateOverlayPosition(this.selectionOverlay, this.selectedElement);\n\t\t\tthis.updateTagLabel(this.selectedElement);\n\t\t}\n\n\t\t// Update hovered element overlay\n\t\tif (this.hoveredElement && this.hoverOverlay.style.display !== \"none\") {\n\t\t\tthis.updateOverlayPosition(this.hoverOverlay, this.hoveredElement);\n\t\t}\n\n\t\t// Update children overlays\n\t\tfor (const overlay of this.childrenOverlays) {\n\t\t\tif (overlay.style.display !== \"none\" && this.hoveredElement) {\n\t\t\t\t// Find the corresponding child element\n\t\t\t\tconst children = Array.from(this.hoveredElement.children).filter(child => {\n\t\t\t\t\tconst source = this.getReactFiberSource(child as HTMLElement);\n\t\t\t\t\treturn source !== null;\n\t\t\t\t}) as HTMLElement[];\n\n\t\t\t\tconst index = this.childrenOverlays.indexOf(overlay);\n\t\t\t\tconst child = children[index];\n\t\t\t\tif (child) {\n\t\t\t\t\tthis.updateOverlayPosition(overlay, child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tenable() {\n\t\tif (this.isEnabled) return;\n\t\tthis.isEnabled = true;\n\n\t\tdocument.addEventListener(\"mousemove\", this.handleMouseMove);\n\t\tdocument.addEventListener(\"click\", this.handleClick, true);\n\t\tdocument.addEventListener(\"mouseleave\", this.handleMouseLeave);\n\n\t\t// Add cursor style\n\t\tdocument.body.style.cursor = \"crosshair\";\n\t}\n\n\tdisable() {\n\t\tif (!this.isEnabled) return;\n\t\tthis.isEnabled = false;\n\n\t\tdocument.removeEventListener(\"mousemove\", this.handleMouseMove);\n\t\tdocument.removeEventListener(\"click\", this.handleClick, true);\n\t\tdocument.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n\n\t\t// Hide all overlays\n\t\tthis.hoverOverlay.style.display = \"none\";\n\t\tthis.selectionOverlay.style.display = \"none\";\n\t\tthis.selectionTagLabel.style.display = \"none\";\n\t\tthis.hideChildrenOverlays();\n\n\t\t// Remove runtime markers\n\t\tif (this.selectedElement) {\n\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t}\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\n\t\tdocument.body.style.cursor = \"\";\n\t\tthis.selectedElement = null;\n\t\tthis.hoveredElement = null;\n\t}\n\n\t/**\n\t * Deselect the currently selected element\n\t * Keeps design mode active but clears the selection\n\t */\n\tdeselectElement() {\n\t\tif (!this.selectedElement) return;\n\n\t\t// Remove selection marker\n\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\tthis.selectedElement = null;\n\n\t\t// Hide selection overlay and tag\n\t\tthis.selectionOverlay.style.display = \"none\";\n\t\tthis.selectionTagLabel.style.display = \"none\";\n\t}\n\n\t/**\n\t * Programmatically select an element by its source location\n\t * Used when restoring selection after page reload\n\t */\n\tprivate handleSelectElement(data: DesignModeMessage) {\n\t\tif (!data.sourceFile || !data.sourceLine || data.sourceColumn === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find element by source location\n\t\tconst allElements = document.querySelectorAll('*');\n\t\tfor (const el of allElements) {\n\t\t\t// Skip our own overlays\n\t\t\tif ((el as HTMLElement).classList?.contains(\"fb-design-mode-overlay\") ||\n\t\t\t (el as HTMLElement).classList?.contains(\"fb-design-mode-tag\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (\n\t\t\t\tsource &&\n\t\t\t\tsource.fileName === data.sourceFile &&\n\t\t\t\tsource.lineNumber === data.sourceLine &&\n\t\t\t\tsource.columnNumber === data.sourceColumn\n\t\t\t) {\n\t\t\t\tconst element = el as HTMLElement;\n\n\t\t\t\t// Update selected element marker\n\t\t\t\tif (this.selectedElement) {\n\t\t\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t\t\t}\n\n\t\t\t\tthis.selectedElement = element;\n\t\t\t\tthis.selectedElement.setAttribute(\"data-fb-selected\", \"true\");\n\n\t\t\t\t// Update selection overlay and tag\n\t\t\t\tthis.updateOverlayPosition(this.selectionOverlay, element);\n\t\t\t\tthis.selectionOverlay.style.display = \"block\";\n\n\t\t\t\tthis.updateTagLabel(element);\n\t\t\t\tthis.selectionTagLabel.style.display = \"block\";\n\n\t\t\t\t// Send selection data to parent\n\t\t\t\tthis.sendElementData(element, source);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract source location from React Fiber's _debugSource\n\t * This is added automatically by React in development mode\n\t *\n\t * Strategy: Find the JSX usage site, not the component definition.\n\t * - For DOM elements (div, p, button): Use first _debugSource\n\t * - For custom components (Button, Input): Skip to parent's _debugSource (the usage site)\n\t */\n\tprivate getReactFiberSource(element: HTMLElement): SourceLocation | null {\n\t\t// Find React fiber key (varies by React version)\n\t\tconst elementWithFiber = element as HTMLElementWithFiber;\n\t\tconst fiberKey = Object.keys(elementWithFiber).find(key =>\n\t\t\tkey.startsWith('__reactFiber$') ||\n\t\t\tkey.startsWith('__reactInternalInstance$')\n\t\t);\n\n\t\tif (!fiberKey) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet fiber = elementWithFiber[fiberKey] as ReactFiber | undefined;\n\t\tlet firstSource: SourceLocation | null = null;\n\n\t\t// Walk up fiber tree to find _debugSource\n\t\twhile (fiber) {\n\t\t\tif (fiber._debugSource) {\n\t\t\t\tconst source: SourceLocation = {\n\t\t\t\t\tfileName: fiber._debugSource.fileName,\n\t\t\t\t\tlineNumber: fiber._debugSource.lineNumber,\n\t\t\t\t\tcolumnNumber: fiber._debugSource.columnNumber ?? 0,\n\t\t\t\t};\n\n\t\t\t\t// Store first source we find\n\t\t\t\tif (!firstSource) {\n\t\t\t\t\tfirstSource = source;\n\t\t\t\t}\n\n\t\t\t\t// Check if this is a component file (in src/components/ui/)\n\t\t\t\t// If it is, skip it and use the parent's source (the usage site)\n\t\t\t\tconst isComponentFile = source.fileName.includes('/components/ui/') ||\n\t\t\t\t source.fileName.includes('/components/common/');\n\n\t\t\t\tif (isComponentFile) {\n\t\t\t\t\t// This is the component definition - keep looking up for usage site\n\t\t\t\t\tfiber = fiber.return;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// This is a usage site - return it\n\t\t\t\treturn source;\n\t\t\t}\n\t\t\tfiber = fiber.return; // Walk up to parent fiber\n\t\t}\n\n\t\t// Fallback to first source if we didn't find a non-component source\n\t\treturn firstSource;\n\t}\n\n\tprivate isContainer(element: HTMLElement): boolean {\n\t\tconst containerTags = ['div', 'section', 'header', 'footer', 'main', 'aside', 'nav', 'article', 'ul', 'ol', 'li'];\n\t\treturn containerTags.includes(element.tagName.toLowerCase());\n\t}\n\n\tprivate hasDirectTextContent(element: HTMLElement): boolean {\n\t\treturn Array.from(element.childNodes).some(\n\t\t\tnode => node.nodeType === Node.TEXT_NODE && node.textContent?.trim()\n\t\t);\n\t}\n\n\tprivate handleMouseLeave = () => {\n\t\tif (!this.isEnabled) return;\n\n\t\t// Hide hover overlay when mouse leaves the document\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\t\tthis.hoveredElement = null;\n\t\tthis.hoverOverlay.style.display = \"none\";\n\t\tthis.hideChildrenOverlays();\n\t};\n\n\tprivate handleMouseMove = (e: MouseEvent) => {\n\t\tif (!this.isEnabled) return;\n\n\t\t// Get all elements at this point\n\t\tconst elementsAtPoint = document.elementsFromPoint(e.clientX, e.clientY);\n\n\t\t// Filter to only elements with React Fiber source, excluding overlays\n\t\tconst selectableElements = elementsAtPoint.filter((el) => {\n\t\t\tif (el.classList.contains(\"fb-design-mode-overlay\") ||\n\t\t\t el.classList.contains(\"fb-design-mode-tag\")) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Must have React Fiber source location\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\tif (selectableElements.length === 0) {\n\t\t\tif (this.hoveredElement) {\n\t\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t\t}\n\t\t\tthis.hoveredElement = null;\n\t\t\tthis.hoverOverlay.style.display = \"none\";\n\t\t\tthis.hideChildrenOverlays();\n\t\t\treturn;\n\t\t}\n\n\t\t// Get topmost element (first in array)\n\t\tconst topElement = selectableElements[0];\n\t\tif (!topElement) return; // Type guard for noUncheckedIndexedAccess\n\n\t\t// Don't show hover overlay if this is the selected element\n\t\tif (topElement === this.selectedElement) {\n\t\t\tthis.hoverOverlay.style.display = \"none\";\n\t\t\tthis.hideChildrenOverlays();\n\t\t\treturn;\n\t\t}\n\n\t\t// Update hovered element\n\t\tif (this.hoveredElement && this.hoveredElement !== topElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\n\t\tthis.hoveredElement = topElement;\n\t\tthis.hoveredElement.setAttribute(\"data-fb-hovered\", \"true\");\n\n\t\t// Show hover overlay\n\t\tthis.updateOverlayPosition(this.hoverOverlay, topElement);\n\t\tthis.hoverOverlay.style.display = \"block\";\n\n\t\t// Show children overlays if this is a container without direct text\n\t\tif (this.isContainer(topElement) && !this.hasDirectTextContent(topElement)) {\n\t\t\tthis.showChildrenOverlays(topElement);\n\t\t} else {\n\t\t\tthis.hideChildrenOverlays();\n\t\t}\n\t};\n\n\tprivate showChildrenOverlays(parent: HTMLElement) {\n\t\t// Get direct children with React Fiber source\n\t\tconst children = Array.from(parent.children).filter(child => {\n\t\t\tconst source = this.getReactFiberSource(child as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\t// Ensure we have enough child overlays\n\t\twhile (this.childrenOverlays.length < children.length) {\n\t\t\tthis.childrenOverlays.push(this.createChildOverlay());\n\t\t}\n\n\t\t// Show overlay for each child\n\t\tchildren.forEach((child, index) => {\n\t\t\tconst overlay = this.childrenOverlays[index];\n\t\t\tif (overlay) {\n\t\t\t\tthis.updateOverlayPosition(overlay, child);\n\t\t\t\toverlay.style.display = \"block\";\n\t\t\t}\n\t\t});\n\n\t\t// Hide unused child overlays\n\t\tfor (let i = children.length; i < this.childrenOverlays.length; i++) {\n\t\t\tconst overlay = this.childrenOverlays[i];\n\t\t\tif (overlay) {\n\t\t\t\toverlay.style.display = \"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate hideChildrenOverlays() {\n\t\tfor (const overlay of this.childrenOverlays) {\n\t\t\toverlay.style.display = \"none\";\n\t\t}\n\t}\n\n\tprivate currentSelectionIndex = 0;\n\tprivate lastClickTime = 0;\n\tprivate lastClickPosition = { x: 0, y: 0 };\n\n\tprivate handleClick = (e: MouseEvent) => {\n\t\tif (!this.isEnabled) return;\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif (!this.hoveredElement) return;\n\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastClick = now - this.lastClickTime;\n\t\tconst distanceMoved = Math.hypot(\n\t\t\te.clientX - this.lastClickPosition.x,\n\t\t\te.clientY - this.lastClickPosition.y,\n\t\t);\n\n\t\t// Get all elements at click point for cycling\n\t\tconst elementsAtPoint = document.elementsFromPoint(e.clientX, e.clientY);\n\t\tconst selectableElements = elementsAtPoint.filter((el) => {\n\t\t\tif (el.classList.contains(\"fb-design-mode-overlay\") ||\n\t\t\t el.classList.contains(\"fb-design-mode-tag\")) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Must have React Fiber source location\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\t// Cycle through nested elements on repeated clicks\n\t\tif (timeSinceLastClick < 1000 && distanceMoved < 10 && selectableElements.length > 1) {\n\t\t\tthis.currentSelectionIndex = (this.currentSelectionIndex + 1) % selectableElements.length;\n\t\t} else {\n\t\t\tthis.currentSelectionIndex = 0;\n\t\t}\n\n\t\tconst target = selectableElements[this.currentSelectionIndex];\n\t\tif (!target) return; // Type guard for noUncheckedIndexedAccess\n\n\t\t// Get source location\n\t\tconst source = this.getReactFiberSource(target);\n\t\tif (!source) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update selected element marker\n\t\tif (this.selectedElement) {\n\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t}\n\n\t\tthis.selectedElement = target;\n\t\tthis.selectedElement.setAttribute(\"data-fb-selected\", \"true\");\n\n\t\t// Update selection overlay and tag\n\t\tthis.updateOverlayPosition(this.selectionOverlay, target);\n\t\tthis.selectionOverlay.style.display = \"block\";\n\n\t\tthis.updateTagLabel(target);\n\t\tthis.selectionTagLabel.style.display = \"block\";\n\n\t\t// Send selection data to parent\n\t\tthis.sendElementData(target, source);\n\n\t\t// Update last click info\n\t\tthis.lastClickTime = now;\n\t\tthis.lastClickPosition = { x: e.clientX, y: e.clientY };\n\t};\n\n\tprivate updateOverlayPosition(overlay: HTMLDivElement, element: HTMLElement) {\n\t\tconst rect = element.getBoundingClientRect();\n\t\tObject.assign(overlay.style, {\n\t\t\ttop: `${rect.top + window.scrollY}px`,\n\t\t\tleft: `${rect.left + window.scrollX}px`,\n\t\t\twidth: `${rect.width}px`,\n\t\t\theight: `${rect.height}px`,\n\t\t});\n\t}\n\n\tprivate updateTagLabel(element: HTMLElement) {\n\t\tconst rect = element.getBoundingClientRect();\n\t\tconst tagName = element.tagName.toLowerCase();\n\n\t\tthis.selectionTagLabel.textContent = tagName;\n\t\tObject.assign(this.selectionTagLabel.style, {\n\t\t\ttop: `${rect.top + window.scrollY}px`,\n\t\t\tleft: `${rect.left + window.scrollX}px`,\n\t\t});\n\t}\n\n\tprivate getRelevantStyles(element: HTMLElement): Record<string, string> {\n\t\tconst computed = window.getComputedStyle(element);\n\t\tconst relevantProps = [\n\t\t\t\"display\",\n\t\t\t\"position\",\n\t\t\t\"width\",\n\t\t\t\"height\",\n\t\t\t\"padding\",\n\t\t\t\"margin\",\n\t\t\t\"backgroundColor\",\n\t\t\t\"color\",\n\t\t\t\"fontSize\",\n\t\t\t\"fontFamily\",\n\t\t];\n\n\t\tconst styles: Record<string, string> = {};\n\t\tfor (const prop of relevantProps) {\n\t\t\tstyles[prop] = computed.getPropertyValue(prop);\n\t\t}\n\t\treturn styles;\n\t}\n\n\t/**\n\t * Extract direct text content from DOM (not from nested children)\n\t */\n\tprivate getDirectTextContent(element: HTMLElement): string | null {\n\t\tconst directTextNodes = Array.from(element.childNodes)\n\t\t\t.filter(node => node.nodeType === Node.TEXT_NODE)\n\t\t\t.map(node => node.textContent?.trim())\n\t\t\t.filter(Boolean);\n\n\t\treturn directTextNodes.length > 0 ? directTextNodes.join(' ') : null;\n\t}\n\n\tprivate sendElementData(element: HTMLElement, source: SourceLocation) {\n\t\tconst directText = this.getDirectTextContent(element);\n\n\t\tconst data: ElementSelectedMessage = {\n\t\t\ttype: \"FB_ELEMENT_SELECTED\",\n\t\t\tdata: {\n\t\t\t\t// Source location from React Fiber\n\t\t\t\tsourceFile: source.fileName,\n\t\t\t\tsourceLine: source.lineNumber,\n\t\t\t\tsourceColumn: source.columnNumber,\n\n\t\t\t\t// DOM properties\n\t\t\t\ttagName: element.tagName,\n\t\t\t\tclassName: element.className,\n\t\t\t\ttextContent: directText,\n\t\t\t\tsrc: element.getAttribute('src') || undefined,\n\t\t\t\talt: element.getAttribute('alt') || undefined,\n\t\t\t\thref: element.getAttribute('href') || undefined,\n\t\t\t\ttarget: element.getAttribute('target') || undefined,\n\t\t\t\trel: element.getAttribute('rel') || undefined,\n\t\t\t\tcomputedStyles: this.getRelevantStyles(element),\n\t\t\t},\n\t\t};\n\n\t\t// Send to parent window\n\t\twindow.parent.postMessage(data, \"*\");\n\t}\n\n\t/**\n\t * Handle request to get all elements' current state\n\t * Used for computing diffs on save (Lovable's approach)\n\t */\n\tprivate handleGetAllElementsState() {\n\t\tconst allElements = document.querySelectorAll('*');\n\t\tconst elementsState: Array<{\n\t\t\tsourceFile: string;\n\t\t\tsourceLine: number;\n\t\t\tsourceColumn: number;\n\t\t\tclassName: string;\n\t\t\ttextContent: string | null;\n\t\t\tsrc?: string;\n\t\t\talt?: string;\n\t\t\thref?: string;\n\t\t\ttarget?: string;\n\t\t\trel?: string;\n\t\t}> = [];\n\n\t\tfor (const el of allElements) {\n\t\t\t// Skip our own overlays\n\t\t\tif ((el as HTMLElement).classList?.contains(\"fb-design-mode-overlay\") ||\n\t\t\t (el as HTMLElement).classList?.contains(\"fb-design-mode-tag\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (!source) continue;\n\n\t\t\tconst element = el as HTMLElement;\n\n\t\t\t// Check if this is an Image component wrapper with an <img> child\n\t\t\tlet actualElement = element;\n\t\t\tif (element.tagName !== \"IMG\") {\n\t\t\t\tconst imgChild = element.querySelector(\"img\");\n\t\t\t\tif (imgChild) {\n\t\t\t\t\tactualElement = imgChild as HTMLElement;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst textContent = this.getDirectTextContent(element);\n\n\t\t\t// Get className as string - handle SVG elements which have className as SVGAnimatedString\n\t\t\tlet className = '';\n\t\t\tif (element.className) {\n\t\t\t\t// For SVG elements, className is SVGAnimatedString with .baseVal property\n\t\t\t\tif (typeof element.className === 'string') {\n\t\t\t\t\tclassName = element.className;\n\t\t\t\t} else if ('baseVal' in element.className) {\n\t\t\t\t\tclassName = (element.className as { baseVal: string }).baseVal;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telementsState.push({\n\t\t\t\tsourceFile: source.fileName,\n\t\t\t\tsourceLine: source.lineNumber,\n\t\t\t\tsourceColumn: source.columnNumber,\n\t\t\t\tclassName,\n\t\t\t\ttextContent,\n\t\t\t\tsrc: actualElement.getAttribute('src') || undefined,\n\t\t\t\talt: actualElement.getAttribute('alt') || undefined,\n\t\t\t\thref: element.getAttribute('href') || undefined,\n\t\t\t\ttarget: element.getAttribute('target') || undefined,\n\t\t\t\trel: element.getAttribute('rel') || undefined,\n\t\t\t});\n\t\t}\n\n\t\t// Send back to parent\n\t\twindow.parent.postMessage({\n\t\t\ttype: 'FB_ALL_ELEMENTS_STATE',\n\t\t\tdata: elementsState\n\t\t}, '*');\n\t}\n\n\t/**\n\t * Handle optimistic element updates from parent window\n\t * Uses React Fiber source to find the correct element\n\t */\n\tprivate handleUpdateElement(message: DesignModeMessage) {\n\t\tconst { sourceFile, sourceLine, sourceColumn, updates } = message;\n\n\t\tif (!sourceFile || !sourceLine || !updates) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find element by matching React Fiber source\n\t\tconst allElements = document.querySelectorAll('*');\n\n\t\tfor (const el of allElements) {\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (source?.fileName === sourceFile &&\n\t\t\t source?.lineNumber === sourceLine &&\n\t\t\t source?.columnNumber === sourceColumn) {\n\n\t\t\t\tlet element = el as HTMLElement;\n\n\t\t\t\t// Special case: if we're updating image properties (src/alt) but found a container,\n\t\t\t\t// look for an <img> child element\n\t\t\t\tif ((updates.src !== undefined || updates.alt !== undefined) && element.tagName !== \"IMG\") {\n\t\t\t\t\tconst imgChild = element.querySelector(\"img\");\n\t\t\t\t\tif (imgChild) {\n\t\t\t\t\t\telement = imgChild as HTMLElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply optimistic updates\n\t\t\t\tif (updates.className !== undefined) {\n\t\t\t\t\t// Generate CSS for new Tailwind classes before applying\n\t\t\t\t\tconst generator = getTailwindGenerator();\n\t\t\t\t\tgenerator.generateClasses(updates.className);\n\n\t\t\t\t\t// Apply the className\n\t\t\t\t\telement.className = updates.className;\n\t\t\t\t}\n\n\t\t\t\tif (updates.textContent !== undefined) {\n\t\t\t\t\t// Only update first text node to preserve child elements\n\t\t\t\t\tconst textNode = Array.from(element.childNodes).find(\n\t\t\t\t\t\tnode => node.nodeType === Node.TEXT_NODE\n\t\t\t\t\t);\n\t\t\t\t\tif (textNode) {\n\t\t\t\t\t\ttextNode.textContent = updates.textContent;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.textContent = updates.textContent;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (updates.src !== undefined && \"src\" in element) {\n\t\t\t\t\t// Use setAttribute to force browser reload, bypassing React's state management\n\t\t\t\t\telement.setAttribute(\"src\", updates.src);\n\t\t\t\t\t// Also update srcset to prevent fallback\n\t\t\t\t\tif (element.hasAttribute(\"srcset\")) {\n\t\t\t\t\t\telement.removeAttribute(\"srcset\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (updates.alt !== undefined && \"alt\" in element) {\n\t\t\t\t\t(element as HTMLImageElement).alt = updates.alt;\n\t\t\t\t}\n\n\t\t\t\tif (updates.href !== undefined && \"href\" in element) {\n\t\t\t\t\telement.setAttribute(\"href\", updates.href);\n\t\t\t\t}\n\n\t\t\t\tif (updates.target !== undefined && \"target\" in element) {\n\t\t\t\t\telement.setAttribute(\"target\", updates.target);\n\t\t\t\t}\n\n\t\t\t\tif (updates.rel !== undefined && \"rel\" in element) {\n\t\t\t\t\telement.setAttribute(\"rel\", updates.rel);\n\t\t\t\t}\n\n\t\t\t\t// Update overlays if this is the hovered or selected element\n\t\t\t\tif (element === this.hoveredElement) {\n\t\t\t\t\tthis.updateOverlayPosition(this.hoverOverlay, element);\n\t\t\t\t}\n\t\t\t\tif (element === this.selectedElement) {\n\t\t\t\t\tthis.updateOverlayPosition(this.selectionOverlay, element);\n\t\t\t\t\tthis.updateTagLabel(element);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle theme update from parent window\n\t * Apply CSS variables using a style tag (NOT inline styles) to maintain proper CSS cascade\n\t * Note: We don't change the dark class - that's controlled by the native theme switcher\n\t */\n\tprivate handleUpdateTheme(theme?: {\n\t\tlightVariables?: Record<string, string>;\n\t\tdarkVariables?: Record<string, string>;\n\t}) {\n\t\tif (!theme) return;\n\n\t\t// Find or create the style element for design mode theme overrides\n\t\tlet styleEl = document.getElementById('fb-design-mode-theme') as HTMLStyleElement;\n\t\tif (!styleEl) {\n\t\t\tstyleEl = document.createElement('style');\n\t\t\tstyleEl.id = 'fb-design-mode-theme';\n\t\t\tdocument.head.appendChild(styleEl);\n\t\t}\n\n\t\t// Build CSS with both light and dark theme variables\n\t\tlet css = '';\n\n\t\t// Light theme variables in :root (includes colors, fonts, radius)\n\t\tif (theme.lightVariables && Object.keys(theme.lightVariables).length > 0) {\n\t\t\tcss += ':root {\\n';\n\t\t\tfor (const [key, value] of Object.entries(theme.lightVariables)) {\n\t\t\t\tcss += ` ${key}: ${value};\\n`;\n\t\t\t}\n\t\t\tcss += '}\\n\\n';\n\t\t}\n\n\t\t// Dark theme variables in .dark (only colors, not fonts/radius)\n\t\tif (theme.darkVariables && Object.keys(theme.darkVariables).length > 0) {\n\t\t\tcss += '.dark {\\n';\n\t\t\tfor (const [key, value] of Object.entries(theme.darkVariables)) {\n\t\t\t\tcss += ` ${key}: ${value};\\n`;\n\t\t\t}\n\t\t\tcss += '}\\n';\n\t\t}\n\n\t\t// Apply the CSS\n\t\tstyleEl.textContent = css;\n\t}\n}\n\n// Initialize when script loads - only in browser environment\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n\t// Load Tailwind config and initialize overlay\n\t(async () => {\n\t\ttry {\n\t\t\t// Load the generated Tailwind config JSON\n\t\t\tconst configResponse = await fetch('/src/design-mode/tailwind.config.json');\n\t\t\tif (configResponse.ok) {\n\t\t\t\tconst config = await configResponse.json();\n\t\t\t\t// Store config globally for TailwindGenerator\n\t\t\t\t(window as any).__FIREBUZZ_TAILWIND_CONFIG__ = config;\n\t\t\t\tconsole.log('[Design Mode] Loaded Tailwind config from JSON');\n\t\t\t} else {\n\t\t\t\tconsole.warn('[Design Mode] Could not load Tailwind config JSON - using empty config');\n\t\t\t\t(window as any).__FIREBUZZ_TAILWIND_CONFIG__ = {};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('[Design Mode] Error loading Tailwind config:', error);\n\t\t\t(window as any).__FIREBUZZ_TAILWIND_CONFIG__ = {};\n\t\t}\n\n\t\t// Initialize overlay after config is loaded\n\t\tnew DesignModeOverlay();\n\t})();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tailwind-generator.ts","../src/overlay.ts"],"names":["TailwindCSSGenerator","config","existing","className","testDiv","computed","hasStyles","defaultColor","defaultFontSize","prop","side","propName","expectedDisplay","classNames","classes","css","responsiveMatch","breakpoint","baseClass","baseCss","minWidth","stateMatch","state","darkMatch","style","property","colors","prefix","parts","colorValue","colorName","shade","type","spacing","match","direction","value","spacingValue","properties","dirMap","sizeValue","fontSize","size","fontSizeValue","fSize","lineHeight","fontWeight","weight","weightValue","borderRadius","radiusValue","borderWidth","dirMatch","widthMatch","gapValue","spaceValue","lineHeightValue","letterSpacing","letterSpacingValue","numCols","numRows","numValue","shadows","shadowValue","generator","getTailwindGenerator","DesignModeOverlay","border","zIndex","overlay","label","children","child","index","data","allElements","el","source","element","elementWithFiber","fiberKey","key","fiber","firstSource","node","selectableElements","topElement","parent","i","now","timeSinceLastClick","distanceMoved","target","rect","tagName","relevantProps","styles","directTextNodes","directText","elementsState","actualElement","imgChild","textContent","message","sourceFile","sourceLine","sourceColumn","updates","textNode","theme","styleEl"],"mappings":"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","file":"overlay.js","sourcesContent":["/**\n * Client-side Tailwind CSS Generator\n *\n * Generates CSS for Tailwind classes at runtime using the resolved Tailwind config.\n * This allows design mode to support any Tailwind class without build-time compilation.\n *\n * Based on Lovable's approach: \"a client-side Tailwind generator that intelligently\n * reads custom configurations\"\n */\n\ntype TailwindConfig = any; // Generated config structure is dynamic\n\nexport class TailwindCSSGenerator {\n\tprivate config: TailwindConfig;\n\tprivate generatedStyles = new Set<string>();\n\tprivate styleElement: HTMLStyleElement | null = null;\n\n\tconstructor(config?: TailwindConfig) {\n\t\t// Load config dynamically - will be imported by the overlay\n\t\tif (config) {\n\t\t\tthis.config = config;\n\t\t} else {\n\t\t\t// @ts-expect-error - Config is generated at build time by Vite plugin\n\t\t\tthis.config = (window as any).__FIREBUZZ_TAILWIND_CONFIG__ || {};\n\t\t}\n\t\tthis.initStyleElement();\n\t\tconsole.log(\"[Tailwind Generator] Initialized with config:\", {\n\t\t\tcolors: Object.keys(\n\t\t\t\t(this.config.theme?.colors as Record<string, any>) || {},\n\t\t\t).length,\n\t\t\tspacing: Object.keys(\n\t\t\t\t(this.config.theme?.spacing as Record<string, any>) || {},\n\t\t\t).length,\n\t\t});\n\t}\n\n\t/**\n\t * Initialize a <style> element to inject generated CSS\n\t */\n\tprivate initStyleElement() {\n\t\t// Check if style element already exists (shouldn't happen with singleton, but safety check)\n\t\tconst existing = document.getElementById(\"fb-runtime-tailwind\");\n\t\tif (existing) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[Tailwind Generator] Style element already exists, reusing it\",\n\t\t\t);\n\t\t\tthis.styleElement = existing as HTMLStyleElement;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.styleElement = document.createElement(\"style\");\n\t\tthis.styleElement.id = \"fb-runtime-tailwind\";\n\t\tthis.styleElement.setAttribute(\"data-source\", \"firebuzz-design-mode\");\n\t\tdocument.head.appendChild(this.styleElement);\n\t\tconsole.log(\"[Tailwind Generator] Created <style> element in <head>\");\n\t}\n\n\t/**\n\t * Check if a CSS class already has styles in the built Tailwind CSS\n\t * Uses a simple heuristic: create a test element and check if it has the expected styles\n\t */\n\tprivate classExistsInStylesheet(className: string): boolean {\n\t\ttry {\n\t\t\t// Create a hidden test element\n\t\t\tconst testDiv = document.createElement(\"div\");\n\t\t\ttestDiv.className = className;\n\t\t\ttestDiv.style.cssText =\n\t\t\t\t\"position:absolute;top:-9999px;left:-9999px;visibility:hidden;\";\n\t\t\tdocument.body.appendChild(testDiv);\n\n\t\t\t// Get computed styles\n\t\t\tconst computed = window.getComputedStyle(testDiv);\n\n\t\t\t// Check if the class has any non-default styles applied\n\t\t\tlet hasStyles = false;\n\n\t\t\t// Background color classes\n\t\t\tif (\n\t\t\t\tclassName.startsWith(\"bg-\") &&\n\t\t\t\tcomputed.backgroundColor !== \"rgba(0, 0, 0, 0)\"\n\t\t\t) {\n\t\t\t\thasStyles = true;\n\t\t\t}\n\t\t\t// Text color classes\n\t\t\telse if (\n\t\t\t\tclassName.startsWith(\"text-\") &&\n\t\t\t\t!className.match(\n\t\t\t\t\t/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tconst defaultColor = window.getComputedStyle(document.body).color;\n\t\t\t\tif (\n\t\t\t\t\tcomputed.color !== defaultColor &&\n\t\t\t\t\tcomputed.color !== \"rgb(0, 0, 0)\"\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Font size classes\n\t\t\telse if (\n\t\t\t\tclassName.match(\n\t\t\t\t\t/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Check if font-size is different from body default\n\t\t\t\tconst defaultFontSize = window.getComputedStyle(document.body).fontSize;\n\t\t\t\tif (computed.fontSize !== defaultFontSize) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Padding/margin classes\n\t\t\telse if (className.match(/^[pm][trblxy]?-/)) {\n\t\t\t\tconst prop = className[0] === \"p\" ? \"padding\" : \"margin\";\n\t\t\t\tconst side = className[1] === \"-\" ? \"Top\" : className[1].toUpperCase();\n\t\t\t\tconst propName = `${prop}${side === \"-\" ? \"Top\" : side}` as any;\n\t\t\t\tif (computed[propName] && computed[propName] !== \"0px\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Gap classes (gap, gap-x, gap-y)\n\t\t\telse if (className.startsWith(\"gap-\")) {\n\t\t\t\t// Check if gap/column-gap/row-gap is set\n\t\t\t\tif (\n\t\t\t\t\t(computed.gap !== \"normal\" && computed.gap !== \"0px\") ||\n\t\t\t\t\t(computed.columnGap !== \"normal\" && computed.columnGap !== \"0px\") ||\n\t\t\t\t\t(computed.rowGap !== \"normal\" && computed.rowGap !== \"0px\")\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Space classes (space-x, space-y)\n\t\t\telse if (className.startsWith(\"space-\")) {\n\t\t\t\t// For space classes, check if any margin is applied\n\t\t\t\t// These apply margin to children, so harder to detect - default to not existing\n\t\t\t\thasStyles = false;\n\t\t\t}\n\t\t\t// Width/height classes\n\t\t\telse if (className.match(/^[wh]-/)) {\n\t\t\t\tconst prop = className[0] === \"w\" ? \"width\" : \"height\";\n\t\t\t\tif (computed[prop] !== \"auto\" && computed[prop] !== \"0px\") {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Display utilities\n\t\t\telse if (\n\t\t\t\t[\n\t\t\t\t\t\"flex\",\n\t\t\t\t\t\"inline-flex\",\n\t\t\t\t\t\"grid\",\n\t\t\t\t\t\"inline-grid\",\n\t\t\t\t\t\"block\",\n\t\t\t\t\t\"inline-block\",\n\t\t\t\t\t\"hidden\",\n\t\t\t\t].includes(className)\n\t\t\t) {\n\t\t\t\tconst expectedDisplay =\n\t\t\t\t\tclassName === \"hidden\"\n\t\t\t\t\t\t? \"none\"\n\t\t\t\t\t\t: className.replace(\"inline-\", \"inline-\").replace(\"-\", \"\");\n\t\t\t\tif (\n\t\t\t\t\tcomputed.display === expectedDisplay ||\n\t\t\t\t\t(className === \"flex\" && computed.display === \"flex\") ||\n\t\t\t\t\t(className === \"grid\" && computed.display === \"grid\") ||\n\t\t\t\t\t(className === \"block\" && computed.display === \"block\")\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Flex/grid layout utilities\n\t\t\telse if (\n\t\t\t\t[\n\t\t\t\t\t\"items-center\",\n\t\t\t\t\t\"items-start\",\n\t\t\t\t\t\"items-end\",\n\t\t\t\t\t\"justify-center\",\n\t\t\t\t\t\"justify-between\",\n\t\t\t\t\t\"justify-around\",\n\t\t\t\t\t\"flex-col\",\n\t\t\t\t\t\"flex-row\",\n\t\t\t\t].includes(className)\n\t\t\t) {\n\t\t\t\t// Check for corresponding CSS properties\n\t\t\t\tif (\n\t\t\t\t\tclassName.startsWith(\"items-\") &&\n\t\t\t\t\tcomputed.alignItems !== \"normal\"\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t} else if (\n\t\t\t\t\tclassName.startsWith(\"justify-\") &&\n\t\t\t\t\tcomputed.justifyContent !== \"normal\"\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t} else if (\n\t\t\t\t\tclassName.startsWith(\"flex-\") &&\n\t\t\t\t\tcomputed.flexDirection !== \"row\"\n\t\t\t\t) {\n\t\t\t\t\thasStyles = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.body.removeChild(testDiv);\n\t\t\treturn hasStyles;\n\t\t} catch (_e) {\n\t\t\t// If we can't check, assume it doesn't exist and generate it\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Generate CSS for a list of Tailwind classes\n\t * Only generates CSS for classes that don't already exist in stylesheets\n\t */\n\tpublic generateClasses(classNames: string): void {\n\t\tconst classes = classNames.split(/\\s+/).filter(Boolean);\n\n\t\tfor (const className of classes) {\n\t\t\t// Skip if we've already generated this class\n\t\t\tif (this.generatedStyles.has(className)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip if the class already exists in a stylesheet\n\t\t\tif (this.classExistsInStylesheet(className)) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Tailwind Generator] Skipping ${className} - already in stylesheet`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Generate CSS only for new/missing classes\n\t\t\tconst css = this.generateCSSForClass(className);\n\t\t\tif (css) {\n\t\t\t\tthis.appendCSS(css);\n\t\t\t\tthis.generatedStyles.add(className);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Tailwind Generator] Generated CSS for new class: ${className}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate CSS for a single Tailwind class\n\t */\n\tprivate generateCSSForClass(className: string): string | null {\n\t\t// Handle responsive prefixes (sm:, md:, lg:, xl:, 2xl:)\n\t\tconst responsiveMatch = className.match(/^(sm|md|lg|xl|2xl):(.+)$/);\n\t\tif (responsiveMatch) {\n\t\t\tconst [, breakpoint, baseClass] = responsiveMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\tconst screens =\n\t\t\t\t(this.config.theme?.screens as Record<string, string>) || {};\n\t\t\tconst minWidth = screens[breakpoint];\n\t\t\tif (!minWidth) return null;\n\n\t\t\treturn `@media (min-width: ${minWidth}) { ${baseCss} }`;\n\t\t}\n\n\t\t// Handle state prefixes (hover:, focus:, active:, etc.)\n\t\tconst stateMatch = className.match(\n\t\t\t/^(hover|focus|active|disabled|focus-visible|focus-within|visited):(.+)$/,\n\t\t);\n\t\tif (stateMatch) {\n\t\t\tconst [, state, baseClass] = stateMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\treturn baseCss.replace(\n\t\t\t\t/\\.([^\\s{]+)/,\n\t\t\t\t`.${className.replace(/:/g, \"\\\\:\")}:${state}`,\n\t\t\t);\n\t\t}\n\n\t\t// Handle dark mode prefix\n\t\tconst darkMatch = className.match(/^dark:(.+)$/);\n\t\tif (darkMatch) {\n\t\t\tconst [, baseClass] = darkMatch;\n\t\t\tconst baseCss = this.generateBaseCSS(baseClass);\n\t\t\tif (!baseCss) return null;\n\n\t\t\treturn `.dark ${baseCss}`;\n\t\t}\n\n\t\treturn this.generateBaseCSS(className);\n\t}\n\n\t/**\n\t * Generate base CSS for a class (no prefixes)\n\t */\n\tprivate generateBaseCSS(className: string): string | null {\n\t\t// Background colors: bg-{color}-{shade}\n\t\tif (className.startsWith(\"bg-\")) {\n\t\t\treturn this.generateColorCSS(className, \"background-color\");\n\t\t}\n\n\t\t// Text colors: text-{color}-{shade}\n\t\tif (className.startsWith(\"text-\")) {\n\t\t\t// Check if it's a color or font size\n\t\t\tif (\n\t\t\t\tclassName.match(\n\t\t\t\t\t/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn this.generateFontSizeCSS(className);\n\t\t\t}\n\t\t\treturn this.generateColorCSS(className, \"color\");\n\t\t}\n\n\t\t// Border colors: border-{color}-{shade}\n\t\tif (className.startsWith(\"border-\")) {\n\t\t\t// Check if it's a color, width, or style\n\t\t\tif (className.match(/^border-(\\d+|t|r|b|l|x|y)$/)) {\n\t\t\t\treturn this.generateBorderWidthCSS(className);\n\t\t\t}\n\t\t\t// Check for border styles\n\t\t\tif (\n\t\t\t\t[\n\t\t\t\t\t\"border-solid\",\n\t\t\t\t\t\"border-dashed\",\n\t\t\t\t\t\"border-dotted\",\n\t\t\t\t\t\"border-double\",\n\t\t\t\t\t\"border-none\",\n\t\t\t\t].includes(className)\n\t\t\t) {\n\t\t\t\tconst style = className.replace(\"border-\", \"\");\n\t\t\t\treturn `.${className} { border-style: ${style} }`;\n\t\t\t}\n\t\t\treturn this.generateColorCSS(className, \"border-color\");\n\t\t}\n\n\t\t// Padding: p-{size}, pt-{size}, pr-{size}, etc.\n\t\tif (className.match(/^p[trblxy]?-/)) {\n\t\t\treturn this.generateSpacingCSS(className, \"padding\");\n\t\t}\n\n\t\t// Margin: m-{size}, mt-{size}, mr-{size}, etc.\n\t\tif (className.match(/^m[trblxy]?-/)) {\n\t\t\treturn this.generateSpacingCSS(className, \"margin\");\n\t\t}\n\n\t\t// Width: w-{size}\n\t\tif (className.startsWith(\"w-\")) {\n\t\t\treturn this.generateSizeCSS(className, \"width\");\n\t\t}\n\n\t\t// Height: h-{size}\n\t\tif (className.startsWith(\"h-\")) {\n\t\t\treturn this.generateSizeCSS(className, \"height\");\n\t\t}\n\n\t\t// Font weight: font-{weight}\n\t\tif (className.startsWith(\"font-\")) {\n\t\t\treturn this.generateFontWeightCSS(className);\n\t\t}\n\n\t\t// Rounded: rounded-{size}\n\t\tif (className.startsWith(\"rounded\")) {\n\t\t\treturn this.generateBorderRadiusCSS(className);\n\t\t}\n\n\t\t// Flex, Grid, Display utilities\n\t\tif (\n\t\t\t[\n\t\t\t\t\"flex\",\n\t\t\t\t\"inline-flex\",\n\t\t\t\t\"grid\",\n\t\t\t\t\"inline-grid\",\n\t\t\t\t\"block\",\n\t\t\t\t\"inline-block\",\n\t\t\t\t\"hidden\",\n\t\t\t].includes(className)\n\t\t) {\n\t\t\treturn `.${className} { display: ${className.replace(\"inline-\", \"inline \").replace(\"-\", \" \")} }`;\n\t\t}\n\n\t\t// Gap: gap-{size}, gap-x-{size}, gap-y-{size}\n\t\tif (className.startsWith(\"gap-\")) {\n\t\t\treturn this.generateGapCSS(className);\n\t\t}\n\n\t\t// Space between: space-x-{size}, space-y-{size}\n\t\tif (className.startsWith(\"space-\")) {\n\t\t\treturn this.generateSpaceBetweenCSS(className);\n\t\t}\n\n\t\t// Flex direction utilities\n\t\tif (className === \"flex-row\") return \".flex-row { flex-direction: row }\";\n\t\tif (className === \"flex-row-reverse\")\n\t\t\treturn \".flex-row-reverse { flex-direction: row-reverse }\";\n\t\tif (className === \"flex-col\") return \".flex-col { flex-direction: column }\";\n\t\tif (className === \"flex-col-reverse\")\n\t\t\treturn \".flex-col-reverse { flex-direction: column-reverse }\";\n\n\t\t// Justify content utilities\n\t\tif (className === \"justify-start\")\n\t\t\treturn \".justify-start { justify-content: flex-start }\";\n\t\tif (className === \"justify-center\")\n\t\t\treturn \".justify-center { justify-content: center }\";\n\t\tif (className === \"justify-end\")\n\t\t\treturn \".justify-end { justify-content: flex-end }\";\n\t\tif (className === \"justify-between\")\n\t\t\treturn \".justify-between { justify-content: space-between }\";\n\t\tif (className === \"justify-around\")\n\t\t\treturn \".justify-around { justify-content: space-around }\";\n\t\tif (className === \"justify-evenly\")\n\t\t\treturn \".justify-evenly { justify-content: space-evenly }\";\n\n\t\t// Align items utilities\n\t\tif (className === \"items-start\")\n\t\t\treturn \".items-start { align-items: flex-start }\";\n\t\tif (className === \"items-center\")\n\t\t\treturn \".items-center { align-items: center }\";\n\t\tif (className === \"items-end\")\n\t\t\treturn \".items-end { align-items: flex-end }\";\n\t\tif (className === \"items-baseline\")\n\t\t\treturn \".items-baseline { align-items: baseline }\";\n\t\tif (className === \"items-stretch\")\n\t\t\treturn \".items-stretch { align-items: stretch }\";\n\n\t\t// Text alignment utilities\n\t\tif (className === \"text-left\") return \".text-left { text-align: left }\";\n\t\tif (className === \"text-center\")\n\t\t\treturn \".text-center { text-align: center }\";\n\t\tif (className === \"text-right\") return \".text-right { text-align: right }\";\n\t\tif (className === \"text-justify\")\n\t\t\treturn \".text-justify { text-align: justify }\";\n\n\t\t// Text decoration utilities\n\t\tif (className === \"underline\")\n\t\t\treturn \".underline { text-decoration-line: underline }\";\n\t\tif (className === \"overline\")\n\t\t\treturn \".overline { text-decoration-line: overline }\";\n\t\tif (className === \"line-through\")\n\t\t\treturn \".line-through { text-decoration-line: line-through }\";\n\t\tif (className === \"no-underline\")\n\t\t\treturn \".no-underline { text-decoration-line: none }\";\n\n\t\t// Font style utilities\n\t\tif (className === \"italic\") return \".italic { font-style: italic }\";\n\t\tif (className === \"not-italic\") return \".not-italic { font-style: normal }\";\n\n\t\t// Line height utilities\n\t\tif (className.startsWith(\"leading-\")) {\n\t\t\treturn this.generateLineHeightCSS(className);\n\t\t}\n\n\t\t// Letter spacing utilities\n\t\tif (className.startsWith(\"tracking-\")) {\n\t\t\treturn this.generateLetterSpacingCSS(className);\n\t\t}\n\n\t\t// Grid columns: grid-cols-{number}\n\t\tif (className.startsWith(\"grid-cols-\")) {\n\t\t\treturn this.generateGridColumnsCSS(className);\n\t\t}\n\n\t\t// Grid rows: grid-rows-{number}\n\t\tif (className.startsWith(\"grid-rows-\")) {\n\t\t\treturn this.generateGridRowsCSS(className);\n\t\t}\n\n\t\t// Opacity: opacity-{value}\n\t\tif (className.startsWith(\"opacity-\")) {\n\t\t\treturn this.generateOpacityCSS(className);\n\t\t}\n\n\t\t// Shadow: shadow-{size}\n\t\tif (className.startsWith(\"shadow\")) {\n\t\t\treturn this.generateShadowCSS(className);\n\t\t}\n\n\t\t// If we can't generate CSS, return null\n\t\tconsole.warn(\n\t\t\t`[Tailwind Generator] Cannot generate CSS for class: ${className}`,\n\t\t);\n\t\treturn null;\n\t}\n\n\tprivate generateColorCSS(className: string, property: string): string | null {\n\t\tconst colors = (this.config.theme?.colors as Record<string, any>) || {};\n\n\t\t// Extract color and shade from class name\n\t\t// e.g., \"bg-blue-500\" -> property=\"background\", color=\"blue\", shade=\"500\"\n\t\tconst prefix =\n\t\t\tproperty === \"background-color\"\n\t\t\t\t? \"bg-\"\n\t\t\t\t: property === \"color\"\n\t\t\t\t\t? \"text-\"\n\t\t\t\t\t: \"border-\";\n\n\t\tconst colorPart = className.slice(prefix.length);\n\t\tconst parts = colorPart.split(\"-\");\n\n\t\tif (parts.length === 1) {\n\t\t\t// Simple color like \"bg-black\"\n\t\t\tconst colorValue = colors[parts[0]];\n\t\t\tif (typeof colorValue === \"string\") {\n\t\t\t\treturn `.${className} { ${property}: ${colorValue} }`;\n\t\t\t}\n\t\t} else if (parts.length === 2) {\n\t\t\t// Color with shade like \"bg-blue-500\"\n\t\t\tconst [colorName, shade] = parts;\n\t\t\tconst colorValue = colors[colorName]?.[shade];\n\t\t\tif (colorValue) {\n\t\t\t\treturn `.${className} { ${property}: ${colorValue} }`;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateSpacingCSS(\n\t\tclassName: string,\n\t\ttype: \"padding\" | \"margin\",\n\t): string | null {\n\t\tconst spacing =\n\t\t\t(this.config.theme?.spacing as Record<string, string>) || {};\n\t\tconst prefix = type === \"padding\" ? \"p\" : \"m\";\n\n\t\t// Extract direction and value\n\t\t// e.g., \"pt-4\" -> direction=\"t\", value=\"4\"\n\t\tconst match = className.match(new RegExp(`^${prefix}([trblxy])?-(.+)$`));\n\t\tif (!match) return null;\n\n\t\tconst [, direction, value] = match;\n\t\tconst spacingValue = spacing[value];\n\t\tif (!spacingValue) return null;\n\n\t\tconst properties: string[] = [];\n\t\tif (!direction) {\n\t\t\tproperties.push(`${type}: ${spacingValue}`);\n\t\t} else if (direction === \"x\") {\n\t\t\tproperties.push(\n\t\t\t\t`${type}-left: ${spacingValue}`,\n\t\t\t\t`${type}-right: ${spacingValue}`,\n\t\t\t);\n\t\t} else if (direction === \"y\") {\n\t\t\tproperties.push(\n\t\t\t\t`${type}-top: ${spacingValue}`,\n\t\t\t\t`${type}-bottom: ${spacingValue}`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst dirMap: Record<string, string> = {\n\t\t\t\tt: \"top\",\n\t\t\t\tr: \"right\",\n\t\t\t\tb: \"bottom\",\n\t\t\t\tl: \"left\",\n\t\t\t};\n\t\t\tproperties.push(`${type}-${dirMap[direction]}: ${spacingValue}`);\n\t\t}\n\n\t\treturn `.${className} { ${properties.join(\"; \")} }`;\n\t}\n\n\tprivate generateSizeCSS(\n\t\tclassName: string,\n\t\tproperty: \"width\" | \"height\",\n\t): string | null {\n\t\tconst spacing =\n\t\t\t(this.config.theme?.spacing as Record<string, string>) || {};\n\t\tconst prefix = property === \"width\" ? \"w-\" : \"h-\";\n\t\tconst value = className.slice(prefix.length);\n\n\t\t// Handle special values\n\t\tif (value === \"full\") return `.${className} { ${property}: 100% }`;\n\t\tif (value === \"screen\")\n\t\t\treturn `.${className} { ${property}: 100v${property[0]} }`;\n\t\tif (value === \"auto\") return `.${className} { ${property}: auto }`;\n\t\tif (value === \"min\") return `.${className} { ${property}: min-content }`;\n\t\tif (value === \"max\") return `.${className} { ${property}: max-content }`;\n\t\tif (value === \"fit\") return `.${className} { ${property}: fit-content }`;\n\n\t\t// Use spacing scale\n\t\tconst sizeValue = spacing[value];\n\t\tif (sizeValue) {\n\t\t\treturn `.${className} { ${property}: ${sizeValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateFontSizeCSS(className: string): string | null {\n\t\tconst fontSize = (this.config.theme?.fontSize as Record<string, any>) || {};\n\t\tconst size = className.slice(\"text-\".length);\n\t\tconst fontSizeValue = fontSize[size];\n\n\t\tif (Array.isArray(fontSizeValue)) {\n\t\t\tconst [fSize, { lineHeight }] = fontSizeValue;\n\t\t\treturn `.${className} { font-size: ${fSize}; line-height: ${lineHeight} }`;\n\t\t}\n\t\tif (typeof fontSizeValue === \"string\") {\n\t\t\treturn `.${className} { font-size: ${fontSizeValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateFontWeightCSS(className: string): string | null {\n\t\tconst fontWeight =\n\t\t\t(this.config.theme?.fontWeight as Record<string, string>) || {};\n\t\tconst weight = className.slice(\"font-\".length);\n\t\tconst weightValue = fontWeight[weight];\n\n\t\tif (weightValue) {\n\t\t\treturn `.${className} { font-weight: ${weightValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateBorderRadiusCSS(className: string): string | null {\n\t\tconst borderRadius =\n\t\t\t(this.config.theme?.borderRadius as Record<string, string>) || {};\n\n\t\t// Handle \"rounded\" (no suffix)\n\t\tif (className === \"rounded\") {\n\t\t\tconst value = borderRadius.DEFAULT || borderRadius[\"\"];\n\t\t\tif (value) return `.rounded { border-radius: ${value} }`;\n\t\t}\n\n\t\t// Handle \"rounded-{size}\"\n\t\tconst size = className.slice(\"rounded-\".length);\n\t\tconst radiusValue = borderRadius[size];\n\t\tif (radiusValue) {\n\t\t\treturn `.${className} { border-radius: ${radiusValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateBorderWidthCSS(className: string): string | null {\n\t\tconst borderWidth =\n\t\t\t(this.config.theme?.borderWidth as Record<string, string>) || {};\n\n\t\t// Handle \"border\" (default width)\n\t\tif (className === \"border\") {\n\t\t\tconst value = borderWidth.DEFAULT || \"1px\";\n\t\t\treturn `.border { border-width: ${value} }`;\n\t\t}\n\n\t\t// Handle directional borders: border-t, border-r, border-b, border-l\n\t\tconst dirMatch = className.match(/^border-([trbl])$/);\n\t\tif (dirMatch) {\n\t\t\tconst dirMap: Record<string, string> = {\n\t\t\t\tt: \"top\",\n\t\t\t\tr: \"right\",\n\t\t\t\tb: \"bottom\",\n\t\t\t\tl: \"left\",\n\t\t\t};\n\t\t\tconst value = borderWidth.DEFAULT || \"1px\";\n\t\t\treturn `.${className} { border-${dirMap[dirMatch[1]]}-width: ${value} }`;\n\t\t}\n\n\t\t// Handle border-{width}\n\t\tconst widthMatch = className.match(/^border-(\\d+)$/);\n\t\tif (widthMatch) {\n\t\t\tconst value = borderWidth[widthMatch[1]];\n\t\t\tif (value) {\n\t\t\t\treturn `.${className} { border-width: ${value} }`;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGapCSS(className: string): string | null {\n\t\tconst spacing =\n\t\t\t(this.config.theme?.spacing as Record<string, string>) || {};\n\n\t\t// Handle gap-x-{size}\n\t\tif (className.startsWith(\"gap-x-\")) {\n\t\t\tconst value = className.slice(\"gap-x-\".length);\n\t\t\tconst gapValue = spacing[value];\n\t\t\tif (gapValue) {\n\t\t\t\treturn `.${className} { column-gap: ${gapValue} }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle gap-y-{size}\n\t\tif (className.startsWith(\"gap-y-\")) {\n\t\t\tconst value = className.slice(\"gap-y-\".length);\n\t\t\tconst gapValue = spacing[value];\n\t\t\tif (gapValue) {\n\t\t\t\treturn `.${className} { row-gap: ${gapValue} }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle gap-{size}\n\t\tconst value = className.slice(\"gap-\".length);\n\t\tconst gapValue = spacing[value];\n\t\tif (gapValue) {\n\t\t\treturn `.${className} { gap: ${gapValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Generate CSS for space-between utilities (space-x, space-y)\n\t * These use margin and the child combinator selector\n\t */\n\tprivate generateSpaceBetweenCSS(className: string): string | null {\n\t\tconst spacing =\n\t\t\t(this.config.theme?.spacing as Record<string, string>) || {};\n\n\t\t// Handle space-x-{size}\n\t\tif (className.startsWith(\"space-x-\")) {\n\t\t\tconst value = className.slice(\"space-x-\".length);\n\t\t\tconst spaceValue = spacing[value];\n\t\t\tif (spaceValue) {\n\t\t\t\t// space-x uses margin-left on all children except first\n\t\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(${spaceValue} * var(--tw-space-x-reverse)); margin-left: calc(${spaceValue} * calc(1 - var(--tw-space-x-reverse))) }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle space-y-{size}\n\t\tif (className.startsWith(\"space-y-\")) {\n\t\t\tconst value = className.slice(\"space-y-\".length);\n\t\t\tconst spaceValue = spacing[value];\n\t\t\tif (spaceValue) {\n\t\t\t\t// space-y uses margin-top on all children except first\n\t\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(${spaceValue} * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(${spaceValue} * var(--tw-space-y-reverse)) }`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle space-x-reverse and space-y-reverse\n\t\tif (className === \"space-x-reverse\") {\n\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 1 }`;\n\t\t}\n\t\tif (className === \"space-y-reverse\") {\n\t\t\treturn `.${className} > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 1 }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateLineHeightCSS(className: string): string | null {\n\t\tconst lineHeight =\n\t\t\t(this.config.theme?.lineHeight as Record<string, string>) || {};\n\t\tconst value = className.slice(\"leading-\".length);\n\t\tconst lineHeightValue = lineHeight[value];\n\n\t\tif (lineHeightValue) {\n\t\t\treturn `.${className} { line-height: ${lineHeightValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateLetterSpacingCSS(className: string): string | null {\n\t\tconst letterSpacing =\n\t\t\t(this.config.theme?.letterSpacing as Record<string, string>) || {};\n\t\tconst value = className.slice(\"tracking-\".length);\n\t\tconst letterSpacingValue = letterSpacing[value];\n\n\t\tif (letterSpacingValue) {\n\t\t\treturn `.${className} { letter-spacing: ${letterSpacingValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGridColumnsCSS(className: string): string | null {\n\t\tconst value = className.slice(\"grid-cols-\".length);\n\n\t\tif (value === \"none\") {\n\t\t\treturn `.${className} { grid-template-columns: none }`;\n\t\t}\n\t\tif (value === \"subgrid\") {\n\t\t\treturn `.${className} { grid-template-columns: subgrid }`;\n\t\t}\n\n\t\tconst numCols = Number.parseInt(value, 10);\n\t\tif (!Number.isNaN(numCols) && numCols >= 1 && numCols <= 12) {\n\t\t\treturn `.${className} { grid-template-columns: repeat(${numCols}, minmax(0, 1fr)) }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateGridRowsCSS(className: string): string | null {\n\t\tconst value = className.slice(\"grid-rows-\".length);\n\n\t\tif (value === \"none\") {\n\t\t\treturn `.${className} { grid-template-rows: none }`;\n\t\t}\n\t\tif (value === \"subgrid\") {\n\t\t\treturn `.${className} { grid-template-rows: subgrid }`;\n\t\t}\n\n\t\tconst numRows = Number.parseInt(value, 10);\n\t\tif (!Number.isNaN(numRows) && numRows >= 1 && numRows <= 6) {\n\t\t\treturn `.${className} { grid-template-rows: repeat(${numRows}, minmax(0, 1fr)) }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateOpacityCSS(className: string): string | null {\n\t\tconst value = className.slice(\"opacity-\".length);\n\t\tconst numValue = Number.parseInt(value, 10);\n\n\t\tif (!Number.isNaN(numValue) && numValue >= 0 && numValue <= 100) {\n\t\t\treturn `.${className} { opacity: ${numValue / 100} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate generateShadowCSS(className: string): string | null {\n\t\tconst shadows =\n\t\t\t(this.config.theme?.boxShadow as Record<string, string>) || {};\n\n\t\t// Handle \"shadow\" (default)\n\t\tif (className === \"shadow\") {\n\t\t\tconst value = shadows.DEFAULT || shadows[\"\"];\n\t\t\tif (value) return `.shadow { box-shadow: ${value} }`;\n\t\t}\n\n\t\t// Handle \"shadow-{size}\"\n\t\tconst size = className.slice(\"shadow-\".length);\n\t\tconst shadowValue = shadows[size];\n\t\tif (shadowValue) {\n\t\t\treturn `.${className} { box-shadow: ${shadowValue} }`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Append generated CSS to the style element\n\t */\n\tprivate appendCSS(css: string) {\n\t\tif (this.styleElement) {\n\t\t\tthis.styleElement.textContent += `\\n${css}`;\n\t\t}\n\t}\n\n\t/**\n\t * Clear all generated styles\n\t */\n\tpublic clear() {\n\t\tthis.generatedStyles.clear();\n\t\tif (this.styleElement) {\n\t\t\tthis.styleElement.textContent = \"\";\n\t\t}\n\t}\n}\n\n// Singleton instance\nlet generator: TailwindCSSGenerator | null = null;\n\nexport function getTailwindGenerator(): TailwindCSSGenerator {\n\tif (!generator) {\n\t\tgenerator = new TailwindCSSGenerator();\n\t}\n\treturn generator;\n}\n","/**\n * Design Mode Overlay Script\n * Injected into the preview iframe to enable element selection\n *\n * Uses React Fiber's _debugSource to track element source locations at runtime.\n * No build-time tagging required - everything is resolved from React's internal data.\n *\n * Includes client-side Tailwind CSS generation for runtime class support.\n */\n\nimport { getTailwindGenerator } from \"./tailwind-generator\";\nimport type {\n\tDesignModeMessage,\n\tElementSelectedMessage,\n\tSourceLocation,\n} from \"./types\";\n\n// Type for React Fiber internal structure\ninterface ReactFiber {\n\t_debugSource?: {\n\t\tfileName: string;\n\t\tlineNumber: number;\n\t\tcolumnNumber?: number;\n\t};\n\ttype?: string | { displayName?: string; name?: string };\n\treturn?: ReactFiber;\n}\n\n// Type for HTMLElement with React Fiber attached\ninterface HTMLElementWithFiber extends HTMLElement {\n\t[key: string]: unknown;\n}\n\nclass DesignModeOverlay {\n\tprivate isEnabled = false;\n\tprivate selectedElement: HTMLElement | null = null;\n\tprivate hoveredElement: HTMLElement | null = null;\n\n\t// Separate overlays for different states\n\tprivate hoverOverlay: HTMLDivElement;\n\tprivate selectionOverlay: HTMLDivElement;\n\tprivate selectionTagLabel: HTMLDivElement;\n\tprivate childrenOverlays: HTMLDivElement[] = [];\n\tprivate resizeObserver: ResizeObserver | null = null;\n\n\tconstructor() {\n\t\t// Create persistent overlay elements\n\t\tthis.hoverOverlay = this.createOverlay(\"2px solid #3b82f6\", 999991);\n\t\tthis.selectionOverlay = this.createOverlay(\"1px solid #3b82f6\", 999990);\n\t\tthis.selectionTagLabel = this.createTagLabel();\n\n\t\tthis.listen();\n\t\tthis.setupResizeObserver();\n\t}\n\n\tprivate createOverlay(border: string, zIndex: number): HTMLDivElement {\n\t\tconst overlay = document.createElement(\"div\");\n\t\toverlay.className = \"fb-design-mode-overlay\";\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tborder,\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: String(zIndex),\n\t\t\tdisplay: \"none\",\n\t\t\tboxShadow: \"0 0 0 1px rgba(59, 130, 246, 0.2)\",\n\t\t\ttransition: \"all 0.1s ease-out\",\n\t\t});\n\t\tdocument.body.appendChild(overlay);\n\t\treturn overlay;\n\t}\n\n\tprivate createChildOverlay(): HTMLDivElement {\n\t\tconst overlay = document.createElement(\"div\");\n\t\toverlay.className = \"fb-design-mode-overlay fb-child-overlay\";\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tborder: \"1px dashed rgba(59, 130, 246, 0.4)\",\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: \"999989\",\n\t\t\tdisplay: \"none\",\n\t\t\tboxShadow: \"0 0 0 1px rgba(59, 130, 246, 0.1)\",\n\t\t\ttransition: \"all 0.1s ease-out\",\n\t\t});\n\t\tdocument.body.appendChild(overlay);\n\t\treturn overlay;\n\t}\n\n\tprivate createTagLabel(): HTMLDivElement {\n\t\tconst label = document.createElement(\"div\");\n\t\tlabel.className = \"fb-design-mode-tag\";\n\t\tObject.assign(label.style, {\n\t\t\tposition: \"absolute\",\n\t\t\tbackground: \"#3b82f6\",\n\t\t\tcolor: \"white\",\n\t\t\tpadding: \"2px 6px\",\n\t\t\tfontSize: \"11px\",\n\t\t\tfontFamily: \"monospace\",\n\t\t\tfontWeight: \"500\",\n\t\t\tborderRadius: \"0 0 4px 0\",\n\t\t\tpointerEvents: \"none\",\n\t\t\tzIndex: \"999999\",\n\t\t\tdisplay: \"none\",\n\t\t});\n\t\tdocument.body.appendChild(label);\n\t\treturn label;\n\t}\n\n\tprivate listen() {\n\t\twindow.addEventListener(\"message\", (e: MessageEvent<DesignModeMessage>) => {\n\t\t\tif (e.data.type === \"ENABLE_DESIGN_MODE\") {\n\t\t\t\tthis.enable();\n\t\t\t} else if (e.data.type === \"DISABLE_DESIGN_MODE\") {\n\t\t\t\tthis.disable();\n\t\t\t} else if (e.data.type === \"FB_UPDATE_ELEMENT\") {\n\t\t\t\tthis.handleUpdateElement(e.data);\n\t\t\t} else if (e.data.type === \"FB_GET_ALL_ELEMENTS_STATE\") {\n\t\t\t\tthis.handleGetAllElementsState();\n\t\t\t} else if (e.data.type === \"FB_UPDATE_THEME\") {\n\t\t\t\tthis.handleUpdateTheme(e.data.theme);\n\t\t\t} else if (e.data.type === \"FB_DESELECT_ELEMENT\") {\n\t\t\t\tthis.deselectElement();\n\t\t\t} else if (e.data.type === \"FB_SELECT_ELEMENT\") {\n\t\t\t\tthis.handleSelectElement(e.data);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setupResizeObserver() {\n\t\t// Listen for window resize and scroll events\n\t\twindow.addEventListener(\"resize\", this.updateOverlayPositions);\n\t\twindow.addEventListener(\"scroll\", this.updateOverlayPositions, true);\n\n\t\t// Use ResizeObserver to detect when elements change size\n\t\tthis.resizeObserver = new ResizeObserver(() => {\n\t\t\tthis.updateOverlayPositions();\n\t\t});\n\n\t\t// Observe the document body for any size changes\n\t\tthis.resizeObserver.observe(document.body);\n\t}\n\n\tprivate updateOverlayPositions = () => {\n\t\t// Update selected element overlay\n\t\tif (\n\t\t\tthis.selectedElement &&\n\t\t\tthis.selectionOverlay.style.display !== \"none\"\n\t\t) {\n\t\t\tthis.updateOverlayPosition(this.selectionOverlay, this.selectedElement);\n\t\t\tthis.updateTagLabel(this.selectedElement);\n\t\t}\n\n\t\t// Update hovered element overlay\n\t\tif (this.hoveredElement && this.hoverOverlay.style.display !== \"none\") {\n\t\t\tthis.updateOverlayPosition(this.hoverOverlay, this.hoveredElement);\n\t\t}\n\n\t\t// Update children overlays\n\t\tfor (const overlay of this.childrenOverlays) {\n\t\t\tif (overlay.style.display !== \"none\" && this.hoveredElement) {\n\t\t\t\t// Find the corresponding child element\n\t\t\t\tconst children = Array.from(this.hoveredElement.children).filter(\n\t\t\t\t\t(child) => {\n\t\t\t\t\t\tconst source = this.getReactFiberSource(child as HTMLElement);\n\t\t\t\t\t\treturn source !== null;\n\t\t\t\t\t},\n\t\t\t\t) as HTMLElement[];\n\n\t\t\t\tconst index = this.childrenOverlays.indexOf(overlay);\n\t\t\t\tconst child = children[index];\n\t\t\t\tif (child) {\n\t\t\t\t\tthis.updateOverlayPosition(overlay, child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tenable() {\n\t\tif (this.isEnabled) return;\n\t\tthis.isEnabled = true;\n\n\t\tdocument.addEventListener(\"mousemove\", this.handleMouseMove);\n\t\tdocument.addEventListener(\"click\", this.handleClick, true);\n\t\tdocument.addEventListener(\"mouseleave\", this.handleMouseLeave);\n\n\t\t// Add cursor style\n\t\tdocument.body.style.cursor = \"crosshair\";\n\t}\n\n\tdisable() {\n\t\tif (!this.isEnabled) return;\n\t\tthis.isEnabled = false;\n\n\t\tdocument.removeEventListener(\"mousemove\", this.handleMouseMove);\n\t\tdocument.removeEventListener(\"click\", this.handleClick, true);\n\t\tdocument.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n\n\t\t// Hide all overlays\n\t\tthis.hoverOverlay.style.display = \"none\";\n\t\tthis.selectionOverlay.style.display = \"none\";\n\t\tthis.selectionTagLabel.style.display = \"none\";\n\t\tthis.hideChildrenOverlays();\n\n\t\t// Remove runtime markers\n\t\tif (this.selectedElement) {\n\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t}\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\n\t\tdocument.body.style.cursor = \"\";\n\t\tthis.selectedElement = null;\n\t\tthis.hoveredElement = null;\n\t}\n\n\t/**\n\t * Deselect the currently selected element\n\t * Keeps design mode active but clears the selection\n\t */\n\tdeselectElement() {\n\t\tif (!this.selectedElement) return;\n\n\t\t// Remove selection marker\n\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\tthis.selectedElement = null;\n\n\t\t// Hide selection overlay and tag\n\t\tthis.selectionOverlay.style.display = \"none\";\n\t\tthis.selectionTagLabel.style.display = \"none\";\n\t}\n\n\t/**\n\t * Programmatically select an element by its source location\n\t * Used when restoring selection after page reload\n\t */\n\tprivate handleSelectElement(data: DesignModeMessage) {\n\t\tif (\n\t\t\t!data.sourceFile ||\n\t\t\t!data.sourceLine ||\n\t\t\tdata.sourceColumn === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find element by source location\n\t\tconst allElements = document.querySelectorAll(\"*\");\n\t\tfor (const el of allElements) {\n\t\t\t// Skip our own overlays\n\t\t\tif (\n\t\t\t\t(el as HTMLElement).classList?.contains(\"fb-design-mode-overlay\") ||\n\t\t\t\t(el as HTMLElement).classList?.contains(\"fb-design-mode-tag\")\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (\n\t\t\t\tsource &&\n\t\t\t\tsource.fileName === data.sourceFile &&\n\t\t\t\tsource.lineNumber === data.sourceLine &&\n\t\t\t\tsource.columnNumber === data.sourceColumn\n\t\t\t) {\n\t\t\t\tconst element = el as HTMLElement;\n\n\t\t\t\t// Update selected element marker\n\t\t\t\tif (this.selectedElement) {\n\t\t\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t\t\t}\n\n\t\t\t\tthis.selectedElement = element;\n\t\t\t\tthis.selectedElement.setAttribute(\"data-fb-selected\", \"true\");\n\n\t\t\t\t// Update selection overlay and tag\n\t\t\t\tthis.updateOverlayPosition(this.selectionOverlay, element);\n\t\t\t\tthis.selectionOverlay.style.display = \"block\";\n\n\t\t\t\tthis.updateTagLabel(element);\n\t\t\t\tthis.selectionTagLabel.style.display = \"block\";\n\n\t\t\t\t// Send selection data to parent\n\t\t\t\tthis.sendElementData(element, source);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract source location from React Fiber's _debugSource\n\t * This is added automatically by React in development mode\n\t *\n\t * Strategy: Find the JSX usage site, not the component definition.\n\t * - For DOM elements (div, p, button): Use first _debugSource\n\t * - For custom components (Button, Input): Skip to parent's _debugSource (the usage site)\n\t */\n\tprivate getReactFiberSource(element: HTMLElement): SourceLocation | null {\n\t\t// Find React fiber key (varies by React version)\n\t\tconst elementWithFiber = element as HTMLElementWithFiber;\n\t\tconst fiberKey = Object.keys(elementWithFiber).find(\n\t\t\t(key) =>\n\t\t\t\tkey.startsWith(\"__reactFiber$\") ||\n\t\t\t\tkey.startsWith(\"__reactInternalInstance$\"),\n\t\t);\n\n\t\tif (!fiberKey) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet fiber = elementWithFiber[fiberKey] as ReactFiber | undefined;\n\t\tlet firstSource: SourceLocation | null = null;\n\n\t\t// Walk up fiber tree to find _debugSource\n\t\twhile (fiber) {\n\t\t\tif (fiber._debugSource) {\n\t\t\t\tconst source: SourceLocation = {\n\t\t\t\t\tfileName: fiber._debugSource.fileName,\n\t\t\t\t\tlineNumber: fiber._debugSource.lineNumber,\n\t\t\t\t\tcolumnNumber: fiber._debugSource.columnNumber ?? 0,\n\t\t\t\t};\n\n\t\t\t\t// Store first source we find\n\t\t\t\tif (!firstSource) {\n\t\t\t\t\tfirstSource = source;\n\t\t\t\t}\n\n\t\t\t\t// Check if this is a component file (in src/components/ui/)\n\t\t\t\t// If it is, skip it and use the parent's source (the usage site)\n\t\t\t\tconst isComponentFile =\n\t\t\t\t\tsource.fileName.includes(\"/components/ui/\") ||\n\t\t\t\t\tsource.fileName.includes(\"/components/common/\");\n\n\t\t\t\tif (isComponentFile) {\n\t\t\t\t\t// This is the component definition - keep looking up for usage site\n\t\t\t\t\tfiber = fiber.return;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// This is a usage site - return it\n\t\t\t\treturn source;\n\t\t\t}\n\t\t\tfiber = fiber.return; // Walk up to parent fiber\n\t\t}\n\n\t\t// Fallback to first source if we didn't find a non-component source\n\t\treturn firstSource;\n\t}\n\n\tprivate isContainer(element: HTMLElement): boolean {\n\t\tconst containerTags = [\n\t\t\t\"div\",\n\t\t\t\"section\",\n\t\t\t\"header\",\n\t\t\t\"footer\",\n\t\t\t\"main\",\n\t\t\t\"aside\",\n\t\t\t\"nav\",\n\t\t\t\"article\",\n\t\t\t\"ul\",\n\t\t\t\"ol\",\n\t\t\t\"li\",\n\t\t];\n\t\treturn containerTags.includes(element.tagName.toLowerCase());\n\t}\n\n\tprivate hasDirectTextContent(element: HTMLElement): boolean {\n\t\treturn Array.from(element.childNodes).some(\n\t\t\t(node) => node.nodeType === Node.TEXT_NODE && node.textContent?.trim(),\n\t\t);\n\t}\n\n\tprivate handleMouseLeave = () => {\n\t\tif (!this.isEnabled) return;\n\n\t\t// Hide hover overlay when mouse leaves the document\n\t\tif (this.hoveredElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\t\tthis.hoveredElement = null;\n\t\tthis.hoverOverlay.style.display = \"none\";\n\t\tthis.hideChildrenOverlays();\n\t};\n\n\tprivate handleMouseMove = (e: MouseEvent) => {\n\t\tif (!this.isEnabled) return;\n\n\t\t// Get all elements at this point\n\t\tconst elementsAtPoint = document.elementsFromPoint(e.clientX, e.clientY);\n\n\t\t// Filter to only elements with React Fiber source, excluding overlays\n\t\tconst selectableElements = elementsAtPoint.filter((el) => {\n\t\t\tif (\n\t\t\t\tel.classList.contains(\"fb-design-mode-overlay\") ||\n\t\t\t\tel.classList.contains(\"fb-design-mode-tag\")\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Must have React Fiber source location\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\tif (selectableElements.length === 0) {\n\t\t\tif (this.hoveredElement) {\n\t\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t\t}\n\t\t\tthis.hoveredElement = null;\n\t\t\tthis.hoverOverlay.style.display = \"none\";\n\t\t\tthis.hideChildrenOverlays();\n\t\t\treturn;\n\t\t}\n\n\t\t// Get topmost element (first in array)\n\t\tconst topElement = selectableElements[0];\n\t\tif (!topElement) return; // Type guard for noUncheckedIndexedAccess\n\n\t\t// Don't show hover overlay if this is the selected element\n\t\tif (topElement === this.selectedElement) {\n\t\t\tthis.hoverOverlay.style.display = \"none\";\n\t\t\tthis.hideChildrenOverlays();\n\t\t\treturn;\n\t\t}\n\n\t\t// Update hovered element\n\t\tif (this.hoveredElement && this.hoveredElement !== topElement) {\n\t\t\tthis.hoveredElement.removeAttribute(\"data-fb-hovered\");\n\t\t}\n\n\t\tthis.hoveredElement = topElement;\n\t\tthis.hoveredElement.setAttribute(\"data-fb-hovered\", \"true\");\n\n\t\t// Show hover overlay\n\t\tthis.updateOverlayPosition(this.hoverOverlay, topElement);\n\t\tthis.hoverOverlay.style.display = \"block\";\n\n\t\t// Show children overlays if this is a container without direct text\n\t\tif (\n\t\t\tthis.isContainer(topElement) &&\n\t\t\t!this.hasDirectTextContent(topElement)\n\t\t) {\n\t\t\tthis.showChildrenOverlays(topElement);\n\t\t} else {\n\t\t\tthis.hideChildrenOverlays();\n\t\t}\n\t};\n\n\tprivate showChildrenOverlays(parent: HTMLElement) {\n\t\t// Get direct children with React Fiber source\n\t\tconst children = Array.from(parent.children).filter((child) => {\n\t\t\tconst source = this.getReactFiberSource(child as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\t// Ensure we have enough child overlays\n\t\twhile (this.childrenOverlays.length < children.length) {\n\t\t\tthis.childrenOverlays.push(this.createChildOverlay());\n\t\t}\n\n\t\t// Show overlay for each child\n\t\tchildren.forEach((child, index) => {\n\t\t\tconst overlay = this.childrenOverlays[index];\n\t\t\tif (overlay) {\n\t\t\t\tthis.updateOverlayPosition(overlay, child);\n\t\t\t\toverlay.style.display = \"block\";\n\t\t\t}\n\t\t});\n\n\t\t// Hide unused child overlays\n\t\tfor (let i = children.length; i < this.childrenOverlays.length; i++) {\n\t\t\tconst overlay = this.childrenOverlays[i];\n\t\t\tif (overlay) {\n\t\t\t\toverlay.style.display = \"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate hideChildrenOverlays() {\n\t\tfor (const overlay of this.childrenOverlays) {\n\t\t\toverlay.style.display = \"none\";\n\t\t}\n\t}\n\n\tprivate currentSelectionIndex = 0;\n\tprivate lastClickTime = 0;\n\tprivate lastClickPosition = { x: 0, y: 0 };\n\n\tprivate handleClick = (e: MouseEvent) => {\n\t\tif (!this.isEnabled) return;\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif (!this.hoveredElement) return;\n\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastClick = now - this.lastClickTime;\n\t\tconst distanceMoved = Math.hypot(\n\t\t\te.clientX - this.lastClickPosition.x,\n\t\t\te.clientY - this.lastClickPosition.y,\n\t\t);\n\n\t\t// Get all elements at click point for cycling\n\t\tconst elementsAtPoint = document.elementsFromPoint(e.clientX, e.clientY);\n\t\tconst selectableElements = elementsAtPoint.filter((el) => {\n\t\t\tif (\n\t\t\t\tel.classList.contains(\"fb-design-mode-overlay\") ||\n\t\t\t\tel.classList.contains(\"fb-design-mode-tag\")\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Must have React Fiber source location\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\treturn source !== null;\n\t\t}) as HTMLElement[];\n\n\t\t// Cycle through nested elements on repeated clicks\n\t\tif (\n\t\t\ttimeSinceLastClick < 1000 &&\n\t\t\tdistanceMoved < 10 &&\n\t\t\tselectableElements.length > 1\n\t\t) {\n\t\t\tthis.currentSelectionIndex =\n\t\t\t\t(this.currentSelectionIndex + 1) % selectableElements.length;\n\t\t} else {\n\t\t\tthis.currentSelectionIndex = 0;\n\t\t}\n\n\t\tconst target = selectableElements[this.currentSelectionIndex];\n\t\tif (!target) return; // Type guard for noUncheckedIndexedAccess\n\n\t\t// Get source location\n\t\tconst source = this.getReactFiberSource(target);\n\t\tif (!source) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update selected element marker\n\t\tif (this.selectedElement) {\n\t\t\tthis.selectedElement.removeAttribute(\"data-fb-selected\");\n\t\t}\n\n\t\tthis.selectedElement = target;\n\t\tthis.selectedElement.setAttribute(\"data-fb-selected\", \"true\");\n\n\t\t// Update selection overlay and tag\n\t\tthis.updateOverlayPosition(this.selectionOverlay, target);\n\t\tthis.selectionOverlay.style.display = \"block\";\n\n\t\tthis.updateTagLabel(target);\n\t\tthis.selectionTagLabel.style.display = \"block\";\n\n\t\t// Send selection data to parent\n\t\tthis.sendElementData(target, source);\n\n\t\t// Update last click info\n\t\tthis.lastClickTime = now;\n\t\tthis.lastClickPosition = { x: e.clientX, y: e.clientY };\n\t};\n\n\tprivate updateOverlayPosition(overlay: HTMLDivElement, element: HTMLElement) {\n\t\tconst rect = element.getBoundingClientRect();\n\t\tObject.assign(overlay.style, {\n\t\t\ttop: `${rect.top + window.scrollY}px`,\n\t\t\tleft: `${rect.left + window.scrollX}px`,\n\t\t\twidth: `${rect.width}px`,\n\t\t\theight: `${rect.height}px`,\n\t\t});\n\t}\n\n\tprivate updateTagLabel(element: HTMLElement) {\n\t\tconst rect = element.getBoundingClientRect();\n\t\tconst tagName = element.tagName.toLowerCase();\n\n\t\tthis.selectionTagLabel.textContent = tagName;\n\t\tObject.assign(this.selectionTagLabel.style, {\n\t\t\ttop: `${rect.top + window.scrollY}px`,\n\t\t\tleft: `${rect.left + window.scrollX}px`,\n\t\t});\n\t}\n\n\tprivate getRelevantStyles(element: HTMLElement): Record<string, string> {\n\t\tconst computed = window.getComputedStyle(element);\n\t\tconst relevantProps = [\n\t\t\t\"display\",\n\t\t\t\"position\",\n\t\t\t\"width\",\n\t\t\t\"height\",\n\t\t\t\"padding\",\n\t\t\t\"margin\",\n\t\t\t\"backgroundColor\",\n\t\t\t\"color\",\n\t\t\t\"fontSize\",\n\t\t\t\"fontFamily\",\n\t\t];\n\n\t\tconst styles: Record<string, string> = {};\n\t\tfor (const prop of relevantProps) {\n\t\t\tstyles[prop] = computed.getPropertyValue(prop);\n\t\t}\n\t\treturn styles;\n\t}\n\n\t/**\n\t * Extract direct text content from DOM (not from nested children)\n\t */\n\tprivate getDirectTextContent(element: HTMLElement): string | null {\n\t\tconst directTextNodes = Array.from(element.childNodes)\n\t\t\t.filter((node) => node.nodeType === Node.TEXT_NODE)\n\t\t\t.map((node) => node.textContent?.trim())\n\t\t\t.filter(Boolean);\n\n\t\treturn directTextNodes.length > 0 ? directTextNodes.join(\" \") : null;\n\t}\n\n\tprivate sendElementData(element: HTMLElement, source: SourceLocation) {\n\t\tconst directText = this.getDirectTextContent(element);\n\n\t\tconst data: ElementSelectedMessage = {\n\t\t\ttype: \"FB_ELEMENT_SELECTED\",\n\t\t\tdata: {\n\t\t\t\t// Source location from React Fiber\n\t\t\t\tsourceFile: source.fileName,\n\t\t\t\tsourceLine: source.lineNumber,\n\t\t\t\tsourceColumn: source.columnNumber,\n\n\t\t\t\t// DOM properties\n\t\t\t\ttagName: element.tagName,\n\t\t\t\tclassName: element.className,\n\t\t\t\ttextContent: directText,\n\t\t\t\tsrc: element.getAttribute(\"src\") || undefined,\n\t\t\t\talt: element.getAttribute(\"alt\") || undefined,\n\t\t\t\thref: element.getAttribute(\"href\") || undefined,\n\t\t\t\ttarget: element.getAttribute(\"target\") || undefined,\n\t\t\t\trel: element.getAttribute(\"rel\") || undefined,\n\t\t\t\tcomputedStyles: this.getRelevantStyles(element),\n\t\t\t},\n\t\t};\n\n\t\t// Send to parent window\n\t\twindow.parent.postMessage(data, \"*\");\n\t}\n\n\t/**\n\t * Handle request to get all elements' current state\n\t * Used for computing diffs on save (Lovable's approach)\n\t */\n\tprivate handleGetAllElementsState() {\n\t\tconst allElements = document.querySelectorAll(\"*\");\n\t\tconst elementsState: Array<{\n\t\t\tsourceFile: string;\n\t\t\tsourceLine: number;\n\t\t\tsourceColumn: number;\n\t\t\tclassName: string;\n\t\t\ttextContent: string | null;\n\t\t\tsrc?: string;\n\t\t\talt?: string;\n\t\t\thref?: string;\n\t\t\ttarget?: string;\n\t\t\trel?: string;\n\t\t}> = [];\n\n\t\tfor (const el of allElements) {\n\t\t\t// Skip our own overlays\n\t\t\tif (\n\t\t\t\t(el as HTMLElement).classList?.contains(\"fb-design-mode-overlay\") ||\n\t\t\t\t(el as HTMLElement).classList?.contains(\"fb-design-mode-tag\")\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (!source) continue;\n\n\t\t\tconst element = el as HTMLElement;\n\n\t\t\t// Check if this is an Image component wrapper with an <img> child\n\t\t\tlet actualElement = element;\n\t\t\tif (element.tagName !== \"IMG\") {\n\t\t\t\tconst imgChild = element.querySelector(\"img\");\n\t\t\t\tif (imgChild) {\n\t\t\t\t\tactualElement = imgChild as HTMLElement;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst textContent = this.getDirectTextContent(element);\n\n\t\t\t// Get className as string - handle SVG elements which have className as SVGAnimatedString\n\t\t\tlet className = \"\";\n\t\t\tif (element.className) {\n\t\t\t\t// For SVG elements, className is SVGAnimatedString with .baseVal property\n\t\t\t\tif (typeof element.className === \"string\") {\n\t\t\t\t\tclassName = element.className;\n\t\t\t\t} else if (\"baseVal\" in element.className) {\n\t\t\t\t\tclassName = (element.className as { baseVal: string }).baseVal;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telementsState.push({\n\t\t\t\tsourceFile: source.fileName,\n\t\t\t\tsourceLine: source.lineNumber,\n\t\t\t\tsourceColumn: source.columnNumber,\n\t\t\t\tclassName,\n\t\t\t\ttextContent,\n\t\t\t\tsrc: actualElement.getAttribute(\"src\") || undefined,\n\t\t\t\talt: actualElement.getAttribute(\"alt\") || undefined,\n\t\t\t\thref: element.getAttribute(\"href\") || undefined,\n\t\t\t\ttarget: element.getAttribute(\"target\") || undefined,\n\t\t\t\trel: element.getAttribute(\"rel\") || undefined,\n\t\t\t});\n\t\t}\n\n\t\t// Send back to parent\n\t\twindow.parent.postMessage(\n\t\t\t{\n\t\t\t\ttype: \"FB_ALL_ELEMENTS_STATE\",\n\t\t\t\tdata: elementsState,\n\t\t\t},\n\t\t\t\"*\",\n\t\t);\n\t}\n\n\t/**\n\t * Handle optimistic element updates from parent window\n\t * Uses React Fiber source to find the correct element\n\t */\n\tprivate handleUpdateElement(message: DesignModeMessage) {\n\t\tconst { sourceFile, sourceLine, sourceColumn, updates } = message;\n\n\t\tif (!sourceFile || !sourceLine || !updates) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find element by matching React Fiber source\n\t\tconst allElements = document.querySelectorAll(\"*\");\n\n\t\tfor (const el of allElements) {\n\t\t\tconst source = this.getReactFiberSource(el as HTMLElement);\n\t\t\tif (\n\t\t\t\tsource?.fileName === sourceFile &&\n\t\t\t\tsource?.lineNumber === sourceLine &&\n\t\t\t\tsource?.columnNumber === sourceColumn\n\t\t\t) {\n\t\t\t\tlet element = el as HTMLElement;\n\n\t\t\t\t// Special case: if we're updating image properties (src/alt) but found a container,\n\t\t\t\t// look for an <img> child element\n\t\t\t\tif (\n\t\t\t\t\t(updates.src !== undefined || updates.alt !== undefined) &&\n\t\t\t\t\telement.tagName !== \"IMG\"\n\t\t\t\t) {\n\t\t\t\t\tconst imgChild = element.querySelector(\"img\");\n\t\t\t\t\tif (imgChild) {\n\t\t\t\t\t\telement = imgChild as HTMLElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply optimistic updates\n\t\t\t\tif (updates.className !== undefined) {\n\t\t\t\t\t// Generate CSS for new Tailwind classes before applying\n\t\t\t\t\tconst generator = getTailwindGenerator();\n\t\t\t\t\tgenerator.generateClasses(updates.className);\n\n\t\t\t\t\t// Apply the className\n\t\t\t\t\telement.className = updates.className;\n\t\t\t\t}\n\n\t\t\t\tif (updates.textContent !== undefined) {\n\t\t\t\t\t// Only update first text node to preserve child elements\n\t\t\t\t\tconst textNode = Array.from(element.childNodes).find(\n\t\t\t\t\t\t(node) => node.nodeType === Node.TEXT_NODE,\n\t\t\t\t\t);\n\t\t\t\t\tif (textNode) {\n\t\t\t\t\t\ttextNode.textContent = updates.textContent;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.textContent = updates.textContent;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (updates.src !== undefined && \"src\" in element) {\n\t\t\t\t\t// Use setAttribute to force browser reload, bypassing React's state management\n\t\t\t\t\telement.setAttribute(\"src\", updates.src);\n\t\t\t\t\t// Also update srcset to prevent fallback\n\t\t\t\t\tif (element.hasAttribute(\"srcset\")) {\n\t\t\t\t\t\telement.removeAttribute(\"srcset\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (updates.alt !== undefined && \"alt\" in element) {\n\t\t\t\t\t(element as HTMLImageElement).alt = updates.alt;\n\t\t\t\t}\n\n\t\t\t\tif (updates.href !== undefined && \"href\" in element) {\n\t\t\t\t\telement.setAttribute(\"href\", updates.href);\n\t\t\t\t}\n\n\t\t\t\tif (updates.target !== undefined && \"target\" in element) {\n\t\t\t\t\telement.setAttribute(\"target\", updates.target);\n\t\t\t\t}\n\n\t\t\t\tif (updates.rel !== undefined && \"rel\" in element) {\n\t\t\t\t\telement.setAttribute(\"rel\", updates.rel);\n\t\t\t\t}\n\n\t\t\t\t// Update overlays if this is the hovered or selected element\n\t\t\t\tif (element === this.hoveredElement) {\n\t\t\t\t\tthis.updateOverlayPosition(this.hoverOverlay, element);\n\t\t\t\t}\n\t\t\t\tif (element === this.selectedElement) {\n\t\t\t\t\tthis.updateOverlayPosition(this.selectionOverlay, element);\n\t\t\t\t\tthis.updateTagLabel(element);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle theme update from parent window\n\t * Apply CSS variables using a style tag (NOT inline styles) to maintain proper CSS cascade\n\t * Note: We don't change the dark class - that's controlled by the native theme switcher\n\t */\n\tprivate handleUpdateTheme(theme?: {\n\t\tlightVariables?: Record<string, string>;\n\t\tdarkVariables?: Record<string, string>;\n\t}) {\n\t\tif (!theme) return;\n\n\t\t// Find or create the style element for design mode theme overrides\n\t\tlet styleEl = document.getElementById(\n\t\t\t\"fb-design-mode-theme\",\n\t\t) as HTMLStyleElement;\n\t\tif (!styleEl) {\n\t\t\tstyleEl = document.createElement(\"style\");\n\t\t\tstyleEl.id = \"fb-design-mode-theme\";\n\t\t\tdocument.head.appendChild(styleEl);\n\t\t}\n\n\t\t// Build CSS with both light and dark theme variables\n\t\tlet css = \"\";\n\n\t\t// Light theme variables in :root (includes colors, fonts, radius)\n\t\tif (theme.lightVariables && Object.keys(theme.lightVariables).length > 0) {\n\t\t\tcss += \":root {\\n\";\n\t\t\tfor (const [key, value] of Object.entries(theme.lightVariables)) {\n\t\t\t\tcss += ` ${key}: ${value};\\n`;\n\t\t\t}\n\t\t\tcss += \"}\\n\\n\";\n\t\t}\n\n\t\t// Dark theme variables in .dark (only colors, not fonts/radius)\n\t\tif (theme.darkVariables && Object.keys(theme.darkVariables).length > 0) {\n\t\t\tcss += \".dark {\\n\";\n\t\t\tfor (const [key, value] of Object.entries(theme.darkVariables)) {\n\t\t\t\tcss += ` ${key}: ${value};\\n`;\n\t\t\t}\n\t\t\tcss += \"}\\n\";\n\t\t}\n\n\t\t// Apply the CSS\n\t\tstyleEl.textContent = css;\n\t}\n}\n\n// Initialize when script loads - only in browser environment\n// Tailwind Play CDN handles all CSS generation automatically\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n\tnew DesignModeOverlay();\n}\n"]}
|