@djangocfg/ui-tools 2.1.129 → 2.1.131
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/README.md +57 -1
- package/dist/CronScheduler.client-5UEBG4EY.mjs +67 -0
- package/dist/CronScheduler.client-5UEBG4EY.mjs.map +1 -0
- package/dist/CronScheduler.client-ZDNFXYWJ.cjs +72 -0
- package/dist/CronScheduler.client-ZDNFXYWJ.cjs.map +1 -0
- package/dist/chunk-JFGLA6DT.cjs +1013 -0
- package/dist/chunk-JFGLA6DT.cjs.map +1 -0
- package/dist/chunk-MQDWUBVX.mjs +993 -0
- package/dist/chunk-MQDWUBVX.mjs.map +1 -0
- package/dist/index.cjs +109 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +280 -1
- package/dist/index.d.ts +280 -1
- package/dist/index.mjs +32 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +5 -0
- package/src/tools/CronScheduler/CronScheduler.client.tsx +140 -0
- package/src/tools/CronScheduler/CronScheduler.story.tsx +220 -0
- package/src/tools/CronScheduler/components/CronCheatsheet.tsx +101 -0
- package/src/tools/CronScheduler/components/CustomInput.tsx +67 -0
- package/src/tools/CronScheduler/components/DayChips.tsx +130 -0
- package/src/tools/CronScheduler/components/MonthDayGrid.tsx +143 -0
- package/src/tools/CronScheduler/components/SchedulePreview.tsx +103 -0
- package/src/tools/CronScheduler/components/ScheduleTypeSelector.tsx +57 -0
- package/src/tools/CronScheduler/components/TimeSelector.tsx +132 -0
- package/src/tools/CronScheduler/components/index.ts +24 -0
- package/src/tools/CronScheduler/context/CronSchedulerContext.tsx +237 -0
- package/src/tools/CronScheduler/context/hooks.ts +86 -0
- package/src/tools/CronScheduler/context/index.ts +18 -0
- package/src/tools/CronScheduler/index.tsx +91 -0
- package/src/tools/CronScheduler/lazy.tsx +67 -0
- package/src/tools/CronScheduler/types/index.ts +112 -0
- package/src/tools/CronScheduler/utils/cron-builder.ts +100 -0
- package/src/tools/CronScheduler/utils/cron-humanize.ts +218 -0
- package/src/tools/CronScheduler/utils/cron-parser.ts +188 -0
- package/src/tools/CronScheduler/utils/index.ts +12 -0
- package/src/tools/index.ts +36 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Mermaid/index.tsx","../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage.tsx","../src/tools/Map/lazy.tsx","../src/tools/Mermaid/lazy.tsx","../src/tools/PrettyCode/lazy.tsx","../src/tools/OpenapiViewer/lazy.tsx","../src/tools/JsonForm/lazy.tsx","../src/tools/LottiePlayer/lazy.tsx","../src/tools/AudioPlayer/lazy.tsx","../src/tools/VideoPlayer/lazy.tsx","../src/tools/JsonTree/lazy.tsx","../src/tools/ImageViewer/lazy.tsx","../src/tools/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx"],"names":["React","lazy","LoadingFallback","jsxs","jsx","Suspense"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyBO,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAU,EAA2B;AAC7D,EAAA,MAAM,IAAI,SAAA,EAA4B;AACtC,EAAA,MAAM,YAAA,GAAe,EAAE,mBAAmB,CAAA;AAE1C,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gDAAA;AAAA,QACA,2DAAA;AAAA,QACA,oEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY;AAAA;AAAA,GACd;AAEJ;AAhBgB,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAqBT,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA,GAAY,GAAA;AAAA,EACZ,QAAA,GAAW,IAAA;AAAA,EACX,IAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAI,SAAA,EAA4B;AACtC,EAAA,MAAM,WAAA,GAAc,IAAA,IAAQ,CAAA,CAAE,iBAAiB,CAAA;AAC/C,EAAA,MAAM,SAAS,OAAO,SAAA,KAAc,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,GAAO,SAAA;AAElE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,yDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,MAE3B,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,cAAA,EAAe,CAAA;AAAA,QACjC,QAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EAEnE;AAAA;AAAA,GACF;AAEJ;AA1BgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA+BT,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ;AACF,CAAA,EAKG;AACD,EAAA,MAAM,IAAI,SAAA,EAA4B;AACtC,EAAA,MAAM,SAAA,GAAY,KAAA,IAAS,CAAA,CAAE,mBAAmB,CAAA;AAChD,EAAA,MAAM,SAAS,OAAO,SAAA,KAAc,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,GAAO,SAAA;AAElE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,UAChE,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EAEnE,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kCAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,YAE3B,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA,SACpC,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAtCgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AA2CT,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA,GAAY,GAAA;AAAA,EACZ;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAI,SAAA,EAA4B;AACtC,EAAA,MAAM,WAAA,GAAc,EAAE,iBAAiB,CAAA;AACvC,EAAA,MAAM,SAAS,OAAO,SAAA,KAAc,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,GAAO,SAAA;AAElE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,iDAAA;AAAA,QACA,kCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,MAE3B,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,wBAAA,EAAyB,CAAA;AAAA,0BAC5C,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,kBAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+BAAA;AAAA,cACV,IAAA,EAAK,MAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,MAAA,EAAO,cAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe,OAAA;AAAA,oBACf,WAAA,EAAa,CAAA;AAAA,oBACb,CAAA,EAAE;AAAA;AAAA,iBACJ;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe,OAAA;AAAA,oBACf,WAAA,EAAa,CAAA;AAAA,oBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,WACF,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EACjE;AAAA;AAAA,GACF;AAEJ;AAjDgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA4FT,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,kBAAkB,IAAA,mBACtB,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,eAAA;AAAA,MACb,SAAA;AAAA,MACA;AAAA;AAAA,GACF,mBAEA,GAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAsB,SAAA,EAAsB,CAAA;AAG/D,EAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAU,QAAA,IAAY,iBAAkB,QAAA,EAAS,CAAA;AACpE;AArBgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA8CT,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,GAAyC,EAAC,EACxB;AAClB,EAAA,MAAM,aAAA,GAAsBA,YAAK,MAAM,CAAA;AAEvC,EAAA,MAAM,gBAAA,2BAAoB,KAAA,KAAa;AACrC,IAAA,MAAM,QAAA,GACJ,OAAO,OAAA,CAAQ,QAAA,KAAa,UAAA,GACxB,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GACtB,OAAA,CAAQ,QAAA,oBAAY,GAAA,CAAC,eAAA,EAAA,EAAgB,CAAA;AAE3C,IAAA,2BACG,QAAA,EAAA,EAAS,QAAA,EACR,8BAAC,aAAA,EAAA,EAAe,GAAG,OAAO,CAAA,EAC5B,CAAA;AAAA,EAEJ,CAAA,EAXyB,kBAAA,CAAA;AAazB,EAAA,gBAAA,CAAiB,WAAA,GAAc,QAAQ,WAAA,IAAe,eAAA;AAEtD,EAAA,OAAO,gBAAA;AACT;AAtBgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;ACtPhB,IAAM,aAAA,GAAgBC,IAAAA,CAAK,MAAM,OAAO,+BAAkB,CAAC,CAAA;AAG3D,IAAMC,mCAAkB,MAAA,CAAA,sBACtBC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,kBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,oBAC7DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,YAAA,EAAU;AAAA,GAAA,EAC9D,CAAA;AAAA,kBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EAA8D,GAC/E,CAAA,EACF;AAAA,CAAA,EACF,CAAA,EAXsB,iBAAA,CAAA;AAoBxB,IAAM,OAAA,2BAAmC,KAAA,KAAU;AACjD,EAAA,uBACEA,GAAAA,CAACC,QAAAA,EAAA,EAAS,0BAAUD,GAAAA,CAACF,gBAAAA,EAAA,EAAgB,GACnC,QAAA,kBAAAE,GAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,OAAO,CAAA,EAC5B,CAAA;AAEJ,CAAA,EANwC,SAAA,CAAA;AAQxC,IAAO,eAAA,GAAQ;ACFf,SAAS,aAAA,CAAc,SAAiB,SAAA,EAA2B;AACjE,EAAA,IAAI,OAAA,CAAQ,UAAU,SAAA,EAAW;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,GAAa,SAAA;AAGjB,EAAA,OAAO,UAAA,GAAa,SAAA,GAAY,EAAA,IAAM,UAAA,GAAa,CAAA,EAAG;AACpD,IAAA,MAAM,IAAA,GAAO,QAAQ,UAAU,CAAA;AAC/B,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,IAAA,IAAQ,SAAS,GAAA,EAAM;AAClD,MAAA;AAAA,IACF;AACA,IAAA,UAAA,EAAA;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,IAAc,YAAY,EAAA,EAAI;AAChC,IAAA,UAAA,GAAa,SAAA;AAAA,EACf;AAEA,EAAA,IAAI,YAAY,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,EAAE,OAAA,EAAQ;AAGrD,EAAA,SAAA,GAAY,oBAAoB,SAAS,CAAA;AAEzC,EAAA,OAAO,SAAA;AACT;AA5BS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAiCT,SAAS,eAAA,CAAgB,SAAiB,QAAA,EAA0B;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAEhC,EAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,GAAY,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AAG5D,EAAA,SAAA,GAAY,oBAAoB,SAAS,CAAA;AAEzC,EAAA,OAAO,SAAA;AACT;AAbS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkBT,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,IAAI,MAAA,GAAS,OAAA;AAGb,EAAA,MAAM,gBAAA,mBAAmB,MAAA,CAAA,CAAC,GAAA,EAAa,MAAA,KAA2B;AAChE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAC5D,IAAA,MAAM,UAAU,GAAA,CAAI,KAAA,CAAM,IAAI,MAAA,CAAO,OAAA,EAAS,GAAG,CAAC,CAAA;AAClD,IAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AAAA,EACpC,CAAA,EAJyB,kBAAA,CAAA;AAOzB,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAC/C,EAAA,IAAI,SAAA,GAAY,MAAM,CAAA,EAAG;AACvB,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAIA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,WAAA,EAAa,GAAG,CAAA;AACrD,EAAA,IAAI,WAAA,GAAc,MAAM,CAAA,EAAG;AACzB,IAAA,MAAA,IAAU,GAAA;AAAA,EACZ;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,GAAG,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAClD,EAAA,MAAM,eAAA,GAAkB,YAAa,WAAA,GAAc,CAAA;AACnD,EAAA,IAAI,eAAA,GAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAA,IAAU,GAAA;AAAA,EACZ;AAGA,EAAA,IAAI,WAAA,GAAc,MAAM,CAAA,EAAG;AACzB,IAAA,MAAA,IAAU,OAAA;AAAA,EACZ;AAGA,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,IAAI,WAAA,GAAc,MAAM,CAAA,EAAG;AACzB,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AACxD,EAAA,IAAI,kBAAA,GAAqB,MAAM,CAAA,EAAG;AAChC,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,oBAAA,GAAuB,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACrD,EAAA,MAAM,oBAAA,GAAuB,gBAAA,CAAiB,oBAAA,EAAsB,GAAG,CAAA;AACvE,EAAA,IAAI,oBAAA,GAAuB,MAAM,CAAA,EAAG;AAClC,IAAA,MAAA,IAAU,GAAA;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA;AACT;AA1DS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAkFF,SAAS,qBAAA,CACd,OAAA,EACA,OAAA,GAAwC,EAAC,EACZ;AAC7B,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,eAAA,GAAkB,OAAM,GAAI,OAAA;AAEzD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAS,CAAC,eAAe,CAAA;AAE/D,EAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AAE9C,EAAA,MAAM,EAAE,cAAA,EAAgB,gBAAA,EAAiB,GAAI,QAAQ,MAAM;AAEzD,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACrD,MAAA,OAAO,EAAE,cAAA,EAAgB,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAQ;AAAA,IAC5D;AAEA,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,IAAI,MAAA,GAAS,OAAA;AAGb,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,iBAAA,GAAoB,QAAA,EAAU;AAC1D,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA,MAAA,GAAS,eAAA,CAAgB,QAAQ,QAAQ,CAAA;AAAA,IAC3C;AAGA,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,SAAA,EAAW;AACxD,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA,MAAA,GAAS,aAAA,CAAc,QAAQ,SAAS,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,aAAA,EAAe,gBAAA,EAAkB,MAAA,EAAO;AAAA,EACnE,GAAG,CAAC,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,iBAAiB,CAAC,CAAA;AAEpD,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM;AACnC,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,WAAA,EAAa;AACnC,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,gBAAA;AAAA,EACT,GAAG,CAAC,OAAA,EAAS,gBAAA,EAAkB,cAAA,EAAgB,WAAW,CAAC,CAAA;AAE3D,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,SAAA,KAAuB;AACvD,IAAA,cAAA,CAAe,SAAS,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AA3DgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AC9JhB,IAAM,uBAAA,2BAA2B,QAAA,KAAsC;AACrE,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,OAAO,QAAQ,CAAA;AAAA,EACxB;AAEA,EAAA,IAAIJ,eAAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,EAAG;AAClC,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,IAAA,OAAO,uBAAA,CAAwB,MAAM,QAAQ,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,uBAAuB,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,EAAA;AACT,CAAA,EAnBgC,yBAAA,CAAA;AA6EhC,IAAM,SAAA,2BAAuC,EAAE,IAAA,EAAM,UAAU,MAAA,EAAQ,SAAA,GAAY,OAAM,KAAM;AAC7F,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAEb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW;AAAA;AAAA;AAAA,UAAA,EAGP,MAAA,GACE,iCACA,0EACJ;AAAA,QAAA,CAAA;AAAA,QAEF,KAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,IAAA;AAAA,QACN,QAAA;AAAA,QACA,SAAA,EAAW,YAAY,SAAA,GAAY,SAAA;AAAA,QACnC,QAAA,EAAU,SAAS,aAAA,GAAgB,wBAAA;AAAA,QACnC,IAAA,EAAM,KAAA;AAAA,QACN;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAA,EA/B4C,WAAA,CAAA;AAmC5C,IAAM,wBAAA,mBAA2B,MAAA,CAAA,CAAC,MAAA,GAAkB,KAAA,EAAO,YAAqB,KAAA,KAAsB;AAEpG,EAAA,MAAM,QAAA,GAAW,YAAY,SAAA,GAAY,SAAA;AACzC,EAAA,MAAM,WAAA,GAAc,YAAY,SAAA,GAAY,WAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,YAAY,SAAA,GAAY,SAAA;AAE1C,EAAA,OAAO;AAAA;AAAA,IAEP,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,+BAAA,CAAA,EAAoC,UAAS,CAAA,EADxE,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,+BAAA,CAAA,EAAoC,UAAS,CAAA,EADtE,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,mCAAA,CAAA,EAAwC,UAAS,CAAA,EAD1E,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,mCAAA,CAAA,EAAwC,UAAS,CAAA,EAD1E,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,iCAAA,CAAA,EAAsC,UAAS,CAAA,EADxE,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,iCAAA,CAAA,EAAsC,UAAS,CAAA,EADxE,IAAA,CAAA;AAAA;AAAA,IAKJ,CAAA,kBAAG,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACbA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,gDAAA,CAAA,EAAqD,UAAS,CAAA,EADtF,GAAA,CAAA;AAAA;AAAA,IAKH,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,qCAAA,EAAwC,QAAQ,CAAA,CAAA,EAAK,UAAS,CAAA,EAD3E,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,wCAAA,EAA2C,QAAQ,CAAA,CAAA,EAAK,UAAS,CAAA,EAD9E,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EAAe,QAAA,EAAS,CAAA,EADpC,IAAA,CAAA;AAAA;AAAA,IAKJ,mBAAG,MAAA,CAAA,CAAC,EAAE,IAAA,EAAM,QAAA,uBACVA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAW,GAAG,QAAQ,CAAA,yEAAA,CAAA;AAAA,QACtB,MAAA,EAAQ,IAAA,EAAM,UAAA,CAAW,MAAM,IAAI,QAAA,GAAW,MAAA;AAAA,QAC9C,GAAA,EAAK,IAAA,EAAM,UAAA,CAAW,MAAM,IAAI,qBAAA,GAAwB,MAAA;AAAA,QAEvD;AAAA;AAAA,KACH,EARC,GAAA,CAAA;AAAA;AAAA,IAYH,GAAA,kBAAK,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,KAAM;AAErB,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,IAAI,QAAA,GAAW,WAAA;AAEf,MAAA,IAAIJ,eAAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,EAAG;AAClC,QAAA,MAAM,KAAA,GAAQ,QAAA;AAEd,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAW,OAAO,KAAA,CAAM,SAAS,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,MAAA,EAAS;AAC7F,UAAA,MAAM,YAAY,KAAA,CAAM,KAAA;AACxB,UAAA,MAAM,eAAe,SAAA,CAAU,SAAA;AAC/B,UAAA,QAAA,GAAW,cAAc,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,MAAK,IAAK,WAAA;AAC5D,UAAA,WAAA,GAAc,uBAAA,CAAwB,SAAA,CAAU,QAAQ,CAAA,CAAE,IAAA,EAAK;AAAA,QACjE,CAAA,MAAO;AACL,UAAA,WAAA,GAAc,uBAAA,CAAwB,QAAQ,CAAA,CAAE,IAAA,EAAK;AAAA,QACvD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,uBAAA,CAAwB,QAAQ,CAAA,CAAE,IAAA,EAAK;AAAA,MACvD;AAGA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,uBACEI,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAA0D,QAAA,EAAA,sBAAA,EAEzE,CAAA;AAAA,MAEJ;AAGA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,SAAA,EAAU,uBAAA,EAAwB,WAAsB,CAAA,EACvF,CAAA;AAAA,MAEJ;AAGA,MAAA,IAAI;AACF,QAAA,uBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAM,WAAA,EAAa,QAAA,EAAoB,QAAgB,SAAA,EAAsB,CAAA;AAAA,MACjG,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,IAAA,CAAK,qCAAqC,KAAK,CAAA;AACvD,QAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,WAAA;AAAA,cACP,OAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW;AAAA;AAAA;AAAA,cAAA,EAGP,MAAA,GACE,iCACA,0EACJ;AAAA,YAAA,CAAA;AAAA,cAEF,KAAA,EAAM;AAAA;AAAA,WACR;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW;AAAA;AAAA,YAAA,EAEZ,MAAA,GACE,2BACA,0BACJ;AAAA,UAAA,CAAA,EAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,EAAY,CAAA,EACrB;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ;AAAA,IACF,CAAA,EAvEK,KAAA,CAAA;AAAA;AAAA,IA0EL,IAAA,kBAAM,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,WAAU,KAAM;AAEjC,MAAA,IAAI,SAAA,EAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACpC,QAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAS,CAAA;AAAA,MAC/C;AAGA,MAAA,MAAM,WAAA,GAAc,wBAAwB,QAAQ,CAAA;AAGpD,MAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8EACb,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,IAEJ,CAAA,EAfM,MAAA,CAAA;AAAA;AAAA,IAkBN,UAAA,kBAAY,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACtBA,GAAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,4EAAA,CAAA,EAC/B,UACH,CAAA,EAHU,YAAA,CAAA;AAAA;AAAA,IAOZ,uBAAO,MAAA,CAAA,CAAC,EAAE,UAAS,qBACjBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACb,QAAA,kBAAAA,GAAAA,CAAC,WAAM,SAAA,EAAW,CAAA,WAAA,EAAc,QAAQ,CAAA,gBAAA,CAAA,EACrC,QAAA,EACH,GACF,CAAA,EALK,OAAA,CAAA;AAAA,IAOP,KAAA,kBAAO,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACjBA,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EACd,QAAA,EACH,CAAA,EAHK,OAAA,CAAA;AAAA,IAKP,KAAA,0BAAQ,EAAE,QAAA,uBACRA,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAS,CAAA,EADZ,OAAA,CAAA;AAAA,IAGP,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAS,CAAA,EADlD,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAS,CAAA,EADpE,IAAA,CAAA;AAAA,IAGJ,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAS,CAAA,EAD9C,IAAA,CAAA;AAAA;AAAA,IAKJ,oBAAI,MAAA,CAAA,sBACFA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gCAA+B,CAAA,EAD3C,IAAA,CAAA;AAAA;AAAA,IAKJ,MAAA,kBAAQ,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBAClBA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAS,CAAA,EADtC,QAAA,CAAA;AAAA,IAGR,EAAA,kBAAI,MAAA,CAAA,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,QAAA,EAAU,QAAA,EAAS,CAAA,EAD/B,IAAA;AAAA,GAGN;AAAE,CAAA,EAhM+B,0BAAA,CAAA;AAmMjC,IAAM,iBAAA,2BAAqB,IAAA,KAA0B;AAEnD,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,YAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA,WAAA;AAAA;AAAA,IACA,WAAA;AAAA;AAAA,IACA,SAAA;AAAA;AAAA,IACA,cAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA,SAAA;AAAA;AAAA,IACA,cAAA;AAAA;AAAA,IACA,cAAA;AAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,SAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,OAAO,iBAAiB,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5D,CAAA,EA1B0B,mBAAA,CAAA;AAwC1B,IAAM,iCAAgD,MAAA,CAAA,CAAC;AAAA,EACrD,WAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,YAAY,SAAA,GAAY,SAAA;AAEzC,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW;AAAA,QAAA,EACP,QAAQ,CAAA;AAAA;AAAA,QAAA,EAER,MAAA,GACE,mCACA,oCACJ;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAKD,QAAA,EAAA,WAAA,mBACCD,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,aAAA;AAAA,wBACDC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,SAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF,OAAA,EACF,CAAA,mBAEAD,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,aAAA;AAAA,wBACDC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,SAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF,OAAA,EACF;AAAA;AAAA,GAEJ;AAEJ,CAAA,EA9DsD,gBAAA,CAAA;AA4F/C,IAAM,kCAAkD,MAAA,CAAA,CAAC;AAAA,EAC9D,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,MAAA,GAAS,KAAA;AAAA,EACT,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,cAAA;AAAA,EAChB,aAAA,GAAgB,WAAA;AAAA,EAChB,eAAA,GAAkB,KAAA;AAAA,EAClB;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AAGpC,EAAA,MAAM,kBAAA,GAAqBJ,eAAAA,CAAM,OAAA,CAAQ,MAAM;AAC7C,IAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAE1B,IAAA,MAAM,qBAAqB,SAAA,IAAa,GAAA;AACxC,IAAA,MAAM,oBAAoB,QAAA,IAAY,EAAA;AACtC,IAAA,OAAO,EAAE,SAAA,EAAW,kBAAA,EAAoB,QAAA,EAAU,mBAAmB,eAAA,EAAgB;AAAA,EACvF,GAAG,CAAC,WAAA,EAAa,SAAA,EAAW,QAAA,EAAU,eAAe,CAAC,CAAA;AAEtD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,qBAAA;AAAA,IACF,cAAA;AAAA,IACA,WAAA,GAAc,qBAAqB;AAAC,GACtC;AAGA,EAAAA,eAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,WAAA,IAAe,kBAAkB,gBAAA,EAAkB;AACrD,MAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,WAAA,EAAa,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAaA,eAAAA,CAAM,OAAA,CAAQ,MAAM,wBAAA,CAAyB,MAAA,EAAQ,SAAS,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEvG,EAAA,MAAM,aAAA,GAAgB,YAAY,SAAA,GAAY,SAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,YAAY,UAAA,GAAa,UAAA;AAG5C,EAAA,MAAM,WAAA,GAAc,CAAC,iBAAA,CAAkB,cAAc,CAAA;AAGrD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEG,KAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,aAAa,CAAA,sDAAA,EAAyD,SAAS,CAAA,CAAA,EAChG,QAAA,EAAA;AAAA,MAAA,cAAA;AAAA,MACA,WAAA,IAAe,cAAA,oBACdA,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,WAAA,IAAe,MAAA;AAAA,wBAChBC,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,OAAA,EAAS,eAAA;AAAA,YACT,aAAA;AAAA,YACA,aAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW;AAAA,gBAAA,EACD,UAAU,2CAA2C,aAAa;AAAA,UAAA,EACxE,MAAA,GAAS,iBAAiB,mBAAmB;AAAA;AAAA,QAAA,CAAA;AAAA,QAGjD,KAAA,EAAO;AAAA;AAAA,UAEL,iBAAA,EAAmB,SAAA;AAAA,UACnB,qBAAA,EAAuB,SAAA;AAAA,UACvB,iBAAA,EAAmB,SAAA;AAAA,UACnB,kBAAA,EAAoB,SAAA;AAAA,UACpB,KAAA,EAAO;AAAA,SACT;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAe,CAAC,SAAS,CAAA;AAAA,YACzB,UAAA;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,KACF;AAAA,IACC,WAAA,IAAe,kCACdA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,OAAA,EAAS,eAAA;AAAA,QACT,aAAA;AAAA,QACA,aAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ,CAAA,EA7G+D,iBAAA;AC/axD,IAAM,gBAAA,GAAmB,mBAAA;AAAA,EAC9B,MAAM,OAAO,6BAA2B,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,YAAA,EAAa,CAAE,CAAA;AAAA,EACvF;AAAA,IACE,WAAA,EAAa,kBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,WAAW,GAAA,EAAK;AAAA;AAElD;AAKO,IAAM,WAAA,GAAc,mBAAA;AAAA,EACzB,MAAM,OAAO,6BAA2B,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ,CAAE,CAAA;AAAA,EAClF;AAAA,IACE,WAAA,EAAa,aAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,WAAW,GAAA,EAAK;AAAA;AAElD;ACRO,IAAM,WAAA,GAAc,mBAAA;AAAA,EACzB,MAAM,OAAO,+BAAkB,CAAA;AAAA,EAC/B;AAAA,IACE,WAAA,EAAa,aAAA;AAAA,IACb,0BACEA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAY,YAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AAAA;AACb;AAGN;ACVA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sFACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EAA4D,CAAA;AAAA,oBAC3EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,iBAAA,EAAe;AAAA,GAAA,EACjE,GACF,CAAA,EACF,CAAA;AAEJ;AAXS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAsBF,IAAM,cAAA,GAAiB,mBAAA;AAAA,EAC5B,MAAM,OAAO,kCAAqB,CAAA;AAAA,EAClC;AAAA,IACE,WAAA,EAAa,gBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,mBAAA,EAAA,EAAoB;AAAA;AAEnC;AChCA,SAAS,sBAAA,GAAyB;AAChC,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EAA2G,CAAA;AAAA,oBAC1HA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,2BAAA,EAAyB;AAAA,GAAA,EAC7E,CAAA,EACF,CAAA;AAEJ;AATS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAeT,IAAM,oBAAA,GAAuB,mBAAA;AAAA,EAC3B,MAAM,OAAO,iCAA+B,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,gBAAA,EAAiB,CAAE,CAAA;AAAA,EAC/F;AAAA,IACE,WAAA,EAAa,sBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,sBAAA,EAAA,EAAuB;AAAA;AAEtC,CAAA;AAWO,IAAM,iBAAA,mBAA+C,MAAA,CAAA,CAAC,EAAE,MAAA,EAAO,KAAM;AAC1E,EAAA,uBACEA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAClB,QAAA,kBAAAA,GAAAA,CAAC,wBAAqB,CAAA,EACxB,CAAA;AAEJ,CAAA,EAN4D,mBAAA;AAQ5D,iBAAA,CAAkB,WAAA,GAAc,mBAAA;ACzCzB,IAAM,kBAAA,GAAqB,mBAAA;AAAA,EAChC,MAAM,OAAO,+BAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,cAAA,EAAe,CAAE,CAAA;AAAA,EAChF;AAAA,IACE,WAAA,EAAa,oBAAA;AAAA,IACb,0BACEA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAY,wBAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AAAA;AACb;AAGN;ACZA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAA2E,CAAA;AAAA,oBAC1FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,sBAAA,EAAoB;AAAA,GAAA,EACtE,CAAA,EACF,CAAA;AAEJ;AATS,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAoBF,IAAM,gBAAA,GAAmB,mBAAA;AAAA,EAC9B,MAAM,OAAO,oCAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,YAAA,EAAa,CAAE,CAAA;AAAA,EACnF;AAAA,IACE,WAAA,EAAa,kBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,qBAAA,EAAA,EAAsB;AAAA;AAErC;AC5BA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EAA6E,CAAA;AAAA,sBAC5FA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+BAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UAEP,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,WAAA,EAAa,CAAA;AAAA,cACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,yBAAA,EAAuB;AAAA,GAAA,EACzE,CAAA,EACF,CAAA;AAEJ;AA1BS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAqCF,IAAM,qBAAA,GAAwB,mBAAA;AAAA,EACnC,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,iBAAA,EAAkB,CAAE,CAAA;AAAA,EAC/E;AAAA,IACE,WAAA,EAAa,uBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,oBAAA,EAAA,EAAqB;AAAA;AAEpC;AAOO,IAAM,sBAAA,GAAyB,mBAAA;AAAA,EACpC,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,kBAAA,EAAmB,CAAE,CAAA;AAAA,EAChF;AAAA,IACE,WAAA,EAAa,wBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,oBAAA,EAAA,EAAqB;AAAA;AAEpC;AC3DA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EAA8E,CAAA;AAAA,sBAC7FA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uBAAA;AAAA,UACV,IAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UAER,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA;AAAA,OAC1B,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,yBAAA,EAAuB;AAAA,GAAA,EACjE,CAAA,EACF,CAAA;AAEJ;AApBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AA+BF,IAAM,eAAA,GAAkB,mBAAA;AAAA,EAC7B,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,WAAA,EAAY,CAAE,CAAA;AAAA,EACzE;AAAA,IACE,WAAA,EAAa,iBAAA;AAAA,IACb,QAAA,kBAAUA,GAAAA,CAAC,oBAAA,EAAA,EAAqB;AAAA;AAEpC;ACPO,IAAM,YAAA,GAAe,mBAAA;AAAA,EAC1B,MAAM,OAAO,yBAAS,CAAA;AAAA,EACtB;AAAA,IACE,WAAA,EAAa,cAAA;AAAA,IACb,0BAAUA,GAAAA,CAAC,mBAAgB,SAAA,EAAW,GAAA,EAAK,MAAK,wBAAA,EAAyB;AAAA;AAE7E;AC/BO,IAAM,eAAA,GAAkB,mBAAA;AAAA,EAC7B,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,WAAA,EAAY,CAAE,CAAA;AAAA,EACzE;AAAA,IACE,WAAA,EAAa,iBAAA;AAAA,IACb,0BAAUA,GAAAA,CAAC,mBAAgB,SAAA,EAAW,GAAA,EAAK,MAAK,yBAAA,EAA0B;AAAA;AAE9E;ACxBA,IAAM,kBAAA,GAAqBH,IAAAA;AAAA,EAAK,MAC9B,OAAO,oCAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,YAAA,EAAa,CAAE;AAC/E,CAAA;AAGA,IAAMC,gBAAAA,mBAAkB,MAAA,CAAA,sBACtBE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAA+E,CAAA;AAAA,kBAC9FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,mBAAA,EAAiB;AAAA,CAAA,EAC3D,GACF,CAAA,EANsB,iBAAA,CAAA;AA2BjB,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,uBACEA,GAAAA,CAACC,QAAAA,EAAA,EAAS,0BAAUD,GAAAA,CAACF,gBAAAA,EAAA,EAAgB,GACnC,QAAA,kBAAAE,GAAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,OAAO,CAAA,EACjC,CAAA;AAEJ;AANgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;ACrChB,IAAM,gBAAA,GAAmBH,IAAAA;AAAA,EAAK,MAC5B,OAAO,iCAA+B,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,MAAS,EAAE,OAAA,EAAS,GAAA,CAAI,gBAAA,EAAiB,CAAE;AAC3F,CAAA;AAGA,IAAMC,gBAAAA,mBAAkB,MAAA,CAAA,sBACtBE,GAAAA,CAAC,SAAI,SAAA,EAAU,gDAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,2BAAA,EAAyB,GAClE,CAAA,EAHsB,iBAAA,CAAA;AAUjB,IAAM,UAAA,mBAAwC,MAAA,CAAA,CAAC,EAAE,MAAA,EAAO,KAAM;AACnE,EAAA,uBACEA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAClB,QAAA,kBAAAA,GAAAA,CAACC,UAAA,EAAS,QAAA,kBAAUD,GAAAA,CAACF,kBAAA,EAAgB,CAAA,EACnC,0BAAAE,GAAAA,CAAC,gBAAA,EAAA,EAAiB,GACpB,CAAA,EACF,CAAA;AAEJ,CAAA,EARqD,YAAA,CAAA;AAcrD,IAAO,qBAAA,GAAQ","file":"index.mjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Suspense, type ReactNode, type ComponentType } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useTypedT, type I18nTranslations } from '@djangocfg/i18n';\n\n// ============================================================================\n// Loading Fallback Components\n// ============================================================================\n\nexport interface LoadingFallbackProps {\n /** Minimum height of the loading container */\n minHeight?: string | number;\n /** Show loading text */\n showText?: boolean;\n /** Custom loading text */\n text?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Spinner - Simple spinning loader\n */\nexport function Spinner({ className }: { className?: string }) {\n const t = useTypedT<I18nTranslations>();\n const loadingLabel = t('ui.states.loading');\n\n return (\n <div\n className={cn(\n 'inline-block h-8 w-8 animate-spin rounded-full',\n 'border-4 border-solid border-current border-r-transparent',\n 'align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]',\n className\n )}\n role=\"status\"\n aria-label={loadingLabel}\n />\n );\n}\n\n/**\n * LoadingFallback - Default loading state for lazy components\n */\nexport function LoadingFallback({\n minHeight = 200,\n showText = true,\n text,\n className,\n}: LoadingFallbackProps) {\n const t = useTypedT<I18nTranslations>();\n const loadingText = text ?? t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center bg-muted/30 rounded-lg',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <Spinner className=\"text-primary\" />\n {showText && (\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * CardLoadingFallback - Loading state styled as a card\n */\nexport function CardLoadingFallback({\n title,\n description,\n minHeight = 200,\n className,\n}: {\n title?: string;\n description?: string;\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useTypedT<I18nTranslations>();\n const cardTitle = title ?? t('ui.states.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-card rounded-lg border border-border overflow-hidden',\n className\n )}\n >\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">{cardTitle}</h6>\n {description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{description}</p>\n )}\n </div>\n <div className=\"p-4\">\n <div\n className=\"flex justify-center items-center\"\n style={{ minHeight: height }}\n >\n <Spinner className=\"text-primary\" />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * MapLoadingFallback - Loading state for map components\n */\nexport function MapLoadingFallback({\n minHeight = 400,\n className,\n}: {\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useTypedT<I18nTranslations>();\n const loadingText = t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-muted/50 rounded-lg overflow-hidden',\n 'flex items-center justify-center',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <div className=\"relative\">\n <Spinner className=\"text-primary h-10 w-10\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n </div>\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Wrapper\n// ============================================================================\n\nexport interface LazyWrapperProps {\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode;\n /** Use card-style fallback */\n card?: boolean;\n /** Card title (when card=true) */\n cardTitle?: string;\n /** Card description (when card=true) */\n cardDescription?: string;\n /** Minimum height for fallback */\n minHeight?: string | number;\n /** Additional CSS classes for fallback */\n className?: string;\n}\n\n/**\n * LazyWrapper - Suspense wrapper with configurable fallbacks\n *\n * @example\n * // Basic usage\n * <LazyWrapper>\n * <LazyComponent />\n * </LazyWrapper>\n *\n * @example\n * // Card style fallback\n * <LazyWrapper card cardTitle=\"Diagram\" minHeight={300}>\n * <Mermaid chart={...} />\n * </LazyWrapper>\n *\n * @example\n * // Custom fallback\n * <LazyWrapper fallback={<MyCustomLoader />}>\n * <HeavyComponent />\n * </LazyWrapper>\n */\nexport function LazyWrapper({\n children,\n fallback,\n card = false,\n cardTitle,\n cardDescription,\n minHeight = 200,\n className,\n}: LazyWrapperProps) {\n const defaultFallback = card ? (\n <CardLoadingFallback\n title={cardTitle}\n description={cardDescription}\n minHeight={minHeight}\n className={className}\n />\n ) : (\n <LoadingFallback minHeight={minHeight} className={className} />\n );\n\n return <Suspense fallback={fallback ?? defaultFallback}>{children}</Suspense>;\n}\n\n// ============================================================================\n// Lazy Component Factory\n// ============================================================================\n\nexport interface CreateLazyComponentOptions<P> {\n /** Loading fallback component */\n fallback?: ReactNode | ((props: P) => ReactNode);\n /** Display name for the component */\n displayName?: string;\n}\n\n/**\n * createLazyComponent - Factory for creating lazy-loaded components\n *\n * @example\n * const LazyMermaid = createLazyComponent(\n * () => import('./Mermaid.client'),\n * {\n * displayName: 'Mermaid',\n * fallback: <CardLoadingFallback title=\"Diagram\" />,\n * }\n * );\n */\nexport function createLazyComponent<P extends object>(\n loader: () => Promise<{ default: ComponentType<P> }>,\n options: CreateLazyComponentOptions<P> = {}\n): ComponentType<P> {\n const LazyComponent = React.lazy(loader);\n\n const WrappedComponent = (props: P) => {\n const fallback =\n typeof options.fallback === 'function'\n ? options.fallback(props)\n : options.fallback ?? <LoadingFallback />;\n\n return (\n <Suspense fallback={fallback}>\n <LazyComponent {...props} />\n </Suspense>\n );\n };\n\n WrappedComponent.displayName = options.displayName ?? 'LazyComponent';\n\n return WrappedComponent;\n}\n","/**\n * Mermaid Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Mermaid library (~800KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\n\n// Lazy load the client component\nconst MermaidClient = lazy(() => import('./Mermaid.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative bg-card rounded-sm border border-border overflow-hidden\">\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">Diagram</h6>\n <p className=\"text-xs text-muted-foreground mt-1\">Loading...</p>\n </div>\n <div className=\"p-4\">\n <div className=\"flex justify-center items-center min-h-[200px]\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n </div>\n </div>\n </div>\n);\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n}\n\nconst Mermaid: React.FC<MermaidProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <MermaidClient {...props} />\n </Suspense>\n );\n};\n\nexport default Mermaid;\n","'use client';\n\nimport { useState, useMemo, useCallback } from 'react';\n\nexport interface UseCollapsibleContentOptions {\n /**\n * Maximum character length before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Start in expanded state (default: false - starts collapsed)\n */\n defaultExpanded?: boolean;\n}\n\nexport interface UseCollapsibleContentResult {\n /** Whether content is currently collapsed */\n isCollapsed: boolean;\n /** Toggle between collapsed/expanded state */\n toggleCollapsed: () => void;\n /** Set collapsed state directly */\n setCollapsed: (collapsed: boolean) => void;\n /** Content to display (truncated if collapsed, full if expanded) */\n displayContent: string;\n /** Whether the content exceeds limits and should be collapsible */\n shouldCollapse: boolean;\n /** Original content length */\n originalLength: number;\n /** Original line count */\n originalLineCount: number;\n}\n\n/**\n * Smart truncation that doesn't break words or markdown syntax\n */\nfunction smartTruncate(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content;\n }\n\n // Find a good break point (space, newline) near maxLength\n let breakPoint = maxLength;\n\n // Look backwards for a space or newline\n while (breakPoint > maxLength - 50 && breakPoint > 0) {\n const char = content[breakPoint];\n if (char === ' ' || char === '\\n' || char === '\\t') {\n break;\n }\n breakPoint--;\n }\n\n // If we couldn't find a good break point, just use maxLength\n if (breakPoint <= maxLength - 50) {\n breakPoint = maxLength;\n }\n\n let truncated = content.slice(0, breakPoint).trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Truncate by line count\n */\nfunction truncateByLines(content: string, maxLines: number): string {\n const lines = content.split('\\n');\n\n if (lines.length <= maxLines) {\n return content;\n }\n\n let truncated = lines.slice(0, maxLines).join('\\n').trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Fix unclosed markdown syntax to prevent rendering issues\n */\nfunction fixUnclosedMarkdown(content: string): string {\n let result = content;\n\n // Count occurrences of markdown markers\n const countOccurrences = (str: string, marker: string): number => {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = str.match(new RegExp(escaped, 'g'));\n return matches ? matches.length : 0;\n };\n\n // Fix unclosed bold (**) - must have even count\n const boldCount = countOccurrences(result, '**');\n if (boldCount % 2 !== 0) {\n result += '**';\n }\n\n // Fix unclosed italic (*) - but not **\n // Remove ** first for counting, then count single *\n const withoutBold = result.replace(/\\*\\*/g, '');\n const italicCount = countOccurrences(withoutBold, '*');\n if (italicCount % 2 !== 0) {\n result += '*';\n }\n\n // Fix unclosed inline code (`)\n const codeCount = countOccurrences(result, '`');\n // Ignore triple backticks for code blocks\n const tripleCount = countOccurrences(result, '```');\n const singleCodeCount = codeCount - (tripleCount * 3);\n if (singleCodeCount % 2 !== 0) {\n result += '`';\n }\n\n // Fix unclosed code blocks (```)\n if (tripleCount % 2 !== 0) {\n result += '\\n```';\n }\n\n // Fix unclosed strikethrough (~~)\n const strikeCount = countOccurrences(result, '~~');\n if (strikeCount % 2 !== 0) {\n result += '~~';\n }\n\n // Fix unclosed underline bold (__)\n const underlineBoldCount = countOccurrences(result, '__');\n if (underlineBoldCount % 2 !== 0) {\n result += '__';\n }\n\n // Fix unclosed underline italic (_) - but not __\n const withoutUnderlineBold = result.replace(/__/g, '');\n const underlineItalicCount = countOccurrences(withoutUnderlineBold, '_');\n if (underlineItalicCount % 2 !== 0) {\n result += '_';\n }\n\n return result;\n}\n\n/**\n * Hook for managing collapsible content with \"Read more...\" functionality\n *\n * @example\n * ```tsx\n * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(\n * longText,\n * { maxLength: 300, maxLines: 5 }\n * );\n *\n * return (\n * <div>\n * <Markdown content={displayContent} />\n * {shouldCollapse && (\n * <button onClick={toggleCollapsed}>\n * {isCollapsed ? 'Read more...' : 'Show less'}\n * </button>\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCollapsibleContent(\n content: string,\n options: UseCollapsibleContentOptions = {}\n): UseCollapsibleContentResult {\n const { maxLength, maxLines, defaultExpanded = false } = options;\n\n const [isCollapsed, setIsCollapsed] = useState(!defaultExpanded);\n\n const originalLength = content.length;\n const originalLineCount = content.split('\\n').length;\n\n const { shouldCollapse, truncatedContent } = useMemo(() => {\n // If no limits set, don't collapse\n if (maxLength === undefined && maxLines === undefined) {\n return { shouldCollapse: false, truncatedContent: content };\n }\n\n let needsCollapse = false;\n let result = content;\n\n // Check line limit first (usually more restrictive for chat)\n if (maxLines !== undefined && originalLineCount > maxLines) {\n needsCollapse = true;\n result = truncateByLines(result, maxLines);\n }\n\n // Then check character limit\n if (maxLength !== undefined && result.length > maxLength) {\n needsCollapse = true;\n result = smartTruncate(result, maxLength);\n }\n\n return { shouldCollapse: needsCollapse, truncatedContent: result };\n }, [content, maxLength, maxLines, originalLineCount]);\n\n const displayContent = useMemo(() => {\n if (!shouldCollapse || !isCollapsed) {\n return content;\n }\n return truncatedContent;\n }, [content, truncatedContent, shouldCollapse, isCollapsed]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setIsCollapsed(collapsed);\n }, []);\n\n return {\n isCollapsed,\n toggleCollapsed,\n setCollapsed,\n displayContent,\n shouldCollapse,\n originalLength,\n originalLineCount,\n };\n}\n\nexport default useCollapsibleContent;\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\nimport Mermaid from '../../tools/Mermaid';\nimport PrettyCode from '../../tools/PrettyCode';\nimport { useCollapsibleContent } from './useCollapsibleContent';\n\nimport type { Components } from 'react-markdown';\n\n// Helper function to extract text content from React children\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n if (typeof children === 'string') {\n return children;\n }\n\n if (typeof children === 'number') {\n return String(children);\n }\n\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n\n return '';\n};\n\nexport interface MarkdownMessageProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is from the user (affects styling) */\n isUser?: boolean;\n /** Use compact size (text-xs instead of text-sm) */\n isCompact?: boolean;\n /**\n * Enable collapsible \"Read more...\" functionality\n * When enabled, long content will be truncated with a toggle button\n * @default false\n */\n collapsible?: boolean;\n /**\n * Maximum character length before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Custom \"Read more\" button text\n * @default \"Read more...\"\n */\n readMoreLabel?: string;\n /**\n * Custom \"Show less\" button text\n * @default \"Show less\"\n */\n showLessLabel?: string;\n /**\n * Start expanded (only applies when collapsible is true)\n * @default false\n */\n defaultExpanded?: boolean;\n /**\n * Callback when collapsed state changes\n */\n onCollapseChange?: (isCollapsed: boolean) => void;\n}\n\n// Code block component with copy functionality\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\nconst CodeBlock: React.FC<CodeBlockProps> = ({ code, language, isUser, isCompact = false }) => {\n const theme = useResolvedTheme();\n\n return (\n <div className=\"relative group my-3\">\n {/* Copy button */}\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n\n {/* Code content */}\n <PrettyCode\n data={code}\n language={language}\n className={isCompact ? 'text-xs' : 'text-sm'}\n customBg={isUser ? \"bg-white/10\" : \"bg-muted dark:bg-muted\"}\n mode={theme}\n isCompact={isCompact}\n />\n </div>\n );\n};\n\n// Custom components for markdown in chat\n// Base size: text-sm (14px) for normal, text-xs (12px) for compact\nconst createMarkdownComponents = (isUser: boolean = false, isCompact: boolean = false): Components => {\n // Text size classes based on compact mode\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n const headingBase = isCompact ? 'text-sm' : 'text-base';\n const headingSm = isCompact ? 'text-xs' : 'text-sm';\n\n return {\n // Headings - scaled for chat context\n h1: ({ children }) => (\n <h1 className={`${headingBase} font-bold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-bold mb-2 mt-3 first:mt-0`}>{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h4>\n ),\n h5: ({ children }) => (\n <h5 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h5>\n ),\n h6: ({ children }) => (\n <h6 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h6>\n ),\n\n // Paragraphs - optimized for chat readability\n p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-7 break-words font-light`}>{children}</p>\n ),\n\n // Lists - compact\n ul: ({ children }) => (\n <ul className={`list-disc list-inside mb-2 space-y-1 ${textSize}`}>{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className={`list-decimal list-inside mb-2 space-y-1 ${textSize}`}>{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"break-words\">{children}</li>\n ),\n\n // Links - appropriate for chat context\n a: ({ href, children }) => (\n <a\n href={href}\n className={`${textSize} text-primary underline hover:text-primary/80 transition-colors break-all`}\n target={href?.startsWith('http') ? '_blank' : undefined}\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n ),\n\n // Code blocks - using CodeBlock component with copy functionality\n pre: ({ children }) => {\n // Extract code content and language\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n\n if (child.type === 'code' || (typeof child.type === 'function' && child.type.name === 'code')) {\n const codeProps = child.props as { className?: string; children?: React.ReactNode };\n const rawClassName = codeProps.className;\n language = rawClassName?.replace(/language-/, '').trim() || 'plaintext';\n codeContent = extractTextFromChildren(codeProps.children).trim();\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n\n // If still no content, show placeholder\n if (!codeContent) {\n return (\n <div className=\"my-3 p-3 bg-muted rounded text-sm text-muted-foreground\">\n No content available\n </div>\n );\n }\n\n // Handle Mermaid diagrams separately\n if (language === 'mermaid') {\n return (\n <div className=\"my-3 max-w-full overflow-x-auto\">\n <Mermaid chart={codeContent} className=\"max-w-[600px] mx-auto\" isCompact={isCompact} />\n </div>\n );\n }\n\n // Try to use CodeBlock component, fallback to simple pre if it fails\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // Fallback to simple pre element with copy button\n console.warn('CodeBlock failed, using fallback:', error);\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={codeContent}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n <pre className={`\n p-3 rounded text-xs font-mono overflow-x-auto\n ${isUser\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground'\n }\n `}>\n <code>{codeContent}</code>\n </pre>\n </div>\n );\n }\n },\n\n // Inline code\n code: ({ children, className }) => {\n // If it's inside a pre tag, let pre handle it\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n\n // Extract text content safely\n const codeContent = extractTextFromChildren(children);\n\n // Inline code styling\n return (\n <code className=\"px-1.5 py-0.5 rounded text-xs font-mono bg-muted text-foreground break-all\">\n {codeContent}\n </code>\n );\n },\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className={`${textSize} border-l-2 border-border pl-3 my-2 italic text-muted-foreground break-words`}>\n {children}\n </blockquote>\n ),\n\n // Tables - compact for chat\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-muted/50\">\n {children}\n </thead>\n ),\n tbody: ({ children }) => (\n <tbody>{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"border-b border-border/50\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"px-2 py-1 text-left font-medium break-words\">{children}</th>\n ),\n td: ({ children }) => (\n <td className=\"px-2 py-1 break-words\">{children}</td>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-3 border-0 h-px bg-border\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n};};\n\n// Check if content contains markdown syntax or line breaks\nconst hasMarkdownSyntax = (text: string): boolean => {\n // If there are line breaks (after trim), treat as markdown for proper paragraph rendering\n if (text.trim().includes('\\n')) {\n return true;\n }\n\n // Common markdown patterns\n const markdownPatterns = [\n /^#{1,6}\\s/m, // Headers\n /\\*\\*[^*]+\\*\\*/, // Bold\n /\\*[^*]+\\*/, // Italic\n /__[^_]+__/, // Bold (underscore)\n /_[^_]+_/, // Italic (underscore)\n /\\[.+\\]\\(.+\\)/, // Links\n /!\\[.*\\]\\(.+\\)/, // Images\n /```[\\s\\S]*```/, // Code blocks\n /`[^`]+`/, // Inline code\n /^\\s*[-*+]\\s/m, // Unordered lists\n /^\\s*\\d+\\.\\s/m, // Ordered lists\n /^\\s*>/m, // Blockquotes\n /\\|.+\\|/, // Tables\n /^---+$/m, // Horizontal rules\n /~~[^~]+~~/, // Strikethrough\n ];\n\n return markdownPatterns.some(pattern => pattern.test(text));\n};\n\n/**\n * Read more / Show less toggle button\n */\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\nconst CollapseToggle: React.FC<CollapseToggleProps> = ({\n isCollapsed,\n onClick,\n readMoreLabel,\n showLessLabel,\n isUser,\n isCompact,\n}) => {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser\n ? 'text-white/80 hover:text-white'\n : 'text-primary hover:text-primary/80'\n }\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n <>\n {showLessLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </>\n )}\n </button>\n );\n};\n\n/**\n * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) support\n * - Syntax highlighted code blocks with copy button\n * - Mermaid diagram rendering\n * - Tables, lists, blockquotes\n * - User/assistant styling modes\n * - Plain text optimization (skips ReactMarkdown for simple text)\n * - Collapsible \"Read more...\" for long messages\n *\n * @example\n * ```tsx\n * <MarkdownMessage content=\"# Hello\\n\\nThis is **bold** text.\" />\n *\n * // User message styling\n * <MarkdownMessage content=\"Some content\" isUser />\n *\n * // Collapsible long content (for chat apps)\n * <MarkdownMessage\n * content={longText}\n * collapsible\n * maxLength={300}\n * maxLines={5}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = \"\",\n isUser = false,\n isCompact = false,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = \"Read more...\",\n showLessLabel = \"Show less\",\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Trim content to remove leading/trailing whitespace and empty lines\n const trimmedContent = content.trim();\n\n // Collapsible content logic - use defaults when collapsible is enabled\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n // Default limits when collapsible is enabled but no limits specified\n const effectiveMaxLength = maxLength ?? 1000;\n const effectiveMaxLines = maxLines ?? 10;\n return { maxLength: effectiveMaxLength, maxLines: effectiveMaxLines, defaultExpanded };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const {\n isCollapsed,\n toggleCollapsed,\n displayContent,\n shouldCollapse,\n } = useCollapsibleContent(\n trimmedContent,\n collapsible ? collapsibleOptions : {}\n );\n\n // Call onCollapseChange when state changes\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => createMarkdownComponents(isUser, isCompact), [isUser, isCompact]);\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // For plain text without markdown, render directly without ReactMarkdown\n const isPlainText = !hasMarkdownSyntax(displayContent);\n\n // Render plain text - use CSS white-space: pre-line to preserve newlines\n if (isPlainText) {\n return (\n <span className={`${textSizeClass} leading-7 break-words whitespace-pre-line font-light ${className}`}>\n {displayContent}\n {collapsible && shouldCollapse && (\n <>\n {isCollapsed && '... '}\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n </>\n )}\n </span>\n );\n }\n\n // Render markdown\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass}\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-7\n `}\n style={{\n // Inherit colors from parent - fixes issues with external CSS variables\n '--tw-prose-body': 'inherit',\n '--tw-prose-headings': 'inherit',\n '--tw-prose-bold': 'inherit',\n '--tw-prose-links': 'inherit',\n color: 'inherit',\n } as React.CSSProperties}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {displayContent}\n </ReactMarkdown>\n </div>\n {collapsible && shouldCollapse && (\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n )}\n </div>\n );\n};\n\nexport default MarkdownMessage;\n","'use client';\n\n/**\n * Lazy-loaded Map Components\n *\n * Heavy MapLibre GL (~800KB) is loaded only when components are rendered.\n * Use these for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { MapContainer } from '@djangocfg/ui-tools/map'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, MapLoadingFallback } from '../../components';\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyMapContainer - Lazy-loaded map container\n *\n * Automatically shows loading state while MapLibre GL loads (~800KB)\n */\nexport const LazyMapContainer = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapContainer })),\n {\n displayName: 'LazyMapContainer',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n/**\n * LazyMapView - Lazy-loaded map view (alias for MapContainer)\n */\nexport const LazyMapView = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapView })),\n {\n displayName: 'LazyMapView',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n// ============================================================================\n// Re-export types for convenience\n// ============================================================================\n\nexport type {\n MapContainerProps,\n} from './components';\n\nexport type {\n MapViewport,\n MapStyleKey,\n MarkerData,\n} from './types';\n","'use client';\n\n/**\n * Lazy-loaded Mermaid Component\n *\n * Heavy Mermaid library (~800KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import Mermaid from '@djangocfg/ui-tools/mermaid'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyMermaid - Lazy-loaded Mermaid diagram renderer\n *\n * Automatically shows loading state while Mermaid loads (~800KB)\n */\nexport const LazyMermaid = createLazyComponent<MermaidProps>(\n () => import('./Mermaid.client'),\n {\n displayName: 'LazyMermaid',\n fallback: (\n <CardLoadingFallback\n title=\"Diagram\"\n description=\"Loading...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded PrettyCode Component\n *\n * Heavy Prism library (~500KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import PrettyCode from '@djangocfg/ui-tools/pretty-code'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { Language } from 'prism-react-renderer';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nexport type { Language };\n\n// ============================================================================\n// Code Loading Fallback\n// ============================================================================\n\nfunction CodeLoadingFallback() {\n return (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\" />\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyPrettyCode - Lazy-loaded code syntax highlighter\n *\n * Automatically shows loading state while Prism loads (~500KB)\n */\nexport const LazyPrettyCode = createLazyComponent<PrettyCodeProps>(\n () => import('./PrettyCode.client'),\n {\n displayName: 'LazyPrettyCode',\n fallback: <CodeLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded OpenapiViewer Component\n *\n * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import OpenapiViewer from '@djangocfg/ui-tools/openapi'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig, SchemaSource } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { PlaygroundConfig, SchemaSource };\n\n// ============================================================================\n// OpenAPI Loading Fallback\n// ============================================================================\n\nfunction OpenapiLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] bg-muted/30 rounded-lg\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-primary border-r-transparent\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">Loading API Playground...</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component (internal)\n// ============================================================================\n\nconst LazyPlaygroundLayout = createLazyComponent(\n () => import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout })),\n {\n displayName: 'LazyPlaygroundLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\n// ============================================================================\n// LazyOpenapiViewer\n// ============================================================================\n\n/**\n * LazyOpenapiViewer - Lazy-loaded OpenAPI schema viewer & playground\n *\n * Automatically shows loading state while OpenAPI components load (~400KB)\n */\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyPlaygroundLayout />\n </PlaygroundProvider>\n );\n};\n\nLazyOpenapiViewer.displayName = 'LazyOpenapiViewer';\n","'use client';\n\n/**\n * Lazy-loaded JsonForm Component\n *\n * Heavy JSON Schema Form (~300KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { JsonSchemaFormProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { JsonSchemaFormProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator\n *\n * Automatically shows loading state while RJSF loads (~300KB)\n */\nexport const LazyJsonSchemaForm = createLazyComponent<JsonSchemaFormProps>(\n () => import('./JsonSchemaForm').then((mod) => ({ default: mod.JsonSchemaForm })),\n {\n displayName: 'LazyJsonSchemaForm',\n fallback: (\n <CardLoadingFallback\n title=\"Form\"\n description=\"Loading form schema...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded LottiePlayer Component\n *\n * Lottie library (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { LottiePlayer } from '@djangocfg/ui-tools/lottie'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { LottiePlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n LottiePlayerProps,\n LottieSize,\n LottieSpeed,\n LottieDirection,\n} from './types';\n\n// ============================================================================\n// Lottie Loading Fallback\n// ============================================================================\n\nfunction LottieLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <span className=\"text-sm text-muted-foreground\">Loading animation...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyLottiePlayer - Lazy-loaded Lottie animation player\n *\n * Automatically shows loading state while Lottie loads (~200KB)\n */\nexport const LazyLottiePlayer = createLazyComponent<LottiePlayerProps>(\n () => import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer })),\n {\n displayName: 'LazyLottiePlayer',\n fallback: <LottieLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded AudioPlayer Components\n *\n * Heavy WaveSurfer.js (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { HybridAudioPlayer } from '@djangocfg/ui-tools/audio'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type {\n HybridAudioPlayerProps,\n HybridSimplePlayerProps,\n} from './components';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { HybridAudioPlayerProps, HybridSimplePlayerProps };\n\n// ============================================================================\n// Audio Loading Fallback\n// ============================================================================\n\nfunction AudioLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-6 bg-muted/30 rounded-lg\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\"\n />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-muted-foreground\">Loading audio player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyHybridAudioPlayer - Lazy-loaded full-featured audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridAudioPlayer = createLazyComponent<HybridAudioPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridAudioPlayer })),\n {\n displayName: 'LazyHybridAudioPlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridSimplePlayer - Lazy-loaded simple audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridSimplePlayer = createLazyComponent<HybridSimplePlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridSimplePlayer })),\n {\n displayName: 'LazyHybridSimplePlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded VideoPlayer Component\n *\n * Heavy Vidstack (~150KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { VideoPlayer } from '@djangocfg/ui-tools/video'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { VideoPlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { VideoPlayerProps };\n\n// ============================================================================\n// Video Loading Fallback\n// ============================================================================\n\nfunction VideoLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center bg-black/90 rounded-lg aspect-video\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-white/60\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-white/60\">Loading video player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyVideoPlayer - Lazy-loaded professional video player\n *\n * Automatically shows loading state while Vidstack loads (~150KB)\n */\nexport const LazyVideoPlayer = createLazyComponent<VideoPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.VideoPlayer })),\n {\n displayName: 'LazyVideoPlayer',\n fallback: <VideoLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded JsonTree Component\n *\n * JsonTree (~100KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import JsonTree from '@djangocfg/ui-tools/json-tree'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { JsonTreeConfig, JsonTreeMode } from './index';\nimport type { CommonExternalProps } from 'react-json-tree';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JsonTreeProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport type { JsonTreeConfig, JsonTreeMode };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonTree - Lazy-loaded JSON visualization tree\n *\n * Automatically shows loading state while JsonTree loads (~100KB)\n *\n * @example\n * // Full mode (with toolbar)\n * <LazyJsonTree data={obj} mode=\"full\" />\n *\n * // Compact mode (no toolbar)\n * <LazyJsonTree data={obj} mode=\"compact\" />\n *\n * // Inline mode (minimal, for embedding)\n * <LazyJsonTree data={obj} mode=\"inline\" />\n */\nexport const LazyJsonTree = createLazyComponent<JsonTreeProps>(\n () => import('./index'),\n {\n displayName: 'LazyJsonTree',\n fallback: <LoadingFallback minHeight={100} text=\"Loading JSON viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded ImageViewer Component\n *\n * ImageViewer (~50KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { ImageViewer } from '@djangocfg/ui-tools/image-viewer'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { ImageViewerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { ImageViewerProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate\n *\n * Automatically shows loading state while ImageViewer loads (~50KB)\n */\nexport const LazyImageViewer = createLazyComponent<ImageViewerProps>(\n () => import('./components').then((mod) => ({ default: mod.ImageViewer })),\n {\n displayName: 'LazyImageViewer',\n fallback: <LoadingFallback minHeight={200} text=\"Loading image viewer...\" />,\n }\n);\n","/**\n * LottiePlayer - Dynamic Import Wrapper\n *\n * Lazy loads the LottiePlayer component for optimal bundle size\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { LottiePlayerProps } from './types';\n\n// Lazy load the client component\nconst LottiePlayerClient = lazy(() =>\n import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900\" />\n <span className=\"text-sm text-gray-500\">Loading player...</span>\n </div>\n </div>\n);\n\n/**\n * LottiePlayer component wrapper with dynamic import\n *\n * This component automatically handles code splitting and lazy loading\n * of the Lottie player to optimize bundle size.\n *\n * Usage:\n * ```tsx\n * import { LottiePlayer } from '@djangocfg/ui-core/tools';\n *\n * <LottiePlayer\n * src=\"https://example.com/animation.json\"\n * size=\"md\"\n * autoplay\n * loop\n * />\n * ```\n */\nexport function LottiePlayer(props: LottiePlayerProps) {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <LottiePlayerClient {...props} />\n </Suspense>\n );\n}\n\n// Re-export types for convenience\nexport type { LottiePlayerProps, LottieSize, LottieSpeed, LottieDirection } from './types';\nexport { useLottie } from './useLottie';\nexport type { UseLottieOptions, UseLottieReturn } from './useLottie';\n","'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig } from './types';\n\n// Lazy load the PlaygroundLayout component\nconst PlaygroundLayout = lazy(() =>\n import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-muted-foreground\">Loading API Playground...</div>\n </div>\n);\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport const Playground: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <Suspense fallback={<LoadingFallback />}>\n <PlaygroundLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\n// Re-export types for convenience\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\n// Default export for dynamic import\nexport default Playground;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Mermaid/index.tsx","../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage.tsx","../src/tools/Map/lazy.tsx","../src/tools/Mermaid/lazy.tsx","../src/tools/PrettyCode/lazy.tsx","../src/tools/OpenapiViewer/lazy.tsx","../src/tools/JsonForm/lazy.tsx","../src/tools/LottiePlayer/lazy.tsx","../src/tools/AudioPlayer/lazy.tsx","../src/tools/VideoPlayer/lazy.tsx","../src/tools/JsonTree/lazy.tsx","../src/tools/ImageViewer/lazy.tsx","../src/tools/CronScheduler/lazy.tsx","../src/tools/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx","../src/tools/CronScheduler/index.tsx"],"names":["React","lazy","LoadingFallback","jsxs","jsx","Suspense"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Suspense, type ReactNode, type ComponentType } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useTypedT, type I18nTranslations } from '@djangocfg/i18n';\n\n// ============================================================================\n// Loading Fallback Components\n// ============================================================================\n\nexport interface LoadingFallbackProps {\n /** Minimum height of the loading container */\n minHeight?: string | number;\n /** Show loading text */\n showText?: boolean;\n /** Custom loading text */\n text?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Spinner - Simple spinning loader\n */\nexport function Spinner({ className }: { className?: string }) {\n const t = useTypedT<I18nTranslations>();\n const loadingLabel = t('ui.states.loading');\n\n return (\n <div\n className={cn(\n 'inline-block h-8 w-8 animate-spin rounded-full',\n 'border-4 border-solid border-current border-r-transparent',\n 'align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]',\n className\n )}\n role=\"status\"\n aria-label={loadingLabel}\n />\n );\n}\n\n/**\n * LoadingFallback - Default loading state for lazy components\n */\nexport function LoadingFallback({\n minHeight = 200,\n showText = true,\n text,\n className,\n}: LoadingFallbackProps) {\n const t = useTypedT<I18nTranslations>();\n const loadingText = text ?? t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center bg-muted/30 rounded-lg',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <Spinner className=\"text-primary\" />\n {showText && (\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * CardLoadingFallback - Loading state styled as a card\n */\nexport function CardLoadingFallback({\n title,\n description,\n minHeight = 200,\n className,\n}: {\n title?: string;\n description?: string;\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useTypedT<I18nTranslations>();\n const cardTitle = title ?? t('ui.states.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-card rounded-lg border border-border overflow-hidden',\n className\n )}\n >\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">{cardTitle}</h6>\n {description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{description}</p>\n )}\n </div>\n <div className=\"p-4\">\n <div\n className=\"flex justify-center items-center\"\n style={{ minHeight: height }}\n >\n <Spinner className=\"text-primary\" />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * MapLoadingFallback - Loading state for map components\n */\nexport function MapLoadingFallback({\n minHeight = 400,\n className,\n}: {\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useTypedT<I18nTranslations>();\n const loadingText = t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-muted/50 rounded-lg overflow-hidden',\n 'flex items-center justify-center',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <div className=\"relative\">\n <Spinner className=\"text-primary h-10 w-10\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n </div>\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Wrapper\n// ============================================================================\n\nexport interface LazyWrapperProps {\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode;\n /** Use card-style fallback */\n card?: boolean;\n /** Card title (when card=true) */\n cardTitle?: string;\n /** Card description (when card=true) */\n cardDescription?: string;\n /** Minimum height for fallback */\n minHeight?: string | number;\n /** Additional CSS classes for fallback */\n className?: string;\n}\n\n/**\n * LazyWrapper - Suspense wrapper with configurable fallbacks\n *\n * @example\n * // Basic usage\n * <LazyWrapper>\n * <LazyComponent />\n * </LazyWrapper>\n *\n * @example\n * // Card style fallback\n * <LazyWrapper card cardTitle=\"Diagram\" minHeight={300}>\n * <Mermaid chart={...} />\n * </LazyWrapper>\n *\n * @example\n * // Custom fallback\n * <LazyWrapper fallback={<MyCustomLoader />}>\n * <HeavyComponent />\n * </LazyWrapper>\n */\nexport function LazyWrapper({\n children,\n fallback,\n card = false,\n cardTitle,\n cardDescription,\n minHeight = 200,\n className,\n}: LazyWrapperProps) {\n const defaultFallback = card ? (\n <CardLoadingFallback\n title={cardTitle}\n description={cardDescription}\n minHeight={minHeight}\n className={className}\n />\n ) : (\n <LoadingFallback minHeight={minHeight} className={className} />\n );\n\n return <Suspense fallback={fallback ?? defaultFallback}>{children}</Suspense>;\n}\n\n// ============================================================================\n// Lazy Component Factory\n// ============================================================================\n\nexport interface CreateLazyComponentOptions<P> {\n /** Loading fallback component */\n fallback?: ReactNode | ((props: P) => ReactNode);\n /** Display name for the component */\n displayName?: string;\n}\n\n/**\n * createLazyComponent - Factory for creating lazy-loaded components\n *\n * @example\n * const LazyMermaid = createLazyComponent(\n * () => import('./Mermaid.client'),\n * {\n * displayName: 'Mermaid',\n * fallback: <CardLoadingFallback title=\"Diagram\" />,\n * }\n * );\n */\nexport function createLazyComponent<P extends object>(\n loader: () => Promise<{ default: ComponentType<P> }>,\n options: CreateLazyComponentOptions<P> = {}\n): ComponentType<P> {\n const LazyComponent = React.lazy(loader);\n\n const WrappedComponent = (props: P) => {\n const fallback =\n typeof options.fallback === 'function'\n ? options.fallback(props)\n : options.fallback ?? <LoadingFallback />;\n\n return (\n <Suspense fallback={fallback}>\n <LazyComponent {...props} />\n </Suspense>\n );\n };\n\n WrappedComponent.displayName = options.displayName ?? 'LazyComponent';\n\n return WrappedComponent;\n}\n","/**\n * Mermaid Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Mermaid library (~800KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\n\n// Lazy load the client component\nconst MermaidClient = lazy(() => import('./Mermaid.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative bg-card rounded-sm border border-border overflow-hidden\">\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">Diagram</h6>\n <p className=\"text-xs text-muted-foreground mt-1\">Loading...</p>\n </div>\n <div className=\"p-4\">\n <div className=\"flex justify-center items-center min-h-[200px]\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n </div>\n </div>\n </div>\n);\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n}\n\nconst Mermaid: React.FC<MermaidProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <MermaidClient {...props} />\n </Suspense>\n );\n};\n\nexport default Mermaid;\n","'use client';\n\nimport { useState, useMemo, useCallback } from 'react';\n\nexport interface UseCollapsibleContentOptions {\n /**\n * Maximum character length before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Start in expanded state (default: false - starts collapsed)\n */\n defaultExpanded?: boolean;\n}\n\nexport interface UseCollapsibleContentResult {\n /** Whether content is currently collapsed */\n isCollapsed: boolean;\n /** Toggle between collapsed/expanded state */\n toggleCollapsed: () => void;\n /** Set collapsed state directly */\n setCollapsed: (collapsed: boolean) => void;\n /** Content to display (truncated if collapsed, full if expanded) */\n displayContent: string;\n /** Whether the content exceeds limits and should be collapsible */\n shouldCollapse: boolean;\n /** Original content length */\n originalLength: number;\n /** Original line count */\n originalLineCount: number;\n}\n\n/**\n * Smart truncation that doesn't break words or markdown syntax\n */\nfunction smartTruncate(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content;\n }\n\n // Find a good break point (space, newline) near maxLength\n let breakPoint = maxLength;\n\n // Look backwards for a space or newline\n while (breakPoint > maxLength - 50 && breakPoint > 0) {\n const char = content[breakPoint];\n if (char === ' ' || char === '\\n' || char === '\\t') {\n break;\n }\n breakPoint--;\n }\n\n // If we couldn't find a good break point, just use maxLength\n if (breakPoint <= maxLength - 50) {\n breakPoint = maxLength;\n }\n\n let truncated = content.slice(0, breakPoint).trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Truncate by line count\n */\nfunction truncateByLines(content: string, maxLines: number): string {\n const lines = content.split('\\n');\n\n if (lines.length <= maxLines) {\n return content;\n }\n\n let truncated = lines.slice(0, maxLines).join('\\n').trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Fix unclosed markdown syntax to prevent rendering issues\n */\nfunction fixUnclosedMarkdown(content: string): string {\n let result = content;\n\n // Count occurrences of markdown markers\n const countOccurrences = (str: string, marker: string): number => {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = str.match(new RegExp(escaped, 'g'));\n return matches ? matches.length : 0;\n };\n\n // Fix unclosed bold (**) - must have even count\n const boldCount = countOccurrences(result, '**');\n if (boldCount % 2 !== 0) {\n result += '**';\n }\n\n // Fix unclosed italic (*) - but not **\n // Remove ** first for counting, then count single *\n const withoutBold = result.replace(/\\*\\*/g, '');\n const italicCount = countOccurrences(withoutBold, '*');\n if (italicCount % 2 !== 0) {\n result += '*';\n }\n\n // Fix unclosed inline code (`)\n const codeCount = countOccurrences(result, '`');\n // Ignore triple backticks for code blocks\n const tripleCount = countOccurrences(result, '```');\n const singleCodeCount = codeCount - (tripleCount * 3);\n if (singleCodeCount % 2 !== 0) {\n result += '`';\n }\n\n // Fix unclosed code blocks (```)\n if (tripleCount % 2 !== 0) {\n result += '\\n```';\n }\n\n // Fix unclosed strikethrough (~~)\n const strikeCount = countOccurrences(result, '~~');\n if (strikeCount % 2 !== 0) {\n result += '~~';\n }\n\n // Fix unclosed underline bold (__)\n const underlineBoldCount = countOccurrences(result, '__');\n if (underlineBoldCount % 2 !== 0) {\n result += '__';\n }\n\n // Fix unclosed underline italic (_) - but not __\n const withoutUnderlineBold = result.replace(/__/g, '');\n const underlineItalicCount = countOccurrences(withoutUnderlineBold, '_');\n if (underlineItalicCount % 2 !== 0) {\n result += '_';\n }\n\n return result;\n}\n\n/**\n * Hook for managing collapsible content with \"Read more...\" functionality\n *\n * @example\n * ```tsx\n * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(\n * longText,\n * { maxLength: 300, maxLines: 5 }\n * );\n *\n * return (\n * <div>\n * <Markdown content={displayContent} />\n * {shouldCollapse && (\n * <button onClick={toggleCollapsed}>\n * {isCollapsed ? 'Read more...' : 'Show less'}\n * </button>\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCollapsibleContent(\n content: string,\n options: UseCollapsibleContentOptions = {}\n): UseCollapsibleContentResult {\n const { maxLength, maxLines, defaultExpanded = false } = options;\n\n const [isCollapsed, setIsCollapsed] = useState(!defaultExpanded);\n\n const originalLength = content.length;\n const originalLineCount = content.split('\\n').length;\n\n const { shouldCollapse, truncatedContent } = useMemo(() => {\n // If no limits set, don't collapse\n if (maxLength === undefined && maxLines === undefined) {\n return { shouldCollapse: false, truncatedContent: content };\n }\n\n let needsCollapse = false;\n let result = content;\n\n // Check line limit first (usually more restrictive for chat)\n if (maxLines !== undefined && originalLineCount > maxLines) {\n needsCollapse = true;\n result = truncateByLines(result, maxLines);\n }\n\n // Then check character limit\n if (maxLength !== undefined && result.length > maxLength) {\n needsCollapse = true;\n result = smartTruncate(result, maxLength);\n }\n\n return { shouldCollapse: needsCollapse, truncatedContent: result };\n }, [content, maxLength, maxLines, originalLineCount]);\n\n const displayContent = useMemo(() => {\n if (!shouldCollapse || !isCollapsed) {\n return content;\n }\n return truncatedContent;\n }, [content, truncatedContent, shouldCollapse, isCollapsed]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setIsCollapsed(collapsed);\n }, []);\n\n return {\n isCollapsed,\n toggleCollapsed,\n setCollapsed,\n displayContent,\n shouldCollapse,\n originalLength,\n originalLineCount,\n };\n}\n\nexport default useCollapsibleContent;\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\nimport Mermaid from '../../tools/Mermaid';\nimport PrettyCode from '../../tools/PrettyCode';\nimport { useCollapsibleContent } from './useCollapsibleContent';\n\nimport type { Components } from 'react-markdown';\n\n// Helper function to extract text content from React children\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n if (typeof children === 'string') {\n return children;\n }\n\n if (typeof children === 'number') {\n return String(children);\n }\n\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n\n return '';\n};\n\nexport interface MarkdownMessageProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is from the user (affects styling) */\n isUser?: boolean;\n /** Use compact size (text-xs instead of text-sm) */\n isCompact?: boolean;\n /**\n * Enable collapsible \"Read more...\" functionality\n * When enabled, long content will be truncated with a toggle button\n * @default false\n */\n collapsible?: boolean;\n /**\n * Maximum character length before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Custom \"Read more\" button text\n * @default \"Read more...\"\n */\n readMoreLabel?: string;\n /**\n * Custom \"Show less\" button text\n * @default \"Show less\"\n */\n showLessLabel?: string;\n /**\n * Start expanded (only applies when collapsible is true)\n * @default false\n */\n defaultExpanded?: boolean;\n /**\n * Callback when collapsed state changes\n */\n onCollapseChange?: (isCollapsed: boolean) => void;\n}\n\n// Code block component with copy functionality\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\nconst CodeBlock: React.FC<CodeBlockProps> = ({ code, language, isUser, isCompact = false }) => {\n const theme = useResolvedTheme();\n\n return (\n <div className=\"relative group my-3\">\n {/* Copy button */}\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n\n {/* Code content */}\n <PrettyCode\n data={code}\n language={language}\n className={isCompact ? 'text-xs' : 'text-sm'}\n customBg={isUser ? \"bg-white/10\" : \"bg-muted dark:bg-muted\"}\n mode={theme}\n isCompact={isCompact}\n />\n </div>\n );\n};\n\n// Custom components for markdown in chat\n// Base size: text-sm (14px) for normal, text-xs (12px) for compact\nconst createMarkdownComponents = (isUser: boolean = false, isCompact: boolean = false): Components => {\n // Text size classes based on compact mode\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n const headingBase = isCompact ? 'text-sm' : 'text-base';\n const headingSm = isCompact ? 'text-xs' : 'text-sm';\n\n return {\n // Headings - scaled for chat context\n h1: ({ children }) => (\n <h1 className={`${headingBase} font-bold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-bold mb-2 mt-3 first:mt-0`}>{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h4>\n ),\n h5: ({ children }) => (\n <h5 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h5>\n ),\n h6: ({ children }) => (\n <h6 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h6>\n ),\n\n // Paragraphs - optimized for chat readability\n p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-7 break-words font-light`}>{children}</p>\n ),\n\n // Lists - compact\n ul: ({ children }) => (\n <ul className={`list-disc list-inside mb-2 space-y-1 ${textSize}`}>{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className={`list-decimal list-inside mb-2 space-y-1 ${textSize}`}>{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"break-words\">{children}</li>\n ),\n\n // Links - appropriate for chat context\n a: ({ href, children }) => (\n <a\n href={href}\n className={`${textSize} text-primary underline hover:text-primary/80 transition-colors break-all`}\n target={href?.startsWith('http') ? '_blank' : undefined}\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n ),\n\n // Code blocks - using CodeBlock component with copy functionality\n pre: ({ children }) => {\n // Extract code content and language\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n\n if (child.type === 'code' || (typeof child.type === 'function' && child.type.name === 'code')) {\n const codeProps = child.props as { className?: string; children?: React.ReactNode };\n const rawClassName = codeProps.className;\n language = rawClassName?.replace(/language-/, '').trim() || 'plaintext';\n codeContent = extractTextFromChildren(codeProps.children).trim();\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n\n // If still no content, show placeholder\n if (!codeContent) {\n return (\n <div className=\"my-3 p-3 bg-muted rounded text-sm text-muted-foreground\">\n No content available\n </div>\n );\n }\n\n // Handle Mermaid diagrams separately\n if (language === 'mermaid') {\n return (\n <div className=\"my-3 max-w-full overflow-x-auto\">\n <Mermaid chart={codeContent} className=\"max-w-[600px] mx-auto\" isCompact={isCompact} />\n </div>\n );\n }\n\n // Try to use CodeBlock component, fallback to simple pre if it fails\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // Fallback to simple pre element with copy button\n console.warn('CodeBlock failed, using fallback:', error);\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={codeContent}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n <pre className={`\n p-3 rounded text-xs font-mono overflow-x-auto\n ${isUser\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground'\n }\n `}>\n <code>{codeContent}</code>\n </pre>\n </div>\n );\n }\n },\n\n // Inline code\n code: ({ children, className }) => {\n // If it's inside a pre tag, let pre handle it\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n\n // Extract text content safely\n const codeContent = extractTextFromChildren(children);\n\n // Inline code styling\n return (\n <code className=\"px-1.5 py-0.5 rounded text-xs font-mono bg-muted text-foreground break-all\">\n {codeContent}\n </code>\n );\n },\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className={`${textSize} border-l-2 border-border pl-3 my-2 italic text-muted-foreground break-words`}>\n {children}\n </blockquote>\n ),\n\n // Tables - compact for chat\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-muted/50\">\n {children}\n </thead>\n ),\n tbody: ({ children }) => (\n <tbody>{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"border-b border-border/50\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"px-2 py-1 text-left font-medium break-words\">{children}</th>\n ),\n td: ({ children }) => (\n <td className=\"px-2 py-1 break-words\">{children}</td>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-3 border-0 h-px bg-border\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n};};\n\n// Check if content contains markdown syntax or line breaks\nconst hasMarkdownSyntax = (text: string): boolean => {\n // If there are line breaks (after trim), treat as markdown for proper paragraph rendering\n if (text.trim().includes('\\n')) {\n return true;\n }\n\n // Common markdown patterns\n const markdownPatterns = [\n /^#{1,6}\\s/m, // Headers\n /\\*\\*[^*]+\\*\\*/, // Bold\n /\\*[^*]+\\*/, // Italic\n /__[^_]+__/, // Bold (underscore)\n /_[^_]+_/, // Italic (underscore)\n /\\[.+\\]\\(.+\\)/, // Links\n /!\\[.*\\]\\(.+\\)/, // Images\n /```[\\s\\S]*```/, // Code blocks\n /`[^`]+`/, // Inline code\n /^\\s*[-*+]\\s/m, // Unordered lists\n /^\\s*\\d+\\.\\s/m, // Ordered lists\n /^\\s*>/m, // Blockquotes\n /\\|.+\\|/, // Tables\n /^---+$/m, // Horizontal rules\n /~~[^~]+~~/, // Strikethrough\n ];\n\n return markdownPatterns.some(pattern => pattern.test(text));\n};\n\n/**\n * Read more / Show less toggle button\n */\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\nconst CollapseToggle: React.FC<CollapseToggleProps> = ({\n isCollapsed,\n onClick,\n readMoreLabel,\n showLessLabel,\n isUser,\n isCompact,\n}) => {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser\n ? 'text-white/80 hover:text-white'\n : 'text-primary hover:text-primary/80'\n }\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n <>\n {showLessLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </>\n )}\n </button>\n );\n};\n\n/**\n * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) support\n * - Syntax highlighted code blocks with copy button\n * - Mermaid diagram rendering\n * - Tables, lists, blockquotes\n * - User/assistant styling modes\n * - Plain text optimization (skips ReactMarkdown for simple text)\n * - Collapsible \"Read more...\" for long messages\n *\n * @example\n * ```tsx\n * <MarkdownMessage content=\"# Hello\\n\\nThis is **bold** text.\" />\n *\n * // User message styling\n * <MarkdownMessage content=\"Some content\" isUser />\n *\n * // Collapsible long content (for chat apps)\n * <MarkdownMessage\n * content={longText}\n * collapsible\n * maxLength={300}\n * maxLines={5}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = \"\",\n isUser = false,\n isCompact = false,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = \"Read more...\",\n showLessLabel = \"Show less\",\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Trim content to remove leading/trailing whitespace and empty lines\n const trimmedContent = content.trim();\n\n // Collapsible content logic - use defaults when collapsible is enabled\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n // Default limits when collapsible is enabled but no limits specified\n const effectiveMaxLength = maxLength ?? 1000;\n const effectiveMaxLines = maxLines ?? 10;\n return { maxLength: effectiveMaxLength, maxLines: effectiveMaxLines, defaultExpanded };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const {\n isCollapsed,\n toggleCollapsed,\n displayContent,\n shouldCollapse,\n } = useCollapsibleContent(\n trimmedContent,\n collapsible ? collapsibleOptions : {}\n );\n\n // Call onCollapseChange when state changes\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => createMarkdownComponents(isUser, isCompact), [isUser, isCompact]);\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // For plain text without markdown, render directly without ReactMarkdown\n const isPlainText = !hasMarkdownSyntax(displayContent);\n\n // Render plain text - use CSS white-space: pre-line to preserve newlines\n if (isPlainText) {\n return (\n <span className={`${textSizeClass} leading-7 break-words whitespace-pre-line font-light ${className}`}>\n {displayContent}\n {collapsible && shouldCollapse && (\n <>\n {isCollapsed && '... '}\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n </>\n )}\n </span>\n );\n }\n\n // Render markdown\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass}\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-7\n `}\n style={{\n // Inherit colors from parent - fixes issues with external CSS variables\n '--tw-prose-body': 'inherit',\n '--tw-prose-headings': 'inherit',\n '--tw-prose-bold': 'inherit',\n '--tw-prose-links': 'inherit',\n color: 'inherit',\n } as React.CSSProperties}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {displayContent}\n </ReactMarkdown>\n </div>\n {collapsible && shouldCollapse && (\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n )}\n </div>\n );\n};\n\nexport default MarkdownMessage;\n","'use client';\n\n/**\n * Lazy-loaded Map Components\n *\n * Heavy MapLibre GL (~800KB) is loaded only when components are rendered.\n * Use these for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { MapContainer } from '@djangocfg/ui-tools/map'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, MapLoadingFallback } from '../../components';\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyMapContainer - Lazy-loaded map container\n *\n * Automatically shows loading state while MapLibre GL loads (~800KB)\n */\nexport const LazyMapContainer = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapContainer })),\n {\n displayName: 'LazyMapContainer',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n/**\n * LazyMapView - Lazy-loaded map view (alias for MapContainer)\n */\nexport const LazyMapView = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapView })),\n {\n displayName: 'LazyMapView',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n// ============================================================================\n// Re-export types for convenience\n// ============================================================================\n\nexport type {\n MapContainerProps,\n} from './components';\n\nexport type {\n MapViewport,\n MapStyleKey,\n MarkerData,\n} from './types';\n","'use client';\n\n/**\n * Lazy-loaded Mermaid Component\n *\n * Heavy Mermaid library (~800KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import Mermaid from '@djangocfg/ui-tools/mermaid'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyMermaid - Lazy-loaded Mermaid diagram renderer\n *\n * Automatically shows loading state while Mermaid loads (~800KB)\n */\nexport const LazyMermaid = createLazyComponent<MermaidProps>(\n () => import('./Mermaid.client'),\n {\n displayName: 'LazyMermaid',\n fallback: (\n <CardLoadingFallback\n title=\"Diagram\"\n description=\"Loading...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded PrettyCode Component\n *\n * Heavy Prism library (~500KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import PrettyCode from '@djangocfg/ui-tools/pretty-code'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { Language } from 'prism-react-renderer';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nexport type { Language };\n\n// ============================================================================\n// Code Loading Fallback\n// ============================================================================\n\nfunction CodeLoadingFallback() {\n return (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\" />\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyPrettyCode - Lazy-loaded code syntax highlighter\n *\n * Automatically shows loading state while Prism loads (~500KB)\n */\nexport const LazyPrettyCode = createLazyComponent<PrettyCodeProps>(\n () => import('./PrettyCode.client'),\n {\n displayName: 'LazyPrettyCode',\n fallback: <CodeLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded OpenapiViewer Component\n *\n * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import OpenapiViewer from '@djangocfg/ui-tools/openapi'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig, SchemaSource } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { PlaygroundConfig, SchemaSource };\n\n// ============================================================================\n// OpenAPI Loading Fallback\n// ============================================================================\n\nfunction OpenapiLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] bg-muted/30 rounded-lg\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-primary border-r-transparent\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">Loading API Playground...</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component (internal)\n// ============================================================================\n\nconst LazyPlaygroundLayout = createLazyComponent(\n () => import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout })),\n {\n displayName: 'LazyPlaygroundLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\n// ============================================================================\n// LazyOpenapiViewer\n// ============================================================================\n\n/**\n * LazyOpenapiViewer - Lazy-loaded OpenAPI schema viewer & playground\n *\n * Automatically shows loading state while OpenAPI components load (~400KB)\n */\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyPlaygroundLayout />\n </PlaygroundProvider>\n );\n};\n\nLazyOpenapiViewer.displayName = 'LazyOpenapiViewer';\n","'use client';\n\n/**\n * Lazy-loaded JsonForm Component\n *\n * Heavy JSON Schema Form (~300KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { JsonSchemaFormProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { JsonSchemaFormProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator\n *\n * Automatically shows loading state while RJSF loads (~300KB)\n */\nexport const LazyJsonSchemaForm = createLazyComponent<JsonSchemaFormProps>(\n () => import('./JsonSchemaForm').then((mod) => ({ default: mod.JsonSchemaForm })),\n {\n displayName: 'LazyJsonSchemaForm',\n fallback: (\n <CardLoadingFallback\n title=\"Form\"\n description=\"Loading form schema...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded LottiePlayer Component\n *\n * Lottie library (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { LottiePlayer } from '@djangocfg/ui-tools/lottie'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { LottiePlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n LottiePlayerProps,\n LottieSize,\n LottieSpeed,\n LottieDirection,\n} from './types';\n\n// ============================================================================\n// Lottie Loading Fallback\n// ============================================================================\n\nfunction LottieLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <span className=\"text-sm text-muted-foreground\">Loading animation...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyLottiePlayer - Lazy-loaded Lottie animation player\n *\n * Automatically shows loading state while Lottie loads (~200KB)\n */\nexport const LazyLottiePlayer = createLazyComponent<LottiePlayerProps>(\n () => import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer })),\n {\n displayName: 'LazyLottiePlayer',\n fallback: <LottieLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded AudioPlayer Components\n *\n * Heavy WaveSurfer.js (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { HybridAudioPlayer } from '@djangocfg/ui-tools/audio'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type {\n HybridAudioPlayerProps,\n HybridSimplePlayerProps,\n} from './components';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { HybridAudioPlayerProps, HybridSimplePlayerProps };\n\n// ============================================================================\n// Audio Loading Fallback\n// ============================================================================\n\nfunction AudioLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-6 bg-muted/30 rounded-lg\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\"\n />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-muted-foreground\">Loading audio player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyHybridAudioPlayer - Lazy-loaded full-featured audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridAudioPlayer = createLazyComponent<HybridAudioPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridAudioPlayer })),\n {\n displayName: 'LazyHybridAudioPlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridSimplePlayer - Lazy-loaded simple audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridSimplePlayer = createLazyComponent<HybridSimplePlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridSimplePlayer })),\n {\n displayName: 'LazyHybridSimplePlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded VideoPlayer Component\n *\n * Heavy Vidstack (~150KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { VideoPlayer } from '@djangocfg/ui-tools/video'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { VideoPlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { VideoPlayerProps };\n\n// ============================================================================\n// Video Loading Fallback\n// ============================================================================\n\nfunction VideoLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center bg-black/90 rounded-lg aspect-video\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-white/60\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-white/60\">Loading video player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyVideoPlayer - Lazy-loaded professional video player\n *\n * Automatically shows loading state while Vidstack loads (~150KB)\n */\nexport const LazyVideoPlayer = createLazyComponent<VideoPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.VideoPlayer })),\n {\n displayName: 'LazyVideoPlayer',\n fallback: <VideoLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded JsonTree Component\n *\n * JsonTree (~100KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import JsonTree from '@djangocfg/ui-tools/json-tree'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { JsonTreeConfig, JsonTreeMode } from './index';\nimport type { CommonExternalProps } from 'react-json-tree';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JsonTreeProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport type { JsonTreeConfig, JsonTreeMode };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonTree - Lazy-loaded JSON visualization tree\n *\n * Automatically shows loading state while JsonTree loads (~100KB)\n *\n * @example\n * // Full mode (with toolbar)\n * <LazyJsonTree data={obj} mode=\"full\" />\n *\n * // Compact mode (no toolbar)\n * <LazyJsonTree data={obj} mode=\"compact\" />\n *\n * // Inline mode (minimal, for embedding)\n * <LazyJsonTree data={obj} mode=\"inline\" />\n */\nexport const LazyJsonTree = createLazyComponent<JsonTreeProps>(\n () => import('./index'),\n {\n displayName: 'LazyJsonTree',\n fallback: <LoadingFallback minHeight={100} text=\"Loading JSON viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded ImageViewer Component\n *\n * ImageViewer (~50KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { ImageViewer } from '@djangocfg/ui-tools/image-viewer'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { ImageViewerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { ImageViewerProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate\n *\n * Automatically shows loading state while ImageViewer loads (~50KB)\n */\nexport const LazyImageViewer = createLazyComponent<ImageViewerProps>(\n () => import('./components').then((mod) => ({ default: mod.ImageViewer })),\n {\n displayName: 'LazyImageViewer',\n fallback: <LoadingFallback minHeight={200} text=\"Loading image viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded CronScheduler Component\n *\n * CronScheduler (~15KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * @example\n * import { LazyCronScheduler } from '@djangocfg/ui-tools';\n *\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * />\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n} from './types';\n\n/**\n * LazyCronScheduler - Lazy-loaded cron expression builder\n *\n * Automatically shows loading state while CronScheduler loads (~15KB).\n * Uses createLazyComponent factory for optimal code-splitting.\n *\n * @example\n * // Basic usage\n * <LazyCronScheduler\n * value=\"0 9 * * *\"\n * onChange={handleChange}\n * />\n *\n * @example\n * // With all options\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport const LazyCronScheduler = createLazyComponent<CronSchedulerProps>(\n () => import('./CronScheduler.client'),\n {\n displayName: 'LazyCronScheduler',\n fallback: (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n ),\n }\n);\n","/**\n * LottiePlayer - Dynamic Import Wrapper\n *\n * Lazy loads the LottiePlayer component for optimal bundle size\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { LottiePlayerProps } from './types';\n\n// Lazy load the client component\nconst LottiePlayerClient = lazy(() =>\n import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900\" />\n <span className=\"text-sm text-gray-500\">Loading player...</span>\n </div>\n </div>\n);\n\n/**\n * LottiePlayer component wrapper with dynamic import\n *\n * This component automatically handles code splitting and lazy loading\n * of the Lottie player to optimize bundle size.\n *\n * Usage:\n * ```tsx\n * import { LottiePlayer } from '@djangocfg/ui-core/tools';\n *\n * <LottiePlayer\n * src=\"https://example.com/animation.json\"\n * size=\"md\"\n * autoplay\n * loop\n * />\n * ```\n */\nexport function LottiePlayer(props: LottiePlayerProps) {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <LottiePlayerClient {...props} />\n </Suspense>\n );\n}\n\n// Re-export types for convenience\nexport type { LottiePlayerProps, LottieSize, LottieSpeed, LottieDirection } from './types';\nexport { useLottie } from './useLottie';\nexport type { UseLottieOptions, UseLottieReturn } from './useLottie';\n","'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig } from './types';\n\n// Lazy load the PlaygroundLayout component\nconst PlaygroundLayout = lazy(() =>\n import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-muted-foreground\">Loading API Playground...</div>\n </div>\n);\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport const Playground: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <Suspense fallback={<LoadingFallback />}>\n <PlaygroundLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\n// Re-export types for convenience\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\n// Default export for dynamic import\nexport default Playground;\n","'use client';\n\n/**\n * CronScheduler\n *\n * Compact cron expression builder following Apple HIG principles.\n * Lazy-loaded for optimal bundle size (~15KB).\n *\n * @example\n * import { CronScheduler } from '@djangocfg/ui-tools';\n *\n * <CronScheduler\n * value={cron}\n * onChange={setCron}\n * showPreview\n * />\n */\n\nimport React, { lazy, Suspense } from 'react';\nimport { LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Lazy load the client component\nconst CronSchedulerClient = lazy(() => import('./CronScheduler.client'));\n\n/**\n * CronScheduler with Suspense wrapper\n */\nexport function CronScheduler(props: CronSchedulerProps) {\n return (\n <Suspense fallback={<CronSchedulerFallback />}>\n <CronSchedulerClient {...props} />\n </Suspense>\n );\n}\n\n/**\n * Loading fallback for CronScheduler\n */\nfunction CronSchedulerFallback() {\n return (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n );\n}\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n CronSchedulerContextValue,\n} from './types';\n\n// Re-export context and hooks for advanced usage\nexport {\n CronSchedulerProvider,\n useCronSchedulerContext,\n useCronType,\n useCronTime,\n useCronWeekDays,\n useCronMonthDays,\n useCronCustom,\n useCronPreview,\n useCronScheduler,\n} from './context';\n\n// Re-export utilities\nexport {\n buildCron,\n parseCron,\n isValidCron,\n humanizeCron,\n} from './utils';\n\n// Re-export components for custom compositions\nexport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\n\nexport default CronScheduler;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djangocfg/ui-tools",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.131",
|
|
4
4
|
"description": "Heavy React tools with lazy loading - for Electron, Vite, CRA, Next.js apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ui-tools",
|
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
"check": "tsc --noEmit"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
|
-
"@djangocfg/i18n": "^2.1.
|
|
66
|
-
"@djangocfg/ui-core": "^2.1.
|
|
65
|
+
"@djangocfg/i18n": "^2.1.131",
|
|
66
|
+
"@djangocfg/ui-core": "^2.1.131",
|
|
67
67
|
"lucide-react": "^0.545.0",
|
|
68
68
|
"react": "^19.0.0",
|
|
69
69
|
"react-dom": "^19.0.0",
|
|
@@ -95,10 +95,10 @@
|
|
|
95
95
|
"@maplibre/maplibre-gl-geocoder": "^1.7.0"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
|
-
"@djangocfg/i18n": "^2.1.
|
|
98
|
+
"@djangocfg/i18n": "^2.1.131",
|
|
99
99
|
"@djangocfg/playground": "workspace:*",
|
|
100
|
-
"@djangocfg/typescript-config": "^2.1.
|
|
101
|
-
"@djangocfg/ui-core": "^2.1.
|
|
100
|
+
"@djangocfg/typescript-config": "^2.1.131",
|
|
101
|
+
"@djangocfg/ui-core": "^2.1.131",
|
|
102
102
|
"@types/mapbox__mapbox-gl-draw": "^1.4.8",
|
|
103
103
|
"@types/node": "^24.7.2",
|
|
104
104
|
"@types/react": "^19.1.0",
|
package/src/index.ts
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* - JsonTree: ~100KB (JSON visualization)
|
|
17
17
|
* - Gallery: ~50KB (Image/video gallery)
|
|
18
18
|
* - ImageViewer: ~50KB (Image viewer with zoom/pan/rotate)
|
|
19
|
+
* - CronScheduler: ~15KB (Cron expression builder)
|
|
19
20
|
*
|
|
20
21
|
* For tree-shaking, use subpath imports:
|
|
21
22
|
* - import { Gallery } from '@djangocfg/ui-tools/gallery'
|
|
@@ -94,6 +95,10 @@ export type { JsonTreeProps } from './tools/JsonTree/lazy';
|
|
|
94
95
|
// ImageViewer (~50KB)
|
|
95
96
|
export { LazyImageViewer } from './tools/ImageViewer/lazy';
|
|
96
97
|
|
|
98
|
+
// CronScheduler (~15KB)
|
|
99
|
+
export { LazyCronScheduler } from './tools/CronScheduler/lazy';
|
|
100
|
+
export type { CronSchedulerProps } from './tools/CronScheduler/lazy';
|
|
101
|
+
|
|
97
102
|
// ============================================================================
|
|
98
103
|
// Tools (from ./tools/index.ts) - Direct imports (no lazy loading)
|
|
99
104
|
// ============================================================================
|