@wildo-ai/saas-frontend-lib 1.1.3 → 1.1.4
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/esm/companion-exports.d.ts +1 -1
- package/dist/esm/companion-exports.d.ts.map +1 -1
- package/dist/esm/companion-exports.js +1 -1
- package/dist/esm/companion-exports.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +13 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.js +12 -7
- package/dist/esm/components/flows-actors/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.js +3 -0
- package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
- package/dist/esm/components/flows-actors/execution-plan.js +1 -1
- package/dist/esm/components/flows-actors/execution-plan.js.map +1 -1
- package/dist/esm/components/flows-actors/task-memory.js +1 -1
- package/dist/esm/components/flows-actors/task-memory.js.map +1 -1
- package/dist/esm/components/form/automated/generated-relationship-field.hooks.d.ts +1 -1
- package/dist/esm/components/form/controls/number/slider.d.ts +1 -1
- package/dist/esm/components/form/fields/form-field-file-provider-constraints.frontend.utils.d.ts +1 -1
- package/dist/esm/components/form/fields/form-field-file-provider-constraints.frontend.utils.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file-provider-constraints.frontend.utils.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.js +66 -17
- package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.js +2 -2
- package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
- package/dist/esm/components/form/form-field-types.d.ts +20 -0
- package/dist/esm/components/form/form-field-types.d.ts.map +1 -1
- package/dist/esm/components/form/form-field-types.js.map +1 -1
- package/dist/esm/components/navigation/NavigationItemBadge.d.ts +7 -1
- package/dist/esm/components/navigation/NavigationItemBadge.d.ts.map +1 -1
- package/dist/esm/components/navigation/NavigationItemBadge.js +29 -1
- package/dist/esm/components/navigation/NavigationItemBadge.js.map +1 -1
- package/dist/esm/components/navigation/menu-bar.d.ts +1 -1
- package/dist/esm/components/overlays/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/esm/components/overlays/containers/OverlayContainer.js +36 -9
- package/dist/esm/components/overlays/containers/OverlayContainer.js.map +1 -1
- package/dist/esm/components/overlays/floating/context-menu.d.ts +1 -1
- package/dist/esm/components/overlays/floating/dropdown-menu.d.ts +1 -1
- package/dist/esm/components/resources/ResourceLayout_FilterChips.js +1 -1
- package/dist/esm/components/resources/ResourceLayout_FilterChips.js.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ResourceHeaderTitle.d.ts +12 -0
- package/dist/esm/components/resources/skeleton/ResourceHeaderTitle.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ResourceHeaderTitle.js +13 -1
- package/dist/esm/components/resources/skeleton/ResourceHeaderTitle.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +106 -49
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +311 -109
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +32 -2
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsHub.js +30 -6
- package/dist/esm/components/settings/SettingsHub.js.map +1 -1
- package/dist/esm/components/views/onboarding-view/OnboardingView.d.ts.map +1 -1
- package/dist/esm/components/views/onboarding-view/OnboardingView.js +9 -2
- package/dist/esm/components/views/onboarding-view/OnboardingView.js.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.schemas.d.ts +16 -0
- package/dist/esm/core/automated-layout/automated-layout.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.schemas.js +17 -0
- package/dist/esm/core/automated-layout/automated-layout.frontend.schemas.js.map +1 -1
- package/dist/esm/core/automated-layout/default-layout-generator.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/default-layout-generator.frontend.utils.js +3 -2
- package/dist/esm/core/automated-layout/default-layout-generator.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/billing-launcher.js +1 -1
- package/dist/esm/core/billing/billing-launcher.js.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +64 -4
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +76 -4
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +8 -0
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +1 -0
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
- package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +8 -8
- package/dist/esm/core/config/composite-view.schemas.d.ts +4 -4
- package/dist/esm/core/config/engine-settings-destinations.d.ts +0 -69
- package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
- package/dist/esm/core/config/engine-settings-destinations.js +35 -74
- package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
- package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/useSettingsHubConfig.d.ts.map +1 -1
- package/dist/esm/core/config/useSettingsHubConfig.js +8 -1
- package/dist/esm/core/config/useSettingsHubConfig.js.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.d.ts +4 -4
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +12 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js +15 -2
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
- package/dist/esm/core/external-providers/provider-file-selection.frontend.utils.d.ts +1 -2
- package/dist/esm/core/external-providers/provider-file-selection.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/external-providers/provider-file-selection.frontend.utils.js.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +6 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.js +10 -2
- package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
- package/dist/esm/core/i18n/I18nContext.d.ts +23 -0
- package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
- package/dist/esm/core/i18n/I18nContext.js +6 -1
- package/dist/esm/core/i18n/I18nContext.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +75 -2
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +52 -0
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts +3 -2
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +57 -4
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/ResourceReadCacheBridge.d.ts.map +1 -1
- package/dist/esm/core/resources/ResourceReadCacheBridge.js +130 -37
- package/dist/esm/core/resources/ResourceReadCacheBridge.js.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts +2 -2
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.js +17 -9
- package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.js +61 -5
- package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-file.js","sourceRoot":"","sources":["../../../../../src/components/form/fields/form-field-file.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,iFAAiF,CAAA;AAEhI,OAAO,EAAE,cAAc,EAAE,MAAM,iDAAiD,CAAA;AAGhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAA;AACxF,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAC9F,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChG,OAAO,EACL,eAAe,EACf,SAAS,EAMT,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAkB,MAAM,uEAAuE,CAAA;AAClJ,OAAO,EAAE,uCAAuC,EAAE,MAAM,uDAAuD,CAAA;AAC/G,OAAO,EAAE,sBAAsB,EAAE,MAAM,oEAAoE,CAAA;AAC3G,OAAO,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAA;AAExF,OAAO,EAAE,SAAS,EAAE,MAAM,8DAA8D,CAAA;AACxF,OAAO,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,6EAA6E,CAAA;AA0CzJ,oDAAoD;AACpD,SAAS,iBAAiB,CAAC,KAAmC;IAC5D,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AACpE,CAAC;AAED,qDAAqD;AACrD,SAAS,mBAAmB,CAAC,KAAmC;IAC9D,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC;AACrE,CAAC;AAED,gFAAgF;AAChF,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,SAAS,cAAc;IACrB,OAAO,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAK,GAAW,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,0BAA0B,CACjC,SAA6B,EAC7B,aAA4B;IAE5B,OAAO,aAAa,IAAI,SAAS,CAAC,QAAQ;QACxC,CAAC,CAAC,SAAS,CAAC,QAAQ;QACpB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;AACtB,CAAC;AAED,SAAS,+BAA+B,CACtC,SAA6B,EAC7B,aAA4B;IAE5B,OAAO,OAAO,CAAC,0BAA0B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,iCAAiC,CAAC,SAA6B;IACtE,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,6BAA6B,CACpC,QAA4B,EAC5B,CAAwE;IAExE,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,+EAA+E;IAC/E,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC;AAC/C,CAAC;AAED,SAAS,+BAA+B,CACtC,eAAuB,EACvB,IAAa;IAEb,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC,UAAU,CAC1D,CAAC,EACD,MAAM,EACN,IAAI,EACJ,KAAK,EAAE,eAAe,EACtB,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,SAAS,EACT,cAAc,EAAE,kBAAkB,EAClC,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,cAAc,GACf,EAAE,GAAG,EAA4B,EAAE;IAClC,MAAM,EAAE,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC3D,SAAS,EAAE,qBAAqB,CAAC,yBAAyB;QAC1D,IAAI,EAAE,CAAC,mBAAmB,CAAC;KAC5B,CAAC,CAAA;IACF,MAAM,EAAE,wBAAwB,EAAE,GAAG,cAAc,EAAE,CAAA;IACrD,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IACxC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACjF,MAAM,wBAAwB,GAAG,gBAAgB,IAAI,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAA;IAC/H,MAAM,yBAAyB,GAAG,iBAAiB,IAAI,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;IAC7H,MAAM,aAAa,GAAG,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAA;IAClG,MAAM,WAAW,GAAG,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;IACzF,MAAM,mBAAmB,GAAG,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAA;IACxG,MAAM,yBAAyB,GAAG,CAAC,CAAC,6BAA6B,CAAC,IAAI,6BAA6B,CAAA;IAEnG,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAClD,MAAM,mBAAmB,GAAG,uCAAuC,CAAC;QAClE,MAAM;QACN,wBAAwB;KACzB,CAAC,CAAA;IAEF,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,gBAAgB,CAAA;IAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAA;IAC3C,MAAM,OAAO,GAAG,kBAAkB,EAAE,OAAO,CAAA;IAC3C,MAAM,WAAW,GAAG,kBAAkB,EAAE,WAAW,IAAI,IAAI,CAAA;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpF,MAAM,UAAU,GAAG,kBAAkB,EAAE,QAAQ,IAAI,KAAK,CAAA;IACxD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAA;IAC7C,MAAM,gBAAgB,GAAG,kBAAkB,EAAE,gBAAgB,CAAA;IAC7D,MAAM,gBAAgB,GAAG,kBAAkB,EAAE,gBAAgB,CAAA;IAC7D,MAAM,gBAAgB,GAAG,kBAAkB,EAAE,gBAAgB,CAAA;IAC7D,MAAM,mBAAmB,GAAG,kBAAkB,EAAE,mBAAmB,CAAA;IAEnE,4BAA4B;IAC5B,MAAM,cAAc,GAAG,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAE1E,uCAAuC;IACvC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAmB,YAAY,IAAI,IAAI,CAAC,CAAA;IAEhG,6EAA6E;IAC7E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAsB,CAAA;IAE9E,uEAAuE;IACvE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,iBAAiB,EAAE,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAEtC,0EAA0E;IAC1E,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAClD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;QACtC,MAAM,YAAY,GAAG,SAAS,KAAK,SAAS,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,CAAC,CAAA;QAC3G,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;YAClC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAC7B,CAAC;QACD,YAAY,CAAC,OAAO,GAAG,eAAe,CAAA;IACxC,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAA;IAEpC,kEAAkE;IAClE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAkC,IAAI,GAAG,EAAE,CAAC,CAAA;IACtG,gFAAgF;IAChF,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IACtD,iBAAiB,CAAC,OAAO,GAAG,cAAc,CAAA;IAC1C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAC,qCAAqC;IACnG,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAA4B,IAAI,GAAG,EAAE,CAAC,CAAA;IAClG,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,iBAAiB;IACjB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAA;IAEzD,0EAA0E;IAC1E,EAAE;IACF,iGAAiG;IACjG,gGAAgG;IAChG,+FAA+F;IAC/F,8FAA8F;IAC9F,+EAA+E;IAC/E,MAAM,YAAY,GAAG,QAAQ,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,CAAA;IAC5E,MAAM,YAAY,GAAG,eAAe,IAAI,aAAa,CAAA;IAErD,gBAAgB;IAChB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,GAAG,CAAC,CAAA;IACzC,MAAM,aAAa,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IAClF,MAAM,cAAc,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACpF,MAAM,mBAAmB,GAAG,UAAU;QACpC,CAAC,CAAC,iCAAiC,CAAC,SAAS,CAAC;QAC9C,CAAC,CAAC,+BAA+B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IAE7D,oFAAoF;IACpF,uFAAuF;IACvF,wFAAwF;IACxF,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IACtD,iBAAiB,CAAC,OAAO,GAAG,cAAc,CAAA;IAE1C,kFAAkF;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAElF,wEAAwE;IACxE,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACxD,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAA;IAE5C,kDAAkD;IAClD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAEtF,6EAA6E;IAC7E,uEAAuE;IACvE,6EAA6E;IAE7E,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CACxC,KAAK,EAAM,GAAW,EAAc,EAAE,CAAC,cAAc,CAAC,GAAG,CAAI,GAAG,CAAC,EACjE,CAAC,cAAc,CAAC,CACjB,CAAA;IAED,MAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAC3C,KAAK,EAAE,GAAW,EAAiB,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAChE,CAAC,cAAc,CAAC,CACjB,CAAA;IAED,6EAA6E;IAC7E,yCAAyC;IACzC,6EAA6E;IAE7E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,WAAW;YAAE,OAAM;QAElC,gDAAgD;QAChD,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;YAC7B,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;YAC1F,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAA;YAC9C,IAAI,mBAAmB,GAAG,KAAK,CAAA;YAC/B,yEAAyE;YACzE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAA;YAE5C,MAAM,OAAO,CAAC,UAAU,CACtB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC9B,+EAA+E;gBAC/E,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,CAAA;oBAC1C,OAAM;gBACR,CAAC;gBAED,IAAI,CAAC;oBACH,iFAAiF;oBACjF,6CAA6C;oBAC7C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,WAAW,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAA;oBAC7E,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAe,GAAG,CAAC,CAAA;oBACtD,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;oBAC1B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mBAAmB,GAAG,IAAI,CAAA;oBAC1B,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;gBACrE,CAAC;YACH,CAAC,CAAC,CACH,CAAA;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,kBAAkB,CAAC,MAAM,CAAC,CAAA;gBAC1B,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC5B,mBAAmB;oBACjB,CAAC,CAAC,yBAAyB;oBAC3B,CAAC,CAAC,CAAC,OAAO,KAAK,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAClE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAA;QAED,QAAQ,EAAE,CAAA;QAEV,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAA,CAAC,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC,WAAW,EAAE,gBAAgB,EAAE,yBAAyB,CAAC,CAAC,CAAA;IAEnG,6EAA6E;IAC7E,aAAa;IACb,6EAA6E;IAE7E;;;;;OAKG;IACH,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAU,EAAsB,EAAE;QAChF,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;gBACvD,OAAO,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC3G,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAA;IAElC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAU,EAAsB,EAAE;QACxE,kBAAkB;QAClB,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,4BAA4B;QAC5B,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;YACnC,OAAO,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/F,CAAC;QAED,4BAA4B;QAC5B,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;YACnC,OAAO,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/F,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;IAExD,6EAA6E;IAC7E,uBAAuB;IACvB,6EAA6E;IAE7E,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAC9C,IAAU,EACV,SAAiB,EACjB,WAAoB,EACpB,cAA6B,EAC7B,UAAqC,EACrC,MAAoB,EACkC,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7B,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YAClC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAEpB,6EAA6E;IAC7E,gCAAgC;IAChC,6EAA6E;IAE7E,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAU,EAAE,EAAE;QACpE,MAAM,SAAS,GAAG,0BAA0B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACtE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,gBAAgB,CAAC,CAAC,CAAC,6CAA6C,CAAC,IAAI,6CAA6C,CAAC,CAAA;YACnH,OAAM;QACR,CAAC;QAED,iBAAiB;QACjB,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,eAAe,EAAE,CAAC;YACpB,gBAAgB,CAAC,eAAe,CAAC,CAAA;YACjC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;QAC/B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE7C,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;oBAClC,MAAM;oBACN,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,WAAW;oBACnB,eAAe;iBAChB,CAAC,CAAC,CAAC,CAAC,CAAA;QACL,iBAAiB,CAAC,CAAC,CAAC,CAAA;QACpB,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE3B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAA;YAEnC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,IAAI,EACJ,SAAS,EACT,WAAW,EACX,aAAa,EACb,CAAC,OAAO,EAAE,EAAE;gBACV,iBAAiB,CAAC,OAAO,CAAC,CAAA;gBAC1B,iBAAiB,CAAC,IAAI,CAAC,EAAE;oBACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAC9B,IAAI,KAAK;wBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;oBAC5D,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC,CAAA;YACJ,CAAC,EACD,eAAe,CAAC,MAAM,CACvB,CAAA;YAED,kBAAkB;YAClB,MAAM,QAAQ,GAAc;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAA;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAC5B,CAAC;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAA;YAEpB,wBAAwB;YACxB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,kBAAkB,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAS,CAAC,CAAA;oBACzC,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,wCAAwC;YACxC,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;gBAC/C,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC1B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBAC/C,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,MAAM,GAAG,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAA;wBAChF,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;wBACnE,gBAAgB,CAAC,UAAU,CAAC,CAAA;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,mBAAmB,CAAC,GAAG,CAAC;gBAAE,OAAM;YACpC,gBAAgB,CAAC,+BAA+B,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAA;QAC7E,CAAC;gBAAS,CAAC;YACT,iBAAiB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;YAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAEnI,6EAA6E;IAC7E,kCAAkC;IAClC,6EAA6E;IAE7E,MAAM,yBAAyB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC1E,IAAI,CAAC,iCAAiC,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,gBAAgB,CAAC,CAAC,CAAC,6CAA6C,CAAC,IAAI,6CAA6C,CAAC,CAAA;YACnH,OAAM;QACR,CAAC;QAED,gFAAgF;QAChF,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAA;QAE/C,2BAA2B;QAC3B,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAA;QACzC,IAAI,QAAQ,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACvD,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YAClH,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAW,EAAE,CAAA;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,gBAAgB,CAAC,KAAK,CAAC,CAAA;gBACvB,OAAM;YACR,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;QAED,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE3B,oCAAoC;QACpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAA;QAC3D,MAAM,WAAW,GAAuE,EAAE,CAAA;QAE1F,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;YAC/B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;YAC7C,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE;gBACxB,MAAM;gBACN,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,WAAW;gBACnB,eAAe;aAChB,CAAC,CAAA;YACF,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;QACrD,CAAC;QAED,iBAAiB,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAA8B,CAAA;YAClD,4EAA4E;YAC5E,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;gBACrB,CAAC;YACH,CAAC;YACD,kBAAkB;YAClB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YACrB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,IAAI,EACJ,SAAS,CAAC,MAAM,EAChB,KAAK,EACL,IAAI,EACJ,CAAC,OAAO,EAAE,EAAE;oBACV,iBAAiB,CAAC,IAAI,CAAC,EAAE;wBACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;wBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;wBAC9B,IAAI,KAAK;4BAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;wBAC5D,OAAO,IAAI,CAAA;oBACb,CAAC,CAAC,CAAA;gBACJ,CAAC,EACD,eAAe,CAAC,MAAM,CACvB,CAAA;gBAED,eAAe;gBACf,iBAAiB,CAAC,IAAI,CAAC,EAAE;oBACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAC9B,IAAI,KAAK;wBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;oBAC/F,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC,CAAA;gBAEF,iBAAiB;gBACjB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,kBAAkB,CAAC,IAAI,CAAC,EAAE;wBACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;wBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAS,CAAC,CAAA;wBACzC,OAAO,IAAI,CAAA;oBACb,CAAC,CAAC,CAAA;gBACJ,CAAC;gBAED,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7B,iBAAiB,CAAC,IAAI,CAAC,EAAE;wBACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;wBAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;wBACnB,OAAO,IAAI,CAAA;oBACb,CAAC,CAAC,CAAA;oBACF,MAAM,GAAG,CAAA;gBACX,CAAC;gBAED,iBAAiB,CAAC,IAAI,CAAC,EAAE;oBACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAC9B,IAAI,KAAK;wBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;4BAC1B,GAAG,KAAK;4BACR,MAAM,EAAE,OAAO;4BACf,KAAK,EAAE,+BAA+B,CAAC,mBAAmB,EAAE,GAAG,CAAC;yBACjE,CAAC,CAAA;oBACF,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC,CAAA;gBACF,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,sDAAsD;YACtD,MAAM,cAAc,GAAG,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAA;YACpE,MAAM,QAAQ,GAAsB;gBAClC,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAA;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAC5B,CAAC;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC;QAED,0EAA0E;QAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAC1D,CAAC,MAAM,CAAA;QACR,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAClD,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACpJ,CAAC;aAAM,IAAI,WAAW,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC,CAAA;QAChG,CAAC;QAED,+DAA+D;QAC/D,iBAAiB,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;YAC1B,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC9C,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAElH,6EAA6E;IAC7E,oDAAoD;IACpD,6EAA6E;IAE7E;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,qBAAqB,GAAG,gBAAgB,EAAE,WAAW,CAAA;IAC3D,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAA;IAErE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAc,IAAI,CAAC,CAAA;IAE/E,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,WAAiB,EAAE,EAAE;QAChE,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,sBAAsB,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAE5B,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9C,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,8EAA8E;IAC9E,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,YAAkB,EAAE,EAAE;QACjE,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,sBAAsB,CAAC,YAAY,CAAC,CAAA;IACtC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAE5B,6EAA6E;IAC7E,uBAAuB;IACvB,6EAA6E;IAE7E,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE9B,IAAI,UAAU,EAAE,CAAC;YACf,yBAAyB,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACrB,mEAAmE;YACnE,sEAAsE;YACtE,sEAAsE;YACtE,IAAI,qBAAqB,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACnH,mEAAmE;gBACnE,8DAA8D;gBAC9D,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;gBAC5C,IAAI,SAAS,EAAE,CAAC;oBACd,gBAAgB,CAAC,SAAS,CAAC,CAAA;oBAC3B,OAAM;gBACR,CAAC;gBACD,gBAAgB,CAAC,SAAS,CAAC,CAAA;gBAC3B,kBAAkB,CAAC,IAAI,CAAC,CAAA;gBACxB,OAAM;YACR,CAAC;YACD,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAElI,6EAA6E;IAC7E,wBAAwB;IACxB,6EAA6E;IAE7E;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,wBAAwB,GAAG,KAAK,CAAC,WAAW,CAChD,KAAK,EAAE,YAAoB,EAAE,UAA4C,EAAE,EAAE;QAC3E,MAAM,KAAK,GAAW,EAAE,CAAA;QACxB,IAAI,kBAAkB,GAAG,KAAK,CAAA;QAC9B,IAAI,eAAe,GAAG,KAAK,CAAA;QAE3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,IAAI,KAAK,iCAAiC,CAAC,qBAAqB,EAAE,CAAC;gBAC/E,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC1B,SAAQ;YACV,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,iCAAiC,CAAC,oBAAoB,EAAE,CAAC;gBAC9E,IAAI,CAAC;oBACH,sEAAsE;oBACtE,6DAA6D;oBAC7D,mEAAmE;oBACnE,sEAAsE;oBACtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;oBAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,eAAe,GAAG,IAAI,CAAA;wBACtB,SAAQ;oBACV,CAAC;oBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;oBAClC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,IAAI,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC1G,CAAC;gBAAC,MAAM,CAAC;oBACP,eAAe,GAAG,IAAI,CAAA;gBACxB,CAAC;gBACD,SAAQ;YACV,CAAC;YACD,kBAAkB,GAAG,IAAI,CAAA;QAC3B,CAAC;QAED,IAAI,kBAAkB,EAAE,CAAC;YACvB,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,kCAAkC,CAAC,CAAC,CAAA;YACjH,OAAM;QACR,CAAC;QACD,IAAI,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,CAAC,CAAA;YACtG,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE9B,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACpI,WAAW,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC,EACD,CAAC,WAAW,EAAE,UAAU,CAAC,CAC1B,CAAA;IAED;;;;;OAKG;IACH,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnD,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAAC,CAAA;IACzG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,2BAA2B;IAC3B,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAsC,EAAE,EAAE;QACpF,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;QAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;QACD,iDAAiD;QACjD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAA;QACjC,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,gEAAgE;IAChE,MAAM,qBAAqB,GAAG,QAAQ,IAAI,QAAQ,CAAA;IAClD,MAAM,2BAA2B,GAAG,qBAAqB,IAAI,CAAC,mBAAmB,CAAA;IAEjF,uBAAuB;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QAC9D,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/C,WAAW,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAA;IAE5C,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QAC/D,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,WAAW,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QAC1D,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,WAAW,CAAC,KAAK,CAAC,CAAA;QAElB,IAAI,2BAA2B,IAAI,SAAS;YAAE,OAAM;QAEpD,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAA;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;IACH,CAAC,EAAE,CAAC,2BAA2B,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAA;IAEzD,4BAA4B;IAC5B,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACtD,IAAI,CAAC,aAAa;YAAE,OAAM;QAE1B,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,uCAAuC;gBACvC,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAA;gBACtE,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,mBAAmB,CAAC,GAAG,CAAC;oBAAE,OAAM;gBACpC,gBAAgB,CAAC,+BAA+B,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC3E,OAAM;YACR,CAAC;QACH,CAAC;QAED,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE3B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;QAChB,kBAAkB,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAEhG,yCAAyC;IACzC,8EAA8E;IAC9E,6FAA6F;IAC7F,MAAM,wBAAwB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC1E,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;gBAC/D,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,mBAAmB,CAAC,GAAG,CAAC;oBAAE,OAAM;gBACpC,gBAAgB,CAAC,+BAA+B,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC3E,OAAM;YACR,CAAC;QACH,CAAC;QAED,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE3B,4EAA4E;QAC5E,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,CAAA;QACxE,MAAM,QAAQ,GAAqB,UAAU,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;YAChD,CAAC,CAAC,IAAI,CAAA;QAER,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAA;QAEpB,kBAAkB,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACnB,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAEjF,4BAA4B;IAC5B,0EAA0E;IAC1E,4DAA4D;IAC5D,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,MAAc,EAAE,EAAE;QAC9D,6DAA6D;QAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC/B,CAAC;QAED,iBAAiB,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACnB,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,4BAA4B;IAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/C,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAA;IAE5C,sFAAsF;IACtF,MAAM,cAAc,GAAG,CAAC,QAAiB,EAAyB,EAAE;QAClE,IAAI,CAAC,QAAQ;YAAE,OAAO,qBAAqB,CAAC,IAAI,CAAA;QAChD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,qBAAqB,CAAC,UAAU,CAAA;QAC1E,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,qBAAqB,CAAC,UAAU,CAAA;QAC1E,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,qBAAqB,CAAC,UAAU,CAAA;QAC1E,IAAI,QAAQ,KAAK,iBAAiB;YAAE,OAAO,qBAAqB,CAAC,SAAS,CAAA;QAC1E,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,qBAAqB,CAAC,gBAAgB,CAAA;QACjH,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,qBAAqB,CAAC,iBAAiB,CAAA;QACxH,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,qBAAqB,CAAC,SAAS,CAAA;QACtG,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,qBAAqB,CAAC,YAAY,CAAA;QAC9H,OAAO,qBAAqB,CAAC,IAAI,CAAA;IACnC,CAAC,CAAA;IAED,uEAAuE;IACvE,MAAM,cAAc,GAAG,CAAC,QAAiB,EAAE,OAAiB,QAAQ,CAAC,EAAE,EAAmB,EAAE;QAC1F,OAAO,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACvD,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;IAEhE,6EAA6E;IAC7E,gDAAgD;IAChD,6EAA6E;IAE7E,8EAA8E;IAC9E,MAAM,YAAY,GAAG,kBAAkB,EAAE,MAAM,CAAA;IAE/C,6EAA6E;IAC7E,wEAAwE;IACxE,6EAA6E;IAE7E,MAAM,iBAAiB,GAAG,CAAC,QAAoB,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CACnE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CACvB,eAAK,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,aAChF,CAAC,OAAO,IAAI,WAAW,IAAI,mBAAmB,IAAI,CACjD,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,OAAO,EACvC,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,SAAS,YAElB,yBAAyB,GACnB,CACV,EACD,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,KAAK,EACrC,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,EAAE,CAAC,yCAAyC,EAAE,OAAO,IAAI,aAAa,CAAC,gBACtE,WAAW,EACvB,KAAK,EAAE,WAAW,YAEjB,UAAU,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,GACxD,IACL,CACP,CAAC,CAAC,CAAC,IAAI,CACT,CAAA;IAED,6EAA6E;IAC7E,+DAA+D;IAC/D,6EAA6E;IAE7E,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,IAAyB,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CACrF,eAAK,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aACpD,cAAK,SAAS,EAAC,+BAA+B,YAC3C,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CACX,YACE,IAAI,EAAE,IAAI,CAAC,GAAG,EACd,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,OAAO,IAAI,SAAS,CAAC,YAEvF,IAAI,CAAC,QAAQ,GACZ,CACL,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,OAAO,IAAI,SAAS,CAAC,YAC9D,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,GAC5C,CACR,GACG,EACN,eAAK,SAAS,EAAC,kEAAkE,aAC9E,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,CAC3B,yBAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,CACzC,EACA,IAAI,EAAE,QAAQ,IAAI,CACjB,eAAM,SAAS,EAAC,WAAW,YAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAQ,CACtF,EACA,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,IAAI,CAC9B,2BAAO,IAAI,CAAC,KAAK,YAAG,IAAI,CAAC,MAAM,IAAQ,CACxC,IACG,IACF,CACP,CAAA;IAED,6EAA6E;IAC7E,oCAAoC;IACpC,6EAA6E;IAE7E,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,CACjD,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,UAAU,YACvB,cACE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,EACxC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,SAAS,EAAC,gDAAgD,EAC1D,OAAO,EAAC,MAAM,EACd,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA,CAAC,CAAC,GACzE,GACE,EACN,eAAK,SAAS,EAAC,uCAAuC,aACpD,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC3E,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,EACxB,iBAAiB,CAAC,kBAAkB,CAAC,IAClC,IACF,CACP,CAAA;IAED,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,CACjD,eAAK,SAAS,EAAC,+CAA+C,aAC5D,gBACE,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,QAAQ,QACR,SAAS,EAAC,0BAA0B,EACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,OAAO,EAAC,UAAU,GAClB,EACF,eAAK,SAAS,EAAC,uCAAuC,aACpD,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC3E,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,EACxB,iBAAiB,CAAC,kBAAkB,CAAC,IAClC,IACF,CACP,CAAA;IAED,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,CACjD,eAAK,SAAS,EAAC,yDAAyD,aACtE,eAAK,SAAS,EAAC,6BAA6B,aAC1C,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC3E,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,EACxB,iBAAiB,CAAC,kBAAkB,CAAC,IAClC,EACN,gBACE,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,QAAQ,QACR,SAAS,EAAC,YAAY,EACtB,OAAO,EAAC,UAAU,GAClB,IACE,CACP,CAAA;IAED,6EAA6E;IAC7E,8CAA8C;IAC9C,6EAA6E;IAE7E,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,IAAyB,EAAE,EAAE;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,sCAAsC;YACtC,OAAO,CACL,eAAK,SAAS,EAAC,qEAAqE,aAClF,8BAAkB,MAAM,YAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EACvE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAC5B,iBAAiB,CAAC,kBAAkB,CAAC,IAClC,CACP,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEpE,4BAA4B;QAC5B,IAAI,MAAM,KAAK,iBAAiB,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1E,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,MAAM,KAAK,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACnD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,MAAM,KAAK,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACnD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;QAED,6CAA6C;QAC7C,OAAO,CACL,eAAK,SAAS,EAAC,qEAAqE,aAClF,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC3E,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAC5B,iBAAiB,CAAC,kBAAkB,CAAC,IAClC,CACP,CAAA;IACH,CAAC,CAAA;IAED,6EAA6E;IAC7E,8BAA8B;IAC9B,6EAA6E;IAE7E,yDAAyD;IACzD,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,IAA8B,EAAE,EAAE;QAChF,MAAM,MAAM,GAAG,wBAAwB,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACrE,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;QAEvD,2CAA2C;QAC3C,IAAI,MAAM,KAAK,iBAAiB,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAClF,OAAO,CACL,eAAkB,SAAS,EAAC,qEAAqE,aAC/F,cACE,GAAG,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EACxC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,SAAS,EAAC,8CAA8C,EACxD,OAAO,EAAC,MAAM,EACd,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA,CAAC,CAAC,GACzE,EACF,cAAK,SAAS,EAAC,gBAAgB,YAC5B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAC/B,EACL,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAX1B,MAAM,CAYV,CACP,CAAA;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,KAAK,iBAAiB,CAAC,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;YACpD,OAAO,CACL,eAAkB,SAAS,EAAC,yDAAyD,aACnF,eAAK,SAAS,EAAC,6BAA6B,aAC1C,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC5E,cAAK,SAAS,EAAC,gBAAgB,YAC5B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAC/B,EACL,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAC9B,EACN,gBAAO,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,QAAC,SAAS,EAAC,YAAY,EAAC,OAAO,EAAC,UAAU,GAAG,KARnE,MAAM,CASV,CACP,CAAA;QACH,CAAC;QAED,kDAAkD;QAClD,OAAO,CACL,eAAkB,SAAS,EAAC,qEAAqE,aAC/F,8BAAkB,MAAM,YAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAC7E,cAAK,SAAS,EAAC,gBAAgB,YAC5B,cAAc,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,GACvC,EACL,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAL1B,MAAM,CAMV,CACP,CAAA;IACH,CAAC,CAAA;IAED,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CACnC,eAAK,SAAS,EAAC,iBAAiB,aAE7B,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACxC,OAAO,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC7C,CAAC,CAAC,EAGD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CACxD,eAA8B,SAAS,EAAC,wFAAwF,aAC7H,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,CACrC,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,4BAA4B,iBAAa,MAAM,GAAG,CACvF,EACA,WAAW,CAAC,MAAM,KAAK,OAAO,IAAI,CACjC,eAAM,SAAS,EAAC,gCAAgC,iBAAa,MAAM,YAAE,UAAU,CAAC,qBAAqB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAQ,CAC9I,EACD,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAM,SAAS,EAAC,oCAAoC,YAAE,WAAW,CAAC,QAAQ,GAAQ,EACjF,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,CACrC,cAAK,SAAS,EAAC,uDAAuD,YACnE,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1B,cAAK,SAAS,EAAC,oDAAoD,GAAG,CACvE,CAAC,CAAC,CAAC,CACF,cACE,SAAS,EAAC,yEAAyE,EACnF,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,QAAQ,GAAG,EAAE,GAC5C,CACH,GACG,CACP,EACA,WAAW,CAAC,MAAM,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,IAAI,CACtD,eAAM,SAAS,EAAC,0BAA0B,YAAE,WAAW,CAAC,KAAK,GAAQ,CACtE,IACG,EACL,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,CACrC,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,KAAK,EACrC,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,EACrD,SAAS,EAAC,0DAA0D,gBACxD,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,QAAQ,CAAC,EACjF,KAAK,EAAE,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,QAAQ,CAAC,YAE3E,UAAU,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,GACxD,CACV,KArCO,WAAW,CAAC,MAAM,CAsCtB,CACP,CAAC,IACE,CACP,CAAA;IAED,6EAA6E;IAC7E,gDAAgD;IAChD,6EAA6E;IAE7E,kDAAkD;IAClD,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;QACjD,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,GAAG,CAAA;QACtC,IAAI,OAAO,GAAG,IAAI;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAA;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;IAC1C,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACzC,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,mBAAmB;QACnB,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,uBAAuB,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAClK,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAClI,CAAC;QACD,2EAA2E;QAE3E,oBAAoB;QACpB,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAA;YAClF,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAA;gBACzB,MAAM,CAAC,GAAG,SAAS,IAAI,GAAG,CAAA;gBAC1B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACjJ,CAAC;YACD,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAA;gBACzB,MAAM,CAAC,GAAG,SAAS,IAAI,GAAG,CAAA;gBAC1B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,iCAAiC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACrJ,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,+BAA+B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YACpL,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,+BAA+B,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;YACtK,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,+BAA+B,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;YACtK,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,mBAAmB,CAAC,QAAQ,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,+BAA+B,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YACnJ,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,sBAAsB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QACpH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;IAEnI,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7C,OAAO,CACL,cAAK,SAAS,EAAC,qDAAqD,YACjE,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAChC,eAAc,SAAS,EAAC,+BAA+B,YACpD,IAAI,IADI,CAAC,CAEL,CACR,CAAC,GACE,CACP,CAAA;IACH,CAAC,CAAA;IAED,6EAA6E;IAC7E,8CAA8C;IAC9C,6EAA6E;IAE7E,MAAM,gBAAgB,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAC5C,cACE,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,EAAE,CACX,qGAAqG,EACrG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EACrC,QAAQ,IAAI,6BAA6B,EACzC,2BAA2B,IAAI,sDAAsD,EACrF,SAAS,IAAI,CAAC,UAAU,IAAI,qBAAqB,EACjD,aAAa,IAAI,oBAAoB,EACrC,CAAC,2BAA2B,IAAI,CAAC,SAAS,IAAI,yCAAyC,EACvF,UAAU,CAAC,MAAM,CAAC,UAAU,CAC7B,YAGA,SAAS,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAC1B,8BACE,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,yBAAyB,iBAAa,MAAM,GAAG,EACnF,eAAM,SAAS,EAAC,+BAA+B,YAC5C,cAAc,GAAG,CAAC;wBACjB,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;wBACxF,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,GACrG,EACP,cAAK,SAAS,EAAC,sEAAsE,YAClF,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpB,+CAA+C;oBAC/C,cAAK,SAAS,EAAC,oDAAoD,GAAG,CACvE,CAAC,CAAC,CAAC,CACF,cACE,SAAS,EAAC,yEAAyE,EACnF,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,cAAc,GAAG,EAAE,GACtC,CACH,GACG,IACL,CACJ,CAAC,CAAC,CAAC,CACF,8BACG,CAAC,OAAO,IAAI,eAAM,SAAS,EAAC,YAAY,iBAAa,MAAM,YAAE,UAAU,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAQ,EACrI,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,YAChE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,wBAAwB,GACxG,EACN,CAAC,OAAO,IAAI,CACX,8BACE,eAAM,SAAS,EAAC,0CAA0C,YACvD,aAAa,GACT,EACP,gBAAM,SAAS,EAAC,0CAA0C,aACvD,iBAAiB,EACjB,OAAO,IAAI,CAAC,OAAO,IAAI,MAAM,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IACrI,EACN,qBAAqB,EAAE,IACvB,CACJ,IACA,CACJ,GACG,CACP,CAAA;IAED,6EAA6E;IAC7E,gBAAgB;IAChB,6EAA6E;IAE7E,MAAM,UAAU,GAAG,UAAU,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;IAEhF;;;;;;;;;;;;OAYG;IACH,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,CAClC,KAAC,sBAAsB,IACrB,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,wBAAwB,EAClC,iBAAiB,EAAE,qBAAqB,EACxC,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAC9C,cAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,uCAAuC,YAChE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,MAAM,IAEL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,OAAO,EAAE,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,kBAC1F,MAAM,CAAC,WAAW,KAAK,MAAM,EAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,YAExC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAPrE,MAAM,CAAC,WAAW,CAQhB,CACV,CAAC,GACE,CACP,GACD,CACH,CAAA;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,eAAK,GAAG,EAAE,GAAsC,EAAE,SAAS,EAAE,SAAS,aAEpE,gBACE,GAAG,EAAE,YAAY,EACjB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,2BAA2B,GACrC,EAED,UAAU,CAAC,CAAC,CAAC;YACZ,qBAAqB;YACrB,eAAK,SAAS,EAAC,iBAAiB,aAC7B,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,sBAAsB,EAAE,EACrD,CAAC,2BAA2B,IAAI,UAAU,IAAI,gBAAgB,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EACzF,CAAC,2BAA2B,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,KAAK,CAAC,EACrG,CAAC,2BAA2B,IAAI,UAAU,IAAI,qBAAqB,EAAE,IAClE,CACP,CAAC,CAAC,CAAC;YACF,mBAAmB;YACnB,aAAa;gBACX,CAAC,CAAC,uBAAuB,CAAC,aAAa,EAAE,YAAY,CAAC;gBACtD,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CACvB,8BACG,gBAAgB,CAAC,KAAK,CAAC,EACvB,CAAC,2BAA2B,IAAI,qBAAqB,EAAE,IACvD,CACJ,CAAC,CAAC,CAAC,IAAI,CAAC,CACZ,EAIA,eAAe,IAAI,qBAAqB,IAAI,CAC3C,KAAC,SAAS,IACR,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,qBAAqB,EAClC,SAAS,EAAE,kBAAkB,EAC7B,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAC1C,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAC5C,kBAAkB,EAAE,OAAO,EAC3B,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,iBAAiB,GAChC,CACH,IACG,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,kBAAkB;AAClB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAChG,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAExC,MAAM,cAAc,GAAuB,OAAO,CAAC,GAAG,EAAE;QACtD,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAC;QAE1D,OAAO;YACL,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAM,GAAG,EAAE,QAAQ,EAAE;oBAC/D,gBAAgB,EAAE,OAAO,EAAE,UAAU;oBACrC,MAAM,EAAE,OAAO,EAAE,MAAM;iBACxB,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC3B,OAAO;wBACL,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;wBAC5B,QAAQ,EAAE,QAAQ,CAAC,IAAI;qBACxB,CAAC;gBACJ,CAAC;gBACD,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;oBACrB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAClE,CAAC;gBAED,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;YACD,GAAG,EAAE,KAAK,EAAM,GAAW,EAAc,EAAE;gBACzC,OAAO,UAAU,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,GAAW,EAAiB,EAAE;gBAC3C,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,8BAA8B,CAC9C,qBAAqB,CAAC,yBAAyB,EAC/C,eAAe,CAChB,CAAC,MAAM,CAAC,CAAC;IACV,MAAM,aAAa,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,EAA8B,CAAC;IAC/E,OAAO,KAAC,SAAS,OAAK,aAAa,EAAE,GAAG,EAAE,GAAG,GAAI,CAAA;AACnD,CAAC,CAAC,CAAA;AACF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAA","sourcesContent":["import React, { forwardRef, useMemo } from 'react'\nimport { FrontendComponentType, CorePresetNames } from '@wildo-ai/presets-components-models'\nimport { createComponentResolverWithRef } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport { useApplication } from '~wildo-frontend-lib/core/runtime/useApplication'\nimport type { ControlBaseProps, FileHttpOperations } from '~wildo-frontend-lib/components/form/form-field-types'\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { IconSize, StandardIconReference } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { LoadingSpinner } from \"~wildo-frontend-lib/components/feedback/loading-spinner\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\nimport { UIBehavior, FormControlVariant, ButtonSize } from \"@wildo-ai/presets-components-models\"\nimport {\n getFileMetadata,\n getFileUI,\n FileValue,\n SingleFileValue,\n MultipleFileValue,\n FileMetadata,\n FileFieldEndpoints,\n formatFileSize,\n isMimeTypeAllowed,\n getAcceptDescription,\n buildAcceptAttribute,\n FileDisplayNature,\n resolveFileDisplayNature,\n} from \"@wildo-ai/zod-decorators\"\nimport { determineValidationMode, getZodErrorParams, ValidationMode } from \"~wildo-frontend-lib/components/form/validation-errors/form-validation\"\nimport { resolveFormFieldFileProviderConstraints } from './form-field-file-provider-constraints.frontend.utils'\nimport { ProviderFilePickerHost } from '~wildo-frontend-lib/core/external-providers/ProviderFilePickerHost'\nimport { ProviderFrontendSelectionDelivery } from '@wildo-ai/saas-models/public-runtime'\nimport type { ProviderFileSelection } from '@wildo-ai/external-connectors-public/app'\nimport { ImageCrop } from '~wildo-frontend-lib/components/form/controls/file/image-crop'\nimport { canExportWithinAllowedMimeTypes, isCroppableRasterImageFile } from '~wildo-frontend-lib/components/form/controls/file/image-crop.frontend.utils'\n\n// --- Contract ---\nexport interface FormFieldFilePresetProps extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n value?: FileValue\n onChange?: (value: FileValue | null) => void\n defaultValue?: FileValue\n endpoints: FileFieldEndpoints\n uploadButtonText?: string\n onValidationError?: (error: string | undefined) => void\n replaceButtonText?: string\n httpOperations: FileHttpOperations\n}\n\nexport type FormFieldFileProps = Omit<FormFieldFilePresetProps, 'httpOperations'> & {\n httpOperations?: FileHttpOperations\n} & ComponentPresetProps\n\nexport type FormFieldFileRef = HTMLDivElement\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** State of an individual file being uploaded */\ninterface UploadingFileState {\n /** Temporary ID for tracking (not the server fileId) */\n tempId: string;\n /** Original file name */\n fileName: string;\n /** Upload progress percentage (0-100) */\n progress: number;\n /** Upload status */\n status: 'uploading' | 'done' | 'error';\n /** Error message if status is 'error' */\n error?: string;\n /** Server-returned fileId once upload is complete */\n fileId?: string;\n /** AbortController for cancellation */\n abortController: AbortController;\n}\n\n/** Type guard to check if value is a single file */\nfunction isSingleFileValue(value: FileValue | null | undefined): value is SingleFileValue {\n return value !== null && value !== undefined && 'fileId' in value;\n}\n\n/** Type guard to check if value is multiple files */\nfunction isMultipleFileValue(value: FileValue | null | undefined): value is MultipleFileValue {\n return value !== null && value !== undefined && 'fileIds' in value;\n}\n\n/** Generate a temporary ID for tracking uploads before server assigns fileId */\nlet tempIdCounter = 0;\nfunction generateTempId(): string {\n return `upload-${Date.now()}-${++tempIdCounter}`;\n}\n\n/**\n * Detect if an error was caused by intentional cancellation (AbortController.abort).\n *\n * Axios throws CanceledError with code 'ERR_CANCELED' and message 'canceled'.\n * Native fetch/AbortController throws DOMException with name 'AbortError'.\n * We check both to remain HTTP-client-agnostic.\n */\nfunction isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if ((err as any).code === 'ERR_CANCELED') return true;\n if (err.name === 'AbortError') return true;\n return false;\n}\n\nfunction resolveSingleFileUploadUrl(\n endpoints: FileFieldEndpoints,\n currentFileId: string | null,\n): string | undefined {\n return currentFileId && endpoints.override\n ? endpoints.override\n : endpoints.upload\n}\n\nfunction hasActionableSingleFileEndpoint(\n endpoints: FileFieldEndpoints,\n currentFileId: string | null,\n): boolean {\n return Boolean(resolveSingleFileUploadUrl(endpoints, currentFileId))\n}\n\nfunction hasActionableMultipleFileEndpoint(endpoints: FileFieldEndpoints): boolean {\n return Boolean(endpoints.upload)\n}\n\nfunction getNeutralFileAttachmentLabel(\n filename: string | undefined,\n t: (key: string, params?: Record<string, unknown>) => string | undefined,\n): string {\n if (filename && filename.trim() !== '') {\n return filename;\n }\n\n // Do not expose internal file ids in fallback UI when metadata is unavailable.\n return t('File attached') ?? 'File attached';\n}\n\nfunction getSafeFileMutationErrorMessage(\n fallbackMessage: string,\n _err: unknown,\n): string {\n return fallbackMessage;\n}\n\n/**\n * FormFieldFile component\n *\n * Renders a file upload field with:\n * - Drag and drop zone\n * - File picker button\n * - Current file display (single mode) or file list (multiple mode)\n * - Replace/remove options\n * - Progress tracking per upload\n * - Upload cancellation support\n */\nexport const FormFieldFile_Preset_Default = React.forwardRef<FormFieldFileRef, FormFieldFilePresetProps>(\n ({\n schema,\n name,\n value: controlledValue,\n onChange,\n onBlur,\n defaultValue,\n disabled = false,\n readOnly,\n className,\n validationMode: validationModeProp,\n endpoints,\n uploadButtonText,\n replaceButtonText,\n onValidationError,\n required,\n httpOperations,\n}, ref): React.JSX.Element | null => {\n const { t, tErrorValidation, tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE,\n keys: ['errors_validation'],\n })\n const { frontendProviderRegistry } = useApplication()\n const { renderIcon } = useIconRegistry()\n const { getRecipe } = useUI()\n const formRecipe = getRecipe(UIBehavior.FORM_CONTROL, FormControlVariant.DEFAULT)\n const resolvedUploadButtonText = uploadButtonText ?? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'choose_file')\n const resolvedReplaceButtonText = replaceButtonText ?? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'replace')\n const dragDropLabel = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'drag_and_drop')\n const removeLabel = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'remove')\n const uploadFailedMessage = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'upload_failed')\n const metadataLoadFailedMessage = t('Unable to load file details') ?? 'Unable to load file details'\n\n // Get file metadata from schema\n const fileSchemaMetadata = getFileMetadata(schema)\n const providerConstraints = resolveFormFieldFileProviderConstraints({\n schema,\n frontendProviderRegistry,\n })\n\n // Get options from metadata\n const allowedMimeTypes = providerConstraints.allowedMimeTypes\n const maxSize = providerConstraints.maxSize\n const minSize = fileSchemaMetadata?.minSize\n const overridable = fileSchemaMetadata?.overridable ?? true\n const accept = allowedMimeTypes ? buildAcceptAttribute(allowedMimeTypes) : undefined\n const isMultiple = fileSchemaMetadata?.multiple ?? false\n const maxFiles = providerConstraints.maxFiles\n const imageConstraints = fileSchemaMetadata?.imageConstraints\n const videoConstraints = fileSchemaMetadata?.videoConstraints\n const audioConstraints = fileSchemaMetadata?.audioConstraints\n const documentConstraints = fileSchemaMetadata?.documentConstraints\n\n // Determine validation mode\n const validationMode = determineValidationMode(schema, validationModeProp)\n\n // Internal state for uncontrolled mode\n const [internalValue, setInternalValue] = React.useState<FileValue | null>(defaultValue ?? null)\n\n // Internal validation error state (Hybrid Pattern - see file header comment)\n const [internalError, setInternalError] = React.useState<string | undefined>()\n\n // P1-T09: Propagate internal errors to parent (FormField) for RHF sync\n React.useEffect(() => {\n onValidationError?.(internalError)\n }, [internalError, onValidationError])\n\n // Clear internal error when value is cleared (form reset or manual clear)\n const prevValueRef = React.useRef(controlledValue)\n React.useEffect(() => {\n const prevValue = prevValueRef.current\n const valueCleared = prevValue !== undefined && (controlledValue === null || controlledValue === undefined)\n if (valueCleared && internalError) {\n setInternalError(undefined)\n }\n prevValueRef.current = controlledValue\n }, [controlledValue, internalError])\n\n // Upload state — supports parallel uploads for multiple file mode\n const [uploadingFiles, setUploadingFiles] = React.useState<Map<string, UploadingFileState>>(new Map())\n // Ref for reading upload state outside of React state updaters (e.g., to abort)\n const uploadingFilesRef = React.useRef(uploadingFiles)\n uploadingFilesRef.current = uploadingFiles\n const [uploadProgress, setUploadProgress] = React.useState(0) // Aggregate progress for single mode\n const [fileMetadataMap, setFileMetadataMap] = React.useState<Map<string, FileMetadata>>(new Map())\n const [dragOver, setDragOver] = React.useState(false)\n\n // File input ref\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n // Controlled ⇔ the caller supplied a change handler (or a defined value).\n //\n // Deciding by VALUE alone is unsafe for a caller that legitimately passes `undefined` — an empty\n // file field on a create surface, or one whose value was cleared: the control would conclude it\n // is uncontrolled, keep the upload result in private internal state and never call `onChange`,\n // so the form would submit without the file the user just uploaded. The tier-1 field wrappers\n // were hardened against this class; this control renders directly and was not.\n const isControlled = onChange !== undefined || controlledValue !== undefined\n const currentValue = controlledValue ?? internalValue\n\n // Derived state\n const uploading = uploadingFiles.size > 0\n const currentFileId = isSingleFileValue(currentValue) ? currentValue.fileId : null\n const currentFileIds = isMultipleFileValue(currentValue) ? currentValue.fileIds : []\n const hasUploadCapability = isMultiple\n ? hasActionableMultipleFileEndpoint(endpoints)\n : hasActionableSingleFileEndpoint(endpoints, currentFileId)\n\n // Ref to track latest currentFileIds — prevents stale closure in multi-file upload.\n // Without this, two rapid batch uploads can lose IDs: Batch 1 and Batch 2 both capture\n // the same currentFileIds from the closure, then Batch 2's result overwrites Batch 1's.\n const currentFileIdsRef = React.useRef(currentFileIds)\n currentFileIdsRef.current = currentFileIds\n\n // Stable key for metadata fetch dependency (avoids inline .join() in effect deps)\n const fileIdsKey = React.useMemo(() => currentFileIds.join(','), [currentFileIds])\n\n // Ref for metadata map to avoid stale reads in fetch effect cache check\n const fileMetadataMapRef = React.useRef(fileMetadataMap)\n fileMetadataMapRef.current = fileMetadataMap\n\n // Get first metadata for single file mode display\n const fileMetadata = currentFileId ? fileMetadataMap.get(currentFileId) ?? null : null\n\n // ==========================================================================\n // HTTP OPERATIONS — delegates to the injected httpOperations interface\n // ==========================================================================\n\n const authenticatedGet = React.useCallback(\n async <T,>(url: string): Promise<T> => httpOperations.get<T>(url),\n [httpOperations]\n )\n\n const authenticatedDelete = React.useCallback(\n async (url: string): Promise<void> => httpOperations.delete(url),\n [httpOperations]\n )\n\n // ==========================================================================\n // METADATA FETCHING — for existing files\n // ==========================================================================\n\n React.useEffect(() => {\n if (!endpoints.getMetadata) return\n\n // Determine which fileIds need metadata fetched\n const idsToFetch: string[] = []\n if (currentFileId) {\n idsToFetch.push(currentFileId)\n }\n if (currentFileIds.length > 0) {\n idsToFetch.push(...currentFileIds)\n }\n\n if (idsToFetch.length === 0) {\n setFileMetadataMap(new Map())\n setInternalError((current) => current === metadataLoadFailedMessage ? undefined : current)\n return\n }\n\n let cancelled = false\n\n const fetchAll = async () => {\n const newMap = new Map<string, FileMetadata>()\n let metadataFetchFailed = false\n // Read from ref to get the latest cached metadata (avoids stale closure)\n const cachedMap = fileMetadataMapRef.current\n\n await Promise.allSettled(\n idsToFetch.map(async (fileId) => {\n // Skip if we already have metadata for this file (read from ref for freshness)\n if (cachedMap.has(fileId)) {\n newMap.set(fileId, cachedMap.get(fileId)!)\n return\n }\n\n try {\n // Build URL: endpoints.getMetadata is a template base, append /{fileId}/metadata\n // Backend route: GET /files/:fileId/metadata\n const url = `${endpoints.getMetadata}/${encodeURIComponent(fileId)}/metadata`\n const data = await authenticatedGet<FileMetadata>(url)\n if (!cancelled) {\n newMap.set(fileId, data)\n }\n } catch {\n metadataFetchFailed = true\n console.warn('Unable to load file metadata for one or more files.')\n }\n })\n )\n\n if (!cancelled) {\n setFileMetadataMap(newMap)\n setInternalError((current) => (\n metadataFetchFailed\n ? metadataLoadFailedMessage\n : (current === metadataLoadFailedMessage ? undefined : current)\n ))\n }\n }\n\n fetchAll()\n\n return () => { cancelled = true }\n }, [currentFileId, fileIdsKey, endpoints.getMetadata, authenticatedGet, metadataLoadFailedMessage])\n\n // ==========================================================================\n // VALIDATION\n // ==========================================================================\n\n /**\n * MIME check alone — shared between the plain upload path (via `validateFile`)\n * and the crop path, which must reject a disallowed type BEFORE opening the\n * crop dialog but must NOT pre-check byte size (shrinking an oversized\n * original under the ceiling is precisely what the crop step is for).\n */\n const validateFileMimeType = React.useCallback((file: File): string | undefined => {\n if (allowedMimeTypes && allowedMimeTypes.length > 0) {\n if (!isMimeTypeAllowed(file.type, allowedMimeTypes)) {\n const accepted = getAcceptDescription(allowedMimeTypes)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_type_not_allowed', { accepted })\n }\n }\n return undefined\n }, [allowedMimeTypes, tComponent])\n\n const validateFile = React.useCallback((file: File): string | undefined => {\n // Check MIME type\n const mimeError = validateFileMimeType(file)\n if (mimeError) {\n return mimeError\n }\n\n // Check file size — maximum\n if (maxSize && file.size > maxSize) {\n const max = formatFileSize(maxSize)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_too_large', { max })\n }\n\n // Check file size — minimum\n if (minSize && file.size < minSize) {\n const min = formatFileSize(minSize)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_too_small', { min })\n }\n\n return undefined\n }, [validateFileMimeType, maxSize, minSize, tComponent])\n\n // ==========================================================================\n // UPLOAD — single file\n // ==========================================================================\n\n /** Upload a single file via httpOperations */\n const uploadSingleFile = React.useCallback(async (\n file: File,\n uploadUrl: string,\n isReplacing: boolean,\n existingFileId: string | null,\n onProgress: (percent: number) => void,\n signal?: AbortSignal,\n ): Promise<{ fileId: string; metadata?: FileMetadata }> => {\n const formData = new FormData()\n formData.append('file', file)\n if (isReplacing && existingFileId) {\n formData.append('fileId', existingFileId)\n }\n\n return httpOperations.upload(uploadUrl, formData, { onProgress, signal })\n }, [httpOperations])\n\n // ==========================================================================\n // UPLOAD HANDLERS — single mode\n // ==========================================================================\n\n const handleSingleFileUpload = React.useCallback(async (file: File) => {\n const uploadUrl = resolveSingleFileUploadUrl(endpoints, currentFileId)\n if (!uploadUrl) {\n setInternalError(t('File uploads are unavailable for this field') ?? 'File uploads are unavailable for this field')\n return\n }\n\n // Validate first\n const validationError = validateFile(file)\n if (validationError) {\n setInternalError(validationError)\n return\n }\n\n const tempId = generateTempId()\n const abortController = new AbortController()\n\n setUploadingFiles(new Map([[tempId, {\n tempId,\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n abortController,\n }]]))\n setUploadProgress(0)\n setInternalError(undefined)\n\n try {\n const isReplacing = !!currentFileId\n\n const result = await uploadSingleFile(\n file,\n uploadUrl,\n isReplacing,\n currentFileId,\n (percent) => {\n setUploadProgress(percent)\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, progress: percent })\n return next\n })\n },\n abortController.signal,\n )\n\n // Build new value\n const newValue: FileValue = {\n fileId: result.fileId,\n updatedAt: new Date(),\n }\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Update metadata cache\n if (result.metadata) {\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.set(result.fileId, result.metadata!)\n return next\n })\n }\n\n // Validate the new value against schema\n if (validationMode !== 'onSubmit') {\n const schemaResult = schema.safeParse(newValue)\n if (!schemaResult.success) {\n const firstIssue = schemaResult.error.issues[0]\n if (firstIssue) {\n const params = { ...getZodErrorParams(firstIssue), message: firstIssue.message }\n const translated = tErrorValidation(firstIssue.code, 'msg', params)\n setInternalError(translated)\n }\n }\n }\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n } finally {\n setUploadingFiles(new Map())\n setUploadProgress(0)\n }\n }, [currentFileId, endpoints, isControlled, onChange, t, validateFile, validationMode, schema, tErrorValidation, uploadSingleFile])\n\n // ==========================================================================\n // UPLOAD HANDLERS — multiple mode\n // ==========================================================================\n\n const handleMultipleFilesUpload = React.useCallback(async (files: File[]) => {\n if (!hasActionableMultipleFileEndpoint(endpoints)) {\n setInternalError(t('File uploads are unavailable for this field') ?? 'File uploads are unavailable for this field')\n return\n }\n\n // Use ref to get latest file IDs — prevents stale closure when batches overlap.\n // Without this, two rapid uploads both see the same old currentFileIds,\n // and the second batch's result would overwrite the first batch's new IDs.\n const latestFileIds = currentFileIdsRef.current\n\n // Validate all files first\n const currentCount = latestFileIds.length\n if (maxFiles && currentCount + files.length > maxFiles) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'too_many_files', { max: maxFiles }))\n return\n }\n\n const validFiles: File[] = []\n for (const file of files) {\n const error = validateFile(file)\n if (error) {\n setInternalError(error)\n return\n }\n validFiles.push(file)\n }\n\n setInternalError(undefined)\n\n // Create upload state for each file\n const initialStates = new Map<string, UploadingFileState>()\n const fileEntries: { tempId: string; file: File; abortController: AbortController }[] = []\n\n for (const file of validFiles) {\n const tempId = generateTempId()\n const abortController = new AbortController()\n initialStates.set(tempId, {\n tempId,\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n abortController,\n })\n fileEntries.push({ tempId, file, abortController })\n }\n\n setUploadingFiles(prev => {\n const next = new Map<string, UploadingFileState>()\n // Keep only in-progress uploads from previous batches; discard stale errors\n for (const [id, state] of prev) {\n if (state.status === 'uploading') {\n next.set(id, state)\n }\n }\n // Add new uploads\n for (const [id, state] of initialStates) {\n next.set(id, state)\n }\n return next\n })\n\n // Upload all files in parallel\n const results = await Promise.allSettled(\n fileEntries.map(async ({ tempId, file, abortController }) => {\n try {\n const result = await uploadSingleFile(\n file,\n endpoints.upload,\n false,\n null,\n (percent) => {\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, progress: percent })\n return next\n })\n },\n abortController.signal,\n )\n\n // Mark as done\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, status: 'done', fileId: result.fileId, progress: 100 })\n return next\n })\n\n // Cache metadata\n if (result.metadata) {\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.set(result.fileId, result.metadata!)\n return next\n })\n }\n\n return result.fileId\n } catch (err) {\n if (isCancellationError(err)) {\n setUploadingFiles(prev => {\n const next = new Map(prev)\n next.delete(tempId)\n return next\n })\n throw err\n }\n\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, {\n ...state,\n status: 'error',\n error: getSafeFileMutationErrorMessage(uploadFailedMessage, err)\n })\n return next\n })\n throw err\n }\n })\n )\n\n // Collect successful fileIds\n const newFileIds: string[] = []\n for (const result of results) {\n if (result.status === 'fulfilled') {\n newFileIds.push(result.value)\n }\n }\n\n if (newFileIds.length > 0) {\n // Read latest file IDs via ref to avoid stale closure\n const updatedFileIds = [...currentFileIdsRef.current, ...newFileIds]\n const newValue: MultipleFileValue = {\n fileIds: updatedFileIds,\n updatedAt: new Date(),\n }\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n // Report errors if any uploads failed (exclude intentional cancellations)\n const failedCount = results.filter(r =>\n r.status === 'rejected' && !isCancellationError(r.reason)\n ).length\n if (failedCount > 0 && failedCount < files.length) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'some_uploads_failed', { failed: failedCount, total: files.length }))\n } else if (failedCount === files.length) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'upload_failed'))\n }\n\n // Clear completed uploads from state (keep errors for display)\n setUploadingFiles(prev => {\n const next = new Map(prev)\n for (const [id, state] of next) {\n if (state.status === 'done') next.delete(id)\n }\n return next\n })\n }, [endpoints, isControlled, maxFiles, onChange, tComponent, uploadSingleFile, validateFile, uploadFailedMessage])\n\n // ==========================================================================\n // CROP STEP — aspect-ratio-constrained image fields\n // ==========================================================================\n\n /**\n * Aspect-ratio constraint → inline crop step activation.\n *\n * When the authored `imageConstraints` declare an aspect ratio (ANY ratio —\n * a 1:1 avatar is just the first case, never a special case), a selected\n * raster image is routed through the injectable `ImageCrop` step\n * (pan/zoom + crop to the required ratio, client-side downscale to the\n * declared max dimensions, re-encode under the size ceiling) BEFORE the\n * normal upload pipeline. Fields without an aspect-ratio constraint keep\n * the direct-upload flow untouched.\n *\n * Boundaries, decided rather than omitted:\n * - Single-file mode only. A multi-file field with an aspect constraint\n * would need a per-file crop queue; until that UX exists, multi-file\n * selections keep the current validate-and-upload flow (the constraint\n * still holds server-side).\n * - SVG and browser-undecodable formats (e.g. HEIC) bypass the crop step\n * via `onUncroppable` and fall back to the plain upload path, keeping\n * server-side validation the authority instead of silently rasterizing\n * or hard-failing in the client.\n */\n const aspectRatioConstraint = imageConstraints?.aspectRatio\n const fileUIPreviewShape = getFileUI(schema)?.display?.preview?.shape\n\n const [pendingCropFile, setPendingCropFile] = React.useState<File | null>(null)\n\n const handleCropConfirm = React.useCallback((croppedFile: File) => {\n setPendingCropFile(null)\n handleSingleFileUpload(croppedFile)\n }, [handleSingleFileUpload])\n\n const handleCropCancel = React.useCallback(() => {\n setPendingCropFile(null)\n }, [])\n\n /** Decode failure → plain upload with the ORIGINAL file (see JSDoc above). */\n const handleUncroppable = React.useCallback((originalFile: File) => {\n setPendingCropFile(null)\n handleSingleFileUpload(originalFile)\n }, [handleSingleFileUpload])\n\n // ==========================================================================\n // UNIFIED FILE HANDLER\n // ==========================================================================\n\n const handleFiles = React.useCallback((files: File[]) => {\n if (files.length === 0) return\n\n if (isMultiple) {\n handleMultipleFilesUpload(files)\n } else {\n const file = files[0]\n // The allow-list gate keeps fields that accept no canvas-encodable\n // format (e.g. GIF-only) on the plain upload path — the cropper could\n // only emit a type the field's own MIME validation would then reject.\n if (aspectRatioConstraint && isCroppableRasterImageFile(file) && canExportWithinAllowedMimeTypes(allowedMimeTypes)) {\n // Reject a disallowed MIME type before opening the dialog; size is\n // deliberately NOT pre-checked — the crop export enforces it.\n const mimeError = validateFileMimeType(file)\n if (mimeError) {\n setInternalError(mimeError)\n return\n }\n setInternalError(undefined)\n setPendingCropFile(file)\n return\n }\n handleSingleFileUpload(file)\n }\n }, [isMultiple, handleMultipleFilesUpload, handleSingleFileUpload, aspectRatioConstraint, validateFileMimeType, allowedMimeTypes])\n\n // ==========================================================================\n // PROVIDER FILE PICKERS\n // ==========================================================================\n\n /*\n * A provider's picker hands back one of THREE delivery kinds, and the field —\n * not the host — decides what each one means. Two of them end in the same\n * place as a local selection: `handleFiles`, so MIME/size validation, the\n * crop step and the upload pipeline are the ones already written here rather\n * than a second, provider-only path that would drift from them.\n *\n * The third, REMOTE_REFERENCE, deliberately does NOT. It is an opaque id only\n * the application backend can resolve, and the door it needs — an executor\n * that fetches on the user's behalf with the connected account's credential —\n * does not exist yet. So the field REFUSES it with a message instead of\n * dropping it silently: a user who picks a file and sees nothing happen has\n * no way to learn that the provider and the application disagree about who\n * fetches. A provider declares its delivery kind and the host has already\n * refused anything that contradicts that declaration, so this branch is a\n * capability gap, never a malformed selection.\n */\n const handleProviderSelections = React.useCallback(\n async (_providerRef: string, selections: readonly ProviderFileSelection[]) => {\n const files: File[] = []\n let sawRemoteReference = false\n let sawFetchFailure = false\n\n for (const selection of selections) {\n if (selection.kind === ProviderFrontendSelectionDelivery.BROWSER_READABLE_FILE) {\n files.push(selection.file)\n continue\n }\n if (selection.kind === ProviderFrontendSelectionDelivery.BROWSER_READABLE_URL) {\n try {\n // The url is fetchable by the browser BY DECLARATION — its origin has\n // to be admitted by the surface's composed CSP, which is the\n // application's decision and not something this field can check. A\n // blocked origin therefore arrives here as an ordinary fetch failure.\n const response = await fetch(selection.url)\n if (!response.ok) {\n sawFetchFailure = true\n continue\n }\n const blob = await response.blob()\n files.push(new File([blob], selection.displayName ?? 'file', { type: selection.mimeType ?? blob.type }))\n } catch {\n sawFetchFailure = true\n }\n continue\n }\n sawRemoteReference = true\n }\n\n if (sawRemoteReference) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_selection_not_supported'))\n return\n }\n if (sawFetchFailure && files.length === 0) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_fetch_failed'))\n return\n }\n if (files.length === 0) return\n\n setInternalError(sawFetchFailure ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_fetch_failed') : undefined)\n handleFiles(files)\n },\n [handleFiles, tComponent],\n )\n\n /*\n * A picker that failed and a picker that contradicted its own declaration\n * reach here as one message, because they are one thing to the person looking\n * at the field. The distinction that matters to whoever wrote the provider is\n * carried in the rejection the host built, not in what a user reads.\n */\n const handleProviderFailure = React.useCallback(() => {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_picker_failed'))\n }, [tComponent])\n\n // Handle file input change\n const handleFileChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files && files.length > 0) {\n handleFiles(Array.from(files))\n }\n // Reset input so same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [handleFiles])\n\n // Effective disabled includes readOnly for interactive elements\n const isInteractionDisabled = disabled || readOnly\n const isUploadInteractionDisabled = isInteractionDisabled || !hasUploadCapability\n\n // Handle drag and drop\n const handleDragOver = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!isUploadInteractionDisabled && !uploading) {\n setDragOver(true)\n }\n }, [isUploadInteractionDisabled, uploading])\n\n const handleDragLeave = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOver(false)\n }, [])\n\n const handleDrop = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOver(false)\n\n if (isUploadInteractionDisabled || uploading) return\n\n const files = e.dataTransfer.files\n if (files && files.length > 0) {\n handleFiles(Array.from(files))\n }\n }, [isUploadInteractionDisabled, uploading, handleFiles])\n\n // Handle remove single file\n const handleRemoveSingle = React.useCallback(async () => {\n if (!currentFileId) return\n\n if (endpoints.delete) {\n try {\n // Backend route: DELETE /files/:fileId\n const url = `${endpoints.delete}/${encodeURIComponent(currentFileId)}`\n await authenticatedDelete(url)\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n return\n }\n }\n\n setInternalError(undefined)\n\n if (!isControlled) {\n setInternalValue(null)\n }\n\n onChange?.(null)\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.delete(currentFileId)\n return next\n })\n }, [currentFileId, endpoints, isControlled, onChange, authenticatedDelete, uploadFailedMessage])\n\n // Handle remove file from multiple list.\n // Uses currentFileIdsRef to avoid stale closure: two rapid removes would both\n // capture the same closure value, and the second would re-add the file removed by the first.\n const handleRemoveFromMultiple = React.useCallback(async (fileId: string) => {\n if (endpoints.delete) {\n try {\n const url = `${endpoints.delete}/${encodeURIComponent(fileId)}`\n await authenticatedDelete(url)\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n return\n }\n }\n\n setInternalError(undefined)\n\n // Read latest file IDs via ref — prevents lost removals during rapid clicks\n const updatedIds = currentFileIdsRef.current.filter(id => id !== fileId)\n const newValue: FileValue | null = updatedIds.length > 0\n ? { fileIds: updatedIds, updatedAt: new Date() }\n : null\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.delete(fileId)\n return next\n })\n }, [endpoints, isControlled, onChange, authenticatedDelete, uploadFailedMessage])\n\n // Cancel a specific upload.\n // Side effect (abort) is performed BEFORE the state update to comply with\n // React's requirement that state updater functions be pure.\n const handleCancelUpload = React.useCallback((tempId: string) => {\n // Read current state via ref (no side effect inside updater)\n const state = uploadingFilesRef.current.get(tempId)\n if (state) {\n state.abortController.abort()\n }\n\n setUploadingFiles(prev => {\n const next = new Map(prev)\n next.delete(tempId)\n return next\n })\n }, [])\n\n // Handle click on drop zone\n const handleClick = React.useCallback(() => {\n if (!isUploadInteractionDisabled && !uploading) {\n fileInputRef.current?.click()\n }\n }, [isUploadInteractionDisabled, uploading])\n\n // Get file icon reference based on MIME type (consistent with display-field-file.tsx)\n const getFileIconRef = (mimeType?: string): StandardIconReference => {\n if (!mimeType) return StandardIconReference.FILE\n if (mimeType.startsWith('image/')) return StandardIconReference.FILE_IMAGE\n if (mimeType.startsWith('video/')) return StandardIconReference.FILE_VIDEO\n if (mimeType.startsWith('audio/')) return StandardIconReference.FILE_AUDIO\n if (mimeType === 'application/pdf') return StandardIconReference.FILE_TEXT\n if (mimeType.includes('spreadsheet') || mimeType.includes('excel')) return StandardIconReference.FILE_SPREADSHEET\n if (mimeType.includes('presentation') || mimeType.includes('powerpoint')) return StandardIconReference.FILE_PRESENTATION\n if (mimeType.includes('document') || mimeType.includes('word')) return StandardIconReference.FILE_TEXT\n if (mimeType.includes('zip') || mimeType.includes('rar') || mimeType.includes('7z')) return StandardIconReference.FILE_ARCHIVE\n return StandardIconReference.FILE\n }\n\n /** Render a file icon for the given MIME type at the specified size */\n const renderFileIcon = (mimeType?: string, size: IconSize = IconSize.MD): React.ReactNode => {\n return renderIcon(getFileIconRef(mimeType), { size })\n }\n\n const acceptDescription = getAcceptDescription(allowedMimeTypes)\n\n // ==========================================================================\n // RENDER — Nature detection for preview routing\n // ==========================================================================\n\n /** Resolve the display nature using the shared utility from zod-decorators */\n const schemaNature = fileSchemaMetadata?.nature\n\n // ==========================================================================\n // RENDER — File action buttons (shared between single + multi displays)\n // ==========================================================================\n\n const renderFileActions = (onRemove: () => void, compact = false) => (\n !isInteractionDisabled ? (\n <div className={cn(\"flex items-center gap-element\", compact ? \"flex-shrink-0\" : \"\")}>\n {!compact && overridable && hasUploadCapability && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.OUTLINE}\n size={ButtonSize.SM}\n onClick={handleClick}\n disabled={uploading}\n >\n {resolvedReplaceButtonText}\n </Button>\n )}\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.SM}\n onClick={onRemove}\n disabled={uploading}\n className={cn(\"text-destructive hover:text-destructive\", compact && \"h-6 w-6 p-0\")}\n aria-label={removeLabel}\n title={removeLabel}\n >\n {renderIcon(StandardIconReference.CLOSE, { size: IconSize.SM })}\n </Button>\n </div>\n ) : null\n )\n\n // ==========================================================================\n // RENDER — File info line (filename, size, extension — shared)\n // ==========================================================================\n\n const renderFileInfo = (fileId: string, meta: FileMetadata | null, compact = false) => (\n <div className={cn(\"min-w-0\", compact ? \"\" : \"flex-1\")}>\n <div className=\"flex items-center gap-element\">\n {meta?.url ? (\n <a\n href={meta.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"font-medium text-primary hover:underline truncate\", compact && \"text-sm\")}\n >\n {meta.filename}\n </a>\n ) : (\n <span className={cn(\"font-medium truncate\", compact && \"text-sm\")}>\n {getNeutralFileAttachmentLabel(meta?.filename, t)}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-group text-xs text-muted-foreground mt-0.5\">\n {meta?.size !== undefined && (\n <span>{formatFileSize(meta.size)}</span>\n )}\n {meta?.mimeType && (\n <span className=\"uppercase\">{meta.extension || meta.mimeType.split('/').pop()}</span>\n )}\n {meta?.width && meta?.height && (\n <span>{meta.width}×{meta.height}</span>\n )}\n </div>\n </div>\n )\n\n // ==========================================================================\n // RENDER — Nature-specific previews\n // ==========================================================================\n\n const renderImagePreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 overflow-hidden\">\n <div className=\"relative\">\n <img\n src={meta.url || meta.thumbnailUrl || ''}\n alt={meta.filename}\n className=\"w-full max-h-64 object-contain bg-checkerboard\"\n loading=\"lazy\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none' }}\n />\n </div>\n <div className=\"flex items-center gap-group p-card-sm\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n </div>\n )\n\n const renderVideoPreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 overflow-hidden\">\n <video\n src={meta.url}\n controls\n className=\"w-full max-h-64 bg-black\"\n poster={meta.thumbnailUrl}\n preload=\"metadata\"\n />\n <div className=\"flex items-center gap-group p-card-sm\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n </div>\n )\n\n const renderAudioPreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 p-card-sm space-y-element\">\n <div className=\"flex items-center gap-group\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n <audio\n src={meta.url}\n controls\n className=\"w-full h-8\"\n preload=\"metadata\"\n />\n </div>\n )\n\n // ==========================================================================\n // RENDER — Single file display (nature-aware)\n // ==========================================================================\n\n const renderSingleFileDisplay = (fileId: string, meta: FileMetadata | null) => {\n if (!meta) {\n // No metadata yet — show generic card\n return (\n <div className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(undefined, IconSize.LG)}</span>\n {renderFileInfo(fileId, null)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n )\n }\n\n const nature = resolveFileDisplayNature(schemaNature, meta.mimeType)\n\n // Nature-specific rendering\n if (nature === FileDisplayNature.IMAGE && (meta.url || meta.thumbnailUrl)) {\n return renderImagePreview(meta)\n }\n if (nature === FileDisplayNature.VIDEO && meta.url) {\n return renderVideoPreview(meta)\n }\n if (nature === FileDisplayNature.AUDIO && meta.url) {\n return renderAudioPreview(meta)\n }\n\n // Generic / document fallback — compact card\n return (\n <div className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.LG)}</span>\n {renderFileInfo(fileId, meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n )\n }\n\n // ==========================================================================\n // RENDER — Multiple file list\n // ==========================================================================\n\n /** Render a single item within the multiple-file list */\n const renderMultipleFileItem = (fileId: string, meta: FileMetadata | undefined) => {\n const nature = resolveFileDisplayNature(schemaNature, meta?.mimeType)\n const onRemove = () => handleRemoveFromMultiple(fileId)\n\n // Compact image preview — thumbnail inline\n if (nature === FileDisplayNature.IMAGE && meta && (meta.url || meta.thumbnailUrl)) {\n return (\n <div key={fileId} className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <img\n src={meta.thumbnailUrl || meta.url || ''}\n alt={meta.filename}\n className=\"h-12 w-12 rounded object-cover flex-shrink-0\"\n loading=\"lazy\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none' }}\n />\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n )\n }\n\n // Compact audio preview — inline player\n if (nature === FileDisplayNature.AUDIO && meta?.url) {\n return (\n <div key={fileId} className=\"rounded-md border bg-muted/30 p-card-sm space-y-item-xs\">\n <div className=\"flex items-center gap-group\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n <audio src={meta.url} controls className=\"w-full h-8\" preload=\"metadata\" />\n </div>\n )\n }\n\n // Generic compact card (video, document, unknown)\n return (\n <div key={fileId} className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(meta?.mimeType, IconSize.MD)}</span>\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta ?? null, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n )\n }\n\n const renderMultipleFileList = () => (\n <div className=\"space-y-element\">\n {/* Existing files */}\n {currentFileIds.map((fileId) => {\n const meta = fileMetadataMap.get(fileId)\n return renderMultipleFileItem(fileId, meta)\n })}\n\n {/* In-progress uploads */}\n {Array.from(uploadingFiles.values()).map((uploadState) => (\n <div key={uploadState.tempId} className=\"flex items-center gap-group p-card-sm rounded-md border border-primary/20 bg-primary/5\">\n {uploadState.status === 'uploading' && (\n <LoadingSpinner size={20} className=\"text-primary flex-shrink-0\" aria-hidden=\"true\" />\n )}\n {uploadState.status === 'error' && (\n <span className=\"text-destructive flex-shrink-0\" aria-hidden=\"true\">{renderIcon(StandardIconReference.WARNING, { size: IconSize.MD })}</span>\n )}\n <div className=\"flex-1 min-w-0\">\n <span className=\"font-medium text-sm truncate block\">{uploadState.fileName}</span>\n {uploadState.status === 'uploading' && (\n <div className=\"w-full h-1 bg-muted rounded-full mt-1 overflow-hidden\">\n {uploadState.progress < 0 ? (\n <div className=\"h-full w-1/3 bg-primary animate-pulse rounded-full\" />\n ) : (\n <div\n className=\"h-full bg-primary transition-all duration-[var(--motion-duration-fast)]\"\n style={{ width: `${uploadState.progress}%` }}\n />\n )}\n </div>\n )}\n {uploadState.status === 'error' && uploadState.error && (\n <span className=\"text-xs text-destructive\">{uploadState.error}</span>\n )}\n </div>\n {uploadState.status === 'uploading' && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.SM}\n onClick={() => handleCancelUpload(uploadState.tempId)}\n className=\"text-muted-foreground hover:text-destructive h-6 w-6 p-0\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'cancel')}\n title={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'cancel')}\n >\n {renderIcon(StandardIconReference.CLOSE, { size: IconSize.SM })}\n </Button>\n )}\n </div>\n ))}\n </div>\n )\n\n // ==========================================================================\n // RENDER — Constraint hints (below upload area)\n // ==========================================================================\n\n /** Format seconds into human-readable duration */\n const formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`\n if (seconds < 3600) return `${Math.floor(seconds / 60)} min`\n const h = Math.floor(seconds / 3600)\n const m = Math.floor((seconds % 3600) / 60)\n return m > 0 ? `${h}h ${m}min` : `${h}h`\n }\n\n const constraintHints = React.useMemo(() => {\n const hints: string[] = []\n\n // Size constraints\n if (minSize && maxSize) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_size_range', { min: formatFileSize(minSize), max: formatFileSize(maxSize) }))\n } else if (minSize) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_min_size', { min: formatFileSize(minSize) }))\n }\n // maxSize is already shown inline in the upload zone — no duplicate needed\n\n // Image constraints\n if (imageConstraints) {\n const { minWidth, maxWidth, minHeight, maxHeight, aspectRatio } = imageConstraints\n if (minWidth || minHeight) {\n const w = minWidth ?? '–'\n const h = minHeight ?? '–'\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_dimensions', { width: String(w), height: String(h) }))\n }\n if (maxWidth || maxHeight) {\n const w = maxWidth ?? '–'\n const h = maxHeight ?? '–'\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_max_dimensions', { width: String(w), height: String(h) }))\n }\n if (aspectRatio) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_aspect_ratio', { width: String(aspectRatio.width), height: String(aspectRatio.height) }))\n }\n }\n\n // Video constraints\n if (videoConstraints) {\n if (videoConstraints.maxDuration) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_video_max_duration', { duration: formatDuration(videoConstraints.maxDuration) }))\n }\n }\n\n // Audio constraints\n if (audioConstraints) {\n if (audioConstraints.maxDuration) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_audio_max_duration', { duration: formatDuration(audioConstraints.maxDuration) }))\n }\n }\n\n // Document constraints\n if (documentConstraints) {\n if (documentConstraints.maxPages) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_document_max_pages', { pages: documentConstraints.maxPages }))\n }\n }\n\n // Multiple file constraint\n if (isMultiple && maxFiles) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_max_files', { max: maxFiles }))\n }\n\n return hints\n }, [minSize, maxSize, imageConstraints, videoConstraints, audioConstraints, documentConstraints, isMultiple, maxFiles, tComponent])\n\n const renderConstraintHints = () => {\n if (constraintHints.length === 0) return null\n return (\n <div className=\"flex flex-wrap gap-x-group gap-y-item-xs mt-item-xs\">\n {constraintHints.map((hint, i) => (\n <span key={i} className=\"text-xs text-muted-foreground\">\n {hint}\n </span>\n ))}\n </div>\n )\n }\n\n // ==========================================================================\n // RENDER — Upload zone (drop target + button)\n // ==========================================================================\n\n const renderUploadZone = (compact = false) => (\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n \"relative flex flex-col items-center justify-center rounded-md border-2 border-dashed cursor-pointer\",\n compact ? \"p-card-sm\" : \"p-container\",\n dragOver && \"border-primary bg-primary/5\",\n isUploadInteractionDisabled && \"opacity-[var(--opacity-disabled)] cursor-not-allowed\",\n uploading && !isMultiple && \"pointer-events-none\",\n internalError && \"border-destructive\",\n !isUploadInteractionDisabled && !uploading && \"hover:border-primary hover:bg-primary/5\",\n formRecipe.motion.transition\n )}\n >\n {/* Single mode uploading state */}\n {uploading && !isMultiple ? (\n <>\n <LoadingSpinner size={32} className=\"text-primary mb-element\" aria-hidden=\"true\" />\n <span className=\"text-sm text-muted-foreground\">\n {uploadProgress < 0\n ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'uploading_indeterminate')\n : tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'uploading', { progress: uploadProgress })}\n </span>\n <div className=\"w-full max-w-xs h-1 bg-muted rounded-full mt-element overflow-hidden\">\n {uploadProgress < 0 ? (\n // Indeterminate progress: animated shimmer bar\n <div className=\"h-full w-1/3 bg-primary animate-pulse rounded-full\" />\n ) : (\n <div\n className=\"h-full bg-primary transition-all duration-[var(--motion-duration-fast)]\"\n style={{ width: `${uploadProgress}%` }}\n />\n )}\n </div>\n </>\n ) : (\n <>\n {!compact && <span className=\"mb-element\" aria-hidden=\"true\">{renderIcon(StandardIconReference.UPLOAD, { size: IconSize.XL })}</span>}\n <span className={cn(\"font-medium\", compact ? \"text-xs\" : \"text-sm\")}>\n {compact ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'add_more') : resolvedUploadButtonText}\n </span>\n {!compact && (\n <>\n <span className=\"text-xs text-muted-foreground mt-item-xs\">\n {dragDropLabel}\n </span>\n <span className=\"text-xs text-muted-foreground mt-element\">\n {acceptDescription}\n {maxSize && !minSize && ` • ${tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'max_size', { size: formatFileSize(maxSize) })}`}\n </span>\n {renderConstraintHints()}\n </>\n )}\n </>\n )}\n </div>\n )\n\n // ==========================================================================\n // RENDER — Main\n // ==========================================================================\n\n const canAddMore = isMultiple && (!maxFiles || currentFileIds.length < maxFiles)\n\n /*\n * The provider pickers, mounted in the FRAMEWORK's own upload chrome rather\n * than in an application: every application's file fields get them, and an\n * application that adopted it in one place would have proven the component\n * and left the capability just as unadopted.\n *\n * `ProviderFilePickerHost` renders NOTHING when no live provider carries a\n * picker, which is every application today — so this costs an empty render\n * and no chrome until somebody registers one. The chooser is supplied here\n * rather than left to the host's plain buttons because a provider's display\n * name is an i18n KEY: the host cannot resolve it without depending on the\n * i18n service, and this field already has one.\n */\n const renderProviderPickers = () => (\n <ProviderFilePickerHost\n constraints={providerConstraints}\n onSelect={handleProviderSelections}\n onProviderFailure={handleProviderFailure}\n renderChooser={({ choices, chosen, choose }) => (\n <div role=\"group\" className=\"flex flex-wrap gap-item-xs mt-element\">\n {choices.map((choice) => (\n <Button\n key={choice.providerRef}\n type=\"button\"\n size={ButtonSize.SM}\n variant={choice.providerRef === chosen ? ButtonVariants_Variant.DEFAULT : ButtonVariants_Variant.OUTLINE}\n aria-pressed={choice.providerRef === chosen}\n onClick={() => choose(choice.providerRef)}\n >\n {t(choice.displayNameLabelKey) ?? choice.displayName ?? choice.providerRef}\n </Button>\n ))}\n </div>\n )}\n />\n )\n\n if (!isReady) return null;\n\n return (\n <div ref={ref as React.RefObject<HTMLDivElement>} className={className}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={isMultiple}\n onChange={handleFileChange}\n className=\"hidden\"\n disabled={isUploadInteractionDisabled}\n />\n\n {isMultiple ? (\n // Multiple file mode\n <div className=\"space-y-element\">\n {currentFileIds.length > 0 && renderMultipleFileList()}\n {!isUploadInteractionDisabled && canAddMore && renderUploadZone(currentFileIds.length > 0)}\n {!isUploadInteractionDisabled && currentFileIds.length === 0 && !canAddMore && renderUploadZone(false)}\n {!isUploadInteractionDisabled && canAddMore && renderProviderPickers()}\n </div>\n ) : (\n // Single file mode\n currentFileId\n ? renderSingleFileDisplay(currentFileId, fileMetadata)\n : (hasUploadCapability ? (\n <>\n {renderUploadZone(false)}\n {!isUploadInteractionDisabled && renderProviderPickers()}\n </>\n ) : null)\n )}\n\n {/* Inline crop step — mounted only while a selection on an\n aspect-ratio-constrained field awaits cropping (mount = open). */}\n {pendingCropFile && aspectRatioConstraint && (\n <ImageCrop\n file={pendingCropFile}\n aspectRatio={aspectRatioConstraint}\n maskShape={fileUIPreviewShape}\n maxOutputWidth={imageConstraints?.maxWidth}\n maxOutputHeight={imageConstraints?.maxHeight}\n maxOutputSizeBytes={maxSize}\n allowedMimeTypes={allowedMimeTypes}\n onConfirm={handleCropConfirm}\n onCancel={handleCropCancel}\n onUncroppable={handleUncroppable}\n />\n )}\n </div>\n )\n})\n\n// --- Wrapper ---\n/**\n * Schema-aware FormFieldFile component.\n *\n * This wrapper sits between the generic FormField orchestrator and the preset\n * component. It is the proper boundary for injecting engine-level concerns:\n * - Authenticated HTTP operations (upload, metadata, delete) via httpClient\n * - Component preset resolution via the registry\n *\n * The preset component (presets-components) never imports the HTTP client directly,\n * maintaining separation of concerns. The generic FormField never deals with\n * file-specific HTTP concerns.\n */\nexport const FormFieldFile = forwardRef<FormFieldFileRef, FormFieldFileProps>(\n ({ preset = CorePresetNames.DEFAULT, httpOperations: externalHttpOperations, ...props }, ref) => {\n const { httpClient } = useApplication();\n\n const httpOperations: FileHttpOperations = useMemo(() => {\n if (externalHttpOperations) return externalHttpOperations;\n\n return {\n upload: async (url, formData, options) => {\n const response = await httpClient.uploadFile<any>(url, formData, {\n onUploadProgress: options?.onProgress,\n signal: options?.signal,\n });\n\n if (response?.file?.fileId) {\n return {\n fileId: response.file.fileId,\n metadata: response.file,\n };\n }\n if (response?.fileId) {\n return { fileId: response.fileId, metadata: response.metadata };\n }\n\n throw new Error('upload_failed');\n },\n get: async <T,>(url: string): Promise<T> => {\n return httpClient.get<T>(url);\n },\n delete: async (url: string): Promise<void> => {\n await httpClient.delete(url);\n },\n };\n }, [httpClient, externalHttpOperations]);\n\n const Component = createComponentResolverWithRef<FormFieldFilePresetProps, FormFieldFileRef>(\n FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE,\n 'FormFieldFile'\n )(preset);\n const resolvedProps = { ...props, httpOperations } as FormFieldFilePresetProps;\n return <Component {...resolvedProps} ref={ref} />\n})\nFormFieldFile.displayName = 'FormFieldFile'\n"]}
|
|
1
|
+
{"version":3,"file":"form-field-file.js","sourceRoot":"","sources":["../../../../../src/components/form/fields/form-field-file.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { forwardRef, useMemo } from 'react'\nimport { FrontendComponentType, CorePresetNames } from '@wildo-ai/presets-components-models'\nimport { createComponentResolverWithRef } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport { useApplication } from '~wildo-frontend-lib/core/runtime/useApplication'\nimport type { ControlBaseProps, FileHttpOperations } from '~wildo-frontend-lib/components/form/form-field-types'\n\nimport { cn } from \"~wildo-frontend-lib/core/ui/cn\"\nimport { useUI } from \"~wildo-frontend-lib/core/ui/useUI\"\nimport { useI18n } from \"~wildo-frontend-lib/core/i18n/useI18n\"\nimport { useIconRegistry } from \"~wildo-frontend-lib/core/icons/useIconRegistry\"\nimport { IconSize, StandardIconReference } from \"~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas\"\nimport { LoadingSpinner } from \"~wildo-frontend-lib/components/feedback/loading-spinner\"\nimport { Button, ButtonVariants_Variant } from \"~wildo-frontend-lib/components/actions/button\"\nimport { UIBehavior, FormControlVariant, ButtonSize } from \"@wildo-ai/presets-components-models\"\nimport {\n getFileMetadata,\n getFileUI,\n FileValue,\n SingleFileValue,\n MultipleFileValue,\n FileMetadata,\n FileFieldEndpoints,\n formatFileSize,\n isMimeTypeAllowed,\n getAcceptDescription,\n buildAcceptAttribute,\n FileDisplayNature,\n resolveFileDisplayNature,\n} from \"@wildo-ai/zod-decorators\"\nimport { determineValidationMode, getZodErrorParams, ValidationMode } from \"~wildo-frontend-lib/components/form/validation-errors/form-validation\"\nimport { resolveFormFieldFileProviderConstraints } from './form-field-file-provider-constraints.frontend.utils'\nimport { ProviderFilePickerHost } from '~wildo-frontend-lib/core/external-providers/ProviderFilePickerHost'\nimport { ProviderFrontendSelectionDelivery } from '@wildo-ai/saas-models/public-runtime'\nimport type { ProviderFileSelection } from '@wildo-ai/saas-models/public-runtime'\nimport { ImageCrop } from '~wildo-frontend-lib/components/form/controls/file/image-crop'\nimport { canExportWithinAllowedMimeTypes, isCroppableRasterImageFile } from '~wildo-frontend-lib/components/form/controls/file/image-crop.frontend.utils'\n\n// --- Contract ---\nexport interface FormFieldFilePresetProps extends Omit<ControlBaseProps, 'value' | 'onChange' | 'defaultValue'> {\n value?: FileValue\n onChange?: (value: FileValue | null) => void\n defaultValue?: FileValue\n endpoints: FileFieldEndpoints\n uploadButtonText?: string\n onValidationError?: (error: string | undefined) => void\n replaceButtonText?: string\n httpOperations: FileHttpOperations\n}\n\nexport type FormFieldFileProps = Omit<FormFieldFilePresetProps, 'httpOperations'> & {\n httpOperations?: FileHttpOperations\n} & ComponentPresetProps\n\nexport type FormFieldFileRef = HTMLDivElement\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** State of an individual file being uploaded */\ninterface UploadingFileState {\n /** Temporary ID for tracking (not the server fileId) */\n tempId: string;\n /** Original file name */\n fileName: string;\n /** Upload progress percentage (0-100) */\n progress: number;\n /** Upload status */\n status: 'uploading' | 'done' | 'error';\n /** Error message if status is 'error' */\n error?: string;\n /** Server-returned fileId once upload is complete */\n fileId?: string;\n /** AbortController for cancellation */\n abortController: AbortController;\n}\n\n/** Type guard to check if value is a single file */\nfunction isSingleFileValue(value: FileValue | null | undefined): value is SingleFileValue {\n return value !== null && value !== undefined && 'fileId' in value;\n}\n\n/** Type guard to check if value is multiple files */\nfunction isMultipleFileValue(value: FileValue | null | undefined): value is MultipleFileValue {\n return value !== null && value !== undefined && 'fileIds' in value;\n}\n\n/** Generate a temporary ID for tracking uploads before server assigns fileId */\nlet tempIdCounter = 0;\nfunction generateTempId(): string {\n return `upload-${Date.now()}-${++tempIdCounter}`;\n}\n\n/**\n * Detect if an error was caused by intentional cancellation (AbortController.abort).\n *\n * Axios throws CanceledError with code 'ERR_CANCELED' and message 'canceled'.\n * Native fetch/AbortController throws DOMException with name 'AbortError'.\n * We check both to remain HTTP-client-agnostic.\n */\nfunction isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if ((err as any).code === 'ERR_CANCELED') return true;\n if (err.name === 'AbortError') return true;\n return false;\n}\n\nfunction resolveSingleFileUploadUrl(\n endpoints: FileFieldEndpoints,\n currentFileId: string | null,\n): string | undefined {\n return currentFileId && endpoints.override\n ? endpoints.override\n : endpoints.upload\n}\n\nfunction hasActionableSingleFileEndpoint(\n endpoints: FileFieldEndpoints,\n currentFileId: string | null,\n): boolean {\n return Boolean(resolveSingleFileUploadUrl(endpoints, currentFileId))\n}\n\nfunction hasActionableMultipleFileEndpoint(endpoints: FileFieldEndpoints): boolean {\n return Boolean(endpoints.upload)\n}\n\nfunction getNeutralFileAttachmentLabel(\n filename: string | undefined,\n t: (key: string, params?: Record<string, unknown>) => string | undefined,\n): string {\n if (filename && filename.trim() !== '') {\n return filename;\n }\n\n // Do not expose internal file ids in fallback UI when metadata is unavailable.\n return t('File attached') ?? 'File attached';\n}\n\nfunction getSafeFileMutationErrorMessage(\n fallbackMessage: string,\n _err: unknown,\n): string {\n return fallbackMessage;\n}\n\n/**\n * FormFieldFile component\n *\n * Renders a file upload field with:\n * - Drag and drop zone\n * - File picker button\n * - Current file display (single mode) or file list (multiple mode)\n * - Replace/remove options\n * - Progress tracking per upload\n * - Upload cancellation support\n */\nexport const FormFieldFile_Preset_Default = React.forwardRef<FormFieldFileRef, FormFieldFilePresetProps>(\n ({\n schema,\n name,\n value: controlledValue,\n onChange,\n onBlur,\n defaultValue,\n disabled = false,\n readOnly,\n className,\n validationMode: validationModeProp,\n endpoints,\n uploadButtonText,\n replaceButtonText,\n onValidationError,\n required,\n httpOperations,\n}, ref): React.JSX.Element | null => {\n const { t, tErrorValidation, tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE,\n keys: ['errors_validation'],\n })\n const { frontendProviderRegistry } = useApplication()\n const { renderIcon } = useIconRegistry()\n const { getRecipe } = useUI()\n const formRecipe = getRecipe(UIBehavior.FORM_CONTROL, FormControlVariant.DEFAULT)\n const resolvedUploadButtonText = uploadButtonText ?? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'choose_file')\n const resolvedReplaceButtonText = replaceButtonText ?? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'replace')\n const dragDropLabel = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'drag_and_drop')\n const removeLabel = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'remove')\n const uploadFailedMessage = tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'upload_failed')\n const metadataLoadFailedMessage = t('Unable to load file details') ?? 'Unable to load file details'\n\n // Get file metadata from schema\n const fileSchemaMetadata = getFileMetadata(schema)\n const providerConstraints = resolveFormFieldFileProviderConstraints({\n schema,\n frontendProviderRegistry,\n })\n\n // Get options from metadata\n const allowedMimeTypes = providerConstraints.allowedMimeTypes\n const maxSize = providerConstraints.maxSize\n const minSize = fileSchemaMetadata?.minSize\n const overridable = fileSchemaMetadata?.overridable ?? true\n const accept = allowedMimeTypes ? buildAcceptAttribute(allowedMimeTypes) : undefined\n const isMultiple = fileSchemaMetadata?.multiple ?? false\n const maxFiles = providerConstraints.maxFiles\n const imageConstraints = fileSchemaMetadata?.imageConstraints\n const videoConstraints = fileSchemaMetadata?.videoConstraints\n const audioConstraints = fileSchemaMetadata?.audioConstraints\n const documentConstraints = fileSchemaMetadata?.documentConstraints\n\n // Determine validation mode\n const validationMode = determineValidationMode(schema, validationModeProp)\n\n // Internal state for uncontrolled mode\n const [internalValue, setInternalValue] = React.useState<FileValue | null>(defaultValue ?? null)\n\n // Internal validation error state (Hybrid Pattern - see file header comment)\n const [internalError, setInternalError] = React.useState<string | undefined>()\n\n // P1-T09: Propagate internal errors to parent (FormField) for RHF sync\n React.useEffect(() => {\n onValidationError?.(internalError)\n }, [internalError, onValidationError])\n\n // Clear internal error when value is cleared (form reset or manual clear)\n const prevValueRef = React.useRef(controlledValue)\n React.useEffect(() => {\n const prevValue = prevValueRef.current\n const valueCleared = prevValue !== undefined && (controlledValue === null || controlledValue === undefined)\n if (valueCleared && internalError) {\n setInternalError(undefined)\n }\n prevValueRef.current = controlledValue\n }, [controlledValue, internalError])\n\n // Upload state — supports parallel uploads for multiple file mode\n const [uploadingFiles, setUploadingFiles] = React.useState<Map<string, UploadingFileState>>(new Map())\n // Ref for reading upload state outside of React state updaters (e.g., to abort)\n const uploadingFilesRef = React.useRef(uploadingFiles)\n uploadingFilesRef.current = uploadingFiles\n const [uploadProgress, setUploadProgress] = React.useState(0) // Aggregate progress for single mode\n const [fileMetadataMap, setFileMetadataMap] = React.useState<Map<string, FileMetadata>>(new Map())\n const [dragOver, setDragOver] = React.useState(false)\n\n // File input ref\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n // Controlled ⇔ the caller supplied a change handler (or a defined value).\n //\n // Deciding by VALUE alone is unsafe for a caller that legitimately passes `undefined` — an empty\n // file field on a create surface, or one whose value was cleared: the control would conclude it\n // is uncontrolled, keep the upload result in private internal state and never call `onChange`,\n // so the form would submit without the file the user just uploaded. The tier-1 field wrappers\n // were hardened against this class; this control renders directly and was not.\n const isControlled = onChange !== undefined || controlledValue !== undefined\n const currentValue = controlledValue ?? internalValue\n\n // Derived state\n const uploading = uploadingFiles.size > 0\n const currentFileId = isSingleFileValue(currentValue) ? currentValue.fileId : null\n const currentFileIds = isMultipleFileValue(currentValue) ? currentValue.fileIds : []\n const hasUploadCapability = isMultiple\n ? hasActionableMultipleFileEndpoint(endpoints)\n : hasActionableSingleFileEndpoint(endpoints, currentFileId)\n\n // Ref to track latest currentFileIds — prevents stale closure in multi-file upload.\n // Without this, two rapid batch uploads can lose IDs: Batch 1 and Batch 2 both capture\n // the same currentFileIds from the closure, then Batch 2's result overwrites Batch 1's.\n const currentFileIdsRef = React.useRef(currentFileIds)\n currentFileIdsRef.current = currentFileIds\n\n // Stable key for metadata fetch dependency (avoids inline .join() in effect deps)\n const fileIdsKey = React.useMemo(() => currentFileIds.join(','), [currentFileIds])\n\n // Ref for metadata map to avoid stale reads in fetch effect cache check\n const fileMetadataMapRef = React.useRef(fileMetadataMap)\n fileMetadataMapRef.current = fileMetadataMap\n\n // Get first metadata for single file mode display\n const fileMetadata = currentFileId ? fileMetadataMap.get(currentFileId) ?? null : null\n\n // ==========================================================================\n // HTTP OPERATIONS — delegates to the injected httpOperations interface\n // ==========================================================================\n\n const authenticatedGet = React.useCallback(\n async <T,>(url: string): Promise<T> => httpOperations.get<T>(url),\n [httpOperations]\n )\n\n const authenticatedDelete = React.useCallback(\n async (url: string): Promise<void> => httpOperations.delete(url),\n [httpOperations]\n )\n\n // ==========================================================================\n // METADATA FETCHING — for existing files\n // ==========================================================================\n\n React.useEffect(() => {\n if (!endpoints.getMetadata) return\n\n // Determine which fileIds need metadata fetched\n const idsToFetch: string[] = []\n if (currentFileId) {\n idsToFetch.push(currentFileId)\n }\n if (currentFileIds.length > 0) {\n idsToFetch.push(...currentFileIds)\n }\n\n if (idsToFetch.length === 0) {\n setFileMetadataMap(new Map())\n setInternalError((current) => current === metadataLoadFailedMessage ? undefined : current)\n return\n }\n\n let cancelled = false\n\n const fetchAll = async () => {\n const newMap = new Map<string, FileMetadata>()\n let metadataFetchFailed = false\n // Read from ref to get the latest cached metadata (avoids stale closure)\n const cachedMap = fileMetadataMapRef.current\n\n await Promise.allSettled(\n idsToFetch.map(async (fileId) => {\n // Skip if we already have metadata for this file (read from ref for freshness)\n if (cachedMap.has(fileId)) {\n newMap.set(fileId, cachedMap.get(fileId)!)\n return\n }\n\n try {\n // Build URL: endpoints.getMetadata is a template base, append /{fileId}/metadata\n // Backend route: GET /files/:fileId/metadata\n const url = `${endpoints.getMetadata}/${encodeURIComponent(fileId)}/metadata`\n const data = await authenticatedGet<FileMetadata>(url)\n if (!cancelled) {\n newMap.set(fileId, data)\n }\n } catch {\n metadataFetchFailed = true\n console.warn('Unable to load file metadata for one or more files.')\n }\n })\n )\n\n if (!cancelled) {\n setFileMetadataMap(newMap)\n setInternalError((current) => (\n metadataFetchFailed\n ? metadataLoadFailedMessage\n : (current === metadataLoadFailedMessage ? undefined : current)\n ))\n }\n }\n\n fetchAll()\n\n return () => { cancelled = true }\n }, [currentFileId, fileIdsKey, endpoints.getMetadata, authenticatedGet, metadataLoadFailedMessage])\n\n // ==========================================================================\n // VALIDATION\n // ==========================================================================\n\n /**\n * MIME check alone — shared between the plain upload path (via `validateFile`)\n * and the crop path, which must reject a disallowed type BEFORE opening the\n * crop dialog but must NOT pre-check byte size (shrinking an oversized\n * original under the ceiling is precisely what the crop step is for).\n */\n const validateFileMimeType = React.useCallback((file: File): string | undefined => {\n if (allowedMimeTypes && allowedMimeTypes.length > 0) {\n if (!isMimeTypeAllowed(file.type, allowedMimeTypes)) {\n const accepted = getAcceptDescription(allowedMimeTypes)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_type_not_allowed', { accepted })\n }\n }\n return undefined\n }, [allowedMimeTypes, tComponent])\n\n const validateFile = React.useCallback((file: File): string | undefined => {\n // Check MIME type\n const mimeError = validateFileMimeType(file)\n if (mimeError) {\n return mimeError\n }\n\n // Check file size — maximum\n if (maxSize && file.size > maxSize) {\n const max = formatFileSize(maxSize)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_too_large', { max })\n }\n\n // Check file size — minimum\n if (minSize && file.size < minSize) {\n const min = formatFileSize(minSize)\n return tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'file_too_small', { min })\n }\n\n return undefined\n }, [validateFileMimeType, maxSize, minSize, tComponent])\n\n // ==========================================================================\n // UPLOAD — single file\n // ==========================================================================\n\n /** Upload a single file via httpOperations */\n const uploadSingleFile = React.useCallback(async (\n file: File,\n uploadUrl: string,\n isReplacing: boolean,\n existingFileId: string | null,\n onProgress: (percent: number) => void,\n signal?: AbortSignal,\n ): Promise<{ fileId: string; metadata?: FileMetadata }> => {\n const formData = new FormData()\n formData.append('file', file)\n if (isReplacing && existingFileId) {\n formData.append('fileId', existingFileId)\n }\n\n return httpOperations.upload(uploadUrl, formData, { onProgress, signal })\n }, [httpOperations])\n\n // ==========================================================================\n // UPLOAD HANDLERS — single mode\n // ==========================================================================\n\n const handleSingleFileUpload = React.useCallback(async (file: File) => {\n const uploadUrl = resolveSingleFileUploadUrl(endpoints, currentFileId)\n if (!uploadUrl) {\n setInternalError(t('File uploads are unavailable for this field') ?? 'File uploads are unavailable for this field')\n return\n }\n\n // Validate first\n const validationError = validateFile(file)\n if (validationError) {\n setInternalError(validationError)\n return\n }\n\n const tempId = generateTempId()\n const abortController = new AbortController()\n\n setUploadingFiles(new Map([[tempId, {\n tempId,\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n abortController,\n }]]))\n setUploadProgress(0)\n setInternalError(undefined)\n\n try {\n const isReplacing = !!currentFileId\n\n const result = await uploadSingleFile(\n file,\n uploadUrl,\n isReplacing,\n currentFileId,\n (percent) => {\n setUploadProgress(percent)\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, progress: percent })\n return next\n })\n },\n abortController.signal,\n )\n\n // Build new value\n const newValue: FileValue = {\n fileId: result.fileId,\n updatedAt: new Date(),\n }\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Update metadata cache\n if (result.metadata) {\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.set(result.fileId, result.metadata!)\n return next\n })\n }\n\n // Validate the new value against schema\n if (validationMode !== 'onSubmit') {\n const schemaResult = schema.safeParse(newValue)\n if (!schemaResult.success) {\n const firstIssue = schemaResult.error.issues[0]\n if (firstIssue) {\n const params = { ...getZodErrorParams(firstIssue), message: firstIssue.message }\n const translated = tErrorValidation(firstIssue.code, 'msg', params)\n setInternalError(translated)\n }\n }\n }\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n } finally {\n setUploadingFiles(new Map())\n setUploadProgress(0)\n }\n }, [currentFileId, endpoints, isControlled, onChange, t, validateFile, validationMode, schema, tErrorValidation, uploadSingleFile])\n\n // ==========================================================================\n // UPLOAD HANDLERS — multiple mode\n // ==========================================================================\n\n const handleMultipleFilesUpload = React.useCallback(async (files: File[]) => {\n if (!hasActionableMultipleFileEndpoint(endpoints)) {\n setInternalError(t('File uploads are unavailable for this field') ?? 'File uploads are unavailable for this field')\n return\n }\n\n // Use ref to get latest file IDs — prevents stale closure when batches overlap.\n // Without this, two rapid uploads both see the same old currentFileIds,\n // and the second batch's result would overwrite the first batch's new IDs.\n const latestFileIds = currentFileIdsRef.current\n\n // Validate all files first\n const currentCount = latestFileIds.length\n if (maxFiles && currentCount + files.length > maxFiles) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'too_many_files', { max: maxFiles }))\n return\n }\n\n const validFiles: File[] = []\n for (const file of files) {\n const error = validateFile(file)\n if (error) {\n setInternalError(error)\n return\n }\n validFiles.push(file)\n }\n\n setInternalError(undefined)\n\n // Create upload state for each file\n const initialStates = new Map<string, UploadingFileState>()\n const fileEntries: { tempId: string; file: File; abortController: AbortController }[] = []\n\n for (const file of validFiles) {\n const tempId = generateTempId()\n const abortController = new AbortController()\n initialStates.set(tempId, {\n tempId,\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n abortController,\n })\n fileEntries.push({ tempId, file, abortController })\n }\n\n setUploadingFiles(prev => {\n const next = new Map<string, UploadingFileState>()\n // Keep only in-progress uploads from previous batches; discard stale errors\n for (const [id, state] of prev) {\n if (state.status === 'uploading') {\n next.set(id, state)\n }\n }\n // Add new uploads\n for (const [id, state] of initialStates) {\n next.set(id, state)\n }\n return next\n })\n\n // Upload all files in parallel\n const results = await Promise.allSettled(\n fileEntries.map(async ({ tempId, file, abortController }) => {\n try {\n const result = await uploadSingleFile(\n file,\n endpoints.upload,\n false,\n null,\n (percent) => {\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, progress: percent })\n return next\n })\n },\n abortController.signal,\n )\n\n // Mark as done\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, { ...state, status: 'done', fileId: result.fileId, progress: 100 })\n return next\n })\n\n // Cache metadata\n if (result.metadata) {\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.set(result.fileId, result.metadata!)\n return next\n })\n }\n\n return result.fileId\n } catch (err) {\n if (isCancellationError(err)) {\n setUploadingFiles(prev => {\n const next = new Map(prev)\n next.delete(tempId)\n return next\n })\n throw err\n }\n\n setUploadingFiles(prev => {\n const next = new Map(prev)\n const state = next.get(tempId)\n if (state) next.set(tempId, {\n ...state,\n status: 'error',\n error: getSafeFileMutationErrorMessage(uploadFailedMessage, err)\n })\n return next\n })\n throw err\n }\n })\n )\n\n // Collect successful fileIds\n const newFileIds: string[] = []\n for (const result of results) {\n if (result.status === 'fulfilled') {\n newFileIds.push(result.value)\n }\n }\n\n if (newFileIds.length > 0) {\n // Read latest file IDs via ref to avoid stale closure\n const updatedFileIds = [...currentFileIdsRef.current, ...newFileIds]\n const newValue: MultipleFileValue = {\n fileIds: updatedFileIds,\n updatedAt: new Date(),\n }\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n // Report errors if any uploads failed (exclude intentional cancellations)\n const failedCount = results.filter(r =>\n r.status === 'rejected' && !isCancellationError(r.reason)\n ).length\n if (failedCount > 0 && failedCount < files.length) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'some_uploads_failed', { failed: failedCount, total: files.length }))\n } else if (failedCount === files.length) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'upload_failed'))\n }\n\n // Clear completed uploads from state (keep errors for display)\n setUploadingFiles(prev => {\n const next = new Map(prev)\n for (const [id, state] of next) {\n if (state.status === 'done') next.delete(id)\n }\n return next\n })\n }, [endpoints, isControlled, maxFiles, onChange, tComponent, uploadSingleFile, validateFile, uploadFailedMessage])\n\n // ==========================================================================\n // CROP STEP — aspect-ratio-constrained image fields\n // ==========================================================================\n\n /**\n * Aspect-ratio constraint → inline crop step activation.\n *\n * When the authored `imageConstraints` declare an aspect ratio (ANY ratio —\n * a 1:1 avatar is just the first case, never a special case), a selected\n * raster image is routed through the injectable `ImageCrop` step\n * (pan/zoom + crop to the required ratio, client-side downscale to the\n * declared max dimensions, re-encode under the size ceiling) BEFORE the\n * normal upload pipeline. Fields without an aspect-ratio constraint keep\n * the direct-upload flow untouched.\n *\n * Boundaries, decided rather than omitted:\n * - Single-file mode only. A multi-file field with an aspect constraint\n * would need a per-file crop queue; until that UX exists, multi-file\n * selections keep the current validate-and-upload flow (the constraint\n * still holds server-side).\n * - SVG and browser-undecodable formats (e.g. HEIC) bypass the crop step\n * via `onUncroppable` and fall back to the plain upload path, keeping\n * server-side validation the authority instead of silently rasterizing\n * or hard-failing in the client.\n */\n const aspectRatioConstraint = imageConstraints?.aspectRatio\n const fileUIPreviewShape = getFileUI(schema)?.display?.preview?.shape\n\n const [pendingCropFile, setPendingCropFile] = React.useState<File | null>(null)\n\n const handleCropConfirm = React.useCallback((croppedFile: File) => {\n setPendingCropFile(null)\n handleSingleFileUpload(croppedFile)\n }, [handleSingleFileUpload])\n\n const handleCropCancel = React.useCallback(() => {\n setPendingCropFile(null)\n }, [])\n\n /** Decode failure → plain upload with the ORIGINAL file (see JSDoc above). */\n const handleUncroppable = React.useCallback((originalFile: File) => {\n setPendingCropFile(null)\n handleSingleFileUpload(originalFile)\n }, [handleSingleFileUpload])\n\n // ==========================================================================\n // UNIFIED FILE HANDLER\n // ==========================================================================\n\n const handleFiles = React.useCallback((files: File[]) => {\n if (files.length === 0) return\n\n if (isMultiple) {\n handleMultipleFilesUpload(files)\n } else {\n const file = files[0]\n // The allow-list gate keeps fields that accept no canvas-encodable\n // format (e.g. GIF-only) on the plain upload path — the cropper could\n // only emit a type the field's own MIME validation would then reject.\n if (aspectRatioConstraint && isCroppableRasterImageFile(file) && canExportWithinAllowedMimeTypes(allowedMimeTypes)) {\n // Reject a disallowed MIME type before opening the dialog; size is\n // deliberately NOT pre-checked — the crop export enforces it.\n const mimeError = validateFileMimeType(file)\n if (mimeError) {\n setInternalError(mimeError)\n return\n }\n setInternalError(undefined)\n setPendingCropFile(file)\n return\n }\n handleSingleFileUpload(file)\n }\n }, [isMultiple, handleMultipleFilesUpload, handleSingleFileUpload, aspectRatioConstraint, validateFileMimeType, allowedMimeTypes])\n\n // ==========================================================================\n // PROVIDER FILE PICKERS\n // ==========================================================================\n\n /*\n * A provider's picker hands back one of THREE delivery kinds, and the field —\n * not the host — decides what each one means. Two of them end in the same\n * place as a local selection: `handleFiles`, so MIME/size validation, the\n * crop step and the upload pipeline are the ones already written here rather\n * than a second, provider-only path that would drift from them.\n *\n * The third, REMOTE_REFERENCE, carries no bytes: the file STAYS at the vendor\n * and only the application backend can resolve the id (#394 P5). It goes to\n * the SAME endpoint an upload does, as a JSON body, and the backend verifies\n * the reference at the vendor as this person, holds it to the field's\n * constraints, and creates the row in the vendor's storage. What comes back\n * is a fileId, exactly as an upload's, so the value is committed by the same\n * code. The host has already refused any selection that contradicts the\n * provider's declaration, and the chooser offered this provider only because\n * the field accepts its storage — so a refusal here is the vendor's or the\n * backend's, and is shown as one message.\n */\n const linkRemoteSelections = React.useCallback(\n async (providerRef: string, selections: ReadonlyArray<Extract<ProviderFileSelection, { kind: ProviderFrontendSelectionDelivery.REMOTE_REFERENCE }>>) => {\n const toLink = isMultiple ? selections : selections.slice(0, 1)\n const uploadUrl = isMultiple ? endpoints.upload : resolveSingleFileUploadUrl(endpoints, currentFileId)\n if (!uploadUrl) {\n setInternalError(t('File uploads are unavailable for this field') ?? 'File uploads are unavailable for this field')\n return\n }\n setInternalError(undefined)\n\n const results = await Promise.allSettled(\n toLink.map(async (selection) => {\n const result = await httpOperations.linkRemoteReference(uploadUrl, {\n remoteReference: {\n providerRef,\n externalId: selection.externalId,\n ...(selection.displayName !== undefined ? { displayName: selection.displayName } : {}),\n ...(selection.mimeType !== undefined ? { mimeType: selection.mimeType } : {}),\n ...(selection.sizeBytes !== undefined ? { sizeBytes: selection.sizeBytes } : {}),\n },\n })\n if (result.metadata) {\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.set(result.fileId, result.metadata!)\n return next\n })\n }\n return result.fileId\n }),\n )\n\n const linkedFileIds = results.flatMap((result) => (result.status === 'fulfilled' ? [result.value] : []))\n if (linkedFileIds.length > 0) {\n const newValue: FileValue = isMultiple\n ? { fileIds: [...currentFileIdsRef.current, ...linkedFileIds], updatedAt: new Date() }\n : { fileId: linkedFileIds[0]!, updatedAt: new Date() }\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n if (linkedFileIds.length < toLink.length) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_link_failed'))\n }\n },\n [currentFileId, endpoints, httpOperations, isControlled, isMultiple, onChange, t, tComponent],\n )\n\n const handleProviderSelections = React.useCallback(\n async (providerRef: string, selections: readonly ProviderFileSelection[]) => {\n const files: File[] = []\n const remoteReferences: Array<Extract<ProviderFileSelection, { kind: ProviderFrontendSelectionDelivery.REMOTE_REFERENCE }>> = []\n let sawFetchFailure = false\n\n for (const selection of selections) {\n if (selection.kind === ProviderFrontendSelectionDelivery.BROWSER_READABLE_FILE) {\n files.push(selection.file)\n continue\n }\n if (selection.kind === ProviderFrontendSelectionDelivery.BROWSER_READABLE_URL) {\n try {\n // The url is fetchable by the browser BY DECLARATION — its origin has\n // to be admitted by the surface's composed CSP, which is the\n // application's decision and not something this field can check. A\n // blocked origin therefore arrives here as an ordinary fetch failure.\n const response = await fetch(selection.url)\n if (!response.ok) {\n sawFetchFailure = true\n continue\n }\n const blob = await response.blob()\n files.push(new File([blob], selection.displayName ?? 'file', { type: selection.mimeType ?? blob.type }))\n } catch {\n sawFetchFailure = true\n }\n continue\n }\n remoteReferences.push(selection)\n }\n\n if (remoteReferences.length > 0) {\n await linkRemoteSelections(providerRef, remoteReferences)\n }\n if (sawFetchFailure && files.length === 0) {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_fetch_failed'))\n return\n }\n if (files.length === 0) return\n\n setInternalError(sawFetchFailure ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_fetch_failed') : undefined)\n handleFiles(files)\n },\n [handleFiles, linkRemoteSelections, tComponent],\n )\n\n /*\n * A picker that failed and a picker that contradicted its own declaration\n * reach here as one message, because they are one thing to the person looking\n * at the field. The distinction that matters to whoever wrote the provider is\n * carried in the rejection the host built, not in what a user reads.\n */\n const handleProviderFailure = React.useCallback(() => {\n setInternalError(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'provider_picker_failed'))\n }, [tComponent])\n\n // Handle file input change\n const handleFileChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files && files.length > 0) {\n handleFiles(Array.from(files))\n }\n // Reset input so same file can be selected again\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [handleFiles])\n\n // Effective disabled includes readOnly for interactive elements\n const isInteractionDisabled = disabled || readOnly\n const isUploadInteractionDisabled = isInteractionDisabled || !hasUploadCapability\n\n // Handle drag and drop\n const handleDragOver = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!isUploadInteractionDisabled && !uploading) {\n setDragOver(true)\n }\n }, [isUploadInteractionDisabled, uploading])\n\n const handleDragLeave = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOver(false)\n }, [])\n\n const handleDrop = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOver(false)\n\n if (isUploadInteractionDisabled || uploading) return\n\n const files = e.dataTransfer.files\n if (files && files.length > 0) {\n handleFiles(Array.from(files))\n }\n }, [isUploadInteractionDisabled, uploading, handleFiles])\n\n // Handle remove single file\n const handleRemoveSingle = React.useCallback(async () => {\n if (!currentFileId) return\n\n if (endpoints.delete) {\n try {\n // Backend route: DELETE /files/:fileId\n const url = `${endpoints.delete}/${encodeURIComponent(currentFileId)}`\n await authenticatedDelete(url)\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n return\n }\n }\n\n setInternalError(undefined)\n\n if (!isControlled) {\n setInternalValue(null)\n }\n\n onChange?.(null)\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.delete(currentFileId)\n return next\n })\n }, [currentFileId, endpoints, isControlled, onChange, authenticatedDelete, uploadFailedMessage])\n\n // Handle remove file from multiple list.\n // Uses currentFileIdsRef to avoid stale closure: two rapid removes would both\n // capture the same closure value, and the second would re-add the file removed by the first.\n const handleRemoveFromMultiple = React.useCallback(async (fileId: string) => {\n if (endpoints.delete) {\n try {\n const url = `${endpoints.delete}/${encodeURIComponent(fileId)}`\n await authenticatedDelete(url)\n } catch (err) {\n if (isCancellationError(err)) return\n setInternalError(getSafeFileMutationErrorMessage(uploadFailedMessage, err))\n return\n }\n }\n\n setInternalError(undefined)\n\n // Read latest file IDs via ref — prevents lost removals during rapid clicks\n const updatedIds = currentFileIdsRef.current.filter(id => id !== fileId)\n const newValue: FileValue | null = updatedIds.length > 0\n ? { fileIds: updatedIds, updatedAt: new Date() }\n : null\n\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n setFileMetadataMap(prev => {\n const next = new Map(prev)\n next.delete(fileId)\n return next\n })\n }, [endpoints, isControlled, onChange, authenticatedDelete, uploadFailedMessage])\n\n // Cancel a specific upload.\n // Side effect (abort) is performed BEFORE the state update to comply with\n // React's requirement that state updater functions be pure.\n const handleCancelUpload = React.useCallback((tempId: string) => {\n // Read current state via ref (no side effect inside updater)\n const state = uploadingFilesRef.current.get(tempId)\n if (state) {\n state.abortController.abort()\n }\n\n setUploadingFiles(prev => {\n const next = new Map(prev)\n next.delete(tempId)\n return next\n })\n }, [])\n\n // Handle click on drop zone\n const handleClick = React.useCallback(() => {\n if (!isUploadInteractionDisabled && !uploading) {\n fileInputRef.current?.click()\n }\n }, [isUploadInteractionDisabled, uploading])\n\n // Get file icon reference based on MIME type (consistent with display-field-file.tsx)\n const getFileIconRef = (mimeType?: string): StandardIconReference => {\n if (!mimeType) return StandardIconReference.FILE\n if (mimeType.startsWith('image/')) return StandardIconReference.FILE_IMAGE\n if (mimeType.startsWith('video/')) return StandardIconReference.FILE_VIDEO\n if (mimeType.startsWith('audio/')) return StandardIconReference.FILE_AUDIO\n if (mimeType === 'application/pdf') return StandardIconReference.FILE_TEXT\n if (mimeType.includes('spreadsheet') || mimeType.includes('excel')) return StandardIconReference.FILE_SPREADSHEET\n if (mimeType.includes('presentation') || mimeType.includes('powerpoint')) return StandardIconReference.FILE_PRESENTATION\n if (mimeType.includes('document') || mimeType.includes('word')) return StandardIconReference.FILE_TEXT\n if (mimeType.includes('zip') || mimeType.includes('rar') || mimeType.includes('7z')) return StandardIconReference.FILE_ARCHIVE\n return StandardIconReference.FILE\n }\n\n /** Render a file icon for the given MIME type at the specified size */\n const renderFileIcon = (mimeType?: string, size: IconSize = IconSize.MD): React.ReactNode => {\n return renderIcon(getFileIconRef(mimeType), { size })\n }\n\n const acceptDescription = getAcceptDescription(allowedMimeTypes)\n\n // ==========================================================================\n // RENDER — Nature detection for preview routing\n // ==========================================================================\n\n /** Resolve the display nature using the shared utility from zod-decorators */\n const schemaNature = fileSchemaMetadata?.nature\n\n // ==========================================================================\n // RENDER — File action buttons (shared between single + multi displays)\n // ==========================================================================\n\n const renderFileActions = (onRemove: () => void, compact = false) => (\n !isInteractionDisabled ? (\n <div className={cn(\"flex items-center gap-element\", compact ? \"flex-shrink-0\" : \"\")}>\n {!compact && overridable && hasUploadCapability && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.OUTLINE}\n size={ButtonSize.SM}\n onClick={handleClick}\n disabled={uploading}\n >\n {resolvedReplaceButtonText}\n </Button>\n )}\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.SM}\n onClick={onRemove}\n disabled={uploading}\n className={cn(\"text-destructive hover:text-destructive\", compact && \"h-6 w-6 p-0\")}\n aria-label={removeLabel}\n title={removeLabel}\n >\n {renderIcon(StandardIconReference.CLOSE, { size: IconSize.SM })}\n </Button>\n </div>\n ) : null\n )\n\n // ==========================================================================\n // RENDER — File info line (filename, size, extension — shared)\n // ==========================================================================\n\n const renderFileInfo = (fileId: string, meta: FileMetadata | null, compact = false) => (\n <div className={cn(\"min-w-0\", compact ? \"\" : \"flex-1\")}>\n <div className=\"flex items-center gap-element\">\n {meta?.url ? (\n <a\n href={meta.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"font-medium text-primary hover:underline truncate\", compact && \"text-sm\")}\n >\n {meta.filename}\n </a>\n ) : (\n <span className={cn(\"font-medium truncate\", compact && \"text-sm\")}>\n {getNeutralFileAttachmentLabel(meta?.filename, t)}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-group text-xs text-muted-foreground mt-0.5\">\n {meta?.size !== undefined && (\n <span>{formatFileSize(meta.size)}</span>\n )}\n {meta?.mimeType && (\n <span className=\"uppercase\">{meta.extension || meta.mimeType.split('/').pop()}</span>\n )}\n {meta?.width && meta?.height && (\n <span>{meta.width}×{meta.height}</span>\n )}\n </div>\n </div>\n )\n\n // ==========================================================================\n // RENDER — Nature-specific previews\n // ==========================================================================\n\n const renderImagePreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 overflow-hidden\">\n <div className=\"relative\">\n <img\n src={meta.url || meta.thumbnailUrl || ''}\n alt={meta.filename}\n className=\"w-full max-h-64 object-contain bg-checkerboard\"\n loading=\"lazy\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none' }}\n />\n </div>\n <div className=\"flex items-center gap-group p-card-sm\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n </div>\n )\n\n const renderVideoPreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 overflow-hidden\">\n <video\n src={meta.url}\n controls\n className=\"w-full max-h-64 bg-black\"\n poster={meta.thumbnailUrl}\n preload=\"metadata\"\n />\n <div className=\"flex items-center gap-group p-card-sm\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n </div>\n )\n\n const renderAudioPreview = (meta: FileMetadata) => (\n <div className=\"rounded-md border bg-muted/30 p-card-sm space-y-element\">\n <div className=\"flex items-center gap-group\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n {renderFileInfo('', meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n <audio\n src={meta.url}\n controls\n className=\"w-full h-8\"\n preload=\"metadata\"\n />\n </div>\n )\n\n // ==========================================================================\n // RENDER — Single file display (nature-aware)\n // ==========================================================================\n\n const renderSingleFileDisplay = (fileId: string, meta: FileMetadata | null) => {\n if (!meta) {\n // No metadata yet — show generic card\n return (\n <div className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(undefined, IconSize.LG)}</span>\n {renderFileInfo(fileId, null)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n )\n }\n\n const nature = resolveFileDisplayNature(schemaNature, meta.mimeType)\n\n // Nature-specific rendering\n if (nature === FileDisplayNature.IMAGE && (meta.url || meta.thumbnailUrl)) {\n return renderImagePreview(meta)\n }\n if (nature === FileDisplayNature.VIDEO && meta.url) {\n return renderVideoPreview(meta)\n }\n if (nature === FileDisplayNature.AUDIO && meta.url) {\n return renderAudioPreview(meta)\n }\n\n // Generic / document fallback — compact card\n return (\n <div className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.LG)}</span>\n {renderFileInfo(fileId, meta)}\n {renderFileActions(handleRemoveSingle)}\n </div>\n )\n }\n\n // ==========================================================================\n // RENDER — Multiple file list\n // ==========================================================================\n\n /** Render a single item within the multiple-file list */\n const renderMultipleFileItem = (fileId: string, meta: FileMetadata | undefined) => {\n const nature = resolveFileDisplayNature(schemaNature, meta?.mimeType)\n const onRemove = () => handleRemoveFromMultiple(fileId)\n\n // Compact image preview — thumbnail inline\n if (nature === FileDisplayNature.IMAGE && meta && (meta.url || meta.thumbnailUrl)) {\n return (\n <div key={fileId} className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <img\n src={meta.thumbnailUrl || meta.url || ''}\n alt={meta.filename}\n className=\"h-12 w-12 rounded object-cover flex-shrink-0\"\n loading=\"lazy\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none' }}\n />\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n )\n }\n\n // Compact audio preview — inline player\n if (nature === FileDisplayNature.AUDIO && meta?.url) {\n return (\n <div key={fileId} className=\"rounded-md border bg-muted/30 p-card-sm space-y-item-xs\">\n <div className=\"flex items-center gap-group\">\n <span aria-hidden=\"true\">{renderFileIcon(meta.mimeType, IconSize.MD)}</span>\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n <audio src={meta.url} controls className=\"w-full h-8\" preload=\"metadata\" />\n </div>\n )\n }\n\n // Generic compact card (video, document, unknown)\n return (\n <div key={fileId} className=\"flex items-center gap-group p-card-sm rounded-md border bg-muted/30\">\n <span aria-hidden=\"true\">{renderFileIcon(meta?.mimeType, IconSize.MD)}</span>\n <div className=\"flex-1 min-w-0\">\n {renderFileInfo(fileId, meta ?? null, true)}\n </div>\n {renderFileActions(onRemove, true)}\n </div>\n )\n }\n\n const renderMultipleFileList = () => (\n <div className=\"space-y-element\">\n {/* Existing files */}\n {currentFileIds.map((fileId) => {\n const meta = fileMetadataMap.get(fileId)\n return renderMultipleFileItem(fileId, meta)\n })}\n\n {/* In-progress uploads */}\n {Array.from(uploadingFiles.values()).map((uploadState) => (\n <div key={uploadState.tempId} className=\"flex items-center gap-group p-card-sm rounded-md border border-primary/20 bg-primary/5\">\n {uploadState.status === 'uploading' && (\n <LoadingSpinner size={20} className=\"text-primary flex-shrink-0\" aria-hidden=\"true\" />\n )}\n {uploadState.status === 'error' && (\n <span className=\"text-destructive flex-shrink-0\" aria-hidden=\"true\">{renderIcon(StandardIconReference.WARNING, { size: IconSize.MD })}</span>\n )}\n <div className=\"flex-1 min-w-0\">\n <span className=\"font-medium text-sm truncate block\">{uploadState.fileName}</span>\n {uploadState.status === 'uploading' && (\n <div className=\"w-full h-1 bg-muted rounded-full mt-1 overflow-hidden\">\n {uploadState.progress < 0 ? (\n <div className=\"h-full w-1/3 bg-primary animate-pulse rounded-full\" />\n ) : (\n <div\n className=\"h-full bg-primary transition-all duration-[var(--motion-duration-fast)]\"\n style={{ width: `${uploadState.progress}%` }}\n />\n )}\n </div>\n )}\n {uploadState.status === 'error' && uploadState.error && (\n <span className=\"text-xs text-destructive\">{uploadState.error}</span>\n )}\n </div>\n {uploadState.status === 'uploading' && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.SM}\n onClick={() => handleCancelUpload(uploadState.tempId)}\n className=\"text-muted-foreground hover:text-destructive h-6 w-6 p-0\"\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'cancel')}\n title={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'cancel')}\n >\n {renderIcon(StandardIconReference.CLOSE, { size: IconSize.SM })}\n </Button>\n )}\n </div>\n ))}\n </div>\n )\n\n // ==========================================================================\n // RENDER — Constraint hints (below upload area)\n // ==========================================================================\n\n /** Format seconds into human-readable duration */\n const formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`\n if (seconds < 3600) return `${Math.floor(seconds / 60)} min`\n const h = Math.floor(seconds / 3600)\n const m = Math.floor((seconds % 3600) / 60)\n return m > 0 ? `${h}h ${m}min` : `${h}h`\n }\n\n const constraintHints = React.useMemo(() => {\n const hints: string[] = []\n\n // Size constraints\n if (minSize && maxSize) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_size_range', { min: formatFileSize(minSize), max: formatFileSize(maxSize) }))\n } else if (minSize) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_min_size', { min: formatFileSize(minSize) }))\n }\n // maxSize is already shown inline in the upload zone — no duplicate needed\n\n // Image constraints\n if (imageConstraints) {\n const { minWidth, maxWidth, minHeight, maxHeight, aspectRatio } = imageConstraints\n if (minWidth || minHeight) {\n const w = minWidth ?? '–'\n const h = minHeight ?? '–'\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_dimensions', { width: String(w), height: String(h) }))\n }\n if (maxWidth || maxHeight) {\n const w = maxWidth ?? '–'\n const h = maxHeight ?? '–'\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_max_dimensions', { width: String(w), height: String(h) }))\n }\n if (aspectRatio) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_image_aspect_ratio', { width: String(aspectRatio.width), height: String(aspectRatio.height) }))\n }\n }\n\n // Video constraints\n if (videoConstraints) {\n if (videoConstraints.maxDuration) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_video_max_duration', { duration: formatDuration(videoConstraints.maxDuration) }))\n }\n }\n\n // Audio constraints\n if (audioConstraints) {\n if (audioConstraints.maxDuration) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_audio_max_duration', { duration: formatDuration(audioConstraints.maxDuration) }))\n }\n }\n\n // Document constraints\n if (documentConstraints) {\n if (documentConstraints.maxPages) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_document_max_pages', { pages: documentConstraints.maxPages }))\n }\n }\n\n // Multiple file constraint\n if (isMultiple && maxFiles) {\n hints.push(tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'constraint_max_files', { max: maxFiles }))\n }\n\n return hints\n }, [minSize, maxSize, imageConstraints, videoConstraints, audioConstraints, documentConstraints, isMultiple, maxFiles, tComponent])\n\n const renderConstraintHints = () => {\n if (constraintHints.length === 0) return null\n return (\n <div className=\"flex flex-wrap gap-x-group gap-y-item-xs mt-item-xs\">\n {constraintHints.map((hint, i) => (\n <span key={i} className=\"text-xs text-muted-foreground\">\n {hint}\n </span>\n ))}\n </div>\n )\n }\n\n // ==========================================================================\n // RENDER — Upload zone (drop target + button)\n // ==========================================================================\n\n const renderUploadZone = (compact = false) => (\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n \"relative flex flex-col items-center justify-center rounded-md border-2 border-dashed cursor-pointer\",\n compact ? \"p-card-sm\" : \"p-container\",\n dragOver && \"border-primary bg-primary/5\",\n isUploadInteractionDisabled && \"opacity-[var(--opacity-disabled)] cursor-not-allowed\",\n uploading && !isMultiple && \"pointer-events-none\",\n internalError && \"border-destructive\",\n !isUploadInteractionDisabled && !uploading && \"hover:border-primary hover:bg-primary/5\",\n formRecipe.motion.transition\n )}\n >\n {/* Single mode uploading state */}\n {uploading && !isMultiple ? (\n <>\n <LoadingSpinner size={32} className=\"text-primary mb-element\" aria-hidden=\"true\" />\n <span className=\"text-sm text-muted-foreground\">\n {uploadProgress < 0\n ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'uploading_indeterminate')\n : tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'uploading', { progress: uploadProgress })}\n </span>\n <div className=\"w-full max-w-xs h-1 bg-muted rounded-full mt-element overflow-hidden\">\n {uploadProgress < 0 ? (\n // Indeterminate progress: animated shimmer bar\n <div className=\"h-full w-1/3 bg-primary animate-pulse rounded-full\" />\n ) : (\n <div\n className=\"h-full bg-primary transition-all duration-[var(--motion-duration-fast)]\"\n style={{ width: `${uploadProgress}%` }}\n />\n )}\n </div>\n </>\n ) : (\n <>\n {!compact && <span className=\"mb-element\" aria-hidden=\"true\">{renderIcon(StandardIconReference.UPLOAD, { size: IconSize.XL })}</span>}\n <span className={cn(\"font-medium\", compact ? \"text-xs\" : \"text-sm\")}>\n {compact ? tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'add_more') : resolvedUploadButtonText}\n </span>\n {!compact && (\n <>\n <span className=\"text-xs text-muted-foreground mt-item-xs\">\n {dragDropLabel}\n </span>\n <span className=\"text-xs text-muted-foreground mt-element\">\n {acceptDescription}\n {maxSize && !minSize && ` • ${tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE, 'max_size', { size: formatFileSize(maxSize) })}`}\n </span>\n {renderConstraintHints()}\n </>\n )}\n </>\n )}\n </div>\n )\n\n // ==========================================================================\n // RENDER — Main\n // ==========================================================================\n\n const canAddMore = isMultiple && (!maxFiles || currentFileIds.length < maxFiles)\n\n /*\n * The provider pickers, mounted in the FRAMEWORK's own upload chrome rather\n * than in an application: every application's file fields get them, and an\n * application that adopted it in one place would have proven the component\n * and left the capability just as unadopted.\n *\n * `ProviderFilePickerHost` renders NOTHING when no live provider carries a\n * picker, which is every application today — so this costs an empty render\n * and no chrome until somebody registers one. The chooser is supplied here\n * rather than left to the host's plain buttons because a provider's display\n * name is an i18n KEY: the host cannot resolve it without depending on the\n * i18n service, and this field already has one.\n */\n const renderProviderPickers = () => (\n <ProviderFilePickerHost\n constraints={providerConstraints}\n acceptedStorages={fileSchemaMetadata?.storageAccepted}\n onSelect={handleProviderSelections}\n onProviderFailure={handleProviderFailure}\n renderChooser={({ choices, chosen, choose }) => (\n <div role=\"group\" className=\"flex flex-wrap gap-item-xs mt-element\">\n {choices.map((choice) => (\n <Button\n key={choice.providerRef}\n type=\"button\"\n size={ButtonSize.SM}\n variant={choice.providerRef === chosen ? ButtonVariants_Variant.DEFAULT : ButtonVariants_Variant.OUTLINE}\n aria-pressed={choice.providerRef === chosen}\n onClick={() => choose(choice.providerRef)}\n >\n {t(choice.displayNameLabelKey) ?? choice.displayName ?? choice.providerRef}\n </Button>\n ))}\n </div>\n )}\n />\n )\n\n if (!isReady) return null;\n\n return (\n <div ref={ref as React.RefObject<HTMLDivElement>} className={className}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={isMultiple}\n onChange={handleFileChange}\n className=\"hidden\"\n disabled={isUploadInteractionDisabled}\n />\n\n {isMultiple ? (\n // Multiple file mode\n <div className=\"space-y-element\">\n {currentFileIds.length > 0 && renderMultipleFileList()}\n {!isUploadInteractionDisabled && canAddMore && renderUploadZone(currentFileIds.length > 0)}\n {!isUploadInteractionDisabled && currentFileIds.length === 0 && !canAddMore && renderUploadZone(false)}\n {!isUploadInteractionDisabled && canAddMore && renderProviderPickers()}\n </div>\n ) : (\n // Single file mode\n currentFileId\n ? renderSingleFileDisplay(currentFileId, fileMetadata)\n : (hasUploadCapability ? (\n <>\n {renderUploadZone(false)}\n {!isUploadInteractionDisabled && renderProviderPickers()}\n </>\n ) : null)\n )}\n\n {/* Inline crop step — mounted only while a selection on an\n aspect-ratio-constrained field awaits cropping (mount = open). */}\n {pendingCropFile && aspectRatioConstraint && (\n <ImageCrop\n file={pendingCropFile}\n aspectRatio={aspectRatioConstraint}\n maskShape={fileUIPreviewShape}\n maxOutputWidth={imageConstraints?.maxWidth}\n maxOutputHeight={imageConstraints?.maxHeight}\n maxOutputSizeBytes={maxSize}\n allowedMimeTypes={allowedMimeTypes}\n onConfirm={handleCropConfirm}\n onCancel={handleCropCancel}\n onUncroppable={handleUncroppable}\n />\n )}\n </div>\n )\n})\n\n// --- Wrapper ---\n/**\n * Schema-aware FormFieldFile component.\n *\n * This wrapper sits between the generic FormField orchestrator and the preset\n * component. It is the proper boundary for injecting engine-level concerns:\n * - Authenticated HTTP operations (upload, metadata, delete) via httpClient\n * - Component preset resolution via the registry\n *\n * The preset component (presets-components) never imports the HTTP client directly,\n * maintaining separation of concerns. The generic FormField never deals with\n * file-specific HTTP concerns.\n */\nexport const FormFieldFile = forwardRef<FormFieldFileRef, FormFieldFileProps>(\n ({ preset = CorePresetNames.DEFAULT, httpOperations: externalHttpOperations, ...props }, ref) => {\n const { httpClient } = useApplication();\n\n const httpOperations: FileHttpOperations = useMemo(() => {\n if (externalHttpOperations) return externalHttpOperations;\n\n return {\n upload: async (url, formData, options) => {\n const response = await httpClient.uploadFile<any>(url, formData, {\n onUploadProgress: options?.onProgress,\n signal: options?.signal,\n });\n\n if (response?.file?.fileId) {\n return {\n fileId: response.file.fileId,\n metadata: response.file,\n };\n }\n if (response?.fileId) {\n return { fileId: response.fileId, metadata: response.metadata };\n }\n\n throw new Error('upload_failed');\n },\n linkRemoteReference: async (url, body) => {\n // Same route, same response shape as an upload — see `FileHttpOperations`.\n const response = await httpClient.post<any>(url, body);\n if (response?.file?.fileId) {\n return { fileId: response.file.fileId, metadata: response.file };\n }\n throw new Error('link_failed');\n },\n get: async <T,>(url: string): Promise<T> => {\n return httpClient.get<T>(url);\n },\n delete: async (url: string): Promise<void> => {\n await httpClient.delete(url);\n },\n };\n }, [httpClient, externalHttpOperations]);\n\n const Component = createComponentResolverWithRef<FormFieldFilePresetProps, FormFieldFileRef>(\n FrontendComponentType.LOW_LEVEL_FORM_FIELD_FILE,\n 'FormFieldFile'\n )(preset);\n const resolvedProps = { ...props, httpOperations } as FormFieldFilePresetProps;\n return <Component {...resolvedProps} ref={ref} />\n})\nFormFieldFile.displayName = 'FormFieldFile'\n"]}
|
|
@@ -143,9 +143,9 @@ export const FormFieldFile_Labels = [
|
|
|
143
143
|
params: [{ key: 'max', meaning: 'maximum number of files allowed' }],
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
|
-
ref: '
|
|
146
|
+
ref: 'provider_link_failed',
|
|
147
147
|
kind: LabelKind.MESSAGE,
|
|
148
|
-
purpose: 'Error shown when a connected service
|
|
148
|
+
purpose: 'Error shown when a file chosen from a connected service could not be linked to this field \u2014 the service did not confirm the file, the connection to that service is gone, or the file does not meet the field\u2019s constraints \u2014 so it was not attached. Written for the person picking the file; it must not read as their mistake, and must not name an internal delivery mode.',
|
|
149
149
|
},
|
|
150
150
|
{
|
|
151
151
|
ref: 'provider_fetch_failed',
|