mywhy-ui 0.1.0
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 +102 -0
- package/dist/index.cjs +767 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +189 -0
- package/dist/index.d.ts +189 -0
- package/dist/index.js +747 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -0
- package/src/globals.css +68 -0
- package/tailwind-preset.js +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Spinner/Spinner.tsx","../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../src/components/Badge/Badge.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Toast/Toast.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Link/Link.tsx","../src/components/StatusBadge/StatusBadge.tsx","../src/components/ConnectionIndicator/ConnectionIndicator.tsx","../src/hooks/useDisclosure.ts","../src/hooks/useToast.ts"],"names":["sizeClasses","jsxs","jsx","label","useEffect","useRef","useState","useCallback"],"mappings":";;;;AASA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,KAAA,EAAO,YAAA;AAAA,EACP,KAAA,EAAO,YAAA;AAAA,EACP,IAAA,EAAO;AACT,CAAA;AAEO,SAAS,OAAA,CAAQ,EAAE,IAAA,GAAO,IAAA,EAAM,KAAA,GAAQ,SAAS,KAAA,GAAQ,YAAA,EAAc,SAAA,GAAY,EAAA,EAAG,EAAiB;AAC5G,EAAA,4BACG,MAAA,EAAA,EAAK,IAAA,EAAK,UAAS,SAAA,EAAW,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,gBAAgB,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACnE,KAAA,EAAM,4BAAA;AAAA,QACN,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QACR,aAAA,EAAY,MAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,YAAA;AAAA,cACV,EAAA,EAAG,IAAA;AAAA,cACH,EAAA,EAAG,IAAA;AAAA,cACH,CAAA,EAAE,IAAA;AAAA,cACF,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,YAAA;AAAA,cACV,IAAA,EAAK,cAAA;AAAA,cACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,KACF;AAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EACnC,CAAA;AAEJ;ACjCA,IAAM,IAAA,GAAO,4PAAA;AAEb,IAAMA,YAAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,mBAAA,GAA0E;AAAA,EAC9E,KAAA,EAAO;AAAA,IACL,KAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS,mEAAA;AAAA,IACT,MAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS,mEAAA;AAAA,IACT,IAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAS,+DAAA;AAAA,IACT,OAAA,EAAS,oDAAA;AAAA,IACT,MAAA,EAAS,gDAAA;AAAA,IACT,OAAA,EAAS,oDAAA;AAAA,IACT,IAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAS,kDAAA;AAAA,IACT,OAAA,EAAS,oEAAA;AAAA,IACT,MAAA,EAAS,iEAAA;AAAA,IACT,OAAA,EAAS,oEAAA;AAAA,IACT,IAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAS,8BAAA;AAAA,IACT,OAAA,EAAS,uCAAA;AAAA,IACT,MAAA,EAAS,qCAAA;AAAA,IACT,OAAA,EAAS,uCAAA;AAAA,IACT,IAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAS,uCAAA;AAAA,IACT,OAAA,EAAS,8CAAA;AAAA,IACT,MAAA,EAAS,6CAAA;AAAA,IACT,OAAA,EAAS,8CAAA;AAAA,IACT,IAAA,EAAS;AAAA;AAEb,CAAA;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,OAAA,GAAU,QAAA;AAAA,EACV,KAAA,GAAQ,OAAA;AAAA,EACR,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,eAAe,mBAAA,CAAoB,OAAO,IAAI,KAAK,CAAA,IAAK,oBAAoB,MAAA,CAAO,KAAA;AAEzF,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA,CAAA,EAAID,YAAAA,CAAY,IAAI,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACpE,UAAU,QAAA,IAAY,OAAA;AAAA,MACrB,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCE,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,OAAO,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,OAAA,EAAS,IAEnE,IAAA,oBAAQA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAE1C,QAAA;AAAA,QACA,CAAC,WAAW,SAAA,oBAAaA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,GAClE;AAEJ;AChFA,IAAMF,YAAAA,GAAyC;AAAA,EAC7C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAe;AACb,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,GAAQ,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAA;AAE1E,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,gFAAA;AAAA,IACA,yFAAA;AAAA,IACA,iDAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAQ,6CAAA,GAAgD,4CAAA;AAAA,IACxDA,aAAY,IAAI,CAAA;AAAA,IAChB,SAAS,MAAA,GAAS,EAAA;AAAA,IAClB,SAAS,MAAA,GAAS,EAAA;AAAA,IAClB;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAS,OAAA,EAAS,SAAA,EAAU,qCAChC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA,oBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0EACb,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,sBAEFA,IAAC,OAAA,EAAA,EAAM,EAAA,EAAI,SAAS,SAAA,EAAW,UAAA,EAAa,GAAG,KAAA,EAAO,CAAA;AAAA,MACrD,0BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2EACb,QAAA,EAAA,MAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,yBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAEnD,CAAA;AAEJ;ACnDA,IAAMF,YAAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,QAAA,GAAW,OAAO,KAAA,GAAQ,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAA;AAE3E,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,0EAAA;AAAA,IACA,qEAAA;AAAA,IACA,iDAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAQ,6CAAA,GAAgD,4CAAA;AAAA,IACxDA,aAAY,IAAI,CAAA;AAAA,IAChB;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAS,QAAA,EAAU,SAAA,EAAU,qCACjC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAI,QAAA,EAAU,SAAA,EAAW,WAAA,EAAc,GAAG,KAAA,EAC/C,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpB,QAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,KAAA;AAClD,QAAA,MAAMC,MAAAA,GAAQ,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,KAAA;AAClD,QAAA,uBACED,GAAAA,CAAC,QAAA,EAAA,EAAmB,KAAA,EACjB,QAAA,EAAAC,UADU,KAEb,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAO,GAC7G,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IACC,yBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAEnD,CAAA;AAEJ;ACzDA,IAAM,aAAA,GAA4C;AAAA,EAChD,KAAA,EAAU,yCAAA;AAAA,EACV,OAAA,EAAU,uDAAA;AAAA,EACV,MAAA,EAAU,oDAAA;AAAA,EACV,OAAA,EAAU,uDAAA;AAAA,EACV,IAAA,EAAU,+CAAA;AAAA,EACV,KAAA,EAAU,gDAAA;AAAA,EACV,QAAA,EAAU,6CAAA;AAAA,EACV,MAAA,EAAU,iDAAA;AAAA,EACV,MAAA,EAAU,iDAAA;AAAA,EACV,OAAA,EAAU,oDAAA;AAAA,EACV,KAAA,EAAU;AACZ,CAAA;AAEA,IAAM,YAAA,GAA2C;AAAA,EAC/C,KAAA,EAAU,kCAAA;AAAA,EACV,OAAA,EAAU,gDAAA;AAAA,EACV,MAAA,EAAU,8CAAA;AAAA,EACV,OAAA,EAAU,gDAAA;AAAA,EACV,IAAA,EAAU,0CAAA;AAAA,EACV,KAAA,EAAU,4CAAA;AAAA,EACV,QAAA,EAAU,kDAAA;AAAA,EACV,MAAA,EAAU,8CAAA;AAAA,EACV,MAAA,EAAU,kDAAA;AAAA,EACV,OAAA,EAAU,oDAAA;AAAA,EACV,KAAA,EAAU;AACZ,CAAA;AAEA,IAAM,eAAA,GAA8C;AAAA,EAClD,KAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAU,iBAAA;AAAA,EACV,MAAA,EAAU,gBAAA;AAAA,EACV,OAAA,EAAU,iBAAA;AAAA,EACV,IAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAU,eAAA;AAAA,EACV,QAAA,EAAU,kBAAA;AAAA,EACV,MAAA,EAAU,gBAAA;AAAA,EACV,MAAA,EAAU,kBAAA;AAAA,EACV,OAAA,EAAU,mBAAA;AAAA,EACV,KAAA,EAAU;AACZ,CAAA;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,KAAA,GAAQ,MAAA;AAAA,EACR,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,QAAA;AAAA,EACV,GAAA,GAAM,KAAA;AAAA,EACN,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAe;AACb,EAAA,MAAM,aAAa,OAAA,KAAY,OAAA,GAAU,aAAa,KAAK,CAAA,GAAI,cAAc,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAa,IAAA,KAAS,IAAA,GAAO,uBAAA,GAA0B,qBAAA;AAE7D,EAAA,uBACED,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,0DAAA,EAA6D,UAAU,CAAA,CAAA,EAAI,SAAS,IAAI,SAAS,CAAA,CAAA;AAAA,MAE3G,QAAA,EAAA;AAAA,QAAA,GAAA,oBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,kCAAA,EACf,OAAA,KAAY,OAAA,GAAU,aAAA,GAAgB,eAAA,CAAgB,KAAK,CAC7D,CAAA,CAAA,EAAI,CAAA;AAAA,QAEL;AAAA;AAAA;AAAA,GACH;AAEJ;ACjEA,IAAMF,YAAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAA4C;AAAA,EAChD,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAA4C;AAAA,EAChD,KAAA,EAAU,qBAAA;AAAA,EACV,KAAA,EAAU,0BAAA;AAAA,EACV,QAAA,EAAU,6BAAA;AAAA,EACV,MAAA,EAAU,gCAAA;AAAA,EACV,IAAA,EAAU;AACZ,CAAA;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,GAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,KAAA,GAAQ,OAAA;AAAA,EACR,SAAA,GAAY;AACd,CAAA,EAAgB;AACd,EAAA,MAAM,SAAA,GAAY,kFAAkFA,YAAAA,CAAY,IAAI,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAE5I,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,uBACEE,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,cAAA,EAAiB,SAAS,CAAA;AAAA;AAAA,KACnD;AAAA,EAEJ;AAEA,EAAA,MAAM,kBAAkB,QAAA,GACpB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY,GACjC,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA;AAE1C,EAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA,EAAI,SAAS,IAC9D,QAAA,EAAA,eAAA,EACH,CAAA;AAEJ;ACvDA,IAAM,cAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,EAAA;AAAA,EACN,EAAA,EAAM,KAAA;AAAA,EACN,EAAA,EAAM,KAAA;AAAA,EACN,EAAA,EAAM;AACR,CAAA;AAEO,SAAS,IAAA,CAAK;AAAA,EACnB,OAAA,GAAU,IAAA;AAAA,EACV,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,IAAA;AAAA,EACT,IAAI,GAAA,GAAM,KAAA;AAAA,EACV,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAc;AACZ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,uBAAA;AAAA,IACA,eAAe,OAAO,CAAA;AAAA,IACtB,SAAS,aAAA,GAAgB,EAAA;AAAA,IACzB,SAAS,uBAAA,GAA0B,EAAA;AAAA,IACnC,UAAU,0DAAA,GAA6D,EAAA;AAAA,IACvE;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,SACtB,QAAA,EACH,CAAA;AAEJ;AClCO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,UAAA,GAAa,EAAA,KAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAA;AAEjG,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAA,EAChD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EAAwC,SAAS,UAAA,EAChE,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,UAAA;AAAA,UACJ,IAAA,EAAK,UAAA;AAAA,UACL,SAAA,EAAW;AAAA,YACT,0CAAA;AAAA,YACA,mDAAA;AAAA,YACA,iDAAA;AAAA,YACA,QAAQ,sBAAA,GAAyB;AAAA,WACnC,CAAE,KAAK,GAAG,CAAA;AAAA,UACT,GAAG;AAAA;AAAA,OACN;AAAA,MAAA,CACE,SAAS,WAAA,qBACTD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAEvE,+BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAA0B,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EAE1D;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,yBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAExD,CAAA;AAEJ;ACpCA,IAAMF,YAAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI,uBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,aAAA,GAAgD;AAAA,EACpD,IAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAY,UAAA;AAAA,EACZ,UAAA,EAAY,UAAA;AAAA,EACZ,IAAA,EAAY;AACd,CAAA;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,MAAA;AAAA,EACT,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,UAAA,GAAa,OAAO,KAAA,GAAQ,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAA;AAE7E,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,gFAAA;AAAA,IACA,qEAAA;AAAA,IACA,iDAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAQ,6CAAA,GAAgD,4CAAA;AAAA,IACxDA,aAAY,IAAI,CAAA;AAAA,IAChB,cAAc,MAAM,CAAA;AAAA,IACpB;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAS,UAAA,EAAY,SAAA,EAAU,qCACnC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAEFA,IAAC,UAAA,EAAA,EAAS,EAAA,EAAI,YAAY,SAAA,EAAW,aAAA,EAAgB,GAAG,KAAA,EAAO,CAAA;AAAA,IAC9D,yBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAEnD,CAAA;AAEJ;AChDA,IAAMF,YAAAA,GAAc;AAAA,EAClB,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAgB;AACd,EAAA,MAAM,UAAA,GAAa,OAAuB,IAAI,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAAE,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAAE,CAAA;AACxE,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAA,GAAO,QAAA,GAAW,EAAA;AACjD,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AAAA,IAAG,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAU,yDAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,UAAA,CAAW,OAAA,EAAS,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAGjE,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA8C,eAAY,MAAA,EAAO,CAAA;AAAA,wBAGhFD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,MAAA;AAAA,YACX,iBAAA,EAAiB,QAAQ,cAAA,GAAiB,MAAA;AAAA,YAC1C,WAAW,CAAA,gBAAA,EAAmBD,YAAAA,CAAY,IAAI,CAAC,yFAAyF,SAAS,CAAA,CAAA;AAAA,YAGhJ,QAAA,EAAA;AAAA,cAAA,KAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,IAAA,EAAA,EAAG,EAAA,EAAG,cAAA,EAAe,SAAA,EAAU,kCAC7B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,OAAA;AAAA,oBACT,SAAA,EAAU,sFAAA;AAAA,oBACV,YAAA,EAAW,cAAA;AAAA,oBAEX,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAE,oBAAA,EAAqB,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO,CAAA,EAC5F;AAAA;AAAA;AACF,eAAA,EACF,CAAA;AAAA,8BAIFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACZ,QAAA,EACH,CAAA;AAAA,cAGC,0BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFACZ,QAAA,EAAA,MAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;AC/EA,IAAM,UAAA,GAA4E;AAAA,EAChF,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,uDAAA;AAAA,IACT,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,WAAU,4BAAA,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,sBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAO;AAAA,KAAA,EAC7G;AAAA,GAEJ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,oDAAA;AAAA,IACT,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,WAAU,2BAAA,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,sBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO;AAAA,KAAA,EAC5F;AAAA,GAEJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,uDAAA;AAAA,IACT,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,WAAU,4BAAA,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,CAAA,EAAE,mBAAA,EAAoB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,cAAA,EAAe,OAAA,EAAO,CAAA;AAAA,sBAC1FA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO;AAAA,KAAA,EACxF;AAAA,GAEJ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,yCAAA;AAAA,IACT,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,WAAU,qBAAA,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,sBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO;AAAA,KAAA,EACvF;AAAA;AAGN,CAAA;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,IAAA,GAAO,MAAA;AAAA,EACP,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAe;AACb,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAC3B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA;AAC1C,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,WAAW,IAAI,CAAA;AAEzC,EAAA,uBACEH,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,CAAA,uFAAA,EAA0F,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MAEzH,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBAC/BD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACzD,2BAAWA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAA6B,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EAChE,CAAA;AAAA,QACC,2BACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,wEAAA;AAAA,YACV,YAAA,EAAW,SAAA;AAAA,YAEX,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAE,oBAAA,EAAqB,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO,CAAA,EAC5F;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAOO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAwB;AACvE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,GAAAA,CAAC,SAAsB,GAAG,KAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,EAAA,EAApD,KAAA,CAAM,EAAiD,CACpE,CAAA,EACH,CAAA;AAEJ;AC/FA,IAAM,gBAAA,GAAqD;AAAA,EACzD,GAAA,EAAQ,8CAAA;AAAA,EACR,MAAA,EAAQ,2CAAA;AAAA,EACR,IAAA,EAAQ,4CAAA;AAAA,EACR,KAAA,EAAQ;AACV,CAAA;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,OAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,GAAA;AAAA,EACR,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWG,OAA6C,IAAI,CAAA;AAElE,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,QAAA,CAAS,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,IAAI,GAAG,KAAK,CAAA;AAAA,EAC7D,CAAA;AACA,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAAD,SAAAA,CAAU,MAAM,MAAM;AAAE,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,EAAE,CAAA,EAAG,EAAE,CAAA;AAElF,EAAA,uBACEH,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,sBAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,YAAA,EAAc,IAAA;AAAA,MACd,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MAEP,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,2BACCC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,SAAA;AAAA,YACL,WAAW,CAAA,4HAAA,EAA+H,gBAAA,CAAiB,SAAS,CAAC,IAAI,SAAS,CAAA,CAAA;AAAA,YAEjL,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;ACnDA,IAAM,cAAA,GAAiB;AAAA,EACrB,OAAA,EAAS,2CAAA;AAAA,EACT,KAAA,EAAS,+CAAA;AAAA,EACT,KAAA,EAAS;AACX,CAAA;AAEO,SAAS,IAAA,CAAK;AAAA,EACnB,OAAA,GAAU,SAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,aAAA,GAAgB,WAClB,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,qBAAA,KACzB,EAAC;AAEL,EAAA,uBACEA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,kBAAA,EAAqB,cAAA,CAAe,OAAO,CAAC,IAAI,SAAS,CAAA,CAAA;AAAA,MACnE,GAAG,aAAA;AAAA,MACH,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;ACpBA,IAAM,YAAA,GAAkI;AAAA,EACtI,MAAA,EAAQ;AAAA,IACN,KAAA,EAAa,QAAA;AAAA,IACb,QAAA,EAAa,kBAAA;AAAA,IACb,SAAA,EAAa,oBAAA;AAAA,IACb,OAAA,EAAa,aAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAa,mBAAA;AAAA,IACb,SAAA,EAAa,qBAAA;AAAA,IACb,OAAA,EAAa,iBAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAa,OAAA;AAAA,IACb,QAAA,EAAa,iBAAA;AAAA,IACb,SAAA,EAAa,mBAAA;AAAA,IACb,OAAA,EAAa,cAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAa,mBAAA;AAAA,IACb,SAAA,EAAa,qBAAA;AAAA,IACb,OAAA,EAAa,eAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAa,YAAA;AAAA,IACb,QAAA,EAAa,gBAAA;AAAA,IACb,SAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAa,WAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAa,mBAAA;AAAA,IACb,SAAA,EAAa,gBAAA;AAAA,IACb,OAAA,EAAa,iBAAA;AAAA,IACb,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,KAAA;AAAA,EACR,OAAA,GAAU,IAAA;AAAA,EACV,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe,SAAS,MAAA,CAAO,KAAA;AACrC,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,uBAAA,GAA0B,qBAAA;AAE5D,EAAA,uBACED,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,0DAAA,EAA6D,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,SAAS,IAAI,SAAS,CAAA,CAAA;AAAA,MAEzJ,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,KAAU,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,YAAA,CAAA,oBAC3CC,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,wEAAA,EAA2E,MAAA,CAAO,QAAQ,CAAA;AAAA;AAAA,WACvG;AAAA,0BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,8CAAA,EAAiD,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI;AAAA,SAAA,EACvF,CAAA;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAEJ;AC1EA,IAAMF,YAAAA,GAAc;AAAA,EAClB,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,eAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,IAAA;AAAA,EACZ,UAAA,GAAa,IAAA;AAAA,EACb,SAAA,GAAY;AACd,CAAA,EAA6B;AAC3B,EAAA,MAAM,MAAA,GAAsB,YAAY,QAAA,GAAW,SAAA;AAEnD,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,yBAAA,EAA4BD,aAAY,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EACxE,QAAA,EAAA;AAAA,oBAAAE,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QACP,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,QAC7B,KAAA,EAAO,SAAA,GAAa,SAAA,GAAY,WAAA,GAAc,cAAA,GAAkB,MAAA;AAAA,QAChE,SAAS,CAAC;AAAA;AAAA,KACZ;AAAA,IACC,UAAA,IAAc,aAAa,SAAA,oBAC1BA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BACb,QAAA,EAAA,SAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,eAAe,EAAE,SAAA,EAAW,OAAO,IAAA,EAAM,SAAA,GAAY,IAAG,EAIrE;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,SAAA,CAAU,IAAI,CAAC,IAAI,SAAA,GAAY,oBAAA,GAAuB,qBAAqB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACtG,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MAEL,QAAA,EAAA,SAAA,mBACCA,GAAAA,CAAA,QAAA,EAAA,EACE,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sGAAA,EAAuG,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAO,CAAA,EACrM,CAAA,mBAEAA,GAAAA,CAAA,QAAA,EAAA,EACE,QAAA,kBAAAA,GAAAA,CAAC,UAAK,CAAA,EAAE,gHAAA,EAAiH,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAO,CAAA,EAC/M;AAAA;AAAA,GAEJ;AAEJ;ACnEO,SAAS,aAAA,CAAc,UAAU,KAAA,EAA4B;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAII,SAAS,OAAO,CAAA;AAE5C,EAAA,MAAM,OAAS,WAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AACpD,EAAA,MAAM,QAAS,WAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAM,SAAA,CAAU,CAAC,MAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AAEzD,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO;AACvC;ACVA,IAAI,OAAA,GAAU,CAAA;AAEP,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAuB,EAAE,CAAA;AAErD,EAAA,MAAM,QAAA,GAAWC,WAAAA,CAAY,CAAC,KAAA,KAA+C;AAC3E,IAAA,MAAM,EAAA,GAAK,CAAA,MAAA,EAAS,EAAE,OAAO,CAAA,CAAA;AAC7B,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,EAAE,GAAG,KAAA,EAAO,EAAA,EAAI,CAAC,CAAA;AAC/C,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,WAAA,EAAY;AACzC","file":"index.js","sourcesContent":["import React from 'react'\n\nexport interface SpinnerProps {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n color?: 'brand' | 'white' | 'gray'\n label?: string\n className?: string\n}\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n}\n\nconst colorClasses = {\n brand: 'text-brand',\n white: 'text-white',\n gray: 'text-ink-faint',\n}\n\nexport function Spinner({ size = 'md', color = 'brand', label = 'Loading...', className = '' }: SpinnerProps) {\n return (\n <span role=\"status\" className={`inline-flex ${className}`}>\n <svg\n className={`animate-spin ${sizeClasses[size]} ${colorClasses[color]}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"sr-only\">{label}</span>\n </span>\n )\n}\n","import React from 'react'\nimport { Spinner } from '../Spinner/Spinner'\n\nexport type ButtonVariant = 'solid' | 'subtle' | 'outline' | 'ghost' | 'link'\nexport type ButtonTheme = 'brand' | 'success' | 'danger' | 'warning' | 'gray'\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n theme?: ButtonTheme\n size?: ButtonSize\n loading?: boolean\n icon?: React.ReactNode\n iconRight?: React.ReactNode\n}\n\nconst base = 'inline-flex items-center justify-center gap-1.5 font-medium rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand focus-visible:ring-offset-1 disabled:opacity-50 disabled:pointer-events-none select-none'\n\nconst sizeClasses: Record<ButtonSize, string> = {\n xs: 'h-6 px-2 text-xs',\n sm: 'h-7 px-2.5 text-sm',\n md: 'h-8 px-3 text-base',\n lg: 'h-9 px-4 text-md',\n}\n\nconst variantThemeClasses: Record<ButtonVariant, Record<ButtonTheme, string>> = {\n solid: {\n brand: 'bg-brand text-white hover:bg-brand-dark active:bg-brand-dark',\n success: 'bg-success-icon text-white hover:bg-green-600 active:bg-green-700',\n danger: 'bg-danger-icon text-white hover:bg-red-600 active:bg-red-700',\n warning: 'bg-warning-icon text-white hover:bg-amber-600 active:bg-amber-700',\n gray: 'bg-ink text-white hover:bg-ink-gray active:bg-ink-gray',\n },\n subtle: {\n brand: 'bg-brand-50 text-brand hover:bg-brand-100 active:bg-brand-200',\n success: 'bg-success-bg text-success-text hover:bg-green-100',\n danger: 'bg-danger-bg text-danger-text hover:bg-red-100',\n warning: 'bg-warning-bg text-warning-text hover:bg-amber-100',\n gray: 'bg-surface-gray text-ink hover:bg-surface-overlay',\n },\n outline: {\n brand: 'border border-brand text-brand hover:bg-brand-50',\n success: 'border border-success-border text-success-text hover:bg-success-bg',\n danger: 'border border-danger-border text-danger-text hover:bg-danger-bg',\n warning: 'border border-warning-border text-warning-text hover:bg-warning-bg',\n gray: 'border border-outline text-ink hover:bg-surface-gray',\n },\n ghost: {\n brand: 'text-brand hover:bg-brand-50',\n success: 'text-success-text hover:bg-success-bg',\n danger: 'text-danger-text hover:bg-danger-bg',\n warning: 'text-warning-text hover:bg-warning-bg',\n gray: 'text-ink-light hover:bg-surface-gray',\n },\n link: {\n brand: 'text-brand hover:underline p-0 h-auto',\n success: 'text-success-text hover:underline p-0 h-auto',\n danger: 'text-danger-text hover:underline p-0 h-auto',\n warning: 'text-warning-text hover:underline p-0 h-auto',\n gray: 'text-ink-light hover:underline p-0 h-auto',\n },\n}\n\nexport function Button({\n variant = 'subtle',\n theme = 'brand',\n size = 'md',\n loading = false,\n icon,\n iconRight,\n disabled,\n children,\n className = '',\n ...props\n}: ButtonProps) {\n const variantClass = variantThemeClasses[variant]?.[theme] ?? variantThemeClasses.subtle.brand\n\n return (\n <button\n className={`${base} ${sizeClasses[size]} ${variantClass} ${className}`}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? (\n <Spinner size=\"xs\" color={variant === 'solid' ? 'white' : 'brand'} />\n ) : (\n icon && <span className=\"shrink-0\">{icon}</span>\n )}\n {children}\n {!loading && iconRight && <span className=\"shrink-0\">{iconRight}</span>}\n </button>\n )\n}\n","import React from 'react'\n\nexport type InputSize = 'sm' | 'md' | 'lg'\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n size?: InputSize\n label?: string\n error?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n\nconst sizeClasses: Record<InputSize, string> = {\n sm: 'h-7 px-2 text-sm',\n md: 'h-8 px-2.5 text-base',\n lg: 'h-9 px-3 text-md',\n}\n\nexport function Input({\n size = 'md',\n label,\n error,\n prefix,\n suffix,\n id,\n className = '',\n ...props\n}: InputProps) {\n const inputId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, '-') : undefined)\n\n const inputClass = [\n 'w-full rounded-md border bg-surface-subtle text-ink placeholder:text-ink-faint',\n 'focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-0 focus:border-brand',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors',\n error ? 'border-danger-border focus:ring-danger-icon' : 'border-outline hover:border-outline-strong',\n sizeClasses[size],\n prefix ? 'pl-8' : '',\n suffix ? 'pr-8' : '',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={inputId} className=\"text-sm font-medium text-ink-gray\">\n {label}\n </label>\n )}\n <div className=\"relative flex items-center\">\n {prefix && (\n <span className=\"absolute left-2.5 flex items-center text-ink-faint pointer-events-none\">\n {prefix}\n </span>\n )}\n <input id={inputId} className={inputClass} {...props} />\n {suffix && (\n <span className=\"absolute right-2.5 flex items-center text-ink-faint pointer-events-none\">\n {suffix}\n </span>\n )}\n </div>\n {error && (\n <p className=\"text-sm text-danger-text\">{error}</p>\n )}\n </div>\n )\n}\n","import React from 'react'\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\nexport interface SelectOption {\n value: string\n label: string\n}\n\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n size?: SelectSize\n label?: string\n error?: string\n options: Array<SelectOption | string>\n}\n\nconst sizeClasses: Record<SelectSize, string> = {\n sm: 'h-7 px-2 text-sm',\n md: 'h-8 px-2.5 text-base',\n lg: 'h-9 px-3 text-md',\n}\n\nexport function Select({\n size = 'md',\n label,\n error,\n options,\n id,\n className = '',\n ...props\n}: SelectProps) {\n const selectId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, '-') : undefined)\n\n const selectClass = [\n 'w-full rounded-md border bg-surface-subtle text-ink appearance-none pr-8',\n 'focus:outline-none focus:ring-2 focus:ring-brand focus:border-brand',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors',\n error ? 'border-danger-border focus:ring-danger-icon' : 'border-outline hover:border-outline-strong',\n sizeClasses[size],\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={selectId} className=\"text-sm font-medium text-ink-gray\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n <select id={selectId} className={selectClass} {...props}>\n {options.map((opt) => {\n const value = typeof opt === 'string' ? opt : opt.value\n const label = typeof opt === 'string' ? opt : opt.label\n return (\n <option key={value} value={value}>\n {label}\n </option>\n )\n })}\n </select>\n <span className=\"absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none text-ink-faint\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 4l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </span>\n </div>\n {error && (\n <p className=\"text-sm text-danger-text\">{error}</p>\n )}\n </div>\n )\n}\n","import React from 'react'\n\nexport type BadgeTheme =\n | 'brand' | 'success' | 'danger' | 'warning' | 'gray'\n | 'admin' | 'operator' | 'viewer'\n | 'online' | 'offline' | 'error'\n\nexport interface BadgeProps {\n theme?: BadgeTheme\n size?: 'sm' | 'md'\n variant?: 'solid' | 'subtle'\n dot?: boolean\n children: React.ReactNode\n className?: string\n}\n\nconst subtleClasses: Record<BadgeTheme, string> = {\n brand: 'bg-brand-50 text-brand border-brand-200',\n success: 'bg-success-bg text-success-text border-success-border',\n danger: 'bg-danger-bg text-danger-text border-danger-border',\n warning: 'bg-warning-bg text-warning-text border-warning-border',\n gray: 'bg-surface-gray text-ink-light border-outline',\n admin: 'bg-purple-50 text-role-admin border-purple-200',\n operator: 'bg-sky-50 text-role-operator border-sky-200',\n viewer: 'bg-surface-gray text-role-viewer border-outline',\n online: 'bg-green-50 text-status-online border-green-200',\n offline: 'bg-surface-gray text-status-offline border-outline',\n error: 'bg-danger-bg text-status-error border-danger-border',\n}\n\nconst solidClasses: Record<BadgeTheme, string> = {\n brand: 'bg-brand text-white border-brand',\n success: 'bg-success-icon text-white border-success-icon',\n danger: 'bg-danger-icon text-white border-danger-icon',\n warning: 'bg-warning-icon text-white border-warning-icon',\n gray: 'bg-ink-light text-white border-ink-light',\n admin: 'bg-role-admin text-white border-role-admin',\n operator: 'bg-role-operator text-white border-role-operator',\n viewer: 'bg-role-viewer text-white border-role-viewer',\n online: 'bg-status-online text-white border-status-online',\n offline: 'bg-status-offline text-white border-status-offline',\n error: 'bg-status-error text-white border-status-error',\n}\n\nconst dotColorClasses: Record<BadgeTheme, string> = {\n brand: 'bg-brand',\n success: 'bg-success-icon',\n danger: 'bg-danger-icon',\n warning: 'bg-warning-icon',\n gray: 'bg-ink-faint',\n admin: 'bg-role-admin',\n operator: 'bg-role-operator',\n viewer: 'bg-role-viewer',\n online: 'bg-status-online',\n offline: 'bg-status-offline',\n error: 'bg-status-error',\n}\n\nexport function Badge({\n theme = 'gray',\n size = 'sm',\n variant = 'subtle',\n dot = false,\n children,\n className = '',\n}: BadgeProps) {\n const colorClass = variant === 'solid' ? solidClasses[theme] : subtleClasses[theme]\n const sizeClass = size === 'sm' ? 'text-xs px-1.5 py-0.5' : 'text-sm px-2 py-0.5'\n\n return (\n <span\n className={`inline-flex items-center gap-1 rounded font-medium border ${colorClass} ${sizeClass} ${className}`}\n >\n {dot && (\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${\n variant === 'solid' ? 'bg-white/70' : dotColorClasses[theme]\n }`} />\n )}\n {children}\n </span>\n )\n}\n","import React from 'react'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarTheme = 'brand' | 'admin' | 'operator' | 'viewer' | 'gray'\n\nexport interface AvatarProps {\n src?: string\n alt?: string\n initials?: string\n size?: AvatarSize\n shape?: AvatarShape\n theme?: AvatarTheme\n className?: string\n}\n\nconst sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-5 h-5 text-2xs',\n sm: 'w-6 h-6 text-xs',\n md: 'w-8 h-8 text-sm',\n lg: 'w-10 h-10 text-base',\n xl: 'w-12 h-12 text-md',\n}\n\nconst shapeClasses: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded-md',\n}\n\nconst themeClasses: Record<AvatarTheme, string> = {\n brand: 'bg-brand text-white',\n admin: 'bg-role-admin text-white',\n operator: 'bg-role-operator text-white',\n viewer: 'bg-surface-gray text-ink-light',\n gray: 'bg-surface-overlay text-ink-light',\n}\n\nexport function Avatar({\n src,\n alt = '',\n initials,\n size = 'md',\n shape = 'circle',\n theme = 'brand',\n className = '',\n}: AvatarProps) {\n const baseClass = `inline-flex items-center justify-center shrink-0 font-semibold overflow-hidden ${sizeClasses[size]} ${shapeClasses[shape]}`\n\n if (src) {\n return (\n <img\n src={src}\n alt={alt}\n className={`${baseClass} object-cover ${className}`}\n />\n )\n }\n\n const displayInitials = initials\n ? initials.slice(0, 2).toUpperCase()\n : alt ? alt.slice(0, 2).toUpperCase() : '?'\n\n return (\n <span className={`${baseClass} ${themeClasses[theme]} ${className}`}>\n {displayInitials}\n </span>\n )\n}\n","import React from 'react'\n\nexport interface CardProps {\n padding?: 'none' | 'sm' | 'md' | 'lg'\n shadow?: boolean\n border?: boolean\n as?: React.ElementType\n onClick?: React.MouseEventHandler\n children: React.ReactNode\n className?: string\n}\n\nconst paddingClasses = {\n none: '',\n sm: 'p-3',\n md: 'p-4',\n lg: 'p-6',\n}\n\nexport function Card({\n padding = 'md',\n shadow = true,\n border = true,\n as: Tag = 'div',\n onClick,\n children,\n className = '',\n}: CardProps) {\n const classes = [\n 'bg-surface rounded-lg',\n paddingClasses[padding],\n shadow ? 'shadow-card' : '',\n border ? 'border border-outline' : '',\n onClick ? 'cursor-pointer hover:shadow-card-hover transition-shadow' : '',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <Tag className={classes} onClick={onClick}>\n {children}\n </Tag>\n )\n}\n","import React from 'react'\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: React.ReactNode\n description?: string\n error?: string\n}\n\nexport function Checkbox({\n label,\n description,\n error,\n id,\n className = '',\n ...props\n}: CheckboxProps) {\n const checkboxId = id ?? (typeof label === 'string' ? label.toLowerCase().replace(/\\s+/g, '-') : undefined)\n\n return (\n <div className={`flex flex-col gap-0.5 ${className}`}>\n <label className=\"flex items-start gap-2 cursor-pointer\" htmlFor={checkboxId}>\n <input\n id={checkboxId}\n type=\"checkbox\"\n className={[\n 'mt-0.5 w-4 h-4 rounded border text-brand',\n 'focus:ring-2 focus:ring-brand focus:ring-offset-0',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n error ? 'border-danger-border' : 'border-outline',\n ].join(' ')}\n {...props}\n />\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <span className=\"text-base font-medium text-ink leading-tight\">{label}</span>\n )}\n {description && (\n <span className=\"text-sm text-ink-light\">{description}</span>\n )}\n </div>\n )}\n </label>\n {error && (\n <p className=\"text-sm text-danger-text ml-6\">{error}</p>\n )}\n </div>\n )\n}\n","import React from 'react'\n\nexport type TextareaSize = 'sm' | 'md' | 'lg'\nexport type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n size?: TextareaSize\n label?: string\n error?: string\n resize?: TextareaResize\n}\n\nconst sizeClasses: Record<TextareaSize, string> = {\n sm: 'px-2 py-1.5 text-sm',\n md: 'px-2.5 py-2 text-base',\n lg: 'px-3 py-2.5 text-md',\n}\n\nconst resizeClasses: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n}\n\nexport function Textarea({\n size = 'md',\n label,\n error,\n resize = 'none',\n id,\n className = '',\n ...props\n}: TextareaProps) {\n const textareaId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, '-') : undefined)\n\n const textareaClass = [\n 'w-full rounded-md border bg-surface-subtle text-ink placeholder:text-ink-faint',\n 'focus:outline-none focus:ring-2 focus:ring-brand focus:border-brand',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors',\n error ? 'border-danger-border focus:ring-danger-icon' : 'border-outline hover:border-outline-strong',\n sizeClasses[size],\n resizeClasses[resize],\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={textareaId} className=\"text-sm font-medium text-ink-gray\">\n {label}\n </label>\n )}\n <textarea id={textareaId} className={textareaClass} {...props} />\n {error && (\n <p className=\"text-sm text-danger-text\">{error}</p>\n )}\n </div>\n )\n}\n","import React, { useEffect, useRef } from 'react'\n\nexport interface DialogProps {\n open: boolean\n onClose: () => void\n title?: string\n size?: 'sm' | 'md' | 'lg' | 'xl'\n children: React.ReactNode\n footer?: React.ReactNode\n className?: string\n}\n\nconst sizeClasses = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n}\n\nexport function Dialog({\n open,\n onClose,\n title,\n size = 'md',\n children,\n footer,\n className = '',\n}: DialogProps) {\n const overlayRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n useEffect(() => {\n document.body.style.overflow = open ? 'hidden' : ''\n return () => { document.body.style.overflow = '' }\n }, [open])\n\n if (!open) return null\n\n return (\n <div\n ref={overlayRef}\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n onClick={(e) => { if (e.target === overlayRef.current) onClose() }}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-ink/40 backdrop-blur-sm\" aria-hidden=\"true\" />\n\n {/* Panel */}\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'dialog-title' : undefined}\n className={`relative w-full ${sizeClasses[size]} bg-surface rounded-xl shadow-dialog border border-outline flex flex-col max-h-[90vh] ${className}`}\n >\n {/* Header */}\n {title && (\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-outline shrink-0\">\n <h2 id=\"dialog-title\" className=\"text-md font-semibold text-ink\">\n {title}\n </h2>\n <button\n onClick={onClose}\n className=\"p-1 rounded-md text-ink-faint hover:text-ink hover:bg-surface-gray transition-colors\"\n aria-label=\"Close dialog\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4l8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </div>\n )}\n\n {/* Body */}\n <div className=\"px-5 py-4 overflow-y-auto flex-1\">\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"px-5 py-3 border-t border-outline shrink-0 flex items-center justify-end gap-2\">\n {footer}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import React, { useEffect } from 'react'\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface ToastProps {\n type?: ToastType\n title: string\n message?: string\n duration?: number\n onClose?: () => void\n className?: string\n}\n\nconst typeConfig: Record<ToastType, { icon: React.ReactNode; classes: string }> = {\n success: {\n classes: 'border-success-border bg-success-bg text-success-text',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"text-success-icon shrink-0\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M5 8l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n ),\n },\n error: {\n classes: 'border-danger-border bg-danger-bg text-danger-text',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"text-danger-icon shrink-0\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M10 6L6 10M6 6l4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n ),\n },\n warning: {\n classes: 'border-warning-border bg-warning-bg text-warning-text',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"text-warning-icon shrink-0\">\n <path d=\"M8 2L14 13H2L8 2z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\"/>\n <path d=\"M8 6v3M8 11v.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n ),\n },\n info: {\n classes: 'border-brand-200 bg-brand-50 text-brand',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"text-brand shrink-0\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n ),\n },\n}\n\nexport function Toast({\n type = 'info',\n title,\n message,\n duration = 3000,\n onClose,\n className = '',\n}: ToastProps) {\n useEffect(() => {\n if (!duration || !onClose) return\n const timer = setTimeout(onClose, duration)\n return () => clearTimeout(timer)\n }, [duration, onClose])\n\n const { icon, classes } = typeConfig[type]\n\n return (\n <div\n role=\"alert\"\n className={`flex items-start gap-3 px-4 py-3 rounded-lg border shadow-toast min-w-[260px] max-w-sm ${classes} ${className}`}\n >\n <span className=\"mt-0.5\">{icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-base font-medium leading-tight\">{title}</p>\n {message && <p className=\"text-sm mt-0.5 opacity-80\">{message}</p>}\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"shrink-0 p-0.5 rounded opacity-60 hover:opacity-100 transition-opacity\"\n aria-label=\"Dismiss\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M11 3L3 11M3 3l8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n )}\n </div>\n )\n}\n\nexport interface ToastContainerProps {\n toasts: Array<ToastProps & { id: string }>\n onClose: (id: string) => void\n}\n\nexport function ToastContainer({ toasts, onClose }: ToastContainerProps) {\n if (toasts.length === 0) return null\n return (\n <div className=\"fixed bottom-4 right-4 z-[100] flex flex-col gap-2 items-end\">\n {toasts.map((toast) => (\n <Toast key={toast.id} {...toast} onClose={() => onClose(toast.id)} />\n ))}\n </div>\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface TooltipProps {\n content: React.ReactNode\n placement?: TooltipPlacement\n delay?: number\n children: React.ReactElement\n className?: string\n}\n\nconst placementClasses: Record<TooltipPlacement, string> = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-1.5',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-1.5',\n left: 'right-full top-1/2 -translate-y-1/2 mr-1.5',\n right: 'left-full top-1/2 -translate-y-1/2 ml-1.5',\n}\n\nexport function Tooltip({\n content,\n placement = 'top',\n delay = 200,\n children,\n className = '',\n}: TooltipProps) {\n const [visible, setVisible] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const show = () => {\n timerRef.current = setTimeout(() => setVisible(true), delay)\n }\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n setVisible(false)\n }\n\n useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n return (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {children}\n {visible && (\n <span\n role=\"tooltip\"\n className={`absolute z-50 px-2 py-1 text-xs font-medium text-white bg-ink rounded-md whitespace-nowrap shadow-toast pointer-events-none ${placementClasses[placement]} ${className}`}\n >\n {content}\n </span>\n )}\n </span>\n )\n}\n","import React from 'react'\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: 'default' | 'muted' | 'brand'\n external?: boolean\n}\n\nconst variantClasses = {\n default: 'text-ink hover:text-brand hover:underline',\n muted: 'text-ink-light hover:text-ink hover:underline',\n brand: 'text-brand hover:underline',\n}\n\nexport function Link({\n variant = 'default',\n external = false,\n children,\n className = '',\n ...props\n}: LinkProps) {\n const externalProps = external\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {}\n\n return (\n <a\n className={`transition-colors ${variantClasses[variant]} ${className}`}\n {...externalProps}\n {...props}\n >\n {children}\n </a>\n )\n}\n","import React from 'react'\n\nexport type RobotStatus = 'online' | 'offline' | 'error' | 'warning' | 'connecting' | 'unknown'\n\nexport interface StatusBadgeProps {\n status: RobotStatus\n label?: string\n size?: 'sm' | 'md'\n pulse?: boolean\n showDot?: boolean\n className?: string\n}\n\nconst statusConfig: Record<RobotStatus, { label: string; dotClass: string; textClass: string; bgClass: string; borderClass: string }> = {\n online: {\n label: 'Online',\n dotClass: 'bg-status-online',\n textClass: 'text-status-online',\n bgClass: 'bg-green-50',\n borderClass: 'border-green-200',\n },\n offline: {\n label: 'Offline',\n dotClass: 'bg-status-offline',\n textClass: 'text-status-offline',\n bgClass: 'bg-surface-gray',\n borderClass: 'border-outline',\n },\n error: {\n label: 'Error',\n dotClass: 'bg-status-error',\n textClass: 'text-status-error',\n bgClass: 'bg-danger-bg',\n borderClass: 'border-danger-border',\n },\n warning: {\n label: 'Warning',\n dotClass: 'bg-status-warning',\n textClass: 'text-status-warning',\n bgClass: 'bg-warning-bg',\n borderClass: 'border-warning-border',\n },\n connecting: {\n label: 'Connecting',\n dotClass: 'bg-status-info',\n textClass: 'text-status-info',\n bgClass: 'bg-sky-50',\n borderClass: 'border-sky-200',\n },\n unknown: {\n label: 'Unknown',\n dotClass: 'bg-status-offline',\n textClass: 'text-ink-faint',\n bgClass: 'bg-surface-gray',\n borderClass: 'border-outline',\n },\n}\n\nexport function StatusBadge({\n status,\n label,\n size = 'sm',\n pulse = false,\n showDot = true,\n className = '',\n}: StatusBadgeProps) {\n const config = statusConfig[status]\n const displayLabel = label ?? config.label\n const sizeClass = size === 'sm' ? 'text-xs px-1.5 py-0.5' : 'text-sm px-2 py-0.5'\n\n return (\n <span\n className={`inline-flex items-center gap-1 rounded font-medium border ${config.bgClass} ${config.borderClass} ${config.textClass} ${sizeClass} ${className}`}\n >\n {showDot && (\n <span className=\"relative flex shrink-0 w-1.5 h-1.5\">\n {pulse && (status === 'online' || status === 'connecting') && (\n <span\n className={`absolute inline-flex h-full w-full rounded-full opacity-75 animate-ping ${config.dotClass}`}\n />\n )}\n <span className={`relative inline-flex rounded-full w-1.5 h-1.5 ${config.dotClass}`} />\n </span>\n )}\n {displayLabel}\n </span>\n )\n}\n","import React from 'react'\nimport { StatusBadge } from '../StatusBadge/StatusBadge'\nimport type { RobotStatus } from '../StatusBadge/StatusBadge'\n\nexport interface ConnectionIndicatorProps {\n connected: boolean\n rosDistro?: string | null\n size?: 'sm' | 'md' | 'lg'\n showLabel?: boolean\n showDistro?: boolean\n className?: string\n}\n\nconst sizeClasses = {\n sm: 'text-xs gap-1.5',\n md: 'text-sm gap-2',\n lg: 'text-base gap-2',\n}\n\nconst iconSizes = {\n sm: 'w-3.5 h-3.5',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n}\n\nexport function ConnectionIndicator({\n connected,\n rosDistro = null,\n size = 'md',\n showLabel = true,\n showDistro = true,\n className = '',\n}: ConnectionIndicatorProps) {\n const status: RobotStatus = connected ? 'online' : 'offline'\n\n return (\n <div className={`inline-flex items-center ${sizeClasses[size]} ${className}`}>\n <StatusBadge\n status={status}\n pulse={connected}\n size={size === 'lg' ? 'md' : 'sm'}\n label={showLabel ? (connected ? 'Connected' : 'Disconnected') : undefined}\n showDot={!showLabel}\n />\n {showDistro && connected && rosDistro && (\n <span className=\"text-ink-faint font-mono\">\n {rosDistro}\n </span>\n )}\n </div>\n )\n}\n\nexport function ConnectionIcon({ connected, size = 'md', className = '' }: {\n connected: boolean\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}) {\n return (\n <svg\n className={`${iconSizes[size]} ${connected ? 'text-status-online' : 'text-status-offline'} ${className}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {connected ? (\n <>\n <path d=\"M8.28 7.22a5.5 5.5 0 017.44 0M5.42 4.36a9.5 9.5 0 0113.16 0M12 17h.01M12 13a2 2 0 110 4 2 2 0 010-4z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </>\n ) : (\n <>\n <path d=\"M3 3l18 18M8.28 7.22a5.5 5.5 0 017.44 0M5.42 4.36a9.5 9.5 0 013.4-1.6M12 17h.01M12 13a2 2 0 110 4 2 2 0 010-4z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </>\n )}\n </svg>\n )\n}\n","import { useState, useCallback } from 'react'\n\nexport interface UseDisclosureReturn {\n isOpen: boolean\n open: () => void\n close: () => void\n toggle: () => void\n}\n\nexport function useDisclosure(initial = false): UseDisclosureReturn {\n const [isOpen, setIsOpen] = useState(initial)\n\n const open = useCallback(() => setIsOpen(true), [])\n const close = useCallback(() => setIsOpen(false), [])\n const toggle = useCallback(() => setIsOpen((v) => !v), [])\n\n return { isOpen, open, close, toggle }\n}\n","import { useState, useCallback } from 'react'\nimport type { ToastProps } from '../components/Toast/Toast'\n\nexport interface ToastEntry extends Omit<ToastProps, 'onClose'> {\n id: string\n}\n\nlet counter = 0\n\nexport function useToast() {\n const [toasts, setToasts] = useState<ToastEntry[]>([])\n\n const addToast = useCallback((props: Omit<ToastProps, 'onClose'>): string => {\n const id = `toast-${++counter}`\n setToasts((prev) => [...prev, { ...props, id }])\n return id\n }, [])\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n return { toasts, addToast, removeToast }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mywhy-ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React component library for the mywhy robotics framework — Tailwind design tokens, accessible components, and robotics-specific widgets",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"react",
|
|
9
|
+
"components",
|
|
10
|
+
"ui",
|
|
11
|
+
"robotics",
|
|
12
|
+
"ros2",
|
|
13
|
+
"tailwindcss",
|
|
14
|
+
"design-system",
|
|
15
|
+
"mywhy"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/mywhy/mywhy.git",
|
|
20
|
+
"directory": "mywhy_ui"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/mywhy/mywhy#readme",
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js",
|
|
30
|
+
"require": "./dist/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./tailwind-preset": "./tailwind-preset.js",
|
|
33
|
+
"./globals.css": "./src/globals.css"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"src/globals.css",
|
|
38
|
+
"tailwind-preset.js",
|
|
39
|
+
"README.md"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"type-check": "tsc --noEmit",
|
|
45
|
+
"prepublishOnly": "npm run build"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"react": ">=18.0.0",
|
|
49
|
+
"react-dom": ">=18.0.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/react": "^18.2.0",
|
|
53
|
+
"@types/react-dom": "^18.2.0",
|
|
54
|
+
"react": "^18.2.0",
|
|
55
|
+
"react-dom": "^18.2.0",
|
|
56
|
+
"tsup": "^8.0.0",
|
|
57
|
+
"typescript": "^5.3.0",
|
|
58
|
+
"tailwindcss": "^3.4.0",
|
|
59
|
+
"autoprefixer": "^10.4.0",
|
|
60
|
+
"postcss": "^8.4.0"
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/globals.css
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/* mywhy-ui global styles — CSS custom properties only.
|
|
2
|
+
* Your app must also import a CSS file with @tailwind directives.
|
|
3
|
+
* Import once in your app entry point (e.g. main.tsx):
|
|
4
|
+
* import 'mywhy-ui/globals.css'
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
/* Brand */
|
|
9
|
+
--mywhy-brand: #1A4B8C;
|
|
10
|
+
--mywhy-brand-dark: #153d72;
|
|
11
|
+
--mywhy-brand-light: #90b8e8;
|
|
12
|
+
--mywhy-brand-cyan: #00A8CC;
|
|
13
|
+
|
|
14
|
+
/* Ink (text) */
|
|
15
|
+
--mywhy-ink: #1A2A4A;
|
|
16
|
+
--mywhy-ink-gray: #374151;
|
|
17
|
+
--mywhy-ink-light: #64748B;
|
|
18
|
+
--mywhy-ink-faint: #94A3B8;
|
|
19
|
+
|
|
20
|
+
/* Surface (backgrounds) */
|
|
21
|
+
--mywhy-surface: #FFFFFF;
|
|
22
|
+
--mywhy-surface-gray: #F8FAFC;
|
|
23
|
+
--mywhy-surface-light: #F4F7FB;
|
|
24
|
+
--mywhy-surface-subtle: #FAFAFA;
|
|
25
|
+
--mywhy-surface-overlay: #F1F5F9;
|
|
26
|
+
|
|
27
|
+
/* Outline (borders) */
|
|
28
|
+
--mywhy-outline: #E2E8F0;
|
|
29
|
+
--mywhy-outline-light: #F1F5F9;
|
|
30
|
+
--mywhy-outline-strong: #CBD5E1;
|
|
31
|
+
|
|
32
|
+
/* Status */
|
|
33
|
+
--mywhy-status-online: #22C55E;
|
|
34
|
+
--mywhy-status-warning: #F59E0B;
|
|
35
|
+
--mywhy-status-error: #EF4444;
|
|
36
|
+
--mywhy-status-offline: #94A3B8;
|
|
37
|
+
--mywhy-status-info: #0EA5E9;
|
|
38
|
+
|
|
39
|
+
/* Role */
|
|
40
|
+
--mywhy-role-admin: #7C3AED;
|
|
41
|
+
--mywhy-role-operator: #0EA5E9;
|
|
42
|
+
--mywhy-role-viewer: #64748B;
|
|
43
|
+
|
|
44
|
+
/* Typography */
|
|
45
|
+
--mywhy-font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
46
|
+
--mywhy-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
47
|
+
|
|
48
|
+
/* Radius */
|
|
49
|
+
--mywhy-radius-sm: 4px;
|
|
50
|
+
--mywhy-radius-md: 6px;
|
|
51
|
+
--mywhy-radius-lg: 8px;
|
|
52
|
+
--mywhy-radius-xl: 10px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
*,
|
|
56
|
+
*::before,
|
|
57
|
+
*::after {
|
|
58
|
+
box-sizing: border-box;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
body {
|
|
62
|
+
font-family: var(--mywhy-font-sans);
|
|
63
|
+
font-size: 13px;
|
|
64
|
+
color: var(--mywhy-ink);
|
|
65
|
+
background: var(--mywhy-surface-light);
|
|
66
|
+
-webkit-font-smoothing: antialiased;
|
|
67
|
+
-moz-osx-font-smoothing: grayscale;
|
|
68
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
theme: {
|
|
4
|
+
extend: {
|
|
5
|
+
colors: {
|
|
6
|
+
// ── ink: text colors (matches frappe-ui naming) ───────────────
|
|
7
|
+
ink: {
|
|
8
|
+
DEFAULT: '#1A2A4A', // primary text
|
|
9
|
+
gray: '#374151', // secondary text
|
|
10
|
+
light: '#64748B', // muted / tertiary text
|
|
11
|
+
faint: '#94A3B8', // placeholder / disabled text
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
// ── surface: background colors ────────────────────────────────
|
|
15
|
+
surface: {
|
|
16
|
+
DEFAULT: '#FFFFFF', // card / modal backgrounds
|
|
17
|
+
gray: '#F8FAFC', // table header / subtle bg
|
|
18
|
+
light: '#F4F7FB', // page background (App.tsx shell)
|
|
19
|
+
subtle: '#FAFAFA', // input backgrounds
|
|
20
|
+
overlay: '#F1F5F9', // dividers / hover overlay
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
// ── brand: mywhy primary brand colors ─────────────────────────
|
|
24
|
+
brand: {
|
|
25
|
+
DEFAULT: '#1A4B8C', // primary brand blue
|
|
26
|
+
dark: '#153d72', // hover state
|
|
27
|
+
light: '#90b8e8', // muted brand / sidebar text
|
|
28
|
+
cyan: '#00A8CC', // accent cyan / active sidebar indicator
|
|
29
|
+
50: '#EFF6FF',
|
|
30
|
+
100: '#DBEAFE',
|
|
31
|
+
200: '#BFDBFE',
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
// ── outline: border / divider colors ─────────────────────────
|
|
35
|
+
outline: {
|
|
36
|
+
DEFAULT: '#E2E8F0', // standard borders
|
|
37
|
+
light: '#F1F5F9', // subtle row dividers
|
|
38
|
+
strong: '#CBD5E1', // stronger borders
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
// ── status: robotics connection / health states ───────────────
|
|
42
|
+
status: {
|
|
43
|
+
online: '#22C55E',
|
|
44
|
+
warning: '#F59E0B',
|
|
45
|
+
error: '#EF4444',
|
|
46
|
+
offline: '#94A3B8',
|
|
47
|
+
info: '#0EA5E9',
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
// ── role: user role colors (replaces ROLE_COLOR map) ─────────
|
|
51
|
+
role: {
|
|
52
|
+
admin: '#7C3AED',
|
|
53
|
+
operator: '#0EA5E9',
|
|
54
|
+
viewer: '#64748B',
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// ── semantic state surfaces ───────────────────────────────────
|
|
58
|
+
success: {
|
|
59
|
+
bg: '#F0FDF4',
|
|
60
|
+
border: '#86EFAC',
|
|
61
|
+
text: '#15803D',
|
|
62
|
+
icon: '#22C55E',
|
|
63
|
+
},
|
|
64
|
+
danger: {
|
|
65
|
+
bg: '#FEF2F2',
|
|
66
|
+
border: '#FECACA',
|
|
67
|
+
text: '#B91C1C',
|
|
68
|
+
icon: '#EF4444',
|
|
69
|
+
},
|
|
70
|
+
warning: {
|
|
71
|
+
bg: '#FFFBEB',
|
|
72
|
+
border: '#FCD34D',
|
|
73
|
+
text: '#92400E',
|
|
74
|
+
icon: '#F59E0B',
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// ── ros: ROS message type accent colors ───────────────────────
|
|
78
|
+
ros: {
|
|
79
|
+
topic: '#1A4B8C',
|
|
80
|
+
service: '#7C3AED',
|
|
81
|
+
action: '#0EA5E9',
|
|
82
|
+
parameter: '#059669',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
borderRadius: {
|
|
87
|
+
sm: '4px',
|
|
88
|
+
md: '6px',
|
|
89
|
+
lg: '8px',
|
|
90
|
+
xl: '10px',
|
|
91
|
+
'2xl': '12px',
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
boxShadow: {
|
|
95
|
+
card: '0 1px 3px rgba(0,0,0,0.06)',
|
|
96
|
+
'card-hover': '0 4px 12px rgba(0,0,0,0.10)',
|
|
97
|
+
dialog: '0 8px 32px rgba(0,0,0,0.15)',
|
|
98
|
+
toast: '0 2px 8px rgba(0,0,0,0.10)',
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
fontSize: {
|
|
102
|
+
'2xs': ['10px', { lineHeight: '14px' }],
|
|
103
|
+
xs: ['11px', { lineHeight: '16px' }],
|
|
104
|
+
sm: ['12px', { lineHeight: '18px' }],
|
|
105
|
+
base: ['13px', { lineHeight: '20px' }],
|
|
106
|
+
md: ['14px', { lineHeight: '22px' }],
|
|
107
|
+
lg: ['15px', { lineHeight: '24px' }],
|
|
108
|
+
xl: ['18px', { lineHeight: '28px' }],
|
|
109
|
+
'2xl': ['20px', { lineHeight: '30px' }],
|
|
110
|
+
'3xl': ['22px', { lineHeight: '32px' }],
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
fontFamily: {
|
|
114
|
+
sans: ['-apple-system', 'BlinkMacSystemFont', "'Segoe UI'", 'Roboto', 'sans-serif'],
|
|
115
|
+
mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
}
|