@paulpaulstudio/strapi-render 0.4.0 → 0.4.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.cjs CHANGED
@@ -347,7 +347,7 @@ function resolveUrl(value, baseUrl) {
347
347
  return value.url;
348
348
  }
349
349
  var HOVER_OUTLINE_COLOR2 = "#FA501E";
350
- function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "lazy", fallback, allowedTypes, multiple = false }) {
350
+ function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "lazy", fallback, allowedTypes, multiple = false, width, height, draggable }) {
351
351
  const ctx = useStrapiEditMode();
352
352
  const containerRef = react.useRef(null);
353
353
  const imgRef = react.useRef(null);
@@ -406,11 +406,12 @@ function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "l
406
406
  ref: imgRef,
407
407
  src: resolveUrl(value, baseUrl),
408
408
  alt: alt ?? value.alternativeText ?? value.name ?? "",
409
- width: value.width,
410
- height: value.height,
409
+ width: width ?? value.width,
410
+ height: height ?? value.height,
411
411
  loading,
412
412
  className,
413
- style
413
+ style,
414
+ draggable
414
415
  }
415
416
  );
416
417
  if (!ctx.enabled) return imgEl;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx"],"names":["createContext","useContext","useState","useRef","useEffect","useCallback","value","useMemo","jsxs","jsx","Fragment","Children","isValidElement","cloneElement","createElement","HOVER_OUTLINE_COLOR","inner","HOVER_OUTLINE"],"mappings":";;;;;AAyBA,IAAM,OAAO,MAAM;AAAC,CAAA;AACpB,IAAM,kBAAkBA,mBAAA,CAA6B;AAAA,EACnD,OAAA,EAAS,KAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,sBAAa,GAAA,EAAI;AAAA,EACjB,OAAA,EAAS,KAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,eAAA,EAAiB,IAAA;AAAA,EACjB,SAAA,EAAW,IAAA;AAAA,EACX,WAAA,EAAa,IAAA;AAAA,EACb,MAAA,EAAQ,IAAA;AAAA,EACR,eAAA,EAAiB,IAAA;AAAA,EACjB,eAAe,MAAM;AACvB,CAAC,CAAA;AAEM,SAAS,iBAAA,GAAmC;AACjD,EAAA,OAAOC,iBAAW,eAAe,CAAA;AACnC;AAOO,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAU,OAAA,EAAS,iBAAgB,EAAkB;AAC5F,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,cAAA,CAAqD,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AACpH,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAIA,cAAA,iBAAqC,IAAI,KAAK,CAAA;AAC5E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,kBAAA,GAAqBC,YAAA,iBAA0C,IAAI,GAAA,EAAK,CAAA;AAE9E,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,WAAA,CAAY,EAAE,OAAA,EAAS,eAAA,EAAiB,KAAA,EAAO,MAAM,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,KAAM,GAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AACrC,MAAA,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,SAAS,OAAO,CAAA;AAAA,EAC9E,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAGrB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC9B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,EAAK,EAAG,GAAG,CAAA;AAAA,IACtF,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAGrB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,SAAS,MAAM,CAAA,EAAiB;AAC9B,MAAA,MAAM,IAAI,CAAA,CAAE,IAAA;AACZ,MAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,MAAA,IAAI,CAAA,CAAE,SAAS,gBAAA,EAAkB;AAC/B,QAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AACvB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,uBAAA,EAAyB;AACtC,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA,IAAI,EAAE,EAAA,EAAI;AACR,UAAA,UAAA,iBAAW,IAAI,KAAK,CAAA;AACpB,UAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,kBAAA,CAAmB,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,sBAAA,EAAwB;AACrC,QAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,EAAE,IAAI,CAAA;AACtD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,EAAE,KAAK,CAAA;AAChB,UAAA,kBAAA,CAAmB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AAAA,QAC1C;AACA,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,SAAA,GAAYC,iBAAA,CAAY,CAAC,IAAA,EAAc,WAA4BC,MAAAA,KAAmB;AAC1F,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,IAAI,IAAA,EAAM,EAAE,MAAM,SAAA,EAAW,KAAA,EAAAA,QAAO,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAEvB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC7D,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,SAAA,EAAW,KAAA,EAAAA,MAAAA,EAAM,EAAG,GAAG,CAAA;AAAA,MACnF,CAAA,CAAA,MAAQ;AAAA,MAAe;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcD,iBAAA,CAAY,CAAC,IAAA,KAAiB;AAChD,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC/D,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,wBAAA;AAAA,UACN,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ;AAAA,SACtC;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,MAAA,kBAAA,CAAmB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,kBAAkBA,iBAAA,CAAY,CAAC,IAAA,EAAc,QAAA,EAAmB,cAAoC,YAAA,KAA0B;AAClI,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC/D,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,IAAA;AAAA,UAAM,QAAA;AAAA,UAAU,YAAA;AAAA,UAAc;AAAA,SAChC;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,IAAA,EAAc,QAAA,KAAmC;AAClF,IAAA,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,OAAO,MAAM;AAAE,MAAA,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IAAG,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQE,cAAuB,OAAO;AAAA,IAC1C,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA,EAAS,QAAQ,IAAA,GAAO,CAAA;AAAA,IACxB,YAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,QAAA,EAAU,OAAA,EAAS,YAAA,EAAc,eAAA,EAAiB,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAC,CAAA;AAEtH,EAAA,uBACEC,eAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EACvB,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS,OAAA,oBAAWC,cAAA,CAAC,OAAA,EAAA,EAAQ;AAAA,GAAA,EAChC,CAAA;AAEJ;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,iBAAiB,OAAA,EAAS,MAAA,KAAW,iBAAA,EAAkB;AACtF,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,IAAmB,CAAC,cAAc,OAAO,IAAA;AAE1D,EAAA,uBACED,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,eAAA,oBACCC,cAAA,CAAC,SAAI,KAAA,EAAO;AAAA,UACV,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,CAAA;AAAA,UACd,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,QAAA,EAAU;AAAA,WAET,QAAA,EAAA,eAAA,EACH,CAAA;AAAA,wBAEFA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,QAAA,EAAU,gBAAgB,CAAC,OAAA;AAAA,YAC3B,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,eAAe,MAAA,GAAS,MAAA;AAAA,cACpC,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ,gBAAA;AAAA,cACR,OAAA,EAAS,WAAA;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAe,WAAA;AAAA,cACf,aAAA,EAAe,OAAA;AAAA,cACf,MAAA,EAAQ,eAAe,MAAA,GAAS,SAAA;AAAA,cAChC,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,GAAA,EAAK,EAAA;AAAA,cACL,SAAA,EAAW,4BAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACd;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,SAAA;AACnC,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,MAAA;AAAA,cAChC;AAAA,YACF,CAAA;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,MAAA;AACnC,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,SAAA;AAAA,cAChC;AAAA,YACF,CAAA;AAAA,YAEC,QAAA,EAAA,YAAA,mBACCA,cAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,iBAAA,EAAU,oBAEhBD,eAAA,CAAAE,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAD,cAAA,CAAC,UAAK,KAAA,EAAO;AAAA,gBACX,UAAA,EAAY,SAAA;AAAA,gBAAW,KAAA,EAAO,MAAA;AAAA,gBAC9B,KAAA,EAAO,EAAA;AAAA,gBAAI,MAAA,EAAQ,EAAA;AAAA,gBAAI,YAAA,EAAc,KAAA;AAAA,gBACrC,OAAA,EAAS,aAAA;AAAA,gBAAe,UAAA,EAAY,QAAA;AAAA,gBAAU,cAAA,EAAgB,QAAA;AAAA,gBAC9D,QAAA,EAAU,EAAA;AAAA,gBAAI,UAAA,EAAY;AAAA,eAC5B,EAAI,kBAAQ,IAAA,EAAK,CAAA;AAAA,8BACjBA,cAAA,CAAC,UAAK,QAAA,EAAA,WAAA,EAAS;AAAA,aAAA,EACjB;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;ACzQA,IAAM,cAAA,uBAAqB,GAAA,CAAqB;AAAA,EAC9C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsB,SAAA;AAarB,SAAS,YAAY,EAAE,IAAA,EAAM,MAAM,KAAA,EAAO,QAAA,EAAU,WAAU,EAAqB;AACxF,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,GAAA,GAAMN,aAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAcA,aAA2B,MAAS,CAAA;AAGxD,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,IAAA,IAAI,WAAA,CAAY,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,OAAA,EAAS;AACpD,MAAA,WAAA,CAAY,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,WAAA,IAAe,EAAA;AAAA,IACnD;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,CAAI,OAAA,EAAS,IAAI,CAAC,CAAA;AAEtB,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBAAOK,cAAAA,CAAAC,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,GAAA,GAAMC,cAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAEzC,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAKC,qBAAe,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAC9C,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,MAAM,aAAA,GAAiB,EAAA,CAAG,KAAA,CAAM,KAAA,IAAiC,EAAC;AAClE,IAAA,MAAM,aAAA,GAAiB,EAAA,CAAG,KAAA,CAAM,SAAA,IAAwB,EAAA;AAExD,IAAA,MAAM,WAAA,GAAmC;AAAA,MACvC,OAAA,EAAS,wBAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,UAAA,EAAY,0BAAA;AAAA,MACZ,MAAA,EAAQ,YAAY,MAAA,GAAS,SAAA;AAAA,MAC7B,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAA,EAAK,CAAC,IAAA,KAA6B;AAAE,QAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,MAAM,CAAA;AAAA,MACzD,SAAA,EAAW,CAAC,aAAA,EAAe,SAAA,EAAW,gBAAgB,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAChF,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,mBAAA;AAAA,MACxD,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,eAAA,GAAkB,gBAAA;AACxB,MAAA,KAAA,CAAM,8BAAA,GAAiC,IAAA;AACvC,MAAA,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,mBAAA;AACtD,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,MACxD,CAAA;AACA,MAAA,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,QAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,QAAA,MAAA,CAAO,MAAM,YAAA,GAAe,aAAA;AAC5B,QAAA,MAAA,CAAO,MAAM,YAAA,GAAe,QAAA;AAC5B,QAAA,MAAM,OAAA,GAAU,OAAO,WAAA,IAAe,EAAA;AACtC,QAAA,MAAM,WAAW,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAS,YAAY,OAAA,IAAW,EAAA;AAC7E,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,QAAA,GAAW,SAAS,QAAA,GAAY,OAAA,KAAY,KAAK,IAAA,GAAO,MAAA,CAAO,OAAO,CAAA,GAAK,OAAA;AACjF,UAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,QACpC;AAAA,MACF,CAAA;AACA,MAAA,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAE5C,QAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,CAAA,CAAE,QAAA,IAAY,SAAS,MAAA,EAAQ;AACvD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAC,CAAA,CAAE,cAA8B,IAAA,EAAK;AAAA,QACxC;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAC,CAAA,CAAE,cAA8B,IAAA,EAAK;AAAA,QACxC;AAAA,MACF,CAAA;AAAA,IACF;AAIA,IAAA,OAAOC,kBAAA,CAAa,IAAI,KAAK,CAAA;AAAA,EAC/B;AAGA,EAAA,uBACEJ,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,CAAC,gBAAA,EAAkB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACjE,KAAA,EAAO,EAAE,OAAA,EAAS,wBAAA,EAA0B,eAAe,CAAA,EAAE;AAAA,MAE5D;AAAA;AAAA,GACH;AAEJ;ACnHO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,GAAY,QAAQ,EAAA,GAAK,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EAAoB;AACjH,EAAA,MAAM,OAAA,GAAU,aAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,GAAY,EAAA,GAAK,OAAO,KAAK,CAAA,CAAA;AACtF,EAAA,MAAM,KAAKK,mBAAA,CAAc,EAAA,EAAI,EAAE,SAAA,IAAa,OAAO,CAAA;AACnD,EAAA,uBACEL,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAY,IAAA,EAAM,SAAA,EAAW,OACvC,QAAA,EAAA,EAAA,EACH,CAAA;AAEJ;ACJA,SAAS,UAAA,CAAW,OAAyB,OAAA,EAA0B;AACrE,EAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,SAAU,KAAA,CAAM,GAAA;AAC/C,EAAA,IAAI,SAAS,OAAO,CAAA,EAAG,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,WAAW,GAAG,CAAA,GAAI,KAAK,GAAG,CAAA,EAAG,MAAM,GAAG,CAAA,CAAA;AACpG,EAAA,OAAO,KAAA,CAAM,GAAA;AACf;AAEA,IAAMM,oBAAAA,GAAsB,SAAA;AAErB,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,GAAU,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,QAAA,GAAW,OAAM,EAAqB;AACzJ,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,YAAA,GAAeZ,aAAwB,IAAI,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,aAAyB,IAAI,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,IAAA,EAAM,CAAC,MAAA,KAAW;AACtD,MAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACnC,MAAA,WAAA,EAAY;AAEZ,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,KAAA,IAAU,MAAA,EAAoC;AACpI,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,GAAM,UAAA,CAAW,MAAA,EAA4B,OAAO,CAAA;AAAA,MACrE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,KAAK,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS,uBAAOM,cAAAA,CAAAC,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,IAAY,IAAA,EAAK,CAAA;AAC7C,IAAA,uBACED,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,cAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAa,OAAA;AAAA,QACb,OAAA,EAAS,WAAA;AAAA,QACT,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeM,oBAAAA;AAAA,QAAqB,CAAA;AAAA,QAClG,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,QAAe,CAAA;AAAA,QAC5F,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY,kBAAA;AAAA,UACZ,MAAA,EAAQ,4BAAA;AAAA,UACR,OAAA,EAAS,wBAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAe,WAAA;AAAA,UACf,aAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO,MAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,MAAM,wBACJN,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,GAAA,EAAK,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AAAA,MAC9B,GAAA,EAAK,GAAA,IAAO,KAAA,CAAM,eAAA,IAAmB,MAAM,IAAA,IAAQ,EAAA;AAAA,MACnD,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,OAAO,KAAA;AAEzB,EAAA,uBACED,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAa,OAAA;AAAA,MACb,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,cAAA,EAAgB,OAAA,EAAS,wBAAA,EAA0B,aAAA,EAAe,CAAA,EAAG,UAAA,EAAY,0BAAA,EAA2B;AAAA,MACpJ,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeO,oBAAAA;AACtD,QAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,aAAA,CAAc,oBAAoB,CAAA;AAC/E,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,GAAA;AAAA,MAC/B,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,QAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,aAAA,CAAc,oBAAoB,CAAA;AAC/E,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,GAAA;AAAA,MAC/B,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,wBACDN,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,kBAAA,EAAgB,IAAA;AAAA,YAChB,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,CAAA;AAAA,cACL,KAAA,EAAO,CAAA;AAAA,cACP,UAAA,EAAY,MAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ,gBAAA;AAAA,cACR,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAe,WAAA;AAAA,cACf,aAAA,EAAe,QAAA;AAAA,cACf,MAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,CAAA;AAAA,cACT,UAAA,EAAY,2CAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,SAAA;AAAW,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,MAAA;AAAA,YAAQ,CAAA;AAAA,YAC3G,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,MAAA;AAAQ,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,SAAA;AAAA,YAAW,CAAA;AAAA,YAC5G,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;AC/GO,SAAS,WAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,UAAS,EAAuB;AACvF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,uBAAOA,cAAAA,CAAAC,mBAAAA,EAAA,EAAG,sBAAY,IAAA,EAAK,CAAA;AAAA,EAC7B;AACA,EAAA,uBACED,cAAAA,CAAAC,mBAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,CAAA,qBAChBD,cAAAA,CAACC,cAAAA,EAAA,EAAkB,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,EAAA,EAAtC,CAAwC,CACxD,CAAA,EACH,CAAA;AAEJ;ACGA,IAAM,aAAA,GAAgB,SAAA;AAGtB,SAAS,YAAA,CAAa,MAAkB,GAAA,EAAwB;AAC9D,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,uBACED,cAAAA,CAAC,GAAA,EAAA,EAAY,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,cAAA,EAAgB,WAAA,EAAa,mBAAA,EAAqB,CAAA,EAAE,EACvG,QAAA,EAAA,CAAA,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EADjD,GAER,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,KAAgB,IAAA,CAAK,IAAA;AACzB,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,mBAAKA,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAA,EAAY,kBAAA,EAAoB,SAAS,OAAA,EAAS,UAAA,EAAY,2BAA2B,QAAA,EAAU,OAAA,IAAY,QAAA,EAAA,EAAA,EAAG,CAAA;AACrJ,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,mBAAKA,cAAAA,CAAC,YAAQ,QAAA,EAAA,EAAA,EAAG,CAAA;AAChC,EAAA,IAAI,KAAK,MAAA,EAAQ,EAAA,mBAAKA,cAAAA,CAAC,QAAI,QAAA,EAAA,EAAA,EAAG,CAAA;AAC9B,EAAA,IAAI,KAAK,SAAA,EAAW,EAAA,mBAAKA,cAAAA,CAAC,OAAG,QAAA,EAAA,EAAA,EAAG,CAAA;AAChC,EAAA,IAAI,KAAK,aAAA,EAAe,EAAA,mBAAKA,cAAAA,CAAC,OAAG,QAAA,EAAA,EAAA,EAAG,CAAA;AACpC,EAAA,uBAAOA,cAAAA,CAACC,cAAAA,EAAA,EAAoB,gBAAN,GAAS,CAAA;AACjC;AAEA,SAAS,WAAA,CAAY,GAAU,GAAA,EAAwB;AACrD,EAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,IAAA,uBAAOD,cAAAA,CAAC,GAAA,EAAA,EAAc,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,IAAA,MAAM,GAAA,GAAO,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,IAAS,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,IAAA,uBAAOA,cAAAA,CAAC,GAAA,EAAA,EAAgB,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAuB,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,MAAA,KAAW,SAAA,GAAY,IAAA,GAAO,IAAA;AAChD,IAAA,uBACEA,cAAAA,CAAC,OAAA,EAAA,EACG,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBAC3BA,eAAC,IAAA,EAAA,EAAa,QAAA,EAAA,CAAA,EAAA,CAAG,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EAAxD,CAA0D,CACpE,KAHW,GAId,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,uBAAOA,eAAC,KAAA,EAAA,EAAc,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAO,QAAA,EAAA,CAAA,CAAA,CAAE,YAAY,EAAC,EAAG,IAAI,CAAC,CAAA,KAAO,EAAe,IAAI,CAAA,CAAE,KAAK,EAAE,CAAA,EAAE,KAAzE,GAAgF,CAAA;AAAA,EACnG;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAc,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,eAAA,IAAmB,EAAA,EAAA,EAAvD,GAA2D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,YAAY,IAAA,EAA0B;AAC7C,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,IAAe,EAAA;AAClC,MAAA,IAAI,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AAC/C,MAAA,MAAM,EAAA,GAAK,KAAA;AACX,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AACrC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAMO,MAAAA,GAAQ,YAAY,EAAE,CAAA,CAAE,OAAO,CAAC,CAAA,KAAqB,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA;AAC5E,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,GAAG,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA,EAAI,QAAA,EAAUA,MAAAA,CAAM,SAAS,CAAA,GAAIA,MAAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,CAAG,WAAA,IAAe,EAAA,EAAI,CAAA,EAAG,CAAA;AAClJ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,YAAY,EAAE,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/B,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA;AAC9B,QAAA,MAAM,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AACjB,QAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,GAAA,IAAO,IAAA,GAAO,IAAA;AAC9C,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,GAAA,IAAO,MAAA,GAAS,IAAA;AAC5C,QAAA,IAAI,GAAA,KAAQ,GAAA,EAAK,CAAA,CAAE,SAAA,GAAY,IAAA;AAC/B,QAAA,IAAI,QAAQ,GAAA,IAAO,GAAA,KAAQ,YAAY,GAAA,KAAQ,KAAA,IAAS,aAAA,GAAgB,IAAA;AACxE,QAAA,IAAI,GAAA,KAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,GAAO,IAAA;AAC7B,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAA4B;AACtD,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,QAAA,EAAU,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IACnE,CAAA,MAAA,IAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AACvC,MAAA,MAAM,QAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAAiB,aAAa,CAAC,CAAA,EAAG;AAC/D,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,MAC7D;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,GAAA,KAAQ,IAAA,GAAO,SAAA,GAAY,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,EAAA,CAAG,WAAA,IAAe,EAAA,EAAI,GAAG,CAAA;AAAA,IACxF,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,KAAK,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA,EAAI,iBAAiB,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA,IAAM,CAAA;AAAA,IAC5H,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC9D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,KAAA,EAAO,WAAU,EAAU;AAC9D,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,YAAA,GAAeb,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,SAAkB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAoB,EAAC;AAErE,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,YAAA,CAAa,OAAA,KAAY,IAAA,EAAM,YAAA,CAAa,OAAA,GAAU,MAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBACEK,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACF,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC,CAAA,EACzC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,8BAAA,EAA8B,IAAA;AAAA,MAC9B,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAa,QAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,wBAAA;AAAA,QACT,aAAA,EAAe,CAAA;AAAA,QACf,UAAA,EAAY,0BAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MAAe,CAAA;AAAA,MAC5F,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MAAe,CAAA;AAAA,MAC5F,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAe,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,MAAS,CAAA;AAAA,MACtJ,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,QAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,OAAO,CAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACnC,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,QACtC;AACA,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,QAAA;AAAA,MACxD,CAAA;AAAA,MAEC,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,MAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC;AAAA;AAAA,GACzC;AAEJ;ACnMA,IAAMQ,cAAAA,GAAgB,SAAA;AAoBf,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,SAAA,EAAW,OAAA,GAAU,IAAG,EAAU;AAC3F,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIf,cAAAA,CAAiB,SAAS,EAAE,CAAA;AACtD,EAAA,MAAM,OAAA,GAAUC,YAAAA,CAAe,KAAA,IAAS,EAAE,CAAA;AAG1C,EAAAC,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,EAAE,CAAA;AACpB,IAAA,OAAA,CAAQ,UAAU,KAAA,IAAS,EAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBAAOK,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAuB,QAAA,EAAA,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAE,CAAA;AAAA,EACzD;AAEA,EAAA,uBACED,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,QAAA,EAAU,YAAW,EACvD,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,QAAQ,MAAM;AACZ,UAAA,IAAI,KAAA,KAAU,QAAQ,OAAA,EAAS;AAC7B,YAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,KAAK,CAAA;AAAA,UACvC;AAAA,QACF,CAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeQ,cAAAA;AACtD,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,QACxD,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeA,cAAAA;AAAA,QAAe,CAAA;AAAA,QAC5F,YAAA,EAAc,CAAC,CAAA,KAAM;AAEnB,UAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,CAAA,CAAE,aAAA,EAAe;AAC9C,YAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,YAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,QAAA;AAAA,UACxD;AAAA,QACF,CAAA;AAAA,QACA,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA,EAAS,MAAM,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,QACpD,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAY,uBAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,wBAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,UAAA,EAAY,2CAAA;AAAA,UACZ,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,UAAA,EAAY;AAAA,SACd;AAAA,QACA,cAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAa;AAAA;AAAA,KACf;AAAA,oBACAR,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MAAG,QAAA,EAAU,EAAA;AAAA,MAAI,UAAA,EAAY,GAAA;AAAA,MACxC,aAAA,EAAe,WAAA;AAAA,MAAa,aAAA,EAAe,QAAA;AAAA,MAC3C,OAAA,EAAS,GAAA;AAAA,MAAK,UAAA,EAAY;AAAA,OACzB,QAAA,EAAA,oEAAA,EAEH;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface PendingChange {\n path: string;\n fieldType: StrapiFieldType;\n value: unknown;\n}\n\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n changes: Map<string, PendingChange>;\n isDirty: boolean;\n isCommitting: boolean;\n lastCommitError: string | null;\n setChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n clearChange: (path: string) => void;\n commit: () => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n changes: new Map(),\n isDirty: false,\n isCommitting: false,\n lastCommitError: null,\n setChange: noop,\n clearChange: noop,\n commit: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const [changes, setChanges] = useState<Map<string, PendingChange>>(new Map());\n const [isCommitting, setIsCommitting] = useState(false);\n const [lastCommitError, setLastCommitError] = useState<string | null>(null);\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const edit = params.get(\"__pp_edit\") === \"1\";\n const token = params.get(\"__pp_token\");\n setUrlState({ enabled: edit, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping to parent\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Listen for parent → iframe messages\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:commit-result\") {\n setIsCommitting(false);\n if (d.ok) {\n setChanges(new Map());\n setLastCommitError(null);\n } else {\n setLastCommitError(d.error || \"Speichern fehlgeschlagen\");\n }\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const setChange = useCallback((path: string, fieldType: StrapiFieldType, value: unknown) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.set(path, { path, fieldType, value });\n return next;\n });\n setLastCommitError(null);\n // Optional: send live change event for future \"show preview on parent\"\n if (typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage({ type: \"pp:edit:change\", path, fieldType, value }, \"*\");\n } catch { /* ignore */ }\n }\n }, []);\n\n const clearChange = useCallback((path: string) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.delete(path);\n return next;\n });\n }, []);\n\n const commit = useCallback(() => {\n if (changes.size === 0) return;\n if (typeof window === \"undefined\" || window.parent === window) return;\n setIsCommitting(true);\n setLastCommitError(null);\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:commit-request\",\n changes: Array.from(changes.values()),\n },\n \"*\",\n );\n } catch (err) {\n setIsCommitting(false);\n setLastCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [changes]);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:open-media-picker\",\n path, multiple, allowedTypes, currentValue,\n },\n \"*\",\n );\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n changes,\n isDirty: changes.size > 0,\n isCommitting,\n lastCommitError,\n setChange,\n clearChange,\n commit,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, changes, isCommitting, lastCommitError, setChange, clearChange, commit, openMediaPicker, onMediaPicked]);\n\n return (\n <EditModeContext.Provider value={value}>\n {children}\n {urlState.enabled && <SaveBar />}\n </EditModeContext.Provider>\n );\n}\n\nfunction SaveBar() {\n const { isDirty, isCommitting, lastCommitError, changes, commit } = useStrapiEditMode();\n if (!isDirty && !lastCommitError && !isCommitting) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 24,\n right: 24,\n zIndex: 999999,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n {lastCommitError && (\n <div style={{\n background: \"#FA501E\",\n color: \"#000\",\n padding: \"8px 14px\",\n marginBottom: 8,\n fontSize: 13,\n fontWeight: 600,\n maxWidth: 320,\n }}>\n {lastCommitError}\n </div>\n )}\n <button\n type=\"button\"\n onClick={commit}\n disabled={isCommitting || !isDirty}\n style={{\n background: isCommitting ? \"#666\" : \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"14px 22px\",\n fontSize: 13,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.2em\",\n cursor: isCommitting ? \"wait\" : \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#FA501E\";\n e.currentTarget.style.color = \"#000\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#000\";\n e.currentTarget.style.color = \"#EBC6DF\";\n }\n }}\n >\n {isCommitting ? (\n <span>Speichere…</span>\n ) : (\n <>\n <span style={{\n background: \"#FA501E\", color: \"#000\",\n width: 22, height: 22, borderRadius: \"50%\",\n display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: 11, fontWeight: 700,\n }}>{changes.size}</span>\n <span>Speichern</span>\n </>\n )}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Universeller Wrapper. Im Normal-Mode: rendert children unverändert.\n *\n * Im Edit-Mode:\n * - Für text/textarea/richText/email/number: macht das Top-Level-Child\n * `contenteditable`, mit dünnem orange Hover-Outline, sammelt Wert-Änderungen\n * in den globalen Edit-Context, der dann beim Klick auf \"Speichern\" alle\n * Änderungen in einem Roundtrip ans Parent schickt.\n * - Für andere Typen (media/select/checkbox): trägt ein Click-Handler bzw.\n * ein Overlay (Implementierung in jeweiligen Sugar-Komponenten).\n */\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n // Captured initial textContent on first mount in edit-mode (for revert-detection)\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n ctx.setChange(path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n // Enter ohne Shift = blur (commit local). Für richText/textarea kann user mit Shift+Enter Zeilenumbruch erzeugen.\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n } else {\n // Non-editable types: click handler wird von Sugar-Komponenten (StrapiImage etc.) gesetzt\n }\n\n return cloneElement(el, props);\n }\n\n // Fallback: span wrap\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiImage({ path, value, baseUrl, alt, className, style, loading = \"lazy\", fallback, allowedTypes, multiple = false }: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n ctx.setChange(path, \"media\", picked);\n unsubscribe();\n // Optimistic UI: swap src in-place wenn picked = single file mit url\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n onClick={handleClick}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n transition: \"outline-color 0.15s ease\",\n }}\n >\n + Bild hinzufügen\n </span>\n );\n }\n\n const imgEl = (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={value.width}\n height={value.height}\n loading={loading}\n className={className}\n style={style}\n />\n );\n\n if (!ctx.enabled) return imgEl;\n\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n style={{ position: \"relative\", display: \"inline-block\", outline: \"1px dashed transparent\", outlineOffset: 2, transition: \"outline-color 0.15s ease\" }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"0\";\n }}\n >\n {imgEl}\n <button\n type=\"button\"\n data-pp-edit-btn\n onClick={handleClick}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"6px 10px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n Ändern\n </button>\n </span>\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n ctx.setChange(path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n ctx.setChange(path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx"],"names":["createContext","useContext","useState","useRef","useEffect","useCallback","value","useMemo","jsxs","jsx","Fragment","Children","isValidElement","cloneElement","createElement","HOVER_OUTLINE_COLOR","inner","HOVER_OUTLINE"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface PendingChange {\n path: string;\n fieldType: StrapiFieldType;\n value: unknown;\n}\n\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n changes: Map<string, PendingChange>;\n isDirty: boolean;\n isCommitting: boolean;\n lastCommitError: string | null;\n setChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n clearChange: (path: string) => void;\n commit: () => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n changes: new Map(),\n isDirty: false,\n isCommitting: false,\n lastCommitError: null,\n setChange: noop,\n clearChange: noop,\n commit: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const [changes, setChanges] = useState<Map<string, PendingChange>>(new Map());\n const [isCommitting, setIsCommitting] = useState(false);\n const [lastCommitError, setLastCommitError] = useState<string | null>(null);\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const edit = params.get(\"__pp_edit\") === \"1\";\n const token = params.get(\"__pp_token\");\n setUrlState({ enabled: edit, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping to parent\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Listen for parent → iframe messages\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:commit-result\") {\n setIsCommitting(false);\n if (d.ok) {\n setChanges(new Map());\n setLastCommitError(null);\n } else {\n setLastCommitError(d.error || \"Speichern fehlgeschlagen\");\n }\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const setChange = useCallback((path: string, fieldType: StrapiFieldType, value: unknown) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.set(path, { path, fieldType, value });\n return next;\n });\n setLastCommitError(null);\n // Optional: send live change event for future \"show preview on parent\"\n if (typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage({ type: \"pp:edit:change\", path, fieldType, value }, \"*\");\n } catch { /* ignore */ }\n }\n }, []);\n\n const clearChange = useCallback((path: string) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.delete(path);\n return next;\n });\n }, []);\n\n const commit = useCallback(() => {\n if (changes.size === 0) return;\n if (typeof window === \"undefined\" || window.parent === window) return;\n setIsCommitting(true);\n setLastCommitError(null);\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:commit-request\",\n changes: Array.from(changes.values()),\n },\n \"*\",\n );\n } catch (err) {\n setIsCommitting(false);\n setLastCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [changes]);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:open-media-picker\",\n path, multiple, allowedTypes, currentValue,\n },\n \"*\",\n );\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n changes,\n isDirty: changes.size > 0,\n isCommitting,\n lastCommitError,\n setChange,\n clearChange,\n commit,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, changes, isCommitting, lastCommitError, setChange, clearChange, commit, openMediaPicker, onMediaPicked]);\n\n return (\n <EditModeContext.Provider value={value}>\n {children}\n {urlState.enabled && <SaveBar />}\n </EditModeContext.Provider>\n );\n}\n\nfunction SaveBar() {\n const { isDirty, isCommitting, lastCommitError, changes, commit } = useStrapiEditMode();\n if (!isDirty && !lastCommitError && !isCommitting) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 24,\n right: 24,\n zIndex: 999999,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n {lastCommitError && (\n <div style={{\n background: \"#FA501E\",\n color: \"#000\",\n padding: \"8px 14px\",\n marginBottom: 8,\n fontSize: 13,\n fontWeight: 600,\n maxWidth: 320,\n }}>\n {lastCommitError}\n </div>\n )}\n <button\n type=\"button\"\n onClick={commit}\n disabled={isCommitting || !isDirty}\n style={{\n background: isCommitting ? \"#666\" : \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"14px 22px\",\n fontSize: 13,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.2em\",\n cursor: isCommitting ? \"wait\" : \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#FA501E\";\n e.currentTarget.style.color = \"#000\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#000\";\n e.currentTarget.style.color = \"#EBC6DF\";\n }\n }}\n >\n {isCommitting ? (\n <span>Speichere…</span>\n ) : (\n <>\n <span style={{\n background: \"#FA501E\", color: \"#000\",\n width: 22, height: 22, borderRadius: \"50%\",\n display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: 11, fontWeight: 700,\n }}>{changes.size}</span>\n <span>Speichern</span>\n </>\n )}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Universeller Wrapper. Im Normal-Mode: rendert children unverändert.\n *\n * Im Edit-Mode:\n * - Für text/textarea/richText/email/number: macht das Top-Level-Child\n * `contenteditable`, mit dünnem orange Hover-Outline, sammelt Wert-Änderungen\n * in den globalen Edit-Context, der dann beim Klick auf \"Speichern\" alle\n * Änderungen in einem Roundtrip ans Parent schickt.\n * - Für andere Typen (media/select/checkbox): trägt ein Click-Handler bzw.\n * ein Overlay (Implementierung in jeweiligen Sugar-Komponenten).\n */\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n // Captured initial textContent on first mount in edit-mode (for revert-detection)\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n ctx.setChange(path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n // Enter ohne Shift = blur (commit local). Für richText/textarea kann user mit Shift+Enter Zeilenumbruch erzeugen.\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n } else {\n // Non-editable types: click handler wird von Sugar-Komponenten (StrapiImage etc.) gesetzt\n }\n\n return cloneElement(el, props);\n }\n\n // Fallback: span wrap\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n /** Optional width override (default: value.width). Akzeptiert `<img>`-Attribute. */\n width?: number | string;\n /** Optional height override (default: value.height). */\n height?: number | string;\n /** Optional ARIA/Image-Attribute, falls vom Customer gebraucht. */\n draggable?: boolean;\n priority?: boolean; // kompat zu Next.js Image-API, no-op\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiImage({ path, value, baseUrl, alt, className, style, loading = \"lazy\", fallback, allowedTypes, multiple = false, width, height, draggable }: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n ctx.setChange(path, \"media\", picked);\n unsubscribe();\n // Optimistic UI: swap src in-place wenn picked = single file mit url\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n onClick={handleClick}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n transition: \"outline-color 0.15s ease\",\n }}\n >\n + Bild hinzufügen\n </span>\n );\n }\n\n const imgEl = (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={style}\n draggable={draggable}\n />\n );\n\n if (!ctx.enabled) return imgEl;\n\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n style={{ position: \"relative\", display: \"inline-block\", outline: \"1px dashed transparent\", outlineOffset: 2, transition: \"outline-color 0.15s ease\" }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"0\";\n }}\n >\n {imgEl}\n <button\n type=\"button\"\n data-pp-edit-btn\n onClick={handleClick}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"6px 10px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n Ändern\n </button>\n </span>\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n ctx.setChange(path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n ctx.setChange(path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -119,8 +119,15 @@ interface StrapiImageProps {
119
119
  fallback?: React.ReactNode;
120
120
  allowedTypes?: string[];
121
121
  multiple?: boolean;
122
- }
123
- declare function StrapiImage({ path, value, baseUrl, alt, className, style, loading, fallback, allowedTypes, multiple }: StrapiImageProps): react_jsx_runtime.JSX.Element;
122
+ /** Optional width override (default: value.width). Akzeptiert `<img>`-Attribute. */
123
+ width?: number | string;
124
+ /** Optional height override (default: value.height). */
125
+ height?: number | string;
126
+ /** Optional ARIA/Image-Attribute, falls vom Customer gebraucht. */
127
+ draggable?: boolean;
128
+ priority?: boolean;
129
+ }
130
+ declare function StrapiImage({ path, value, baseUrl, alt, className, style, loading, fallback, allowedTypes, multiple, width, height, draggable }: StrapiImageProps): react_jsx_runtime.JSX.Element;
124
131
 
125
132
  interface StrapiListProps<T> {
126
133
  /** Pfad zum Array-Feld, z.B. "features" */
package/dist/index.d.ts CHANGED
@@ -119,8 +119,15 @@ interface StrapiImageProps {
119
119
  fallback?: React.ReactNode;
120
120
  allowedTypes?: string[];
121
121
  multiple?: boolean;
122
- }
123
- declare function StrapiImage({ path, value, baseUrl, alt, className, style, loading, fallback, allowedTypes, multiple }: StrapiImageProps): react_jsx_runtime.JSX.Element;
122
+ /** Optional width override (default: value.width). Akzeptiert `<img>`-Attribute. */
123
+ width?: number | string;
124
+ /** Optional height override (default: value.height). */
125
+ height?: number | string;
126
+ /** Optional ARIA/Image-Attribute, falls vom Customer gebraucht. */
127
+ draggable?: boolean;
128
+ priority?: boolean;
129
+ }
130
+ declare function StrapiImage({ path, value, baseUrl, alt, className, style, loading, fallback, allowedTypes, multiple, width, height, draggable }: StrapiImageProps): react_jsx_runtime.JSX.Element;
124
131
 
125
132
  interface StrapiListProps<T> {
126
133
  /** Pfad zum Array-Feld, z.B. "features" */
package/dist/index.js CHANGED
@@ -345,7 +345,7 @@ function resolveUrl(value, baseUrl) {
345
345
  return value.url;
346
346
  }
347
347
  var HOVER_OUTLINE_COLOR2 = "#FA501E";
348
- function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "lazy", fallback, allowedTypes, multiple = false }) {
348
+ function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "lazy", fallback, allowedTypes, multiple = false, width, height, draggable }) {
349
349
  const ctx = useStrapiEditMode();
350
350
  const containerRef = useRef(null);
351
351
  const imgRef = useRef(null);
@@ -404,11 +404,12 @@ function StrapiImage({ path, value, baseUrl, alt, className, style, loading = "l
404
404
  ref: imgRef,
405
405
  src: resolveUrl(value, baseUrl),
406
406
  alt: alt ?? value.alternativeText ?? value.name ?? "",
407
- width: value.width,
408
- height: value.height,
407
+ width: width ?? value.width,
408
+ height: height ?? value.height,
409
409
  loading,
410
410
  className,
411
- style
411
+ style,
412
+ draggable
412
413
  }
413
414
  );
414
415
  if (!ctx.enabled) return imgEl;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx"],"names":["value","useRef","useEffect","jsx","Fragment","HOVER_OUTLINE_COLOR","jsxs","inner","HOVER_OUTLINE","useState"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface PendingChange {\n path: string;\n fieldType: StrapiFieldType;\n value: unknown;\n}\n\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n changes: Map<string, PendingChange>;\n isDirty: boolean;\n isCommitting: boolean;\n lastCommitError: string | null;\n setChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n clearChange: (path: string) => void;\n commit: () => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n changes: new Map(),\n isDirty: false,\n isCommitting: false,\n lastCommitError: null,\n setChange: noop,\n clearChange: noop,\n commit: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const [changes, setChanges] = useState<Map<string, PendingChange>>(new Map());\n const [isCommitting, setIsCommitting] = useState(false);\n const [lastCommitError, setLastCommitError] = useState<string | null>(null);\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const edit = params.get(\"__pp_edit\") === \"1\";\n const token = params.get(\"__pp_token\");\n setUrlState({ enabled: edit, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping to parent\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Listen for parent → iframe messages\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:commit-result\") {\n setIsCommitting(false);\n if (d.ok) {\n setChanges(new Map());\n setLastCommitError(null);\n } else {\n setLastCommitError(d.error || \"Speichern fehlgeschlagen\");\n }\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const setChange = useCallback((path: string, fieldType: StrapiFieldType, value: unknown) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.set(path, { path, fieldType, value });\n return next;\n });\n setLastCommitError(null);\n // Optional: send live change event for future \"show preview on parent\"\n if (typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage({ type: \"pp:edit:change\", path, fieldType, value }, \"*\");\n } catch { /* ignore */ }\n }\n }, []);\n\n const clearChange = useCallback((path: string) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.delete(path);\n return next;\n });\n }, []);\n\n const commit = useCallback(() => {\n if (changes.size === 0) return;\n if (typeof window === \"undefined\" || window.parent === window) return;\n setIsCommitting(true);\n setLastCommitError(null);\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:commit-request\",\n changes: Array.from(changes.values()),\n },\n \"*\",\n );\n } catch (err) {\n setIsCommitting(false);\n setLastCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [changes]);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:open-media-picker\",\n path, multiple, allowedTypes, currentValue,\n },\n \"*\",\n );\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n changes,\n isDirty: changes.size > 0,\n isCommitting,\n lastCommitError,\n setChange,\n clearChange,\n commit,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, changes, isCommitting, lastCommitError, setChange, clearChange, commit, openMediaPicker, onMediaPicked]);\n\n return (\n <EditModeContext.Provider value={value}>\n {children}\n {urlState.enabled && <SaveBar />}\n </EditModeContext.Provider>\n );\n}\n\nfunction SaveBar() {\n const { isDirty, isCommitting, lastCommitError, changes, commit } = useStrapiEditMode();\n if (!isDirty && !lastCommitError && !isCommitting) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 24,\n right: 24,\n zIndex: 999999,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n {lastCommitError && (\n <div style={{\n background: \"#FA501E\",\n color: \"#000\",\n padding: \"8px 14px\",\n marginBottom: 8,\n fontSize: 13,\n fontWeight: 600,\n maxWidth: 320,\n }}>\n {lastCommitError}\n </div>\n )}\n <button\n type=\"button\"\n onClick={commit}\n disabled={isCommitting || !isDirty}\n style={{\n background: isCommitting ? \"#666\" : \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"14px 22px\",\n fontSize: 13,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.2em\",\n cursor: isCommitting ? \"wait\" : \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#FA501E\";\n e.currentTarget.style.color = \"#000\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#000\";\n e.currentTarget.style.color = \"#EBC6DF\";\n }\n }}\n >\n {isCommitting ? (\n <span>Speichere…</span>\n ) : (\n <>\n <span style={{\n background: \"#FA501E\", color: \"#000\",\n width: 22, height: 22, borderRadius: \"50%\",\n display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: 11, fontWeight: 700,\n }}>{changes.size}</span>\n <span>Speichern</span>\n </>\n )}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Universeller Wrapper. Im Normal-Mode: rendert children unverändert.\n *\n * Im Edit-Mode:\n * - Für text/textarea/richText/email/number: macht das Top-Level-Child\n * `contenteditable`, mit dünnem orange Hover-Outline, sammelt Wert-Änderungen\n * in den globalen Edit-Context, der dann beim Klick auf \"Speichern\" alle\n * Änderungen in einem Roundtrip ans Parent schickt.\n * - Für andere Typen (media/select/checkbox): trägt ein Click-Handler bzw.\n * ein Overlay (Implementierung in jeweiligen Sugar-Komponenten).\n */\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n // Captured initial textContent on first mount in edit-mode (for revert-detection)\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n ctx.setChange(path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n // Enter ohne Shift = blur (commit local). Für richText/textarea kann user mit Shift+Enter Zeilenumbruch erzeugen.\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n } else {\n // Non-editable types: click handler wird von Sugar-Komponenten (StrapiImage etc.) gesetzt\n }\n\n return cloneElement(el, props);\n }\n\n // Fallback: span wrap\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiImage({ path, value, baseUrl, alt, className, style, loading = \"lazy\", fallback, allowedTypes, multiple = false }: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n ctx.setChange(path, \"media\", picked);\n unsubscribe();\n // Optimistic UI: swap src in-place wenn picked = single file mit url\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n onClick={handleClick}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n transition: \"outline-color 0.15s ease\",\n }}\n >\n + Bild hinzufügen\n </span>\n );\n }\n\n const imgEl = (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={value.width}\n height={value.height}\n loading={loading}\n className={className}\n style={style}\n />\n );\n\n if (!ctx.enabled) return imgEl;\n\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n style={{ position: \"relative\", display: \"inline-block\", outline: \"1px dashed transparent\", outlineOffset: 2, transition: \"outline-color 0.15s ease\" }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"0\";\n }}\n >\n {imgEl}\n <button\n type=\"button\"\n data-pp-edit-btn\n onClick={handleClick}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"6px 10px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n Ändern\n </button>\n </span>\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n ctx.setChange(path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n ctx.setChange(path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/EditModeContext.tsx","../src/StrapiField.tsx","../src/StrapiText.tsx","../src/StrapiImage.tsx","../src/StrapiList.tsx","../src/StrapiBlocks.tsx","../src/StrapiMarkdownField.tsx"],"names":["value","useRef","useEffect","jsx","Fragment","HOVER_OUTLINE_COLOR","jsxs","inner","HOVER_OUTLINE","useState"],"mappings":";;;AAyBA,IAAM,OAAO,MAAM;AAAC,CAAA;AACpB,IAAM,kBAAkB,aAAA,CAA6B;AAAA,EACnD,OAAA,EAAS,KAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,sBAAa,GAAA,EAAI;AAAA,EACjB,OAAA,EAAS,KAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,eAAA,EAAiB,IAAA;AAAA,EACjB,SAAA,EAAW,IAAA;AAAA,EACX,WAAA,EAAa,IAAA;AAAA,EACb,MAAA,EAAQ,IAAA;AAAA,EACR,eAAA,EAAiB,IAAA;AAAA,EACjB,eAAe,MAAM;AACvB,CAAC,CAAA;AAEM,SAAS,iBAAA,GAAmC;AACjD,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;AAOO,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAU,OAAA,EAAS,iBAAgB,EAAkB;AAC5F,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAqD,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AACpH,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAI,QAAA,iBAAqC,IAAI,KAAK,CAAA;AAC5E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,kBAAA,GAAqB,MAAA,iBAA0C,IAAI,GAAA,EAAK,CAAA;AAE9E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,WAAA,CAAY,EAAE,OAAA,EAAS,eAAA,EAAiB,KAAA,EAAO,MAAM,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,KAAM,GAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AACrC,MAAA,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,SAAS,OAAO,CAAA;AAAA,EAC9E,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAGrB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC9B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,EAAK,EAAG,GAAG,CAAA;AAAA,IACtF,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAGrB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,SAAS,MAAM,CAAA,EAAiB;AAC9B,MAAA,MAAM,IAAI,CAAA,CAAE,IAAA;AACZ,MAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,MAAA,IAAI,CAAA,CAAE,SAAS,gBAAA,EAAkB;AAC/B,QAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AACvB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,uBAAA,EAAyB;AACtC,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA,IAAI,EAAE,EAAA,EAAI;AACR,UAAA,UAAA,iBAAW,IAAI,KAAK,CAAA;AACpB,UAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,kBAAA,CAAmB,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,SAAS,sBAAA,EAAwB;AACrC,QAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,EAAE,IAAI,CAAA;AACtD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,EAAE,KAAK,CAAA;AAChB,UAAA,kBAAA,CAAmB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AAAA,QAC1C;AACA,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,IAAA,EAAc,WAA4BA,MAAAA,KAAmB;AAC1F,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,IAAI,IAAA,EAAM,EAAE,MAAM,SAAA,EAAW,KAAA,EAAAA,QAAO,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAEvB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC7D,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,SAAA,EAAW,KAAA,EAAAA,MAAAA,EAAM,EAAG,GAAG,CAAA;AAAA,MACnF,CAAA,CAAA,MAAQ;AAAA,MAAe;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,IAAA,KAAiB;AAChD,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC/D,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,wBAAA;AAAA,UACN,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ;AAAA,SACtC;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,MAAA,kBAAA,CAAmB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,kBAAkB,WAAA,CAAY,CAAC,IAAA,EAAc,QAAA,EAAmB,cAAoC,YAAA,KAA0B;AAClI,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC/D,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,IAAA;AAAA,UAAM,QAAA;AAAA,UAAU,YAAA;AAAA,UAAc;AAAA,SAChC;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,IAAA,EAAc,QAAA,KAAmC;AAClF,IAAA,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,OAAO,MAAM;AAAE,MAAA,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IAAG,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,QAAuB,OAAO;AAAA,IAC1C,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA,EAAS,QAAQ,IAAA,GAAO,CAAA;AAAA,IACxB,YAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,QAAA,EAAU,OAAA,EAAS,YAAA,EAAc,eAAA,EAAiB,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAC,CAAA;AAEtH,EAAA,uBACE,IAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EACvB,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS,OAAA,oBAAW,GAAA,CAAC,OAAA,EAAA,EAAQ;AAAA,GAAA,EAChC,CAAA;AAEJ;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,iBAAiB,OAAA,EAAS,MAAA,KAAW,iBAAA,EAAkB;AACtF,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,IAAmB,CAAC,cAAc,OAAO,IAAA;AAE1D,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,eAAA,oBACC,GAAA,CAAC,SAAI,KAAA,EAAO;AAAA,UACV,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,CAAA;AAAA,UACd,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,QAAA,EAAU;AAAA,WAET,QAAA,EAAA,eAAA,EACH,CAAA;AAAA,wBAEF,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,QAAA,EAAU,gBAAgB,CAAC,OAAA;AAAA,YAC3B,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,eAAe,MAAA,GAAS,MAAA;AAAA,cACpC,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ,gBAAA;AAAA,cACR,OAAA,EAAS,WAAA;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAe,WAAA;AAAA,cACf,aAAA,EAAe,OAAA;AAAA,cACf,MAAA,EAAQ,eAAe,MAAA,GAAS,SAAA;AAAA,cAChC,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,GAAA,EAAK,EAAA;AAAA,cACL,SAAA,EAAW,4BAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACd;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,SAAA;AACnC,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,MAAA;AAAA,cAChC;AAAA,YACF,CAAA;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,MAAA;AACnC,gBAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,SAAA;AAAA,cAChC;AAAA,YACF,CAAA;AAAA,YAEC,QAAA,EAAA,YAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,iBAAA,EAAU,oBAEhB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAK,KAAA,EAAO;AAAA,gBACX,UAAA,EAAY,SAAA;AAAA,gBAAW,KAAA,EAAO,MAAA;AAAA,gBAC9B,KAAA,EAAO,EAAA;AAAA,gBAAI,MAAA,EAAQ,EAAA;AAAA,gBAAI,YAAA,EAAc,KAAA;AAAA,gBACrC,OAAA,EAAS,aAAA;AAAA,gBAAe,UAAA,EAAY,QAAA;AAAA,gBAAU,cAAA,EAAgB,QAAA;AAAA,gBAC9D,QAAA,EAAU,EAAA;AAAA,gBAAI,UAAA,EAAY;AAAA,eAC5B,EAAI,kBAAQ,IAAA,EAAK,CAAA;AAAA,8BACjB,GAAA,CAAC,UAAK,QAAA,EAAA,WAAA,EAAS;AAAA,aAAA,EACjB;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;ACzQA,IAAM,cAAA,uBAAqB,GAAA,CAAqB;AAAA,EAC9C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsB,SAAA;AAarB,SAAS,YAAY,EAAE,IAAA,EAAM,MAAM,KAAA,EAAO,QAAA,EAAU,WAAU,EAAqB;AACxF,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,GAAA,GAAMC,OAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAcA,OAA2B,MAAS,CAAA;AAGxD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,IAAA,IAAI,WAAA,CAAY,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,OAAA,EAAS;AACpD,MAAA,WAAA,CAAY,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,WAAA,IAAe,EAAA;AAAA,IACnD;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,CAAI,OAAA,EAAS,IAAI,CAAC,CAAA;AAEtB,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBAAOC,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAEzC,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,eAAe,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAC9C,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,MAAM,aAAA,GAAiB,EAAA,CAAG,KAAA,CAAM,KAAA,IAAiC,EAAC;AAClE,IAAA,MAAM,aAAA,GAAiB,EAAA,CAAG,KAAA,CAAM,SAAA,IAAwB,EAAA;AAExD,IAAA,MAAM,WAAA,GAAmC;AAAA,MACvC,OAAA,EAAS,wBAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,UAAA,EAAY,0BAAA;AAAA,MACZ,MAAA,EAAQ,YAAY,MAAA,GAAS,SAAA;AAAA,MAC7B,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAA,EAAK,CAAC,IAAA,KAA6B;AAAE,QAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,MAAM,CAAA;AAAA,MACzD,SAAA,EAAW,CAAC,aAAA,EAAe,SAAA,EAAW,gBAAgB,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAChF,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,mBAAA;AAAA,MACxD,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAwB;AACrC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,eAAA,GAAkB,gBAAA;AACxB,MAAA,KAAA,CAAM,8BAAA,GAAiC,IAAA;AACvC,MAAA,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,mBAAA;AACtD,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,MACxD,CAAA;AACA,MAAA,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,QAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,QAAA,MAAA,CAAO,MAAM,YAAA,GAAe,aAAA;AAC5B,QAAA,MAAA,CAAO,MAAM,YAAA,GAAe,QAAA;AAC5B,QAAA,MAAM,OAAA,GAAU,OAAO,WAAA,IAAe,EAAA;AACtC,QAAA,MAAM,WAAW,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAS,YAAY,OAAA,IAAW,EAAA;AAC7E,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,QAAA,GAAW,SAAS,QAAA,GAAY,OAAA,KAAY,KAAK,IAAA,GAAO,MAAA,CAAO,OAAO,CAAA,GAAK,OAAA;AACjF,UAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,QACpC;AAAA,MACF,CAAA;AACA,MAAA,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAE5C,QAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,CAAA,CAAE,QAAA,IAAY,SAAS,MAAA,EAAQ;AACvD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAC,CAAA,CAAE,cAA8B,IAAA,EAAK;AAAA,QACxC;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAC,CAAA,CAAE,cAA8B,IAAA,EAAK;AAAA,QACxC;AAAA,MACF,CAAA;AAAA,IACF;AAIA,IAAA,OAAO,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,EAC/B;AAGA,EAAA,uBACED,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,CAAC,gBAAA,EAAkB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACjE,KAAA,EAAO,EAAE,OAAA,EAAS,wBAAA,EAA0B,eAAe,CAAA,EAAE;AAAA,MAE5D;AAAA;AAAA,GACH;AAEJ;ACnHO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,GAAY,QAAQ,EAAA,GAAK,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EAAoB;AACjH,EAAA,MAAM,OAAA,GAAU,aAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,GAAY,EAAA,GAAK,OAAO,KAAK,CAAA,CAAA;AACtF,EAAA,MAAM,KAAK,aAAA,CAAc,EAAA,EAAI,EAAE,SAAA,IAAa,OAAO,CAAA;AACnD,EAAA,uBACEA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAY,IAAA,EAAM,SAAA,EAAW,OACvC,QAAA,EAAA,EAAA,EACH,CAAA;AAEJ;ACGA,SAAS,UAAA,CAAW,OAAyB,OAAA,EAA0B;AACrE,EAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,SAAU,KAAA,CAAM,GAAA;AAC/C,EAAA,IAAI,SAAS,OAAO,CAAA,EAAG,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,WAAW,GAAG,CAAA,GAAI,KAAK,GAAG,CAAA,EAAG,MAAM,GAAG,CAAA,CAAA;AACpG,EAAA,OAAO,KAAA,CAAM,GAAA;AACf;AAEA,IAAME,oBAAAA,GAAsB,SAAA;AAErB,SAAS,YAAY,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,KAAK,SAAA,EAAW,KAAA,EAAO,OAAA,GAAU,MAAA,EAAQ,UAAU,YAAA,EAAc,QAAA,GAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,WAAU,EAAqB;AACnL,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,YAAA,GAAeJ,OAAwB,IAAI,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,OAAyB,IAAI,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,IAAA,EAAM,CAAC,MAAA,KAAW;AACtD,MAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACnC,MAAA,WAAA,EAAY;AAEZ,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,KAAA,IAAU,MAAA,EAAoC;AACpI,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,GAAM,UAAA,CAAW,MAAA,EAA4B,OAAO,CAAA;AAAA,MACrE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,KAAK,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS,uBAAOE,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,IAAY,IAAA,EAAK,CAAA;AAC7C,IAAA,uBACED,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,cAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAa,OAAA;AAAA,QACb,OAAA,EAAS,WAAA;AAAA,QACT,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeE,oBAAAA;AAAA,QAAqB,CAAA;AAAA,QAClG,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,QAAe,CAAA;AAAA,QAC5F,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY,kBAAA;AAAA,UACZ,MAAA,EAAQ,4BAAA;AAAA,UACR,OAAA,EAAS,wBAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAe,WAAA;AAAA,UACf,aAAA,EAAe,QAAA;AAAA,UACf,KAAA,EAAO,MAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,MAAM,wBACJF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,GAAA,EAAK,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AAAA,MAC9B,GAAA,EAAK,GAAA,IAAO,KAAA,CAAM,eAAA,IAAmB,MAAM,IAAA,IAAQ,EAAA;AAAA,MACnD,KAAA,EAAO,SAAS,KAAA,CAAM,KAAA;AAAA,MACtB,MAAA,EAAQ,UAAU,KAAA,CAAM,MAAA;AAAA,MACxB,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,OAAO,KAAA;AAEzB,EAAA,uBACEG,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAa,OAAA;AAAA,MACb,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,cAAA,EAAgB,OAAA,EAAS,wBAAA,EAA0B,aAAA,EAAe,CAAA,EAAG,UAAA,EAAY,0BAAA,EAA2B;AAAA,MACpJ,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeD,oBAAAA;AACtD,QAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,aAAA,CAAc,oBAAoB,CAAA;AAC/E,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,GAAA;AAAA,MAC/B,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,QAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,aAAA,CAAc,oBAAoB,CAAA;AAC/E,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,GAAA;AAAA,MAC/B,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,wBACDF,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,kBAAA,EAAgB,IAAA;AAAA,YAChB,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,CAAA;AAAA,cACL,KAAA,EAAO,CAAA;AAAA,cACP,UAAA,EAAY,MAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ,gBAAA;AAAA,cACR,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAe,WAAA;AAAA,cACf,aAAA,EAAe,QAAA;AAAA,cACf,MAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,CAAA;AAAA,cACT,UAAA,EAAY,2CAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,SAAA;AAAW,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,MAAA;AAAA,YAAQ,CAAA;AAAA,YAC3G,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,UAAA,GAAa,MAAA;AAAQ,cAAA,CAAA,CAAE,aAAA,CAAc,MAAM,KAAA,GAAQ,SAAA;AAAA,YAAW,CAAA;AAAA,YAC5G,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;ACvHO,SAAS,WAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,UAAS,EAAuB;AACvF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,uBAAOA,GAAAA,CAAAC,QAAAA,EAAA,EAAG,sBAAY,IAAA,EAAK,CAAA;AAAA,EAC7B;AACA,EAAA,uBACED,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,CAAA,qBAChBD,GAAAA,CAACC,UAAAA,EAAA,EAAkB,QAAA,EAAA,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,EAAA,EAAtC,CAAwC,CACxD,CAAA,EACH,CAAA;AAEJ;ACGA,IAAM,aAAA,GAAgB,SAAA;AAGtB,SAAS,YAAA,CAAa,MAAkB,GAAA,EAAwB;AAC9D,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,uBACED,GAAAA,CAAC,GAAA,EAAA,EAAY,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,cAAA,EAAgB,WAAA,EAAa,mBAAA,EAAqB,CAAA,EAAE,EACvG,QAAA,EAAA,CAAA,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EADjD,GAER,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,KAAgB,IAAA,CAAK,IAAA;AACzB,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,mBAAKA,GAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAA,EAAY,kBAAA,EAAoB,SAAS,OAAA,EAAS,UAAA,EAAY,2BAA2B,QAAA,EAAU,OAAA,IAAY,QAAA,EAAA,EAAA,EAAG,CAAA;AACrJ,EAAA,IAAI,KAAK,IAAA,EAAM,EAAA,mBAAKA,GAAAA,CAAC,YAAQ,QAAA,EAAA,EAAA,EAAG,CAAA;AAChC,EAAA,IAAI,KAAK,MAAA,EAAQ,EAAA,mBAAKA,GAAAA,CAAC,QAAI,QAAA,EAAA,EAAA,EAAG,CAAA;AAC9B,EAAA,IAAI,KAAK,SAAA,EAAW,EAAA,mBAAKA,GAAAA,CAAC,OAAG,QAAA,EAAA,EAAA,EAAG,CAAA;AAChC,EAAA,IAAI,KAAK,aAAA,EAAe,EAAA,mBAAKA,GAAAA,CAAC,OAAG,QAAA,EAAA,EAAA,EAAG,CAAA;AACpC,EAAA,uBAAOA,GAAAA,CAACC,UAAAA,EAAA,EAAoB,gBAAN,GAAS,CAAA;AACjC;AAEA,SAAS,WAAA,CAAY,GAAU,GAAA,EAAwB;AACrD,EAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,IAAA,uBAAOD,GAAAA,CAAC,GAAA,EAAA,EAAc,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW;AACxB,IAAA,MAAM,GAAA,GAAO,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAA,IAAS,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAgB,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAuB,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,KAAzD,GAA2D,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,MAAA,KAAW,SAAA,GAAY,IAAA,GAAO,IAAA;AAChD,IAAA,uBACEA,GAAAA,CAAC,OAAA,EAAA,EACG,QAAA,EAAA,CAAA,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBAC3BA,IAAC,IAAA,EAAA,EAAa,QAAA,EAAA,CAAA,EAAA,CAAG,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EAAxD,CAA0D,CACpE,KAHW,GAId,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,uBAAOA,IAAC,KAAA,EAAA,EAAc,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,QAAA,EAAA,CAAA,CAAA,CAAE,YAAY,EAAC,EAAG,IAAI,CAAC,CAAA,KAAO,EAAe,IAAI,CAAA,CAAE,KAAK,EAAE,CAAA,EAAE,KAAzE,GAAgF,CAAA;AAAA,EACnG;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,IAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAc,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,eAAA,IAAmB,EAAA,EAAA,EAAvD,GAA2D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,YAAY,IAAA,EAA0B;AAC7C,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/C,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,IAAe,EAAA;AAClC,MAAA,IAAI,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AAC/C,MAAA,MAAM,EAAA,GAAK,KAAA;AACX,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AACrC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAMI,MAAAA,GAAQ,YAAY,EAAE,CAAA,CAAE,OAAO,CAAC,CAAA,KAAqB,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA;AAC5E,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,GAAG,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA,EAAI,QAAA,EAAUA,MAAAA,CAAM,SAAS,CAAA,GAAIA,MAAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,CAAG,WAAA,IAAe,EAAA,EAAI,CAAA,EAAG,CAAA;AAClJ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,YAAY,EAAE,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/B,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA;AAC9B,QAAA,MAAM,CAAA,GAAI,EAAE,GAAG,CAAA,EAAE;AACjB,QAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,GAAA,IAAO,IAAA,GAAO,IAAA;AAC9C,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,GAAA,IAAO,MAAA,GAAS,IAAA;AAC5C,QAAA,IAAI,GAAA,KAAQ,GAAA,EAAK,CAAA,CAAE,SAAA,GAAY,IAAA;AAC/B,QAAA,IAAI,QAAQ,GAAA,IAAO,GAAA,KAAQ,YAAY,GAAA,KAAQ,KAAA,IAAS,aAAA,GAAgB,IAAA;AACxE,QAAA,IAAI,GAAA,KAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,GAAO,IAAA;AAC7B,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAA4B;AACtD,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,QAAA,EAAU,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IACnE,CAAA,MAAA,IAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AACvC,MAAA,MAAM,QAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAAiB,aAAa,CAAC,CAAA,EAAG;AAC/D,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,MAC7D;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,GAAA,KAAQ,IAAA,GAAO,SAAA,GAAY,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,EAAA,CAAG,WAAA,IAAe,EAAA,EAAI,GAAG,CAAA;AAAA,IACxF,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,KAAK,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA,EAAI,iBAAiB,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA,IAAM,CAAA;AAAA,IAC5H,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,CAAY,EAAE,GAAG,CAAA;AAAA,IAC9D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,KAAA,EAAO,WAAU,EAAU;AAC9D,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,YAAA,GAAeN,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,SAAkB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAoB,EAAC;AAErE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,CAAa,OAAA,KAAY,IAAA,EAAM,YAAA,CAAa,OAAA,GAAU,MAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACF,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC,CAAA,EACzC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,8BAAA,EAA8B,IAAA;AAAA,MAC9B,cAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAa,QAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,wBAAA;AAAA,QACT,aAAA,EAAe,CAAA;AAAA,QACf,UAAA,EAAY,0BAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MAAe,CAAA;AAAA,MAC5F,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAA,MAAe,CAAA;AAAA,MAC5F,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AAAe,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,MAAS,CAAA;AAAA,MACtJ,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,QAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,OAAO,CAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACnC,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,QACtC;AACA,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,QAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,QAAA;AAAA,MACxD,CAAA;AAAA,MAEC,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,MAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC;AAAA;AAAA,GACzC;AAEJ;ACnMA,IAAMK,cAAAA,GAAgB,SAAA;AAoBf,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,SAAA,EAAW,OAAA,GAAU,IAAG,EAAU;AAC3F,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,QAAAA,CAAiB,SAAS,EAAE,CAAA;AACtD,EAAA,MAAM,OAAA,GAAUR,MAAAA,CAAe,KAAA,IAAS,EAAE,CAAA;AAG1C,EAAAC,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,EAAE,CAAA;AACpB,IAAA,OAAA,CAAQ,UAAU,KAAA,IAAS,EAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,uBAAOC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAuB,QAAA,EAAA,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAE,CAAA;AAAA,EACzD;AAEA,EAAA,uBACEG,KAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,QAAA,EAAU,YAAW,EACvD,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,QAAQ,MAAM;AACZ,UAAA,IAAI,KAAA,KAAU,QAAQ,OAAA,EAAS;AAC7B,YAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,KAAK,CAAA;AAAA,UACvC;AAAA,QACF,CAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeK,cAAAA;AACtD,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,OAAA;AAAA,QACxD,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAeA,cAAAA;AAAA,QAAe,CAAA;AAAA,QAC5F,YAAA,EAAc,CAAC,CAAA,KAAM;AAEnB,UAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,CAAA,CAAE,aAAA,EAAe;AAC9C,YAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,aAAA;AACtD,YAAC,CAAA,CAAE,aAAA,CAA8B,KAAA,CAAM,YAAA,GAAe,QAAA;AAAA,UACxD;AAAA,QACF,CAAA;AAAA,QACA,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA,EAAS,MAAM,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,QACpD,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAY,uBAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,wBAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,UAAA,EAAY,2CAAA;AAAA,UACZ,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,UAAA,EAAY;AAAA,SACd;AAAA,QACA,cAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAa;AAAA;AAAA,KACf;AAAA,oBACAL,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MAAG,QAAA,EAAU,EAAA;AAAA,MAAI,UAAA,EAAY,GAAA;AAAA,MACxC,aAAA,EAAe,WAAA;AAAA,MAAa,aAAA,EAAe,QAAA;AAAA,MAC3C,OAAA,EAAS,GAAA;AAAA,MAAK,UAAA,EAAY;AAAA,OACzB,QAAA,EAAA,oEAAA,EAEH;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface PendingChange {\n path: string;\n fieldType: StrapiFieldType;\n value: unknown;\n}\n\ninterface EditModeState {\n enabled: boolean;\n token: string | null;\n changes: Map<string, PendingChange>;\n isDirty: boolean;\n isCommitting: boolean;\n lastCommitError: string | null;\n setChange: (path: string, fieldType: StrapiFieldType, value: unknown) => void;\n clearChange: (path: string) => void;\n commit: () => void;\n openMediaPicker: (path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => void;\n onMediaPicked: (path: string, listener: (value: unknown) => void) => () => void;\n}\n\nconst noop = () => {};\nconst EditModeContext = createContext<EditModeState>({\n enabled: false,\n token: null,\n changes: new Map(),\n isDirty: false,\n isCommitting: false,\n lastCommitError: null,\n setChange: noop,\n clearChange: noop,\n commit: noop,\n openMediaPicker: noop,\n onMediaPicked: () => noop,\n});\n\nexport function useStrapiEditMode(): EditModeState {\n return useContext(EditModeContext);\n}\n\ninterface ProviderProps {\n children: React.ReactNode;\n enabled?: boolean;\n}\n\nexport function StrapiEditModeProvider({ children, enabled: enabledOverride }: ProviderProps) {\n const [urlState, setUrlState] = useState<{ enabled: boolean; token: string | null }>({ enabled: false, token: null });\n const [changes, setChanges] = useState<Map<string, PendingChange>>(new Map());\n const [isCommitting, setIsCommitting] = useState(false);\n const [lastCommitError, setLastCommitError] = useState<string | null>(null);\n const mediaPickListeners = useRef<Map<string, (v: unknown) => void>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (enabledOverride !== undefined) {\n setUrlState({ enabled: enabledOverride, token: null });\n return;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const edit = params.get(\"__pp_edit\") === \"1\";\n const token = params.get(\"__pp_token\");\n setUrlState({ enabled: edit, token });\n } catch {\n // ignore\n }\n }, [enabledOverride]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"pp-edit-active\", urlState.enabled);\n }, [urlState.enabled]);\n\n // Ready ping to parent\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n if (window.parent === window) return;\n try {\n window.parent.postMessage({ type: \"pp:edit:ready\", href: window.location.href }, \"*\");\n } catch { /* ignore */ }\n }, [urlState.enabled]);\n\n // Listen for parent → iframe messages\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!urlState.enabled) return;\n function onMsg(e: MessageEvent) {\n const d = e.data;\n if (!d || typeof d !== \"object\") return;\n if (d.type === \"pp:edit:reload\") {\n window.location.reload();\n return;\n }\n if (d.type === \"pp:edit:commit-result\") {\n setIsCommitting(false);\n if (d.ok) {\n setChanges(new Map());\n setLastCommitError(null);\n } else {\n setLastCommitError(d.error || \"Speichern fehlgeschlagen\");\n }\n return;\n }\n if (d.type === \"pp:edit:media-picked\") {\n const listener = mediaPickListeners.current.get(d.path);\n if (listener) {\n listener(d.value);\n mediaPickListeners.current.delete(d.path);\n }\n return;\n }\n }\n window.addEventListener(\"message\", onMsg);\n return () => window.removeEventListener(\"message\", onMsg);\n }, [urlState.enabled]);\n\n const setChange = useCallback((path: string, fieldType: StrapiFieldType, value: unknown) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.set(path, { path, fieldType, value });\n return next;\n });\n setLastCommitError(null);\n // Optional: send live change event for future \"show preview on parent\"\n if (typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage({ type: \"pp:edit:change\", path, fieldType, value }, \"*\");\n } catch { /* ignore */ }\n }\n }, []);\n\n const clearChange = useCallback((path: string) => {\n setChanges((prev) => {\n const next = new Map(prev);\n next.delete(path);\n return next;\n });\n }, []);\n\n const commit = useCallback(() => {\n if (changes.size === 0) return;\n if (typeof window === \"undefined\" || window.parent === window) return;\n setIsCommitting(true);\n setLastCommitError(null);\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:commit-request\",\n changes: Array.from(changes.values()),\n },\n \"*\",\n );\n } catch (err) {\n setIsCommitting(false);\n setLastCommitError(err instanceof Error ? err.message : String(err));\n }\n }, [changes]);\n\n const openMediaPicker = useCallback((path: string, multiple: boolean, allowedTypes: string[] | undefined, currentValue: unknown) => {\n if (typeof window === \"undefined\" || window.parent === window) return;\n try {\n window.parent.postMessage(\n {\n type: \"pp:edit:open-media-picker\",\n path, multiple, allowedTypes, currentValue,\n },\n \"*\",\n );\n } catch { /* ignore */ }\n }, []);\n\n const onMediaPicked = useCallback((path: string, listener: (v: unknown) => void) => {\n mediaPickListeners.current.set(path, listener);\n return () => { mediaPickListeners.current.delete(path); };\n }, []);\n\n const value = useMemo<EditModeState>(() => ({\n enabled: urlState.enabled,\n token: urlState.token,\n changes,\n isDirty: changes.size > 0,\n isCommitting,\n lastCommitError,\n setChange,\n clearChange,\n commit,\n openMediaPicker,\n onMediaPicked,\n }), [urlState, changes, isCommitting, lastCommitError, setChange, clearChange, commit, openMediaPicker, onMediaPicked]);\n\n return (\n <EditModeContext.Provider value={value}>\n {children}\n {urlState.enabled && <SaveBar />}\n </EditModeContext.Provider>\n );\n}\n\nfunction SaveBar() {\n const { isDirty, isCommitting, lastCommitError, changes, commit } = useStrapiEditMode();\n if (!isDirty && !lastCommitError && !isCommitting) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 24,\n right: 24,\n zIndex: 999999,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n {lastCommitError && (\n <div style={{\n background: \"#FA501E\",\n color: \"#000\",\n padding: \"8px 14px\",\n marginBottom: 8,\n fontSize: 13,\n fontWeight: 600,\n maxWidth: 320,\n }}>\n {lastCommitError}\n </div>\n )}\n <button\n type=\"button\"\n onClick={commit}\n disabled={isCommitting || !isDirty}\n style={{\n background: isCommitting ? \"#666\" : \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"14px 22px\",\n fontSize: 13,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.2em\",\n cursor: isCommitting ? \"wait\" : \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#FA501E\";\n e.currentTarget.style.color = \"#000\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isCommitting && isDirty) {\n e.currentTarget.style.background = \"#000\";\n e.currentTarget.style.color = \"#EBC6DF\";\n }\n }}\n >\n {isCommitting ? (\n <span>Speichere…</span>\n ) : (\n <>\n <span style={{\n background: \"#FA501E\", color: \"#000\",\n width: 22, height: 22, borderRadius: \"50%\",\n display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\n fontSize: 11, fontWeight: 700,\n }}>{changes.size}</span>\n <span>Speichern</span>\n </>\n )}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { Children, cloneElement, isValidElement, useEffect, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiFieldProps {\n path: string;\n type: StrapiFieldType;\n value?: unknown;\n children: ReactNode;\n className?: string;\n}\n\nconst EDITABLE_TYPES = new Set<StrapiFieldType>([\n \"text\",\n \"textarea\",\n \"richText\",\n \"email\",\n \"number\",\n]);\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\n/**\n * Universeller Wrapper. Im Normal-Mode: rendert children unverändert.\n *\n * Im Edit-Mode:\n * - Für text/textarea/richText/email/number: macht das Top-Level-Child\n * `contenteditable`, mit dünnem orange Hover-Outline, sammelt Wert-Änderungen\n * in den globalen Edit-Context, der dann beim Klick auf \"Speichern\" alle\n * Änderungen in einem Roundtrip ans Parent schickt.\n * - Für andere Typen (media/select/checkbox): trägt ein Click-Handler bzw.\n * ein Overlay (Implementierung in jeweiligen Sugar-Komponenten).\n */\nexport function StrapiField({ path, type, value, children, className }: StrapiFieldProps) {\n const ctx = useStrapiEditMode();\n const ref = useRef<HTMLElement | null>(null);\n const initialText = useRef<string | undefined>(undefined);\n\n // Captured initial textContent on first mount in edit-mode (for revert-detection)\n useEffect(() => {\n if (!ctx.enabled) return;\n if (!EDITABLE_TYPES.has(type)) return;\n if (initialText.current === undefined && ref.current) {\n initialText.current = ref.current.textContent ?? \"\";\n }\n }, [ctx.enabled, type]);\n\n if (!ctx.enabled) {\n return <>{children}</>;\n }\n\n const arr = Children.toArray(children);\n const isTextual = EDITABLE_TYPES.has(type);\n\n if (arr.length === 1 && isValidElement(arr[0])) {\n const el = arr[0] as ReactElement<Record<string, unknown>>;\n const existingStyle = (el.props.style as React.CSSProperties) ?? {};\n const existingClass = (el.props.className as string) ?? \"\";\n\n const inlineStyle: React.CSSProperties = {\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n transition: \"outline-color 0.15s ease\",\n cursor: isTextual ? \"text\" : \"pointer\",\n ...existingStyle,\n };\n\n const props: Record<string, unknown> = {\n \"data-pp-edit\": path,\n \"data-pp-type\": type,\n ref: (node: HTMLElement | null) => { ref.current = node; },\n className: [existingClass, className, \"pp-edit-target\"].filter(Boolean).join(\" \"),\n style: inlineStyle,\n onMouseEnter: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n },\n onMouseLeave: (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n },\n };\n\n if (isTextual) {\n props.contentEditable = \"plaintext-only\";\n props.suppressContentEditableWarning = true;\n props.onFocus = (e: React.FocusEvent) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n };\n props.onBlur = (e: React.FocusEvent) => {\n const target = e.currentTarget as HTMLElement;\n target.style.outlineColor = \"transparent\";\n target.style.outlineStyle = \"dashed\";\n const newText = target.textContent ?? \"\";\n const original = typeof value === \"string\" ? value : (initialText.current ?? \"\");\n if (newText !== original) {\n const newValue = type === \"number\" ? (newText === \"\" ? null : Number(newText)) : newText;\n ctx.setChange(path, type, newValue);\n }\n };\n props.onKeyDown = (e: React.KeyboardEvent) => {\n // Enter ohne Shift = blur (commit local). Für richText/textarea kann user mit Shift+Enter Zeilenumbruch erzeugen.\n if (e.key === \"Enter\" && !e.shiftKey && type === \"text\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n };\n } else {\n // Non-editable types: click handler wird von Sugar-Komponenten (StrapiImage etc.) gesetzt\n }\n\n return cloneElement(el, props);\n }\n\n // Fallback: span wrap\n return (\n <span\n data-pp-edit={path}\n data-pp-type={type}\n className={[\"pp-edit-target\", className].filter(Boolean).join(\" \")}\n style={{ outline: \"1px dashed transparent\", outlineOffset: 2 }}\n >\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport { createElement, type ElementType, type ReactNode } from \"react\";\nimport { StrapiField } from \"./StrapiField\";\nimport type { StrapiFieldType } from \"./types\";\n\ninterface StrapiTextProps {\n path: string;\n value: string | number | null | undefined;\n fieldType?: Extract<StrapiFieldType, \"text\" | \"textarea\" | \"richText\" | \"email\" | \"number\">;\n as?: ElementType;\n className?: string;\n children?: ReactNode;\n}\n\nexport function StrapiText({ path, value, fieldType = \"text\", as = \"span\", className, children }: StrapiTextProps) {\n const content = children ?? (value === null || value === undefined ? \"\" : String(value));\n const el = createElement(as, { className }, content);\n return (\n <StrapiField path={path} type={fieldType} value={value}>\n {el}\n </StrapiField>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\nimport type { StrapiMediaValue } from \"./types\";\n\ninterface StrapiImageProps {\n path: string;\n value: StrapiMediaValue | null | undefined;\n baseUrl?: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties;\n loading?: \"lazy\" | \"eager\";\n fallback?: React.ReactNode;\n allowedTypes?: string[];\n multiple?: boolean;\n /** Optional width override (default: value.width). Akzeptiert `<img>`-Attribute. */\n width?: number | string;\n /** Optional height override (default: value.height). */\n height?: number | string;\n /** Optional ARIA/Image-Attribute, falls vom Customer gebraucht. */\n draggable?: boolean;\n priority?: boolean; // kompat zu Next.js Image-API, no-op\n}\n\nfunction resolveUrl(value: StrapiMediaValue, baseUrl?: string): string {\n if (value.url.startsWith(\"http\")) return value.url;\n if (baseUrl) return `${baseUrl.replace(/\\/$/, \"\")}${value.url.startsWith(\"/\") ? \"\" : \"/\"}${value.url}`;\n return value.url;\n}\n\nconst HOVER_OUTLINE_COLOR = \"#FA501E\";\n\nexport function StrapiImage({ path, value, baseUrl, alt, className, style, loading = \"lazy\", fallback, allowedTypes, multiple = false, width, height, draggable }: StrapiImageProps) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const handleClick = (e: React.MouseEvent) => {\n if (!ctx.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n const unsubscribe = ctx.onMediaPicked(path, (picked) => {\n ctx.setChange(path, \"media\", picked);\n unsubscribe();\n // Optimistic UI: swap src in-place wenn picked = single file mit url\n if (imgRef.current && picked && typeof picked === \"object\" && !Array.isArray(picked) && \"url\" in (picked as Record<string, unknown>)) {\n imgRef.current.src = resolveUrl(picked as StrapiMediaValue, baseUrl);\n }\n });\n ctx.openMediaPicker(path, multiple, allowedTypes, value);\n };\n\n if (!value) {\n if (!ctx.enabled) return <>{fallback ?? null}</>;\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n onClick={handleClick}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.05)\",\n border: \"1px dashed rgba(0,0,0,0.3)\",\n outline: \"1px dashed transparent\",\n outlineOffset: 2,\n cursor: \"pointer\",\n padding: \"20px 28px\",\n fontSize: 12,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: \"#000\",\n transition: \"outline-color 0.15s ease\",\n }}\n >\n + Bild hinzufügen\n </span>\n );\n }\n\n const imgEl = (\n <img\n ref={imgRef}\n src={resolveUrl(value, baseUrl)}\n alt={alt ?? value.alternativeText ?? value.name ?? \"\"}\n width={width ?? value.width}\n height={height ?? value.height}\n loading={loading}\n className={className}\n style={style}\n draggable={draggable}\n />\n );\n\n if (!ctx.enabled) return imgEl;\n\n return (\n <span\n ref={containerRef}\n data-pp-edit={path}\n data-pp-type=\"media\"\n style={{ position: \"relative\", display: \"inline-block\", outline: \"1px dashed transparent\", outlineOffset: 2, transition: \"outline-color 0.15s ease\" }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE_COLOR;\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n const btn = (e.currentTarget as HTMLElement).querySelector(\"[data-pp-edit-btn]\") as HTMLElement | null;\n if (btn) btn.style.opacity = \"0\";\n }}\n >\n {imgEl}\n <button\n type=\"button\"\n data-pp-edit-btn\n onClick={handleClick}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"#000\",\n color: \"#EBC6DF\",\n border: \"2px solid #000\",\n padding: \"6px 10px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n cursor: \"pointer\",\n opacity: 0,\n transition: \"opacity 0.15s ease, background 0.15s ease\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"#FA501E\"; e.currentTarget.style.color = \"#000\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"#000\"; e.currentTarget.style.color = \"#EBC6DF\"; }}\n >\n Ändern\n </button>\n </span>\n );\n}\n","\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\ninterface StrapiListProps<T> {\n /** Pfad zum Array-Feld, z.B. \"features\" */\n path: string;\n value: T[] | null | undefined;\n /**\n * Render-Funktion pro Item. Bekommt einen `itemPath` als zweites Argument,\n * der für nested-StrapiText/Image-Calls als path-Prefix dient.\n */\n renderItem: (item: T, itemPath: string, index: number) => ReactNode;\n /** Optional: Fallback wenn value null/leer ist */\n fallback?: ReactNode;\n}\n\n/**\n * Iteriert über ein Strapi-Repeatable-Field oder eine Relation-Liste. Generiert\n * pro Item den vollständigen Edit-Pfad (z.B. \"features.0\", \"features.1\"), den\n * der Caller in nested StrapiText/Image weitergibt.\n *\n * Beispiel:\n * <StrapiList path=\"features\" value={page.features} renderItem={(f, fp) => (\n * <div>\n * <StrapiText path={`${fp}.title`} value={f.title} as=\"h3\" />\n * <StrapiImage path={`${fp}.icon`} value={f.icon} />\n * </div>\n * )} />\n */\nexport function StrapiList<T>({ path, value, renderItem, fallback }: StrapiListProps<T>) {\n if (!Array.isArray(value) || value.length === 0) {\n return <>{fallback ?? null}</>;\n }\n return (\n <>\n {value.map((item, i) => (\n <Fragment key={i}>{renderItem(item, `${path}.${i}`, i)}</Fragment>\n ))}\n </>\n );\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useRef, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\n// ── Strapi v5 Blocks types ──────────────────────────────────────────\ninterface TextLeaf {\n type: \"text\";\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n}\n\ninterface LinkNode {\n type: \"link\";\n url: string;\n children: TextLeaf[];\n}\n\ntype InlineNode = TextLeaf | LinkNode;\n\ninterface ListItemBlock {\n type: \"list-item\";\n children: InlineNode[];\n}\n\ninterface ParagraphBlock { type: \"paragraph\"; children: InlineNode[]; }\ninterface HeadingBlock { type: \"heading\"; level: 1 | 2 | 3 | 4 | 5 | 6; children: InlineNode[]; }\ninterface QuoteBlock { type: \"quote\"; children: InlineNode[]; }\ninterface ListBlock { type: \"list\"; format: \"ordered\" | \"unordered\"; children: ListItemBlock[]; }\ninterface CodeBlock { type: \"code\"; children: InlineNode[] }\ninterface ImageBlock { type: \"image\"; image: { url: string; alternativeText?: string } }\n\ntype Block = ParagraphBlock | HeadingBlock | QuoteBlock | ListBlock | CodeBlock | ImageBlock;\n\ninterface Props {\n path: string;\n value: unknown;\n className?: string;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n// ── Read-Mode renderer ──────────────────────────────────────────────\nfunction renderInline(node: InlineNode, key: number): ReactNode {\n if (node.type === \"link\") {\n return (\n <a key={key} href={node.url} style={{ fontWeight: 700, textDecoration: \"underline\", textUnderlineOffset: 4 }}>\n {(node.children ?? []).map((c, i) => renderInline(c, i))}\n </a>\n );\n }\n let el: ReactNode = node.text;\n if (node.code) el = <code style={{ background: \"rgba(0,0,0,0.08)\", padding: \"0 4px\", fontFamily: \"ui-monospace, monospace\", fontSize: \"0.9em\" }}>{el}</code>;\n if (node.bold) el = <strong>{el}</strong>;\n if (node.italic) el = <em>{el}</em>;\n if (node.underline) el = <u>{el}</u>;\n if (node.strikethrough) el = <s>{el}</s>;\n return <Fragment key={key}>{el}</Fragment>;\n}\n\nfunction renderBlock(b: Block, key: number): ReactNode {\n if (b.type === \"paragraph\") {\n return <p key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</p>;\n }\n if (b.type === \"heading\") {\n const Tag = (`h${Math.min(Math.max(b.level ?? 2, 1), 6)}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n return <Tag key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</Tag>;\n }\n if (b.type === \"quote\") {\n return <blockquote key={key}>{(b.children ?? []).map((c, i) => renderInline(c, i))}</blockquote>;\n }\n if (b.type === \"list\") {\n const ListTag = b.format === \"ordered\" ? \"ol\" : \"ul\";\n return (\n <ListTag key={key}>\n {(b.children ?? []).map((li, i) => (\n <li key={i}>{(li.children ?? []).map((c, j) => renderInline(c, j))}</li>\n ))}\n </ListTag>\n );\n }\n if (b.type === \"code\") {\n return <pre key={key}><code>{(b.children ?? []).map((c) => (c as TextLeaf).text).join(\"\")}</code></pre>;\n }\n if (b.type === \"image\") {\n return <img key={key} src={b.image.url} alt={b.image.alternativeText ?? \"\"} />;\n }\n return null;\n}\n\n// ── DOM → Blocks parser (für Edit-Mode commit) ─────────────────────\nfunction parseInline(node: Node): InlineNode[] {\n const out: InlineNode[] = [];\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n const text = child.textContent ?? \"\";\n if (text) out.push({ type: \"text\", text });\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"br\") {\n out.push({ type: \"text\", text: \"\\n\" });\n continue;\n }\n if (tag === \"a\") {\n const inner = parseInline(el).filter((n): n is TextLeaf => n.type === \"text\");\n out.push({ type: \"link\", url: el.getAttribute(\"href\") ?? \"\", children: inner.length > 0 ? inner : [{ type: \"text\", text: el.textContent ?? \"\" }] });\n continue;\n }\n // Inline formatting wrappers\n const inner = parseInline(el);\n const flagged = inner.map((n) => {\n if (n.type !== \"text\") return n;\n const t = { ...n };\n if (tag === \"strong\" || tag === \"b\") t.bold = true;\n if (tag === \"em\" || tag === \"i\") t.italic = true;\n if (tag === \"u\") t.underline = true;\n if (tag === \"s\" || tag === \"strike\" || tag === \"del\") t.strikethrough = true;\n if (tag === \"code\") t.code = true;\n return t;\n });\n out.push(...flagged);\n }\n }\n return out;\n}\n\nfunction parseBlocksFromDOM(root: HTMLElement): Block[] {\n const blocks: Block[] = [];\n for (const child of Array.from(root.children)) {\n const el = child as HTMLElement;\n const tag = el.tagName.toLowerCase();\n if (tag === \"p\") {\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n } else if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag.slice(1), 10) as 1 | 2 | 3 | 4 | 5 | 6;\n blocks.push({ type: \"heading\", level, children: parseInline(el) });\n } else if (tag === \"blockquote\") {\n blocks.push({ type: \"quote\", children: parseInline(el) });\n } else if (tag === \"ul\" || tag === \"ol\") {\n const items: ListItemBlock[] = [];\n for (const li of Array.from(el.querySelectorAll(\":scope > li\"))) {\n items.push({ type: \"list-item\", children: parseInline(li) });\n }\n blocks.push({ type: \"list\", format: tag === \"ol\" ? \"ordered\" : \"unordered\", children: items });\n } else if (tag === \"pre\") {\n blocks.push({ type: \"code\", children: [{ type: \"text\", text: el.textContent ?? \"\" }] });\n } else if (tag === \"img\") {\n blocks.push({ type: \"image\", image: { url: el.getAttribute(\"src\") ?? \"\", alternativeText: el.getAttribute(\"alt\") ?? \"\" } });\n } else {\n // unknown tag → paragraph mit text\n blocks.push({ type: \"paragraph\", children: parseInline(el) });\n }\n }\n return blocks;\n}\n\nexport function StrapiBlocks({ path, value, className }: Props) {\n const ctx = useStrapiEditMode();\n const containerRef = useRef<HTMLDivElement>(null);\n const initialValue = useRef<Block[] | null>(null);\n\n const blocks: Block[] = Array.isArray(value) ? (value as Block[]) : [];\n\n useEffect(() => {\n if (initialValue.current === null) initialValue.current = blocks;\n }, [blocks]);\n\n if (!ctx.enabled) {\n return (\n <div className={className}>\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n contentEditable\n suppressContentEditableWarning\n data-pp-edit={path}\n data-pp-type=\"blocks\"\n style={{\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n transition: \"outline-color 0.15s ease\",\n minHeight: \"1em\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\"; }}\n onFocus={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\"; }}\n onBlur={(e) => {\n const root = e.currentTarget;\n const parsed = parseBlocksFromDOM(root);\n const before = JSON.stringify(initialValue.current);\n const after = JSON.stringify(parsed);\n if (before !== after) {\n ctx.setChange(path, \"blocks\", parsed);\n }\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }}\n >\n {blocks.map((b, i) => renderBlock(b, i))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useStrapiEditMode } from \"./EditModeContext\";\n\ninterface Props {\n path: string;\n /** Markdown-Quelle aus Strapi. */\n value: string | null | undefined;\n /** Render-Funktion für Read-Mode (z.B. ReactMarkdown). */\n render: (markdown: string) => ReactNode;\n /** Optional: Container-Klasse. Wird in beiden Modi gesetzt. */\n className?: string;\n /** Edit-Mode-Textarea: minimal Höhe. */\n minRows?: number;\n}\n\nconst HOVER_OUTLINE = \"#FA501E\";\n\n/**\n * Markdown-Field mit Round-Trip-Safe-Edit-Mode.\n *\n * Im Read-Mode: ruft `render(value)` auf. Customer entscheidet selbst\n * welcher Markdown-Renderer benutzt wird (react-markdown, marked, ...).\n *\n * Im Edit-Mode: ersetzt rendered Markdown durch eine Textarea mit der\n * Markdown-Quelle. Der User editiert die SOURCE → bei Save wird die\n * Markdown-Quelle 1:1 an Strapi geschickt, kein HTML→MD-Roundtrip nötig.\n *\n * Beispiel:\n * <StrapiMarkdownField\n * path=\"content\"\n * value={data.content}\n * render={(md) => <ReactMarkdown>{md}</ReactMarkdown>}\n * className=\"prose\"\n * />\n */\nexport function StrapiMarkdownField({ path, value, render, className, minRows = 12 }: Props) {\n const ctx = useStrapiEditMode();\n const [draft, setDraft] = useState<string>(value ?? \"\");\n const initial = useRef<string>(value ?? \"\");\n\n // Wenn Strapi neue Daten lädt (z.B. nach Save-reload), draft synchronisieren\n useEffect(() => {\n setDraft(value ?? \"\");\n initial.current = value ?? \"\";\n }, [value]);\n\n if (!ctx.enabled) {\n return <div className={className}>{render(value ?? \"\")}</div>;\n }\n\n return (\n <div className={className} style={{ position: \"relative\" }}>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n if (draft !== initial.current) {\n ctx.setChange(path, \"richText\", draft);\n }\n }}\n onFocus={(e) => {\n (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE;\n (e.currentTarget as HTMLElement).style.outlineStyle = \"solid\";\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.outlineColor = HOVER_OUTLINE; }}\n onMouseLeave={(e) => {\n // Wenn nicht fokussiert: outline weg\n if (document.activeElement !== e.currentTarget) {\n (e.currentTarget as HTMLElement).style.outlineColor = \"transparent\";\n (e.currentTarget as HTMLElement).style.outlineStyle = \"dashed\";\n }\n }}\n rows={Math.max(minRows, draft.split(\"\\n\").length + 2)}\n style={{\n width: \"100%\",\n font: \"inherit\",\n color: \"inherit\",\n background: \"rgba(255,255,255,0.6)\",\n border: \"none\",\n outline: \"1px dashed transparent\",\n outlineOffset: 4,\n padding: \"12px 14px\",\n resize: \"vertical\",\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n transition: \"outline-color 0.15s ease\",\n }}\n data-pp-edit={path}\n data-pp-type=\"markdown\"\n />\n <p style={{\n marginTop: 6, fontSize: 10, fontWeight: 700,\n textTransform: \"uppercase\", letterSpacing: \"0.15em\",\n opacity: 0.5, fontFamily: \"system-ui, sans-serif\",\n }}>\n Markdown — **fett**, *kursiv*, ## Überschrift, [link](url)\n </p>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paulpaulstudio/strapi-render",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "React SDK für Strapi-Frontends mit onpage-edit-Support über cms.paulpaul.studio.",
5
5
  "keywords": ["strapi", "cms", "onpage", "edit", "react"],
6
6
  "author": "Paul & Paul Studio <info@paulpaul.studio>",