@newtonedev/configurator 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/dist/Configurator.d.ts +13 -0
- package/dist/Configurator.d.ts.map +1 -0
- package/dist/Configurator.types.d.ts +13 -0
- package/dist/Configurator.types.d.ts.map +1 -0
- package/dist/bridge/toCSS.d.ts +7 -0
- package/dist/bridge/toCSS.d.ts.map +1 -0
- package/dist/bridge/toJSON.d.ts +15 -0
- package/dist/bridge/toJSON.d.ts.map +1 -0
- package/dist/bridge/toThemeConfig.d.ts +8 -0
- package/dist/bridge/toThemeConfig.d.ts.map +1 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/hooks/useConfigurator.d.ts +11 -0
- package/dist/hooks/useConfigurator.d.ts.map +1 -0
- package/dist/hooks/usePreviewColors.d.ts +8 -0
- package/dist/hooks/usePreviewColors.d.ts.map +1 -0
- package/dist/hue-conversion.d.ts +10 -0
- package/dist/hue-conversion.d.ts.map +1 -0
- package/dist/index.cjs +827 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +814 -0
- package/dist/index.js.map +1 -0
- package/dist/panels/CanvasPanel.d.ts +8 -0
- package/dist/panels/CanvasPanel.d.ts.map +1 -0
- package/dist/panels/ExportPanel.d.ts +8 -0
- package/dist/panels/ExportPanel.d.ts.map +1 -0
- package/dist/panels/GlobalPanel.d.ts +10 -0
- package/dist/panels/GlobalPanel.d.ts.map +1 -0
- package/dist/panels/PalettePanel.d.ts +13 -0
- package/dist/panels/PalettePanel.d.ts.map +1 -0
- package/dist/panels/PreviewPanel.d.ts +12 -0
- package/dist/panels/PreviewPanel.d.ts.map +1 -0
- package/dist/state/actions.d.ts +62 -0
- package/dist/state/actions.d.ts.map +1 -0
- package/dist/state/defaults.d.ts +9 -0
- package/dist/state/defaults.d.ts.map +1 -0
- package/dist/state/reducer.d.ts +4 -0
- package/dist/state/reducer.d.ts.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +56 -0
- package/src/Configurator.tsx +177 -0
- package/src/Configurator.types.ts +13 -0
- package/src/bridge/toCSS.ts +43 -0
- package/src/bridge/toJSON.ts +24 -0
- package/src/bridge/toThemeConfig.ts +58 -0
- package/src/constants.ts +16 -0
- package/src/hooks/useConfigurator.ts +30 -0
- package/src/hooks/usePreviewColors.ts +40 -0
- package/src/hue-conversion.ts +25 -0
- package/src/index.ts +24 -0
- package/src/panels/CanvasPanel.tsx +90 -0
- package/src/panels/ExportPanel.tsx +95 -0
- package/src/panels/GlobalPanel.tsx +126 -0
- package/src/panels/PalettePanel.tsx +145 -0
- package/src/panels/PreviewPanel.tsx +124 -0
- package/src/state/actions.ts +27 -0
- package/src/state/defaults.ts +74 -0
- package/src/state/reducer.ts +163 -0
- package/src/types.ts +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state/defaults.ts","../src/state/reducer.ts","../src/hue-conversion.ts","../src/bridge/toThemeConfig.ts","../src/hooks/useConfigurator.ts","../src/hooks/usePreviewColors.ts","../src/constants.ts","../src/panels/PalettePanel.tsx","../src/panels/GlobalPanel.tsx","../src/panels/PreviewPanel.tsx","../src/bridge/toCSS.ts","../src/bridge/toJSON.ts","../src/panels/ExportPanel.tsx","../src/Configurator.tsx"],"names":["useMemo","React","STRENGTH_OPTIONS","useTokens","Card","styles","Text","srgbToHex","View","Slider","Select","HueSlider","StyleSheet","useCallback","Button","useState","Toggle"],"mappings":";;;;;;;;AAQO,IAAM,0BAAA,GAAgD;AAAA,EAC3D,QAAA,EAAU;AAAA,IACR;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,GAAA;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,qBAAA,EAAuB,OAAA;AAAA,MACvB,gBAAA,EAAkB,MAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,GAAA,EAAK,EAAA;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,qBAAA,EAAuB,OAAA;AAAA,MACvB,gBAAA,EAAkB,MAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,GAAA;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,qBAAA,EAAuB,OAAA;AAAA,MACvB,gBAAA,EAAkB,MAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,EAAA;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,qBAAA,EAAuB,OAAA;AAAA,MACvB,gBAAA,EAAkB,MAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,qBAAA,EAAuB,OAAA;AAAA,MACvB,gBAAA,EAAkB,MAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,iBAAA,EAAmB;AAAA;AACrB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,EAAA,EAAG;AAAA,IACnC,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,GAAA;AAAI,GACrC;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX;;;ACrEA,SAAS,aAAA,CACP,QAAA,EACA,KAAA,EACA,MAAA,EACyB;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,QAAA,CAAS,QAAQ,OAAO,QAAA;AAClD,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAG,GAAG,MAAA,KAAW,CAAE,CAAA;AACvE;AAEA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AAC9D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAEA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,OAAA,CAAS,GAAA,GAAM,MAAO,GAAA,IAAO,GAAA;AAC/B;AAEO,SAAS,mBAAA,CACd,OACA,MAAA,EACmB;AACnB,EAAA,QAAQ,OAAO,IAAA;AAAM;AAAA,IAEnB,KAAK,iBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,GAAG;AAAA,SACxB;AAAA,OACH;AAAA,IAEF,KAAK,wBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,UAAA,EAAY,GAAG,GAAG;AAAA,SAC5C;AAAA,OACH;AAAA,IAEF,KAAK,4BAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,sBAAsB,MAAA,CAAO;AAAA,SAC9B;AAAA,OACH;AAAA,IAEF,KAAK,6BAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,uBAAuB,MAAA,CAAO;AAAA,SAC/B;AAAA,OACH;AAAA,IAEF,KAAK,gCAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,kBAAkB,MAAA,CAAO;AAAA,SAC1B;AAAA,OACH;AAAA,IAEF,KAAK,2BAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,WAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,GAAG;AAAA,SAChC;AAAA,OACH;AAAA,IAEF,KAAK,iCAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,EAAO;AAAA,UACpD,mBAAmB,MAAA,CAAO;AAAA,SAC3B;AAAA,OACH;AAAA;AAAA,IAGF,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,YAAA,EAAc;AAAA,UACZ,GAAG,KAAA,CAAM,YAAA;AAAA,UACT,QAAA,EAAU,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,GAAG,CAAC;AAAA;AACpC,OACF;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,YAAA,EAAc;AAAA,UACZ,GAAG,KAAA,CAAM,YAAA;AAAA,UACT,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,GAAG,CAAC;AAAA;AACnC,OACF;AAAA;AAAA,IAGF,KAAK,iCAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,gBAAA,EAAkB;AAAA,UAChB,GAAG,KAAA,CAAM,gBAAA;AAAA,UACT,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,iBAAiB,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA;AAAS;AACtE,OACF;AAAA,IAEF,KAAK,4BAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,gBAAA,EAAkB;AAAA,UAChB,GAAG,KAAA,CAAM,gBAAA;AAAA,UACT,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,gBAAA,CAAiB,OAAO,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAE;AACrE,OACF;AAAA,IAEF,KAAK,gCAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,gBAAA,EAAkB;AAAA,UAChB,GAAG,KAAA,CAAM,gBAAA;AAAA,UACT,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,iBAAiB,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA;AAAS;AACpE,OACF;AAAA,IAEF,KAAK,2BAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,gBAAA,EAAkB;AAAA,UAChB,GAAG,KAAA,CAAM,gBAAA;AAAA,UACT,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,gBAAA,CAAiB,MAAM,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAE;AACnE,OACF;AAAA;AAAA,IAGF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,EAAM,OAAO,IAAA;AAAK,OACjD;AAAA,IAEF,KAAK,mBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,OAAA,EAAS,KAAA,EAAO,OAAO,KAAA;AAAM,OACnD;AAAA;AAAA,IAGF,KAAK,OAAA;AACH,MAAA,OAAO,0BAAA;AAAA,IAET,KAAK,YAAA;AACH,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IAEhB;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;ACvJO,SAAS,sBAAsB,GAAA,EAAqB;AACzD,EAAA,MAAM,CAAA,GAAA,CAAM,GAAA,GAAM,GAAA,GAAO,GAAA,IAAO,GAAA;AAChC,EAAA,MAAM,IAAI,CAAA,GAAI,IAAA,CAAK,IAAK,CAAA,GAAI,EAAA,GAAM,IAAI,CAAC,CAAA;AAEvC,EAAA,IAAI,GAAW,CAAA,EAAW,CAAA;AAC1B,EAAA,IAAI,IAAI,EAAA,EAAU;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MACvB;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG;AAEzC,EAAA,OAAO,YAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAW,CAAA,CAAE,CAAA;AAC1C;;;ACfO,SAAS,cAAc,KAAA,EAA8C;AAC1E,EAAA,MAAM,QAAA,GAAqC,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK;AACjE,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,CAAA,CAAE,GAAG,CAAA;AAE5C,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,oBAAA,KAAyB,MAAA,GAC5C,EAAE,SAAA,EAAW,CAAA,CAAE,qBAAA,EAAuB,QAAA,EAAU,CAAA,CAAE,oBAAA,EAAqB,GACvE,MAAA;AAEJ,IAAA,MAAM,iBAAA,GAAoB,CAAA,CAAE,gBAAA,KAAqB,MAAA,GAC7C;AAAA,MACE,GAAA,EAAK,qBAAA,CAAsB,CAAA,CAAE,WAAW,CAAA;AAAA,MACxC,UAAU,CAAA,CAAE,gBAAA;AAAA,MACZ,WAAW,CAAA,CAAE;AAAA,KACf,GACA,MAAA;AAEJ,IAAA,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,YAAY,CAAA,CAAE,UAAA,EAAY,cAAc,iBAAA,EAAkB;AAAA,EACpF,CAAC,CAAA;AAGD,EAAA,MAAM,QAAwC,KAAA,CAAM,gBAAA,CAAiB,MAAM,QAAA,KAAa,MAAA,GACpF,EAAE,GAAA,EAAK,qBAAA,CAAsB,MAAM,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,EAAG,QAAA,EAAU,MAAM,gBAAA,CAAiB,KAAA,CAAM,UAAS,GAChH,MAAA;AAEJ,EAAA,MAAM,OAAuC,KAAA,CAAM,gBAAA,CAAiB,KAAK,QAAA,KAAa,MAAA,GAClF,EAAE,GAAA,EAAK,qBAAA,CAAsB,MAAM,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAA,EAAG,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAA,CAAK,UAAS,GAC9G,MAAA;AAEJ,EAAA,MAAM,aAAsC,KAAA,IAAS,IAAA,GAAQ,EAAE,KAAA,EAAO,MAAK,GAAI,MAAA;AAE/E,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,QAAA,EAAU,MAAM,YAAA,CAAa,QAAA;AAAA,IAC7B,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA;AAAA,IAC5B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC,GACrC;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,EAAE,YAAA,EAAc,QAAA,EAAS;AAAA,IACtC,MAAA,EAAQ;AAAA,MACN,SAAW,EAAE,YAAA,EAAc,GAAG,WAAA,EAAa,IAAA,EAAM,YAAY,GAAA,EAAI;AAAA,MACjE,SAAW,EAAE,YAAA,EAAc,GAAG,WAAA,EAAa,IAAA,EAAM,YAAY,GAAA,EAAI;AAAA,MACjE,WAAW,EAAE,YAAA,EAAc,GAAG,WAAA,EAAa,IAAA,EAAM,YAAY,IAAA,EAAK;AAAA,MAClE,QAAW,EAAE,YAAA,EAAc,GAAG,WAAA,EAAa,GAAA,EAAK,YAAY,IAAA;AAAK,KACnE;AAAA,IACA,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,CAAC,KAAA,EAAO,CAAA,EAAG,IAAI;AAAA;AAC1B,GACF;AACF;;;AC1CO,SAAS,gBACd,YAAA,EACuB;AACvB,EAAA,MAAM,gBAAmC,YAAA,GACrC,EAAE,GAAG,0BAAA,EAA4B,GAAG,cAAa,GACjD,0BAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,UAAA,CAAW,qBAAqB,aAAa,CAAA;AAEvE,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAE/D,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAM,QAAA,CAAS,EAAE,MAAM,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA;AAE/D,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM;AAC/C;ACvBA,IAAM,aAAA,GAAgB,EAAA;AAMf,SAAS,iBAAiB,KAAA,EAA+D;AAC9F,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,MAAM,QAAQ,KAAA,CAAM,gBAAA,CAAiB,MAAM,QAAA,KAAa,MAAA,GACpD,EAAE,GAAA,EAAK,qBAAA,CAAsB,MAAM,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,EAAG,QAAA,EAAU,MAAM,gBAAA,CAAiB,KAAA,CAAM,UAAS,GAChH,MAAA;AACJ,IAAA,MAAM,OAAO,KAAA,CAAM,gBAAA,CAAiB,KAAK,QAAA,KAAa,MAAA,GAClD,EAAE,GAAA,EAAK,qBAAA,CAAsB,MAAM,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAA,EAAG,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAA,CAAK,UAAS,GAC9G,MAAA;AACJ,IAAA,MAAM,aAAc,KAAA,IAAS,IAAA,GAAQ,EAAE,KAAA,EAAO,MAAK,GAAI,MAAA;AAEvD,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,QAAA,EAAU,MAAM,YAAA,CAAa,QAAA;AAAA,MAC7B,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA;AAAA,MAC5B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC,KACrC;AAEA,IAAA,OAAO,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK;AAC7B,MAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,CAAA,CAAE,GAAG,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,oBAAA,KAAyB,MAAA,GACrC,EAAE,SAAA,EAAW,CAAA,CAAE,qBAAA,EAAuB,QAAA,EAAU,CAAA,CAAE,oBAAA,EAAqB,GACvE,MAAA;AACJ,MAAA,MAAM,MAAM,CAAA,CAAE,gBAAA,KAAqB,MAAA,GAC/B,EAAE,KAAK,qBAAA,CAAsB,CAAA,CAAE,WAAW,CAAA,EAAG,UAAU,CAAA,CAAE,gBAAA,EAAkB,SAAA,EAAW,CAAA,CAAE,mBAAkB,GAC1G,MAAA;AACJ,MAAA,OAAO,gBAAgB,QAAA,EAAU,CAAA,CAAE,YAAY,YAAA,EAAc,aAAA,EAAe,OAAO,GAAG,CAAA;AAAA,IACxF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACZ;;;AC5BO,IAAM,mBAAA,GAAgG;AAAA,EAC3G,CAAA,EAAG,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA;AAAA,EACvB,CAAA,EAAG,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAG;AAAA;AAAA,EACtB,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA;AAAI;AAC1B,CAAA;;;ACLA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AASO,SAAS,aAAa,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,eAAc,EAAsB;AAC3F,EAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,oBAAoB,KAAK,CAAA;AAE1C,EAAA,uBACEC,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,CAAA,EAAG,OAAO,MAAA,CAAO,SAAA,EAAA,kBAChCA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,OAAO,CAAC,MAAA,CAAO,KAAA,EAAO,EAAE,OAAO,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,GAAG,CAAA,EAAA,EACtE,OAAA,CAAQ,IACX,GAEC,aAAA,oBACCA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,OAAO,cAAA,EAAA,EACjB,aAAA,CAAc,GAAA,CAAI,CAAC,OAAO,CAAA,qBACzBA,MAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAA;AAAA,MACL,KAAA,EAAO,CAAC,MAAA,CAAO,YAAA,EAAc,EAAE,iBAAiB,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AAAA;AAAA,GAE1E,CACH,CAAA,kBAGFA,MAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAO,OAAA,CAAQ,GAAA;AAAA,MACf,aAAA,EAAe,CAAC,GAAA,KAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,MACxE,KAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAS,IAAA;AAAA,MACR,GAAI,QAAA,GAAW,EAAE,GAAA,EAAK,QAAA,CAAS,KAAK,GAAA,EAAK,QAAA,CAAS,GAAA,EAAI,GAAI;AAAC;AAAA,GAC9D,kBAEAA,MAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAO,OAAA,CAAQ,UAAA;AAAA,MACf,aAAA,EAAe,CAAC,UAAA,KAAe,QAAA,CAAS,EAAE,IAAA,EAAM,wBAAA,EAA0B,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,MAC7F,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,KAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GACX,kBAEAA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,uBAClBA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,IAAA,EAAA,kBAClBA,MAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,gBAAA;AAAA,MACT,OAAO,OAAA,CAAQ,oBAAA;AAAA,MACf,aAAA,EAAe,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,4BAAA,EAA8B,KAAA,EAAO,QAAA,EAA4C,CAAA;AAAA,MAC/H,KAAA,EAAM;AAAA;AAAA,GAEV,GACC,OAAA,CAAQ,oBAAA,KAAyB,0BAChCA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,eAAA,EAAA,kBAClBA,MAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,QAAQ,qBAAA,KAA0B,MAAA;AAAA,MACzC,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,6BAAA,EAA+B,KAAA,EAAO,SAAA,EAAW,CAAA,GAAI,MAAA,GAAS,OAAA,EAAS,CAAA;AAAA,MAC9G,KAAA,EAAM;AAAA;AAAA,GAEV,CAEJ,CAAA,kBAEAA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,GAAA,EAAA,kBAClBA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,IAAA,EAAA,kBAClBA,MAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,gBAAA;AAAA,MACT,OAAO,OAAA,CAAQ,gBAAA;AAAA,MACf,aAAA,EAAe,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,gCAAA,EAAkC,KAAA,EAAO,QAAA,EAA0C,CAAA;AAAA,MACjI,KAAA,EAAM;AAAA;AAAA,GAEV,GACC,OAAA,CAAQ,gBAAA,KAAqB,0BAC5BA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,eAAA,EAAA,kBAClBA,MAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,QAAQ,iBAAA,KAAsB,MAAA;AAAA,MACrC,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,iCAAA,EAAmC,KAAA,EAAO,SAAA,EAAW,CAAA,GAAI,MAAA,GAAS,OAAA,EAAS,CAAA;AAAA,MAClH,KAAA,EAAM;AAAA;AAAA,GAEV,CAEJ,CAAA,EAEC,OAAA,CAAQ,qBAAqB,MAAA,oBAC5BA,MAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAO,OAAA,CAAQ,WAAA;AAAA,MACf,aAAA,EAAe,CAAC,GAAA,KAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,2BAAA,EAA6B,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,MAClF,KAAA,EAAM,cAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GAGf,CAAA;AAEJ;AAEA,IAAM,MAAA,GAAS,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,GAAA,EAAK,EAAA;AAAA,IACL,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,aAAA,EAAe,KAAA;AAAA,IACf,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK;AAAA,GACP;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,UAAA;AAAA,IACZ,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,aAAA,EAAe;AAAA;AAEnB,CAAC,CAAA;ACxID,IAAMC,iBAAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAC1B,CAAA;AAOO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,QAAA,EAAS,EAAqB;AACjE,EAAA,MAAM,MAAA,GAASC,UAAU,CAAC,CAAA;AAE1B,EAAA,uBACEF,OAAA,aAAA,CAACG,IAAAA,EAAA,EAAK,SAAA,EAAW,CAAA,EAAG,OAAOC,OAAAA,CAAO,SAAA,EAAA,kBAChCJ,MAAAA,CAAA,aAAA,CAACK,MAAA,EAAK,KAAA,EAAO,CAACD,OAAAA,CAAO,KAAA,EAAO,EAAE,KAAA,EAAOE,SAAAA,CAAU,MAAA,CAAO,YAAY,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,eAE5E,mBAEAN,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,QAAO,GAAA,EAAA,kBAClBJ,OAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACQ,MAAAA;AAAA,IAAA;AAAA,MACC,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,MACnD,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,MAAM,cAAA,EAAgB,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA;AAAA,MACvE,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,KAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GAEb,CAAA,kBACAR,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACQ,MAAAA;AAAA,IAAA;AAAA,MACC,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,UAAU,GAAG,CAAA;AAAA,MAClD,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,MAAM,aAAA,EAAe,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA;AAAA,MACtE,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,KAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GAEb,CACF,CAAA,kBAEAR,MAAAA,CAAA,aAAA,CAACK,MAAA,EAAK,KAAA,EAAO,CAACD,OAAAA,CAAO,UAAU,EAAE,KAAA,EAAOE,UAAU,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,qCAEjF,mBAEAN,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,GAAA,EAAA,kBAClBJ,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACS,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAASR,iBAAAA;AAAA,MACT,KAAA,EAAO,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,QAAA;AAAA,MACpC,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,iCAAA,EAAmC,QAAA,EAAU,CAAA,EAAyB,CAAA;AAAA,MAC7G,KAAA,EAAM;AAAA;AAAA,GAEV,CAAA,EACC,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,aAAa,MAAA,oBACzCD,MAAAA,CAAA,aAAA,CAACO,MAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACU,SAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,GAAA;AAAA,MACpC,aAAA,EAAe,CAAC,GAAA,KAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,4BAAA,EAA8B,KAAK,CAAA;AAAA,MAC5E,KAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GAEb,CAEJ,CAAA,kBAEAV,MAAAA,CAAA,aAAA,CAACK,MAAA,EAAK,KAAA,EAAO,CAACD,OAAAA,CAAO,UAAU,EAAE,KAAA,EAAOE,UAAU,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,oCAEjF,mBAEAN,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,GAAA,EAAA,kBAClBJ,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACS,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAASR,iBAAAA;AAAA,MACT,KAAA,EAAO,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,QAAA;AAAA,MACnC,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,gCAAA,EAAkC,QAAA,EAAU,CAAA,EAAyB,CAAA;AAAA,MAC5G,KAAA,EAAM;AAAA;AAAA,GAEV,CAAA,EACC,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,aAAa,MAAA,oBACxCD,MAAAA,CAAA,aAAA,CAACO,MAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACU,SAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,GAAA;AAAA,MACnC,aAAA,EAAe,CAAC,GAAA,KAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,2BAAA,EAA6B,KAAK,CAAA;AAAA,MAC3E,KAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAS;AAAA;AAAA,GAEb,CAEJ,CACF,CAAA;AAEJ;AAEA,IAAMN,OAAAA,GAASO,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AC9GD,IAAM,aAAA,GAAgB;AAAA,EACpB,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAC5B,CAAA;AASA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,MAAA,GAAST,UAAU,CAAC,CAAA;AAE1B,EAAA,uBACEF,MAAAA,CAAA,aAAA,CAACG,IAAAA,EAAA,EAAK,WAAW,CAAA,EAAG,KAAA,EAAOC,OAAAA,CAAO,SAAA,EAAA,kBAChCJ,MAAAA,CAAA,aAAA,CAACK,MAAA,EAAK,KAAA,EAAO,CAACD,OAAAA,CAAO,KAAA,EAAO,EAAE,KAAA,EAAOE,UAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,KAAG,mBAE5E,CAAA,kBAEAN,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,QAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACS,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,MACrB,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,CAAA,EAAgB,CAAA;AAAA,MACnF,KAAA,EAAM;AAAA;AAAA,GAEV,CAAA,kBAEAT,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,aAAA,CAAc,OAAA,EAAA,kBACzBP,MAAAA,CAAA,aAAA,CAACO,MAAA,EAAK,KAAA,EAAO,aAAA,CAAc,GAAA,EAAA,kBACzBP,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAA,EAAK,SAAO,CAAA,kBAC3CA,MAAAA,CAAA,aAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,IAAA,EAAA,EAAK,WAAS,CAAA,kBAC/CA,MAAAA,CAAA,cAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAA,EAAK,OAAK,CAAA,kBACvCA,OAAA,aAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAA,EAAK,SAAO,CAC7C,mBAEAA,MAAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAM,cAAA,EAAe,KAAA,EAAM,gBAAA,EAAiB,cAAc,MAAM;AAAA,EAAC,CAAA,EAAG,CAAA,kBAE/EA,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,aAAA,CAAc,GAAA,EAAA,kBACzBP,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,SAAA,EAAW,EAAE,eAAA,EAAiBD,SAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAA,EAAG,mBAC7FN,MAAAA,CAAA,aAAA,CAACK,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,UAAA,EAAY,EAAE,KAAA,EAAOC,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,SAAO,CAAA,kBAC/FN,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,SAAA,EAAW,EAAE,eAAA,EAAiBD,SAAAA,CAAU,OAAO,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,kBAC7FN,MAAAA,CAAA,aAAA,CAACK,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,UAAA,EAAY,EAAE,KAAA,EAAOC,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,SAAO,CAAA,kBAC/FN,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,SAAA,EAAW,EAAE,eAAA,EAAiBD,SAAAA,CAAU,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,kBAC3FN,MAAAA,CAAA,aAAA,CAACK,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,aAAA,CAAc,UAAA,EAAY,EAAE,KAAA,EAAOC,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA,EAAA,EAAG,OAAK,CAC/F,CACF,CACF,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,QAAA,EAAU,aAAY,EAAsB;AAChF,EAAA,uBACEN,MAAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,KAAK,CAAA,CAAA;AAAA,MACjD,MAAA,EAAQ,WAAA;AAAA,MACR,WAAA,EAAa,MAAM,OAAA,CAAQ,IAAA;AAAA,MAC3B,YAAA,EAAc,MAAM,OAAA,CAAQ;AAAA,KAAA;AAAA,oBAE5BA,MAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,OAAc,QAAA,EAAoB;AAAA,GACjD;AAEJ;AAEA,IAAMI,OAAAA,GAASO,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,QAAA,EAAU;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,UAAA;AAAA,IACZ,GAAA,EAAK;AAAA;AAET,CAAC,CAAA;AAED,IAAM,aAAA,GAAgBA,WAAW,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAAA,EACA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,WAAA,EAAa;AAAA;AAEjB,CAAC,CAAA;ACjHM,SAAS,MAAM,KAAA,EAAkC;AACtD,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,MAAM,KAAA,GAA8B,CAAC,OAAA,EAAS,MAAM,CAAA;AAEpD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,aAAA;AAAA,MACb,MAAA,CAAO,WAAA;AAAA,MACP,IAAA;AAAA,MACA,OAAO,MAAA,CAAO,OAAA;AAAA,MACd,CAAA;AAAA,MACA,OAAO,SAAA,CAAU;AAAA,KACnB;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU,qBAAA;AAC9C,IAAA,GAAA,IAAO,GAAG,QAAQ,CAAA;AAAA,CAAA;AAClB,IAAA,GAAA,IAAO,CAAA,wBAAA,EAA2BL,SAAAA,CAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,CAAA;AACnE,IAAA,GAAA,IAAO,CAAA,iCAAA,EAAoCA,SAAAA,CAAU,MAAA,CAAO,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,CAAA;AACpF,IAAA,GAAA,IAAO,CAAA,+BAAA,EAAkCA,SAAAA,CAAU,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,CAAA;AAChF,IAAA,GAAA,IAAO,CAAA,0BAAA,EAA6BA,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,CAAA;AACtE,IAAA,GAAA,IAAO,CAAA,4BAAA,EAA+BA,SAAAA,CAAU,MAAA,CAAO,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,CAAA;AAC1E,IAAA,GAAA,IAAO,CAAA,yBAAA,EAA4BA,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,CAAA;AACrE,IAAA,GAAA,IAAO,CAAA,+BAAA,EAAkCA,SAAAA,CAAU,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,CAAA;AAChF,IAAA,GAAA,IAAO,CAAA,gCAAA,EAAmCA,SAAAA,CAAU,MAAA,CAAO,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,CAAA;AAClF,IAAA,GAAA,IAAO,CAAA,oBAAA,EAAuBA,SAAAA,CAAU,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,CAAA;AAC3D,IAAA,GAAA,IAAO,CAAA,qBAAA,EAAwBA,SAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,CAAA;AAC7D,IAAA,GAAA,IAAO,CAAA,qBAAA,EAAwBA,SAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,CAAA;AAC7D,IAAA,GAAA,IAAO,CAAA,mBAAA,EAAsBA,SAAAA,CAAU,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,CAAA;AACzD,IAAA,GAAA,IAAO,CAAA;;AAAA,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA;AACT;;;AC1BO,SAAS,OAAO,KAAA,EAAkC;AACvD,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,OAAA,EAAS,KAAA;AAAA,IACT,iBAAA,EAAmB,KAAA;AAAA,IACnB,WAAA,EAAa,cAAc,KAAK;AAAA,GAClC;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AACvC;;;ACTO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAM,EAAqB;AACvD,EAAA,MAAM,MAAA,GAASJ,UAAU,CAAC,CAAA;AAC1B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAuB,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,MAAA,GAASH,QAAQ,MAAM;AAC3B,IAAA,OAAO,WAAW,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,MAAM,UAAA,GAAaa,YAAY,MAAM;AACnC,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,SAAA,EAAW;AAC3D,MAAA,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA,CAAE,KAAK,MAAM;AAC/C,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACEZ,MAAAA,CAAA,aAAA,CAACG,IAAAA,EAAA,EAAK,WAAW,CAAA,EAAG,KAAA,EAAOC,OAAAA,CAAO,SAAA,EAAA,kBAChCJ,MAAAA,CAAA,aAAA,CAACK,MAAA,EAAK,KAAA,EAAO,CAACD,OAAAA,CAAO,KAAA,EAAO,EAAE,KAAA,EAAOE,UAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,KAAG,QAE5E,CAAA,kBAEAN,MAAAA,CAAA,cAACO,IAAAA,EAAA,EAAK,OAAOH,OAAAA,CAAO,IAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACa,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA,KAAW,KAAA,GAAQ,SAAA,GAAY,OAAA;AAAA,MACxC,IAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK;AAAA,KAAA;AAAA,IAC/B;AAAA,GAED,kBACAb,MAAAA,CAAA,aAAA;AAAA,IAACa,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA,KAAW,MAAA,GAAS,SAAA,GAAY,OAAA;AAAA,MACzC,IAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM;AAAA,KAAA;AAAA,IAChC;AAAA,qBAGDb,MAAAA,CAAA,aAAA,CAACa,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,SAAS,UAAA,EAAA,EAC1C,MAAA,GAAS,SAAA,GAAY,MACxB,CACF,CAAA,kBAEAb,MAAAA,CAAA,aAAA,CAACO,MAAA,EAAK,KAAA,EAAO,CAACH,OAAAA,CAAO,WAAW,EAAE,eAAA,EAAiBE,SAAAA,CAAU,MAAA,CAAO,iBAAiB,IAAI,CAAA,EAAG,CAAA,EAAA,kBAC1FN,MAAAA,CAAA,aAAA;AAAA,IAACK,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAACD,OAAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAOE,SAAAA,CAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAAA,MAClE,UAAA,EAAU;AAAA,KAAA;AAAA,IAET;AAAA,GAEL,CACF,CAAA;AAEJ;AAEA,IAAMF,OAAAA,GAASO,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,GAAA,EAAK,EAAA;AAAA,IACL,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK;AAAA,GACP;AAAA,EACA,SAAA,EAAW;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,EAAA;AAAA,IACT,SAAA,EAAW,GAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,UAAA,EAAY;AAAA;AAEhB,CAAC,CAAA;;;ACzEM,SAAS,YAAA,CAAa;AAAA,EAC3B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,WAAA,GAAc;AAChB,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,aAAa,KAAA,EAAM,GAAI,gBAAgB,YAAY,CAAA;AAC5E,EAAA,MAAM,MAAA,GAAST,UAAU,CAAC,CAAA;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,eAAA,EAAgB;AACpC,EAAA,MAAM,eAAA,GAAkB,OAAO,IAAI,CAAA;AACnC,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIY,SAAS,CAAC,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAGvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAE5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEjC,EAAA,uBACEd,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,CAACH,OAAAA,CAAO,SAAA,EAAW,EAAE,eAAA,EAAiBE,SAAAA,CAAU,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,EAAG,CAAA,EAAA,kBAE1FN,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,MAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA;AAAA,IAACe,MAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,MAAA;AAAA,MAC9B,aAAA,EAAe,CAAC,MAAA,KAAW;AACzB,QAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,OAAA;AAC/B,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA;AAAA,MACA,KAAA,EAAM;AAAA;AAAA,GAEV,CAAA,kBAGAf,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,MAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,WAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,QAAA,EAAoB,CACjD,CAAA,EACC,WAAA,oBACCA,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,WAAA,EAAA,kBAClBJ,MAAAA,CAAA,aAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,QAAA,EAAoB,WAAA,EAA0B,CAC5E,CAEJ,CAAA,kBAGAA,MAAAA,CAAA,aAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAOH,OAAAA,CAAO,MAAA,EAAA,EACjB,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,qBAC5BJ,MAAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC1C,KAAA,EAAO;AAAA,QACLI,OAAAA,CAAO,GAAA;AAAA,QACP;AAAA,UACE,iBAAiB,KAAA,KAAU,kBAAA,GACvBE,UAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,GAChC,aAAA;AAAA,UACJ,aAAa,KAAA,KAAU,kBAAA,GACnBA,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAC5B;AAAA;AACN;AACF,KAAA;AAAA,oBAEAN,MAAAA,CAAA,aAAA,CAACK,IAAAA,EAAA,EAAK,KAAA,EAAO;AAAA,MACXD,OAAAA,CAAO,OAAA;AAAA,MACP;AAAA,QACE,KAAA,EAAOE,SAAAA;AAAA,UACL,UAAU,kBAAA,GACN,MAAA,CAAO,WAAA,CAAY,IAAA,GACnB,OAAO,aAAA,CAAc;AAAA,SAC3B;AAAA,QACA,UAAA,EAAY,KAAA,KAAU,kBAAA,GAAqB,KAAA,GAAQ;AAAA;AACrD,KACF,EAAA,EACG,QAAQ,IACX;AAAA,GAEH,CACH,CAAA,kBAGAN,MAAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,kBAAkB,CAAA;AAAA,MAC1C,KAAA,EAAO,kBAAA;AAAA,MACP,QAAA;AAAA,MACA,aAAA,EAAe,SAAS,kBAAkB;AAAA;AAAA,GAC5C,EAEC,8BAAcA,MAAAA,CAAA,cAAC,WAAA,EAAA,EAAY,KAAA,EAAc,CAAA,kBAG1CA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,KAAA,EAAM;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,QACX,OAAA,EAAS,UAAA;AAAA,QACT,eAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,mBAAA;AAAA,QACR,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,GAAA;AAAA,QACZ,QAAA,EAAU,EAAA;AAAA,QACV,MAAA,EAAQ;AAAA;AACV,KAAA;AAAA,IACD;AAAA,GAGH,CAAA;AAEJ;AAEA,IAAMI,OAAAA,GAASO,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,EAAA;AAAA,IACT,GAAA,EAAK;AAAA,GACP;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,UAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK,CAAA;AAAA,IACL,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK,CAAA;AAAA,IACL,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,eAAA,EAAiB,CAAA;AAAA,IACjB,iBAAA,EAAmB,EAAA;AAAA,IACnB,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA","file":"index.js","sourcesContent":["import type { ConfiguratorState } from '../types';\n\n/**\n * Default configurator state.\n * Traditional hues match the playground defaults.\n * These are HSL hues (0=red, 60=yellow, 120=green, etc.),\n * NOT OKLCH hues — the bridge converts them.\n */\nexport const DEFAULT_CONFIGURATOR_STATE: ConfiguratorState = {\n palettes: [\n {\n name: 'Neutral',\n hue: 220,\n saturation: 24,\n desaturationStrength: 'none',\n desaturationDirection: 'light',\n hueGradeStrength: 'none',\n hueGradeHue: 0,\n hueGradeDirection: 'light',\n },\n {\n name: 'Accent',\n hue: 24,\n saturation: 80,\n desaturationStrength: 'none',\n desaturationDirection: 'light',\n hueGradeStrength: 'none',\n hueGradeHue: 0,\n hueGradeDirection: 'light',\n },\n {\n name: 'Success',\n hue: 145,\n saturation: 64,\n desaturationStrength: 'none',\n desaturationDirection: 'light',\n hueGradeStrength: 'none',\n hueGradeHue: 0,\n hueGradeDirection: 'light',\n },\n {\n name: 'Warning',\n hue: 40,\n saturation: 80,\n desaturationStrength: 'none',\n desaturationDirection: 'light',\n hueGradeStrength: 'none',\n hueGradeHue: 0,\n hueGradeDirection: 'light',\n },\n {\n name: 'Error',\n hue: 0,\n saturation: 80,\n desaturationStrength: 'none',\n desaturationDirection: 'light',\n hueGradeStrength: 'none',\n hueGradeHue: 0,\n hueGradeDirection: 'light',\n },\n ],\n dynamicRange: {\n lightest: 1,\n darkest: 1,\n },\n globalHueGrading: {\n light: { strength: 'none', hue: 30 },\n dark: { strength: 'none', hue: 220 },\n },\n preview: {\n mode: 'light',\n theme: 'neutral',\n },\n};\n","import type { ConfiguratorState, PaletteState } from '../types';\nimport type { ConfiguratorAction } from './actions';\nimport { DEFAULT_CONFIGURATOR_STATE } from './defaults';\n\nfunction updatePalette(\n palettes: readonly PaletteState[],\n index: number,\n update: Partial<PaletteState>,\n): readonly PaletteState[] {\n if (index < 0 || index >= palettes.length) return palettes;\n return palettes.map((p, i) => (i === index ? { ...p, ...update } : p));\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction wrapHue(hue: number): number {\n return ((hue % 360) + 360) % 360;\n}\n\nexport function configuratorReducer(\n state: ConfiguratorState,\n action: ConfiguratorAction,\n): ConfiguratorState {\n switch (action.type) {\n // Palette actions\n case 'SET_PALETTE_HUE':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n hue: wrapHue(action.hue),\n }),\n };\n\n case 'SET_PALETTE_SATURATION':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n saturation: clamp(action.saturation, 0, 100),\n }),\n };\n\n case 'SET_PALETTE_DESAT_STRENGTH':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n desaturationStrength: action.strength,\n }),\n };\n\n case 'SET_PALETTE_DESAT_DIRECTION':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n desaturationDirection: action.direction,\n }),\n };\n\n case 'SET_PALETTE_HUE_GRADE_STRENGTH':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n hueGradeStrength: action.strength,\n }),\n };\n\n case 'SET_PALETTE_HUE_GRADE_HUE':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n hueGradeHue: wrapHue(action.hue),\n }),\n };\n\n case 'SET_PALETTE_HUE_GRADE_DIRECTION':\n return {\n ...state,\n palettes: updatePalette(state.palettes, action.index, {\n hueGradeDirection: action.direction,\n }),\n };\n\n // Dynamic range actions\n case 'SET_LIGHTEST':\n return {\n ...state,\n dynamicRange: {\n ...state.dynamicRange,\n lightest: clamp(action.value, 0, 1),\n },\n };\n\n case 'SET_DARKEST':\n return {\n ...state,\n dynamicRange: {\n ...state.dynamicRange,\n darkest: clamp(action.value, 0, 1),\n },\n };\n\n // Global hue grading actions\n case 'SET_GLOBAL_GRADE_LIGHT_STRENGTH':\n return {\n ...state,\n globalHueGrading: {\n ...state.globalHueGrading,\n light: { ...state.globalHueGrading.light, strength: action.strength },\n },\n };\n\n case 'SET_GLOBAL_GRADE_LIGHT_HUE':\n return {\n ...state,\n globalHueGrading: {\n ...state.globalHueGrading,\n light: { ...state.globalHueGrading.light, hue: wrapHue(action.hue) },\n },\n };\n\n case 'SET_GLOBAL_GRADE_DARK_STRENGTH':\n return {\n ...state,\n globalHueGrading: {\n ...state.globalHueGrading,\n dark: { ...state.globalHueGrading.dark, strength: action.strength },\n },\n };\n\n case 'SET_GLOBAL_GRADE_DARK_HUE':\n return {\n ...state,\n globalHueGrading: {\n ...state.globalHueGrading,\n dark: { ...state.globalHueGrading.dark, hue: wrapHue(action.hue) },\n },\n };\n\n // Preview actions\n case 'SET_PREVIEW_MODE':\n return {\n ...state,\n preview: { ...state.preview, mode: action.mode },\n };\n\n case 'SET_PREVIEW_THEME':\n return {\n ...state,\n preview: { ...state.preview, theme: action.theme },\n };\n\n // Control actions\n case 'RESET':\n return DEFAULT_CONFIGURATOR_STATE;\n\n case 'LOAD_STATE':\n return action.state;\n\n default:\n return state;\n }\n}\n","import { srgbToOklch } from 'newtone';\nimport type { Srgb } from 'newtone';\n\n/**\n * Convert a traditional HSL color wheel hue (0-359) to its equivalent OKLCH hue.\n *\n * Uses the fully saturated HSL color (S=1, L=0.5) at the given hue,\n * converts to sRGB, then extracts the OKLCH hue component.\n *\n * Traditional hues: 0=red, 60=yellow, 120=green, 180=cyan, 240=blue, 300=magenta.\n */\nexport function traditionalHueToOklch(hue: number): number {\n const h = ((hue % 360) + 360) % 360;\n const x = 1 - Math.abs((h / 60) % 2 - 1);\n\n let r: number, g: number, b: number;\n if (h < 60) { r = 1; g = x; b = 0; }\n else if (h < 120) { r = x; g = 1; b = 0; }\n else if (h < 180) { r = 0; g = 1; b = x; }\n else if (h < 240) { r = 0; g = x; b = 1; }\n else if (h < 300) { r = x; g = 0; b = 1; }\n else { r = 1; g = 0; b = x; }\n\n return srgbToOklch({ r, g, b } as Srgb).h;\n}\n","import type { ConfiguratorState } from '../types';\nimport type { NewtoneThemeConfig } from '@newtonedev/components';\nimport type { PaletteConfig, DynamicRange, HueGrading, HueGradingEndpoint } from 'newtone';\nimport { traditionalHueToOklch } from '../hue-conversion';\n\n/**\n * Convert configurator state (traditional hues, human-readable controls)\n * to a NewtoneThemeConfig (OKLCH hues, engine-ready format).\n */\nexport function toThemeConfig(state: ConfiguratorState): NewtoneThemeConfig {\n const palettes: readonly PaletteConfig[] = state.palettes.map(p => {\n const oklchHue = traditionalHueToOklch(p.hue);\n\n const desaturation = p.desaturationStrength !== 'none'\n ? { direction: p.desaturationDirection, strength: p.desaturationStrength } as const\n : undefined;\n\n const paletteHueGrading = p.hueGradeStrength !== 'none'\n ? {\n hue: traditionalHueToOklch(p.hueGradeHue),\n strength: p.hueGradeStrength,\n direction: p.hueGradeDirection,\n } as const\n : undefined;\n\n return { hue: oklchHue, saturation: p.saturation, desaturation, paletteHueGrading };\n });\n\n // Build global hue grading\n const light: HueGradingEndpoint | undefined = state.globalHueGrading.light.strength !== 'none'\n ? { hue: traditionalHueToOklch(state.globalHueGrading.light.hue), strength: state.globalHueGrading.light.strength }\n : undefined;\n\n const dark: HueGradingEndpoint | undefined = state.globalHueGrading.dark.strength !== 'none'\n ? { hue: traditionalHueToOklch(state.globalHueGrading.dark.hue), strength: state.globalHueGrading.dark.strength }\n : undefined;\n\n const hueGrading: HueGrading | undefined = (light || dark) ? { light, dark } : undefined;\n\n const dynamicRange: DynamicRange = {\n lightest: state.dynamicRange.lightest,\n darkest: state.dynamicRange.darkest,\n ...(hueGrading ? { hueGrading } : {}),\n };\n\n return {\n colorSystem: { dynamicRange, palettes },\n themes: {\n neutral: { paletteIndex: 0, lightModeNv: 0.95, darkModeNv: 0.1 },\n primary: { paletteIndex: 1, lightModeNv: 0.95, darkModeNv: 0.1 },\n secondary: { paletteIndex: 1, lightModeNv: 0.85, darkModeNv: 0.15 },\n strong: { paletteIndex: 0, lightModeNv: 0.1, darkModeNv: 0.95 },\n },\n elevation: {\n offsets: [-0.02, 0, 0.04] as const,\n },\n };\n}\n","import { useReducer, useCallback, useMemo } from 'react';\nimport type { ConfiguratorState } from '../types';\nimport type { ConfiguratorAction } from '../state/actions';\nimport type { NewtoneThemeConfig } from '@newtonedev/components';\nimport { configuratorReducer } from '../state/reducer';\nimport { DEFAULT_CONFIGURATOR_STATE } from '../state/defaults';\nimport { toThemeConfig } from '../bridge/toThemeConfig';\n\nexport interface UseConfiguratorResult {\n readonly state: ConfiguratorState;\n readonly dispatch: (action: ConfiguratorAction) => void;\n readonly themeConfig: NewtoneThemeConfig;\n readonly reset: () => void;\n}\n\nexport function useConfigurator(\n initialState?: Partial<ConfiguratorState>,\n): UseConfiguratorResult {\n const mergedInitial: ConfiguratorState = initialState\n ? { ...DEFAULT_CONFIGURATOR_STATE, ...initialState }\n : DEFAULT_CONFIGURATOR_STATE;\n\n const [state, dispatch] = useReducer(configuratorReducer, mergedInitial);\n\n const themeConfig = useMemo(() => toThemeConfig(state), [state]);\n\n const reset = useCallback(() => dispatch({ type: 'RESET' }), []);\n\n return { state, dispatch, themeConfig, reset };\n}\n","import { useMemo } from 'react';\nimport { generatePreview } from 'newtone';\nimport type { ColorResult, DynamicRange } from 'newtone';\nimport type { ConfiguratorState } from '../types';\nimport { traditionalHueToOklch } from '../hue-conversion';\n\nconst PREVIEW_STEPS = 26;\n\n/**\n * Compute preview swatches for all palettes.\n * Returns an array of arrays: one preview row per palette.\n */\nexport function usePreviewColors(state: ConfiguratorState): readonly (readonly ColorResult[])[] {\n return useMemo(() => {\n const light = state.globalHueGrading.light.strength !== 'none'\n ? { hue: traditionalHueToOklch(state.globalHueGrading.light.hue), strength: state.globalHueGrading.light.strength }\n : undefined;\n const dark = state.globalHueGrading.dark.strength !== 'none'\n ? { hue: traditionalHueToOklch(state.globalHueGrading.dark.hue), strength: state.globalHueGrading.dark.strength }\n : undefined;\n const hueGrading = (light || dark) ? { light, dark } : undefined;\n\n const dynamicRange: DynamicRange = {\n lightest: state.dynamicRange.lightest,\n darkest: state.dynamicRange.darkest,\n ...(hueGrading ? { hueGrading } : {}),\n };\n\n return state.palettes.map(p => {\n const oklchHue = traditionalHueToOklch(p.hue);\n const desat = p.desaturationStrength !== 'none'\n ? { direction: p.desaturationDirection, strength: p.desaturationStrength } as const\n : undefined;\n const phg = p.hueGradeStrength !== 'none'\n ? { hue: traditionalHueToOklch(p.hueGradeHue), strength: p.hueGradeStrength, direction: p.hueGradeDirection } as const\n : undefined;\n return generatePreview(oklchHue, p.saturation, dynamicRange, PREVIEW_STEPS, desat, phg);\n });\n }, [state]);\n}\n","/**\n * Hue ranges for semantic palettes (traditional HSL hues).\n * Indices 0 (Neutral) and 1 (Accent) are unconstrained.\n *\n * For wrapping ranges (e.g. Error crosses 0°), max exceeds 359.\n * The HueSlider component normalizes values to [0, 359] via % 360.\n *\n * Gaps between ranges prevent adjacent semantics from overlapping:\n * - 15–25: gap between Error (reds) and Warning (yellows)\n * - 55–80: gap between Warning and Success (greens)\n */\nexport const SEMANTIC_HUE_RANGES: Readonly<Record<number, { readonly min: number; readonly max: number }>> = {\n 2: { min: 80, max: 160 }, // Success (greens)\n 3: { min: 25, max: 55 }, // Warning (yellow/orange)\n 4: { min: 345, max: 375 }, // Error (reds, wraps 0°)\n};\n","import React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { Card, HueSlider, Slider, Select, Toggle, useTokens } from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport type { ColorResult } from 'newtone';\nimport type { PaletteState } from '../types';\nimport type { ConfiguratorAction } from '../state/actions';\nimport type { DesaturationStrength, HueGradingStrength } from 'newtone';\nimport { SEMANTIC_HUE_RANGES } from '../constants';\n\nconst STRENGTH_OPTIONS = [\n { label: 'None', value: 'none' },\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'Hard', value: 'hard' },\n];\n\ninterface PalettePanelProps {\n readonly palette: PaletteState;\n readonly index: number;\n readonly dispatch: (action: ConfiguratorAction) => void;\n readonly previewColors?: readonly ColorResult[];\n}\n\nexport function PalettePanel({ palette, index, dispatch, previewColors }: PalettePanelProps) {\n const tokens = useTokens(1);\n const hueRange = SEMANTIC_HUE_RANGES[index];\n\n return (\n <Card elevation={1} style={styles.container}>\n <Text style={[styles.title, { color: srgbToHex(tokens.textPrimary.srgb) }]}>\n {palette.name}\n </Text>\n\n {previewColors && (\n <View style={styles.inlineSwatches}>\n {previewColors.map((color, i) => (\n <View\n key={i}\n style={[styles.inlineSwatch, { backgroundColor: srgbToHex(color.srgb) }]}\n />\n ))}\n </View>\n )}\n\n <HueSlider\n value={palette.hue}\n onValueChange={(hue) => dispatch({ type: 'SET_PALETTE_HUE', index, hue })}\n label=\"Hue\"\n showValue\n {...(hueRange ? { min: hueRange.min, max: hueRange.max } : {})}\n />\n\n <Slider\n value={palette.saturation}\n onValueChange={(saturation) => dispatch({ type: 'SET_PALETTE_SATURATION', index, saturation })}\n min={0}\n max={100}\n label=\"Saturation\"\n showValue\n />\n\n <View style={styles.row}>\n <View style={styles.flex}>\n <Select\n options={STRENGTH_OPTIONS}\n value={palette.desaturationStrength}\n onValueChange={(strength) => dispatch({ type: 'SET_PALETTE_DESAT_STRENGTH', index, strength: strength as DesaturationStrength })}\n label=\"Desaturation\"\n />\n </View>\n {palette.desaturationStrength !== 'none' && (\n <View style={styles.toggleContainer}>\n <Toggle\n value={palette.desaturationDirection === 'dark'}\n onValueChange={(v) => dispatch({ type: 'SET_PALETTE_DESAT_DIRECTION', index, direction: v ? 'dark' : 'light' })}\n label=\"Invert\"\n />\n </View>\n )}\n </View>\n\n <View style={styles.row}>\n <View style={styles.flex}>\n <Select\n options={STRENGTH_OPTIONS}\n value={palette.hueGradeStrength}\n onValueChange={(strength) => dispatch({ type: 'SET_PALETTE_HUE_GRADE_STRENGTH', index, strength: strength as HueGradingStrength })}\n label=\"Hue Grading\"\n />\n </View>\n {palette.hueGradeStrength !== 'none' && (\n <View style={styles.toggleContainer}>\n <Toggle\n value={palette.hueGradeDirection === 'dark'}\n onValueChange={(v) => dispatch({ type: 'SET_PALETTE_HUE_GRADE_DIRECTION', index, direction: v ? 'dark' : 'light' })}\n label=\"Invert\"\n />\n </View>\n )}\n </View>\n\n {palette.hueGradeStrength !== 'none' && (\n <HueSlider\n value={palette.hueGradeHue}\n onValueChange={(hue) => dispatch({ type: 'SET_PALETTE_HUE_GRADE_HUE', index, hue })}\n label=\"Grade Target\"\n showValue\n />\n )}\n </Card>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: 12,\n marginBottom: 12,\n },\n title: {\n fontSize: 16,\n fontWeight: '700',\n },\n inlineSwatches: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 1,\n },\n inlineSwatch: {\n width: 20,\n height: 16,\n borderRadius: 2,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 12,\n },\n flex: {\n flex: 1,\n },\n toggleContainer: {\n paddingBottom: 2,\n },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { Card, Slider, Select, HueSlider, useTokens } from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport type { ConfiguratorState } from '../types';\nimport type { ConfiguratorAction } from '../state/actions';\nimport type { HueGradingStrength } from 'newtone';\n\nconst STRENGTH_OPTIONS = [\n { label: 'None', value: 'none' },\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'Hard', value: 'hard' },\n];\n\ninterface GlobalPanelProps {\n readonly state: ConfiguratorState;\n readonly dispatch: (action: ConfiguratorAction) => void;\n}\n\nexport function GlobalPanel({ state, dispatch }: GlobalPanelProps) {\n const tokens = useTokens(1);\n\n return (\n <Card elevation={1} style={styles.container}>\n <Text style={[styles.title, { color: srgbToHex(tokens.textPrimary.srgb) }]}>\n Dynamic Range\n </Text>\n\n <View style={styles.row}>\n <View style={styles.flex}>\n <Slider\n value={Math.round(state.dynamicRange.lightest * 100)}\n onValueChange={(v) => dispatch({ type: 'SET_LIGHTEST', value: v / 100 })}\n min={0}\n max={100}\n label=\"Lightest\"\n showValue\n />\n </View>\n <View style={styles.flex}>\n <Slider\n value={Math.round(state.dynamicRange.darkest * 100)}\n onValueChange={(v) => dispatch({ type: 'SET_DARKEST', value: v / 100 })}\n min={0}\n max={100}\n label=\"Darkest\"\n showValue\n />\n </View>\n </View>\n\n <Text style={[styles.subtitle, { color: srgbToHex(tokens.textSecondary.srgb) }]}>\n Global Hue Grading — Light End\n </Text>\n\n <View style={styles.row}>\n <View style={styles.flex}>\n <Select\n options={STRENGTH_OPTIONS}\n value={state.globalHueGrading.light.strength}\n onValueChange={(s) => dispatch({ type: 'SET_GLOBAL_GRADE_LIGHT_STRENGTH', strength: s as HueGradingStrength })}\n label=\"Strength\"\n />\n </View>\n {state.globalHueGrading.light.strength !== 'none' && (\n <View style={styles.flex}>\n <HueSlider\n value={state.globalHueGrading.light.hue}\n onValueChange={(hue) => dispatch({ type: 'SET_GLOBAL_GRADE_LIGHT_HUE', hue })}\n label=\"Target Hue\"\n showValue\n />\n </View>\n )}\n </View>\n\n <Text style={[styles.subtitle, { color: srgbToHex(tokens.textSecondary.srgb) }]}>\n Global Hue Grading — Dark End\n </Text>\n\n <View style={styles.row}>\n <View style={styles.flex}>\n <Select\n options={STRENGTH_OPTIONS}\n value={state.globalHueGrading.dark.strength}\n onValueChange={(s) => dispatch({ type: 'SET_GLOBAL_GRADE_DARK_STRENGTH', strength: s as HueGradingStrength })}\n label=\"Strength\"\n />\n </View>\n {state.globalHueGrading.dark.strength !== 'none' && (\n <View style={styles.flex}>\n <HueSlider\n value={state.globalHueGrading.dark.hue}\n onValueChange={(hue) => dispatch({ type: 'SET_GLOBAL_GRADE_DARK_HUE', hue })}\n label=\"Target Hue\"\n showValue\n />\n </View>\n )}\n </View>\n </Card>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: 12,\n },\n title: {\n fontSize: 16,\n fontWeight: '700',\n },\n subtitle: {\n fontSize: 13,\n fontWeight: '600',\n marginTop: 4,\n },\n row: {\n flexDirection: 'row',\n gap: 12,\n },\n flex: {\n flex: 1,\n },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport {\n Card,\n Button,\n TextInput,\n Select,\n NewtoneProvider,\n useTokens,\n} from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport type { ConfiguratorState } from '../types';\nimport type { ConfiguratorAction } from '../state/actions';\nimport type { ThemeName, NewtoneThemeConfig } from '@newtonedev/components';\n\nconst THEME_OPTIONS = [\n { label: 'Neutral', value: 'neutral' },\n { label: 'Primary', value: 'primary' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Strong', value: 'strong' },\n];\n\ninterface PreviewPanelProps {\n readonly state: ConfiguratorState;\n readonly dispatch: (action: ConfiguratorAction) => void;\n readonly themeConfig: NewtoneThemeConfig;\n}\n\n/** Inner card that reads tokens from the nested provider, so its background reflects the selected theme. */\nfunction PreviewCard({\n state,\n dispatch,\n}: {\n readonly state: ConfiguratorState;\n readonly dispatch: (action: ConfiguratorAction) => void;\n}) {\n const tokens = useTokens(1);\n\n return (\n <Card elevation={1} style={styles.container}>\n <Text style={[styles.title, { color: srgbToHex(tokens.textPrimary.srgb) }]}>\n Component Preview\n </Text>\n\n <View style={styles.controls}>\n <Select\n options={THEME_OPTIONS}\n value={state.preview.theme}\n onValueChange={(t) => dispatch({ type: 'SET_PREVIEW_THEME', theme: t as ThemeName })}\n label=\"Theme\"\n />\n </View>\n\n <View style={previewStyles.wrapper}>\n <View style={previewStyles.row}>\n <Button variant=\"primary\" size=\"sm\">Primary</Button>\n <Button variant=\"secondary\" size=\"sm\">Secondary</Button>\n <Button variant=\"ghost\" size=\"sm\">Ghost</Button>\n <Button variant=\"outline\" size=\"sm\">Outline</Button>\n </View>\n\n <TextInput label=\"Sample Input\" value=\"Hello, Newtone\" onChangeText={() => {}} />\n\n <View style={previewStyles.row}>\n <View style={[previewStyles.statusDot, { backgroundColor: srgbToHex(tokens.success.srgb) }]} />\n <Text style={[previewStyles.statusText, { color: srgbToHex(tokens.textPrimary.srgb) }]}>Success</Text>\n <View style={[previewStyles.statusDot, { backgroundColor: srgbToHex(tokens.warning.srgb) }]} />\n <Text style={[previewStyles.statusText, { color: srgbToHex(tokens.textPrimary.srgb) }]}>Warning</Text>\n <View style={[previewStyles.statusDot, { backgroundColor: srgbToHex(tokens.error.srgb) }]} />\n <Text style={[previewStyles.statusText, { color: srgbToHex(tokens.textPrimary.srgb) }]}>Error</Text>\n </View>\n </View>\n </Card>\n );\n}\n\nexport function PreviewPanel({ state, dispatch, themeConfig }: PreviewPanelProps) {\n return (\n <NewtoneProvider\n key={`${state.preview.mode}-${state.preview.theme}`}\n config={themeConfig}\n initialMode={state.preview.mode}\n initialTheme={state.preview.theme}\n >\n <PreviewCard state={state} dispatch={dispatch} />\n </NewtoneProvider>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: 12,\n },\n title: {\n fontSize: 16,\n fontWeight: '700',\n },\n controls: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 16,\n },\n});\n\nconst previewStyles = StyleSheet.create({\n wrapper: {\n gap: 12,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n flexWrap: 'wrap',\n },\n statusDot: {\n width: 12,\n height: 12,\n borderRadius: 6,\n },\n statusText: {\n fontSize: 13,\n marginRight: 8,\n },\n});\n","import type { ConfiguratorState } from '../types';\nimport type { ColorMode } from '@newtonedev/components';\nimport { computeTokens } from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport { toThemeConfig } from './toThemeConfig';\n\n/**\n * Generate CSS custom properties for both light and dark modes.\n * Computes all 12 design tokens for the neutral theme at default elevation.\n */\nexport function toCSS(state: ConfiguratorState): string {\n const config = toThemeConfig(state);\n const modes: readonly ColorMode[] = ['light', 'dark'];\n\n let css = '';\n for (const mode of modes) {\n const tokens = computeTokens(\n config.colorSystem,\n mode,\n config.themes.neutral,\n 1,\n config.elevation.offsets,\n );\n\n const selector = mode === 'light' ? ':root' : '[data-theme=\"dark\"]';\n css += `${selector} {\\n`;\n css += ` --newtone-background: ${srgbToHex(tokens.background.srgb)};\\n`;\n css += ` --newtone-background-elevated: ${srgbToHex(tokens.backgroundElevated.srgb)};\\n`;\n css += ` --newtone-background-sunken: ${srgbToHex(tokens.backgroundSunken.srgb)};\\n`;\n css += ` --newtone-text-primary: ${srgbToHex(tokens.textPrimary.srgb)};\\n`;\n css += ` --newtone-text-secondary: ${srgbToHex(tokens.textSecondary.srgb)};\\n`;\n css += ` --newtone-interactive: ${srgbToHex(tokens.interactive.srgb)};\\n`;\n css += ` --newtone-interactive-hover: ${srgbToHex(tokens.interactiveHover.srgb)};\\n`;\n css += ` --newtone-interactive-active: ${srgbToHex(tokens.interactiveActive.srgb)};\\n`;\n css += ` --newtone-border: ${srgbToHex(tokens.border.srgb)};\\n`;\n css += ` --newtone-success: ${srgbToHex(tokens.success.srgb)};\\n`;\n css += ` --newtone-warning: ${srgbToHex(tokens.warning.srgb)};\\n`;\n css += ` --newtone-error: ${srgbToHex(tokens.error.srgb)};\\n`;\n css += `}\\n\\n`;\n }\n\n return css;\n}\n","import type { ConfiguratorState } from '../types';\nimport type { NewtoneThemeConfig } from '@newtonedev/components';\nimport { toThemeConfig } from './toThemeConfig';\n\n/** Serializable configurator export format */\nexport interface ConfiguratorExport {\n readonly version: '1.0';\n readonly configuratorState: ConfiguratorState;\n readonly themeConfig: NewtoneThemeConfig;\n}\n\n/**\n * Export the configurator state as a JSON string.\n * Includes both the human-readable state (for round-tripping)\n * and the engine-ready theme config.\n */\nexport function toJSON(state: ConfiguratorState): string {\n const output: ConfiguratorExport = {\n version: '1.0',\n configuratorState: state,\n themeConfig: toThemeConfig(state),\n };\n return JSON.stringify(output, null, 2);\n}\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { Card, Button, useTokens } from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport type { ConfiguratorState } from '../types';\nimport { toCSS } from '../bridge/toCSS';\nimport { toJSON } from '../bridge/toJSON';\n\ninterface ExportPanelProps {\n readonly state: ConfiguratorState;\n}\n\ntype ExportFormat = 'css' | 'json';\n\nexport function ExportPanel({ state }: ExportPanelProps) {\n const tokens = useTokens(1);\n const [format, setFormat] = useState<ExportFormat>('css');\n const [copied, setCopied] = useState(false);\n\n const output = useMemo(() => {\n return format === 'css' ? toCSS(state) : toJSON(state);\n }, [state, format]);\n\n const handleCopy = useCallback(() => {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(output).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n }, [output]);\n\n return (\n <Card elevation={1} style={styles.container}>\n <Text style={[styles.title, { color: srgbToHex(tokens.textPrimary.srgb) }]}>\n Export\n </Text>\n\n <View style={styles.tabs}>\n <Button\n variant={format === 'css' ? 'primary' : 'ghost'}\n size=\"sm\"\n onPress={() => setFormat('css')}\n >\n CSS Variables\n </Button>\n <Button\n variant={format === 'json' ? 'primary' : 'ghost'}\n size=\"sm\"\n onPress={() => setFormat('json')}\n >\n JSON\n </Button>\n <Button variant=\"outline\" size=\"sm\" onPress={handleCopy}>\n {copied ? 'Copied!' : 'Copy'}\n </Button>\n </View>\n\n <View style={[styles.codeBlock, { backgroundColor: srgbToHex(tokens.backgroundSunken.srgb) }]}>\n <Text\n style={[styles.code, { color: srgbToHex(tokens.textPrimary.srgb) }]}\n selectable\n >\n {output}\n </Text>\n </View>\n </Card>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: 12,\n marginBottom: 12,\n },\n title: {\n fontSize: 16,\n fontWeight: '700',\n },\n tabs: {\n flexDirection: 'row',\n gap: 8,\n },\n codeBlock: {\n borderRadius: 6,\n padding: 12,\n maxHeight: 300,\n overflow: 'scroll' as unknown as 'visible',\n },\n code: {\n fontSize: 11,\n fontFamily: 'monospace',\n lineHeight: 16,\n },\n});\n","import React, { useEffect, useRef, useState } from 'react';\nimport { View, Text, Pressable, StyleSheet } from 'react-native';\nimport { Toggle, useTokens, useNewtoneTheme } from '@newtonedev/components';\nimport { srgbToHex } from 'newtone';\nimport type { ConfiguratorProps } from './Configurator.types';\nimport { useConfigurator } from './hooks/useConfigurator';\nimport { usePreviewColors } from './hooks/usePreviewColors';\nimport { PalettePanel } from './panels/PalettePanel';\nimport { GlobalPanel } from './panels/GlobalPanel';\nimport { PreviewPanel } from './panels/PreviewPanel';\nimport { ExportPanel } from './panels/ExportPanel';\n\n/**\n * Newtone Configurator — embeddable palette builder widget.\n *\n * Must be rendered inside a NewtoneProvider owned by the consuming app.\n * The configurator reads tokens via useTokens() for self-affecting styling.\n *\n * The consuming app should update its NewtoneProvider config prop\n * based on the onChange callback, creating the self-affecting loop.\n */\nexport function Configurator({\n initialState,\n onChange,\n showExport = true,\n showPreview = true,\n}: ConfiguratorProps) {\n const { state, dispatch, themeConfig, reset } = useConfigurator(initialState);\n const tokens = useTokens(1);\n const { setMode } = useNewtoneTheme();\n const isInitialRender = useRef(true);\n const [activePaletteIndex, setActivePaletteIndex] = useState(0);\n const previews = usePreviewColors(state);\n\n // Sync mode to parent provider on mount\n useEffect(() => {\n setMode(state.preview.mode);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Fire onChange whenever state changes (skip initial render)\n useEffect(() => {\n if (isInitialRender.current) {\n isInitialRender.current = false;\n return;\n }\n onChange?.(state, themeConfig);\n }, [state, themeConfig, onChange]);\n\n return (\n <View style={[styles.container, { backgroundColor: srgbToHex(tokens.backgroundSunken.srgb) }]}>\n {/* Mode toggle at top */}\n <View style={styles.topBar}>\n <Toggle\n value={state.preview.mode === 'dark'}\n onValueChange={(isDark) => {\n const mode = isDark ? 'dark' : 'light';\n dispatch({ type: 'SET_PREVIEW_MODE', mode });\n setMode(mode);\n }}\n label=\"Dark Mode\"\n />\n </View>\n\n {/* Dynamic Range + Component Preview side by side */}\n <View style={styles.topRow}>\n <View style={styles.topRowPanel}>\n <GlobalPanel state={state} dispatch={dispatch} />\n </View>\n {showPreview && (\n <View style={styles.topRowPanel}>\n <PreviewPanel state={state} dispatch={dispatch} themeConfig={themeConfig} />\n </View>\n )}\n </View>\n\n {/* Palette tab bar */}\n <View style={styles.tabBar}>\n {state.palettes.map((palette, index) => (\n <Pressable\n key={index}\n onPress={() => setActivePaletteIndex(index)}\n style={[\n styles.tab,\n {\n backgroundColor: index === activePaletteIndex\n ? srgbToHex(tokens.background.srgb)\n : 'transparent',\n borderColor: index === activePaletteIndex\n ? srgbToHex(tokens.border.srgb)\n : 'transparent',\n },\n ]}\n >\n <Text style={[\n styles.tabText,\n {\n color: srgbToHex(\n index === activePaletteIndex\n ? tokens.textPrimary.srgb\n : tokens.textSecondary.srgb\n ),\n fontWeight: index === activePaletteIndex ? '700' : '500',\n },\n ]}>\n {palette.name}\n </Text>\n </Pressable>\n ))}\n </View>\n\n {/* Active palette panel with inline preview */}\n <PalettePanel\n palette={state.palettes[activePaletteIndex]}\n index={activePaletteIndex}\n dispatch={dispatch}\n previewColors={previews[activePaletteIndex]}\n />\n\n {showExport && <ExportPanel state={state} />}\n\n {/* Safety: hardcoded styling so this button is always readable */}\n <button\n onClick={() => reset()}\n style={{\n marginTop: 16,\n padding: '8px 16px',\n backgroundColor: '#ffffff',\n color: '#000000',\n border: '2px solid #000000',\n borderRadius: 4,\n fontWeight: 700,\n fontSize: 14,\n cursor: 'pointer',\n }}\n >\n Reset to Defaults\n </button>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n borderRadius: 8,\n padding: 16,\n gap: 4,\n },\n topBar: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n alignItems: 'center',\n marginBottom: 8,\n },\n topRow: {\n flexDirection: 'row',\n gap: 8,\n marginBottom: 4,\n },\n topRowPanel: {\n flex: 1,\n },\n tabBar: {\n flexDirection: 'row',\n gap: 4,\n marginBottom: 4,\n },\n tab: {\n paddingVertical: 8,\n paddingHorizontal: 12,\n borderRadius: 6,\n borderWidth: 1,\n },\n tabText: {\n fontSize: 13,\n },\n});\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConfiguratorState } from '../types';
|
|
3
|
+
interface CanvasPanelProps {
|
|
4
|
+
readonly state: ConfiguratorState;
|
|
5
|
+
}
|
|
6
|
+
export declare function CanvasPanel({ state }: CanvasPanelProps): React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=CanvasPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AA8BD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,qBActD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConfiguratorState } from '../types';
|
|
3
|
+
interface ExportPanelProps {
|
|
4
|
+
readonly state: ConfiguratorState;
|
|
5
|
+
}
|
|
6
|
+
export declare function ExportPanel({ state }: ExportPanelProps): React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ExportPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportPanel.d.ts","sourceRoot":"","sources":["../../src/panels/ExportPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAID,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,qBAsDtD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConfiguratorState } from '../types';
|
|
3
|
+
import type { ConfiguratorAction } from '../state/actions';
|
|
4
|
+
interface GlobalPanelProps {
|
|
5
|
+
readonly state: ConfiguratorState;
|
|
6
|
+
readonly dispatch: (action: ConfiguratorAction) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function GlobalPanel({ state, dispatch }: GlobalPanelProps): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=GlobalPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalPanel.d.ts","sourceRoot":"","sources":["../../src/panels/GlobalPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAU3D,UAAU,gBAAgB;IACxB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACzD;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBAmFhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ColorResult } from 'newtone';
|
|
3
|
+
import type { PaletteState } from '../types';
|
|
4
|
+
import type { ConfiguratorAction } from '../state/actions';
|
|
5
|
+
interface PalettePanelProps {
|
|
6
|
+
readonly palette: PaletteState;
|
|
7
|
+
readonly index: number;
|
|
8
|
+
readonly dispatch: (action: ConfiguratorAction) => void;
|
|
9
|
+
readonly previewColors?: readonly ColorResult[];
|
|
10
|
+
}
|
|
11
|
+
export declare function PalettePanel({ palette, index, dispatch, previewColors }: PalettePanelProps): React.JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=PalettePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PalettePanel.d.ts","sourceRoot":"","sources":["../../src/panels/PalettePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAW3D,UAAU,iBAAiB;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,iBAAiB,qBAwF1F"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConfiguratorState } from '../types';
|
|
3
|
+
import type { ConfiguratorAction } from '../state/actions';
|
|
4
|
+
import type { NewtoneThemeConfig } from '@newtonedev/components';
|
|
5
|
+
interface PreviewPanelProps {
|
|
6
|
+
readonly state: ConfiguratorState;
|
|
7
|
+
readonly dispatch: (action: ConfiguratorAction) => void;
|
|
8
|
+
readonly themeConfig: NewtoneThemeConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare function PreviewPanel({ state, dispatch, themeConfig }: PreviewPanelProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=PreviewPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewPanel.d.ts","sourceRoot":"","sources":["../../src/panels/PreviewPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAS5E,UAAU,iBAAiB;IACzB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C;AAkDD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,iBAAiB,qBAW/E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { DesaturationStrength, HueGradingStrength } from 'newtone';
|
|
2
|
+
import type { ColorMode, ThemeName } from '@newtonedev/components';
|
|
3
|
+
import type { ConfiguratorState } from '../types';
|
|
4
|
+
export type ConfiguratorAction = {
|
|
5
|
+
readonly type: 'SET_PALETTE_HUE';
|
|
6
|
+
readonly index: number;
|
|
7
|
+
readonly hue: number;
|
|
8
|
+
} | {
|
|
9
|
+
readonly type: 'SET_PALETTE_SATURATION';
|
|
10
|
+
readonly index: number;
|
|
11
|
+
readonly saturation: number;
|
|
12
|
+
} | {
|
|
13
|
+
readonly type: 'SET_PALETTE_DESAT_STRENGTH';
|
|
14
|
+
readonly index: number;
|
|
15
|
+
readonly strength: DesaturationStrength;
|
|
16
|
+
} | {
|
|
17
|
+
readonly type: 'SET_PALETTE_DESAT_DIRECTION';
|
|
18
|
+
readonly index: number;
|
|
19
|
+
readonly direction: 'light' | 'dark';
|
|
20
|
+
} | {
|
|
21
|
+
readonly type: 'SET_PALETTE_HUE_GRADE_STRENGTH';
|
|
22
|
+
readonly index: number;
|
|
23
|
+
readonly strength: HueGradingStrength;
|
|
24
|
+
} | {
|
|
25
|
+
readonly type: 'SET_PALETTE_HUE_GRADE_HUE';
|
|
26
|
+
readonly index: number;
|
|
27
|
+
readonly hue: number;
|
|
28
|
+
} | {
|
|
29
|
+
readonly type: 'SET_PALETTE_HUE_GRADE_DIRECTION';
|
|
30
|
+
readonly index: number;
|
|
31
|
+
readonly direction: 'light' | 'dark';
|
|
32
|
+
} | {
|
|
33
|
+
readonly type: 'SET_LIGHTEST';
|
|
34
|
+
readonly value: number;
|
|
35
|
+
} | {
|
|
36
|
+
readonly type: 'SET_DARKEST';
|
|
37
|
+
readonly value: number;
|
|
38
|
+
} | {
|
|
39
|
+
readonly type: 'SET_GLOBAL_GRADE_LIGHT_STRENGTH';
|
|
40
|
+
readonly strength: HueGradingStrength;
|
|
41
|
+
} | {
|
|
42
|
+
readonly type: 'SET_GLOBAL_GRADE_LIGHT_HUE';
|
|
43
|
+
readonly hue: number;
|
|
44
|
+
} | {
|
|
45
|
+
readonly type: 'SET_GLOBAL_GRADE_DARK_STRENGTH';
|
|
46
|
+
readonly strength: HueGradingStrength;
|
|
47
|
+
} | {
|
|
48
|
+
readonly type: 'SET_GLOBAL_GRADE_DARK_HUE';
|
|
49
|
+
readonly hue: number;
|
|
50
|
+
} | {
|
|
51
|
+
readonly type: 'SET_PREVIEW_MODE';
|
|
52
|
+
readonly mode: ColorMode;
|
|
53
|
+
} | {
|
|
54
|
+
readonly type: 'SET_PREVIEW_THEME';
|
|
55
|
+
readonly theme: ThemeName;
|
|
56
|
+
} | {
|
|
57
|
+
readonly type: 'RESET';
|
|
58
|
+
} | {
|
|
59
|
+
readonly type: 'LOAD_STATE';
|
|
60
|
+
readonly state: ConfiguratorState;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/state/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAE1B;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChG;IAAE,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,GAChH;IAAE,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GAC9G;IAAE,QAAQ,CAAC,IAAI,EAAE,gCAAgC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAClH;IAAE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,iCAAiC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GAElH;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAExD;IAAE,QAAQ,CAAC,IAAI,EAAE,iCAAiC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,gCAAgC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAEpE;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAEjE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConfiguratorState } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Default configurator state.
|
|
4
|
+
* Traditional hues match the playground defaults.
|
|
5
|
+
* These are HSL hues (0=red, 60=yellow, 120=green, etc.),
|
|
6
|
+
* NOT OKLCH hues — the bridge converts them.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_CONFIGURATOR_STATE: ConfiguratorState;
|
|
9
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/state/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBAiExC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/state/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAoBpD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,kBAAkB,GACzB,iBAAiB,CA0InB"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { DesaturationStrength, HueGradingStrength } from 'newtone';
|
|
2
|
+
import type { ColorMode, ThemeName } from '@newtonedev/components';
|
|
3
|
+
/** Per-palette state in the configurator (human-readable, traditional hues) */
|
|
4
|
+
export interface PaletteState {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly hue: number;
|
|
7
|
+
readonly saturation: number;
|
|
8
|
+
readonly desaturationStrength: DesaturationStrength;
|
|
9
|
+
readonly desaturationDirection: 'light' | 'dark';
|
|
10
|
+
readonly hueGradeStrength: HueGradingStrength;
|
|
11
|
+
readonly hueGradeHue: number;
|
|
12
|
+
readonly hueGradeDirection: 'light' | 'dark';
|
|
13
|
+
}
|
|
14
|
+
/** Global hue grading endpoint state */
|
|
15
|
+
export interface HueGradingEndpointState {
|
|
16
|
+
readonly strength: HueGradingStrength;
|
|
17
|
+
readonly hue: number;
|
|
18
|
+
}
|
|
19
|
+
/** Complete configurator state */
|
|
20
|
+
export interface ConfiguratorState {
|
|
21
|
+
readonly palettes: readonly PaletteState[];
|
|
22
|
+
readonly dynamicRange: {
|
|
23
|
+
readonly lightest: number;
|
|
24
|
+
readonly darkest: number;
|
|
25
|
+
};
|
|
26
|
+
readonly globalHueGrading: {
|
|
27
|
+
readonly light: HueGradingEndpointState;
|
|
28
|
+
readonly dark: HueGradingEndpointState;
|
|
29
|
+
};
|
|
30
|
+
readonly preview: {
|
|
31
|
+
readonly mode: ColorMode;
|
|
32
|
+
readonly theme: ThemeName;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnE,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,qBAAqB,EAAE,OAAO,GAAG,MAAM,CAAC;IACjD,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9C;AAED,wCAAwC;AACxC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,gBAAgB,EAAE;QACzB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;QACxC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;KACxC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;KAC3B,CAAC;CACH"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@newtonedev/configurator",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Embeddable palette builder widget for Newtone color systems",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/joshuaallenmx/newtone-api.git",
|
|
9
|
+
"directory": "packages/configurator"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://newtone.dev",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/index.cjs",
|
|
14
|
+
"module": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"react-native": "./src/index.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"react-native": "./src/index.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"require": "./dist/index.cjs"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"src"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsup && rm -f tsconfig.tsbuildinfo && tsc --emitDeclarationOnly",
|
|
31
|
+
"dev": "tsup --watch",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"test:watch": "vitest",
|
|
34
|
+
"typecheck": "tsc --noEmit"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"react": ">=18.0.0",
|
|
38
|
+
"react-native": ">=0.70.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"newtone": "^0.1.0",
|
|
42
|
+
"@newtonedev/components": "^0.1.0",
|
|
43
|
+
"react-native-web": "^0.19.10"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@testing-library/react": "^14.0.0",
|
|
47
|
+
"@types/react": "^18.2.0",
|
|
48
|
+
"@vitejs/plugin-react": "^4.2.0",
|
|
49
|
+
"jsdom": "^24.0.0",
|
|
50
|
+
"react": "^18.2.0",
|
|
51
|
+
"react-dom": "^18.2.0",
|
|
52
|
+
"tsup": "^8.0.0",
|
|
53
|
+
"typescript": "^5.4.0",
|
|
54
|
+
"vitest": "^2.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { View, Text, Pressable, StyleSheet } from 'react-native';
|
|
3
|
+
import { Toggle, useTokens, useNewtoneTheme } from '@newtonedev/components';
|
|
4
|
+
import { srgbToHex } from 'newtone';
|
|
5
|
+
import type { ConfiguratorProps } from './Configurator.types';
|
|
6
|
+
import { useConfigurator } from './hooks/useConfigurator';
|
|
7
|
+
import { usePreviewColors } from './hooks/usePreviewColors';
|
|
8
|
+
import { PalettePanel } from './panels/PalettePanel';
|
|
9
|
+
import { GlobalPanel } from './panels/GlobalPanel';
|
|
10
|
+
import { PreviewPanel } from './panels/PreviewPanel';
|
|
11
|
+
import { ExportPanel } from './panels/ExportPanel';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Newtone Configurator — embeddable palette builder widget.
|
|
15
|
+
*
|
|
16
|
+
* Must be rendered inside a NewtoneProvider owned by the consuming app.
|
|
17
|
+
* The configurator reads tokens via useTokens() for self-affecting styling.
|
|
18
|
+
*
|
|
19
|
+
* The consuming app should update its NewtoneProvider config prop
|
|
20
|
+
* based on the onChange callback, creating the self-affecting loop.
|
|
21
|
+
*/
|
|
22
|
+
export function Configurator({
|
|
23
|
+
initialState,
|
|
24
|
+
onChange,
|
|
25
|
+
showExport = true,
|
|
26
|
+
showPreview = true,
|
|
27
|
+
}: ConfiguratorProps) {
|
|
28
|
+
const { state, dispatch, themeConfig, reset } = useConfigurator(initialState);
|
|
29
|
+
const tokens = useTokens(1);
|
|
30
|
+
const { setMode } = useNewtoneTheme();
|
|
31
|
+
const isInitialRender = useRef(true);
|
|
32
|
+
const [activePaletteIndex, setActivePaletteIndex] = useState(0);
|
|
33
|
+
const previews = usePreviewColors(state);
|
|
34
|
+
|
|
35
|
+
// Sync mode to parent provider on mount
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
setMode(state.preview.mode);
|
|
38
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
|
+
}, []);
|
|
40
|
+
|
|
41
|
+
// Fire onChange whenever state changes (skip initial render)
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (isInitialRender.current) {
|
|
44
|
+
isInitialRender.current = false;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
onChange?.(state, themeConfig);
|
|
48
|
+
}, [state, themeConfig, onChange]);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<View style={[styles.container, { backgroundColor: srgbToHex(tokens.backgroundSunken.srgb) }]}>
|
|
52
|
+
{/* Mode toggle at top */}
|
|
53
|
+
<View style={styles.topBar}>
|
|
54
|
+
<Toggle
|
|
55
|
+
value={state.preview.mode === 'dark'}
|
|
56
|
+
onValueChange={(isDark) => {
|
|
57
|
+
const mode = isDark ? 'dark' : 'light';
|
|
58
|
+
dispatch({ type: 'SET_PREVIEW_MODE', mode });
|
|
59
|
+
setMode(mode);
|
|
60
|
+
}}
|
|
61
|
+
label="Dark Mode"
|
|
62
|
+
/>
|
|
63
|
+
</View>
|
|
64
|
+
|
|
65
|
+
{/* Dynamic Range + Component Preview side by side */}
|
|
66
|
+
<View style={styles.topRow}>
|
|
67
|
+
<View style={styles.topRowPanel}>
|
|
68
|
+
<GlobalPanel state={state} dispatch={dispatch} />
|
|
69
|
+
</View>
|
|
70
|
+
{showPreview && (
|
|
71
|
+
<View style={styles.topRowPanel}>
|
|
72
|
+
<PreviewPanel state={state} dispatch={dispatch} themeConfig={themeConfig} />
|
|
73
|
+
</View>
|
|
74
|
+
)}
|
|
75
|
+
</View>
|
|
76
|
+
|
|
77
|
+
{/* Palette tab bar */}
|
|
78
|
+
<View style={styles.tabBar}>
|
|
79
|
+
{state.palettes.map((palette, index) => (
|
|
80
|
+
<Pressable
|
|
81
|
+
key={index}
|
|
82
|
+
onPress={() => setActivePaletteIndex(index)}
|
|
83
|
+
style={[
|
|
84
|
+
styles.tab,
|
|
85
|
+
{
|
|
86
|
+
backgroundColor: index === activePaletteIndex
|
|
87
|
+
? srgbToHex(tokens.background.srgb)
|
|
88
|
+
: 'transparent',
|
|
89
|
+
borderColor: index === activePaletteIndex
|
|
90
|
+
? srgbToHex(tokens.border.srgb)
|
|
91
|
+
: 'transparent',
|
|
92
|
+
},
|
|
93
|
+
]}
|
|
94
|
+
>
|
|
95
|
+
<Text style={[
|
|
96
|
+
styles.tabText,
|
|
97
|
+
{
|
|
98
|
+
color: srgbToHex(
|
|
99
|
+
index === activePaletteIndex
|
|
100
|
+
? tokens.textPrimary.srgb
|
|
101
|
+
: tokens.textSecondary.srgb
|
|
102
|
+
),
|
|
103
|
+
fontWeight: index === activePaletteIndex ? '700' : '500',
|
|
104
|
+
},
|
|
105
|
+
]}>
|
|
106
|
+
{palette.name}
|
|
107
|
+
</Text>
|
|
108
|
+
</Pressable>
|
|
109
|
+
))}
|
|
110
|
+
</View>
|
|
111
|
+
|
|
112
|
+
{/* Active palette panel with inline preview */}
|
|
113
|
+
<PalettePanel
|
|
114
|
+
palette={state.palettes[activePaletteIndex]}
|
|
115
|
+
index={activePaletteIndex}
|
|
116
|
+
dispatch={dispatch}
|
|
117
|
+
previewColors={previews[activePaletteIndex]}
|
|
118
|
+
/>
|
|
119
|
+
|
|
120
|
+
{showExport && <ExportPanel state={state} />}
|
|
121
|
+
|
|
122
|
+
{/* Safety: hardcoded styling so this button is always readable */}
|
|
123
|
+
<button
|
|
124
|
+
onClick={() => reset()}
|
|
125
|
+
style={{
|
|
126
|
+
marginTop: 16,
|
|
127
|
+
padding: '8px 16px',
|
|
128
|
+
backgroundColor: '#ffffff',
|
|
129
|
+
color: '#000000',
|
|
130
|
+
border: '2px solid #000000',
|
|
131
|
+
borderRadius: 4,
|
|
132
|
+
fontWeight: 700,
|
|
133
|
+
fontSize: 14,
|
|
134
|
+
cursor: 'pointer',
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
Reset to Defaults
|
|
138
|
+
</button>
|
|
139
|
+
</View>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const styles = StyleSheet.create({
|
|
144
|
+
container: {
|
|
145
|
+
borderRadius: 8,
|
|
146
|
+
padding: 16,
|
|
147
|
+
gap: 4,
|
|
148
|
+
},
|
|
149
|
+
topBar: {
|
|
150
|
+
flexDirection: 'row',
|
|
151
|
+
justifyContent: 'flex-end',
|
|
152
|
+
alignItems: 'center',
|
|
153
|
+
marginBottom: 8,
|
|
154
|
+
},
|
|
155
|
+
topRow: {
|
|
156
|
+
flexDirection: 'row',
|
|
157
|
+
gap: 8,
|
|
158
|
+
marginBottom: 4,
|
|
159
|
+
},
|
|
160
|
+
topRowPanel: {
|
|
161
|
+
flex: 1,
|
|
162
|
+
},
|
|
163
|
+
tabBar: {
|
|
164
|
+
flexDirection: 'row',
|
|
165
|
+
gap: 4,
|
|
166
|
+
marginBottom: 4,
|
|
167
|
+
},
|
|
168
|
+
tab: {
|
|
169
|
+
paddingVertical: 8,
|
|
170
|
+
paddingHorizontal: 12,
|
|
171
|
+
borderRadius: 6,
|
|
172
|
+
borderWidth: 1,
|
|
173
|
+
},
|
|
174
|
+
tabText: {
|
|
175
|
+
fontSize: 13,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConfiguratorState } from './types';
|
|
2
|
+
import type { NewtoneThemeConfig } from '@newtonedev/components';
|
|
3
|
+
|
|
4
|
+
export interface ConfiguratorProps {
|
|
5
|
+
/** Initial state (optional, defaults to DEFAULT_CONFIGURATOR_STATE) */
|
|
6
|
+
readonly initialState?: Partial<ConfiguratorState>;
|
|
7
|
+
/** Called whenever the configurator state changes */
|
|
8
|
+
readonly onChange?: (state: ConfiguratorState, config: NewtoneThemeConfig) => void;
|
|
9
|
+
/** Whether to show the export panel (default: true) */
|
|
10
|
+
readonly showExport?: boolean;
|
|
11
|
+
/** Whether to show the preview panel (default: true) */
|
|
12
|
+
readonly showPreview?: boolean;
|
|
13
|
+
}
|