vendor: 5,266 bytes, lines 1-10
1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RoleSelection-BFrElB4_.js","assets/loader-circle-BKfSDVBg.js","assets/DashboardHome-BScCVZE3.js","assets/DashboardLayout-NBAhvtQ4.js","assets/ProjectsPage-CEuR4k_f.js","assets/dialog-DqYI300K.js","assets/ProjectDetailPage-DBWulV7C.js","assets/triangle-alert-ChZBHNol.js","assets/chevron-left-usPP-QXQ.js","assets/ModelsPage-jXOZGfQd.js","assets/SettingsPage-Y3UOE0e9.js","assets/ModelProfilePage-BQoWPr-q.js","assets/ModelApprovalsPage-BuI1vomt.js","assets/LogoPage-CpT5c6mi.js","assets/download-Dwb4mbsD.js","assets/CompanyProfileDeck-u5Oa29LK.js"])))=>i.map(i=>d[i]); 2var JT=Object.defineProperty;var Oy=e=>{throw TypeError(e)};var QT=(e,t,a)=>t in e?JT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var Or=(e,t,a)=>QT(e,typeof t!="symbol"?t+"":t,a),uh=(e,t,a)=>t.has(e)||Oy("Cannot "+a);var R=(e,t,a)=>(uh(e,t,"read from private field"),a?a.call(e):t.get(e)),je=(e,t,a)=>t.has(e)?Oy("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),fe=(e,t,a,n)=>(uh(e,t,"write to private field"),n?n.call(e,a):t.set(e,a),a),At=(e,t,a)=>(uh(e,t,"access private method"),a);var nc=(e,t,a,n)=>({set _(r){fe(e,t,r,a)},get _(){return R(e,t,n)}});function ZT(e,t){for(var a=0;a<t.length;a++){const n=t[a];if(typeof n!="string"&&!Array.isArray(n)){for(const r in n)if(r!=="default"&&!(r in e)){const o=Object.getOwnPropertyDescriptor(n,r);o&&Object.defineProperty(e,r,o.get?o:{enumerable:!0,get:()=>n[r]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function a(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(r){if(r.ep)return;r.ep=!0;const o=a(r);fetch(r.href,o)}})();var cF=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function gx(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var yx={exports:{}},lu={},vx={exports:{}},be={};/** 3 * @license React 4 * react.production.min.js 5 * 6 * Copyright (c) Facebook, Inc. and its affiliates. 7 * 8 * This source code is licensed under the MIT license found in the 9 * LICENSE file in the root directory of this source tree. 10 */var Gl=Symbol.for("react.element"),XT=Symbol.for("react.portal"),eI=Symbol.for("react.fragment"),tI=Symbol.for("react.strict_mode"),aI=Symbol.for("react.profiler"),nI=Symbol.for("react.provider"),rI=Symbol.for("react.context"),oI=Symbol.for("react.forward_ref"),iI=Symbol.for("react.suspense"),sI=Symbol.for("react.memo"),lI=Symbol.for("react.lazy"),Gy=Symbol.iterator;function cI(e){return e===null||typeof e!="object"?null:(e=Gy&&e[Gy]||e["@@iterator"],typeof e=="function"?e:null)}var bx={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},wx=Object.assign,xx={};function Yi(e,t,a){this.props=e,this.context=t,this.refs=xx,this.updater=a||bx}Yi.prototype.isReactComponent={};Yi.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Yi.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function kx(){}kx.prototype=Yi.prototype;function Af(e,t,a){this.props=e,this.context=t,this.refs=xx,this.updater=a||bx}var Pf=Af.prototype=new kx;Pf.constructor=Af;wx(Pf,Yi.prototype);Pf.isPureReactComponent=!0;var Fy=Array.isArray,Cx=Object.prototype.hasOwnProperty,Tf={current:null},Sx={key:!0,ref:!0,__self:!0,__source:!0};function Ax(e,t,a){var n,r={},o=null,s=null;if(t!=null)for(n in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(o=""+t.key),t)Cx.call(t,n)&&!Sx.hasOwnProperty(n)&&(r[n]=t[n]);var l=arguments.length-2;if(l===1)r.children=a;else if(1<l){for(var c=Array(l),d=0;d<l;d++)c[d]=arguments[d+2];r.children=c}if(e&&e.defaultProps)for(n in l=e.defaultProps,l)r[n]===void 0&&(r[n]=l[n]);return{$$typeof:Gl,type:e,key:o,ref:s,props:r,_owner:Tf.current}}function dI(e,t){return{$$typeof:Gl,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function If(e){return typeof e=="object"&&e!==null&&e.$$typeof===Gl}function uI(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(a){return t[a]})}var Hy=/\/+/g;function hh(e,t){return typeof e=="object"&&e!==null&&e.key!=null?uI(""+e.key):t.toString(36)}function Gc(e,t,a,n,r){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var s=!1;if(e===null)s=!0;else switch(o){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case Gl:case XT:s=!0}
vendor: 4,574 bytes, lines 10-18
10}if(s)return s=e,r=r(s),e=n===""?"."+hh(s,0):n,Fy(r)?(a="",e!=null&&(a=e.replace(Hy,"$&/")+"/"),Gc(r,t,a,"",function(d){return d})):r!=null&&(If(r)&&(r=dI(r,a+(!r.key||s&&s.key===r.key?"":(""+r.key).replace(Hy,"$&/")+"/")+e)),t.push(r)),1;if(s=0,n=n===""?".":n+":",Fy(e))for(var l=0;l<e.length;l++){o=e[l];var c=n+hh(o,l);s+=Gc(o,t,a,c,r)}else if(c=cI(e),typeof c=="function")for(e=c.call(e),l=0;!(o=e.next()).done;)o=o.value,c=n+hh(o,l++),s+=Gc(o,t,a,c,r);else if(o==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function rc(e,t,a){if(e==null)return e;var n=[],r=0;return Gc(e,n,"","",function(o){return t.call(a,o,r++)}),n}function hI(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(a){(e._status===0||e._status===-1)&&(e._status=1,e._result=a)},function(a){(e._status===0||e._status===-1)&&(e._status=2,e._result=a)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var qt={current:null},Fc={transition:null},pI={ReactCurrentDispatcher:qt,ReactCurrentBatchConfig:Fc,ReactCurrentOwner:Tf};function Px(){throw Error("act(...) is not supported in production builds of React.")}be.Children={map:rc,forEach:function(e,t,a){rc(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return rc(e,function(){t++}),t},toArray:function(e){return rc(e,function(t){return t})||[]},only:function(e){if(!If(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};be.Component=Yi;be.Fragment=eI;be.Profiler=aI;be.PureComponent=Af;be.StrictMode=tI;be.Suspense=iI;be.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=pI;be.act=Px;be.cloneElement=function(e,t,a){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var n=wx({},e.props),r=e.key,o=e.ref,s=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,s=Tf.current),t.key!==void 0&&(r=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)Cx.call(t,c)&&!Sx.hasOwnProperty(c)&&(n[c]=t[c]===void 0&&l!==void 0?l[c]:t[c])}var c=arguments.length-2;if(c===1)n.children=a;else if(1<c){l=Array(c);for(var d=0;d<c;d++)l[d]=arguments[d+2];n.children=l}return{$$typeof:Gl,type:e.type,key:r,ref:o,props:n,_owner:s}};be.createContext=function(e){return e={$$typeof:rI,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:nI,_context:e},e.Consumer=e};be.createElement=Ax;be.createFactory=function(e){var t=Ax.bind(null,e);return t.type=e,t};be.createRef=function(){return{current:null}};be.forwardRef=function(e){return{$$typeof:oI,render:e}};be.isValidElement=If;be.lazy=function(e){return{$$typeof:lI,_payload:{_status:-1,_result:e},_init:hI}};be.memo=function(e,t){return{$$typeof:sI,type:e,compare:t===void 0?null:t}};be.startTransition=function(e){var t=Fc.transition;Fc.transition={};try{e()}finally{Fc.transition=t}};be.unstable_act=Px;be.useCallback=function(e,t){return qt.current.useCallback(e,t)};be.useContext=function(e){return qt.current.useContext(e)};be.useDebugValue=function(){};be.useDeferredValue=function(e){return qt.current.useDeferredValue(e)};be.useEffect=function(e,t){return qt.current.useEffect(e,t)};be.useId=function(){return qt.current.useId()};be.useImperativeHandle=function(e,t,a){return qt.current.useImperativeHandle(e,t,a)};be.useInsertionEffect=function(e,t){return qt.current.useInsertionEffect(e,t)};be.useLayoutEffect=function(e,t){return qt.current.useLayoutEffect(e,t)};be.useMemo=function(e,t){return qt.current.useMemo(e,t)};be.useReducer=function(e,t,a){return qt.current.useReducer(e,t,a)};be.useRef=function(e){return qt.current.useRef(e)};be.useState=function(e){return qt.current.useState(e)};be.useSyncExternalStore=function(e,t,a){return qt.current.useSyncExternalStore(e,t,a)};be.useTransition=function(){return qt.current.useTransition()};be.version="18.3.1";vx.exports=be;var f=vx.exports;const D=gx(f),jf=ZT({__proto__:null,default:D},[f]);/** 11 * @license React 12 * react-jsx-runtime.production.min.js 13 * 14 * Copyright (c) Facebook, Inc. and its affiliates. 15 * 16 * This source code is licensed under the MIT license found in the 17 * LICENSE file in the root directory of this source tree. 18 */var mI=f,fI=Symbol.for("react.element"),gI=Symbol.for("react.fragment"),yI=Object.prototype.hasOwnProperty,vI=mI.__SECRET_INT
vendor: 11,413 bytes, lines 18-35
18ERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,bI={key:!0,ref:!0,__self:!0,__source:!0};function Tx(e,t,a){var n,r={},o=null,s=null;a!==void 0&&(o=""+a),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(s=t.ref);for(n in t)yI.call(t,n)&&!bI.hasOwnProperty(n)&&(r[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)r[n]===void 0&&(r[n]=t[n]);return{$$typeof:fI,type:e,key:o,ref:s,props:r,_owner:vI.current}}lu.Fragment=gI;lu.jsx=Tx;lu.jsxs=Tx;yx.exports=lu;var i=yx.exports,Ix={exports:{}},oa={},jx={exports:{}},Nx={};/** 19 * @license React 20 * scheduler.production.min.js 21 * 22 * Copyright (c) Facebook, Inc. and its affiliates. 23 * 24 * This source code is licensed under the MIT license found in the 25 * LICENSE file in the root directory of this source tree. 26 */(function(e){function t(j,T){var O=j.length;j.push(T);e:for(;0<O;){var $=O-1>>>1,W=j[$];if(0<r(W,T))j[$]=T,j[O]=W,O=$;else break e}}function a(j){return j.length===0?null:j[0]}function n(j){if(j.length===0)return null;var T=j[0],O=j.pop();if(O!==T){j[0]=O;e:for(var $=0,W=j.length,se=W>>>1;$<se;){var le=2*($+1)-1,Re=j[le],_e=le+1,B=j[_e];if(0>r(Re,O))_e<W&&0>r(B,Re)?(j[$]=B,j[_e]=O,$=_e):(j[$]=Re,j[le]=O,$=le);else if(_e<W&&0>r(B,O))j[$]=B,j[_e]=O,$=_e;else break e}}return T}function r(j,T){var O=j.sortIndex-T.sortIndex;return O!==0?O:j.id-T.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var s=Date,l=s.now();e.unstable_now=function(){return s.now()-l}}var c=[],d=[],u=1,h=null,m=3,p=!1,b=!1,g=!1,v=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,y=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function x(j){for(var T=a(d);T!==null;){if(T.callback===null)n(d);else if(T.startTime<=j)n(d),T.sortIndex=T.expirationTime,t(c,T);else break;T=a(d)}}function k(j){if(g=!1,x(j),!b)if(a(c)!==null)b=!0,F(C);else{var T=a(d);T!==null&&Z(k,T.startTime-j)}}function C(j,T){b=!1,g&&(g=!1,w(P),P=-1),p=!0;var O=m;try{for(x(T),h=a(c);h!==null&&(!(h.expirationTime>T)||j&&!V());){var $=h.callback;if(typeof $=="function"){h.callback=null,m=h.priorityLevel;var W=$(h.expirationTime<=T);T=e.unstable_now(),typeof W=="function"?h.callback=W:h===a(c)&&n(c),x(T)}else n(c);h=a(c)}if(h!==null)var se=!0;else{var le=a(d);le!==null&&Z(k,le.startTime-T),se=!1}return se}finally{h=null,m=O,p=!1}}var S=!1,A=null,P=-1,I=5,N=-1;function V(){return!(e.unstable_now()-N<I)}function z(){if(A!==null){var j=e.unstable_now();N=j;var T=!0;try{T=A(!0,j)}finally{T?L():(S=!1,A=null)}}else S=!1}var L;if(typeof y=="function")L=function(){y(z)};else if(typeof MessageChannel<"u"){var E=new MessageChannel,K=E.port2;E.port1.onmessage=z,L=function(){K.postMessage(null)}}else L=function(){v(z,0)};function F(j){A=j,S||(S=!0,L())}function Z(j,T){P=v(function(){j(e.unstable_now())},T)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(j){j.callback=null},e.unstable_continueExecution=function(){b||p||(b=!0,F(C))},e.unstable_forceFrameRate=function(j){0>j||125<j?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):I=0<j?Math.floor(1e3/j):5},e.unstable_getCurrentPriorityLevel=function(){return m},e.unstable_getFirstCallbackNode=function(){return a(c)},e.unstable_next=function(j){switch(m){case 1:case 2:case 3:var T=3;break;default:T=m}var O=m;m=T;try{return j()}finally{m=O}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(j,T){switch(j){case 1:case 2:case 3:case 4:case 5:break;default:j=3}var O=m;m=j;try{return T()}finally{m=O}},e.unstable_scheduleCallback=function(j,T,O){var $=e.unstable_now();switch(typeof O=="object"&&O!==null?(O=O.delay,O=typeof O=="number"&&0<O?$+O:$):O=$,j){case 1:var W=-1;break;case 2:W=250;break;case 5:W=1073741823;break;case 4:W=1e4;break;default:W=5e3}return W=O+W,j={id:u++,callback:T,priorityLevel:j,startTime:O,expirationTime:W,sortIndex:-1},O>$?(j.sortIndex=O,t(d,j),a(c)===null&&j===a(d)&&(g?(w(P),P=-1):g=!0,Z(k,O-$))):(j.sortIndex=W,t(c,j),b||p||(b=!0,F(C))),j},e.unstable_shouldYield=V,e.unstable_wrapCallback=function(j){var T=m;return function(){var O=m;m=T;try{return j.apply(this,arguments)}finally{m=O}}}})(Nx);jx.exports=Nx;var wI=jx.exports;/** 27 * @license React 28 * react-dom.production.min.js 29 * 30 * Copyright (c) Facebook, Inc. and its affiliates. 31 * 32 * This source code is licensed under the MIT license found in the 33 * LICENSE file in the root directory of this source tree. 34 */var xI=f,na=wI;function U(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,a=1;a<arguments.length;a++)t+="&args[]="+encodeURIComponent(arguments[a]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var Ex=new Set,Zs={};function Io(e,t){Di(e,t),Di(e+"Capture",t)}function Di(e,t){for(Zs[e]=t,e=0;e<t.length;e++)Ex.add(t[e])}var An=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Cp=Object.prototype.hasOwnProperty,kI=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,By={},Vy={};function CI(e){return Cp.call(Vy,e)?!0:Cp.call(By,e)?!1:kI.test(e)?Vy[e]=!0:(By[e]=!0,!1)}function SI(e,t,a,n){if(a!==null&&a.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:a!==null?!a.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function AI(e,t,a,n){if(t===null||typeof t>"u"||SI(e,t,a,n))return!0;if(n)return!1;if(a!==null)switch(a.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Ut(e,t,a,n,r,o,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=r,this.mustUseProperty=a,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=s}var kt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){kt[e]=new Ut(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];kt[t]=new Ut(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){kt[e]=new Ut(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){kt[e]=new Ut(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){kt[e]=new Ut(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){kt[e]=new Ut(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){kt[e]=new Ut(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){kt[e]=new Ut(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){kt[e]=new Ut(e,5,!1,e.toLowerCase(),null,!1,!1)});var Nf=/[\-:]([a-z])/g;function Ef(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Nf,Ef);kt[t]=new Ut(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Nf,Ef);kt[t]=new Ut(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Nf,Ef);kt[t]=new Ut(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){kt[e]=new Ut(e,1,!1,e.toLowerCase(),null,!1,!1)});kt.xlinkHref=new Ut("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){kt[e]=new Ut(e,1,!1,e.toLowerCase(),null,!0,!0)});function zf(e,t,a,n){var r=kt.hasOwnProperty(t)?kt[t]:null;(r!==null?r.type!==0:n||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(AI(t,a,r,n)&&(a=null),n||r===null?CI(t)&&(a===null?e.removeAttribute(t):e.setAttribute(t,""+a)):r.mustUseProperty?e[r.propertyName]=a===null?r.type===3?!1:"":a:(t=r.attributeName,n=r.attributeNamespace,a===null?e.removeAttribute(t):(r=r.type,a=r===3||r===4&&a===!0?"":""+a,n?e.setAttributeNS(n,t,a):e.setAttribute(t,a))))}var zn=xI.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,oc=Symbol.for("react.element"),ti=Symbol.for("react.portal"),ai=Symbol.for("react.fragment"),Rf=Symbol.for("react.strict_mode"),Sp=Symbol.for("react.profiler"),zx=Symbol.for("react.provider"),Rx=Symbol.for("react.context"),Df=Symbol.for("react.forward_ref"),Ap=Symbol.for("react.suspense"),Pp=Symbol.for("react.suspense_list"),_f=Symbol.for("react.memo"),$n=Symbol.for("react.lazy"),Dx=Symbol.for("react.offscreen"),Wy=Symbol.iterator;function ms(e){return e===null||typeof e!="object"?null:(e=Wy&&e[Wy]||e["@@iterator"],typeof e=="function"?e:null)}var $e=Object.assign,ph;function Ts(e){if(ph===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ph=t&&t[1]||""}return` 35`+ph+e}var mh=!1;function fh(e,t){if(!e||mh)return"";mh=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(d){var n=d}Reflect.construct(e,[],t)}else{try{t.call()}catch(d){n=d}e.call(t.prototype)}else{try{throw Error()}catch(d){n=d}e()}}
vendor: 14,678 bytes, lines 35-38
35catch(d){if(d&&n&&typeof d.stack=="string"){for(var r=d.stack.split(` 36`),o=n.stack.split(` 37`),s=r.length-1,l=o.length-1;1<=s&&0<=l&&r[s]!==o[l];)l--;for(;1<=s&&0<=l;s--,l--)if(r[s]!==o[l]){if(s!==1||l!==1)do if(s--,l--,0>l||r[s]!==o[l]){var c=` 38`+r[s].replace(" at new "," at ");return e.displayName&&c.includes("<anonymous>")&&(c=c.replace("<anonymous>",e.displayName)),c}while(1<=s&&0<=l);break}}}finally{mh=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?Ts(e):""}function PI(e){switch(e.tag){case 5:return Ts(e.type);case 16:return Ts("Lazy");case 13:return Ts("Suspense");case 19:return Ts("SuspenseList");case 0:case 2:case 15:return e=fh(e.type,!1),e;case 11:return e=fh(e.type.render,!1),e;case 1:return e=fh(e.type,!0),e;default:return""}}function Tp(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ai:return"Fragment";case ti:return"Portal";case Sp:return"Profiler";case Rf:return"StrictMode";case Ap:return"Suspense";case Pp:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Rx:return(e.displayName||"Context")+".Consumer";case zx:return(e._context.displayName||"Context")+".Provider";case Df:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case _f:return t=e.displayName||null,t!==null?t:Tp(e.type)||"Memo";case $n:t=e._payload,e=e._init;try{return Tp(e(t))}catch{}}return null}function TI(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Tp(t);case 8:return t===Rf?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function wr(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function _x(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function II(e){var t=_x(e)?"checked":"value",a=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var r=a.get,o=a.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(s){n=""+s,o.call(this,s)}}),Object.defineProperty(e,t,{enumerable:a.enumerable}),{getValue:function(){return n},setValue:function(s){n=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ic(e){e._valueTracker||(e._valueTracker=II(e))}function qx(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),n="";return e&&(n=_x(e)?e.checked?"true":"false":e.value),e=n,e!==a?(t.setValue(e),!0):!1}function dd(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ip(e,t){var a=t.checked;return $e({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??e._wrapperState.initialChecked})}function $y(e,t){var a=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;a=wr(t.value!=null?t.value:a),e._wrapperState={initialChecked:n,initialValue:a,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ux(e,t){t=t.checked,t!=null&&zf(e,"checked",t,!1)}function jp(e,t){Ux(e,t);var a=wr(t.value),n=t.type;if(a!=null)n==="number"?(a===0&&e.value===""||e.value!=a)&&(e.value=""+a):e.value!==""+a&&(e.value=""+a);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Np(e,t.type,a):t.hasOwnProperty("defaultValue")&&Np(e,t.type,wr(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ky(e,t,a){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,a||t===e.value||(e.value=t),e.defaultValue=t}a=e.name,a!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,a!==""&&(e.name=a)}function Np(e,t,a){(t!=="number"||dd(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var Is=Array.isArray;function fi(e,t,a,n){if(e=e.options,t){t={};for(var r=0;r<a.length;r++)t["$"+a[r]]=!0;for(a=0;a<e.length;a++)r=t.hasOwnProperty("$"+e[a].value),e[a].selected!==r&&(e[a].selected=r),r&&n&&(e[a].defaultSelected=!0)}else{for(a=""+wr(a),t=null,r=0;r<e.length;r++){if(e[r].value===a){e[r].selected=!0,n&&(e[r].defaultSelected=!0);return}t!==null||e[r].disabled||(t=e[r])}t!==null&&(t.selected=!0)}}function Ep(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(U(91));return $e({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Yy(e,t){var a=t.value;if(a==null){if(a=t.children,t=t.defaultValue,a!=null){if(t!=null)throw Error(U(92));if(Is(a)){if(1<a.length)throw Error(U(93));a=a[0]}t=a}t==null&&(t=""),a=t}e._wrapperState={initialValue:wr(a)}}function Mx(e,t){var a=wr(t.value),n=wr(t.defaultValue);a!=null&&(a=""+a,a!==e.value&&(e.value=a),t.defaultValue==null&&e.defaultValue!==a&&(e.defaultValue=a)),n!=null&&(e.defaultValue=""+n)}function Jy(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Lx(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function zp(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Lx(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var sc,Ox=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,a,n,r){MSApp.execUnsafeLocalFunction(function(){return e(t,a,n,r)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(sc=sc||document.createElement("div"),sc.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=sc.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Xs(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var Us={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},jI=["Webkit","ms","Moz","O"];Object.keys(Us).forEach(function(e){jI.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Us[t]=Us[e]})});function Gx(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||Us.hasOwnProperty(e)&&Us[e]?(""+t).trim():t+"px"}function Fx(e,t){e=e.style;for(var a in t)if(t.hasOwnProperty(a)){var n=a.indexOf("--")===0,r=Gx(a,t[a],n);a==="float"&&(a="cssFloat"),n?e.setProperty(a,r):e[a]=r}}var NI=$e({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Rp(e,t){if(t){if(NI[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(U(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(U(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(U(61))}if(t.style!=null&&typeof t.style!="object")throw Error(U(62))}}function Dp(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var _p=null;function qf(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var qp=null,gi=null,yi=null;function Qy(e){if(e=Bl(e)){if(typeof qp!="function")throw Error(U(280));var t=e.stateNode;t&&(t=pu(t),qp(e.stateNode,e.type,t))}}function Hx(e){gi?yi?yi.push(e):yi=[e]:gi=e}function Bx(){if(gi){var e=gi,t=yi;if(yi=gi=null,Qy(e),t)for(e=0;e<t.length;e++)Qy(t[e])}}function Vx(e,t){return e(t)}function Wx(){}var gh=!1;function $x(e,t,a){if(gh)return e(t,a);gh=!0;try{return Vx(e,t,a)}finally{gh=!1,(gi!==null||yi!==null)&&(Wx(),Bx())}}function el(e,t){var a=e.stateNode;if(a===null)return null;var n=pu(a);if(n===null)return null;a=n[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(n=!n.disabled)||(e=e.type,n=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!n;break e;default:e=!1}if(e)return null;if(a&&typeof a!="function")throw Error(U(231,t,typeof a));return a}var Up=!1;if(An)try{var fs={};Object.defineProperty(fs,"passive",{get:function(){Up=!0}}),window.addEventListener("test",fs,fs),window.removeEventListener("test",fs,fs)}catch{Up=!1}function EI(e,t,a,n,r,o,s,l,c){var d=Array.prototype.slice.call(arguments,3);try{t.apply(a,d)}catch(u){this.onError(u)}}var Ms=!1,ud=null,hd=!1,Mp=null,zI={onError:function(e){Ms=!0,ud=e}};function RI(e,t,a,n,r,o,s,l,c){Ms=!1,ud=null,EI.apply(zI,arguments)}function DI(e,t,a,n,r,o,s,l,c){if(RI.apply(this,arguments),Ms){if(Ms){var d=ud;Ms=!1,ud=null}else throw Error(U(198));hd||(hd=!0,Mp=d)}}function jo(e){var t=e,a=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(a=t.return),e=t.return;while(e)}return t.tag===3?a:null}function Kx(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Zy(e){if(jo(e)!==e)throw Error(U(188))}function _I(e){var t=e.alternate;if(!t){if(t=jo(e),t===null)throw Error(U(188));return t!==e?null:e}for(var a=e,n=t;;){var r=a.return;if(r===null)break;var o=r.alternate;if(o===null){if(n=r.return,n!==null){a=n;continue}break}if(r.child===o.child){for(o=r.child;o;){if(o===a)return Zy(r),e;if(o===n)return Zy(r),t;o=o.sibling}throw Error(U(188))}if(a.return!==n.return)a=r,n=o;else{for(var s=!1,l=r.child;l;){if(l===a){s=!0,a=r,n=o;break}if(l===n){s=!0,n=r,a=o;break}l=l.sibling}if(!s){for(l=o.child;l;){if(l===a){s=!0,a=o,n=r;break}if(l===n){s=!0,n=o,a=r;break}l=l.sibling}if(!s)throw Error(U(189))}}if(a.alternate!==n)throw Error(U(190))}if(a.tag!==3)throw Error(U(188));return a.stateNode.current===a?e:t}function Yx(e){return e=_I(e),e!==null?Jx(e):null}function Jx(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Jx(e);if(t!==null)return t;e=e.sibling}return null}var Qx=na.unstable_scheduleCallback,Xy=na.unstable_cancelCallback,qI=na.unstable_shouldYield,UI=na.unstable_requestPaint,et=na.unstable_now,MI=na.unstable_getCurrentPriorityLevel,Uf=na.unstable_ImmediatePriority,Zx=na.unstable_UserBlockingPriority,pd=na.unstable_NormalPriority,LI=na.unstable_LowPriority,Xx=na.unstable_IdlePriority,cu=null,ln=null;function OI(e){if(ln&&typeof ln.onCommitFiberRoot=="function")try{ln.onCommitFiberRoot(cu,e,void 0,(e.current.flags&128)===128)}catch{}}var Oa=Math.clz32?Math.clz32:HI,GI=Math.log,FI=Math.LN2;function HI(e){return e>>>=0,e===0?32:31-(GI(e)/FI|0)|0}var lc=64,cc=4194304;function js(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function md(e,t){var a=e.pendingLanes;if(a===0)return 0;var n=0,r=e.suspendedLanes,o=e.pingedLanes,s=a&268435455;if(s!==0){var l=s&~r;l!==0?n=js(l):(o&=s,o!==0&&(n=js(o)))}else s=a&~r,s!==0?n=js(s):o!==0&&(n=js(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&r)&&(r=n&-n,o=t&-t,r>=o||r===16&&(o&4194240)!==0))return t;if(n&4&&(n|=a&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0<t;)a=31-Oa(t),r=1<<a,n|=e[a],t&=~r;return n}function BI(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function VI(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,r=e.expirationTimes,o=e.pendingLanes;0<o;){var s=31-Oa(o),l=1<<s,c=r[s];c===-1?(!(l&a)||l&n)&&(r[s]=BI(l,t)):c<=t&&(e.expiredLanes|=l),o&=~l}}function Lp(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ek(){var e=lc;return lc<<=1,!(lc&4194240)&&(lc=64),e}function yh(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Fl(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Oa(t),e[t]=a}function WI(e,t){var a=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0<a;){var r=31-Oa(a),o=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~o}}function Mf(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-Oa(a),r=1<<n;r&t|e[n]&t&&(e[n]|=t),a&=~r}}var De=0;function tk(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
vendor: 13,900 bytes, line 38
38var ak,Lf,nk,rk,ok,Op=!1,dc=[],cr=null,dr=null,ur=null,tl=new Map,al=new Map,Qn=[],$I="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ev(e,t){switch(e){case"focusin":case"focusout":cr=null;break;case"dragenter":case"dragleave":dr=null;break;case"mouseover":case"mouseout":ur=null;break;case"pointerover":case"pointerout":tl.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":al.delete(t.pointerId)}}function gs(e,t,a,n,r,o){return e===null||e.nativeEvent!==o?(e={blockedOn:t,domEventName:a,eventSystemFlags:n,nativeEvent:o,targetContainers:[r]},t!==null&&(t=Bl(t),t!==null&&Lf(t)),e):(e.eventSystemFlags|=n,t=e.targetContainers,r!==null&&t.indexOf(r)===-1&&t.push(r),e)}function KI(e,t,a,n,r){switch(t){case"focusin":return cr=gs(cr,e,t,a,n,r),!0;case"dragenter":return dr=gs(dr,e,t,a,n,r),!0;case"mouseover":return ur=gs(ur,e,t,a,n,r),!0;case"pointerover":var o=r.pointerId;return tl.set(o,gs(tl.get(o)||null,e,t,a,n,r)),!0;case"gotpointercapture":return o=r.pointerId,al.set(o,gs(al.get(o)||null,e,t,a,n,r)),!0}return!1}function ik(e){var t=Yr(e.target);if(t!==null){var a=jo(t);if(a!==null){if(t=a.tag,t===13){if(t=Kx(a),t!==null){e.blockedOn=t,ok(e.priority,function(){nk(a)});return}}else if(t===3&&a.stateNode.current.memoizedState.isDehydrated){e.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Hc(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Gp(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);_p=n,a.target.dispatchEvent(n),_p=null}else return t=Bl(a),t!==null&&Lf(t),e.blockedOn=a,!1;t.shift()}return!0}function tv(e,t,a){Hc(e)&&a.delete(t)}function YI(){Op=!1,cr!==null&&Hc(cr)&&(cr=null),dr!==null&&Hc(dr)&&(dr=null),ur!==null&&Hc(ur)&&(ur=null),tl.forEach(tv),al.forEach(tv)}function ys(e,t){e.blockedOn===t&&(e.blockedOn=null,Op||(Op=!0,na.unstable_scheduleCallback(na.unstable_NormalPriority,YI)))}function nl(e){function t(r){return ys(r,e)}if(0<dc.length){ys(dc[0],e);for(var a=1;a<dc.length;a++){var n=dc[a];n.blockedOn===e&&(n.blockedOn=null)}}for(cr!==null&&ys(cr,e),dr!==null&&ys(dr,e),ur!==null&&ys(ur,e),tl.forEach(t),al.forEach(t),a=0;a<Qn.length;a++)n=Qn[a],n.blockedOn===e&&(n.blockedOn=null);for(;0<Qn.length&&(a=Qn[0],a.blockedOn===null);)ik(a),a.blockedOn===null&&Qn.shift()}var vi=zn.ReactCurrentBatchConfig,fd=!0;function JI(e,t,a,n){var r=De,o=vi.transition;vi.transition=null;try{De=1,Of(e,t,a,n)}finally{De=r,vi.transition=o}}function QI(e,t,a,n){var r=De,o=vi.transition;vi.transition=null;try{De=4,Of(e,t,a,n)}finally{De=r,vi.transition=o}}function Of(e,t,a,n){if(fd){var r=Gp(e,t,a,n);if(r===null)Th(e,t,n,gd,a),ev(e,n);else if(KI(r,e,t,a,n))n.stopPropagation();else if(ev(e,n),t&4&&-1<$I.indexOf(e)){for(;r!==null;){var o=Bl(r);if(o!==null&&ak(o),o=Gp(e,t,a,n),o===null&&Th(e,t,n,gd,a),o===r)break;r=o}r!==null&&n.stopPropagation()}else Th(e,t,n,null,a)}}var gd=null;function Gp(e,t,a,n){if(gd=null,e=qf(n),e=Yr(e),e!==null)if(t=jo(e),t===null)e=null;else if(a=t.tag,a===13){if(e=Kx(t),e!==null)return e;e=null}else if(a===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return gd=e,null}function sk(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(MI()){case Uf:return 1;case Zx:return 4;case pd:case LI:return 16;case Xx:return 536870912;default:return 16}default:return 16}}var or=null,Gf=null,Bc=null;function lk(){if(Bc)return Bc;var e,t=Gf,a=t.length,n,r="value"in or?or.value:or.textContent,o=r.length;for(e=0;e<a&&t[e]===r[e];e++);var s=a-e;for(n=1;n<=s&&t[a-n]===r[o-n];n++);return Bc=r.slice(e,1<n?1-n:void 0)}function Vc(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function uc(){return!0}function av(){return!1}function ia(e){function t(a,n,r,o,s){this._reactName=a,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=s,this.currentTarget=null;for(var l in e)e.hasOwnProperty(l)&&(a=e[l],this[l]=a?a(o):o[l]);return this.isDefaultPrevented=(o.defaultPrevented!=null?o.defaultPrevented:o.returnValue===!1)?uc:av,this.isPropagationStopped=av,this}return $e(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!="unknown"&&(a.returnValue=!1),this.isDefaultPrevented=uc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=uc)},persist:function(){},isPersistent:uc}),t}var Ji={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Ff=ia(Ji),Hl=$e({},Ji,{view:0,detail:0}),ZI=ia(Hl),vh,bh,vs,du=$e({},Hl,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Hf,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==vs&&(vs&&e.type==="mousemove"?(vh=e.screenX-vs.screenX,bh=e.screenY-vs.screenY):bh=vh=0,vs=e),vh)},movementY:function(e){return"movementY"in e?e.movementY:bh}}),nv=ia(du),XI=$e({},du,{dataTransfer:0}),e2=ia(XI),t2=$e({},Hl,{relatedTarget:0}),wh=ia(t2),a2=$e({},Ji,{animationName:0,elapsedTime:0,pseudoElement:0}),n2=ia(a2),r2=$e({},Ji,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),o2=ia(r2),i2=$e({},Ji,{data:0}),rv=ia(i2),s2={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},l2={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},c2={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function d2(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=c2[e])?!!t[e]:!1}function Hf(){return d2}var u2=$e({},Hl,{key:function(e){if(e.key){var t=s2[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Vc(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?l2[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Hf,charCode:function(e){return e.type==="keypress"?Vc(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Vc(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),h2=ia(u2),p2=$e({},du,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),ov=ia(p2),m2=$e({},Hl,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Hf}),f2=ia(m2),g2=$e({},Ji,{propertyName:0,elapsedTime:0,pseudoElement:0}),y2=ia(g2),v2=$e({},du,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),b2=ia(v2),w2=[9,13,27,32],Bf=An&&"CompositionEvent"in window,Ls=null;An&&"documentMode"in document&&(Ls=document.documentMode);var x2=An&&"TextEvent"in window&&!Ls,ck=An&&(!Bf||Ls&&8<Ls&&11>=Ls),iv=" ",sv=!1;function dk(e,t){switch(e){case"keyup":return w2.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function uk(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var ni=!1;function k2(e,t){switch(e){case"compositionend":return uk(t);case"keypress":return t.which!==32?null:(sv=!0,iv);case"textInput":return e=t.data,e===iv&&sv?null:e;default:return null}}function C2(e,t){if(ni)return e==="compositionend"||!Bf&&dk(e,t)?(e=lk(),Bc=Gf=or=null,ni=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return ck&&t.locale!=="ko"?null:t.data;default:return null}}var S2={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function lv(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!S2[e.type]:t==="textarea"}function hk(e,t,a,n){Hx(n),t=yd(t,"onChange"),0<t.length&&(a=new Ff("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var Os=null,rl=null;function A2(e){Ck(e,0)}function uu(e){var t=ii(e);if(qx(t))return e}function P2(e,t){if(e==="change")return t}var pk=!1;if(An){var xh;if(An){var kh="oninput"in document;if(!kh){var cv=document.createElement("div");cv.setAttribute("oninput","return;"),kh=typeof cv.oninput=="function"}xh=kh}else xh=!1;pk=xh&&(!document.documentMode||9<document.documentMode)}function dv(){Os&&(Os.detachEvent("onpropertychange",mk),rl=Os=null)}function mk(e){if(e.propertyName==="value"&&uu(rl)){var t=[];hk(t,rl,e,qf(e)),$x(A2,t)}}function T2(e,t,a){e==="focusin"?(dv(),Os=t,rl=a,Os.attachEvent("onpropertychange",mk)):e==="focusout"&&dv()}function I2(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return uu(rl)}function j2(e,t){if(e==="click")return uu(t)}function N2(e,t){if(e==="input"||e==="change")return uu(t)}function E2(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Fa=typeof Object.is=="function"?Object.is:E2;function ol(e,t){if(Fa(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(n=0;n<a.length;n++){var r=a[n];if(!Cp.call(t,r)||!Fa(e[r],t[r]))return!1}return!0}function uv(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function hv(e,t){var a=uv(e);e=0;for(var n;a;){if(a.nodeType===3){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=uv(a)}}function fk(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?fk(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gk(){for(var e=window,t=dd();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=dd(e.document)}return t}function Vf(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function z2(e){var t=gk(),a=e.focusedElem,n=e.selectionRange;if(t!==a&&a&&a.ownerDocument&&fk(a.ownerDocument.documentElement,a)){if(n!==null&&Vf(a)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in a)a.selectionStart=t,a.selectionEnd=Math.min(e,a.value.length);else if(e=(t=a.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var r=a.textContent.length,o=Math.min(n.start,r);n=n.end===void 0?o:Math.min(n.end,r),!e.extend&&o>n&&(r=n,n=o,o=r),r=hv(a,o);var s=hv(a,n);r&&s&&(e.rangeCount!==1||e.anchorNode!==r.node||e.anchorOffset!==r.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(r.node,r.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=a;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof a.focus=="function"&&a.focus(),a=0;a<t.length;a++)e=t[a],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var R2=An&&"documentMode"in document&&11>=document.documentMode,ri=null,Fp=null,Gs=null,Hp=!1;function pv(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Hp||ri==null||ri!==dd(n)||(n=ri,"selectionStart"in n&&Vf(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focu
vendor: 4,501 bytes, line 38
38sNode:n.focusNode,focusOffset:n.focusOffset}),Gs&&ol(Gs,n)||(Gs=n,n=yd(Fp,"onSelect"),0<n.length&&(t=new Ff("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=ri)))}function hc(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var oi={animationend:hc("Animation","AnimationEnd"),animationiteration:hc("Animation","AnimationIteration"),animationstart:hc("Animation","AnimationStart"),transitionend:hc("Transition","TransitionEnd")},Ch={},yk={};An&&(yk=document.createElement("div").style,"AnimationEvent"in window||(delete oi.animationend.animation,delete oi.animationiteration.animation,delete oi.animationstart.animation),"TransitionEvent"in window||delete oi.transitionend.transition);function hu(e){if(Ch[e])return Ch[e];if(!oi[e])return e;var t=oi[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in yk)return Ch[e]=t[a];return e}var vk=hu("animationend"),bk=hu("animationiteration"),wk=hu("animationstart"),xk=hu("transitionend"),kk=new Map,mv="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function jr(e,t){kk.set(e,t),Io(t,[e])}for(var Sh=0;Sh<mv.length;Sh++){var Ah=mv[Sh],D2=Ah.toLowerCase(),_2=Ah[0].toUpperCase()+Ah.slice(1);jr(D2,"on"+_2)}jr(vk,"onAnimationEnd");jr(bk,"onAnimationIteration");jr(wk,"onAnimationStart");jr("dblclick","onDoubleClick");jr("focusin","onFocus");jr("focusout","onBlur");jr(xk,"onTransitionEnd");Di("onMouseEnter",["mouseout","mouseover"]);Di("onMouseLeave",["mouseout","mouseover"]);Di("onPointerEnter",["pointerout","pointerover"]);Di("onPointerLeave",["pointerout","pointerover"]);Io("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));Io("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));Io("onBeforeInput",["compositionend","keypress","textInput","paste"]);Io("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));Io("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));Io("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ns="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),q2=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ns));function fv(e,t,a){var n=e.type||"unknown-event";e.currentTarget=a,DI(n,t,void 0,e),e.currentTarget=null}function Ck(e,t){t=(t&4)!==0;for(var a=0;a<e.length;a++){var n=e[a],r=n.event;n=n.listeners;e:{var o=void 0;if(t)for(var s=n.length-1;0<=s;s--){var l=n[s],c=l.instance,d=l.currentTarget;if(l=l.listener,c!==o&&r.isPropagationStopped())break e;fv(r,l,d),o=c}else for(s=0;s<n.length;s++){if(l=n[s],c=l.instance,d=l.currentTarget,l=l.listener,c!==o&&r.isPropagationStopped())break e;fv(r,l,d),o=c}}}if(hd)throw e=Mp,hd=!1,Mp=null,e}function Ge(e,t){var a=t[Kp];a===void 0&&(a=t[Kp]=new Set);var n=e+"__bubble";a.has(n)||(Sk(t,e,2,!1),a.add(n))}function Ph(e,t,a){var n=0;t&&(n|=4),Sk(a,e,n,t)}var pc="_reactListening"+Math.random().toString(36).slice(2);function il(e){if(!e[pc]){e[pc]=!0,Ex.forEach(function(a){a!=="selectionchange"&&(q2.has(a)||Ph(a,!1,e),Ph(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[pc]||(t[pc]=!0,Ph("selectionchange",!1,t))}}function Sk(e,t,a,n){switch(sk(t)){case 1:var r=JI;break;case 4:r=QI;break;default:r=Of}a=r.bind(null,t,a,e),r=void 0,!Up||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(r=!0),n?r!==void 0?e.addEventListener(t,a,{capture:!0,passive:r}):e.addEventListener(t,a,!0):r!==void 0?e.addEventListener(t,a,{passive:r}):e.addEventListener(t,a,!1)}function Th(e,t,a,n,r){var o=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(n===null)return;var s=n.tag;if(s===3||s===4){var l=n.stateNode.containerInfo;
vendor: 2,527 bytes, line 38
38if(l===r||l.nodeType===8&&l.parentNode===r)break;if(s===4)for(s=n.return;s!==null;){var c=s.tag;if((c===3||c===4)&&(c=s.stateNode.containerInfo,c===r||c.nodeType===8&&c.parentNode===r))return;s=s.return}for(;l!==null;){if(s=Yr(l),s===null)return;if(c=s.tag,c===5||c===6){n=o=s;continue e}l=l.parentNode}}n=n.return}$x(function(){var d=o,u=qf(a),h=[];e:{var m=kk.get(e);if(m!==void 0){var p=Ff,b=e;switch(e){case"keypress":if(Vc(a)===0)break e;case"keydown":case"keyup":p=h2;break;case"focusin":b="focus",p=wh;break;case"focusout":b="blur",p=wh;break;case"beforeblur":case"afterblur":p=wh;break;case"click":if(a.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":p=nv;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":p=e2;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":p=f2;break;case vk:case bk:case wk:p=n2;break;case xk:p=y2;break;case"scroll":p=ZI;break;case"wheel":p=b2;break;case"copy":case"cut":case"paste":p=o2;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":p=ov}var g=(t&4)!==0,v=!g&&e==="scroll",w=g?m!==null?m+"Capture":null:m;g=[];for(var y=d,x;y!==null;){x=y;var k=x.stateNode;if(x.tag===5&&k!==null&&(x=k,w!==null&&(k=el(y,w),k!=null&&g.push(sl(y,k,x)))),v)break;y=y.return}0<g.length&&(m=new p(m,b,null,a,u),h.push({event:m,listeners:g}))}}if(!(t&7)){e:{if(m=e==="mouseover"||e==="pointerover",p=e==="mouseout"||e==="pointerout",m&&a!==_p&&(b=a.relatedTarget||a.fromElement)&&(Yr(b)||b[Pn]))break e;if((p||m)&&(m=u.window===u?u:(m=u.ownerDocument)?m.defaultView||m.parentWindow:window,p?(b=a.relatedTarget||a.toElement,p=d,b=b?Yr(b):null,b!==null&&(v=jo(b),b!==v||b.tag!==5&&b.tag!==6)&&(b=null)):(p=null,b=d),p!==b)){if(g=nv,k="onMouseLeave",w="onMouseEnter",y="mouse",(e==="pointerout"||e==="pointerover")&&(g=ov,k="onPointerLeave",w="onPointerEnter",y="pointer"),v=p==null?m:ii(p),x=b==null?m:ii(b),m=new g(k,y+"leave",p,a,u),m.target=v,m.relatedTarget=x,k=null,Yr(u)===d&&(g=new g(w,y+"enter",b,a,u),g.target=x,g.relatedTarget=v,k=g),v=k,p&&b)t:{for(g=p,w=b,y=0,x=g;x;x=Oo(x))y++;for(x=0,k=w;k;k=Oo(k))x++;for(;0<y-x;)g=Oo(g),y--;for(;0<x-y;)w=Oo(w),x--;for(;y--;){if(g===w||w!==null&&g===w.alternate)break t;g=Oo(g),w=Oo(w)}g=null}else g=null;p!==null&&gv(h,m,p,g,!1),b!==null&&v!==null&&gv(h,v,b,g,!0)}}
vendor: 4,113 bytes, lines 38-39
38e:{if(m=d?ii(d):window,p=m.nodeName&&m.nodeName.toLowerCase(),p==="select"||p==="input"&&m.type==="file")var C=P2;else if(lv(m))if(pk)C=N2;else{C=I2;var S=T2}else(p=m.nodeName)&&p.toLowerCase()==="input"&&(m.type==="checkbox"||m.type==="radio")&&(C=j2);if(C&&(C=C(e,d))){hk(h,C,a,u);break e}S&&S(e,m,d),e==="focusout"&&(S=m._wrapperState)&&S.controlled&&m.type==="number"&&Np(m,"number",m.value)}switch(S=d?ii(d):window,e){case"focusin":(lv(S)||S.contentEditable==="true")&&(ri=S,Fp=d,Gs=null);break;case"focusout":Gs=Fp=ri=null;break;case"mousedown":Hp=!0;break;case"contextmenu":case"mouseup":case"dragend":Hp=!1,pv(h,a,u);break;case"selectionchange":if(R2)break;case"keydown":case"keyup":pv(h,a,u)}var A;if(Bf)e:{switch(e){case"compositionstart":var P="onCompositionStart";break e;case"compositionend":P="onCompositionEnd";break e;case"compositionupdate":P="onCompositionUpdate";break e}P=void 0}else ni?dk(e,a)&&(P="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(P="onCompositionStart");P&&(ck&&a.locale!=="ko"&&(ni||P!=="onCompositionStart"?P==="onCompositionEnd"&&ni&&(A=lk()):(or=u,Gf="value"in or?or.value:or.textContent,ni=!0)),S=yd(d,P),0<S.length&&(P=new rv(P,e,null,a,u),h.push({event:P,listeners:S}),A?P.data=A:(A=uk(a),A!==null&&(P.data=A)))),(A=x2?k2(e,a):C2(e,a))&&(d=yd(d,"onBeforeInput"),0<d.length&&(u=new rv("onBeforeInput","beforeinput",null,a,u),h.push({event:u,listeners:d}),u.data=A))}Ck(h,t)})}function sl(e,t,a){return{instance:e,listener:t,currentTarget:a}}function yd(e,t){for(var a=t+"Capture",n=[];e!==null;){var r=e,o=r.stateNode;r.tag===5&&o!==null&&(r=o,o=el(e,a),o!=null&&n.unshift(sl(e,o,r)),o=el(e,t),o!=null&&n.push(sl(e,o,r))),e=e.return}return n}function Oo(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function gv(e,t,a,n,r){for(var o=t._reactName,s=[];a!==null&&a!==n;){var l=a,c=l.alternate,d=l.stateNode;if(c!==null&&c===n)break;l.tag===5&&d!==null&&(l=d,r?(c=el(a,o),c!=null&&s.unshift(sl(a,c,l))):r||(c=el(a,o),c!=null&&s.push(sl(a,c,l)))),a=a.return}s.length!==0&&e.push({event:t,listeners:s})}var U2=/\r\n?/g,M2=/\u0000|\uFFFD/g;function yv(e){return(typeof e=="string"?e:""+e).replace(U2,` 39`).replace(M2,"")}function mc(e,t,a){if(t=yv(t),yv(e)!==t&&a)throw Error(U(425))}function vd(){}var Bp=null,Vp=null;function Wp(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var $p=typeof setTimeout=="function"?setTimeout:void 0,L2=typeof clearTimeout=="function"?clearTimeout:void 0,vv=typeof Promise=="function"?Promise:void 0,O2=typeof queueMicrotask=="function"?queueMicrotask:typeof vv<"u"?function(e){return vv.resolve(null).then(e).catch(G2)}:$p;function G2(e){setTimeout(function(){throw e})}function Ih(e,t){var a=t,n=0;do{var r=a.nextSibling;if(e.removeChild(a),r&&r.nodeType===8)if(a=r.data,a==="/$"){if(n===0){e.removeChild(r),nl(t);return}n--}else a!=="$"&&a!=="$?"&&a!=="$!"||n++;a=r}while(a);nl(t)}function hr(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function bv(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="$"||a==="$!"||a==="$?"){if(t===0)return e;t--}else a==="/$"&&t++}e=e.previousSibling}return null}var Qi=Math.random().toString(36).slice(2),tn="__reactFiber$"+Qi,ll="__reactProps$"+Qi,Pn="__reactContainer$"+Qi,Kp="__reactEvents$"+Qi,F2="__reactListeners$"+Qi,H2="__reactHandles$"+Qi;function Yr(e){var t=e[tn];if(t)return t;for(var a=e.parentNode;a;){if(t=a[Pn]||a[tn]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=bv(e);e!==null;){if(a=e[tn])return a;e=bv(e)}return t}e=a,a=e.parentNode}return null}function Bl(e){return e=e[tn]||e[Pn],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function ii(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(U(33))}function pu(e){return e[ll]||null}var Yp=[],si=-1;function Nr(e){return{current:e}}function Fe(e){0>
vendor: 15,073 bytes, line 39
39si||(e.current=Yp[si],Yp[si]=null,si--)}function Me(e,t){si++,Yp[si]=e.current,e.current=t}var xr={},Nt=Nr(xr),Ft=Nr(!1),ho=xr;function _i(e,t){var a=e.type.contextTypes;if(!a)return xr;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var r={},o;for(o in a)r[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=r),r}function Ht(e){return e=e.childContextTypes,e!=null}function bd(){Fe(Ft),Fe(Nt)}function wv(e,t,a){if(Nt.current!==xr)throw Error(U(168));Me(Nt,t),Me(Ft,a)}function Ak(e,t,a){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return a;n=n.getChildContext();for(var r in n)if(!(r in t))throw Error(U(108,TI(e)||"Unknown",r));return $e({},a,n)}function wd(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||xr,ho=Nt.current,Me(Nt,e),Me(Ft,Ft.current),!0}function xv(e,t,a){var n=e.stateNode;if(!n)throw Error(U(169));a?(e=Ak(e,t,ho),n.__reactInternalMemoizedMergedChildContext=e,Fe(Ft),Fe(Nt),Me(Nt,e)):Fe(Ft),Me(Ft,a)}var vn=null,mu=!1,jh=!1;function Pk(e){vn===null?vn=[e]:vn.push(e)}function B2(e){mu=!0,Pk(e)}function Er(){if(!jh&&vn!==null){jh=!0;var e=0,t=De;try{var a=vn;for(De=1;e<a.length;e++){var n=a[e];do n=n(!0);while(n!==null)}vn=null,mu=!1}catch(r){throw vn!==null&&(vn=vn.slice(e+1)),Qx(Uf,Er),r}finally{De=t,jh=!1}}return null}var li=[],ci=0,xd=null,kd=0,ha=[],pa=0,po=null,wn=1,xn="";function Br(e,t){li[ci++]=kd,li[ci++]=xd,xd=e,kd=t}function Tk(e,t,a){ha[pa++]=wn,ha[pa++]=xn,ha[pa++]=po,po=e;var n=wn;e=xn;var r=32-Oa(n)-1;n&=~(1<<r),a+=1;var o=32-Oa(t)+r;if(30<o){var s=r-r%5;o=(n&(1<<s)-1).toString(32),n>>=s,r-=s,wn=1<<32-Oa(t)+r|a<<r|n,xn=o+e}else wn=1<<o|a<<r|n,xn=e}function Wf(e){e.return!==null&&(Br(e,1),Tk(e,1,0))}function $f(e){for(;e===xd;)xd=li[--ci],li[ci]=null,kd=li[--ci],li[ci]=null;for(;e===po;)po=ha[--pa],ha[pa]=null,xn=ha[--pa],ha[pa]=null,wn=ha[--pa],ha[pa]=null}var ea=null,Xt=null,Be=!1,La=null;function Ik(e,t){var a=fa(5,null,null,0);a.elementType="DELETED",a.stateNode=t,a.return=e,t=e.deletions,t===null?(e.deletions=[a],e.flags|=16):t.push(a)}function kv(e,t){switch(e.tag){case 5:var a=e.type;return t=t.nodeType!==1||a.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,ea=e,Xt=hr(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ea=e,Xt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=po!==null?{id:wn,overflow:xn}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=fa(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,ea=e,Xt=null,!0):!1;default:return!1}}function Jp(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Qp(e){if(Be){var t=Xt;if(t){var a=t;if(!kv(e,t)){if(Jp(e))throw Error(U(418));t=hr(a.nextSibling);var n=ea;t&&kv(e,t)?Ik(n,a):(e.flags=e.flags&-4097|2,Be=!1,ea=e)}}else{if(Jp(e))throw Error(U(418));e.flags=e.flags&-4097|2,Be=!1,ea=e}}}function Cv(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ea=e}function fc(e){if(e!==ea)return!1;if(!Be)return Cv(e),Be=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!Wp(e.type,e.memoizedProps)),t&&(t=Xt)){if(Jp(e))throw jk(),Error(U(418));for(;t;)Ik(e,t),t=hr(t.nextSibling)}if(Cv(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(U(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){Xt=hr(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}Xt=null}}else Xt=ea?hr(e.stateNode.nextSibling):null;return!0}function jk(){for(var e=Xt;e;)e=hr(e.nextSibling)}function qi(){Xt=ea=null,Be=!1}function Kf(e){La===null?La=[e]:La.push(e)}var V2=zn.ReactCurrentBatchConfig;function bs(e,t,a){if(e=a.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(U(309));var n=a.stateNode}if(!n)throw Error(U(147,e));var r=n,o=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===o?t.ref:(t=function(s){var l=r.refs;s===null?delete l[o]:l[o]=s},t._stringRef=o,t)}if(typeof e!="string")throw Error(U(284));if(!a._owner)throw Error(U(290,e))}return e}function gc(e,t){throw e=Object.prototype.toString.call(t),Error(U(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Sv(e){var t=e._init;return t(e._payload)}function Nk(e){function t(w,y){if(e){var x=w.deletions;x===null?(w.deletions=[y],w.flags|=16):x.push(y)}}function a(w,y){if(!e)return null;for(;y!==null;)t(w,y),y=y.sibling;return null}function n(w,y){for(w=new Map;y!==null;)y.key!==null?w.set(y.key,y):w.set(y.index,y),y=y.sibling;return w}function r(w,y){return w=gr(w,y),w.index=0,w.sibling=null,w}function o(w,y,x){return w.index=x,e?(x=w.alternate,x!==null?(x=x.index,x<y?(w.flags|=2,y):x):(w.flags|=2,y)):(w.flags|=1048576,y)}function s(w){return e&&w.alternate===null&&(w.flags|=2),w}function l(w,y,x,k){return y===null||y.tag!==6?(y=qh(x,w.mode,k),y.return=w,y):(y=r(y,x),y.return=w,y)}function c(w,y,x,k){var C=x.type;return C===ai?u(w,y,x.props.children,k,x.key):y!==null&&(y.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===$n&&Sv(C)===y.type)?(k=r(y,x.props),k.ref=bs(w,y,x),k.return=w,k):(k=Zc(x.type,x.key,x.props,null,w.mode,k),k.ref=bs(w,y,x),k.return=w,k)}function d(w,y,x,k){return y===null||y.tag!==4||y.stateNode.containerInfo!==x.containerInfo||y.stateNode.implementation!==x.implementation?(y=Uh(x,w.mode,k),y.return=w,y):(y=r(y,x.children||[]),y.return=w,y)}function u(w,y,x,k,C){return y===null||y.tag!==7?(y=co(x,w.mode,k,C),y.return=w,y):(y=r(y,x),y.return=w,y)}function h(w,y,x){if(typeof y=="string"&&y!==""||typeof y=="number")return y=qh(""+y,w.mode,x),y.return=w,y;if(typeof y=="object"&&y!==null){switch(y.$$typeof){case oc:return x=Zc(y.type,y.key,y.props,null,w.mode,x),x.ref=bs(w,null,y),x.return=w,x;case ti:return y=Uh(y,w.mode,x),y.return=w,y;case $n:var k=y._init;return h(w,k(y._payload),x)}if(Is(y)||ms(y))return y=co(y,w.mode,x,null),y.return=w,y;gc(w,y)}return null}function m(w,y,x,k){var C=y!==null?y.key:null;if(typeof x=="string"&&x!==""||typeof x=="number")return C!==null?null:l(w,y,""+x,k);if(typeof x=="object"&&x!==null){switch(x.$$typeof){case oc:return x.key===C?c(w,y,x,k):null;case ti:return x.key===C?d(w,y,x,k):null;case $n:return C=x._init,m(w,y,C(x._payload),k)}if(Is(x)||ms(x))return C!==null?null:u(w,y,x,k,null);gc(w,x)}return null}function p(w,y,x,k,C){if(typeof k=="string"&&k!==""||typeof k=="number")return w=w.get(x)||null,l(y,w,""+k,C);if(typeof k=="object"&&k!==null){switch(k.$$typeof){case oc:return w=w.get(k.key===null?x:k.key)||null,c(y,w,k,C);case ti:return w=w.get(k.key===null?x:k.key)||null,d(y,w,k,C);case $n:var S=k._init;return p(w,y,x,S(k._payload),C)}if(Is(k)||ms(k))return w=w.get(x)||null,u(y,w,k,C,null);gc(y,k)}return null}function b(w,y,x,k){for(var C=null,S=null,A=y,P=y=0,I=null;A!==null&&P<x.length;P++){A.index>P?(I=A,A=null):I=A.sibling;var N=m(w,A,x[P],k);if(N===null){A===null&&(A=I);break}e&&A&&N.alternate===null&&t(w,A),y=o(N,y,P),S===null?C=N:S.sibling=N,S=N,A=I}if(P===x.length)return a(w,A),Be&&Br(w,P),C;if(A===null){for(;P<x.length;P++)A=h(w,x[P],k),A!==null&&(y=o(A,y,P),S===null?C=A:S.sibling=A,S=A);return Be&&Br(w,P),C}for(A=n(w,A);P<x.length;P++)I=p(A,w,P,x[P],k),I!==null&&(e&&I.alternate!==null&&A.delete(I.key===null?P:I.key),y=o(I,y,P),S===null?C=I:S.sibling=I,S=I);return e&&A.forEach(function(V){return t(w,V)}),Be&&Br(w,P),C}function g(w,y,x,k){var C=ms(x);if(typeof C!="function")throw Error(U(150));if(x=C.call(x),x==null)throw Error(U(151));for(var S=C=null,A=y,P=y=0,I=null,N=x.next();A!==null&&!N.done;P++,N=x.next()){A.index>P?(I=A,A=null):I=A.sibling;var V=m(w,A,N.value,k);if(V===null){A===null&&(A=I);break}e&&A&&V.alternate===null&&t(w,A),y=o(V,y,P),S===null?C=V:S.sibling=V,S=V,A=I}if(N.done)return a(w,A),Be&&Br(w,P),C;if(A===null){for(;!N.done;P++,N=x.next())N=h(w,N.value,k),N!==null&&(y=o(N,y,P),S===null?C=N:S.sibling=N,S=N);return Be&&Br(w,P),C}for(A=n(w,A);!N.done;P++,N=x.next())N=p(A,w,P,N.value,k),N!==null&&(e&&N.alternate!==null&&A.delete(N.key===null?P:N.key),y=o(N,y,P),S===null?C=N:S.sibling=N,S=N);return e&&A.forEach(function(z){return t(w,z)}),Be&&Br(w,P),C}function v(w,y,x,k){if(typeof x=="object"&&x!==null&&x.type===ai&&x.key===null&&(x=x.props.children),typeof x=="object"&&x!==null){switch(x.$$typeof){case oc:e:{for(var C=x.key,S=y;S!==null;){if(S.key===C){if(C=x.type,C===ai){if(S.tag===7){a(w,S.sibling),y=r(S,x.props.children),y.return=w,w=y;break e}}else if(S.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===$n&&Sv(C)===S.type){a(w,S.sibling),y=r(S,x.props),y.ref=bs(w,S,x),y.return=w,w=y;break e}a(w,S);break}else t(w,S);S=S.sibling}x.type===ai?(y=co(x.props.children,w.mode,k,x.key),y.return=w,w=y):(k=Zc(x.type,x.key,x.props,null,w.mode,k),k.ref=bs(w,y,x),k.return=w,w=k)}return s(w);case ti:e:{for(S=x.key;y!==null;){if(y.key===S)if(y.tag===4&&y.stateNode.containerInfo===x.containerInfo&&y.stateNode.implementation===x.implementation){a(w,y.sibling),y=r(y,x.children||[]),y.return=w,w=y;break e}else{a(w,y);break}else t(w,y);y=y.sibling}y=Uh(x,w.mode,k),y.return=w,w=y}return s(w);case $n:return S=x._init,v(w,y,S(x._payload),k)}if(Is(x))return b(w,y,x,k);if(ms(x))return g(w,y,x,k);gc(w,x)}return typeof x=="string"&&x!==""||typeof x=="number"?(x=""+x,y!==null&&y.tag===6?(a(w,y.sibling),y=r(y,x),y.return=w,w=y):(a(w,y),y=qh(x,w.mode,k),y.return=w,w=y),s(w)):a(w,y)}return v}var Ui=Nk(!0),Ek=Nk(!1),Cd=Nr(null),Sd=null,di=null,Yf=null;function Jf(){Yf=di=Sd=null}function Qf(e){var t=Cd.current;Fe(Cd),e._currentValue=t}function Zp(e,t,a){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===a)break;e=e.return}}function bi(e,t){Sd=e,Yf=di=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Gt=!0),e.firstContext=null)}function ba(e){var t=e._currentValue;if(Yf!==e)if(e={context:e,memoizedValue:t,next:null},di===null){if(Sd===null)throw Error(U(308));di=e,Sd.dependencies={lanes:0,firstContext:e}}else di=di.next=e;return t}var Jr=null;function Zf(e){Jr===null?Jr=[e]:Jr.push(e)}function zk(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,Zf(t)):(a.next=r.next,r.next=a),t.interleaved=a,Tn(e,n)}function Tn(e,t){e.lanes|=t;var a=e.alternate;for(a!==null&&(a.lanes|=t),a=e,e=e.return;e!==null;)e.childLanes|=t,a=e.alternate,a!==null&&(a.childLanes|=t),a=e,e=e.return;return a.tag===3?a.stateNode:null}var Kn=!1;function Xf(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Rk(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function kn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pr(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,Ce&2){var r=n.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),n.pending=t,Tn(e,a)}return r=n.interleaved,r===null?(t.next=t,Zf(n)):(t.next=r.next,r.next=t),n.interleaved=t,Tn(e,a)}function Wc(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Mf(e,a)}}function Av(e,t){var a=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,a===n)){var r=null,o=null;if(a=a.firstBaseUpdate,a!==null){do{var s={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};o===null?r=o=s:o=o.next=s,a=a.next}while(a!==null);o===null?r=o=t:o=o.next=t}else r=o=t;a={baseState:n.baseState,firstBaseUpdate:r,lastBaseUpdate:o,shared:n.shared,effects:n.effects},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}function Ad(e,t,a,n){var r=e.updateQueue;Kn=!1;var o=r.firstBaseUpdate,s=r.lastBaseUpdate,l=r.shared.pending;if(l!==null){r.shared.pending=null;var c=l,d=c.next;c.next=null,s===null?o=d:s.next=d,s=c;var u=e.alternate;u!==null&&(u=u.updateQueue,l=u.lastBaseUpdate,l!==s&&(l===null?u.firstBaseUpdate=d:l.next=d,u.lastBaseUpdate=c))}if(o!==null){var h=r.baseState;s=0,u=d=c=null,l=o;do{var m=l.lane,p=l.eventTime;if((n&m)===m){u!==null&&(u=u.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var b=e,g=l;switch(m=t,p=a,g.tag){case 1:if(b=g.payload,typeof b=="function"){h=b.call(p,h,m);break e}h=b;break e;case 3:b.flags=b.flags&-65537|128;case 0:if(b=g.payload,m=typeof b=="function"?b.call(p,h,m):b,m==null)break e;h=$e({},h,m);break e;case 2:Kn=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,m=r.effects,m===null?r.effects=[l]:m.push(l))}else p={eventTime:p,lane:m,tag:l.tag,payload:l.payload,callback:l.callback,next:null},u===null?(d=u=p,c=h):u=u.next=p,s|=m;if(l=l.next,l===null){if(l=r.shared.pending,l===null)break;m=l,l=m.next,m.next=null,r.lastBaseUpdate=m,r.shared.pending=null}}while(!0);if(u===null&&(c=h),r.baseState=c,r.firstBaseUpdate=d,r.lastBaseUpdate=u,t=r.shared.interleaved,t!==null){r=t;do s|=r.lane,r=r.next;while(r!==t)}else o===null&&(r.shared.lanes=0);fo|=s,e.lanes=s,e.memoizedState=h}}function Pv(e,t,a){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var n=e[t],r=n.callback;if(r!==null){if(n.callback=null,n=a,typeof r!="function")throw Error(U(191,r));r.call(n)}}}var Vl={},cn=Nr(Vl),cl=Nr(Vl),dl=Nr(Vl);function Qr(e){if(e===Vl)throw Error(U(174));return e}function eg(e,t){switch(Me(dl,t),Me(cl,e),Me(cn,Vl),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:zp(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=zp(t,e)}Fe(cn),Me(cn,t)}function Mi(){Fe(cn),Fe(cl),Fe(dl)}function Dk(e){Qr(dl.current);var t=Qr(cn.current),a=zp(t,e.type);t!==a&&(Me(cl,e),Me(cn,a))}function tg(e){cl.current===e&&(Fe(cn),Fe(cl))}var Ve=Nr(0);function Pd(e){for(var t=e;t!==null;){if(t.tag===13){var a=t.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||a.data==="$?"||a.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Nh=[];function ag(){for(var e=0;e<Nh.length;e++)Nh[e]._workInProgressVersionPrimary=null;Nh.length=0}var $c=zn.ReactCurrentDispatcher,Eh=zn.ReactCurrentBatchConfig,mo=0,We=null,dt=null,pt=null,Td=!1,Fs=!1,ul=0,W2=0;function Pt(){throw Error(U(321))}function ng(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Fa(e[a],t[a]))return!1;return!0}function rg(e,t,a,n,r,o){if(mo=o,We=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,$c.current=e===null||e.memoizedState===null?J2:Q2,e=a(n,r),Fs){o=0;
vendor: 6,375 bytes, line 39
39do{if(Fs=!1,ul=0,25<=o)throw Error(U(301));o+=1,pt=dt=null,t.updateQueue=null,$c.current=Z2,e=a(n,r)}while(Fs)}if($c.current=Id,t=dt!==null&&dt.next!==null,mo=0,pt=dt=We=null,Td=!1,t)throw Error(U(300));return e}function og(){var e=ul!==0;return ul=0,e}function Ja(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return pt===null?We.memoizedState=pt=e:pt=pt.next=e,pt}function wa(){if(dt===null){var e=We.alternate;e=e!==null?e.memoizedState:null}else e=dt.next;var t=pt===null?We.memoizedState:pt.next;if(t!==null)pt=t,dt=e;else{if(e===null)throw Error(U(310));dt=e,e={memoizedState:dt.memoizedState,baseState:dt.baseState,baseQueue:dt.baseQueue,queue:dt.queue,next:null},pt===null?We.memoizedState=pt=e:pt=pt.next=e}return pt}function hl(e,t){return typeof t=="function"?t(e):t}function zh(e){var t=wa(),a=t.queue;if(a===null)throw Error(U(311));a.lastRenderedReducer=e;var n=dt,r=n.baseQueue,o=a.pending;if(o!==null){if(r!==null){var s=r.next;r.next=o.next,o.next=s}n.baseQueue=r=o,a.pending=null}if(r!==null){o=r.next,n=n.baseState;var l=s=null,c=null,d=o;do{var u=d.lane;if((mo&u)===u)c!==null&&(c=c.next={lane:0,action:d.action,hasEagerState:d.hasEagerState,eagerState:d.eagerState,next:null}),n=d.hasEagerState?d.eagerState:e(n,d.action);else{var h={lane:u,action:d.action,hasEagerState:d.hasEagerState,eagerState:d.eagerState,next:null};c===null?(l=c=h,s=n):c=c.next=h,We.lanes|=u,fo|=u}d=d.next}while(d!==null&&d!==o);c===null?s=n:c.next=l,Fa(n,t.memoizedState)||(Gt=!0),t.memoizedState=n,t.baseState=s,t.baseQueue=c,a.lastRenderedState=n}if(e=a.interleaved,e!==null){r=e;do o=r.lane,We.lanes|=o,fo|=o,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function Rh(e){var t=wa(),a=t.queue;if(a===null)throw Error(U(311));a.lastRenderedReducer=e;var n=a.dispatch,r=a.pending,o=t.memoizedState;if(r!==null){a.pending=null;var s=r=r.next;do o=e(o,s.action),s=s.next;while(s!==r);Fa(o,t.memoizedState)||(Gt=!0),t.memoizedState=o,t.baseQueue===null&&(t.baseState=o),a.lastRenderedState=o}return[o,n]}function _k(){}function qk(e,t){var a=We,n=wa(),r=t(),o=!Fa(n.memoizedState,r);if(o&&(n.memoizedState=r,Gt=!0),n=n.queue,ig(Lk.bind(null,a,n,e),[e]),n.getSnapshot!==t||o||pt!==null&&pt.memoizedState.tag&1){if(a.flags|=2048,pl(9,Mk.bind(null,a,n,r,t),void 0,null),mt===null)throw Error(U(349));mo&30||Uk(a,t,r)}return r}function Uk(e,t,a){e.flags|=16384,e={getSnapshot:t,value:a},t=We.updateQueue,t===null?(t={lastEffect:null,stores:null},We.updateQueue=t,t.stores=[e]):(a=t.stores,a===null?t.stores=[e]:a.push(e))}function Mk(e,t,a,n){t.value=a,t.getSnapshot=n,Ok(t)&&Gk(e)}function Lk(e,t,a){return a(function(){Ok(t)&&Gk(e)})}function Ok(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!Fa(e,a)}catch{return!0}}function Gk(e){var t=Tn(e,1);t!==null&&Ga(t,e,1,-1)}function Tv(e){var t=Ja();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:hl,lastRenderedState:e},t.queue=e,e=e.dispatch=Y2.bind(null,We,e),[t.memoizedState,e]}function pl(e,t,a,n){return e={tag:e,create:t,destroy:a,deps:n,next:null},t=We.updateQueue,t===null?(t={lastEffect:null,stores:null},We.updateQueue=t,t.lastEffect=e.next=e):(a=t.lastEffect,a===null?t.lastEffect=e.next=e:(n=a.next,a.next=e,e.next=n,t.lastEffect=e)),e}function Fk(){return wa().memoizedState}function Kc(e,t,a,n){var r=Ja();We.flags|=e,r.memoizedState=pl(1|t,a,void 0,n===void 0?null:n)}function fu(e,t,a,n){var r=wa();n=n===void 0?null:n;var o=void 0;if(dt!==null){var s=dt.memoizedState;if(o=s.destroy,n!==null&&ng(n,s.deps)){r.memoizedState=pl(t,a,o,n);return}}We.flags|=e,r.memoizedState=pl(1|t,a,o,n)}function Iv(e,t){return Kc(8390656,8,e,t)}function ig(e,t){return fu(2048,8,e,t)}function Hk(e,t){return fu(4,2,e,t)}function Bk(e,t){return fu(4,4,e,t)}function Vk(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Wk(e,t,a){return a=a!=null?a.concat([e]):null,fu(4,4,Vk.bind(null,t,e),a)}function sg(){}function $k(e,t){var a=wa();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&ng(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function Kk(e,t){var a=wa();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&ng(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function Yk(e,t,a){return mo&21?(Fa(a,t)||(a=ek(),We.lanes|=a,fo|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,Gt=!0),e.memoizedState=a)}function $2(e,t){var a=De;De=a!==0&&4>a?a:4,e(!0);var n=Eh.transition;Eh.transition={};try{e(!1),t()}finally{De=a,Eh.transition=n}}function Jk(){return wa().memoizedState}function K2(e,t,a){var n=fr(e);if(a={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null},Qk(e))Zk(t,a);else if(a=zk(e,t,a,n),a!==null){var r=Dt();Ga(a,e,n,r),Xk(a,t,n)}}function Y2(e,t,a){var n=fr(e),r={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null};if(Qk(e))Zk(t,r);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var s=t.lastRenderedState,l=o(s,a);if(r.hasEagerState=!0,r.eagerState=l,Fa(l,s)){var c=t.interleaved;c===null?(r.next=r,Zf(t)):(r.next=c.next,c.next=r),t.interleaved=r;return}}catch{}finally{}a=zk(e,t,r,n),a!==null&&(r=Dt(),Ga(a,e,n,r),Xk(a,t,n))}}function Qk(e){var t=e.alternate;return e===We||t!==null&&t===We}function Zk(e,t){Fs=Td=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Xk(e,t,a){if(a&4194240){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Mf(e,a)}}var Id={readContext:ba,useCallback:Pt,useContext:Pt,useEffect:Pt,useImperativeHandle:Pt,useInsertionEffect:Pt,useLayoutEffect:Pt,useMemo:Pt,useReducer:Pt,useRef:Pt,useState:Pt,useDebugValue:Pt,useDeferredValue:Pt,useTransition:Pt,useMutableSource:Pt,useSyncExternalStore:Pt,useId:Pt,unstable_isNewReconciler:!1},J2={readContext:ba,useCallback:function(e,t){return Ja().memoizedState=[e,t===void 0?null:t],e},useContext:ba,useEffect:Iv,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Kc(4194308,4,Vk.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Kc(4194308,4,e,t)},useInsertionEffect:function(e,t){return Kc(4,2,e,t)},useMemo:function(e,t){var a=Ja();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=Ja();
vendor: 7,648 bytes, lines 39-41
39return t=a!==void 0?a(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=K2.bind(null,We,e),[n.memoizedState,e]},useRef:function(e){var t=Ja();return e={current:e},t.memoizedState=e},useState:Tv,useDebugValue:sg,useDeferredValue:function(e){return Ja().memoizedState=e},useTransition:function(){var e=Tv(!1),t=e[0];return e=$2.bind(null,e[1]),Ja().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=We,r=Ja();if(Be){if(a===void 0)throw Error(U(407));a=a()}else{if(a=t(),mt===null)throw Error(U(349));mo&30||Uk(n,t,a)}r.memoizedState=a;var o={value:a,getSnapshot:t};return r.queue=o,Iv(Lk.bind(null,n,o,e),[e]),n.flags|=2048,pl(9,Mk.bind(null,n,o,a,t),void 0,null),a},useId:function(){var e=Ja(),t=mt.identifierPrefix;if(Be){var a=xn,n=wn;a=(n&~(1<<32-Oa(n)-1)).toString(32)+a,t=":"+t+"R"+a,a=ul++,0<a&&(t+="H"+a.toString(32)),t+=":"}else a=W2++,t=":"+t+"r"+a.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},Q2={readContext:ba,useCallback:$k,useContext:ba,useEffect:ig,useImperativeHandle:Wk,useInsertionEffect:Hk,useLayoutEffect:Bk,useMemo:Kk,useReducer:zh,useRef:Fk,useState:function(){return zh(hl)},useDebugValue:sg,useDeferredValue:function(e){var t=wa();return Yk(t,dt.memoizedState,e)},useTransition:function(){var e=zh(hl)[0],t=wa().memoizedState;return[e,t]},useMutableSource:_k,useSyncExternalStore:qk,useId:Jk,unstable_isNewReconciler:!1},Z2={readContext:ba,useCallback:$k,useContext:ba,useEffect:ig,useImperativeHandle:Wk,useInsertionEffect:Hk,useLayoutEffect:Bk,useMemo:Kk,useReducer:Rh,useRef:Fk,useState:function(){return Rh(hl)},useDebugValue:sg,useDeferredValue:function(e){var t=wa();return dt===null?t.memoizedState=e:Yk(t,dt.memoizedState,e)},useTransition:function(){var e=Rh(hl)[0],t=wa().memoizedState;return[e,t]},useMutableSource:_k,useSyncExternalStore:qk,useId:Jk,unstable_isNewReconciler:!1};function za(e,t){if(e&&e.defaultProps){t=$e({},t),e=e.defaultProps;for(var a in e)t[a]===void 0&&(t[a]=e[a]);return t}return t}function Xp(e,t,a,n){t=e.memoizedState,a=a(n,t),a=a==null?t:$e({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var gu={isMounted:function(e){return(e=e._reactInternals)?jo(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var n=Dt(),r=fr(e),o=kn(n,r);o.payload=t,a!=null&&(o.callback=a),t=pr(e,o,r),t!==null&&(Ga(t,e,r,n),Wc(t,e,r))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=Dt(),r=fr(e),o=kn(n,r);o.tag=1,o.payload=t,a!=null&&(o.callback=a),t=pr(e,o,r),t!==null&&(Ga(t,e,r,n),Wc(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=Dt(),n=fr(e),r=kn(a,n);r.tag=2,t!=null&&(r.callback=t),t=pr(e,r,n),t!==null&&(Ga(t,e,n,a),Wc(t,e,n))}};function jv(e,t,a,n,r,o,s){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(n,o,s):t.prototype&&t.prototype.isPureReactComponent?!ol(a,n)||!ol(r,o):!0}function e0(e,t,a){var n=!1,r=xr,o=t.contextType;return typeof o=="object"&&o!==null?o=ba(o):(r=Ht(t)?ho:Nt.current,n=t.contextTypes,o=(n=n!=null)?_i(e,r):xr),t=new t(a,o),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=gu,e.stateNode=t,t._reactInternals=e,n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o),t}function Nv(e,t,a,n){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(a,n),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(a,n),t.state!==e&&gu.enqueueReplaceState(t,t.state,null)}function em(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},Xf(e);var o=t.contextType;typeof o=="object"&&o!==null?r.context=ba(o):(o=Ht(t)?ho:Nt.current,r.context=_i(e,o)),r.state=e.memoizedState,o=t.getDerivedStateFromProps,typeof o=="function"&&(Xp(e,t,o,a),r.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof r.getSnapshotBeforeUpdate=="function"||typeof r.UNSAFE_componentWillMount!="function"&&typeof r.componentWillMount!="function"||(t=r.state,typeof r.componentWillMount=="function"&&r.componentWillMount(),typeof r.UNSAFE_componentWillMount=="function"&&r.UNSAFE_componentWillMount(),t!==r.state&&gu.enqueueReplaceState(r,r.state,null),Ad(e,a,r,n),r.state=e.memoizedState),typeof r.componentDidMount=="function"&&(e.flags|=4194308)}function Li(e,t){try{var a="",n=t;do a+=PI(n),n=n.return;while(n);var r=a}catch(o){r=` 40Error generating stack: `+o.message+` 41`+o.stack}return{value:e,source:t,stack:r,digest:null}}function Dh(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function tm(e,t){try{console.error(t.value)}catch(a){setTimeout(function(){throw a})}}var X2=typeof WeakMap=="function"?WeakMap:Map;function t0(e,t,a){a=kn(-1,a),a.tag=3,a.payload={element:null};var n=t.value;return a.callback=function(){Nd||(Nd=!0,um=n),tm(e,t)},a}function a0(e,t,a){a=kn(-1,a),a.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var r=t.value;a.payload=function(){return n(r)},a.callback=function(){tm(e,t)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(a.callback=function(){tm(e,t),typeof n!="function"&&(mr===null?mr=new Set([this]):mr.add(this));var s=t.stack;this.componentDidCatch(t.value,{componentStack:s!==null?s:""})}),a}function Ev(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new X2;var r=new Set;n.set(t,r)}else r=n.get(t),r===void 0&&(r=new Set,n.set(t,r));r.has(a)||(r.add(a),e=pj.bind(null,e,t,a),t.then(e,e))}function zv(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Rv(e,t,a,n,r){return e.mode&1?(e.flags|=65536,e.lanes=r,e):(e===t?e.flags|=65536:(e.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(t=kn(-1,1),t.tag=2,pr(a,t,1))),a.lanes|=1),e)}var ej=zn.ReactCurrentOwner,Gt=!1;function zt(e,t,a,n){t.child=e===null?Ek(t,null,a,n):Ui(t,e.child,a,n)}function Dv(e,t,a,n,r){a=a.render;var o=t.ref;return bi(t,r),n=rg(e,t,a,n,o,r),a=og(),e!==null&&!Gt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,In(e,t,r)):(Be&&a&&Wf(t),t.flags|=1,zt(e,t,n,r),t.child)}function _v(e,t,a,n,r){if(e===null){var o=a.type;return typeof o=="function"&&!fg(o)&&o.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(t.tag=15,t.type=o,n0(e,t,o,n,r)):(e=Zc(a.type,null,n,t,t.mode,r),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!(e.lanes&r)){var s=o.memoizedProps;if(a=a.compare,a=a!==null?a:ol,a(s,n)&&e.ref===t.ref)return In(e,t,r)}return t.flags|=1,e=gr(o,n),e.ref=t.ref,e.return=t,t.child=e}function n0(e,t,a,n,r){if(e!==null){var o=e.memoizedProps;if(ol(o,n)&&e.ref===t.ref)if(Gt=!1,t.pendingProps=n=o,(e.lanes&r)!==0)e.flags&131072&&(Gt=!0);else return t.lanes=e.lanes,In(e,t,r)}return am(e,t,a,n,r)}function r0(e,t,a){var n=t.pendingProps,r=n.children,o=e!==null?e.memoizedState:null;if(n.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Me(hi,Yt),Yt|=a;else{if(!(a&1073741824))return e=o!==null?o.baseLanes|a:a,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Me(hi,Yt),Yt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=o!==null?o.baseLanes:a,Me(hi,Yt),Yt|=n}else o!==null?(n=o.baseLanes|a,t.memoizedState=null):n=a,Me(hi,Yt),Yt|=n;return zt(e,t,r,a),t.child}function o0(e,t){var a=t.ref;(e===null&&a!==null||e!==null&&e.ref!==a)&&(t.flags|=512,t.flags|=2097152)}
vendor: 6,245 bytes, line 41
41function am(e,t,a,n,r){var o=Ht(a)?ho:Nt.current;return o=_i(t,o),bi(t,r),a=rg(e,t,a,n,o,r),n=og(),e!==null&&!Gt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,In(e,t,r)):(Be&&n&&Wf(t),t.flags|=1,zt(e,t,a,r),t.child)}function qv(e,t,a,n,r){if(Ht(a)){var o=!0;wd(t)}else o=!1;if(bi(t,r),t.stateNode===null)Yc(e,t),e0(t,a,n),em(t,a,n,r),n=!0;else if(e===null){var s=t.stateNode,l=t.memoizedProps;s.props=l;var c=s.context,d=a.contextType;typeof d=="object"&&d!==null?d=ba(d):(d=Ht(a)?ho:Nt.current,d=_i(t,d));var u=a.getDerivedStateFromProps,h=typeof u=="function"||typeof s.getSnapshotBeforeUpdate=="function";h||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(l!==n||c!==d)&&Nv(t,s,n,d),Kn=!1;var m=t.memoizedState;s.state=m,Ad(t,n,s,r),c=t.memoizedState,l!==n||m!==c||Ft.current||Kn?(typeof u=="function"&&(Xp(t,a,u,n),c=t.memoizedState),(l=Kn||jv(t,a,l,n,m,c,d))?(h||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount=="function"&&(t.flags|=4194308)):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=c),s.props=n,s.state=c,s.context=d,n=l):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{s=t.stateNode,Rk(e,t),l=t.memoizedProps,d=t.type===t.elementType?l:za(t.type,l),s.props=d,h=t.pendingProps,m=s.context,c=a.contextType,typeof c=="object"&&c!==null?c=ba(c):(c=Ht(a)?ho:Nt.current,c=_i(t,c));var p=a.getDerivedStateFromProps;(u=typeof p=="function"||typeof s.getSnapshotBeforeUpdate=="function")||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(l!==h||m!==c)&&Nv(t,s,n,c),Kn=!1,m=t.memoizedState,s.state=m,Ad(t,n,s,r);var b=t.memoizedState;l!==h||m!==b||Ft.current||Kn?(typeof p=="function"&&(Xp(t,a,p,n),b=t.memoizedState),(d=Kn||jv(t,a,d,n,m,b,c)||!1)?(u||typeof s.UNSAFE_componentWillUpdate!="function"&&typeof s.componentWillUpdate!="function"||(typeof s.componentWillUpdate=="function"&&s.componentWillUpdate(n,b,c),typeof s.UNSAFE_componentWillUpdate=="function"&&s.UNSAFE_componentWillUpdate(n,b,c)),typeof s.componentDidUpdate=="function"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof s.componentDidUpdate!="function"||l===e.memoizedProps&&m===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||l===e.memoizedProps&&m===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=b),s.props=n,s.state=b,s.context=c,n=d):(typeof s.componentDidUpdate!="function"||l===e.memoizedProps&&m===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||l===e.memoizedProps&&m===e.memoizedState||(t.flags|=1024),n=!1)}return nm(e,t,a,n,o,r)}function nm(e,t,a,n,r,o){o0(e,t);var s=(t.flags&128)!==0;if(!n&&!s)return r&&xv(t,a,!1),In(e,t,o);n=t.stateNode,ej.current=t;var l=s&&typeof a.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&s?(t.child=Ui(t,e.child,null,o),t.child=Ui(t,null,l,o)):zt(e,t,l,o),t.memoizedState=n.state,r&&xv(t,a,!0),t.child}function i0(e){var t=e.stateNode;t.pendingContext?wv(e,t.pendingContext,t.pendingContext!==t.context):t.context&&wv(e,t.context,!1),eg(e,t.containerInfo)}function Uv(e,t,a,n,r){return qi(),Kf(r),t.flags|=256,zt(e,t,a,n),t.child}var rm={dehydrated:null,treeContext:null,retryLane:0};function om(e){return{baseLanes:e,cachePool:null,transitions:null}}function s0(e,t,a){var n=t.pendingProps,r=Ve.current,o=!1,s=(t.flags&128)!==0,l;if((l=s)||(l=e!==null&&e.memoizedState===null?!1:(r&2)!==0),l?(o=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(r|=1),Me(Ve,r&1),e===null)return Qp(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=n.children,e=n.fallback,o?(n=t.mode,o=t.child,s={mode:"hidden",children:s},!(n&1)&&o!==null?(o.childLanes=0,o.pendingProps=s):o=bu(s,n,0,null),e=co(e,n,a,null),o.return=t,e.return=t,o.sibling=e,t.child=o,t.child.memoizedState=om(a),t.memoizedState=rm,e):lg(t,s));if(r=e.memoizedState,r!==null&&(l=r.dehydrated,l!==null))return tj(e,t,s,n,l,r,a);if(o){o=n.fallback,s=t.mode,r=e.child,l=r.sibling;var c={mode:"hidden",children:n.children};return!(s&1)&&t.child!==r?(n=t.child,n.childLanes=0,n.pendingProps=c,t.deletions=null):(n=gr(r,c),n.subtreeFlags=r.subtreeFlags&14680064),l!==null?o=gr(l,o):(o=co(o,s,a,null),o.flags|=2),o.return=t,n.return=t,n.sibling=o,t.child=n,n=o,o=t.child,s=e.child.memoizedState,s=s===null?om(a):{baseLanes:s.baseLanes|a,cachePool:null,transitions:s.transitions},o.memoizedState=s,o.childLanes=e.childLanes&~a,t.memoizedState=rm,n}return o=e.child,e=o.sibling,n=gr(o,{mode:"visible",children:n.children}),!(t.mode&1)&&(n.lanes=a),n.return=t,n.sibling=null,e!==null&&(a=t.deletions,a===null?(t.deletions=[e],t.flags|=16):a.push(e)),t.child=n,t.memoizedState=null,n}function lg(e,t){return t=bu({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function yc(e,t,a,n){return n!==null&&Kf(n),Ui(t,e.child,null,a),e=lg(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function tj(e,t,a,n,r,o,s){if(a)return t.flags&256?(t.flags&=-257,n=Dh(Error(U(422))),yc(e,t,s,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(o=n.fallback,r=t.mode,n=bu({mode:"visible",children:n.children},r,0,null),o=co(o,r,s,null),o.flags|=2,n.return=t,o.return=t,n.sibling=o,t.child=n,t.mode&1&&Ui(t,e.child,null,s),t.child.memoizedState=om(s),t.memoizedState=rm,o);if(!(t.mode&1))return yc(e,t,s,null);if(r.data==="$!"){if(n=r.nextSibling&&r.nextSibling.dataset,n)var l=n.dgst;return n=l,o=Error(U(419)),n=Dh(o,n,void 0),yc(e,t,s,n)}if(l=(s&e.childLanes)!==0,Gt||l){if(n=mt,n!==null){switch(s&-s){case 4:r=2;break;case 16:r=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:r=32;break;case 536870912:r=268435456;break;default:r=0}
vendor: 5,541 bytes, line 41
41r=r&(n.suspendedLanes|s)?0:r,r!==0&&r!==o.retryLane&&(o.retryLane=r,Tn(e,r),Ga(n,e,r,-1))}return mg(),n=Dh(Error(U(421))),yc(e,t,s,n)}return r.data==="$?"?(t.flags|=128,t.child=e.child,t=mj.bind(null,e),r._reactRetry=t,null):(e=o.treeContext,Xt=hr(r.nextSibling),ea=t,Be=!0,La=null,e!==null&&(ha[pa++]=wn,ha[pa++]=xn,ha[pa++]=po,wn=e.id,xn=e.overflow,po=t),t=lg(t,n.children),t.flags|=4096,t)}function Mv(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),Zp(e.return,t,a)}function _h(e,t,a,n,r){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:a,tailMode:r}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=n,o.tail=a,o.tailMode=r)}function l0(e,t,a){var n=t.pendingProps,r=n.revealOrder,o=n.tail;if(zt(e,t,n.children,a),n=Ve.current,n&2)n=n&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Mv(e,a,t);else if(e.tag===19)Mv(e,a,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}n&=1}if(Me(Ve,n),!(t.mode&1))t.memoizedState=null;else switch(r){case"forwards":for(a=t.child,r=null;a!==null;)e=a.alternate,e!==null&&Pd(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),_h(t,!1,r,a,o);break;case"backwards":for(a=null,r=t.child,t.child=null;r!==null;){if(e=r.alternate,e!==null&&Pd(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}_h(t,!0,a,null,o);break;case"together":_h(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Yc(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function In(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),fo|=t.lanes,!(a&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(U(153));if(t.child!==null){for(e=t.child,a=gr(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=gr(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function aj(e,t,a){switch(t.tag){case 3:i0(t),qi();break;case 5:Dk(t);break;case 1:Ht(t.type)&&wd(t);break;case 4:eg(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;Me(Cd,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(Me(Ve,Ve.current&1),t.flags|=128,null):a&t.child.childLanes?s0(e,t,a):(Me(Ve,Ve.current&1),e=In(e,t,a),e!==null?e.sibling:null);Me(Ve,Ve.current&1);break;case 19:if(n=(a&t.childLanes)!==0,e.flags&128){if(n)return l0(e,t,a);t.flags|=128}if(r=t.memoizedState,r!==null&&(r.rendering=null,r.tail=null,r.lastEffect=null),Me(Ve,Ve.current),n)break;return null;case 22:case 23:return t.lanes=0,r0(e,t,a)}return In(e,t,a)}var c0,im,d0,u0;c0=function(e,t){for(var a=t.child;a!==null;){if(a.tag===5||a.tag===6)e.appendChild(a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===t)break;for(;a.sibling===null;){if(a.return===null||a.return===t)return;a=a.return}a.sibling.return=a.return,a=a.sibling}};im=function(){};d0=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,Qr(cn.current);var o=null;switch(a){case"input":r=Ip(e,r),n=Ip(e,n),o=[];break;case"select":r=$e({},r,{value:void 0}),n=$e({},n,{value:void 0}),o=[];break;case"textarea":r=Ep(e,r),n=Ep(e,n),o=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=vd)}Rp(a,n);var s;a=null;for(d in r)if(!n.hasOwnProperty(d)&&r.hasOwnProperty(d)&&r[d]!=null)if(d==="style"){var l=r[d];for(s in l)l.hasOwnProperty(s)&&(a||(a={}),a[s]="")}else d!=="dangerouslySetInnerHTML"&&d!=="children"&&d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&d!=="autoFocus"&&(Zs.hasOwnProperty(d)?o||(o=[]):(o=o||[]).push(d,null));for(d in n){var c=n[d];if(l=r!=null?r[d]:void 0,n.hasOwnProperty(d)&&c!==l&&(c!=null||l!=null))if(d==="style")if(l){for(s in l)!l.hasOwnProperty(s)||c&&c.hasOwnProperty(s)||(a||(a={}),a[s]="");for(s in c)c.hasOwnProperty(s)&&l[s]!==c[s]&&(a||(a={}),a[s]=c[s])}else a||(o||(o=[]),o.push(d,a)),a=c;else d==="dangerouslySetInnerHTML"?(c=c?c.__html:void 0,l=l?l.__html:void 0,c!=null&&l!==c&&(o=o||[]).push(d,c)):d==="children"?typeof c!="string"&&typeof c!="number"||(o=o||[]).push(d,""+c):d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&(Zs.hasOwnProperty(d)?(c!=null&&d==="onScroll"&&Ge("scroll",e),o||l===c||(o=[])):(o=o||[]).push(d,c))}a&&(o=o||[]).push("style",a);var d=o;(t.updateQueue=d)&&(t.flags|=4)}};u0=function(e,t,a,n){a!==n&&(t.flags|=4)};function ws(e,t){if(!Be)switch(e.tailMode){case"hidden":t=e.tail;for(var a=null;t!==null;)t.alternate!==null&&(a=t),t=t.sibling;a===null?e.tail=null:a.sibling=null;break;case"collapsed":a=e.tail;for(var n=null;a!==null;)a.alternate!==null&&(n=a),a=a.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function Tt(e){var t=e.alternate!==null&&e.alternate.child===e.child,a=0,n=0;if(t)for(var r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags&14680064,n|=r.flags&14680064,r.return=e,r=r.sibling;else for(r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags,n|=r.flags,r.return=e,r=r.sibling;return e.subtreeFlags|=n,e.childLanes=a,t}function nj(e,t,a){var n=t.pendingProps;switch($f(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Tt(t),null;case 1:return Ht(t.type)&&bd(),Tt(t),null;
vendor: 31,014 bytes, line 41
41case 3:return n=t.stateNode,Mi(),Fe(Ft),Fe(Nt),ag(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(fc(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,La!==null&&(mm(La),La=null))),im(e,t),Tt(t),null;case 5:tg(t);var r=Qr(dl.current);if(a=t.type,e!==null&&t.stateNode!=null)d0(e,t,a,n,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(U(166));return Tt(t),null}if(e=Qr(cn.current),fc(t)){n=t.stateNode,a=t.type;var o=t.memoizedProps;switch(n[tn]=t,n[ll]=o,e=(t.mode&1)!==0,a){case"dialog":Ge("cancel",n),Ge("close",n);break;case"iframe":case"object":case"embed":Ge("load",n);break;case"video":case"audio":for(r=0;r<Ns.length;r++)Ge(Ns[r],n);break;case"source":Ge("error",n);break;case"img":case"image":case"link":Ge("error",n),Ge("load",n);break;case"details":Ge("toggle",n);break;case"input":$y(n,o),Ge("invalid",n);break;case"select":n._wrapperState={wasMultiple:!!o.multiple},Ge("invalid",n);break;case"textarea":Yy(n,o),Ge("invalid",n)}Rp(a,o),r=null;for(var s in o)if(o.hasOwnProperty(s)){var l=o[s];s==="children"?typeof l=="string"?n.textContent!==l&&(o.suppressHydrationWarning!==!0&&mc(n.textContent,l,e),r=["children",l]):typeof l=="number"&&n.textContent!==""+l&&(o.suppressHydrationWarning!==!0&&mc(n.textContent,l,e),r=["children",""+l]):Zs.hasOwnProperty(s)&&l!=null&&s==="onScroll"&&Ge("scroll",n)}switch(a){case"input":ic(n),Ky(n,o,!0);break;case"textarea":ic(n),Jy(n);break;case"select":case"option":break;default:typeof o.onClick=="function"&&(n.onclick=vd)}n=r,t.updateQueue=n,n!==null&&(t.flags|=4)}else{s=r.nodeType===9?r:r.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Lx(a)),e==="http://www.w3.org/1999/xhtml"?a==="script"?(e=s.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=s.createElement(a,{is:n.is}):(e=s.createElement(a),a==="select"&&(s=e,n.multiple?s.multiple=!0:n.size&&(s.size=n.size))):e=s.createElementNS(e,a),e[tn]=t,e[ll]=n,c0(e,t,!1,!1),t.stateNode=e;e:{switch(s=Dp(a,n),a){case"dialog":Ge("cancel",e),Ge("close",e),r=n;break;case"iframe":case"object":case"embed":Ge("load",e),r=n;break;case"video":case"audio":for(r=0;r<Ns.length;r++)Ge(Ns[r],e);r=n;break;case"source":Ge("error",e),r=n;break;case"img":case"image":case"link":Ge("error",e),Ge("load",e),r=n;break;case"details":Ge("toggle",e),r=n;break;case"input":$y(e,n),r=Ip(e,n),Ge("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=$e({},n,{value:void 0}),Ge("invalid",e);break;case"textarea":Yy(e,n),r=Ep(e,n),Ge("invalid",e);break;default:r=n}Rp(a,r),l=r;for(o in l)if(l.hasOwnProperty(o)){var c=l[o];o==="style"?Fx(e,c):o==="dangerouslySetInnerHTML"?(c=c?c.__html:void 0,c!=null&&Ox(e,c)):o==="children"?typeof c=="string"?(a!=="textarea"||c!=="")&&Xs(e,c):typeof c=="number"&&Xs(e,""+c):o!=="suppressContentEditableWarning"&&o!=="suppressHydrationWarning"&&o!=="autoFocus"&&(Zs.hasOwnProperty(o)?c!=null&&o==="onScroll"&&Ge("scroll",e):c!=null&&zf(e,o,c,s))}switch(a){case"input":ic(e),Ky(e,n,!1);break;case"textarea":ic(e),Jy(e);break;case"option":n.value!=null&&e.setAttribute("value",""+wr(n.value));break;case"select":e.multiple=!!n.multiple,o=n.value,o!=null?fi(e,!!n.multiple,o,!1):n.defaultValue!=null&&fi(e,!!n.multiple,n.defaultValue,!0);break;default:typeof r.onClick=="function"&&(e.onclick=vd)}switch(a){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}}n&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Tt(t),null;case 6:if(e&&t.stateNode!=null)u0(e,t,e.memoizedProps,n);else{if(typeof n!="string"&&t.stateNode===null)throw Error(U(166));if(a=Qr(dl.current),Qr(cn.current),fc(t)){if(n=t.stateNode,a=t.memoizedProps,n[tn]=t,(o=n.nodeValue!==a)&&(e=ea,e!==null))switch(e.tag){case 3:mc(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&mc(n.nodeValue,a,(e.mode&1)!==0)}o&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[tn]=t,t.stateNode=n}return Tt(t),null;case 13:if(Fe(Ve),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Be&&Xt!==null&&t.mode&1&&!(t.flags&128))jk(),qi(),t.flags|=98560,o=!1;else if(o=fc(t),n!==null&&n.dehydrated!==null){if(e===null){if(!o)throw Error(U(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(U(317));o[tn]=t}else qi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Tt(t),o=!1}else La!==null&&(mm(La),La=null),o=!0;if(!o)return t.flags&65536?t:null}return t.flags&128?(t.lanes=a,t):(n=n!==null,n!==(e!==null&&e.memoizedState!==null)&&n&&(t.child.flags|=8192,t.mode&1&&(e===null||Ve.current&1?ut===0&&(ut=3):mg())),t.updateQueue!==null&&(t.flags|=4),Tt(t),null);case 4:return Mi(),im(e,t),e===null&&il(t.stateNode.containerInfo),Tt(t),null;case 10:return Qf(t.type._context),Tt(t),null;case 17:return Ht(t.type)&&bd(),Tt(t),null;case 19:if(Fe(Ve),o=t.memoizedState,o===null)return Tt(t),null;if(n=(t.flags&128)!==0,s=o.rendering,s===null)if(n)ws(o,!1);else{if(ut!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(s=Pd(e),s!==null){for(t.flags|=128,ws(o,!1),n=s.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),t.subtreeFlags=0,n=a,a=t.child;a!==null;)o=a,e=n,o.flags&=14680066,s=o.alternate,s===null?(o.childLanes=0,o.lanes=e,o.child=null,o.subtreeFlags=0,o.memoizedProps=null,o.memoizedState=null,o.updateQueue=null,o.dependencies=null,o.stateNode=null):(o.childLanes=s.childLanes,o.lanes=s.lanes,o.child=s.child,o.subtreeFlags=0,o.deletions=null,o.memoizedProps=s.memoizedProps,o.memoizedState=s.memoizedState,o.updateQueue=s.updateQueue,o.type=s.type,e=s.dependencies,o.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),a=a.sibling;return Me(Ve,Ve.current&1|2),t.child}e=e.sibling}o.tail!==null&&et()>Oi&&(t.flags|=128,n=!0,ws(o,!1),t.lanes=4194304)}else{if(!n)if(e=Pd(s),e!==null){if(t.flags|=128,n=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),ws(o,!0),o.tail===null&&o.tailMode==="hidden"&&!s.alternate&&!Be)return Tt(t),null}else 2*et()-o.renderingStartTime>Oi&&a!==1073741824&&(t.flags|=128,n=!0,ws(o,!1),t.lanes=4194304);o.isBackwards?(s.sibling=t.child,t.child=s):(a=o.last,a!==null?a.sibling=s:t.child=s,o.last=s)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=et(),t.sibling=null,a=Ve.current,Me(Ve,n?a&1|2:a&1),t):(Tt(t),null);case 22:case 23:return pg(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?Yt&1073741824&&(Tt(t),t.subtreeFlags&6&&(t.flags|=8192)):Tt(t),null;case 24:return null;case 25:return null}throw Error(U(156,t.tag))}function rj(e,t){switch($f(t),t.tag){case 1:return Ht(t.type)&&bd(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Mi(),Fe(Ft),Fe(Nt),ag(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return tg(t),null;case 13:if(Fe(Ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(U(340));qi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Fe(Ve),null;case 4:return Mi(),null;case 10:return Qf(t.type._context),null;case 22:case 23:return pg(),null;case 24:return null;default:return null}}var vc=!1,jt=!1,oj=typeof WeakSet=="function"?WeakSet:Set,X=null;function ui(e,t){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(n){Qe(e,t,n)}else a.current=null}function sm(e,t,a){try{a()}catch(n){Qe(e,t,n)}}var Lv=!1;function ij(e,t){if(Bp=fd,e=gk(),Vf(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var r=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{a.nodeType,o.nodeType}catch{a=null;break e}var s=0,l=-1,c=-1,d=0,u=0,h=e,m=null;t:for(;;){for(var p;h!==a||r!==0&&h.nodeType!==3||(l=s+r),h!==o||n!==0&&h.nodeType!==3||(c=s+n),h.nodeType===3&&(s+=h.nodeValue.length),(p=h.firstChild)!==null;)m=h,h=p;for(;;){if(h===e)break t;if(m===a&&++d===r&&(l=s),m===o&&++u===n&&(c=s),(p=h.nextSibling)!==null)break;h=m,m=h.parentNode}h=p}a=l===-1||c===-1?null:{start:l,end:c}}else a=null}a=a||{start:0,end:0}}else a=null;for(Vp={focusedElem:e,selectionRange:a},fd=!1,X=t;X!==null;)if(t=X,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,X=e;else for(;X!==null;){t=X;try{var b=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(b!==null){var g=b.memoizedProps,v=b.memoizedState,w=t.stateNode,y=w.getSnapshotBeforeUpdate(t.elementType===t.type?g:za(t.type,g),v);w.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var x=t.stateNode.containerInfo;x.nodeType===1?x.textContent="":x.nodeType===9&&x.documentElement&&x.removeChild(x.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(U(163))}}catch(k){Qe(t,t.return,k)}if(e=t.sibling,e!==null){e.return=t.return,X=e;break}X=t.return}return b=Lv,Lv=!1,b}function Hs(e,t,a){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var r=n=n.next;do{if((r.tag&e)===e){var o=r.destroy;r.destroy=void 0,o!==void 0&&sm(t,a,o)}r=r.next}while(r!==n)}}function yu(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var a=t=t.next;do{if((a.tag&e)===e){var n=a.create;a.destroy=n()}a=a.next}while(a!==t)}}function lm(e){var t=e.ref;if(t!==null){var a=e.stateNode;switch(e.tag){case 5:e=a;break;default:e=a}typeof t=="function"?t(e):t.current=e}}function h0(e){var t=e.alternate;t!==null&&(e.alternate=null,h0(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[tn],delete t[ll],delete t[Kp],delete t[F2],delete t[H2])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function p0(e){return e.tag===5||e.tag===3||e.tag===4}function Ov(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||p0(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function cm(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.nodeType===8?a.parentNode.insertBefore(e,t):a.insertBefore(e,t):(a.nodeType===8?(t=a.parentNode,t.insertBefore(e,a)):(t=a,t.appendChild(e)),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=vd));else if(n!==4&&(e=e.child,e!==null))for(cm(e,t,a),e=e.sibling;e!==null;)cm(e,t,a),e=e.sibling}function dm(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(dm(e,t,a),e=e.sibling;e!==null;)dm(e,t,a),e=e.sibling}var vt=null,Ua=!1;function Ln(e,t,a){for(a=a.child;a!==null;)m0(e,t,a),a=a.sibling}function m0(e,t,a){if(ln&&typeof ln.onCommitFiberUnmount=="function")try{ln.onCommitFiberUnmount(cu,a)}catch{}switch(a.tag){case 5:jt||ui(a,t);case 6:var n=vt,r=Ua;vt=null,Ln(e,t,a),vt=n,Ua=r,vt!==null&&(Ua?(e=vt,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):vt.removeChild(a.stateNode));break;case 18:vt!==null&&(Ua?(e=vt,a=a.stateNode,e.nodeType===8?Ih(e.parentNode,a):e.nodeType===1&&Ih(e,a),nl(e)):Ih(vt,a.stateNode));break;case 4:n=vt,r=Ua,vt=a.stateNode.containerInfo,Ua=!0,Ln(e,t,a),vt=n,Ua=r;break;case 0:case 11:case 14:case 15:if(!jt&&(n=a.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){r=n=n.next;do{var o=r,s=o.destroy;o=o.tag,s!==void 0&&(o&2||o&4)&&sm(a,t,s),r=r.next}while(r!==n)}Ln(e,t,a);break;case 1:if(!jt&&(ui(a,t),n=a.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=a.memoizedProps,n.state=a.memoizedState,n.componentWillUnmount()}catch(l){Qe(a,t,l)}Ln(e,t,a);break;case 21:Ln(e,t,a);break;case 22:a.mode&1?(jt=(n=jt)||a.memoizedState!==null,Ln(e,t,a),jt=n):Ln(e,t,a);break;default:Ln(e,t,a)}}function Gv(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new oj),t.forEach(function(n){var r=fj.bind(null,e,n);a.has(n)||(a.add(n),n.then(r,r))})}}function Ta(e,t){var a=t.deletions;if(a!==null)for(var n=0;n<a.length;n++){var r=a[n];try{var o=e,s=t,l=s;e:for(;l!==null;){switch(l.tag){case 5:vt=l.stateNode,Ua=!1;break e;case 3:vt=l.stateNode.containerInfo,Ua=!0;break e;case 4:vt=l.stateNode.containerInfo,Ua=!0;break e}l=l.return}if(vt===null)throw Error(U(160));m0(o,s,r),vt=null,Ua=!1;var c=r.alternate;c!==null&&(c.return=null),r.return=null}catch(d){Qe(r,t,d)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)f0(t,e),t=t.sibling}function f0(e,t){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(Ta(t,e),Ya(e),n&4){try{Hs(3,e,e.return),yu(3,e)}catch(g){Qe(e,e.return,g)}try{Hs(5,e,e.return)}catch(g){Qe(e,e.return,g)}}break;case 1:Ta(t,e),Ya(e),n&512&&a!==null&&ui(a,a.return);break;case 5:if(Ta(t,e),Ya(e),n&512&&a!==null&&ui(a,a.return),e.flags&32){var r=e.stateNode;try{Xs(r,"")}catch(g){Qe(e,e.return,g)}}if(n&4&&(r=e.stateNode,r!=null)){var o=e.memoizedProps,s=a!==null?a.memoizedProps:o,l=e.type,c=e.updateQueue;if(e.updateQueue=null,c!==null)try{l==="input"&&o.type==="radio"&&o.name!=null&&Ux(r,o),Dp(l,s);var d=Dp(l,o);for(s=0;s<c.length;s+=2){var u=c[s],h=c[s+1];u==="style"?Fx(r,h):u==="dangerouslySetInnerHTML"?Ox(r,h):u==="children"?Xs(r,h):zf(r,u,h,d)}switch(l){case"input":jp(r,o);break;case"textarea":Mx(r,o);break;case"select":var m=r._wrapperState.wasMultiple;r._wrapperState.wasMultiple=!!o.multiple;var p=o.value;p!=null?fi(r,!!o.multiple,p,!1):m!==!!o.multiple&&(o.defaultValue!=null?fi(r,!!o.multiple,o.defaultValue,!0):fi(r,!!o.multiple,o.multiple?[]:"",!1))}r[ll]=o}catch(g){Qe(e,e.return,g)}}break;case 6:if(Ta(t,e),Ya(e),n&4){if(e.stateNode===null)throw Error(U(162));r=e.stateNode,o=e.memoizedProps;try{r.nodeValue=o}catch(g){Qe(e,e.return,g)}}break;case 3:if(Ta(t,e),Ya(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{nl(t.containerInfo)}catch(g){Qe(e,e.return,g)}break;case 4:Ta(t,e),Ya(e);break;case 13:Ta(t,e),Ya(e),r=e.child,r.flags&8192&&(o=r.memoizedState!==null,r.stateNode.isHidden=o,!o||r.alternate!==null&&r.alternate.memoizedState!==null||(ug=et())),n&4&&Gv(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(jt=(d=jt)||u,Ta(t,e),jt=d):Ta(t,e),Ya(e),n&8192){if(d=e.memoizedState!==null,(e.stateNode.isHidden=d)&&!u&&e.mode&1)for(X=e,u=e.child;u!==null;){for(h=X=u;X!==null;){switch(m=X,p=m.child,m.tag){case 0:case 11:case 14:case 15:Hs(4,m,m.return);break;case 1:ui(m,m.return);var b=m.stateNode;if(typeof b.componentWillUnmount=="function"){n=m,a=m.return;try{t=n,b.props=t.memoizedProps,b.state=t.memoizedState,b.componentWillUnmount()}catch(g){Qe(n,a,g)}}break;case 5:ui(m,m.return);break;case 22:if(m.memoizedState!==null){Hv(h);continue}}p!==null?(p.return=m,X=p):Hv(h)}u=u.sibling}e:for(u=null,h=e;;){if(h.tag===5){if(u===null){u=h;try{r=h.stateNode,d?(o=r.style,typeof o.setProperty=="function"?o.setProperty("display","none","important"):o.display="none"):(l=h.stateNode,c=h.memoizedProps.style,s=c!=null&&c.hasOwnProperty("display")?c.display:null,l.style.display=Gx("display",s))}catch(g){Qe(e,e.return,g)}}}else if(h.tag===6){if(u===null)try{h.stateNode.nodeValue=d?"":h.memoizedProps}catch(g){Qe(e,e.return,g)}}else if((h.tag!==22&&h.tag!==23||h.memoizedState===null||h===e)&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===e)break e;for(;h.sibling===null;){if(h.return===null||h.return===e)break e;u===h&&(u=null),h=h.return}u===h&&(u=null),h.sibling.return=h.return,h=h.sibling}}break;case 19:Ta(t,e),Ya(e),n&4&&Gv(e);break;case 21:break;default:Ta(t,e),Ya(e)}}function Ya(e){var t=e.flags;if(t&2){try{e:{for(var a=e.return;a!==null;){if(p0(a)){var n=a;break e}a=a.return}throw Error(U(160))}switch(n.tag){case 5:var r=n.stateNode;n.flags&32&&(Xs(r,""),n.flags&=-33);var o=Ov(e);dm(e,o,r);break;case 3:case 4:var s=n.stateNode.containerInfo,l=Ov(e);cm(e,l,s);break;default:throw Error(U(161))}}catch(c){Qe(e,e.return,c)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function sj(e,t,a){X=e,g0(e)}function g0(e,t,a){for(var n=(e.mode&1)!==0;X!==null;){var r=X,o=r.child;if(r.tag===22&&n){var s=r.memoizedState!==null||vc;if(!s){var l=r.alternate,c=l!==null&&l.memoizedState!==null||jt;l=vc;var d=jt;if(vc=s,(jt=c)&&!d)for(X=r;X!==null;)s=X,c=s.child,s.tag===22&&s.memoizedState!==null?Bv(r):c!==null?(c.return=s,X=c):Bv(r);for(;o!==null;)X=o,g0(o),o=o.sibling;X=r,vc=l,jt=d}Fv(e)}else r.subtreeFlags&8772&&o!==null?(o.return=r,X=o):Fv(e)}}function Fv(e){for(;X!==null;){var t=X;if(t.flags&8772){var a=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:jt||yu(5,t);break;case 1:var n=t.stateNode;if(t.flags&4&&!jt)if(a===null)n.componentDidMount();else{var r=t.elementType===t.type?a.memoizedProps:za(t.type,a.memoizedProps);n.componentDidUpdate(r,a.memoizedState,n.__reactInternalSnapshotBeforeUpdate)}var o=t.updateQueue;o!==null&&Pv(t,o,n);break;case 3:var s=t.updateQueue;if(s!==null){if(a=null,t.child!==null)switch(t.child.tag){case 5:a=t.child.stateNode;break;case 1:a=t.child.stateNode}Pv(t,s,a)}break;case 5:var l=t.stateNode;if(a===null&&t.flags&4){a=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&a.focus();break;case"img":c.src&&(a.src=c.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var d=t.alternate;if(d!==null){var u=d.memoizedState;if(u!==null){var h=u.dehydrated;h!==null&&nl(h)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(U(163))}jt||t.flags&512&&lm(t)}catch(m){Qe(t,t.return,m)}}if(t===e){X=null;break}if(a=t.sibling,a!==null){a.return=t.return,X=a;break}X=t.return}}function Hv(e){for(;X!==null;){var t=X;if(t===e){X=null;break}var a=t.sibling;if(a!==null){a.return=t.return,X=a;break}X=t.return}}function Bv(e){for(;X!==null;){var t=X;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{yu(4,t)}catch(c){Qe(t,a,c)}break;case 1:var n=t.stateNode;if(typeof n.componentDidMount=="function"){var r=t.return;try{n.componentDidMount()}catch(c){Qe(t,r,c)}}var o=t.return;try{lm(t)}catch(c){Qe(t,o,c)}break;case 5:var s=t.return;try{lm(t)}catch(c){Qe(t,s,c)}}}catch(c){Qe(t,t.return,c)}if(t===e){X=null;break}var l=t.sibling;if(l!==null){l.return=t.return,X=l;break}X=t.return}}var lj=Math.ceil,jd=zn.ReactCurrentDispatcher,cg=zn.ReactCurrentOwner,ga=zn.ReactCurrentBatchConfig,Ce=0,mt=null,st=null,xt=0,Yt=0,hi=Nr(0),ut=0,ml=null,fo=0,vu=0,dg=0,Bs=null,Ot=null,ug=0,Oi=1/0,gn=null,Nd=!1,um=null,mr=null,bc=!1,ir=null,Ed=0,Vs=0,hm=null,Jc=-1,Qc=0;function Dt(){return Ce&6?et():Jc!==-1?Jc:Jc=et()}function fr(e){return e.mode&1?Ce&2&&xt!==0?xt&-xt:V2.transition!==null?(Qc===0&&(Qc=ek()),Qc):(e=De,e!==0||(e=window.event,e=e===void 0?16:sk(e.type)),e):1}function Ga(e,t,a,n){if(50<Vs)throw Vs=0,hm=null,Error(U(185));Fl(e,a,n),(!(Ce&2)||e!==mt)&&(e===mt&&(!(Ce&2)&&(vu|=a),ut===4&&Zn(e,xt)),Bt(e,n),a===1&&Ce===0&&!(t.mode&1)&&(Oi=et()+500,mu&&Er()))}function Bt(e,t){var a=e.callbackNode;VI(e,t);var n=md(e,e===mt?xt:0);if(n===0)a!==null&&Xy(a),e.callbackNode=null,e.callbackPriority=0;else if(t=n&-n,e.callbackPriority!==t){if(a!=null&&Xy(a),t===1)e.tag===0?B2(Vv.bind(null,e)):Pk(Vv.bind(null,e)),O2(function(){!(Ce&6)&&Er()}),a=null;else{switch(tk(n)){case 1:a=Uf;break;case 4:a=Zx;break;case 16:a=pd;break;case 536870912:a=Xx;break;default:a=pd}a=S0(a,y0.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function y0(e,t){if(Jc=-1,Qc=0,Ce&6)throw Error(U(327));var a=e.callbackNode;if(wi()&&e.callbackNode!==a)return null;var n=md(e,e===mt?xt:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=zd(e,n);else{t=n;var r=Ce;Ce|=2;var o=b0();(mt!==e||xt!==t)&&(gn=null,Oi=et()+500,lo(e,t));do try{uj();break}catch(l){v0(e,l)}while(!0);Jf(),jd.current=o,Ce=r,st!==null?t=0:(mt=null,xt=0,t=ut)}if(t!==0){if(t===2&&(r=Lp(e),r!==0&&(n=r,t=pm(e,r))),t===1)throw a=ml,lo(e,0),Zn(e,n),Bt(e,et()),a;if(t===6)Zn(e,n);else{if(r=e.current.alternate,!(n&30)&&!cj(r)&&(t=zd(e,n),t===2&&(o=Lp(e),o!==0&&(n=o,t=pm(e,o))),t===1))throw a=ml,lo(e,0),Zn(e,n),Bt(e,et()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(U(345));case 2:Vr(e,Ot,gn);break;case 3:if(Zn(e,n),(n&130023424)===n&&(t=ug+500-et(),10<t)){if(md(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){Dt(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=$p(Vr.bind(null,e,Ot,gn),t);break}Vr(e,Ot,gn);break;case 4:if(Zn(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var s=31-Oa(n);o=1<<s,s=t[s],s>r&&(r=s),n&=~o}if(n=r,n=et()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*lj(n/1960))-n,10<n){e.timeoutHandle=$p(Vr.bind(null,e,Ot,gn),n);break}Vr(e,Ot,gn);break;case 5:Vr(e,Ot,gn);break;default:throw Error(U(329))}}}return Bt(e,et()),e.callbackNode===a?y0.bind(null,e):null}function pm(e,t){var a=Bs;return e.current.memoizedState.isDehydrated&&(lo(e,t).flags|=256),e=zd(e,t),e!==2&&(t=Ot,Ot=a,t!==null&&mm(t)),e}function mm(e){Ot===null?Ot=e:Ot.push.apply(Ot,e)}function cj(e){for(var t=e;;){if(t.flags&16384){var a=t.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var n=0;n<a.length;n++){var r=a[n],o=r.getSnapshot;r=r.value;try{if(!Fa(o(),r))return!1}catch{return!1}}}if(a=t.child,t.subtreeFlags&16384&&a!==null)a.return=t,t=a;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Zn(e,t){for(t&=~dg,t&=~vu,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-Oa(t),n=1<<a;e[a]=-1,t&=~n}}function Vv(e){if(Ce&6)throw Error(U(327));wi();var t=md(e,0);if(!(t&1))return Bt(e,et()),null;var a=zd(e,t);if(e.tag!==0&&a===2){var n=Lp(e);n!==0&&(t=n,a=pm(e,n))}if(a===1)throw a=ml,lo(e,0),Zn(e,t),Bt(e,et()),a;if(a===6)throw Error(U(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Vr(e,Ot,gn),Bt(e,et()),null}function hg(e,t){var a=Ce;Ce|=1;try{return e(t)}finally{Ce=a,Ce===0&&(Oi=et()+500,mu&&Er())}}function go(e){ir!==null&&ir.tag===0&&!(Ce&6)&&wi();var t=Ce;Ce|=1;var a=ga.transition,n=De;try{if(ga.transition=null,De=1,e)return e()}finally{De=n,ga.transition=a,Ce=t,!(Ce&6)&&Er()}}function pg(){Yt=hi.current,Fe(hi)}function lo(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,L2(a)),st!==null)for(a=st.return;a!==null;){var n=a;switch($f(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&bd();break;case 3:Mi(),Fe(Ft),Fe(Nt),ag();break;case 5:tg(n);break;case 4:Mi();break;case 13:Fe(Ve);break;case 19:Fe(Ve);break;case 10:Qf(n.type._context);break;case 22:case 23:pg()}a=a.return}if(mt=e,st=e=gr(e.current,null),xt=Yt=t,ut=0,ml=null,dg=vu=fo=0,Ot=Bs=null,Jr!==null){for(t=0;t<Jr.length;t++)if(a=Jr[t],n=a.interleaved,n!==null){a.interleaved=null;var r=n.next,o=a.pending;if(o!==null){var s=o.next;o.next=r,n.next=s}a.pending=n}Jr=null}return e}function v0(e,t){do{var a=st;try{if(Jf(),$c.current=Id,Td){for(var n=We.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}Td=!1}if(mo=0,pt=dt=We=null,Fs=!1,ul=0,cg.current=null,a===null||a.return===null){ut=1,ml=t,st=null;break}e:{var o=e,s=a.return,l=a,c=t;if(t=xt,l.flags|=32768,c!==null&&typeof c=="object"&&typeof c.then=="function"){var d=c,u=l,h=u.tag;if(!(u.mode&1)&&(h===0||h===11||h===15)){var m=u.alternate;m?(u.updateQueue=m.updateQueue,u.memoizedState=m.memoizedState,u.lanes=m.lanes):(u.updateQueue=null,u.memoizedState=null)}var p=zv(s);if(p!==null){p.flags&=-257,Rv(p,s,l,o,t),p.mode&1&&Ev(o,d,t),t=p,c=d;var b=t.updateQueue;if(b===null){var g=new Set;g.add(c),t.updateQueue=g}else b.add(c);break e}else{if(!(t&1)){Ev(o,d,t),mg();break e}c=Error(U(426))}}else if(Be&&l.mode&1){var v=zv(s);if(v!==null){!(v.flags&65536)&&(v.flags|=256),Rv(v,s,l,o,t),Kf(Li(c,l));break e}}o=c=Li(c,l),ut!==4&&(ut=2),Bs===null?Bs=[o]:Bs.push(o),o=s;do{switch(o.tag){case 3:o.flags|=65536,t&=-t,o.lanes|=t;var w=t0(o,c,t);Av(o,w);break e;case 1:l=c;var y=o.type,x=o.stateNode;if(!(o.flags&128)&&(typeof y.getDerivedStateFromError=="function"||x!==null&&typeof x.componentDidCatch=="function"&&(mr===null||!mr.has(x)))){o.flags|=65536,t&=-t,o.lanes|=t;var k=a0(o,l,t);Av(o,k);break e}}o=o.return}while(o!==null)}x0(a)}catch(C){t=C,st===a&&a!==null&&(st=a=a.return);continue}break}while(!0)}function b0(){var e=jd.current;return jd.current=Id,e===null?Id:e}function mg(){(ut===0||ut===3||ut===2)&&(ut=4),mt===null||!(fo&268435455)&&!(vu&268435455)||Zn(mt,xt)}function zd(e,t){var a=Ce;Ce|=2;var n=b0();(mt!==e||xt!==t)&&(gn=null,lo(e,t));do try{dj();break}catch(r){v0(e,r)}while(!0);if(Jf(),Ce=a,jd.current=n,st!==null)throw Error(U(261));return mt=null,xt=0,ut}function dj(){for(;st!==null;)w0(st)}function uj(){for(;st!==null&&!qI();)w0(st)}function w0(e){var t=C0(e.alternate,e,Yt);e.memoizedProps=e.pendingProps,t===null?x0(e):st=t,cg.current=null}function x0(e){var t=e;do{var a=t.alternate;if(e=t.return,t.flags&32768){if(a=rj(a,t),a!==null){a.flags&=32767,st=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{ut=6,st=null;return}}else if(a=nj(a,t,Yt),a!==null){st=a;return}if(t=t.sibling,t!==null){st=t;return}st=t=e}while(t!==null);ut===0&&(ut=5)}function Vr(e,t,a){var n=De,r=ga.transition;try{ga.transition=null,De=1,hj(e,t,a,n)}finally{ga.transition=r,De=n}return null}function hj(e,t,a,n){do wi();while(ir!==null);if(Ce&6)throw Error(U(327));a=e.finishedWork;var r=e.finishedLanes;if(a===null)return null;if(e.finishedWork=null,e.finishedLanes=0,a===e.current)throw Error(U(177));e.callbackNode=null,e.callbackPriority=0;var o=a.lanes|a.childLanes;if(WI(e,o),e===mt&&(st=mt=null,xt=0),!(a.subtreeFlags&2064)&&!(a.flags&2064)||bc||(bc=!0,S0(pd,function(){return wi(),null})),o=(a.flags&15990)!==0,a.subtreeFlags&15990||o){o=ga.transition,ga.transition=null;var s=De;De=1;var l=Ce;Ce|=4,cg.current=null,ij(e,a),f0(a,e),z2(Vp),fd=!!Bp,Vp=Bp=null,e.current=a,sj(a),UI(),Ce=l,De=s,ga.transition=o}else e.current=a;if(bc&&(bc=!1,ir=e,Ed=r),o=e.pendingLanes,o===0&&(mr=null),OI(a.stateNode),Bt(e,et()),t!==null)for(n=e.onRecoverableError,a=0;a<t.length;a++)r=t[a],n(r.value,{componentStack:r.stack,digest:r.digest});if(Nd)throw Nd=!1,e=um,um=null,e;return Ed&1&&e.tag!==0&&wi(),o=e.pendingLanes,o&1?e===hm?Vs++:(Vs=0,hm=e):Vs=0,Er(),null}function wi(){if(ir!==null){var e=tk(Ed),t=ga.transition,a=De;try{if(ga.transition=null,De=16>e?16:e,ir===null)var n=!1;else{if(e=ir,ir=null,Ed=0,Ce&6)throw Error(U(331));var r=Ce;for(Ce|=4,X=e.current;X!==null;){var o=X,s=o.child;if(X.flags&16){var l=o.deletions;if(l!==null){for(var c=0;c<l.length;c++){var d=l[c];for(X=d;X!==null;){var u=X;switch(u.tag){case 0:case 11:case 15:Hs(8,u,o)}var h=u.child;if(h!==null)h.return=u,X=h;else for(;X!==null;){u=X;var m=u.sibling,p=u.return;if(h0(u),u===d){X=null;break}if(m!==null){m.return=p,X=m;break}X=p}}}var b=o.alternate;if(b!==null){var g=b.child;if(g!==null){b.child=null;do{var v=g.sibling;g.sibling=null,g=v}while(g!==null)}}X=o}}if(o.subtreeFlags&2064&&s!==null)s.return=o,X=s;else e:for(;X!==null;){if(o=X,o.flags&2048)switch(o.tag){case 0:case 11:case 15:Hs(9,o,o.return)}var w=o.sibling;if(w!==null){w.return=o.return,X=w;break e}X=o.return}}var y=e.current;for(X=y;X!==null;){s=X;var x=s.child;if(s.subtreeFlags&2064&&x!==null)x.return=s,X=x;else e:for(s=y;X!==null;){if(l=X,l.flags&2048)try{switch(l.tag){case 0:case 11:case 15:yu(9,l)}}catch(C){Qe(l,l.return,C)}if(l===s){X=null;break e}var k=l.sibling;if(k!==null){k.return=l.return,X=k;break e}X=l.return}}if(Ce=r,Er(),ln&&typeof ln.onPostCommitFiberRoot=="function")try{ln.onPostCommitFiberRoot(cu,e)}catch{}n=!0}return n}finally{De=a,ga.transition=t}}return!1}function Wv(e,t,a){t=Li(a,t),t=t0(e,t,1),e=pr(e,t,1),t=Dt(),e!==null&&(Fl(e,1,t),Bt(e,t))}function Qe(e,t,a){if(e.tag===3)Wv(e,e,a);else for(;t!==null;){if(t.tag===3){Wv(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(mr===null||!mr.has(n))){e=Li(a,e),e=a0(t,e,1),t=pr(t,e,1),e=Dt(),t!==null&&(Fl(t,1,e),Bt(t,e));break}}t=t.return}}function pj(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),t=Dt(),e.pingedLanes|=e.suspendedLanes&a,mt===e&&(xt&a)===a&&(ut===4||ut===3&&(xt&130023424)===xt&&500>et()-ug?lo(e,0):dg|=a),Bt(e,t)}function k0(e,t){t===0&&(e.mode&1?(t=cc,cc<<=1,!(cc&130023424)&&(cc=4194304)):t=1);var a=Dt();e=Tn(e,t),e!==null&&(Fl(e,t,a),Bt(e,a))}function mj(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),k0(e,a)}function fj(e,t){var a=0;switch(e.tag){case 13:var n=e.stateNode,r=e.memoizedState;r!==null&&(a=r.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(U(314))}n!==null&&n.delete(t),k0(e,a)}var C0;C0=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ft.current)Gt=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return Gt=!1,aj(e,t,a);Gt=!!(e.flags&131072)}else Gt=!1,Be&&t.flags&1048576&&Tk(t,kd,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Yc(e,t),e=t.pendingProps;var r=_i(t,Nt.current);bi(t,a),r=rg(null,t,n,e,r,a);var o=og();return t.flags|=1,typeof r=="object"&&r!==null&&typeof r.render=="function"&&r.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ht(n)?(o=!0,wd(t)):o=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,Xf(t),r.updater=gu,t.stateNode=r,r._reactInternals=t,em(t,n,e,a),t=nm(null,t,n,!0,o,a)):(t.tag=0,Be&&o&&Wf(t),zt(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(Yc(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=yj(n),e=za(n,e),r){case 0:t=am(null,t,n,e,a);break e;case 1:t=qv(null,t,n,e,a);break e;case 11:t=Dv(null,t,n,e,a);break e;case 14:t=_v(null,t,n,za(n.type,e),a);break e}throw Error(U(306,n,""))}return t;case 0:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:za(n,r),am(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:za(n,r),qv(e,t,n,r,a);case 3:e:{if(i0(t),e===null)throw Error(U(387));n=t.pendingProps,o=t.memoizedState,r=o.element,Rk(e,t),Ad(t,n,null,a);var s=t.memoizedState;if(n=s.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){r=Li(Error(U(423)),t),t=Uv(e,t,n,a,r);break e}else if(n!==r){r=Li(Error(U(424)),t),t=Uv(e,t,n,a,r);break e}else for(Xt=hr(t.stateNode.containerInfo.firstChild),ea=t,Be=!0,La=null,a=Ek(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(qi(),n===r){t=In(e,t,a);break e}zt(e,t,n,a)}t=t.child}return t;case 5:return Dk(t),e===null&&Qp(t),n=t.type,r=t.pendingProps,o=e!==null?e.memoizedProps:null,s=r.children,Wp(n,r)?s=null:o!==null&&Wp(n,o)&&(t.flags|=32),o0(e,t),zt(e,t,s,a),t.child;case 6:return e===null&&Qp(t),null;case 13:return s0(e,t,a);case 4:return eg(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=Ui(t,null,n,a):zt(e,t,n,a),t.child;
vendor: 4,794 bytes, line 41
41case 11:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:za(n,r),Dv(e,t,n,r,a);case 7:return zt(e,t,t.pendingProps,a),t.child;case 8:return zt(e,t,t.pendingProps.children,a),t.child;case 12:return zt(e,t,t.pendingProps.children,a),t.child;case 10:e:{if(n=t.type._context,r=t.pendingProps,o=t.memoizedProps,s=r.value,Me(Cd,n._currentValue),n._currentValue=s,o!==null)if(Fa(o.value,s)){if(o.children===r.children&&!Ft.current){t=In(e,t,a);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var l=o.dependencies;if(l!==null){s=o.child;for(var c=l.firstContext;c!==null;){if(c.context===n){if(o.tag===1){c=kn(-1,a&-a),c.tag=2;var d=o.updateQueue;if(d!==null){d=d.shared;var u=d.pending;u===null?c.next=c:(c.next=u.next,u.next=c),d.pending=c}}o.lanes|=a,c=o.alternate,c!==null&&(c.lanes|=a),Zp(o.return,a,t),l.lanes|=a;break}c=c.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(U(341));s.lanes|=a,l=s.alternate,l!==null&&(l.lanes|=a),Zp(s,a,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}zt(e,t,r.children,a),t=t.child}return t;case 9:return r=t.type,n=t.pendingProps.children,bi(t,a),r=ba(r),n=n(r),t.flags|=1,zt(e,t,n,a),t.child;case 14:return n=t.type,r=za(n,t.pendingProps),r=za(n.type,r),_v(e,t,n,r,a);case 15:return n0(e,t,t.type,t.pendingProps,a);case 17:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:za(n,r),Yc(e,t),t.tag=1,Ht(n)?(e=!0,wd(t)):e=!1,bi(t,a),e0(t,n,r),em(t,n,r,a),nm(null,t,n,!0,e,a);case 19:return l0(e,t,a);case 22:return r0(e,t,a)}throw Error(U(156,t.tag))};function S0(e,t){return Qx(e,t)}function gj(e,t,a,n){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function fa(e,t,a,n){return new gj(e,t,a,n)}function fg(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yj(e){if(typeof e=="function")return fg(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Df)return 11;if(e===_f)return 14}return 2}function gr(e,t){var a=e.alternate;return a===null?(a=fa(e.tag,t,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&14680064,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,t=e.dependencies,a.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function Zc(e,t,a,n,r,o){var s=2;if(n=e,typeof e=="function")fg(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case ai:return co(a.children,r,o,t);case Rf:s=8,r|=8;break;case Sp:return e=fa(12,a,t,r|2),e.elementType=Sp,e.lanes=o,e;case Ap:return e=fa(13,a,t,r),e.elementType=Ap,e.lanes=o,e;case Pp:return e=fa(19,a,t,r),e.elementType=Pp,e.lanes=o,e;case Dx:return bu(a,r,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case zx:s=10;break e;case Rx:s=9;break e;case Df:s=11;break e;case _f:s=14;break e;case $n:s=16,n=null;break e}throw Error(U(130,e==null?e:typeof e,""))}return t=fa(s,a,t,r),t.elementType=e,t.type=n,t.lanes=o,t}function co(e,t,a,n){return e=fa(7,e,n,t),e.lanes=a,e}function bu(e,t,a,n){return e=fa(22,e,n,t),e.elementType=Dx,e.lanes=a,e.stateNode={isHidden:!1},e}function qh(e,t,a){return e=fa(6,e,null,t),e.lanes=a,e}function Uh(e,t,a){return t=fa(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function vj(e,t,a,n,r){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=yh(0),this.expirationTimes=yh(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=yh(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function gg(e,t,a,n,r,o,s,l,c){return e=new vj(e,t,a,l,c),t===1?(t=1,o===!0&&(t|=8)):t=0,o=fa(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},Xf(o),e}function bj(e,t,a){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;
vendor: 4,591 bytes, line 41
41return{$$typeof:ti,key:n==null?null:""+n,children:e,containerInfo:t,implementation:a}}function A0(e){if(!e)return xr;e=e._reactInternals;e:{if(jo(e)!==e||e.tag!==1)throw Error(U(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Ht(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(U(171))}if(e.tag===1){var a=e.type;if(Ht(a))return Ak(e,a,t)}return t}function P0(e,t,a,n,r,o,s,l,c){return e=gg(a,n,!0,e,r,o,s,l,c),e.context=A0(null),a=e.current,n=Dt(),r=fr(a),o=kn(n,r),o.callback=t??null,pr(a,o,r),e.current.lanes=r,Fl(e,r,n),Bt(e,n),e}function wu(e,t,a,n){var r=t.current,o=Dt(),s=fr(r);return a=A0(a),t.context===null?t.context=a:t.pendingContext=a,t=kn(o,s),t.payload={element:e},n=n===void 0?null:n,n!==null&&(t.callback=n),e=pr(r,t,s),e!==null&&(Ga(e,r,s,o),Wc(e,r,s)),s}function Rd(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function $v(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function yg(e,t){$v(e,t),(e=e.alternate)&&$v(e,t)}function wj(){return null}var T0=typeof reportError=="function"?reportError:function(e){console.error(e)};function vg(e){this._internalRoot=e}xu.prototype.render=vg.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(U(409));wu(e,t,null,null)};xu.prototype.unmount=vg.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;go(function(){wu(null,e,null,null)}),t[Pn]=null}};function xu(e){this._internalRoot=e}xu.prototype.unstable_scheduleHydration=function(e){if(e){var t=rk();e={blockedOn:null,target:e,priority:t};for(var a=0;a<Qn.length&&t!==0&&t<Qn[a].priority;a++);Qn.splice(a,0,e),a===0&&ik(e)}};function bg(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function ku(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Kv(){}function xj(e,t,a,n,r){if(r){if(typeof n=="function"){var o=n;n=function(){var d=Rd(s);o.call(d)}}var s=P0(t,n,e,0,null,!1,!1,"",Kv);return e._reactRootContainer=s,e[Pn]=s.current,il(e.nodeType===8?e.parentNode:e),go(),s}for(;r=e.lastChild;)e.removeChild(r);if(typeof n=="function"){var l=n;n=function(){var d=Rd(c);l.call(d)}}var c=gg(e,0,!1,null,null,!1,!1,"",Kv);return e._reactRootContainer=c,e[Pn]=c.current,il(e.nodeType===8?e.parentNode:e),go(function(){wu(t,c,a,n)}),c}function Cu(e,t,a,n,r){var o=a._reactRootContainer;if(o){var s=o;if(typeof r=="function"){var l=r;r=function(){var c=Rd(s);l.call(c)}}wu(t,s,e,r)}else s=xj(a,t,e,r,n);return Rd(s)}ak=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=js(t.pendingLanes);a!==0&&(Mf(t,a|1),Bt(t,et()),!(Ce&6)&&(Oi=et()+500,Er()))}break;case 13:go(function(){var n=Tn(e,1);if(n!==null){var r=Dt();Ga(n,e,1,r)}}),yg(e,1)}};Lf=function(e){if(e.tag===13){var t=Tn(e,134217728);if(t!==null){var a=Dt();Ga(t,e,134217728,a)}yg(e,134217728)}};nk=function(e){if(e.tag===13){var t=fr(e),a=Tn(e,t);if(a!==null){var n=Dt();Ga(a,e,t,n)}yg(e,t)}};rk=function(){return De};ok=function(e,t){var a=De;try{return De=e,t()}finally{De=a}};qp=function(e,t,a){switch(t){case"input":if(jp(e,a),t=a.name,a.type==="radio"&&t!=null){for(a=e;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<a.length;t++){var n=a[t];if(n!==e&&n.form===e.form){var r=pu(n);if(!r)throw Error(U(90));qx(n),jp(n,r)}}}break;case"textarea":Mx(e,a);break;case"select":t=a.value,t!=null&&fi(e,!!a.multiple,t,!1)}};Vx=hg;Wx=go;var kj={usingClientEntryPoint:!1,Events:[Bl,ii,pu,Hx,Bx,hg]},xs={findFiberByHostInstance:Yr,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},Cj={bundleType:xs.bundleType,version:xs.version,rendererPackageName:xs.rendererPackageName,rendererConfig:xs.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:zn.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Yx(e),e===null?null:e.stateNode},findFiberByHostInstance:xs.findFiberByHostInstance||wj,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};
41if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var wc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wc.isDisabled&&wc.supportsFiber)try{cu=wc.inject(Cj),ln=wc}catch{}}oa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=kj;oa.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!bg(t))throw Error(U(200));return bj(e,t,null,a)};oa.createRoot=function(e,t){if(!bg(e))throw Error(U(299));var a=!1,n="",r=T0;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(n=t.identifierPrefix),t.onRecoverableError!==void 0&&(r=t.onRecoverableError)),t=gg(e,1,!1,null,null,a,!1,n,r),e[Pn]=t.current,il(e.nodeType===8?e.parentNode:e),new vg(t)};oa.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(U(188)):(e=Object.keys(e).join(","),Error(U(268,e)));return e=Yx(t),e=e===null?null:e.stateNode,e};oa.flushSync=function(e){return go(e)};oa.hydrate=function(e,t,a){if(!ku(t))throw Error(U(200));return Cu(null,e,t,!0,a)};oa.hydrateRoot=function(e,t,a){if(!bg(e))throw Error(U(405));var n=a!=null&&a.hydratedSources||null,r=!1,o="",s=T0;if(a!=null&&(a.unstable_strictMode===!0&&(r=!0),a.identifierPrefix!==void 0&&(o=a.identifierPrefix),a.onRecoverableError!==void 0&&(s=a.onRecoverableError)),t=P0(t,null,e,1,a??null,r,!1,o,s),e[Pn]=t.current,il(e),n)for(e=0;e<n.length;e++)a=n[e],r=a._getVersion,r=r(a._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[a,r]:t.mutableSourceEagerHydrationData.push(a,r);return new xu(t)};oa.render=function(e,t,a){if(!ku(t))throw Error(U(200));return Cu(null,e,t,!1,a)};oa.unmountComponentAtNode=function(e){if(!ku(e))throw Error(U(40));return e._reactRootContainer?(go(function(){Cu(null,null,e,!1,function(){e._reactRootContainer=null,e[Pn]=null})}),!0):!1};oa.unstable_batchedUpdates=hg;oa.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!ku(a))throw Error(U(200));if(e==null||e._reactInternals===void 0)throw Error(U(38));return Cu(e,t,a,!1,n)};oa.version="18.3.1-next-f1338f8080-20240426";function I0(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(I0)}catch(e){console.error(e)}}I0(),Ix.exports=oa;var No=Ix.exports;const wg=gx(No);var j0,Yv=No;j0=Yv.createRoot,Yv.hydrateRoot;const Sj="modulepreload",Aj=function(e){return"/"+e},Jv={},bt=function(t,a,n){let r=Promise.resolve();if(a&&a.length>0){document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),l=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));r=Promise.allSettled(a.map(c=>{if(c=Aj(c),c in Jv)return;Jv[c]=!0;const d=c.endsWith(".css"),u=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${u}`))return;const h=document.createElement("link");if(h.rel=d?"stylesheet":Sj,d||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),d)return new Promise((m,p)=>{h.addEventListener("load",m),h.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(s){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=s,window.dispatchEvent(l),!l.defaultPrevented)throw s}return r.then(s=>{for(const l of s||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})},Pj=1,Tj=1e6;let Mh=0;function Ij(){return Mh=(Mh+1)%Number.MAX_SAFE_INTEGER,Mh.toString()}const Lh=new Map,Qv=e=>{if(Lh.has(e))return;const t=setTimeout(()=>{Lh.delete(e),Ws({type:"REMOVE_TOAST",toastId:e})},Tj);Lh.set(e,t)},jj=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,Pj)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(a=>a.id===t.toast.id?{...a,...t.toast}:a)};case"DISMISS_TOAST":{const{toastId:a}=t;return a?Qv(a):e.toasts.forEach(n=>{Qv(n.id)}),{...e,toasts:e.toasts.map(n=>n.id===a||a===void 0?{...n,open:!1}:n)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(a=>a.id!==t.toastId)}}},Xc=[];let ed={toasts:[]};function Ws(e){ed=jj(ed,e),Xc.forEach(t=>{t(ed)})}function fm({...e}){const t=Ij(),a=r=>Ws({type:"UPDATE_TOAST",toast:{...r,id:t}}),n=()=>Ws({type:"DISMISS_TOAST",toastId:t});return Ws({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:r=>{r||n()}}}),{id:t,dismiss:n,update:a}}function N0(){const[e,t]=f.useState(ed);return f.useEffect(()=>(Xc.push(t),()=>{const a=Xc.indexOf(t);a>-1&&Xc.splice(a,1)}),[e]),{...e,toast:fm,dismiss:a=>Ws({type:"DISMISS_TOAST",toastId:a})}}function q(e,t,{checkForDefaultPrevented:a=!0}={}){return function(r){if(e==null||e(r),a===!1||!r.defaultPrevented)return t==null?void 0:t(r)}}function Zv(e,t){if(typeof e=="function")return e(t);
vendor: 13,049 bytes, line 41
41e!=null&&(e.current=t)}function Wl(...e){return t=>{let a=!1;const n=e.map(r=>{const o=Zv(r,t);return!a&&typeof o=="function"&&(a=!0),o});if(a)return()=>{for(let r=0;r<n.length;r++){const o=n[r];typeof o=="function"?o():Zv(e[r],null)}}}}function ye(...e){return f.useCallback(Wl(...e),e)}function Nj(e,t){const a=f.createContext(t),n=o=>{const{children:s,...l}=o,c=f.useMemo(()=>l,Object.values(l));return i.jsx(a.Provider,{value:c,children:s})};n.displayName=e+"Provider";function r(o){const s=f.useContext(a);if(s)return s;if(t!==void 0)return t;throw new Error(`\`${o}\` must be used within \`${e}\``)}return[n,r]}function Wt(e,t=[]){let a=[];function n(o,s){const l=f.createContext(s),c=a.length;a=[...a,s];const d=h=>{var w;const{scope:m,children:p,...b}=h,g=((w=m==null?void 0:m[e])==null?void 0:w[c])||l,v=f.useMemo(()=>b,Object.values(b));return i.jsx(g.Provider,{value:v,children:p})};d.displayName=o+"Provider";function u(h,m){var g;const p=((g=m==null?void 0:m[e])==null?void 0:g[c])||l,b=f.useContext(p);if(b)return b;if(s!==void 0)return s;throw new Error(`\`${h}\` must be used within \`${o}\``)}return[d,u]}const r=()=>{const o=a.map(s=>f.createContext(s));return function(l){const c=(l==null?void 0:l[e])||o;return f.useMemo(()=>({[`__scope${e}`]:{...l,[e]:c}}),[l,c])}};return r.scopeName=e,[n,Ej(r,...t)]}function Ej(...e){const t=e[0];if(e.length===1)return t;const a=()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return function(o){const s=n.reduce((l,{useScope:c,scopeName:d})=>{const h=c(o)[`__scope${d}`];return{...l,...h}},{});return f.useMemo(()=>({[`__scope${t.scopeName}`]:s}),[s])}};return a.scopeName=t.scopeName,a}function yo(e){const t=Rj(e),a=f.forwardRef((n,r)=>{const{children:o,...s}=n,l=f.Children.toArray(o),c=l.find(_j);if(c){const d=c.props.children,u=l.map(h=>h===c?f.Children.count(d)>1?f.Children.only(null):f.isValidElement(d)?d.props.children:null:h);return i.jsx(t,{...s,ref:r,children:f.isValidElement(d)?f.cloneElement(d,void 0,u):null})}return i.jsx(t,{...s,ref:r,children:o})});return a.displayName=`${e}.Slot`,a}var zj=yo("Slot");function Rj(e){const t=f.forwardRef((a,n)=>{const{children:r,...o}=a;if(f.isValidElement(r)){const s=Uj(r),l=qj(o,r.props);return r.type!==f.Fragment&&(l.ref=n?Wl(n,s):s),f.cloneElement(r,l)}return f.Children.count(r)>1?f.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var E0=Symbol("radix.slottable");function Dj(e){const t=({children:a})=>i.jsx(i.Fragment,{children:a});return t.displayName=`${e}.Slottable`,t.__radixId=E0,t}function _j(e){return f.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===E0}function qj(e,t){const a={...t};for(const n in t){const r=e[n],o=t[n];/^on[A-Z]/.test(n)?r&&o?a[n]=(...l)=>{const c=o(...l);return r(...l),c}:r&&(a[n]=r):n==="style"?a[n]={...r,...o}:n==="className"&&(a[n]=[r,o].filter(Boolean).join(" "))}return{...e,...a}}function Uj(e){var n,r;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}function Eo(e){const t=e+"CollectionProvider",[a,n]=Wt(t),[r,o]=a(t,{collectionRef:{current:null},itemMap:new Map}),s=g=>{const{scope:v,children:w}=g,y=D.useRef(null),x=D.useRef(new Map).current;return i.jsx(r,{scope:v,itemMap:x,collectionRef:y,children:w})};s.displayName=t;const l=e+"CollectionSlot",c=yo(l),d=D.forwardRef((g,v)=>{const{scope:w,children:y}=g,x=o(l,w),k=ye(v,x.collectionRef);return i.jsx(c,{ref:k,children:y})});d.displayName=l;const u=e+"CollectionItemSlot",h="data-radix-collection-item",m=yo(u),p=D.forwardRef((g,v)=>{const{scope:w,children:y,...x}=g,k=D.useRef(null),C=ye(v,k),S=o(u,w);return D.useEffect(()=>(S.itemMap.set(k,{ref:k,...x}),()=>void S.itemMap.delete(k))),i.jsx(m,{[h]:"",ref:C,children:y})});p.displayName=u;function b(g){const v=o(e+"CollectionConsumer",g);return D.useCallback(()=>{const y=v.collectionRef.current;if(!y)return[];const x=Array.from(y.querySelectorAll(`[${h}]`));return Array.from(v.itemMap.values()).sort((S,A)=>x.indexOf(S.ref.current)-x.indexOf(A.ref.current))},[v.collectionRef,v.itemMap])}return[{Provider:s,Slot:d,ItemSlot:p},b,n]}var Mj=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],ee=Mj.reduce((e,t)=>{const a=yo(`Primitive.${t}`),n=f.forwardRef((r,o)=>{const{asChild:s,...l}=r,c=s?a:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),i.jsx(c,{...l,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function fl(e,t){e&&No.flushSync(()=>e.dispatchEvent(t))}function tt(e){const t=f.useRef(e);return f.useEffect(()=>{t.current=e}),f.useMemo(()=>(...a)=>{var n;return(n=t.current)==null?void 0:n.call(t,...a)},[])}function Lj(e,t=globalThis==null?void 0:globalThis.document){const a=tt(e);f.useEffect(()=>{const n=r=>{r.key==="Escape"&&a(r)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[a,t])}var Oj="DismissableLayer",gm="dismissableLayer.update",Gj="dismissableLayer.pointerDownOutside",Fj="dismissableLayer.focusOutside",Xv,z0=f.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),zo=f.forwardRef((e,t)=>{const{disableOutsidePointerEvents:a=!1,onEscapeKeyDown:n,onPointerDownOutside:r,onFocusOutside:o,onInteractOutside:s,onDismiss:l,...c}=e,d=f.useContext(z0),[u,h]=f.useState(null),m=(u==null?void 0:u.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,p]=f.useState({}),b=ye(t,A=>h(A)),g=Array.from(d.layers),[v]=[...d.layersWithOutsidePointerEventsDisabled].slice(-1),w=g.indexOf(v),y=u?g.indexOf(u):-1,x=d.layersWithOutsidePointerEventsDisabled.size>0,k=y>=w,C=Bj(A=>{const P=A.target,I=[...d.branches].some(N=>N.contains(P));!k||I||(r==null||r(A),s==null||s(A),A.defaultPrevented||l==null||l())},m),S=Vj(A=>{const P=A.target;[...d.branches].some(N=>N.contains(P))||(o==null||o(A),s==null||s(A),A.defaultPrevented||l==null||l())},m);return Lj(A=>{y===d.layers.size-1&&(n==null||n(A),!A.defaultPrevented&&l&&(A.preventDefault(),l()))},m),f.useEffect(()=>{if(u)return a&&(d.layersWithOutsidePointerEventsDisabled.size===0&&(Xv=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),d.layersWithOutsidePointerEventsDisabled.add(u)),d.layers.add(u),eb(),()=>{a&&d.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=Xv)}},[u,m,a,d]),f.useEffect(()=>()=>{u&&(d.layers.delete(u),d.layersWithOutsidePointerEventsDisabled.delete(u),eb())},[u,d]),f.useEffect(()=>{const A=()=>p({});return document.addEventListener(gm,A),()=>document.removeEventListener(gm,A)},[]),i.jsx(ee.div,{...c,ref:b,style:{pointerEvents:x?k?"auto":"none":void 0,...e.style},onFocusCapture:q(e.onFocusCapture,S.onFocusCapture),onBlurCapture:q(e.onBlurCapture,S.onBlurCapture),onPointerDownCapture:q(e.onPointerDownCapture,C.onPointerDownCapture)})});zo.displayName=Oj;var Hj="DismissableLayerBranch",R0=f.forwardRef((e,t)=>{const a=f.useContext(z0),n=f.useRef(null),r=ye(t,n);return f.useEffect(()=>{const o=n.current;if(o)return a.branches.add(o),()=>{a.branches.delete(o)}},[a.branches]),i.jsx(ee.div,{...e,ref:r})});R0.displayName=Hj;function Bj(e,t=globalThis==null?void 0:globalThis.document){const a=tt(e),n=f.useRef(!1),r=f.useRef(()=>{});return f.useEffect(()=>{const o=l=>{if(l.target&&!n.current){let c=function(){D0(Gj,a,d,{discrete:!0})};const d={originalEvent:l};l.pointerType==="touch"?(t.removeEventListener("click",r.current),r.current=c,t.addEventListener("click",r.current,{once:!0})):c()}else t.removeEventListener("click",r.current);n.current=!1},s=window.setTimeout(()=>{t.addEventListener("pointerdown",o)},0);return()=>{window.clearTimeout(s),t.removeEventListener("pointerdown",o),t.removeEventListener("click",r.current)}},[t,a]),{onPointerDownCapture:()=>n.current=!0}}function Vj(e,t=globalThis==null?void 0:globalThis.document){const a=tt(e),n=f.useRef(!1);return f.useEffect(()=>{const r=o=>{o.target&&!n.current&&D0(Fj,a,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",r),()=>t.removeEventListener("focusin",r)},[t,a]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function eb(){const e=new CustomEvent(gm);document.dispatchEvent(e)}function D0(e,t,a,{discrete:n}){const r=a.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:a});t&&r.addEventListener(e,t,{once:!0}),n?fl(r,o):r.dispatchEvent(o)}var Wj=zo,$j=R0,rt=globalThis!=null&&globalThis.document?f.useLayoutEffect:()=>{},Kj="Portal",Zi=f.forwardRef((e,t)=>{var l;const{container:a,...n}=e,[r,o]=f.useState(!1);rt(()=>o(!0),[]);const s=a||r&&((l=globalThis==null?void 0:globalThis.document)==null?void 0:l.body);return s?wg.createPortal(i.jsx(ee.div,{...n,ref:t}),s):null});Zi.displayName=Kj;function Yj(e,t){return f.useReducer((a,n)=>t[a][n]??a,e)}var ft=e=>{const{present:t,children:a}=e,n=Jj(t),r=typeof a=="function"?a({present:n.isPresent}):f.Children.only(a),o=ye(n.ref,Qj(r));return typeof a=="function"||n.isPresent?f.cloneElement(r,{ref:o}):null};ft.displayName="Presence";function Jj(e){const[t,a]=f.useState(),n=f.useRef(null),r=f.useRef(e),o=f.useRef("none"),s=e?"mounted":"unmounted",[l,c]=Yj(s,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return f.useEffect(()=>{const d=xc(n.current);o.current=l==="mounted"?d:"none"},[l]),rt(()=>{const d=n.current,u=r.current;if(u!==e){const m=o.current,p=xc(d);e?c("MOUNT"):p==="none"||(d==null?void 0:d.display)==="none"?c("UNMOUNT"):c(u&&m!==p?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,c]),rt(()=>{if(t){let d;const u=t.ownerDocument.defaultView??window,h=p=>{const g=xc(n.current).includes(p.animationName);if(p.target===t&&g&&(c("ANIMATION_END"),!r.current)){const v=t.style.animationFillMode;t.style.animationFillMode="forwards",d=u.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=v)})}},m=p=>{p.target===t&&(o.current=xc(n.current))};return t.addEventListener("animationstart",m),t.addEventListener("animationcancel",h),t.addEventListener("animationend",h),()=>{u.clearTimeout(d),t.removeEventListener("animationstart",m),t.removeEventListener("animationcancel",h),t.removeEventListener("animationend",h)}}else c("ANIMATION_END")},[t,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:f.useCallback(d=>{n.current=d?getComputedStyle(d):null,a(d)},[])}}function xc(e){return(e==null?void 0:e.animationName)||"none"}function Qj(e){var n,r;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}var Zj=jf[" useInsertionEffect ".trim().toString()]||rt;function Vt({prop:e,defaultProp:t,onChange:a=()=>{},caller:n}){const[r,o,s]=Xj({defaultProp:t,onChange:a}),l=e!==void 0,c=l?e:r;{const u=f.useRef(e!==void 0);f.useEffect(()=>{const h=u.current;h!==l&&console.warn(`${n} is changing from ${h?"controlled":"uncontrolled"} to ${l?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),u.current=l},[l,n])}const d=f.useCallback(u=>{var h;if(l){const m=eN(u)?u(e):u;m!==e&&((h=s.current)==null||h.call(s,m))}else o(u)},[l,e,o,s]);return[c,d]}function Xj({defaultProp:e,onChange:t}){const[a,n]=f.useState(e),r=f.useRef(a),o=f.useRef(t);return Zj(()=>{o.current=t},[t]),f.useEffect(()=>{var s;r.current!==a&&((s=o.current)==null||s.call(o,a),r.current=a)},[a,r]),[a,n,o]}function eN(e){return typeof e=="function"}var _0=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),tN="VisuallyHidden",Su=f.forwardRef((e,t)=>i.jsx(ee.span,{...e,ref:t,style:{..._0,...e.style}}));Su.displayName=tN;var q0=Su,xg="ToastProvider",[kg,aN,nN]=Eo("Toast"),[U0,dF]=Wt("Toast",[nN]),[rN,Au]=U0(xg),M0=e=>{const{__scopeToast:t,label:a="Notification",duration:n=5e3,swipeDirection:r="right",swipeThreshold:o=50,children:s}=e,[l,c]=f.useState(null),[d,u]=f.useState(0),h=f.useRef(!1),m=f.useRef(!1);return a.trim()||console.error(`Invalid prop \`label\` supplied to \`${xg}\`. Expected non-empty \`string\`.`),i.jsx(kg.Provider,{scope:t,children:i.jsx(rN,{scope:t,label:a,duration:n,swipeDirection:r,swipeThreshold:o,toastCount:d,viewport:l,onViewportChange:c,onToastAdd:f.useCallback(()=>u(p=>p+1),[]),onToastRemove:f.useCallback(()=>u(p=>p-1),[]),isFocusedToastEscapeKeyDownRef:h,isClosePausedRef:m,children:s})})};M0.displayName=xg;var L0="ToastViewport",oN=["F8"],ym="toast.viewportPause",vm="toast.viewportResume",O0=f.forwardRef((e,t)=>
41{const{__scopeToast:a,hotkey:n=oN,label:r="Notifications ({hotkey})",...o}=e,s=Au(L0,a),l=aN(a),c=f.useRef(null),d=f.useRef(null),u=f.useRef(null),h=f.useRef(null),m=ye(t,h,s.onViewportChange),p=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),b=s.toastCount>0;f.useEffect(()=>{const v=w=>{var x;n.length!==0&&n.every(k=>w[k]||w.code===k)&&((x=h.current)==null||x.focus())};return document.addEventListener("keydown",v),()=>document.removeEventListener("keydown",v)},[n]),f.useEffect(()=>{const v=c.current,w=h.current;if(b&&v&&w){const y=()=>{if(!s.isClosePausedRef.current){const S=new CustomEvent(ym);w.dispatchEvent(S),s.isClosePausedRef.current=!0}},x=()=>{if(s.isClosePausedRef.current){const S=new CustomEvent(vm);w.dispatchEvent(S),s.isClosePausedRef.current=!1}},k=S=>{!v.contains(S.relatedTarget)&&x()},C=()=>{v.contains(document.activeElement)||x()};return v.addEventListener("focusin",y),v.addEventListener("focusout",k),v.addEventListener("pointermove",y),v.addEventListener("pointerleave",C),window.addEventListener("blur",y),window.addEventListener("focus",x),()=>{v.removeEventListener("focusin",y),v.removeEventListener("focusout",k),v.removeEventListener("pointermove",y),v.removeEventListener("pointerleave",C),window.removeEventListener("blur",y),window.removeEventListener("focus",x)}}},[b,s.isClosePausedRef]);const g=f.useCallback(({tabbingDirection:v})=>{const y=l().map(x=>{const k=x.ref.current,C=[k,...vN(k)];return v==="forwards"?C:C.reverse()});return(v==="forwards"?y.reverse():y).flat()},[l]);return f.useEffect(()=>{const v=h.current;if(v){const w=y=>{var C,S,A;const x=y.altKey||y.ctrlKey||y.metaKey;if(y.key==="Tab"&&!x){const P=document.activeElement,I=y.shiftKey;if(y.target===v&&I){(C=d.current)==null||C.focus();return}const z=g({tabbingDirection:I?"backwards":"forwards"}),L=z.findIndex(E=>E===P);Oh(z.slice(L+1))?y.preventDefault():I?(S=d.current)==null||S.focus():(A=u.current)==null||A.focus()}};return v.addEventListener("keydown",w),()=>v.removeEventListener("keydown",w)}},[l,g]),i.jsxs($j,{ref:c,role:"region","aria-label":r.replace("{hotkey}",p),tabIndex:-1,style:{pointerEvents:b?void 0:"none"},children:[b&&i.jsx(bm,{ref:d,onFocusFromOutsideViewport:()=>{const v=g({tabbingDirection:"forwards"});Oh(v)}}),i.jsx(kg.Slot,{scope:a,children:i.jsx(ee.ol,{tabIndex:-1,...o,ref:m})}),b&&i.jsx(bm,{ref:u,onFocusFromOutsideViewport:()=>{const v=g({tabbingDirection:"backwards"});Oh(v)}})]})});O0.displayName=L0;var G0="ToastFocusProxy",bm=f.forwardRef((e,t)=>{const{__scopeToast:a,onFocusFromOutsideViewport:n,...r}=e,o=Au(G0,a);return i.jsx(Su,{"aria-hidden":!0,tabIndex:0,...r,ref:t,style:{position:"fixed"},onFocus:s=>{var d;const l=s.relatedTarget;!((d=o.viewport)!=null&&d.contains(l))&&n()}})});bm.displayName=G0;var $l="Toast",iN="toast.swipeStart",sN="toast.swipeMove",lN="toast.swipeCancel",cN="toast.swipeEnd",F0=f.forwardRef((e,t)=>{const{forceMount:a,open:n,defaultOpen:r,onOpenChange:o,...s}=e,[l,c]=Vt({prop:n,defaultProp:r??!0,onChange:o,caller:$l});return i.jsx(ft,{present:a||l,children:i.jsx(hN,{open:l,...s,ref:t,onClose:()=>c(!1),onPause:tt(e.onPause),onResume:tt(e.onResume),onSwipeStart:q(e.onSwipeStart,d=>{d.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:q(e.onSwipeMove,d=>{const{x:u,y:h}=d.detail.delta;d.currentTarget.setAttribute("data-swipe","move"),d.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),d.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${h}px`)}),onSwipeCancel:q(e.onSwipeCancel,d=>{d.currentTarget.setAttribute("data-swipe","cancel"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),d.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:q(e.onSwipeEnd,d=>{const{x:u,y:h}=d.detail.delta;d.currentTarget.setAttribute("data-swipe","end"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),d.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),d.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${h}px`),c(!1)})})})});F0.displayName=$l;var[dN,uN]=U0($l,{onClose(){}}),hN=f.forwardRef((e,t)=>
41{const{__scopeToast:a,type:n="foreground",duration:r,open:o,onClose:s,onEscapeKeyDown:l,onPause:c,onResume:d,onSwipeStart:u,onSwipeMove:h,onSwipeCancel:m,onSwipeEnd:p,...b}=e,g=Au($l,a),[v,w]=f.useState(null),y=ye(t,E=>w(E)),x=f.useRef(null),k=f.useRef(null),C=r||g.duration,S=f.useRef(0),A=f.useRef(C),P=f.useRef(0),{onToastAdd:I,onToastRemove:N}=g,V=tt(()=>{var K;(v==null?void 0:v.contains(document.activeElement))&&((K=g.viewport)==null||K.focus()),s()}),z=f.useCallback(E=>{!E||E===1/0||(window.clearTimeout(P.current),S.current=new Date().getTime(),P.current=window.setTimeout(V,E))},[V]);f.useEffect(()=>{const E=g.viewport;if(E){const K=()=>{z(A.current),d==null||d()},F=()=>{const Z=new Date().getTime()-S.current;A.current=A.current-Z,window.clearTimeout(P.current),c==null||c()};return E.addEventListener(ym,F),E.addEventListener(vm,K),()=>{E.removeEventListener(ym,F),E.removeEventListener(vm,K)}}},[g.viewport,C,c,d,z]),f.useEffect(()=>{o&&!g.isClosePausedRef.current&&z(C)},[o,C,g.isClosePausedRef,z]),f.useEffect(()=>(I(),()=>N()),[I,N]);const L=f.useMemo(()=>v?Y0(v):null,[v]);return g.viewport?i.jsxs(i.Fragment,{children:[L&&i.jsx(pN,{__scopeToast:a,role:"status","aria-live":n==="foreground"?"assertive":"polite","aria-atomic":!0,children:L}),i.jsx(dN,{scope:a,onClose:V,children:No.createPortal(i.jsx(kg.ItemSlot,{scope:a,children:i.jsx(Wj,{asChild:!0,onEscapeKeyDown:q(l,()=>{g.isFocusedToastEscapeKeyDownRef.current||V(),g.isFocusedToastEscapeKeyDownRef.current=!1}),children:i.jsx(ee.li,{role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":g.swipeDirection,...b,ref:y,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:q(e.onKeyDown,E=>{E.key==="Escape"&&(l==null||l(E.nativeEvent),E.nativeEvent.defaultPrevented||(g.isFocusedToastEscapeKeyDownRef.current=!0,V()))}),onPointerDown:q(e.onPointerDown,E=>{E.button===0&&(x.current={x:E.clientX,y:E.clientY})}),onPointerMove:q(e.onPointerMove,E=>{if(!x.current)return;const K=E.clientX-x.current.x,F=E.clientY-x.current.y,Z=!!k.current,j=["left","right"].includes(g.swipeDirection),T=["left","up"].includes(g.swipeDirection)?Math.min:Math.max,O=j?T(0,K):0,$=j?0:T(0,F),W=E.pointerType==="touch"?10:2,se={x:O,y:$},le={originalEvent:E,delta:se};Z?(k.current=se,kc(sN,h,le,{discrete:!1})):tb(se,g.swipeDirection,W)?(k.current=se,kc(iN,u,le,{discrete:!1}),E.target.setPointerCapture(E.pointerId)):(Math.abs(K)>W||Math.abs(F)>W)&&(x.current=null)}),onPointerUp:q(e.onPointerUp,E=>{const K=k.current,F=E.target;if(F.hasPointerCapture(E.pointerId)&&F.releasePointerCapture(E.pointerId),k.current=null,x.current=null,K){const Z=E.currentTarget,j={originalEvent:E,delta:K};tb(K,g.swipeDirection,g.swipeThreshold)?kc(cN,p,j,{discrete:!0}):kc(lN,m,j,{discrete:!0}),Z.addEventListener("click",T=>T.preventDefault(),{once:!0})}})})})}),g.viewport)})]}):null}),pN=e=>{const{__scopeToast:t,children:a,...n}=e,r=Au($l,t),[o,s]=f.useState(!1),[l,c]=f.useState(!1);return gN(()=>s(!0)),f.useEffect(()=>{const d=window.setTimeout(()=>c(!0),1e3);return()=>window.clearTimeout(d)},[]),l?null:i.jsx(Zi,{asChild:!0,children:i.jsx(Su,{...n,children:o&&i.jsxs(i.Fragment,{children:[r.label," ",a]})})})},mN="ToastTitle",H0=f.forwardRef((e,t)=>{const{__scopeToast:a,...n}=e;return i.jsx(ee.div,{...n,ref:t})});H0.displayName=mN;var fN="ToastDescription",B0=f.forwardRef((e,t)=>{const{__scopeToast:a,...n}=e;return i.jsx(ee.div,{...n,ref:t})});B0.displayName=fN;var V0="ToastAction",W0=f.forwardRef((e,t)=>{const{altText:a,...n}=e;return a.trim()?i.jsx(K0,{altText:a,asChild:!0,children:i.jsx(Cg,{...n,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${V0}\`. Expected non-empty \`string\`.`),null)});W0.displayName=V0;var $0="ToastClose",Cg=f.forwardRef((e,t)=>{const{__scopeToast:a,...n}=e,r=uN($0,a);return i.jsx(K0,{asChild:!0,children:i.jsx(ee.button,{type:"button",...n,ref:t,onClick:q(e.onClick,r.onClose)})})});Cg.displayName=$0;var K0=f.forwardRef((e,t)=>{const{__scopeToast:a,altText:n,...r}=e;return i.jsx(ee.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":n||void 0,...r,ref:t})});function Y0(e){const t=[];
vendor: 5,506 bytes, lines 41-81
41return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),yN(n)){const r=n.ariaHidden||n.hidden||n.style.display==="none",o=n.dataset.radixToastAnnounceExclude==="";if(!r)if(o){const s=n.dataset.radixToastAnnounceAlt;s&&t.push(s)}else t.push(...Y0(n))}}),t}function kc(e,t,a,{discrete:n}){const r=a.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:a});t&&r.addEventListener(e,t,{once:!0}),n?fl(r,o):r.dispatchEvent(o)}var tb=(e,t,a=0)=>{const n=Math.abs(e.x),r=Math.abs(e.y),o=n>r;return t==="left"||t==="right"?o&&n>a:!o&&r>a};function gN(e=()=>{}){const t=tt(e);rt(()=>{let a=0,n=0;return a=window.requestAnimationFrame(()=>n=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(a),window.cancelAnimationFrame(n)}},[t])}function yN(e){return e.nodeType===e.ELEMENT_NODE}function vN(e){const t=[],a=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const r=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||r?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;a.nextNode();)t.push(a.currentNode);return t}function Oh(e){const t=document.activeElement;return e.some(a=>a===t?!0:(a.focus(),document.activeElement!==t))}var bN=M0,J0=O0,Q0=F0,Z0=H0,X0=B0,eC=W0,tC=Cg;function aC(e){var t,a,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(a=aC(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function nC(){for(var e,t,a=0,n="",r=arguments.length;a<r;a++)(e=arguments[a])&&(t=aC(e))&&(n&&(n+=" "),n+=t);return n}const ab=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,nb=nC,Xi=(e,t)=>a=>{var n;if((t==null?void 0:t.variants)==null)return nb(e,a==null?void 0:a.class,a==null?void 0:a.className);const{variants:r,defaultVariants:o}=t,s=Object.keys(r).map(d=>{const u=a==null?void 0:a[d],h=o==null?void 0:o[d];if(u===null)return null;const m=ab(u)||ab(h);return r[d][m]}),l=a&&Object.entries(a).reduce((d,u)=>{let[h,m]=u;return m===void 0||(d[h]=m),d},{}),c=t==null||(n=t.compoundVariants)===null||n===void 0?void 0:n.reduce((d,u)=>{let{class:h,className:m,...p}=u;return Object.entries(p).every(b=>{let[g,v]=b;return Array.isArray(v)?v.includes({...o,...l}[g]):{...o,...l}[g]===v})?[...d,h,m]:d},[]);return nb(e,s,c,a==null?void 0:a.class,a==null?void 0:a.className)};/** 42 * @license lucide-react v0.462.0 - ISC 43 * 44 * This source code is licensed under the ISC license. 45 * See the LICENSE file in the root directory of this source tree. 46 */const wN=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),rC=(...e)=>e.filter((t,a,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===a).join(" ").trim();/** 47 * @license lucide-react v0.462.0 - ISC 48 * 49 * This source code is licensed under the ISC license. 50 * See the LICENSE file in the root directory of this source tree. 51 */var xN={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** 52 * @license lucide-react v0.462.0 - ISC 53 * 54 * This source code is licensed under the ISC license. 55 * See the LICENSE file in the root directory of this source tree. 56 */const kN=f.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:a=2,absoluteStrokeWidth:n,className:r="",children:o,iconNode:s,...l},c)=>f.createElement("svg",{ref:c,...xN,width:t,height:t,stroke:e,strokeWidth:n?Number(a)*24/Number(t):a,className:rC("lucide",r),...l},[...s.map(([d,u])=>f.createElement(d,u)),...Array.isArray(o)?o:[o]]));/** 57 * @license lucide-react v0.462.0 - ISC 58 * 59 * This source code is licensed under the ISC license. 60 * See the LICENSE file in the root directory of this source tree. 61 */const Q=(e,t)=>{const a=f.forwardRef(({className:n,...r},o)=>f.createElement(kN,{ref:o,iconNode:t,className:rC(`lucide-${wN(e)}`,n),...r}));return a.displayName=`${e}`,a};/** 62 * @license lucide-react v0.462.0 - ISC 63 * 64 * This source code is licensed under the ISC license. 65 * See the LICENSE file in the root directory of this source tree. 66 */const at=Q("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** 67 * @license lucide-react v0.462.0 - ISC 68 * 69 * This source code is licensed under the ISC license. 70 * See the LICENSE file in the root directory of this source tree. 71 */const wm=Q("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** 72 * @license lucide-react v0.462.0 - ISC 73 * 74 * This source code is licensed under the ISC license. 75 * See the LICENSE file in the root directory of this source tree. 76 */const vo=Q("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);/** 77 * @license lucide-react v0.462.0 - ISC 78 * 79 * This source code is licensed under the ISC license. 80 * See the LICENSE file in the root directory of this source tree. 81 */const Zr=Q("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}
81],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** 82 * @license lucide-react v0.462.0 - ISC 83 * 84 * This source code is licensed under the ISC license. 85 * See the LICENSE file in the root directory of this source tree. 86 */const td=Q("Building",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",ry:"2",key:"76otgf"}],["path",{d:"M9 22v-4h6v4",key:"r93iot"}],["path",{d:"M8 6h.01",key:"1dz90k"}],["path",{d:"M16 6h.01",key:"1x0f13"}],["path",{d:"M12 6h.01",key:"1vi96p"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M8 14h.01",key:"6423bh"}]]);/** 87 * @license lucide-react v0.462.0 - ISC 88 * 89 * This source code is licensed under the ISC license. 90 * See the LICENSE file in the root directory of this source tree. 91 */const CN=Q("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** 92 * @license lucide-react v0.462.0 - ISC 93 * 94 * This source code is licensed under the ISC license. 95 * See the LICENSE file in the root directory of this source tree. 96 */const xi=Q("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** 97 * @license lucide-react v0.462.0 - ISC 98 * 99 * This source code is licensed under the ISC license. 100 * See the LICENSE file in the root directory of this source tree. 101 */const Sg=Q("ChartColumn",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]);/** 102 * @license lucide-react v0.462.0 - ISC 103 * 104 * This source code is licensed under the ISC license. 105 * See the LICENSE file in the root directory of this source tree. 106 */const Cn=Q("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** 107 * @license lucide-react v0.462.0 - ISC 108 * 109 * This source code is licensed under the ISC license. 110 * See the LICENSE file in the root directory of this source tree. 111 */const Pu=Q("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** 112 * @license lucide-react v0.462.0 - ISC 113 * 114 * This source code is licensed under the ISC license. 115 * See the LICENSE file in the root directory of this source tree. 116 */const SN=Q("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** 117 * @license lucide-react v0.462.0 - ISC 118 * 119 * This source code is licensed under the ISC license. 120 * See the LICENSE file in the root directory of this source tree. 121 */const AN=Q("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** 122 * @license lucide-react v0.462.0 - ISC 123 * 124 * This source code is licensed under the ISC license. 125 * See the LICENSE file in the root directory of this source tree. 126 */const gl=Q("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** 127 * @license lucide-react v0.462.0 - ISC 128 * 129 * This source code is licensed under the ISC license. 130 * See the LICENSE file in the root directory of this source tree. 131 */const PN=Q("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** 132 * @license lucide-react v0.462.0 - ISC 133 * 134 * This source code is licensed under the ISC license. 135 * See the LICENSE file in the root directory of this source tree. 136 */const TN=Q("CirclePlay",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polygon",{points:"10 8 16 12 10 16 10 8",key:"1cimsy"}]]);/** 137 * @license lucide-react v0.462.0 - ISC 138 * 139 * This source code is licensed under the ISC license. 140 * See the LICENSE file in the root directory of this source tree. 141 */const rb=Q("CircleUserRound",[["path",{d:"M18 20a6 6 0 0 0-12 0",key:"1qehca"}],["circle",{cx:"12",cy:"10",r:"4",key:"1h16sb"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** 142 * @license lucide-react v0.462.0 - ISC 143 * 144 * This source code is licensed under the ISC license. 145 * See the LICENSE file in the root directory of this source tree. 146 */const oC=Q("CircleUser",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662",key:"154egf"}]]);/** 147 * @license lucide-react v0.462.0 - ISC 148 * 149 * This source code is licensed under the ISC license. 150 * See the LICENSE file in the root directory of this source tree. 151 */const IN=Q("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** 152 * @license lucide-react v0.462.0 - ISC 153 * 154 * This source code is licensed under the ISC license. 155 * See the LICENSE file in the root directory of this source tree. 156 */const Gh=Q("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** 157 * @license lucide-react v0.462.0 - ISC 158 * 159 * This source code is licensed under the ISC license. 160 * See the LICENSE file in the root directory of this source tree. 161 */const iC=Q("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** 162 * @license lucide-react v0.462.0 - ISC 163 * 164 * This source code is licensed under the ISC license. 165 * See the LICENSE file in the root directory of this source tree. 166 */const jN=Q("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** 167 * @license lucide-react v0.462.0 - ISC 168 * 169 * This source code is licensed under the ISC license. 170 * See the LICENSE file in the root directory of this source tree.
171 */const NN=Q("CreditCard",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]);/** 172 * @license lucide-react v0.462.0 - ISC 173 * 174 * This source code is licensed under the ISC license. 175 * See the LICENSE file in the root directory of this source tree. 176 */const xm=Q("Crown",[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]]);/** 177 * @license lucide-react v0.462.0 - ISC 178 * 179 * This source code is licensed under the ISC license. 180 * See the LICENSE file in the root directory of this source tree. 181 */const EN=Q("DollarSign",[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]]);/** 182 * @license lucide-react v0.462.0 - ISC 183 * 184 * This source code is licensed under the ISC license. 185 * See the LICENSE file in the root directory of this source tree. 186 */const zN=Q("Droplets",[["path",{d:"M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z",key:"1ptgy4"}],["path",{d:"M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97",key:"1sl1rz"}]]);/** 187 * @license lucide-react v0.462.0 - ISC 188 * 189 * This source code is licensed under the ISC license. 190 * See the LICENSE file in the root directory of this source tree. 191 */const RN=Q("Earth",[["path",{d:"M21.54 15H17a2 2 0 0 0-2 2v4.54",key:"1djwo0"}],["path",{d:"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17",key:"1tzkfa"}],["path",{d:"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05",key:"14pb5j"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** 192 * @license lucide-react v0.462.0 - ISC 193 * 194 * This source code is licensed under the ISC license. 195 * See the LICENSE file in the root directory of this source tree. 196 */const sC=Q("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** 197 * @license lucide-react v0.462.0 - ISC 198 * 199 * This source code is licensed under the ISC license. 200 * See the LICENSE file in the root directory of this source tree. 201 */const DN=Q("FileCheck",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m9 15 2 2 4-4",key:"1grp1n"}]]);/** 202 * @license lucide-react v0.462.0 - ISC 203 * 204 * This source code is licensed under the ISC license. 205 * See the LICENSE file in the root directory of this source tree. 206 */const lC=Q("FileCode",[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]]);/** 207 * @license lucide-react v0.462.0 - ISC 208 * 209 * This source code is licensed under the ISC license. 210 * See the LICENSE file in the root directory of this source tree. 211 */const _N=Q("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** 212 * @license lucide-react v0.462.0 - ISC 213 * 214 * This source code is licensed under the ISC license. 215 * See the LICENSE file in the root directory of this source tree. 216 */const Dd=Q("Gift",[["rect",{x:"3",y:"8",width:"18",height:"4",rx:"1",key:"bkv52"}],["path",{d:"M12 8v13",key:"1c76mn"}],["path",{d:"M19 12v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-7",key:"6wjy6b"}],["path",{d:"M7.5 8a2.5 2.5 0 0 1 0-5A4.8 8 0 0 1 12 8a4.8 8 0 0 1 4.5-5 2.5 2.5 0 0 1 0 5",key:"1ihvrl"}]]);/** 217 * @license lucide-react v0.462.0 - ISC 218 * 219 * This source code is licensed under the ISC license. 220 * See the LICENSE file in the root directory of this source tree. 221 */const Tu=Q("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** 222 * @license lucide-react v0.462.0 - ISC 223 * 224 * This source code is licensed under the ISC license. 225 * See the LICENSE file in the root directory of this source tree. 226 */const ob=Q("HeartHandshake",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66",key:"4oyue0"}],["path",{d:"m18 15-2-2",key:"60u0ii"}],["path",{d:"m15 18-2-2",key:"6p76be"}]]);/** 227 * @license lucide-react v0.462.0 - ISC 228 * 229 * This source code is licensed under the ISC license. 230 * See the LICENSE file in the root directory of this source tree. 231 */const qN=Q("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** 232 * @license lucide-react v0.462.0 - ISC 233 * 234 * This source code is licensed under the ISC license. 235 * See the LICENSE file in the root directory of this source tree. 236 */const Ag=Q("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** 237 * @license lucide-react v0.462.0 - ISC 238 * 239 * This source code is licensed under the ISC license. 240 * See the LICENSE file in the root directory of this source tree. 241 */const ib=Q("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** 242 * @license lucide-react v0.462.0 - ISC 243 * 244 * This source code is licensed under the ISC license. 245 * See the LICENSE file in the root directory of this source tree. 246 */const UN=Q("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** 247 * @license lucide-react v0.462.0 - ISC 248 * 249 * This source code is licensed under the ISC license. 250 * See the LICENSE file in the root directory of this source tree. 251 */const Kl=Q("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** 252 * @license lucide-react v0.462.0 - ISC 253 * 254 * This source code is licensed under the ISC license. 255 * See the LICENSE file in the root directory of this source tree. 256 */const MN=Q("Linkedin",[["path",{d:"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z",key:"c2jq9f"}],["rect",{width:"4",height:"12",x:"2",y:"9",key:"mk3on5"}],["circle",{cx:"4",cy:"4",r:"2",key:"bt5ra8"}]]);/** 257 * @license lucide-react v0.462.0 - ISC 258 * 259 * This source code is licensed under the ISC license. 260 * See the LICENSE file in the root directory of this source tree.
261 */const LN=Q("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** 262 * @license lucide-react v0.462.0 - ISC 263 * 264 * This source code is licensed under the ISC license. 265 * See the LICENSE file in the root directory of this source tree. 266 */const ON=Q("Megaphone",[["path",{d:"m3 11 18-5v12L3 14v-3z",key:"n962bs"}],["path",{d:"M11.6 16.8a3 3 0 1 1-5.8-1.6",key:"1yl0tm"}]]);/** 267 * @license lucide-react v0.462.0 - ISC 268 * 269 * This source code is licensed under the ISC license. 270 * See the LICENSE file in the root directory of this source tree. 271 */const GN=Q("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** 272 * @license lucide-react v0.462.0 - ISC 273 * 274 * This source code is licensed under the ISC license. 275 * See the LICENSE file in the root directory of this source tree. 276 */const bo=Q("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** 277 * @license lucide-react v0.462.0 - ISC 278 * 279 * This source code is licensed under the ISC license. 280 * See the LICENSE file in the root directory of this source tree. 281 */const FN=Q("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/** 282 * @license lucide-react v0.462.0 - ISC 283 * 284 * This source code is licensed under the ISC license. 285 * See the LICENSE file in the root directory of this source tree. 286 */const zr=Q("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** 287 * @license lucide-react v0.462.0 - ISC 288 * 289 * This source code is licensed under the ISC license. 290 * See the LICENSE file in the root directory of this source tree. 291 */const HN=Q("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** 292 * @license lucide-react v0.462.0 - ISC 293 * 294 * This source code is licensed under the ISC license. 295 * See the LICENSE file in the root directory of this source tree. 296 */const cC=Q("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** 297 * @license lucide-react v0.462.0 - ISC 298 * 299 * This source code is licensed under the ISC license. 300 * See the LICENSE file in the root directory of this source tree. 301 */const BN=Q("Rocket",[["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z",key:"m3kijz"}],["path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z",key:"1fmvmk"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0",key:"1f8sc4"}],["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5",key:"qeys4"}]]);/** 302 * @license lucide-react v0.462.0 - ISC 303 * 304 * This source code is licensed under the ISC license. 305 * See the LICENSE file in the root directory of this source tree. 306 */const sb=Q("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** 307 * @license lucide-react v0.462.0 - ISC 308 * 309 * This source code is licensed under the ISC license. 310 * See the LICENSE file in the root directory of this source tree. 311 */const lb=Q("Settings2",[["path",{d:"M20 7h-9",key:"3s1dr2"}],["path",{d:"M14 17H5",key:"gfn3mx"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);/** 312 * @license lucide-react v0.462.0 - ISC 313 * 314 * This source code is licensed under the ISC license. 315 * See the LICENSE file in the root directory of this source tree. 316 */const dC=Q("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** 317 * @license lucide-react v0.462.0 - ISC 318 * 319 * This source code is licensed under the ISC license. 320 * See the LICENSE file in the root directory of this source tree. 321 */const Iu=Q("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",ke
321y:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** 322 * @license lucide-react v0.462.0 - ISC 323 * 324 * This source code is licensed under the ISC license. 325 * See the LICENSE file in the root directory of this source tree. 326 */const es=Q("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** 327 * @license lucide-react v0.462.0 - ISC 328 * 329 * This source code is licensed under the ISC license. 330 * See the LICENSE file in the root directory of this source tree. 331 */const xa=Q("ShoppingBag",[["path",{d:"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z",key:"hou9p0"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M16 10a4 4 0 0 1-8 0",key:"1ltviw"}]]);/** 332 * @license lucide-react v0.462.0 - ISC 333 * 334 * This source code is licensed under the ISC license. 335 * See the LICENSE file in the root directory of this source tree. 336 */const uC=Q("ShoppingCart",[["circle",{cx:"8",cy:"21",r:"1",key:"jimo8o"}],["circle",{cx:"19",cy:"21",r:"1",key:"13723u"}],["path",{d:"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12",key:"9zh506"}]]);/** 337 * @license lucide-react v0.462.0 - ISC 338 * 339 * This source code is licensed under the ISC license. 340 * See the LICENSE file in the root directory of this source tree. 341 */const wt=Q("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** 342 * @license lucide-react v0.462.0 - ISC 343 * 344 * This source code is licensed under the ISC license. 345 * See the LICENSE file in the root directory of this source tree. 346 */const cb=Q("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** 347 * @license lucide-react v0.462.0 - ISC 348 * 349 * This source code is licensed under the ISC license. 350 * See the LICENSE file in the root directory of this source tree. 351 */const VN=Q("Store",[["path",{d:"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7",key:"ztvudi"}],["path",{d:"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8",key:"1b2hhj"}],["path",{d:"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4",key:"2ebpfo"}],["path",{d:"M2 7h20",key:"1fcdvo"}],["path",{d:"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7",key:"6c3vgh"}]]);/** 352 * @license lucide-react v0.462.0 - ISC 353 * 354 * This source code is licensed under the ISC license. 355 * See the LICENSE file in the root directory of this source tree. 356 */const WN=Q("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** 357 * @license lucide-react v0.462.0 - ISC 358 * 359 * This source code is licensed under the ISC license. 360 * See the LICENSE file in the root directory of this source tree. 361 */const $N=Q("TestTube",[["path",{d:"M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2",key:"125lnx"}],["path",{d:"M8.5 2h7",key:"csnxdl"}],["path",{d:"M14.5 16h-5",key:"1ox875"}]]);/** 362 * @license lucide-react v0.462.0 - ISC 363 * 364 * This source code is licensed under the ISC license. 365 * See the LICENSE file in the root directory of this source tree. 366 */const pi=Q("TrendingUp",[["polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17",key:"126l90"}],["polyline",{points:"16 7 22 7 22 13",key:"kwv8wd"}]]);/** 367 * @license lucide-react v0.462.0 - ISC 368 * 369 * This source code is licensed under the ISC license. 370 * See the LICENSE file in the root directory of this source tree. 371 */const km=Q("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** 372 * @license lucide-react v0.462.0 - ISC 373 * 374 * This source code is licensed under the ISC license. 375 * See the LICENSE file in the root directory of this source tree. 376 */const KN=Q("UserCheck",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}
vendor: 9,638 bytes, lines 376-406
376],["polyline",{points:"16 11 18 13 22 9",key:"1pwet4"}]]);/** 377 * @license lucide-react v0.462.0 - ISC 378 * 379 * This source code is licensed under the ISC license. 380 * See the LICENSE file in the root directory of this source tree. 381 */const $s=Q("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** 382 * @license lucide-react v0.462.0 - ISC 383 * 384 * This source code is licensed under the ISC license. 385 * See the LICENSE file in the root directory of this source tree. 386 */const Ha=Q("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** 387 * @license lucide-react v0.462.0 - ISC 388 * 389 * This source code is licensed under the ISC license. 390 * See the LICENSE file in the root directory of this source tree. 391 */const YN=Q("Video",[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]]);/** 392 * @license lucide-react v0.462.0 - ISC 393 * 394 * This source code is licensed under the ISC license. 395 * See the LICENSE file in the root directory of this source tree. 396 */const Pg=Q("Wallet",[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]]);/** 397 * @license lucide-react v0.462.0 - ISC 398 * 399 * This source code is licensed under the ISC license. 400 * See the LICENSE file in the root directory of this source tree. 401 */const Tg=Q("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** 402 * @license lucide-react v0.462.0 - ISC 403 * 404 * This source code is licensed under the ISC license. 405 * See the LICENSE file in the root directory of this source tree. 406 */const Sn=Q("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),Ig="-",JN=e=>{const t=ZN(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:s=>{const l=s.split(Ig);return l[0]===""&&l.length!==1&&l.shift(),hC(l,t)||QN(s)},getConflictingClassGroupIds:(s,l)=>{const c=a[s]||[];return l&&n[s]?[...c,...n[s]]:c}}},hC=(e,t)=>{var s;if(e.length===0)return t.classGroupId;const a=e[0],n=t.nextPart.get(a),r=n?hC(e.slice(1),n):void 0;if(r)return r;if(t.validators.length===0)return;const o=e.join(Ig);return(s=t.validators.find(({validator:l})=>l(o)))==null?void 0:s.classGroupId},db=/^\[(.+)\]$/,QN=e=>{if(db.test(e)){const t=db.exec(e)[1],a=t==null?void 0:t.substring(0,t.indexOf(":"));if(a)return"arbitrary.."+a}},ZN=e=>{const{theme:t,prefix:a}=e,n={nextPart:new Map,validators:[]};return eE(Object.entries(e.classGroups),a).forEach(([o,s])=>{Cm(s,n,o,t)}),n},Cm=(e,t,a,n)=>{e.forEach(r=>{if(typeof r=="string"){const o=r===""?t:ub(t,r);o.classGroupId=a;return}if(typeof r=="function"){if(XN(r)){Cm(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([o,s])=>{Cm(s,ub(t,o),a,n)})})},ub=(e,t)=>{let a=e;return t.split(Ig).forEach(n=>{a.nextPart.has(n)||a.nextPart.set(n,{nextPart:new Map,validators:[]}),a=a.nextPart.get(n)}),a},XN=e=>e.isThemeGetter,eE=(e,t)=>t?e.map(([a,n])=>{const r=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([s,l])=>[t+s,l])):o);return[a,r]}):e,tE=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,a=new Map,n=new Map;const r=(o,s)=>{a.set(o,s),t++,t>e&&(t=0,n=a,a=new Map)};return{get(o){let s=a.get(o);if(s!==void 0)return s;if((s=n.get(o))!==void 0)return r(o,s),s},set(o,s){a.has(o)?a.set(o,s):r(o,s)}}},pC="!",aE=e=>{const{separator:t,experimentalParseClassName:a}=e,n=t.length===1,r=t[0],o=t.length,s=l=>{const c=[];let d=0,u=0,h;for(let v=0;v<l.length;v++){let w=l[v];if(d===0){if(w===r&&(n||l.slice(v,v+o)===t)){c.push(l.slice(u,v)),u=v+o;continue}if(w==="/"){h=v;continue}}w==="["?d++:w==="]"&&d--}const m=c.length===0?l:l.substring(u),p=m.startsWith(pC),b=p?m.substring(1):m,g=h&&h>u?h-u:void 0;return{modifiers:c,hasImportantModifier:p,baseClassName:b,maybePostfixModifierPosition:g}};return a?l=>a({className:l,parseClassName:s}):s},nE=e=>{if(e.length<=1)return e;const t=[];let a=[];return e.forEach(n=>{n[0]==="["?(t.push(...a.sort(),n),a=[]):a.push(n)}),t.push(...a.sort()),t},rE=e=>({cache:tE(e.cacheSize),parseClassName:aE(e),...JN(e)}),oE=/\s+/,iE=(e,t)=>{const{parseClassName:a,getClassGroupId:n,getConflictingClassGroupIds:r}=t,o=[],s=e.trim().split(oE);let l="";for(let c=s.length-1;c>=0;c-=1){const d=s[c],{modifiers:u,hasImportantModifier:h,baseClassName:m,maybePostfixModifierPosition:p}=a(d);let b=!!p,g=n(b?m.substring(0,p):m);if(!g){if(!b){l=d+(l.length>0?" "+l:l);continue}if(g=n(m),!g){l=d+(l.length>0?" "+l:l);continue}b=!1}const v=nE(u).join(":"),w=h?v+pC:v,y=w+g;if(o.includes(y))continue;o.push(y);const x=r(g,b);for(let k=0;k<x.length;++k){const C=x[k];o.push(w+C)}l=d+(l.length>0?" "+l:l)}return l};function sE(){let e=0,t,a,n="";for(;e<arguments.length;)(t=arguments[e++])&&(a=mC(t))&&(n&&(n+=" "),n+=a);return n}const mC=e=>{if(typeof e=="string")return e;let t,a="";for(let n=0;n<e.length;n++)e[n]&&(t=mC(e[n]))&&(a&&(a+=" "),a+=t);return a};function lE(e,...t){let a,n,r,o=s;function s(c){const d=t.reduce((u,h)=>h(u),e());return a=rE(d),n=a.cache.get,r=a.cache.set,o=l,l(c)}function l(c){const d=n(c);if(d)return d;const u=iE(c,a);return r(c,u),u}return function(){return o(sE.apply(null,arguments))}}const Oe=e=>{const t=a=>a[e]||[];return t.isThemeGetter=!0,t},fC=/^\[(?:([a-z-]+):)?(.+)\]$/i,cE=/^\d+\/\d+$/,dE=new Set(["px","full","screen"]),uE=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,hE=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,pE=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,mE=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,fE=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,mn=e=>ki(e)||dE.has(e)||cE.test(e),On=e=>ts(e,"length",CE),ki=e=>!!e&&!Number.isNaN(Number(e)),Fh=e=>ts(e,"number",ki),ks=e=>!!e&&Number.isInteger(Number(e)),gE=e=>e.endsWith("%")&&ki(e.slice(0,-1)),ge=e=>fC.test(e),Gn=e=>uE.test(e),yE=new Set(["length","size","percentage"]),vE=e=>ts(e,yE,gC),bE=e=>ts(e,"position",gC),wE=new Set(["image","url"]),xE=e=>ts(e,wE,AE),kE=e=>ts(e,"",SE),Cs=()=>!0,ts=(e,t,a)=>{const n=fC.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):a(n[2]):!1},CE=e=>hE.test(e)&&!pE.test(e),gC=()=>!1,SE=e=>mE.test(e),AE=e=>fE.test(e),PE=()=>{const e=Oe("colors"),t=Oe("spacing"),a=Oe("blur"),n=Oe("brightness"),r=Oe("borderColor"),o=Oe("borderRadius"),s=Oe("borderSpacing"),l=Oe("borderWidth"),c=Oe("contrast"),d=Oe("grayscale"),u=Oe("hueRotate"),h=Oe("invert"),m=Oe("gap"),p=Oe("gradientColorStops"),b=Oe("gradientColorStopPositions"),g=Oe("inset"),v=Oe("margin"),w=Oe("opacity"),y=Oe("padding"),x=Oe("saturate"),k=Oe("scale"),C=Oe("sepia"),S=Oe("skew"),A=Oe("space"),P=Oe("translate"),I=()=>["auto","contain","none"],N=()=>["auto","hidden","clip","visible","scroll"],V=()=>["auto",ge,t],z=()=>[ge,t],L=()=>["",mn,On],E=()=>["auto",ki,ge],K=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],F=()=>["solid","dashed","dotted","double","none"],Z=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],j=()=>["start","end","center","between","around","evenly","stretch"],T=()=>["","0",ge],O=()=>["auto","avoid","all","avoid-page","page","left","right","column"],$=()=>[ki,ge];return{cacheSize:500,separator:":",theme:{colors:[Cs],spacing:[mn,On],blur:["none","",Gn,ge],brightness:$(),borderColor:[e],borderRadius:["none","","full",Gn,ge],borderSpacing:z(),borderWidth:L(),contrast:$(),grayscale:T(),hueRotate:$(),invert:T(),gap:z(),gradientColorStops:[e],gradientColorStopPositions:[gE,On],inset:V(),margin:V(),opacity:$(),padding:z(),saturate:$(),scale:$(),sepia:T(),skew:$(),space:z(),translate:z()},classGroups:{aspect:[{aspect:["auto","square","video",ge]}],container:["container"],columns:[{columns:[Gn]}],"break-after":[{"break-after":O()}],"break-before":[{"break-before":O()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...K(),ge]}],overflow:[{overflow:N()}],"overflow-x":[{"overflow-x":N()}],"overflow-y":[{"overflow-y":N()}],overscroll:[{overscroll:I()}],"overscroll-x":[{"overscroll-x":I()}],"overscroll-y":[{"overscroll-y":I()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[g]}],"inset-x":[{"inset-x":[g]}],"inset-y":[{"inset-y":[g]}],start:[{start:[g]}],end:[{end:[g]}],top:[{top:[g]}
vendor: 9,947 bytes, line 406
406],right:[{right:[g]}],bottom:[{bottom:[g]}],left:[{left:[g]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ks,ge]}],basis:[{basis:V()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",ge]}],grow:[{grow:T()}],shrink:[{shrink:T()}],order:[{order:["first","last","none",ks,ge]}],"grid-cols":[{"grid-cols":[Cs]}],"col-start-end":[{col:["auto",{span:["full",ks,ge]},ge]}],"col-start":[{"col-start":E()}],"col-end":[{"col-end":E()}],"grid-rows":[{"grid-rows":[Cs]}],"row-start-end":[{row:["auto",{span:[ks,ge]},ge]}],"row-start":[{"row-start":E()}],"row-end":[{"row-end":E()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",ge]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",ge]}],gap:[{gap:[m]}],"gap-x":[{"gap-x":[m]}],"gap-y":[{"gap-y":[m]}],"justify-content":[{justify:["normal",...j()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...j(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...j(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[y]}],px:[{px:[y]}],py:[{py:[y]}],ps:[{ps:[y]}],pe:[{pe:[y]}],pt:[{pt:[y]}],pr:[{pr:[y]}],pb:[{pb:[y]}],pl:[{pl:[y]}],m:[{m:[v]}],mx:[{mx:[v]}],my:[{my:[v]}],ms:[{ms:[v]}],me:[{me:[v]}],mt:[{mt:[v]}],mr:[{mr:[v]}],mb:[{mb:[v]}],ml:[{ml:[v]}],"space-x":[{"space-x":[A]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[A]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",ge,t]}],"min-w":[{"min-w":[ge,t,"min","max","fit"]}],"max-w":[{"max-w":[ge,t,"none","full","min","max","fit","prose",{screen:[Gn]},Gn]}],h:[{h:[ge,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[ge,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[ge,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[ge,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Gn,On]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Fh]}],"font-family":[{font:[Cs]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",ge]}],"line-clamp":[{"line-clamp":["none",ki,Fh]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",mn,ge]}],"list-image":[{"list-image":["none",ge]}],"list-style-type":[{list:["none","disc","decimal",ge]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[w]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[w]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...F(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",mn,On]}],"underline-offset":[{"underline-offset":["auto",mn,ge]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:z()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ge]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ge]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[w]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...K(),bE]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",vE]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},xE]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[p]}],"gradient-via":[{via:[p]}],"gradient-to":[{to:[p]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[w]}],"border-style":[{border:[...F(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[w]}],"divide-style":[{divide:F()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...F()]}],"outline-offset":[{"outline-offset":[mn,ge]}],"outline-w":[{outline:[mn,On]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:L()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[w]}],"ring-offset-w":[{"ring-offset":[mn,On]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Gn,kE]}],"shadow-color":[{shadow:[Cs]}],opacity:[{opacity:[w]}],"mix-blend":[{"mix-blend":[...Z(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Z()}],filter:[{filter:["","none"]}],blur:[{blur:[a]}],brightness:[{brightness:[n]}],contrast:[{contrast:[c]}],"drop-shadow":[{"drop-shadow":["","none",Gn,ge]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[h]}],saturate:[{saturate:[x]}],sepia:[{sepia:[C]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[a]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[c]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[h]}],"backdrop-opacity":[{"backdrop-opacity":[w]}],"backdrop-saturate":[{"backdrop-saturate":[x]}],"backdrop-sepia":[{"backdrop-sepia":[C]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[s]}],"border-spacing-x":[{"border-spacing-x":[s]}],"border-spacing-y":[{"border-spacing-y":[s]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",ge]}],duration:[{duration:$()}],ease:[{ease:["linear","in","out","in-out",ge]}],delay:[{delay:$()}],animate:[{animate:["none","spin","ping","pulse","bounce",ge]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[k]}],"scale-x":[{"scale-x":[k]}],"scale-y":[{"scale-y":[k]}],rotate:[{rotate:[ks,ge]}],"translate-x":[{"translate-x":[P]}],"translate-y":[{"translate-y":[P]}],"skew-x":[{"skew-x":[S]}],"skew-y":[{"skew-y":[S]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",ge]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ge]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":z()}],"scroll-mx":[{"scroll-mx":z()}],"scroll-my":[{"scroll-my":z()}],"scroll-ms":[{"scroll-ms":z()}],"scroll-me":[{"scroll-me":z()}],"scroll-mt":[{"scroll-mt":z()}],"scroll-mr":[{"scroll-mr":z()}],"scroll-mb":[{"scroll-mb":z()}],"scroll-ml":[{"scroll-ml":z()}],"scroll-p":[{"scroll-p":z()}],"scroll-px":[{"scroll-px":z()}],"scroll-py":[{"scroll-py":z()}],"scroll-ps":[{"scroll-ps":z()}],"scroll-pe":[{"scroll-pe":z()}],"scroll-pt":[{"scroll-pt":z()}],"scroll-pr":[{"scroll-pr":z()}],"scroll-pb":[{"scroll-pb":z()}],"scroll-pl":[{"scroll-pl":z()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}
vendor: 4,484 bytes, line 406
406],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ge]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[mn,On,Fh]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},TE=lE(PE);function J(...e){return TE(nC(e))}const IE=bN,yC=f.forwardRef(({className:e,...t},a)=>i.jsx(J0,{ref:a,className:J("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));yC.displayName=J0.displayName;const jE=Xi("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),vC=f.forwardRef(({className:e,variant:t,...a},n)=>i.jsx(Q0,{ref:n,className:J(jE({variant:t}),e),...a}));vC.displayName=Q0.displayName;const NE=f.forwardRef(({className:e,...t},a)=>i.jsx(eC,{ref:a,className:J("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",e),...t}));
406NE.displayName=eC.displayName;const bC=f.forwardRef(({className:e,...t},a)=>i.jsx(tC,{ref:a,className:J("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:i.jsx(Tg,{className:"h-4 w-4"})}));bC.displayName=tC.displayName;const wC=f.forwardRef(({className:e,...t},a)=>i.jsx(Z0,{ref:a,className:J("text-sm font-semibold",e),...t}));wC.displayName=Z0.displayName;const xC=f.forwardRef(({className:e,...t},a)=>i.jsx(X0,{ref:a,className:J("text-sm opacity-90",e),...t}));xC.displayName=X0.displayName;function EE(){const{toasts:e}=N0();return i.jsxs(IE,{children:[e.map(function({id:t,title:a,description:n,action:r,...o}){return i.jsxs(vC,{...o,children:[i.jsxs("div",{className:"grid gap-1",children:[a&&i.jsx(wC,{children:a}),n&&i.jsx(xC,{children:n})]}),r,i.jsx(bC,{})]},t)}),i.jsx(yC,{})]})}var hb=["light","dark"],zE="(prefers-color-scheme: dark)",RE=f.createContext(void 0),DE={setTheme:e=>{},themes:[]},_E=()=>{var e;return(e=f.useContext(RE))!=null?e:DE};f.memo(({forcedTheme:e,storageKey:t,attribute:a,enableSystem:n,enableColorScheme:r,defaultTheme:o,value:s,attrs:l,nonce:c})=>{let d=o==="system",u=a==="class"?`var d=document.documentElement,c=d.classList;${`c.remove(${l.map(b=>`'${b}'`).join(",")})`};`:`var d=document.documentElement,n='${a}',s='setAttribute';`,h=r?hb.includes(o)&&o?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${o}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",m=(b,g=!1,v=!0)=>{let w=s?s[b]:b,y=g?b+"|| ''":`'${w}'`,x="";return r&&v&&!g&&hb.includes(b)&&(x+=`d.style.colorScheme = '${b}';`),a==="class"?g||w?x+=`c.add(${y})`:x+="null":w&&(x+=`d[s](n,${y})`),x},p=e?`!function(){${u}${m(e)}}()`:n?`!function(){try{${u}var e=localStorage.getItem('${t}');if('system'===e||(!e&&${d})){var t='${zE}',m=window.matchMedia(t);if(m.media!==t||m.matches){${m("dark")}}else{${m("light")}}}else if(e){${s?`var x=${JSON.stringify(s)};`:""}${m(s?"x[e]":"e",!0)}}${d?"":"else{"+m(o,!1,!1)+"}"}${h}}catch(e){}}()`:`!function(){try{${u}var e=localStorage.getItem('${t}');if(e){${s?`var x=${JSON.stringify(s)};`:""}${m(s?"x[e]":"e",!0)}}else{${m(o,!1,!1)};}${h}}catch(t){}}();`;return f.createElement("script",{nonce:c,dangerouslySetInnerHTML:{__html:p}})});var qE=e=>{switch(e){case"success":return LE;case"info":return GE;case"warning":return OE;case"error":return FE;default:return null}},UE=Array(12).fill(0),ME=({visible:e,className:t})=>D.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},D.createElement("div",{className:"sonner-spinner"},UE.map((a,n)=>D.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${n}`})))),LE=D.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},D.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),OE=D.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},D.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),GE=D.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},D.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),FE=D.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},D.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),HE=D.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},D.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),D.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),BE=()=>{let[e,t]=D.useState(document.hidden);return D.useEffect(()=>{let a=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",a),()=>window.removeEventListener("visibilitychange",a)},[]),e},Sm=1,VE=class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>
vendor: 1,050 bytes, line 406
406{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{var t;let{message:a,...n}=e,r=typeof(e==null?void 0:e.id)=="number"||((t=e.id)==null?void 0:t.length)>0?e.id:Sm++,o=this.toasts.find(l=>l.id===r),s=e.dismissible===void 0?!0:e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),o?this.toasts=this.toasts.map(l=>l.id===r?(this.publish({...l,...e,id:r,title:a}),{...l,...e,id:r,dismissible:s,title:a}):l):this.addToast({title:a,...n,dismissible:s,id:r}),r},this.dismiss=e=>(this.dismissedToasts.add(e),e||this.toasts.forEach(t=>{this.subscribers.forEach(a=>a({id:t.id,dismiss:!0}))}),this.subscribers.forEach(t=>t({id:e,dismiss:!0})),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:"error"}),this.success=(e,t)=>this.create({...t,type:"success",message:e}),this.info=(e,t)=>this.create({...t,type:"info",message:e}),this.warning=(e,t)=>this.create({...t,type:"warning",message:e}),this.loading=(e,t)=>
406this.create({...t,type:"loading",message:e}),this.promise=(e,t)=>{if(!t)return;let a;t.loading!==void 0&&(a=this.create({...t,promise:e,type:"loading",message:t.loading,description:typeof t.description!="function"?t.description:void 0}));let n=e instanceof Promise?e:e(),r=a!==void 0,o,s=n.then(async c=>{if(o=["resolve",c],D.isValidElement(c))r=!1,this.create({id:a,type:"default",message:c});else if($E(c)&&!c.ok){r=!1;let d=typeof t.error=="function"?await t.error(`HTTP error! status: ${c.status}`):t.error,u=typeof t.description=="function"?await t.description(`HTTP error! status: ${c.status}`):t.description;this.create({id:a,type:"error",message:d,description:u})}else if(t.success!==void 0){r=!1;let d=typeof t.success=="function"?await t.success(c):t.success,u=typeof t.description=="function"?await t.description(c):t.description;this.create({id:a,type:"success",message:d,description:u})}}).catch(async c=>{if(o=["reject",c],t.error!==void 0){r=!1;let d=typeof t.error=="function"?await t.error(c):t.error,u=typeof t.description=="function"?await t.description(c):t.description;this.create({id:a,type:"error",message:d,description:u})}}).finally(()=>{var c;r&&(this.dismiss(a),a=void 0),(c=t.finally)==null||c.call(t)}),l=()=>new Promise((c,d)=>s.then(()=>o[0]==="reject"?d(o[1]):c(o[1])).catch(d));return typeof a!="string"&&typeof a!="number"?{unwrap:l}:Object.assign(a,{unwrap:l})},this.custom=(e,t)=>{let a=(t==null?void 0:t.id)||Sm++;return this.create({jsx:e(a),id:a,...t}),a},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},Lt=new VE,WE=(e,t)=>{let a=(t==null?void 0:t.id)||Sm++;return Lt.addToast({title:e,...t,id:a}),a},$E=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",KE=WE,YE=()=>Lt.toasts,JE=()=>Lt.getActiveToasts(),uF=Object.assign(KE,{success:Lt.success,info:Lt.info,warning:Lt.warning,error:Lt.error,custom:Lt.custom,message:Lt.message,promise:Lt.promise,dismiss:Lt.dismiss,loading:Lt.loading},{getHistory:YE,getToasts:JE});function QE(e,{insertAt:t}={}){if(typeof document>"u")return;let a=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t==="top"&&a.firstChild?a.insertBefore(n,a.firstChild):a.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}QE(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;
406left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}
406:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);
406--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} 407`);function Cc(e){return e.label!==void 0}var ZE=3,XE="32px",ez="16px",pb=4e3,tz=356,az=14,nz=20,rz=200;function Ia(...e){return e.filter(Boolean).join(" ")}function oz(e){let[t,a]=e.split("-"),n=[];return t&&n.push(t),a&&n.push(a),n}var iz=e=>{var t,a,n,r,o,s,l,c,d,u,h;let{invert:m,toast:p,unstyled:b,interacting:g,setHeights:v,visibleToasts:w,heights:y,index:x,toasts:k,expanded:C,removeToast:S,defaultRichColors:A,closeButton:P,style:I,cancelButtonStyle:N,actionButtonStyle:V,className:z="",descriptionClassName:L="",duration:E,position:K,gap:F,loadingIcon:Z,expandByDefault:j,classNames:T,icons:O,closeButtonAriaLabel:$="Close toast",pauseWhenPageIsHidden:W}
407=e,[se,le]=D.useState(null),[Re,_e]=D.useState(null),[B,Pe]=D.useState(!1),[Te,xe]=D.useState(!1),[ke,Ie]=D.useState(!1),[St,sa]=D.useState(!1),[qr,_n]=D.useState(!1),[Ur,hs]=D.useState(0),[qo,Dy]=D.useState(0),ps=D.useRef(p.duration||E||pb),_y=D.useRef(null),Mr=D.useRef(null),GT=x===0,FT=x+1<=w,la=p.type,Uo=p.dismissible!==!1,HT=p.className||"",BT=p.descriptionClassName||"",ac=D.useMemo(()=>y.findIndex(me=>me.toastId===p.id)||0,[y,p.id]),VT=D.useMemo(()=>{var me;return(me=p.closeButton)!=null?me:P},[p.closeButton,P]),qy=D.useMemo(()=>p.duration||E||pb,[p.duration,E]),ch=D.useRef(0),Mo=D.useRef(0),Uy=D.useRef(0),Lo=D.useRef(null),[WT,$T]=K.split("-"),My=D.useMemo(()=>y.reduce((me,qe,He)=>He>=ac?me:me+qe.height,0),[y,ac]),Ly=BE(),KT=p.invert||m,dh=la==="loading";Mo.current=D.useMemo(()=>ac*F+My,[ac,My]),D.useEffect(()=>{ps.current=qy},[qy]),D.useEffect(()=>{Pe(!0)},[]),D.useEffect(()=>{let me=Mr.current;if(me){let qe=me.getBoundingClientRect().height;return Dy(qe),v(He=>[{toastId:p.id,height:qe,position:p.position},...He]),()=>v(He=>He.filter(Sa=>Sa.toastId!==p.id))}},[v,p.id]),D.useLayoutEffect(()=>{if(!B)return;let me=Mr.current,qe=me.style.height;me.style.height="auto";let He=me.getBoundingClientRect().height;me.style.height=qe,Dy(He),v(Sa=>Sa.find(Aa=>Aa.toastId===p.id)?Sa.map(Aa=>Aa.toastId===p.id?{...Aa,height:He}:Aa):[{toastId:p.id,height:He,position:p.position},...Sa])},[B,p.title,p.description,v,p.id]);let qn=D.useCallback(()=>{xe(!0),hs(Mo.current),v(me=>me.filter(qe=>qe.toastId!==p.id)),setTimeout(()=>{S(p)},rz)},[p,S,v,Mo]);D.useEffect(()=>{if(p.promise&&la==="loading"||p.duration===1/0||p.type==="loading")return;let me;return C||g||W&&Ly?(()=>{if(Uy.current<ch.current){let qe=new Date().getTime()-ch.current;ps.current=ps.current-qe}Uy.current=new Date().getTime()})():ps.current!==1/0&&(ch.current=new Date().getTime(),me=setTimeout(()=>{var qe;(qe=p.onAutoClose)==null||qe.call(p,p),qn()},ps.current)),()=>clearTimeout(me)},[C,g,p,la,W,Ly,qn]),D.useEffect(()=>{p.delete&&qn()},[qn,p.delete]);function YT(){var me,qe,He;return O!=null&&O.loading?D.createElement("div",{className:Ia(T==null?void 0:T.loader,(me=p==null?void 0:p.classNames)==null?void 0:me.loader,"sonner-loader"),"data-visible":la==="loading"},O.loading):Z?D.createElement("div",{className:Ia(T==null?void 0:T.loader,(qe=p==null?void 0:p.classNames)==null?void 0:qe.loader,"sonner-loader"),"data-visible":la==="loading"},Z):D.createElement(ME,{className:Ia(T==null?void 0:T.loader,(He=p==null?void 0:p.classNames)==null?void 0:He.loader),visible:la==="loading"})}return D.createElement("li",{tabIndex:0,ref:Mr,className:Ia(z,HT,T==null?void 0:T.toast,(t=p==null?void 0:p.classNames)==null?void 0:t.toast,T==null?void 0:T.default,T==null?void 0:T[la],(a=p==null?void 0:p.classNames)==null?void 0:a[la]),"data-sonner-toast":"","data-rich-colors":(n=p.richColors)!=null?n:A,"data-styled":!(p.jsx||p.unstyled||b),"data-mounted":B,"data-promise":!!p.promise,"data-swiped":qr,"data-removed":Te,"data-visible":FT,"data-y-position":WT,"data-x-position":$T,"data-index":x,"data-front":GT,"data-swiping":ke,"data-dismissible":Uo,"data-type":la,"data-invert":KT,"data-swipe-out":St,"data-swipe-direction":Re,"data-expanded":!!(C||j&&B),style:{"--index":x,"--toasts-before":x,"--z-index":k.length-x,"--offset":`${Te?Ur:Mo.current}px`,"--initial-height":j?"auto":`${qo}px`,...I,...p.style},onDragEnd:()=>{Ie(!1),le(null),Lo.current=null},onPointerDown:me=>{dh||!Uo||(_y.current=new Date,hs(Mo.current),me.target.setPointerCapture(me.pointerId),me.target.tagName!=="BUTTON"&&(Ie(!0),Lo.current={x:me.clientX,y:me.clientY}))},onPointerUp:()=>{var me,qe,He,Sa;if(St||!Uo)return;Lo.current=null;let Aa=Number(((me=Mr.current)==null?void 0:me.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Un=Number(((qe=Mr.current)==null?void 0:qe.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Lr=new Date().getTime()-((He=_y.current)==null?void 0:He.getTime()),Pa=se==="x"?Aa:Un,Mn=Math.abs(Pa)/Lr;if(Math.abs(Pa)>=nz||Mn>.11){hs(Mo.current),(Sa=p.onDismiss)==null||Sa.call(p,p),_e(se==="x"?Aa>0?"right":"left":Un>0?"down":"up"),qn(),sa(!0),_n(!1);return}Ie(!1),le(null)},onPointerMove:me=>{var qe,He,Sa,Aa;if(!Lo.current||!Uo||((qe=window.getSelection())==null?void 0:qe.toString().length)>0)return;let Un=me.clientY-Lo.current.y,Lr=me.clientX-Lo.current.x,Pa=(He=e.swipeDirections)!=null?He:oz(K);!se&&(Math.abs(Lr)>1||Math.abs(Un)>1)&&le(Math.abs(Lr)>Math.abs(Un)?"x":"y");let Mn={x:0,y:0};se==="y"?(Pa.includes("top")||Pa.includes("bottom"))&&(Pa.includes("top")&&Un<0||Pa.includes("bottom")&&Un>0)&&(Mn.y=Un):se==="x"&&(Pa.includes("left")||Pa.includes("right"))&&(Pa.includes("left")&&Lr<0||Pa.includes("right")&&Lr>0)&&(Mn.x=Lr),(Math.abs(Mn.x)>0||Math.abs(Mn.y)>0)&&_n(!0),(Sa=Mr.current)==null||Sa.style.setProperty("--swipe-amount-x",`${Mn.x}px`),(Aa=Mr.current)==null||Aa.style.setProperty("--swipe-amount-y",`${Mn.y}px`)}},VT&&!p.jsx?D.createElement("button",{"aria-label":$,"data-disabled":dh,"data-close-button":!0,onClick:dh||!Uo?()=>{}:()=>{var me;qn(),(me=p.onDismiss)==null||me.call(p,p)},className:Ia(T==null?void 0:T.closeButton,(r=p==null?void 0:p.classNames)==null?void 0:r.closeButton)},(o=O==null?void 0:O.close)!=null?o:HE):null,p.jsx||f.isValidElement(p.title)?p.jsx?p.jsx:typeof p.title=="function"?p.title():p.title:D.createElement(D.Fragment,null,la||p.icon||p.promise?D.createElement("div",{"data-icon":"",className:Ia(T==null?void 0:T.icon,(s=p==null?void 0:p.classNames)==null?void 0:s.icon)}
vendor: 5,252 bytes, line 407
407,p.promise||p.type==="loading"&&!p.icon?p.icon||YT():null,p.type!=="loading"?p.icon||(O==null?void 0:O[la])||qE(la):null):null,D.createElement("div",{"data-content":"",className:Ia(T==null?void 0:T.content,(l=p==null?void 0:p.classNames)==null?void 0:l.content)},D.createElement("div",{"data-title":"",className:Ia(T==null?void 0:T.title,(c=p==null?void 0:p.classNames)==null?void 0:c.title)},typeof p.title=="function"?p.title():p.title),p.description?D.createElement("div",{"data-description":"",className:Ia(L,BT,T==null?void 0:T.description,(d=p==null?void 0:p.classNames)==null?void 0:d.description)},typeof p.description=="function"?p.description():p.description):null),f.isValidElement(p.cancel)?p.cancel:p.cancel&&Cc(p.cancel)?D.createElement("button",{"data-button":!0,"data-cancel":!0,style:p.cancelButtonStyle||N,onClick:me=>{var qe,He;Cc(p.cancel)&&Uo&&((He=(qe=p.cancel).onClick)==null||He.call(qe,me),qn())},className:Ia(T==null?void 0:T.cancelButton,(u=p==null?void 0:p.classNames)==null?void 0:u.cancelButton)},p.cancel.label):null,f.isValidElement(p.action)?p.action:p.action&&Cc(p.action)?D.createElement("button",{"data-button":!0,"data-action":!0,style:p.actionButtonStyle||V,onClick:me=>{var qe,He;Cc(p.action)&&((He=(qe=p.action).onClick)==null||He.call(qe,me),!me.defaultPrevented&&qn())},className:Ia(T==null?void 0:T.actionButton,(h=p==null?void 0:p.classNames)==null?void 0:h.actionButton)},p.action.label):null))};function mb(){if(typeof window>"u"||typeof document>"u")return"ltr";let e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function sz(e,t){let a={};return[e,t].forEach((n,r)=>{let o=r===1,s=o?"--mobile-offset":"--offset",l=o?ez:XE;function c(d){["top","right","bottom","left"].forEach(u=>{a[`${s}-${u}`]=typeof d=="number"?`${d}px`:d})}typeof n=="number"||typeof n=="string"?c(n):typeof n=="object"?["top","right","bottom","left"].forEach(d=>{n[d]===void 0?a[`${s}-${d}`]=l:a[`${s}-${d}`]=typeof n[d]=="number"?`${n[d]}px`:n[d]}):c(l)}),a}var lz=f.forwardRef(function(e,t){let{invert:a,position:n="bottom-right",hotkey:r=["altKey","KeyT"],expand:o,closeButton:s,className:l,offset:c,mobileOffset:d,theme:u="light",richColors:h,duration:m,style:p,visibleToasts:b=ZE,toastOptions:g,dir:v=mb(),gap:w=az,loadingIcon:y,icons:x,containerAriaLabel:k="Notifications",pauseWhenPageIsHidden:C}=e,[S,A]=D.useState([]),P=D.useMemo(()=>Array.from(new Set([n].concat(S.filter(W=>W.position).map(W=>W.position)))),[S,n]),[I,N]=D.useState([]),[V,z]=D.useState(!1),[L,E]=D.useState(!1),[K,F]=D.useState(u!=="system"?u:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),Z=D.useRef(null),j=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),T=D.useRef(null),O=D.useRef(!1),$=D.useCallback(W=>{A(se=>{var le;return(le=se.find(Re=>Re.id===W.id))!=null&&le.delete||Lt.dismiss(W.id),se.filter(({id:Re})=>Re!==W.id)})},[]);return D.useEffect(()=>Lt.subscribe(W=>{if(W.dismiss){A(se=>se.map(le=>le.id===W.id?{...le,delete:!0}:le));return}setTimeout(()=>{wg.flushSync(()=>{A(se=>{let le=se.findIndex(Re=>Re.id===W.id);return le!==-1?[...se.slice(0,le),{...se[le],...W},...se.slice(le+1)]:[W,...se]})})})}),[]),D.useEffect(()=>{if(u!=="system"){F(u);return}if(u==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?F("dark"):F("light")),typeof window>"u")return;let W=window.matchMedia("(prefers-color-scheme: dark)");try{W.addEventListener("change",({matches:se})=>{F(se?"dark":"light")})}catch{W.addListener(({matches:le})=>{try{F(le?"dark":"light")}catch(Re){console.error(Re)}})}},[u]),D.useEffect(()=>{S.length<=1&&z(!1)},[S]),D.useEffect(()=>{let W=se=>{var le,Re;r.every(_e=>se[_e]||se.code===_e)&&(z(!0),(le=Z.current)==null||le.focus()),se.code==="Escape"&&(document.activeElement===Z.current||(Re=Z.current)!=null&&Re.contains(document.activeElement))&&z(!1)};return document.addEventListener("keydown",W),()=>document.removeEventListener("keydown",W)},[r]),D.useEffect(()=>{if(Z.current)return()=>{T.current&&(T.current.focus({preventScroll:!0}),T.current=null,O.current=!1)}},[Z.current]),D.createElement("section",{ref:t,"aria-label":`${k} ${j}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},P.map((W,se)=>{var le;let[Re,_e]=W.split("-");return S.length?D.createElement("ol",{key:W,dir:v==="auto"?mb():v,tabIndex:-1,ref:Z,className:l,"data-sonner-toaster":!0,"data-theme":K,"data-y-position":Re,"data-lifted":V&&S.length>1&&!o,"data-x-position":_e,style:{"--front-toast-height":`${((le=I[0])==null?void 0:le.height)||0}px`,"--width":`${tz}px`,"--gap":`${w}px`,...p,...sz(c,d)},onBlur:B=>{O.current&&!B.currentTarget.contains(B.relatedTarget)&&(O.current=!1,T.current&&(T.current.focus({preventScroll:!0}),T.current=null))},onFocus:B=>{B.target instanceof HTMLElement&&B.target.dataset.dismissible==="false"||O.current||(O.current=!0,T.current=B.relatedTarget)},onMouseEnter:()=>z(!0),onMouseMove:()=>z(!0),onMouseLeave:()=>{L||z(!1)},onDragEnd:()=>z(!1),onPointerDown:B=>{B.target instanceof HTMLElement&&B.target.dataset.dismissible==="false"||E(!0)},onPointerUp:()=>E(!1)}
vendor: 4,578 bytes, line 407
407,S.filter(B=>!B.position&&se===0||B.position===W).map((B,Pe)=>{var Te,xe;return D.createElement(iz,{key:B.id,icons:x,index:Pe,toast:B,defaultRichColors:h,duration:(Te=g==null?void 0:g.duration)!=null?Te:m,className:g==null?void 0:g.className,descriptionClassName:g==null?void 0:g.descriptionClassName,invert:a,visibleToasts:b,closeButton:(xe=g==null?void 0:g.closeButton)!=null?xe:s,interacting:L,position:W,style:g==null?void 0:g.style,unstyled:g==null?void 0:g.unstyled,classNames:g==null?void 0:g.classNames,cancelButtonStyle:g==null?void 0:g.cancelButtonStyle,actionButtonStyle:g==null?void 0:g.actionButtonStyle,removeToast:$,toasts:S.filter(ke=>ke.position==B.position),heights:I.filter(ke=>ke.position==B.position),setHeights:N,expandByDefault:o,gap:w,loadingIcon:y,expanded:V,pauseWhenPageIsHidden:C,swipeDirections:e.swipeDirections})})):null}))});const cz=({...e})=>{const{theme:t="system"}=_E();return i.jsx(lz,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e})};var dz=jf[" useId ".trim().toString()]||(()=>{}),uz=0;function _t(e){const[t,a]=f.useState(dz());return rt(()=>{e||a(n=>n??String(uz++))},[e]),e||(t?`radix-${t}`:"")}const hz=["top","right","bottom","left"],kr=Math.min,Qt=Math.max,_d=Math.round,Sc=Math.floor,dn=e=>({x:e,y:e}),pz={left:"right",right:"left",bottom:"top",top:"bottom"},mz={start:"end",end:"start"};function Am(e,t,a){return Qt(e,kr(t,a))}function jn(e,t){return typeof e=="function"?e(t):e}function Nn(e){return e.split("-")[0]}function as(e){return e.split("-")[1]}function jg(e){return e==="x"?"y":"x"}function Ng(e){return e==="y"?"height":"width"}const fz=new Set(["top","bottom"]);function rn(e){return fz.has(Nn(e))?"y":"x"}function Eg(e){return jg(rn(e))}function gz(e,t,a){a===void 0&&(a=!1);const n=as(e),r=Eg(e),o=Ng(r);let s=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(s=qd(s)),[s,qd(s)]}function yz(e){const t=qd(e);return[Pm(e),t,Pm(t)]}function Pm(e){return e.replace(/start|end/g,t=>mz[t])}const fb=["left","right"],gb=["right","left"],vz=["top","bottom"],bz=["bottom","top"];function wz(e,t,a){switch(e){case"top":case"bottom":return a?t?gb:fb:t?fb:gb;case"left":case"right":return t?vz:bz;default:return[]}}function xz(e,t,a,n){const r=as(e);let o=wz(Nn(e),a==="start",n);return r&&(o=o.map(s=>s+"-"+r),t&&(o=o.concat(o.map(Pm)))),o}function qd(e){return e.replace(/left|right|bottom|top/g,t=>pz[t])}function kz(e){return{top:0,right:0,bottom:0,left:0,...e}}function kC(e){return typeof e!="number"?kz(e):{top:e,right:e,bottom:e,left:e}}function Ud(e){const{x:t,y:a,width:n,height:r}=e;return{width:n,height:r,top:a,left:t,right:t+n,bottom:a+r,x:t,y:a}}function yb(e,t,a){let{reference:n,floating:r}=e;const o=rn(t),s=Eg(t),l=Ng(s),c=Nn(t),d=o==="y",u=n.x+n.width/2-r.width/2,h=n.y+n.height/2-r.height/2,m=n[l]/2-r[l]/2;let p;switch(c){case"top":p={x:u,y:n.y-r.height};break;case"bottom":p={x:u,y:n.y+n.height};break;case"right":p={x:n.x+n.width,y:h};break;case"left":p={x:n.x-r.width,y:h};break;default:p={x:n.x,y:n.y}}switch(as(t)){case"start":p[s]-=m*(a&&d?-1:1);break;case"end":p[s]+=m*(a&&d?-1:1);break}return p}const Cz=async(e,t,a)=>{const{placement:n="bottom",strategy:r="absolute",middleware:o=[],platform:s}=a,l=o.filter(Boolean),c=await(s.isRTL==null?void 0:s.isRTL(t));let d=await s.getElementRects({reference:e,floating:t,strategy:r}),{x:u,y:h}=yb(d,n,c),m=n,p={},b=0;for(let g=0;g<l.length;g++){const{name:v,fn:w}=l[g],{x:y,y:x,data:k,reset:C}=await w({x:u,y:h,initialPlacement:n,placement:m,strategy:r,middlewareData:p,rects:d,platform:s,elements:{reference:e,floating:t}});u=y??u,h=x??h,p={...p,[v]:{...p[v],...k}},C&&b<=50&&(b++,typeof C=="object"&&(C.placement&&(m=C.placement),C.rects&&(d=C.rects===!0?await s.getElementRects({reference:e,floating:t,strategy:r}):C.rects),{x:u,y:h}=yb(d,m,c)),g=-1)}return{x:u,y:h,placement:m,strategy:r,middlewareData:p}};async function yl(e,t){var a;t===void 0&&(t={});const{x:n,y:r,platform:o,rects:s,elements:l,strategy:c}=e,{boundary:d="clippingAncestors",rootBoundary:u="viewport",elementContext:h="floating",altBoundary:m=!1,padding:p=0}=jn(t,e),b=kC(p),v=l[m?h==="floating"?"reference":"floating":h],w=Ud(await o.getClippingRect
vendor: 8,116 bytes, line 407
407({element:(a=await(o.isElement==null?void 0:o.isElement(v)))==null||a?v:v.contextElement||await(o.getDocumentElement==null?void 0:o.getDocumentElement(l.floating)),boundary:d,rootBoundary:u,strategy:c})),y=h==="floating"?{x:n,y:r,width:s.floating.width,height:s.floating.height}:s.reference,x=await(o.getOffsetParent==null?void 0:o.getOffsetParent(l.floating)),k=await(o.isElement==null?void 0:o.isElement(x))?await(o.getScale==null?void 0:o.getScale(x))||{x:1,y:1}:{x:1,y:1},C=Ud(o.convertOffsetParentRelativeRectToViewportRelativeRect?await o.convertOffsetParentRelativeRectToViewportRelativeRect({elements:l,rect:y,offsetParent:x,strategy:c}):y);return{top:(w.top-C.top+b.top)/k.y,bottom:(C.bottom-w.bottom+b.bottom)/k.y,left:(w.left-C.left+b.left)/k.x,right:(C.right-w.right+b.right)/k.x}}const Sz=e=>({name:"arrow",options:e,async fn(t){const{x:a,y:n,placement:r,rects:o,platform:s,elements:l,middlewareData:c}=t,{element:d,padding:u=0}=jn(e,t)||{};if(d==null)return{};const h=kC(u),m={x:a,y:n},p=Eg(r),b=Ng(p),g=await s.getDimensions(d),v=p==="y",w=v?"top":"left",y=v?"bottom":"right",x=v?"clientHeight":"clientWidth",k=o.reference[b]+o.reference[p]-m[p]-o.floating[b],C=m[p]-o.reference[p],S=await(s.getOffsetParent==null?void 0:s.getOffsetParent(d));let A=S?S[x]:0;(!A||!await(s.isElement==null?void 0:s.isElement(S)))&&(A=l.floating[x]||o.floating[b]);const P=k/2-C/2,I=A/2-g[b]/2-1,N=kr(h[w],I),V=kr(h[y],I),z=N,L=A-g[b]-V,E=A/2-g[b]/2+P,K=Am(z,E,L),F=!c.arrow&&as(r)!=null&&E!==K&&o.reference[b]/2-(E<z?N:V)-g[b]/2<0,Z=F?E<z?E-z:E-L:0;return{[p]:m[p]+Z,data:{[p]:K,centerOffset:E-K-Z,...F&&{alignmentOffset:Z}},reset:F}}}),Az=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var a,n;const{placement:r,middlewareData:o,rects:s,initialPlacement:l,platform:c,elements:d}=t,{mainAxis:u=!0,crossAxis:h=!0,fallbackPlacements:m,fallbackStrategy:p="bestFit",fallbackAxisSideDirection:b="none",flipAlignment:g=!0,...v}=jn(e,t);if((a=o.arrow)!=null&&a.alignmentOffset)return{};const w=Nn(r),y=rn(l),x=Nn(l)===l,k=await(c.isRTL==null?void 0:c.isRTL(d.floating)),C=m||(x||!g?[qd(l)]:yz(l)),S=b!=="none";!m&&S&&C.push(...xz(l,g,b,k));const A=[l,...C],P=await yl(t,v),I=[];let N=((n=o.flip)==null?void 0:n.overflows)||[];if(u&&I.push(P[w]),h){const E=gz(r,s,k);I.push(P[E[0]],P[E[1]])}if(N=[...N,{placement:r,overflows:I}],!I.every(E=>E<=0)){var V,z;const E=(((V=o.flip)==null?void 0:V.index)||0)+1,K=A[E];if(K&&(!(h==="alignment"?y!==rn(K):!1)||N.every(j=>j.overflows[0]>0&&rn(j.placement)===y)))return{data:{index:E,overflows:N},reset:{placement:K}};let F=(z=N.filter(Z=>Z.overflows[0]<=0).sort((Z,j)=>Z.overflows[1]-j.overflows[1])[0])==null?void 0:z.placement;if(!F)switch(p){case"bestFit":{var L;const Z=(L=N.filter(j=>{if(S){const T=rn(j.placement);return T===y||T==="y"}return!0}).map(j=>[j.placement,j.overflows.filter(T=>T>0).reduce((T,O)=>T+O,0)]).sort((j,T)=>j[1]-T[1])[0])==null?void 0:L[0];Z&&(F=Z);break}case"initialPlacement":F=l;break}if(r!==F)return{reset:{placement:F}}}return{}}}};function vb(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function bb(e){return hz.some(t=>e[t]>=0)}const Pz=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:a}=t,{strategy:n="referenceHidden",...r}=jn(e,t);switch(n){case"referenceHidden":{const o=await yl(t,{...r,elementContext:"reference"}),s=vb(o,a.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:bb(s)}}}case"escaped":{const o=await yl(t,{...r,altBoundary:!0}),s=vb(o,a.floating);return{data:{escapedOffsets:s,escaped:bb(s)}}}default:return{}}}}},CC=new Set(["left","top"]);async function Tz(e,t){const{placement:a,platform:n,elements:r}=e,o=await(n.isRTL==null?void 0:n.isRTL(r.floating)),s=Nn(a),l=as(a),c=rn(a)==="y",d=CC.has(s)?-1:1,u=o&&c?-1:1,h=jn(t,e);let{mainAxis:m,crossAxis:p,alignmentAxis:b}=typeof h=="number"?{mainAxis:h,crossAxis:0,alignmentAxis:null}:{mainAxis:h.mainAxis||0,crossAxis:h.crossAxis||0,alignmentAxis:h.alignmentAxis};return l&&typeof b=="number"&&(p=l==="end"?b*-1:b),c?{x:p*u,y:m*d}:{x:m*d,y:p*u}}const Iz=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var a,n;const{x:r,y:o,placement:s,middlewareData:l}=t,c=await Tz(t,e);return s===((a=l.offset)==null?void 0:a.placement)&&(n=l.arrow)!=null&&n.alignmentOffset?{}:{x:r+c.x,y:o+c.y,data:{...c,placement:s}}}}},jz=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:a,y:n,placement:r}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:l={fn:v=>{let{x:w,y}=v;return{x:w,y}}},...c}=jn(e,t),d={x:a,y:n},u=await yl(t,c),h=rn(Nn(r)),m=jg(h);let p=d[m],b=d[h];if(o){const v=m==="y"?"top":"left",w=m==="y"?"bottom":"right",y=p+u[v],x=p-u[w];p=Am(y,p,x)}if(s){const v=h==="y"?"top":"left",w=h==="y"?"bottom":"right",y=b+u[v],x=b-u[w];b=Am(y,b,x)}const g=l.fn({...t,[m]:p,[h]:b});return{...g,data:{x:g.x-a,y:g.y-n,enabled:{[m]:o,[h]:s}}}}}},Nz=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:a,y:n,placement:r,rects:o,middlewareData:s}=t,{offset:l=0,mainAxis:c=!0,crossAxis:d=!0}=jn(e,t),u={x:a,y:n},h=rn(r),m=jg(h);let p=u[m],b=u[h];const g=jn(l,t),v=typeof g=="number"?{mainAxis:g,crossAxis:0}:{mainAxis:0,crossAxis:0,...g};if(c){const x=m==="y"?"height":"width",k=o.reference[m]-o.floating[x]+v.mainAxis,C=o.reference[m]+o.reference[x]-v.mainAxis;p<k?p=k:p>C&&(p=C)}if(d){var w,y;const x=m==="y"?"width":"height",k=CC.has(Nn(r)),C=o.reference[h]-o.floating[x]+(k&&((w=s.offset)==null?void 0:w[h])||0)+(k?0:v.crossAxis),S=o.reference[h]+o.reference[x]+(k?0:((y=s.offset)==null?void 0:y[h])||0)-(k?v.crossAxis:0);b<C?b=C:b>S&&(b=S)}return{[m]:p,[h]:b}}}},Ez=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var a,n;const{placement:r,rects:o,platform:s,elements:l}=t,{apply:c=()=>{},...d}=jn(e,t),u=await yl(t,d),h=Nn(r),m=as(r),p=rn(r)==="y",{width:b,height:g}=o.floating;let v,w;h==="top"||h==="bottom"?(v=h,w=m===(await(s.isRTL==null?void 0:s.isRTL(l.floating))?"start":"end")?"left":"right"):(w=h,v=m==="end"?"top":"bottom");const y=g-u.top-u.bottom,x=b-u.left-u.right,k=kr(g-u[v],y),C=kr(b-u[w],x),S=!t.middlewareData.shift;let A=k,P=C;if((a=t.middlewareData.shift)!=null&&a.enabled.x&&(P=x),(n=t.middlewareData.shift)!=null&&n.enabled.y&&(A=y),S&&!m){const N=Qt(u.left,0),V=Qt(u.right,0),z=Qt(u.top,0),L=Qt(u.bottom,0);p?P=b-2*(N!==0||V!==0?N+V:Qt(u.left,u.right)):A=g-2*(z!==0||L!==0?z+L:Qt(u.top,u.bottom))}await c({...t,availableWidth:P,availableHeight:A});const I=await s.getDimensions(l.floating);return b!==I.width||g!==I.height?{reset:{rects:!0}}:{}}}};function ju(){return typeof window<"u"}function ns(e){return SC(e)?(e.nodeName||"").toLowerCase():"#document"}function ta(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function pn(e){var t;return(t=(SC(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function SC(e){return ju()?e instanceof Node||e instanceof ta(e).Node:!1}function Ba(e){return ju()?e instanceof Element||e instanceof ta(e).Element:!1}function hn(e){return ju()?e instanceof HTMLElement||e instanceof ta(e).HTMLElement:!1}function wb(e){return!ju()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ta(e).ShadowRoot}const zz=new Set(["inline","contents"]);function Yl(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=Va(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&!zz.has(r)}const Rz=new Set(["table","td","th"]);function Dz(e){return Rz.has(ns(e))}const _z=[":popover-open",":modal"];function Nu(e){return _z.some(t=>{try{return e.matches(t)}catch{return!1}})}const qz=["transform","translate","scale","rotate","perspective"],Uz=["transform","translate","scale","rotate","perspective","filter"],Mz=["paint","layout","strict","content"];function zg(e){const t=Rg(),a=Ba(e)?Va(e):e;return qz.some(n=>a[n]?a[n]!=="none":!1)||(a.containerType?a.containerType!=="normal":!1)||!t&&(a.backdropFilter?a.backdropFilter!=="none":!1)||!t&&(a.filter?a.filter!=="none":!1)||Uz.some(n=>(a.willChange||"").includes(n))||Mz.some(n=>(a.contain||"").includes(n))}
vendor: 4,796 bytes, line 407
407function Lz(e){let t=Cr(e);for(;hn(t)&&!Gi(t);){if(zg(t))return t;if(Nu(t))return null;t=Cr(t)}return null}function Rg(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}const Oz=new Set(["html","body","#document"]);function Gi(e){return Oz.has(ns(e))}function Va(e){return ta(e).getComputedStyle(e)}function Eu(e){return Ba(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Cr(e){if(ns(e)==="html")return e;const t=e.assignedSlot||e.parentNode||wb(e)&&e.host||pn(e);return wb(t)?t.host:t}function AC(e){const t=Cr(e);return Gi(t)?e.ownerDocument?e.ownerDocument.body:e.body:hn(t)&&Yl(t)?t:AC(t)}function vl(e,t,a){var n;t===void 0&&(t=[]),a===void 0&&(a=!0);const r=AC(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),s=ta(r);if(o){const l=Tm(s);return t.concat(s,s.visualViewport||[],Yl(r)?r:[],l&&a?vl(l):[])}return t.concat(r,vl(r,[],a))}function Tm(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function PC(e){const t=Va(e);let a=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const r=hn(e),o=r?e.offsetWidth:a,s=r?e.offsetHeight:n,l=_d(a)!==o||_d(n)!==s;return l&&(a=o,n=s),{width:a,height:n,$:l}}function Dg(e){return Ba(e)?e:e.contextElement}function Ci(e){const t=Dg(e);if(!hn(t))return dn(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:o}=PC(t);let s=(o?_d(a.width):a.width)/n,l=(o?_d(a.height):a.height)/r;return(!s||!Number.isFinite(s))&&(s=1),(!l||!Number.isFinite(l))&&(l=1),{x:s,y:l}}const Gz=dn(0);function TC(e){const t=ta(e);return!Rg()||!t.visualViewport?Gz:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Fz(e,t,a){return t===void 0&&(t=!1),!a||t&&a!==ta(e)?!1:t}function wo(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),o=Dg(e);let s=dn(1);t&&(n?Ba(n)&&(s=Ci(n)):s=Ci(e));const l=Fz(o,a,n)?TC(o):dn(0);let c=(r.left+l.x)/s.x,d=(r.top+l.y)/s.y,u=r.width/s.x,h=r.height/s.y;if(o){const m=ta(o),p=n&&Ba(n)?ta(n):n;let b=m,g=Tm(b);for(;g&&n&&p!==b;){const v=Ci(g),w=g.getBoundingClientRect(),y=Va(g),x=w.left+(g.clientLeft+parseFloat(y.paddingLeft))*v.x,k=w.top+(g.clientTop+parseFloat(y.paddingTop))*v.y;c*=v.x,d*=v.y,u*=v.x,h*=v.y,c+=x,d+=k,b=ta(g),g=Tm(b)}}return Ud({width:u,height:h,x:c,y:d})}function _g(e,t){const a=Eu(e).scrollLeft;return t?t.left+a:wo(pn(e)).left+a}function IC(e,t,a){a===void 0&&(a=!1);const n=e.getBoundingClientRect(),r=n.left+t.scrollLeft-(a?0:_g(e,n)),o=n.top+t.scrollTop;return{x:r,y:o}}function Hz(e){let{elements:t,rect:a,offsetParent:n,strategy:r}=e;const o=r==="fixed",s=pn(n),l=t?Nu(t.floating):!1;if(n===s||l&&o)return a;let c={scrollLeft:0,scrollTop:0},d=dn(1);const u=dn(0),h=hn(n);if((h||!h&&!o)&&((ns(n)!=="body"||Yl(s))&&(c=Eu(n)),hn(n))){const p=wo(n);d=Ci(n),u.x=p.x+n.clientLeft,u.y=p.y+n.clientTop}const m=s&&!h&&!o?IC(s,c,!0):dn(0);return{width:a.width*d.x,height:a.height*d.y,x:a.x*d.x-c.scrollLeft*d.x+u.x+m.x,y:a.y*d.y-c.scrollTop*d.y+u.y+m.y}}function Bz(e){return Array.from(e.getClientRects())}function Vz(e){const t=pn(e),a=Eu(e),n=e.ownerDocument.body,r=Qt(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),o=Qt(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight);let s=-a.scrollLeft+_g(e);const l=-a.scrollTop;return Va(n).direction==="rtl"&&(s+=Qt(t.clientWidth,n.clientWidth)-r),{width:r,height:o,x:s,y:l}}function Wz(e,t){const a=ta(e),n=pn(e),r=a.visualViewport;let o=n.clientWidth,s=n.clientHeight,l=0,c=0;if(r){o=r.width,s=r.height;const d=Rg();(!d||d&&t==="fixed")&&(l=r.offsetLeft,c=r.offsetTop)}return{width:o,height:s,x:l,y:c}}const $z=new Set(["absolute","fixed"]);function Kz(e,t){const a=wo(e,!0,t==="fixed"),n=a.top+e.clientTop,r=a.left+e.clientLeft,o=hn(e)?Ci(e):dn(1),s=e.clientWidth*o.x,l=e.clientHeight*o.y,c=r*o.x,d=n*o.y;return{width:s,height:l,x:c,y:d}}function xb(e,t,a){let n;if(t==="viewport")n=Wz(e,a);else if(t==="document")n=Vz(pn(e));else if(Ba(t))n=Kz(t,a);else{const r=TC(e);n={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return Ud(n)}function jC(e,t){const a=Cr(e);return a===t||!Ba(a)||Gi(a)?!1:Va(a).position==="fixed"||jC(a,t)}function Yz(e,t){const a=t.get(e);if(a)return a;let n=vl(e,[],!1).filter(l=>Ba(l)&&ns(l)!=="body"),r=null;const o=Va(e).position==="fixed";let s=o?Cr(e):e;for(;Ba(s)&&!Gi(s);){const l=Va(s),c=zg(s);!c&&l.position==="fixed"&&(r=null),(o?!c&&!r:!c&&l.position==="static"&&!!r&&$z.has(r.position)||Yl(s)&&!c&&jC(e,s))?n=n.filter(u=>u!==s):r=l,s=Cr(s)}return t.set(e,n),n}function Jz(e){let{element:t,boundary:a,rootBoundary:n,strategy:r}=e;const s=[...a==="clippingAncestors"?Nu(t)?[]:Yz(t,this._c):[].concat(a),n],l=s[0],c=s.reduce((d,u)=>{const h=xb(t,u,r);return d.top=Qt(h.top,d.top),d.right=kr(h.right,d.right),d.bottom=kr(h.bottom,d.bottom),d.left
vendor: 9,958 bytes, line 407
407=Qt(h.left,d.left),d},xb(t,l,r));return{width:c.right-c.left,height:c.bottom-c.top,x:c.left,y:c.top}}function Qz(e){const{width:t,height:a}=PC(e);return{width:t,height:a}}function Zz(e,t,a){const n=hn(t),r=pn(t),o=a==="fixed",s=wo(e,!0,o,t);let l={scrollLeft:0,scrollTop:0};const c=dn(0);function d(){c.x=_g(r)}if(n||!n&&!o)if((ns(t)!=="body"||Yl(r))&&(l=Eu(t)),n){const p=wo(t,!0,o,t);c.x=p.x+t.clientLeft,c.y=p.y+t.clientTop}else r&&d();o&&!n&&r&&d();const u=r&&!n&&!o?IC(r,l):dn(0),h=s.left+l.scrollLeft-c.x-u.x,m=s.top+l.scrollTop-c.y-u.y;return{x:h,y:m,width:s.width,height:s.height}}function Hh(e){return Va(e).position==="static"}function kb(e,t){if(!hn(e)||Va(e).position==="fixed")return null;if(t)return t(e);let a=e.offsetParent;return pn(e)===a&&(a=a.ownerDocument.body),a}function NC(e,t){const a=ta(e);if(Nu(e))return a;if(!hn(e)){let r=Cr(e);for(;r&&!Gi(r);){if(Ba(r)&&!Hh(r))return r;r=Cr(r)}return a}let n=kb(e,t);for(;n&&Dz(n)&&Hh(n);)n=kb(n,t);return n&&Gi(n)&&Hh(n)&&!zg(n)?a:n||Lz(e)||a}const Xz=async function(e){const t=this.getOffsetParent||NC,a=this.getDimensions,n=await a(e.floating);return{reference:Zz(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function eR(e){return Va(e).direction==="rtl"}const tR={convertOffsetParentRelativeRectToViewportRelativeRect:Hz,getDocumentElement:pn,getClippingRect:Jz,getOffsetParent:NC,getElementRects:Xz,getClientRects:Bz,getDimensions:Qz,getScale:Ci,isElement:Ba,isRTL:eR};function EC(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function aR(e,t){let a=null,n;const r=pn(e);function o(){var l;clearTimeout(n),(l=a)==null||l.disconnect(),a=null}function s(l,c){l===void 0&&(l=!1),c===void 0&&(c=1),o();const d=e.getBoundingClientRect(),{left:u,top:h,width:m,height:p}=d;if(l||t(),!m||!p)return;const b=Sc(h),g=Sc(r.clientWidth-(u+m)),v=Sc(r.clientHeight-(h+p)),w=Sc(u),x={rootMargin:-b+"px "+-g+"px "+-v+"px "+-w+"px",threshold:Qt(0,kr(1,c))||1};let k=!0;function C(S){const A=S[0].intersectionRatio;if(A!==c){if(!k)return s();A?s(!1,A):n=setTimeout(()=>{s(!1,1e-7)},1e3)}A===1&&!EC(d,e.getBoundingClientRect())&&s(),k=!1}try{a=new IntersectionObserver(C,{...x,root:r.ownerDocument})}catch{a=new IntersectionObserver(C,x)}a.observe(e)}return s(!0),o}function nR(e,t,a,n){n===void 0&&(n={});const{ancestorScroll:r=!0,ancestorResize:o=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:l=typeof IntersectionObserver=="function",animationFrame:c=!1}=n,d=Dg(e),u=r||o?[...d?vl(d):[],...vl(t)]:[];u.forEach(w=>{r&&w.addEventListener("scroll",a,{passive:!0}),o&&w.addEventListener("resize",a)});const h=d&&l?aR(d,a):null;let m=-1,p=null;s&&(p=new ResizeObserver(w=>{let[y]=w;y&&y.target===d&&p&&(p.unobserve(t),cancelAnimationFrame(m),m=requestAnimationFrame(()=>{var x;(x=p)==null||x.observe(t)})),a()}),d&&!c&&p.observe(d),p.observe(t));let b,g=c?wo(e):null;c&&v();function v(){const w=wo(e);g&&!EC(g,w)&&a(),g=w,b=requestAnimationFrame(v)}return a(),()=>{var w;u.forEach(y=>{r&&y.removeEventListener("scroll",a),o&&y.removeEventListener("resize",a)}),h==null||h(),(w=p)==null||w.disconnect(),p=null,c&&cancelAnimationFrame(b)}}const rR=Iz,oR=jz,iR=Az,sR=Ez,lR=Pz,Cb=Sz,cR=Nz,dR=(e,t,a)=>{const n=new Map,r={platform:tR,...a},o={...r.platform,_c:n};return Cz(e,t,{...r,platform:o})};var uR=typeof document<"u",hR=function(){},ad=uR?f.useLayoutEffect:hR;function Md(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let a,n,r;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(a=e.length,a!==t.length)return!1;for(n=a;n--!==0;)if(!Md(e[n],t[n]))return!1;return!0}if(r=Object.keys(e),a=r.length,a!==Object.keys(t).length)return!1;for(n=a;n--!==0;)if(!{}.hasOwnProperty.call(t,r[n]))return!1;for(n=a;n--!==0;){const o=r[n];if(!(o==="_owner"&&e.$$typeof)&&!Md(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function zC(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Sb(e,t){const a=zC(e);return Math.round(t*a)/a}function Bh(e){const t=f.useRef(e);return ad(()=>{t.current=e}),t}function pR(e){e===void 0&&(e={});const{placement:t="bottom",strategy:a="absolute",middleware:n=[],platform:r,elements:{reference:o,floating:s}={},transform:l=!0,whileElementsMounted:c,open:d}=e,[u,h]=f.useState({x:0,y:0,strategy:a,placement:t,middlewareData:{},isPositioned:!1}),[m,p]=f.useState(n);Md(m,n)||p(n);const[b,g]=f.useState(null),[v,w]=f.useState(null),y=f.useCallback(j=>{j!==S.current&&(S.current=j,g(j))},[]),x=f.useCallback(j=>{j!==A.current&&(A.current=j,w(j))},[]),k=o||b,C=s||v,S=f.useRef(null),A=f.useRef(null),P=f.useRef(u),I=c!=null,N=Bh(c),V=Bh(r),z=Bh(d),L=f.useCallback(()=>{if(!S.current||!A.current)return;const j={placement:t,strategy:a,middleware:m};V.current&&(j.platform=V.current),dR(S.current,A.current,j).then(T=>{const O={...T,isPositioned:z.current!==!1};E.current&&!Md(P.current,O)&&(P.current=O,No.flushSync(()=>{h(O)}))})},[m,t,a,V,z]);ad(()=>{d===!1&&P.current.isPositioned&&(P.current.isPositioned=!1,h(j=>({...j,isPositioned:!1})))},[d]);const E=f.useRef(!1);ad(()=>(E.current=!0,()=>{E.current=!1}),[]),ad(()=>{if(k&&(S.current=k),C&&(A.current=C),k&&C){if(N.current)return N.current(k,C,L);L()}},[k,C,L,N,I]);const K=f.useMemo(()=>({reference:S,floating:A,setReference:y,setFloating:x}),[y,x]),F=f.useMemo(()=>({reference:k,floating:C}),[k,C]),Z=f.useMemo(()=>{const j={position:a,left:0,top:0};if(!F.floating)return j;const T=Sb(F.floating,u.x),O=Sb(F.floating,u.y);return l?{...j,transform:"translate("+T+"px, "+O+"px)",...zC(F.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:T,top:O}},[a,l,F.floating,u.x,u.y]);return f.useMemo(()=>({...u,update:L,refs:K,elements:F,floatingStyles:Z}),[u,L,K,F,Z])}const mR=e=>{function t(a){return{}.hasOwnProperty.call(a,"current")}return{name:"arrow",options:e,fn(a){const{element:n,padding:r}=typeof e=="function"?e(a):e;return n&&t(n)?n.current!=null?Cb({element:n.current,padding:r}).fn(a):{}:n?Cb({element:n,padding:r}).fn(a):{}}}},fR=(e,t)=>({...rR(e),options:[e,t]}),gR=(e,t)=>({...oR(e),options:[e,t]}),yR=(e,t)=>({...cR(e),options:[e,t]}),vR=(e,t)=>({...iR(e),options:[e,t]}),bR=(e,t)=>({...sR(e),options:[e,t]}),wR=(e,t)=>({...lR(e),options:[e,t]}),xR=(e,t)=>({...mR(e),options:[e,t]});var kR="Arrow",RC=f.forwardRef((e,t)=>{const{children:a,width:n=10,height:r=5,...o}=e;return i.jsx(ee.svg,{...o,ref:t,width:n,height:r,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?a:i.jsx("polygon",{points:"0,0 30,0 15,10"})})});RC.displayName=kR;var CR=RC;function DC(e){const[t,a]=f.useState(void 0);return rt(()=>{if(e){a({width:e.offsetWidth,height:e.offsetHeight});const n=new ResizeObserver(r=>{if(!Array.isArray(r)||!r.length)return;const o=r[0];let s,l;if("borderBoxSize"in o){const c=o.borderBoxSize,d=Array.isArray(c)?c[0]:c;s=d.inlineSize,l=d.blockSize}else s=e.offsetWidth,l=e.offsetHeight;a({width:s,height:l})});return n.observe(e,{box:"border-box"}),()=>n.unobserve(e)}else a(void 0)},[e]),t}var qg="Popper",[_C,rs]=Wt(qg),[SR,qC]=_C(qg),UC=e=>{const{__scopePopper:t,children:a}=e,[n,r]=f.useState(null);return i.jsx(SR,{scope:t,anchor:n,onAnchorChange:r,children:a})};UC.displayName=qg;var MC="PopperAnchor",LC=f.forwardRef((e,t)=>{const{__scopePopper:a,virtualRef:n,...r}=e,o=qC(MC,a),s=f.useRef(null),l=ye(t,s);return f.useEffect(()=>{o.onAnchorChange((n==null?void 0:n.current)||s.current)}),n?null:i.jsx(ee.div,{...r,ref:l})});LC.displayName=MC;var Ug="PopperContent",[AR,PR]=_C(Ug),OC=f.forwardRef((e,t)=>{var B,Pe,Te,xe,ke,Ie;const{__scopePopper:a,side:n="bottom",sideOffset:r=0,align:o="center",alignOffset:s=0,arrowPadding:l=0,avoidCollisions:c=!0,collisionBoundary:d=[],collisionPadding:u=0,sticky:h="partial",hideWhenDetached:m=!1,updatePositionStrategy:p="optimized",onPlaced:b,...g}=e,v=qC(Ug,a),[w,y]=f.useState(null),x=ye(t,St=>y(St)),[k,C]=f.useState(null),S=DC(k),A=(S==null?void 0:S.width)??0,P=(S==null?void 0:S.height)??0,I=n+(o!=="center"?"-"+o:""),N=typeof u=="number"?u:{top:0,right:0,bottom:0,left:0,...u},V=Array.isArray(d)?d:[d],z=V.length>0,L={padding:N,boundary:V.filter(IR),altBoundary:z},{refs:E,floatingStyles:K,placement:F,isPositioned:Z,middlewareData:j}=pR({strategy:"fixed",placement:I,whileElementsMounted:(...St)=>nR(...St,{animationFrame:p==="always"}),elements:{reference:v.anchor},middleware:[fR({mainAxis:r+P,alignmentAxis:s}),c&&gR({mainAxis:!0,crossAxis:!1,limiter:h==="partial"?yR():void 0,...L}),c&&vR({...L}),bR({...L,apply:({elements:St,rects:sa,availableWidth:qr,availableHeight:_n})=>{const{width:Ur,height:hs}=sa.reference,qo=St.floating.style;qo.setProperty("--radix-popper-available-width",`${qr}px`),qo.setProperty("--radix-popper-available-height",`${_n}px`),qo.setProperty("--radix-popper-anchor-width",`${Ur}px`),qo.setProperty("--radix-popper-anchor-height",`${hs}px`)}}),k&&xR({element:k,padding:l}),jR({arrowWidth:A,arrowHeight:P}),m&&wR({strategy:"referenceHidden",...L})]}),[T,O]=HC(F),$=tt(b);rt(()=>{Z&&($==null||$())},[Z,$]);const W=(B=j.arrow)==null?void 0:B.x,se=(Pe=j.arrow)==null?void 0:Pe.y,le=((Te=j.arrow)==null?void 0:Te.centerOffset)!==0,[Re,_e]=f.useState();return rt(()=>{w&&_e(window.getComputedStyle(w).zIndex)},[w]),i.jsx("div",{ref:E.setFloating,"data-radix-popper-content-wrapper":"",style:{...K,transform:Z?K.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:Re,"--radix-popper-transform-origin":[(xe=j.transformOrigin)==null?void 0:xe.x,(ke=j.transformOrigin)==null?void 0:ke.y].join(" "),...((Ie=j.hide)==null?void 0:Ie.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:i.jsx(AR,{scope:a,placedSide:T,onArrowChange:C,arrowX:W,arrowY:se,shouldHideArrow:le,children:i.jsx(ee.div,{"data-side":T,"data-align":O,...g,ref:x,style:{...g.style,animation:Z?void 0:"none"}})})})});OC.displayName=Ug;var GC="PopperArrow",TR={top:"bottom",right:"left",bottom:"top",left:"r
407ight"},FC=f.forwardRef(function(t,a){const{__scopePopper:n,...r}=t,o=PR(GC,n),s=TR[o.placedSide];return i.jsx("span",{ref:o.onArrowChange,style:{position:"absolute",left:o.arrowX,top:o.arrowY,[s]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[o.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[o.placedSide],visibility:o.shouldHideArrow?"hidden":void 0},children:i.jsx(CR,{...r,ref:a,style:{...r.style,display:"block"}})})});FC.displayName=GC;function IR(e){return e!==null}var jR=e=>({name:"transformOrigin",options:e,fn(t){var v,w,y;const{placement:a,rects:n,middlewareData:r}=t,s=((v=r.arrow)==null?void 0:v.centerOffset)!==0,l=s?0:e.arrowWidth,c=s?0:e.arrowHeight,[d,u]=HC(a),h={start:"0%",center:"50%",end:"100%"}[u],m=(((w=r.arrow)==null?void 0:w.x)??0)+l/2,p=(((y=r.arrow)==null?void 0:y.y)??0)+c/2;let b="",g="";return d==="bottom"?(b=s?h:`${m}px`,g=`${-c}px`):d==="top"?(b=s?h:`${m}px`,g=`${n.floating.height+c}px`):d==="right"?(b=`${-c}px`,g=s?h:`${p}px`):d==="left"&&(b=`${n.floating.width+c}px`,g=s?h:`${p}px`),{data:{x:b,y:g}}}});function HC(e){const[t,a="center"]=e.split("-");return[t,a]}var Mg=UC,Lg=LC,Og=OC,Gg=FC,[zu,hF]=Wt("Tooltip",[rs]),Ru=rs(),BC="TooltipProvider",NR=700,Im="tooltip.open",[ER,Fg]=zu(BC),VC=e=>{const{__scopeTooltip:t,delayDuration:a=NR,skipDelayDuration:n=300,disableHoverableContent:r=!1,children:o}=e,s=f.useRef(!0),l=f.useRef(!1),c=f.useRef(0);return f.useEffect(()=>{const d=c.current;return()=>window.clearTimeout(d)},[]),i.jsx(ER,{scope:t,isOpenDelayedRef:s,delayDuration:a,onOpen:f.useCallback(()=>{window.clearTimeout(c.current),s.current=!1},[]),onClose:f.useCallback(()=>{window.clearTimeout(c.current),c.current=window.setTimeout(()=>s.current=!0,n)},[n]),isPointerInTransitRef:l,onPointerInTransitChange:f.useCallback(d=>{l.current=d},[]),disableHoverableContent:r,children:o})};VC.displayName=BC;var bl="Tooltip",[zR,Jl]=zu(bl),WC=e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:o,disableHoverableContent:s,delayDuration:l}=e,c=Fg(bl,e.__scopeTooltip),d=Ru(t),[u,h]=f.useState(null),m=_t(),p=f.useRef(0),b=s??c.disableHoverableContent,g=l??c.delayDuration,v=f.useRef(!1),[w,y]=Vt({prop:n,defaultProp:r??!1,onChange:A=>{A?(c.onOpen(),document.dispatchEvent(new CustomEvent(Im))):c.onClose(),o==null||o(A)},caller:bl}),x=f.useMemo(()=>w?v.current?"delayed-open":"instant-open":"closed",[w]),k=f.useCallback(()=>{window.clearTimeout(p.current),p.current=0,v.current=!1,y(!0)},[y]),C=f.useCallback(()=>{window.clearTimeout(p.current),p.current=0,y(!1)},[y]),S=f.useCallback(()=>{window.clearTimeout(p.current),p.current=window.setTimeout(()=>{v.current=!0,y(!0),p.current=0},g)},[g,y]);return f.useEffect(()=>()=>{p.current&&(window.clearTimeout(p.current),p.current=0)},[]),i.jsx(Mg,{...d,children:i.jsx(zR,{scope:t,contentId:m,open:w,stateAttribute:x,trigger:u,onTriggerChange:h,onTriggerEnter:f.useCallback(()=>{c.isOpenDelayedRef.current?S():k()},[c.isOpenDelayedRef,S,k]),onTriggerLeave:f.useCallback(()=>{b?C():(window.clearTimeout(p.current),p.current=0)},[C,b]),onOpen:k,onClose:C,disableHoverableContent:b,children:a})})};WC.displayName=bl;var jm="TooltipTrigger",$C=f.forwardRef((e,t)=>{const{__scopeTooltip:a,...n}=e,r=Jl(jm,a),o=Fg(jm,a),s=Ru(a),l=f.useRef(null),c=ye(t,l,r.onTriggerChange),d=f.useRef(!1),u=f.useRef(!1),h=f.useCallback(()=>d.current=!1,[]);return f.useEffect(()=>()=>document.removeEventListener("pointerup",h),[h]),i.jsx(Lg,{asChild:!0,...s,children:i.jsx(ee.button,{"aria-describedby":r.open?r.contentId:void 0,"data-state":r.stateAttribute,...n,ref:c,onPointerMove:q(e.onPointerMove,m=>{m.pointerType!=="touch"&&!u.current&&!o.isPointerInTransitRef.current&&(r.onTriggerEnter(),u.current=!0)}),onPointerLeave:q(e.onPointerLeave,()=>{r.onTriggerLeave(),u.current=!1}),onPointerDown:q(e.onPointerDown,()=>{r.open&&r.onClose(),d.current=!0,document.addEventListener("pointerup",h,{once:!0})}),onFocus:q(e.onFocus,()=>{d.current||r.onOpen()}),onBlur:q(e.onBlur,r.onClose),onClick:q(e.onClick,r.onClose)})})});$C.displayName=jm;var Hg="TooltipPortal",[RR,DR]=zu(Hg,{forceMount:void 0}),KC=e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,o=Jl(Hg,t);return i.jsx(RR,{scope:t,forceMount:a,children:i.jsx(ft,{present:a||o.open,children:i.jsx(Zi,{asChild:!0,container:r,children:n})})})};KC.displayName=Hg;var Fi="TooltipContent",YC=f.forwardRef((e,t)=>
vendor: 4,680 bytes, line 407
407{const a=DR(Fi,e.__scopeTooltip),{forceMount:n=a.forceMount,side:r="top",...o}=e,s=Jl(Fi,e.__scopeTooltip);return i.jsx(ft,{present:n||s.open,children:s.disableHoverableContent?i.jsx(JC,{side:r,...o,ref:t}):i.jsx(_R,{side:r,...o,ref:t})})}),_R=f.forwardRef((e,t)=>{const a=Jl(Fi,e.__scopeTooltip),n=Fg(Fi,e.__scopeTooltip),r=f.useRef(null),o=ye(t,r),[s,l]=f.useState(null),{trigger:c,onClose:d}=a,u=r.current,{onPointerInTransitChange:h}=n,m=f.useCallback(()=>{l(null),h(!1)},[h]),p=f.useCallback((b,g)=>{const v=b.currentTarget,w={x:b.clientX,y:b.clientY},y=OR(w,v.getBoundingClientRect()),x=GR(w,y),k=FR(g.getBoundingClientRect()),C=BR([...x,...k]);l(C),h(!0)},[h]);return f.useEffect(()=>()=>m(),[m]),f.useEffect(()=>{if(c&&u){const b=v=>p(v,u),g=v=>p(v,c);return c.addEventListener("pointerleave",b),u.addEventListener("pointerleave",g),()=>{c.removeEventListener("pointerleave",b),u.removeEventListener("pointerleave",g)}}},[c,u,p,m]),f.useEffect(()=>{if(s){const b=g=>{const v=g.target,w={x:g.clientX,y:g.clientY},y=(c==null?void 0:c.contains(v))||(u==null?void 0:u.contains(v)),x=!HR(w,s);y?m():x&&(m(),d())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[c,u,s,d,m]),i.jsx(JC,{...e,ref:o})}),[qR,UR]=zu(bl,{isInside:!1}),MR=Dj("TooltipContent"),JC=f.forwardRef((e,t)=>{const{__scopeTooltip:a,children:n,"aria-label":r,onEscapeKeyDown:o,onPointerDownOutside:s,...l}=e,c=Jl(Fi,a),d=Ru(a),{onClose:u}=c;return f.useEffect(()=>(document.addEventListener(Im,u),()=>document.removeEventListener(Im,u)),[u]),f.useEffect(()=>{if(c.trigger){const h=m=>{const p=m.target;p!=null&&p.contains(c.trigger)&&u()};return window.addEventListener("scroll",h,{capture:!0}),()=>window.removeEventListener("scroll",h,{capture:!0})}},[c.trigger,u]),i.jsx(zo,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:h=>h.preventDefault(),onDismiss:u,children:i.jsxs(Og,{"data-state":c.stateAttribute,...d,...l,ref:t,style:{...l.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[i.jsx(MR,{children:n}),i.jsx(qR,{scope:a,isInside:!0,children:i.jsx(q0,{id:c.contentId,role:"tooltip",children:r||n})})]})})});YC.displayName=Fi;var QC="TooltipArrow",LR=f.forwardRef((e,t)=>{const{__scopeTooltip:a,...n}=e,r=Ru(a);return UR(QC,a).isInside?null:i.jsx(Gg,{...r,...n,ref:t})});LR.displayName=QC;function OR(e,t){const a=Math.abs(t.top-e.y),n=Math.abs(t.bottom-e.y),r=Math.abs(t.right-e.x),o=Math.abs(t.left-e.x);switch(Math.min(a,n,r,o)){case o:return"left";case r:return"right";case a:return"top";case n:return"bottom";default:throw new Error("unreachable")}}function GR(e,t,a=5){const n=[];switch(t){case"top":n.push({x:e.x-a,y:e.y+a},{x:e.x+a,y:e.y+a});break;case"bottom":n.push({x:e.x-a,y:e.y-a},{x:e.x+a,y:e.y-a});break;case"left":n.push({x:e.x+a,y:e.y-a},{x:e.x+a,y:e.y+a});break;case"right":n.push({x:e.x-a,y:e.y-a},{x:e.x-a,y:e.y+a});break}return n}function FR(e){const{top:t,right:a,bottom:n,left:r}=e;return[{x:r,y:t},{x:a,y:t},{x:a,y:n},{x:r,y:n}]}function HR(e,t){const{x:a,y:n}=e;let r=!1;for(let o=0,s=t.length-1;o<t.length;s=o++){const l=t[o],c=t[s],d=l.x,u=l.y,h=c.x,m=c.y;u>n!=m>n&&a<(h-d)*(n-u)/(m-u)+d&&(r=!r)}return r}function BR(e){const t=e.slice();return t.sort((a,n)=>a.x<n.x?-1:a.x>n.x?1:a.y<n.y?-1:a.y>n.y?1:0),VR(t)}function VR(e){if(e.length<=1)return e.slice();const t=[];for(let n=0;n<e.length;n++){const r=e[n];for(;t.length>=2;){const o=t[t.length-1],s=t[t.length-2];if((o.x-s.x)*(r.y-s.y)>=(o.y-s.y)*(r.x-s.x))t.pop();else break}t.push(r)}t.pop();const a=[];for(let n=e.length-1;n>=0;n--){const r=e[n];for(;a.length>=2;){const o=a[a.length-1],s=a[a.length-2];if((o.x-s.x)*(r.y-s.y)>=(o.y-s.y)*(r.x-s.x))a.pop();else break}a.push(r)}return a.pop(),t.length===1&&a.length===1&&t[0].x===a[0].x&&t[0].y===a[0].y?t:t.concat(a)}var WR=VC,$R=WC,KR=$C,YR=KC,ZC=YC;const XC=WR,eS=$R,tS=KR,Bg=f.forwardRef(({className:e,sideOffset:t=4,...a},n)=>i.jsx(YR,{children:i.jsx(ZC,{ref:n,sideOffset:t,className:J("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
407de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...a})}));Bg.displayName=ZC.displayName;var Du=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},_u=typeof window>"u"||"Deno"in globalThis;function Ra(){}function JR(e,t){return typeof e=="function"?e(t):e}function QR(e){return typeof e=="number"&&e>=0&&e!==1/0}function ZR(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Nm(e,t){return typeof e=="function"?e(t):e}function XR(e,t){return typeof e=="function"?e(t):e}function Ab(e,t){const{type:a="all",exact:n,fetchStatus:r,predicate:o,queryKey:s,stale:l}=e;if(s){if(n){if(t.queryHash!==Vg(s,t.options))return!1}else if(!xl(t.queryKey,s))return!1}if(a!=="all"){const c=t.isActive();if(a==="active"&&!c||a==="inactive"&&c)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||r&&r!==t.state.fetchStatus||o&&!o(t))}function Pb(e,t){const{exact:a,status:n,predicate:r,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(a){if(wl(t.options.mutationKey)!==wl(o))return!1}else if(!xl(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||r&&!r(t))}function Vg(e,t){return((t==null?void 0:t.queryKeyHashFn)||wl)(e)}function wl(e){return JSON.stringify(e,(t,a)=>Em(a)?Object.keys(a).sort().reduce((n,r)=>(n[r]=a[r],n),{}):a)}function xl(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(a=>xl(e[a],t[a])):!1}function aS(e,t){if(e===t)return e;const a=Tb(e)&&Tb(t);if(a||Em(e)&&Em(t)){const n=a?e:Object.keys(e),r=n.length,o=a?t:Object.keys(t),s=o.length,l=a?[]:{},c=new Set(n);let d=0;for(let u=0;u<s;u++){const h=a?u:o[u];(!a&&c.has(h)||a)&&e[h]===void 0&&t[h]===void 0?(l[h]=void 0,d++):(l[h]=aS(e[h],t[h]),l[h]===e[h]&&e[h]!==void 0&&d++)}return r===s&&d===r?e:l}return t}function Tb(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function Em(e){if(!Ib(e))return!1;const t=e.constructor;if(t===void 0)return!0;const a=t.prototype;return!(!Ib(a)||!a.hasOwnProperty("isPrototypeOf")||Object.getPrototypeOf(e)!==Object.prototype)}function Ib(e){return Object.prototype.toString.call(e)==="[object Object]"}function eD(e){return new Promise(t=>{setTimeout(t,e)})}function tD(e,t,a){return typeof a.structuralSharing=="function"?a.structuralSharing(e,t):a.structuralSharing!==!1?aS(e,t):t}function aD(e,t,a=0){const n=[...e,t];return a&&n.length>a?n.slice(1):n}function nD(e,t,a=0){const n=[t,...e];return a&&n.length>a?n.slice(0,-1):n}var Wg=Symbol();function nS(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===Wg?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}var to,er,Pi,lx,rD=(lx=class extends Du{constructor(){super();je(this,to);je(this,er);je(this,Pi);fe(this,Pi,t=>{if(!_u&&window.addEventListener){const a=()=>t();return window.addEventListener("visibilitychange",a,!1),()=>{window.removeEventListener("visibilitychange",a)}}})}onSubscribe(){R(this,er)||this.setEventListener(R(this,Pi))}onUnsubscribe(){var t;this.hasListeners()||((t=R(this,er))==null||t.call(this),fe(this,er,void 0))}setEventListener(t){var a;fe(this,Pi,t),(a=R(this,er))==null||a.call(this),fe(this,er,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){R(this,to)!==t&&(fe(this,to,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(a=>{a(t)})}isFocused(){var t;return typeof R(this,to)=="boolean"?R(this,to):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},to=new WeakMap,er=new WeakMap,Pi=new WeakMap,lx),rS=new rD,Ti,tr,Ii,cx,oD=(cx=class extends Du{constructor(){super();je(this,Ti,!0);je(this,tr);je(this,Ii);fe(this,Ii,t=>{if(!_u&&window.addEventListener){const a=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",a,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",a),window.removeEventListener("offline",n
vendor: 4,353 bytes, line 407
407)}}})}onSubscribe(){R(this,tr)||this.setEventListener(R(this,Ii))}onUnsubscribe(){var t;this.hasListeners()||((t=R(this,tr))==null||t.call(this),fe(this,tr,void 0))}setEventListener(t){var a;fe(this,Ii,t),(a=R(this,tr))==null||a.call(this),fe(this,tr,t(this.setOnline.bind(this)))}setOnline(t){R(this,Ti)!==t&&(fe(this,Ti,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return R(this,Ti)}},Ti=new WeakMap,tr=new WeakMap,Ii=new WeakMap,cx),Ld=new oD;function iD(){let e,t;const a=new Promise((r,o)=>{e=r,t=o});a.status="pending",a.catch(()=>{});function n(r){Object.assign(a,r),delete a.resolve,delete a.reject}return a.resolve=r=>{n({status:"fulfilled",value:r}),e(r)},a.reject=r=>{n({status:"rejected",reason:r}),t(r)},a}function sD(e){return Math.min(1e3*2**e,3e4)}function oS(e){return(e??"online")==="online"?Ld.isOnline():!0}var iS=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Vh(e){return e instanceof iS}function sS(e){let t=!1,a=0,n=!1,r;const o=iD(),s=g=>{var v;n||(m(new iS(g)),(v=e.abort)==null||v.call(e))},l=()=>{t=!0},c=()=>{t=!1},d=()=>rS.isFocused()&&(e.networkMode==="always"||Ld.isOnline())&&e.canRun(),u=()=>oS(e.networkMode)&&e.canRun(),h=g=>{var v;n||(n=!0,(v=e.onSuccess)==null||v.call(e,g),r==null||r(),o.resolve(g))},m=g=>{var v;n||(n=!0,(v=e.onError)==null||v.call(e,g),r==null||r(),o.reject(g))},p=()=>new Promise(g=>{var v;r=w=>{(n||d())&&g(w)},(v=e.onPause)==null||v.call(e)}).then(()=>{var g;r=void 0,n||(g=e.onContinue)==null||g.call(e)}),b=()=>{if(n)return;let g;const v=a===0?e.initialPromise:void 0;try{g=v??e.fn()}catch(w){g=Promise.reject(w)}Promise.resolve(g).then(h).catch(w=>{var S;if(n)return;const y=e.retry??(_u?0:3),x=e.retryDelay??sD,k=typeof x=="function"?x(a,w):x,C=y===!0||typeof y=="number"&&a<y||typeof y=="function"&&y(a,w);if(t||!C){m(w);return}a++,(S=e.onFail)==null||S.call(e,a,w),eD(k).then(()=>d()?void 0:p()).then(()=>{t?m(w):b()})})};return{promise:o,cancel:s,continue:()=>(r==null||r(),o),cancelRetry:l,continueRetry:c,canStart:u,start:()=>(u()?b():p().then(b),o)}}var lD=e=>setTimeout(e,0);function cD(){let e=[],t=0,a=l=>{l()},n=l=>{l()},r=lD;const o=l=>{t?e.push(l):r(()=>{a(l)})},s=()=>{const l=e;e=[],l.length&&r(()=>{n(()=>{l.forEach(c=>{a(c)})})})};return{batch:l=>{let c;t++;try{c=l()}finally{t--,t||s()}return c},batchCalls:l=>(...c)=>{o(()=>{l(...c)})},schedule:o,setNotifyFunction:l=>{a=l},setBatchNotifyFunction:l=>{n=l},setScheduler:l=>{r=l}}}var Rt=cD(),ao,dx,lS=(dx=class{constructor(){je(this,ao)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),QR(this.gcTime)&&fe(this,ao,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(_u?1/0:5*60*1e3))}clearGcTimeout(){R(this,ao)&&(clearTimeout(R(this,ao)),fe(this,ao,void 0))}},ao=new WeakMap,dx),ji,no,da,ro,It,Ll,oo,_a,fn,ux,dD=(ux=class extends lS{constructor(t){super();je(this,_a);je(this,ji);je(this,no);je(this,da);je(this,ro);je(this,It);je(this,Ll);je(this,oo);fe(this,oo,!1),fe(this,Ll,t.defaultOptions),this.setOptions(t.options),this.observers=[],fe(this,ro,t.client),fe(this,da,R(this,ro).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,fe(this,ji,hD(this.options)),this.state=t.state??R(this,ji),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var t;return(t=R(this,It))==null?void 0:t.promise}setOptions(t){this.options={...R(this,Ll),...t},this.updateGcTime(this.options.gcTime)}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&R(this,da).remove(this)}setData(t,a){const n=tD(this.state.data,t,this.options);return At(this,_a,fn).call(this,{data:n,type:"success",dataUpdatedAt:a==null?void 0:a.updatedAt,manual:a==null?void 0:a.manual}),n}setState(t,a){At(this,_a,fn).call(this,{type:"setState",state:t,setStateOptions:a})}cancel(t){var n,r;const a=(n=R(this,It))==null?void 0:n.promise;return(r=R(this,It))==null||r.cancel(t),a?a.then(Ra).catch(Ra):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(R(this,ji))}isActive(){return this.observers.some(t=>XR(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Wg||this.state.dataUpdateCount+this.state.errorUpdate
407Count===0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Nm(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!ZR(this.state.dataUpdatedAt,t)}onFocus(){var a;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(a=R(this,It))==null||a.continue()}onOnline(){var a;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(a=R(this,It))==null||a.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),R(this,da).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(a=>a!==t),this.observers.length||(R(this,It)&&(R(this,oo)?R(this,It).cancel({revert:!0}):R(this,It).cancelRetry()),this.scheduleGc()),R(this,da).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||At(this,_a,fn).call(this,{type:"invalidate"})}fetch(t,a){var d,u,h;if(this.state.fetchStatus!=="idle"){if(this.state.data!==void 0&&(a!=null&&a.cancelRefetch))this.cancel({silent:!0});else if(R(this,It))return R(this,It).continueRetry(),R(this,It).promise}if(t&&this.setOptions(t),!this.options.queryFn){const m=this.observers.find(p=>p.options.queryFn);m&&this.setOptions(m.options)}const n=new AbortController,r=m=>{Object.defineProperty(m,"signal",{enumerable:!0,get:()=>(fe(this,oo,!0),n.signal)})},o=()=>{const m=nS(this.options,a),b=(()=>{const g={client:R(this,ro),queryKey:this.queryKey,meta:this.meta};return r(g),g})();return fe(this,oo,!1),this.options.persister?this.options.persister(m,b,this):m(b)},l=(()=>{const m={fetchOptions:a,options:this.options,queryKey:this.queryKey,client:R(this,ro),state:this.state,fetchFn:o};return r(m),m})();(d=this.options.behavior)==null||d.onFetch(l,this),fe(this,no,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((u=l.fetchOptions)==null?void 0:u.meta))&&At(this,_a,fn).call(this,{type:"fetch",meta:(h=l.fetchOptions)==null?void 0:h.meta});const c=m=>{var p,b,g,v;Vh(m)&&m.silent||At(this,_a,fn).call(this,{type:"error",error:m}),Vh(m)||((b=(p=R(this,da).config).onError)==null||b.call(p,m,this),(v=(g=R(this,da).config).onSettled)==null||v.call(g,this.state.data,m,this)),this.scheduleGc()};return fe(this,It,sS({initialPromise:a==null?void 0:a.initialPromise,fn:l.fetchFn,abort:n.abort.bind(n),onSuccess:m=>{var p,b,g,v;if(m===void 0){c(new Error(`${this.queryHash} data is undefined`));return}try{this.setData(m)}catch(w){c(w);return}(b=(p=R(this,da).config).onSuccess)==null||b.call(p,m,this),(v=(g=R(this,da).config).onSettled)==null||v.call(g,m,this.state.error,this),this.scheduleGc()},onError:c,onFail:(m,p)=>{At(this,_a,fn).call(this,{type:"failed",failureCount:m,error:p})},onPause:()=>{At(this,_a,fn).call(this,{type:"pause"})},onContinue:()=>{At(this,_a,fn).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0})),R(this,It).start()}},ji=new WeakMap,no=new WeakMap,da=new WeakMap,ro=new WeakMap,It=new WeakMap,Ll=new WeakMap,oo=new WeakMap,_a=new WeakSet,fn=function(t){const a=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...uD(n.data,this.options),fetchMeta:t.meta??null};case"success":return fe(this,no,void 0),{...n,data:t.data,dataUpdateCount:n.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const r=t.error;return Vh(r)&&r.revert&&R(this,no)?{...R(this,no),fetchStatus:"idle"}
vendor: 10,615 bytes, line 407
407:{...n,error:r,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:"idle",status:"error"};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=a(this.state),Rt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),R(this,da).notify({query:this,type:"updated",action:t})})},ux);function uD(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:oS(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function hD(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,a=t!==void 0,n=a?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:a?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:a?"success":"pending",fetchStatus:"idle"}}var Za,hx,pD=(hx=class extends Du{constructor(t={}){super();je(this,Za);this.config=t,fe(this,Za,new Map)}build(t,a,n){const r=a.queryKey,o=a.queryHash??Vg(r,a);let s=this.get(o);return s||(s=new dD({client:t,queryKey:r,queryHash:o,options:t.defaultQueryOptions(a),state:n,defaultOptions:t.getQueryDefaults(r)}),this.add(s)),s}add(t){R(this,Za).has(t.queryHash)||(R(this,Za).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const a=R(this,Za).get(t.queryHash);a&&(t.destroy(),a===t&&R(this,Za).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){Rt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return R(this,Za).get(t)}getAll(){return[...R(this,Za).values()]}find(t){const a={exact:!0,...t};return this.getAll().find(n=>Ab(a,n))}findAll(t={}){const a=this.getAll();return Object.keys(t).length>0?a.filter(n=>Ab(t,n)):a}notify(t){Rt.batch(()=>{this.listeners.forEach(a=>{a(t)})})}onFocus(){Rt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){Rt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Za=new WeakMap,hx),Xa,Et,io,en,Vn,px,mD=(px=class extends lS{constructor(t){super();je(this,en);je(this,Xa);je(this,Et);je(this,io);this.mutationId=t.mutationId,fe(this,Et,t.mutationCache),fe(this,Xa,[]),this.state=t.state||fD(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){R(this,Xa).includes(t)||(R(this,Xa).push(t),this.clearGcTimeout(),R(this,Et).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){fe(this,Xa,R(this,Xa).filter(a=>a!==t)),this.scheduleGc(),R(this,Et).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){R(this,Xa).length||(this.state.status==="pending"?this.scheduleGc():R(this,Et).remove(this))}continue(){var t;return((t=R(this,io))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var o,s,l,c,d,u,h,m,p,b,g,v,w,y,x,k,C,S,A,P;const a=()=>{At(this,en,Vn).call(this,{type:"continue"})};fe(this,io,sS({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(I,N)=>{At(this,en,Vn).call(this,{type:"failed",failureCount:I,error:N})},onPause:()=>{At(this,en,Vn).call(this,{type:"pause"})},onContinue:a,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>R(this,Et).canRun(this)}));const n=this.state.status==="pending",r=!R(this,io).canStart();try{if(n)a();else{At(this,en,Vn).call(this,{type:"pending",variables:t,isPaused:r}),await((s=(o=R(this,Et).config).onMutate)==null?void 0:s.call(o,t,this));const N=await((c=(l=this.options).onMutate)==null?void 0:c.call(l,t));N!==this.state.context&&At(this,en,Vn).call(this,{type:"pending",context:N,variables:t,isPaused:r})}const I=await R(this,io).start();return await((u=(d=R(this,Et).config).onSuccess)==null?void 0:u.call(d,I,t,this.state.context,this)),await((m=(h=this.options).onSuccess)==null?void 0:m.call(h,I,t,this.state.context)),await((b=(p=R(this,Et).config).onSettled)==null?void 0:b.call(p,I,null,this.state.variables,this.state.context,this)),await((v=(g=this.options).onSettled)==null?void 0:v.call(g,I,null,t,this.state.context)),At(this,en,Vn).call(this,{type:"success",data:I}),I}catch(I){try{throw await((y=(w=R(this,Et).config).onError)==null?void 0:y.call(w,I,t,this.state.context,this)),await((k=(x=this.options).onError)==null?void 0:k.call(x,I,t,this.state.context)),await((S=(C=R(this,Et).config).onSettled)==null?void 0:S.call(C,void 0,I,this.state.variables,this.state.context,this)),await((P=(A=this.options).onSettled)==null?void 0:P.call(A,void 0,I,t,this.state.context)),I}finally{At(this,en,Vn).call(this,{type:"error",error:I})}}finally{R(this,Et).runNext(this)}}},Xa=new WeakMap,Et=new WeakMap,io=new WeakMap,en=new WeakSet,Vn=function(t){const a=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=a(this.state),Rt.batch(()=>{R(this,Xa).forEach(n=>{n.onMutationUpdate(t)}),R(this,Et).notify({mutation:this,type:"updated",action:t})})},px);function fD(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var bn,qa,Ol,mx,gD=(mx=class extends Du{constructor(t={}){super();je(this,bn);je(this,qa);je(this,Ol);this.config=t,fe(this,bn,new Set),fe(this,qa,new Map),fe(this,Ol,0)}build(t,a,n){const r=new mD({mutationCache:this,mutationId:++nc(this,Ol)._,options:t.defaultMutationOptions(a),state:n});return this.add(r),r}add(t){R(this,bn).add(t);const a=Ac(t);if(typeof a=="string"){const n=R(this,qa).get(a);n?n.push(t):R(this,qa).set(a,[t])}this.notify({type:"added",mutation:t})}remove(t){if(R(this,bn).delete(t)){const a=Ac(t);if(typeof a=="string"){const n=R(this,qa).get(a);if(n)if(n.length>1){const r=n.indexOf(t);r!==-1&&n.splice(r,1)}else n[0]===t&&R(this,qa).delete(a)}}this.notify({type:"removed",mutation:t})}canRun(t){const a=Ac(t);if(typeof a=="string"){const n=R(this,qa).get(a),r=n==null?void 0:n.find(o=>o.state.status==="pending");return!r||r===t}else return!0}runNext(t){var n;const a=Ac(t);if(typeof a=="string"){const r=(n=R(this,qa).get(a))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(r==null?void 0:r.continue())??Promise.resolve()}else return Promise.resolve()}clear(){Rt.batch(()=>{R(this,bn).forEach(t=>{this.notify({type:"removed",mutation:t})}),R(this,bn).clear(),R(this,qa).clear()})}getAll(){return Array.from(R(this,bn))}find(t){const a={exact:!0,...t};return this.getAll().find(n=>Pb(a,n))}findAll(t={}){return this.getAll().filter(a=>Pb(t,a))}notify(t){Rt.batch(()=>{this.listeners.forEach(a=>{a(t)})})}resumePausedMutations(){const t=this.getAll().filter(a=>a.state.isPaused);return Rt.batch(()=>Promise.all(t.map(a=>a.continue().catch(Ra))))}},bn=new WeakMap,qa=new WeakMap,Ol=new WeakMap,mx);function Ac(e){var t;return(t=e.options.scope)==null?void 0:t.id}function jb(e){return{onFetch:(t,a)=>{var u,h,m,p,b;const n=t.options,r=(m=(h=(u=t.fetchOptions)==null?void 0:u.meta)==null?void 0:h.fetchMore)==null?void 0:m.direction,o=((p=t.state.data)==null?void 0:p.pages)||[],s=((b=t.state.data)==null?void 0:b.pageParams)||[];let l={pages:[],pageParams:[]},c=0;const d=async()=>{let g=!1;const v=x=>{Object.defineProperty(x,"signal",{enumerable:!0,get:()=>(t.signal.aborted?g=!0:t.signal.addEventListener("abort",()=>{g=!0}),t.signal)})},w=nS(t.options,t.fetchOptions),y=async(x,k,C)=>{if(g)return Promise.reject();if(k==null&&x.pages.length)return Promise.resolve(x);const A=(()=>{const V={client:t.client,queryKey:t.queryKey,pageParam:k,direction:C?"backward":"forward",meta:t.options.meta};return v(V),V})(),P=await w(A),{maxPages:I}=t.options,N=C?nD:aD;return{pages:N(x.pages,P,I),pageParams:N(x.pageParams,k,I)}};if(r&&o.length){const x=r==="backward",k=x?yD:Nb,C={pages:o,pageParams:s},S=k(n,C);l=await y(C,S,x)}else{const x=e??o.length;do{const k=c===0?s[0]??n.initialPageParam:Nb(n,l);if(c>0&&k==null)break;l=await y(l,k),c++}while(c<x)}return l};t.options.persister?t.fetchFn=()=>{var g,v;return(v=(g=t.options).persister)==null?void 0:v.call(g,d,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},a)}:t.fetchFn=d}}}function Nb(e,{pages:t,pageParams:a}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,a[n],a):void 0}function yD(e,{pages:t,pageParams:a}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,a[0],a):void 0}var Ke,ar,nr,Ni,Ei,rr,zi,Ri,fx,vD=(fx=class{constructor(e={}){je(this,Ke);je(this,ar);je(this,nr);je(this,Ni);je(this,Ei);je(this,rr);je(this,zi);je(this,Ri);fe(this,Ke,e.queryCache||new pD),fe(this,ar,e.mutationCache||new gD),fe(this,nr,e.defaultOptions||{}),fe(this,Ni,new Map),fe(this,Ei,new Map),fe(this,rr,0)}mount(){nc(this,rr)._++,R(this,rr)===1&&(fe(this,zi,rS.subscribe(async e=>{e&&(await this.resumePausedMutations(),R(this,Ke).onFocus())})),fe(this,Ri,Ld.subscribe(async e=>{e&&(await this.resumePausedMutations(),R(this,Ke).onOnline())})))}unmount(){var e,t;nc(this,rr)._--,R(this,rr)===0&&((e=R(this,zi))==null||e.call(this),fe(this,zi,void 0),(t=R(this,Ri))==null||t.call(this),fe(this,Ri,void 0))}isFetching(e){return R(this,Ke).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return R(this,ar).findAll({...e,status:"pending"}).length}getQueryData(e){var a;const t=this.defaultQueryOptions({queryKey:e});return(a=R(this,Ke).get(t.queryHash))==null?void 0:a.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),a=R(this,Ke).build(this,t),n=a.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&a.isStaleByTime(Nm(t.staleTime,a))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return R(this,Ke).findAll(e).map(({queryKey:t,state:a})=>{const n=a.data;return[t,n]})}setQueryData(e,t,a){const n=this.defaultQueryOptions({queryKey:e}),r=R(this,Ke).get(n.queryHash),o=r==null?void 0:r.state.data,s=JR(t,o);if(s!==void 0)return R(this,Ke).build(this,n).setData(s,{...a,manual:!0})}
407setQueriesData(e,t,a){return Rt.batch(()=>R(this,Ke).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,a)]))}getQueryState(e){var a;const t=this.defaultQueryOptions({queryKey:e});return(a=R(this,Ke).get(t.queryHash))==null?void 0:a.state}removeQueries(e){const t=R(this,Ke);Rt.batch(()=>{t.findAll(e).forEach(a=>{t.remove(a)})})}resetQueries(e,t){const a=R(this,Ke);return Rt.batch(()=>(a.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const a={revert:!0,...t},n=Rt.batch(()=>R(this,Ke).findAll(e).map(r=>r.cancel(a)));return Promise.all(n).then(Ra).catch(Ra)}invalidateQueries(e,t={}){return Rt.batch(()=>(R(this,Ke).findAll(e).forEach(a=>{a.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const a={...t,cancelRefetch:t.cancelRefetch??!0},n=Rt.batch(()=>R(this,Ke).findAll(e).filter(r=>!r.isDisabled()&&!r.isStatic()).map(r=>{let o=r.fetch(void 0,a);return a.throwOnError||(o=o.catch(Ra)),r.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(Ra)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const a=R(this,Ke).build(this,t);return a.isStaleByTime(Nm(t.staleTime,a))?a.fetch(t):Promise.resolve(a.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Ra).catch(Ra)}fetchInfiniteQuery(e){return e.behavior=jb(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Ra).catch(Ra)}ensureInfiniteQueryData(e){return e.behavior=jb(e.pages),this.ensureQueryData(e)}resumePausedMutations(){return Ld.isOnline()?R(this,ar).resumePausedMutations():Promise.resolve()}getQueryCache(){return R(this,Ke)}getMutationCache(){return R(this,ar)}getDefaultOptions(){return R(this,nr)}setDefaultOptions(e){fe(this,nr,e)}setQueryDefaults(e,t){R(this,Ni).set(wl(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...R(this,Ni).values()],a={};return t.forEach(n=>{xl(e,n.queryKey)&&Object.assign(a,n.defaultOptions)}),a}setMutationDefaults(e,t){R(this,Ei).set(wl(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...R(this,Ei).values()],a={};return t.forEach(n=>{xl(e,n.mutationKey)&&Object.assign(a,n.defaultOptions)}),a}defaultQueryOptions(e){if(e._defaulted)return e;const t={...R(this,nr).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=Vg(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===Wg&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...R(this,nr).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){R(this,Ke).clear(),R(this,ar).clear()}},Ke=new WeakMap,ar=new WeakMap,nr=new WeakMap,Ni=new WeakMap,Ei=new WeakMap,rr=new WeakMap,zi=new WeakMap,Ri=new WeakMap,fx),bD=f.createContext(void 0),wD=({client:e,children:t})=>(f.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),i.jsx(bD.Provider,{value:e,children:t}));/** 408 * @remix-run/router v1.23.0 409 * 410 * Copyright (c) Remix Software Inc. 411 * 412 * This source code is licensed under the MIT license found in the 413 * LICENSE.md file in the root directory of this source tree. 414 * 415 * @license MIT 416 */function kl(){return kl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},kl.apply(this,arguments)}var sr;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(sr||(sr={}));const Eb="popstate";function xD(e){e===void 0&&(e={});function t(n,r){let{pathname:o,search:s,hash:l}=n.location;return zm("",{pathname:o,search:s,hash:l},r.state&&r.state.usr||null,r.state&&r.state.key||"default")}function a(n,r){return typeof r=="string"?r:Od(r)}return CD(t,a,null,e)}function nt(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function cS(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function kD(){return Math.random().toString(36).substr(2,8)}function zb(e,t){return{usr:e.state,key:e.key,idx:t}}function zm(e,t,a,n){return a===void 0&&(a=null),kl({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?os(t):t,{state:a,key:t&&t.key||n||kD()})}function Od(e){let{pathname:t="/",search:a="",hash:n=""}=e;return a&&a!=="?"&&(t+=a.charAt(0)==="?"?a:"?"+a),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function os(e){let t={};if(e){let a=e.indexOf("#");a>=0&&(t.hash=e.substr(a),e=e.substr(0,a));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function CD(e,t,a,n){n===void 0&&(n={});let{window:r=document.defaultView,v5Compat:o=!1}=n,s=r.history,l=sr.Pop,c=null,d=u();d==null&&(d=0,s.replaceState(kl({},s.state,{idx:d}),""));function u(){return(s.state||{idx:null}).idx}function h(){l=sr.Pop;
vendor: 3,517 bytes, line 416
416let v=u(),w=v==null?null:v-d;d=v,c&&c({action:l,location:g.location,delta:w})}function m(v,w){l=sr.Push;let y=zm(g.location,v,w);d=u()+1;let x=zb(y,d),k=g.createHref(y);try{s.pushState(x,"",k)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;r.location.assign(k)}o&&c&&c({action:l,location:g.location,delta:1})}function p(v,w){l=sr.Replace;let y=zm(g.location,v,w);d=u();let x=zb(y,d),k=g.createHref(y);s.replaceState(x,"",k),o&&c&&c({action:l,location:g.location,delta:0})}function b(v){let w=r.location.origin!=="null"?r.location.origin:r.location.href,y=typeof v=="string"?v:Od(v);return y=y.replace(/ $/,"%20"),nt(w,"No window.location.(origin|href) available to create URL for href: "+y),new URL(y,w)}let g={get action(){return l},get location(){return e(r,s)},listen(v){if(c)throw new Error("A history only accepts one active listener");return r.addEventListener(Eb,h),c=v,()=>{r.removeEventListener(Eb,h),c=null}},createHref(v){return t(r,v)},createURL:b,encodeLocation(v){let w=b(v);return{pathname:w.pathname,search:w.search,hash:w.hash}},push:m,replace:p,go(v){return s.go(v)}};return g}var Rb;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Rb||(Rb={}));function SD(e,t,a){return a===void 0&&(a="/"),AD(e,t,a,!1)}function AD(e,t,a,n){let r=typeof t=="string"?os(t):t,o=$g(r.pathname||"/",a);if(o==null)return null;let s=dS(e);PD(s);let l=null;for(let c=0;l==null&&c<s.length;++c){let d=UD(o);l=_D(s[c],d,n)}return l}function dS(e,t,a,n){t===void 0&&(t=[]),a===void 0&&(a=[]),n===void 0&&(n="");let r=(o,s,l)=>{let c={relativePath:l===void 0?o.path||"":l,caseSensitive:o.caseSensitive===!0,childrenIndex:s,route:o};c.relativePath.startsWith("/")&&(nt(c.relativePath.startsWith(n),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(n.length));let d=yr([n,c.relativePath]),u=a.concat(c);o.children&&o.children.length>0&&(nt(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),dS(o.children,t,u,d)),!(o.path==null&&!o.index)&&t.push({path:d,score:RD(d,o.index),routesMeta:u})};return e.forEach((o,s)=>{var l;if(o.path===""||!((l=o.path)!=null&&l.includes("?")))r(o,s);else for(let c of uS(o.path))r(o,s,c)}),t}function uS(e){let t=e.split("/");if(t.length===0)return[];let[a,...n]=t,r=a.endsWith("?"),o=a.replace(/\?$/,"");if(n.length===0)return r?[o,""]:[o];let s=uS(n.join("/")),l=[];return l.push(...s.map(c=>c===""?o:[o,c].join("/"))),r&&l.push(...s),l.map(c=>e.startsWith("/")&&c===""?"/":c)}function PD(e){e.sort((t,a)=>t.score!==a.score?a.score-t.score:DD(t.routesMeta.map(n=>n.childrenIndex),a.routesMeta.map(n=>n.childrenIndex)))}const TD=/^:[\w-]+$/,ID=3,jD=2,ND=1,ED=10,zD=-2,Db=e=>e==="*";function RD(e,t){let a=e.split("/"),n=a.length;return a.some(Db)&&(n+=zD),t&&(n+=jD),a.filter(r=>!Db(r)).reduce((r,o)=>r+(TD.test(o)?ID:o===""?ND:ED),n)}function DD(e,t){return e.length===t.length&&e.slice(0,-1).every((n,r)=>n===t[r])?e[e.length-1]-t[t.length-1]:0}function _D(e,t,a){let{routesMeta:n}=e,r={},o="/",s=[];for(let l=0;l<n.length;++l){let c=n[l],d=l===n.length-1,u=o==="/"?t:t.slice(o.length)||"/",h=_b({path:c.relativePath,caseSensitive:c.caseSensitive,end:d},u),m=c.route;if(!h&&d&&a&&!n[n.length-1].route.index&&(h=_b({path:c.relativePath,caseSensitive:c.caseSensitive,end:!1},u)),!h)return null;
vendor: 6,970 bytes, lines 416-425
416Object.assign(r,h.params),s.push({params:r,pathname:yr([o,h.pathname]),pathnameBase:GD(yr([o,h.pathnameBase])),route:m}),h.pathnameBase!=="/"&&(o=yr([o,h.pathnameBase]))}return s}function _b(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[a,n]=qD(e.path,e.caseSensitive,e.end),r=t.match(a);if(!r)return null;let o=r[0],s=o.replace(/(.)\/+$/,"$1"),l=r.slice(1);return{params:n.reduce((d,u,h)=>{let{paramName:m,isOptional:p}=u;if(m==="*"){let g=l[h]||"";s=o.slice(0,o.length-g.length).replace(/(.)\/+$/,"$1")}const b=l[h];return p&&!b?d[m]=void 0:d[m]=(b||"").replace(/%2F/g,"/"),d},{}),pathname:o,pathnameBase:s,pattern:e}}function qD(e,t,a){t===void 0&&(t=!1),a===void 0&&(a=!0),cS(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],r="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,l,c)=>(n.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),r+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):a?r+="\\/*$":e!==""&&e!=="/"&&(r+="(?:(?=\\/|$))"),[new RegExp(r,t?void 0:"i"),n]}function UD(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return cS(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function $g(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let a=t.endsWith("/")?t.length-1:t.length,n=e.charAt(a);return n&&n!=="/"?null:e.slice(a)||"/"}function MD(e,t){t===void 0&&(t="/");let{pathname:a,search:n="",hash:r=""}=typeof e=="string"?os(e):e;return{pathname:a?a.startsWith("/")?a:LD(a,t):t,search:FD(n),hash:HD(r)}}function LD(e,t){let a=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(r=>{r===".."?a.length>1&&a.pop():r!=="."&&a.push(r)}),a.length>1?a.join("/"):"/"}function Wh(e,t,a,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+a+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function OD(e){return e.filter((t,a)=>a===0||t.route.path&&t.route.path.length>0)}function Kg(e,t){let a=OD(e);return t?a.map((n,r)=>r===a.length-1?n.pathname:n.pathnameBase):a.map(n=>n.pathnameBase)}function Yg(e,t,a,n){n===void 0&&(n=!1);let r;typeof e=="string"?r=os(e):(r=kl({},e),nt(!r.pathname||!r.pathname.includes("?"),Wh("?","pathname","search",r)),nt(!r.pathname||!r.pathname.includes("#"),Wh("#","pathname","hash",r)),nt(!r.search||!r.search.includes("#"),Wh("#","search","hash",r)));let o=e===""||r.pathname==="",s=o?"/":r.pathname,l;if(s==null)l=a;else{let h=t.length-1;if(!n&&s.startsWith("..")){let m=s.split("/");for(;m[0]==="..";)m.shift(),h-=1;r.pathname=m.join("/")}l=h>=0?t[h]:"/"}let c=MD(r,l),d=s&&s!=="/"&&s.endsWith("/"),u=(o||s===".")&&a.endsWith("/");return!c.pathname.endsWith("/")&&(d||u)&&(c.pathname+="/"),c}const yr=e=>e.join("/").replace(/\/\/+/g,"/"),GD=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),FD=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,HD=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function BD(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const hS=["post","put","patch","delete"];new Set(hS);const VD=["get",...hS];new Set(VD);/** 417 * React Router v6.30.1 418 * 419 * Copyright (c) Remix Software Inc. 420 * 421 * This source code is licensed under the MIT license found in the 422 * LICENSE.md file in the root directory of this source tree. 423 * 424 * @license MIT 425 */function Cl(){return Cl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},Cl.apply(this,arguments)}const Jg=f.createContext(null),WD=f.createContext(null),Rr=f.createContext(null),Ql=f.createContext(null),Rn=f.createContext({outlet:null,matches:[],isDataRoute:!1}),pS=f.createContext(null);function $D(e,t){let{relative:a}=t===void 0?{}:t;is()||nt(!1);let{basename:n,navigator:r}=f.useContext(Rr),{hash:o,pathname:s,search:l}=fS(e,{relative:a}),c=s;return n!=="/"&&(c=s==="/"?n:yr([n,s])),r.createHref({pathname:c,search:l,hash:o})}function is(){return f.useContext(Ql)!=null}function Wa(){return is()||nt(!1),f.useContext(Ql).location}function KD(){return f.useContext(Ql).navigationType}function mS(e){f.useContext(Rr).static||f.useLayoutEffect(e)}function qu(){let{isDataRoute:e}=f.useContext(Rn);return e?s_():YD()}function YD(){is()||nt(!1);let e=f.useContext(Jg),{basename:t,future:a,navigator:n}=f.useContext(Rr),{matches:r}=f.useContext(Rn),{pathname:o}=Wa(),s=JSON.stringify(Kg(r,a.v7_relativeSplatPath)),l=f.useRef(!1);return mS(()=>{l.current=!0}),f.useCallback(function(d,u){if(u===void 0&&(u={}),!l.current)return;if(typeof d=="number"){n.go(d);return}let h=Yg(d,JSON.parse(s),o,u.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:yr([t,h.pathname])),(u.replace?n.replace:n.push)(h,u.state,u)},[t,n,s,o,e])}function Uu(){let{matches:e}=f.useContext(Rn),t=e[e.length-1];return t?t.params:{}}function fS(e,t){let{relative:a}=t===void 0?{}:t,{future:n}=f.useContext(Rr),{matches:r}=f.useContext(Rn),{pathname:o}=Wa(),s=JSON.stringify(Kg(r,n.v7_relativeSplatPath));return f.useMemo(()=>Yg(e,JSON.parse(s),o,a==="path"),[e,s,o,a])}function JD(e,t){return QD(e,t)}function QD(e,t,a,n){is()||nt(!1);let{navigator:r}=f.useContext(Rr),{matches:o}=f.useContext(Rn),s=o[o.length-1],l=s?s.params:{};s&&s.pathname;let c=s?s.pathnameBase:"/";s&&s.route;let d=Wa(),u;if(t){var h;let v=typeof t=="string"?os(t):t;c==="/"||(h=v.pathname)!=null&&h.startsWith(c)||nt(!1),u=v}else u=d;let m=u.pathname||"/",p=m;if(c!=="/"){let v=c.replace(/^\//,"").split("/");p="/"+m.replace(/^\//,"").split("/").slice(v.length).join("/")}let b=SD(e,{pathname:p}),g=a_(b&&b.map(v=>Object.assign({},v,{params:Object.assign({},l,v.params),pathname:yr([c,r.encodeLocation?r.encodeLocation(v.pathname).pathname:v.pathname]),pathnameBase:v.pathnameBase==="/"?c:yr([c,r.encodeLocation?r.encodeLocation(v.pathnameBase).pathname:v.pathnameBase])})),o,a,n);return t&&g?f.createElement(Ql.Provider,{value:{location:Cl({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:sr.Pop}},g):g}function ZD(){let e=i_(),t=BD(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),a=e instanceof Error?e.stack:null,r={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return f.createElement(f.Fragment,null,f.createElement("h2",null,"Unexpected Application
425Error!"),f.createElement("h3",{style:{fontStyle:"italic"}},t),a?f.createElement("pre",{style:r},a):null,null)}const XD=f.createElement(ZD,null);class e_ extends f.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,a){return a.location!==t.location||a.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:a.error,location:a.location,revalidation:t.revalidation||a.revalidation}}componentDidCatch(t,a){console.error("React Router caught the following error during render",t,a)}render(){return this.state.error!==void 0?f.createElement(Rn.Provider,{value:this.props.routeContext},f.createElement(pS.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function t_(e){let{routeContext:t,match:a,children:n}=e,r=f.useContext(Jg);return r&&r.static&&r.staticContext&&(a.route.errorElement||a.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=a.route.id),f.createElement(Rn.Provider,{value:t},n)}function a_(e,t,a,n){var r;if(t===void 0&&(t=[]),a===void 0&&(a=null),n===void 0&&(n=null),e==null){var o;if(!a)return null;if(a.errors)e=a.matches;else if((o=n)!=null&&o.v7_partialHydration&&t.length===0&&!a.initialized&&a.matches.length>0)e=a.matches;else return null}let s=e,l=(r=a)==null?void 0:r.errors;if(l!=null){let u=s.findIndex(h=>h.route.id&&(l==null?void 0:l[h.route.id])!==void 0);u>=0||nt(!1),s=s.slice(0,Math.min(s.length,u+1))}let c=!1,d=-1;if(a&&n&&n.v7_partialHydration)for(let u=0;u<s.length;u++){let h=s[u];if((h.route.HydrateFallback||h.route.hydrateFallbackElement)&&(d=u),h.route.id){let{loaderData:m,errors:p}=a,b=h.route.loader&&m[h.route.id]===void 0&&(!p||p[h.route.id]===void 0);if(h.route.lazy||b){c=!0,d>=0?s=s.slice(0,d+1):s=[s[0]];break}}}return s.reduceRight((u,h,m)=>{let p,b=!1,g=null,v=null;a&&(p=l&&h.route.id?l[h.route.id]:void 0,g=h.route.errorElement||XD,c&&(d<0&&m===0?(b=!0,v=null):d===m&&(b=!0,v=h.route.hydrateFallbackElement||null)));let w=t.concat(s.slice(0,m+1)),y=()=>{let x;return p?x=g:b?x=v:h.route.Component?x=f.createElement(h.route.Component,null):h.route.element?x=h.route.element:x=u,f.createElement(t_,{match:h,routeContext:{outlet:u,matches:w,isDataRoute:a!=null},children:x})};return a&&(h.route.ErrorBoundary||h.route.errorElement||m===0)?f.createElement(e_,{location:a.location,revalidation:a.revalidation,component:g,error:p,children:y(),routeC
425ontext:{outlet:null,matches:w,isDataRoute:!0}}):y()},null)}var gS=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(gS||{}),Gd=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Gd||{});function n_(e){let t=f.useContext(Jg);return t||nt(!1),t}function r_(e){let t=f.useContext(WD);return t||nt(!1),t}function o_(e){let t=f.useContext(Rn);return t||nt(!1),t}function yS(e){let t=o_(),a=t.matches[t.matches.length-1];return a.route.id||nt(!1),a.route.id}function i_(){var e;let t=f.useContext(pS),a=r_(Gd.UseRouteError),n=yS(Gd.UseRouteError);return t!==void 0?t:(e=a.errors)==null?void 0:e[n]}function s_(){let{router:e}=n_(gS.UseNavigateStable),t=yS(Gd.UseNavigateStable),a=f.useRef(!1);return mS(()=>{a.current=!0}),f.useCallback(function(r,o){o===void 0&&(o={}),a.current&&(typeof r=="number"?e.navigate(r):e.navigate(r,Cl({fromRouteId:t},o)))},[e,t])}function l_(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function Xr(e){let{to:t,replace:a,state:n,relative:r}=e;is()||nt(!1);let{future:o,static:s}=f.useContext(Rr),{matches:l}=f.useContext(Rn),{pathname:c}=Wa(),d=qu(),u=Yg(t,Kg(l,o.v7_relativeSplatPath),c,r==="path"),h=JSON.stringify(u);return f.useEffect(()=>d(JSON.parse(h),{replace:a,state:n,relative:r}),[d,h,r,a,n]),null}function oe(e){nt(!1)}function c_(e){let{basename:t="/",children:a=null,location:n,navigationType:r=sr.Pop,navigator:o,static:s=!1,future:l}=e;is()&&nt(!1);let c=t.replace(/^\/*/,"/"),d=f.useMemo(()=>({basename:c,navigator:o,static:s,future:Cl({v7_relativeSplatPath:!1},l)}),[c,l,o,s]);typeof n=="string"&&(n=os(n));let{pathname:u="/",search:h="",hash:m="",state:p=null,key:b="default"}=n,g=f.useMemo(()=>{let v=$g(u,c);return v==null?null:{location:{pathname:v,search:h,hash:m,state:p,key:b},navigationType:r}},[c,u,h,m,p,b,r]);return g==null?null:f.createElement(Rr.Provider,{value:d},f.createElement(Ql.Provider,{children:a,value:g}))}function d_(e){let{children:t,location:a}=e;return JD(Rm(t),a)}new Promise(()=>{});function Rm(e,t){t===void 0&&(t=[]);let a=[];return f.Children.forEach(e,(n,r)=>{if(!f.isValidElement(n))return;let o=[...t,r];if(n.type===f.Fragment){a.push.apply(a,Rm(n.props.children,o));return}n.type!==oe&&nt(!1),!n.props.index||!n.props.children||nt(!1);let s={id:n.props.id||o.join("-"),caseSensitive:n.props.caseSensitive,element:n.props.element,Component:n.props.Component,index:n.props.index,path:n.props.path,loader:n.props.loader,action:n.props.action,errorElement:n.props.errorElement,ErrorBoundary:n.props.ErrorBoundary,hasErrorBoundary:n.props.ErrorBoundary!=null||n.props.errorElement!=null,shouldRevalidate:n.props.shouldRevalidate,handle:n.props.handle,lazy:n.props.lazy};n.props.children&&(s.children=Rm(n.props.children,o)),a.push(s)}),a}/** 426 * React Router DOM v6.30.1 427 * 428 * Copyright (c) Remix Software Inc. 429 * 430 * This source code is licensed under the MIT license found in the 431 * LICENSE.md file in the root directory of this source tree. 432 * 433 * @license MIT 434 */function Dm(){return Dm=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},Dm.apply(this,arguments)}function u_(e,t){if(e==null)return{};var a={},n=Object.keys(e),r,o;for(o=0;o<n.length;o++)r=n[o],!(t.indexOf(r)>=0)&&(a[r]=e[r]);return a}function h_(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function p_(e,t){return e.button===0&&(!t||t==="_self")&&!h_(e)}function _m(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,a)=>{let n=e[a];return t.concat(Array.isArray(n)?n.map(r=>[a,r]):[[a,n]])},[]))}function m_(e,t){let a=_m(e);return t&&t.forEach((n,r)=>{a.has(r)||t.getAll(r).forEach(o=>{a.append(r,o)})}),a}const f_=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],g_="6";try{window.__reactRouterVersion=g_}catch{}const y_="startTransition",qb=jf[y_];function v_(e){let{basename:t,children:a,future:n,window:r}=e,o=f.useRef();o.current==null&&(o.current=xD({window:r,v5Compat:!0}));let s=o.current,[l,c]=f.useState({action:s.action,location:s.location}),{v7_startTransition:d}=n||{},u=f.useCallback(h=>{d&&qb?qb(()=>c(h)):c(h)},[c,d]);return f.useLayoutEffect(()=>s.listen(u),[s,u]),f.useEffect(()=>l_(n),[n]),f.createElement(c_,{basename:t,children:a,location:l.location,navigationType:l.action,navigator:s,future:n})}const b_=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",w_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,M=f.forwardRef(function(t,a){let{onClick:n,relative:r,reloadDocument:o,replace:s,state:l,target:c,to:d,preventScrollReset:u,viewTransition:h}
434=t,m=u_(t,f_),{basename:p}=f.useContext(Rr),b,g=!1;if(typeof d=="string"&&w_.test(d)&&(b=d,b_))try{let x=new URL(window.location.href),k=d.startsWith("//")?new URL(x.protocol+d):new URL(d),C=$g(k.pathname,p);k.origin===x.origin&&C!=null?d=C+k.search+k.hash:g=!0}catch{}let v=$D(d,{relative:r}),w=x_(d,{replace:s,state:l,target:c,preventScrollReset:u,relative:r,viewTransition:h});function y(x){n&&n(x),x.defaultPrevented||w(x)}return f.createElement("a",Dm({},m,{href:b||v,onClick:g||o?n:y,ref:a,target:c}))});var Ub;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Ub||(Ub={}));var Mb;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Mb||(Mb={}));function x_(e,t){let{target:a,replace:n,state:r,preventScrollReset:o,relative:s,viewTransition:l}=t===void 0?{}:t,c=qu(),d=Wa(),u=fS(e,{relative:s});return f.useCallback(h=>{if(p_(h,a)){h.preventDefault();let m=n!==void 0?n:Od(d)===Od(u);c(e,{replace:m,state:r,preventScrollReset:o,relative:s,viewTransition:l})}},[d,c,u,n,r,a,e,o,s,l])}function k_(e){let t=f.useRef(_m(e)),a=f.useRef(!1),n=Wa(),r=f.useMemo(()=>m_(n.search,a.current?null:t.current),[n.search]),o=qu(),s=f.useCallback((l,c)=>{const d=_m(typeof l=="function"?l(r):l);a.current=!0,o("?"+d,c)},[o,r]);return[r,s]}var vS=(e=>(e.BASE="base",e.BODY="body",e.HEAD="head",e.HTML="html",e.LINK="link",e.META="meta",e.NOSCRIPT="noscript",e.SCRIPT="script",e.STYLE="style",e.TITLE="title",e.FRAGMENT="Symbol(react.fragment)",e))(vS||{}),$h={link:{rel:["amphtml","canonical","alternate"]},script:{type:["application/ld+json"]},meta:{charset:"",name:["generator","robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]}};Object.values(vS);var Qg={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"};Object.entries(Qg).reduce((e,[t,a])=>(e[a]=t,e),{});var Sl="data-rh",C_=e=>Array.isArray(e)?e.join(""):e,S_=(e,t)=>{const a=Object.keys(e);for(let n=0;n<a.length;n+=1)if(t[a[n]]&&t[a[n]].includes(e[a[n]]))return!0;return!1},Kh=(e,t)=>Array.isArray(e)?e.reduce((a,n)=>(S_(n,t)?a.priority.push(n):a.default.push(n),a),{priority:[],default:[]}):{default:e,priority:[]},A_=["noscript","script","style"],qm=(e,t=!0)=>t===!1?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),bS=e=>Object.keys(e).reduce((t,a)=>{const n=typeof e[a]<"u"?`${a}="${e[a]}"`:`${a}`;return t?`${t} ${n}`:n},""),P_=(e,t,a,n)=>{const r=bS(a),o=C_(t);return r?`<${e} ${Sl}="true" ${r}>${qm(o,n)}</${e}>`:`<${e} ${Sl}="true">${qm(o,n)}</${e}>`},T_=(e,t,a=!0)=>t.reduce((n,r)=>{const o=r,s=Object.keys(o).filter(d=>!(d==="innerHTML"||d==="cssText")).reduce((d,u)=>{const h=typeof o[u]>"u"?u:`${u}="${qm(o[u],a)}"`;return d?`${d} ${h}`:h},""),l=o.innerHTML||o.cssText||"",c=A_.indexOf(e)===-1;return`${n}<${e} ${Sl}="true" ${s}${c?"/>":`>${l}</${e}>`}`},""),wS=(e,t={})=>Object.keys(e).reduce((a,n)=>{const r=Qg[n];return a[r||n]=e[n],a},t),I_=(e,t,a)=>{const n={key:t,[Sl]:!0},r=wS(a,n);return[D.createElement("title",r,t)]},nd=(e,t)=>t.map((a,n)=>{const r={key:n,[Sl]:!0};return Object.keys(a).forEach(o=>{const l=Qg[o]||o;if(l==="innerHTML"||l==="cssText"){const c=a.innerHTML||a.cssText;r.dangerouslySetInnerHTML={__html:c}}else r[l]=a[o]}),D.createElement(e,r)}),ca=(e,t,a=!0)=>{switch(e){case"title":return{toComponent:()=>I_(e,t.title,t.titleAttributes),toString:()=>P_(e,t.title,t.titleAttributes,a)};case"bodyAttributes":case"htmlAttributes":return{toComponent:()=>wS(t),toString:()=>bS(t)};default:return{toComponent:()=>nd(e,t),toString:()=>T_(e,t,a)}}},j_=({metaTags:e,linkTags:t,scriptTags:a,encode:n})=>{const r=Kh(e,$h.meta),o=Kh(t,$h.link),s=Kh(a,$h.script);return{priorityMethods:{toComponent:()=>[...nd("meta",r.priority),...nd("link",o.priority),...nd("script",s.priority)],toString:()=>`${ca("meta",r.priority,n)} ${ca("link",o.priority,n)} ${ca("script",s.priority,n)}`},metaTags:r.default,linkTags:o.default,scriptTags:s.default}},N_=e=>{const{baseTag:t,bodyAttributes:a,encode:n=!0,htmlAttributes:r,noscriptTags:o,styleTags:s,title:l="",titleAttributes:c,prioritizeSeoTags:d}=e;let{linkTags:u,metaTags:h,scriptTags:m}=e,p={toComponent:()=>{},toString:()=>""};return d&&({priorityMethods:p,linkTags:u,metaTags:h,scriptTags:m}=j_(e)),{priority:p,base:ca("base",t,n),bodyAttributes:ca("bodyAttributes",a,n),htmlAttributes:ca("htmlAttributes",r,n),link:ca("link",u,n),meta:ca("meta",h,n),noscript:ca("noscript",o,n),script:ca("script",m,n),style:ca("style",s,n),title:ca("title",{title:l,titleAttributes:c},n)}},E_=N_,Pc=[],xS=!!(typeof window<"u"&&window.document&&window.document.createElement),z_=class{constructor(e,t){Or(this,"instances",[]);Or(this,"canUseDOM",xS);Or(this,"context");Or(this,"value",{setHelmet:e=>{this.context.helmet=e},helmetInstances:{get:()=>this.canUseDOM?Pc:this.instances,add:e=>{(this.canUseDOM?Pc:this.instances).push(e)},remove:e=>{const t=(this.canUseDOM?Pc:this.instances).indexOf(e);(this.canUseDOM?Pc:this.instances).splice(t,1)}}});this.context=e,this.canUseDOM=t||!1,t||(e.helmet=E_({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))}},R_={},D_=D.createContext(R_),so,__=(so=class extends f.Component{constructor(a){
434super(a);Or(this,"helmetData");this.helmetData=new z_(this.props.context||{},so.canUseDOM)}render(){return D.createElement(D_.Provider,{value:this.helmetData.value},this.props.children)}},Or(so,"canUseDOM",xS),so);const ht="https://heroshots.ai",aa="en",Fd=["en","it","es","de","fr"],kS=Fd.filter(e=>e!==aa),Lb={en:"en_US",it:"it_IT",es:"es_ES",de:"de_DE",fr:"fr_FR"};function CS(e){return!!e&&Fd.includes(e)}function ss(e){const t=e.split("/").filter(Boolean)[0];return t&&kS.includes(t)?t:aa}function SS(e){return e===aa?void 0:`/${e}`}function Mu(e){const t=e.split("/").filter(Boolean);return t[0]&&kS.includes(t[0])&&t.shift(),"/"+t.join("/")}function Zg(e,t){const a=t==="/"?"":t.replace(/\/+$/,"");return e===aa?a||"/":`/${e}${a}`}function uo(e,t){return`${ht}${Zg(e,t)}`}function q_(e){try{const t=e.startsWith("http")?new URL(e).pathname:e;return Mu(t||"/")}catch{return"/"}}function U_(e){if(!(typeof window>"u"||typeof window.oaiq!="function"))try{window.oaiq("measure","custom",{type:"custom"},{custom_event_name:e})}catch{}}function M_(){U_("paginaregistrazioneaperta")}function L_(){const e=t=>{var r,o;const a=(o=(r=t.target)==null?void 0:r.closest)==null?void 0:o.call(r,"a[href]");((a==null?void 0:a.getAttribute("href"))??"").startsWith("https://app.heroshots.ai")&&M_()};return document.addEventListener("click",e,!0),()=>document.removeEventListener("click",e,!0)}var an=function(){return an=Object.assign||function(t){for(var a,n=1,r=arguments.length;n<r;n++){a=arguments[n];for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(t[o]=a[o])}return t},an.apply(this,arguments)};function ls(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(a[n[r]]=e[n[r]]);return a}function O_(e,t,a,n){function r(o){return o instanceof a?o:new a(function(s){s(o)})}return new(a||(a=Promise))(function(o,s){function l(u){try{d(n.next(u))}catch(h){s(h)}}function c(u){try{d(n.throw(u))}catch(h){s(h)}}function d(u){u.done?o(u.value):r(u.value).then(l,c)}d((n=n.apply(e,t||[])).next())})}function G_(e,t,a){if(a||arguments.length===2)for(var n=0,r=t.length,o;n<r;n++)(o||!(n in t))&&(o||(o=Array.prototype.slice.call(t,0,n)),o[n]=t[n]);return e.concat(o||Array.prototype.slice.call(t))}const F_=e=>e?(...t)=>e(...t):(...t)=>fetch(...t);class Xg extends Error{constructor(t,a="FunctionsError",n){super(t),this.name=a,this.context=n}}class H_ extends Xg{constructor(t){super("Failed to send a request to the Edge Function","FunctionsFetchError",t)}}class Ob extends Xg{constructor(t){super("Relay Error invoking the Edge Function","FunctionsRelayError",t)}}class Gb extends Xg{constructor(t){super("Edge Function returned a non-2xx status code","FunctionsHttpError",t)}}var Um;(function(e){e.Any="any",e.ApNortheast1="ap-northeast-1",e.ApNortheast2="ap-northeast-2",e.ApSouth1="ap-south-1",e.ApSoutheast1="ap-southeast-1",e.ApSoutheast2="ap-southeast-2",e.CaCentral1="ca-central-1",e.EuCentral1="eu-central-1",e.EuWest1="eu-west-1",e.EuWest2="eu-west-2",e.EuWest3="eu-west-3",e.SaEast1="sa-east-1",e.UsEast1="us-east-1",e.UsWest1="us-west-1",e.UsWest2="us-west-2"})(Um||(Um={}));class B_{constructor(t,{headers:a={},customFetch:n,region:r=Um.Any}={}){this.url=t,this.headers=a,this.region=r,this.fetch=F_(n)}setAuth(t){this.headers.Authorization=`Bearer ${t}`}invoke(t){return O_(this,arguments,void 0,function*(a,n={}){var r;let o,s;try{const{headers:l,method:c,body:d,signal:u,timeout:h}=n;let m={},{region:p}=n;p||(p=this.region);const b=new URL(`${this.url}/${a}`);p&&p!=="any"&&(m["x-region"]=p,b.searchParams.set("forceFunctionRegion",p));let g;d&&(l&&!Object.prototype.hasOwnProperty.call(l,"Content-Type")||!l)?typeof Blob<"u"&&d instanceof Blob||d instanceof ArrayBuffer?(m["Content-Type"]="application/octet-stream",g=d):typeof d=="string"?(m["Content-Type"]="text/plain",g=d):typeof FormData<"u"&&d instanceof FormData?g=d:(m["Content-Type"]="application/json",g=JSON.stringify(d)):d&&typeof d!="string"&&!(typeof Blob<"u"&&d instanceof Blob)&&!(d instanceof ArrayBuffer)&&!(typeof FormData<"u"&&d instanceof FormData)?g=JSON.stringify(d):g=d;let v=u;h&&(s=new AbortController,o=setTimeout(()=>s.abort(),h),u?(v=s.signal,u.addEventListener("abort",()=>s.abort())):v=s.signal);const w=yield this.fetch(b.toString(),{method:c||"POST",headers:Object.assign(Object.assign(Object.assign({},m),this.headers),l),body:g,signal:v}).catch(C=>{throw new H_(C)}),y=w.headers.get("x-relay-error");
434if(y&&y==="true")throw new Ob(w);if(!w.ok)throw new Gb(w);let x=((r=w.headers.get("Content-Type"))!==null&&r!==void 0?r:"text/plain").split(";")[0].trim(),k;return x==="application/json"?k=yield w.json():x==="application/octet-stream"||x==="application/pdf"?k=yield w.blob():x==="text/event-stream"?k=w:x==="multipart/form-data"?k=yield w.formData():k=yield w.text(),{data:k,error:null,response:w}}catch(l){return{data:null,error:l,response:l instanceof Gb||l instanceof Ob?l.context:void 0}}finally{o&&clearTimeout(o)}})}}var V_=class extends Error{constructor(e){super(e.message),this.name="PostgrestError",this.details=e.details,this.hint=e.hint,this.code=e.code}},W_=class{constructor(e){var t,a,n;this.shouldThrowOnError=!1,this.method=e.method,this.url=e.url,this.headers=new Headers(e.headers),this.schema=e.schema,this.body=e.body,this.shouldThrowOnError=(t=e.shouldThrowOnError)!==null&&t!==void 0?t:!1,this.signal=e.signal,this.isMaybeSingle=(a=e.isMaybeSingle)!==null&&a!==void 0?a:!1,this.urlLengthLimit=(n=e.urlLengthLimit)!==null&&n!==void 0?n:8e3,e.fetch?this.fetch=e.fetch:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}setHeader(e,t){return this.headers=new Headers(this.headers),this.headers.set(e,t),this}then(e,t){var a=this;this.schema===void 0||(["GET","HEAD"].includes(this.method)?this.headers.set("Accept-Profile",this.schema):this.headers.set("Content-Profile",this.schema)),this.method!=="GET"&&this.method!=="HEAD"&&this.headers.set("Content-Type","application/json");const n=this.fetch;let r=n(this.url.toString(),{method:this.method,headers:this.headers,body:JSON.stringify(this.body),signal:this.signal}).then(async o=>{let s=null,l=null,c=null,d=o.status,u=o.statusText;if(o.ok){var h,m;if(a.method!=="HEAD"){var p;const w=await o.text();w===""||(a.headers.get("Accept")==="text/csv"||a.headers.get("Accept")&&(!((p=a.headers.get("Accept"))===null||p===void 0)&&p.includes("application/vnd.pgrst.plan+text"))?l=w:l=JSON.parse(w))}const g=(h=a.headers.get("Prefer"))===null||h===void 0?void 0:h.match(/count=(exact|planned|estimated)/),v=(m=o.headers.get("content-range"))===null||m===void 0?void 0:m.split("/");g&&v&&v.length>1&&(c=parseInt(v[1])),a.isMaybeSingle&&a.method==="GET"&&Array.isArray(l)&&(l.length>1?(s={code:"PGRST116",details:`Results contain ${l.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},l=null,c=null,d=406,u="Not Acceptable"):l.length===1?l=l[0]:l=null)}else{var b;const g=await o.text();try{s=JSON.parse(g),Array.isArray(s)&&o.status===404&&(l=[],s=null,d=200,u="OK")}catch{o.status===404&&g===""?(d=204,u="No Content"):s={message:g}}if(s&&a.isMaybeSingle&&(!(s==null||(b=s.details)===null||b===void 0)&&b.includes("0 rows"))&&(s=null,d=200,u="OK"),s&&a.shouldThrowOnError)throw new V_(s)}return{error:s,data:l,count:c,status:d,statusText:u}});return this.shouldThrowOnError||(r=r.catch(o=>{var s;let l="",c="",d="";const u=o==null?void 0:o.cause;if(u){var h,m,p,b;const w=(h=u==null?void 0:u.message)!==null&&h!==void 0?h:"",y=(m=u==null?void 0:u.code)!==null&&m!==void 0?m:"";l=`${(p=o==null?void 0:o.name)!==null&&p!==void 0?p:"FetchError"}: ${o==null?void 0:o.message}`,l+=` 435 436Caused by: ${(b=u==null?void 0:u.name)!==null&&b!==void 0?b:"Error"}: ${w}`,y&&(l+=` (${y})`),u!=null&&u.stack&&(l+=` 437${u.stack}`)}else{var g;l=(g=o==null?void 0:o.stack)!==null&&g!==void 0?g:""}const v=this.url.toString().length;return(o==null?void 0:o.name)==="AbortError"||(o==null?void 0:o.code)==="ABORT_ERR"?(d="",c="Request was aborted (timeout or manual cancellation)",v>this.urlLengthLimit&&(c+=`. Note: Your request URL is ${v} characters, which may exceed server limits. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [many IDs])), consider using an RPC function to pass values server-side.`)):((u==null?void 0:u.name)==="HeadersOverflowError"||(u==null?void 0:u.code)==="UND_ERR_HEADERS_OVERFLOW")&&(d="",c="HTTP headers exceeded server limits (typically 16KB)",v>this.urlLengthLimit&&(c+=`. Your request URL is ${v} characters. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [200+ IDs])), consider using an RPC function instead.`)),{error:{message:`${(s=o==null?void 0:o.name)!==null&&s!==void 0?s:"FetchError"}: ${o==null?void 0:o.message}`,details:l,hint:c,code:d},data:null,count:null,status:0,statusText:""}}
437)),r.then(e,t)}returns(){return this}overrideTypes(){return this}},$_=class extends W_{select(e){let t=!1;const a=(e??"*").split("").map(n=>/\s/.test(n)&&!t?"":(n==='"'&&(t=!t),n)).join("");return this.url.searchParams.set("select",a),this.headers.append("Prefer","return=representation"),this}order(e,{ascending:t=!0,nullsFirst:a,foreignTable:n,referencedTable:r=n}={}){const o=r?`${r}.order`:"order",s=this.url.searchParams.get(o);return this.url.searchParams.set(o,`${s?`${s},`:""}${e}.${t?"asc":"desc"}${a===void 0?"":a?".nullsfirst":".nullslast"}`),this}limit(e,{foreignTable:t,referencedTable:a=t}={}){const n=typeof a>"u"?"limit":`${a}.limit`;return this.url.searchParams.set(n,`${e}`),this}range(e,t,{foreignTable:a,referencedTable:n=a}={}){const r=typeof n>"u"?"offset":`${n}.offset`,o=typeof n>"u"?"limit":`${n}.limit`;return this.url.searchParams.set(r,`${e}`),this.url.searchParams.set(o,`${t-e+1}`),this}abortSignal(e){return this.signal=e,this}single(){return this.headers.set("Accept","application/vnd.pgrst.object+json"),this}maybeSingle(){return this.method==="GET"?this.headers.set("Accept","application/json"):this.headers.set("Accept","application/vnd.pgrst.object+json"),this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}explain({analyze:e=!1,verbose:t=!1,settings:a=!1,buffers:n=!1,wal:r=!1,format:o="text"}={}){var s;const l=[e?"analyze":null,t?"verbose":null,a?"settings":null,n?"buffers":null,r?"wal":null].filter(Boolean).join("|"),c=(s=this.headers.get("Accept"))!==null&&s!==void 0?s:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${o}; for="${c}"; options=${l};`),o==="json"?this:this}rollback(){return this.headers.append("Prefer","tx=rollback"),this}returns(){return this}maxAffected(e){return this.headers.append("Prefer","handling=strict"),this.headers.append("Prefer",`max-affected=${e}`),this}};const Fb=new RegExp("[,()]");var Qo=class extends $_{eq(e,t){return this.url.searchParams.append(e,`eq.${t}`),this}neq(e,t){return this.url.searchParams.append(e,`neq.${t}`),this}gt(e,t){return this.url.searchParams.append(e,`gt.${t}`),this}gte(e,t){return this.url.searchParams.append(e,`gte.${t}`),this}lt(e,t){return this.url.searchParams.append(e,`lt.${t}`),this}lte(e,t){return this.url.searchParams.append(e,`lte.${t}`),this}like(e,t){return this.url.searchParams.append(e,`like.${t}`),this}likeAllOf(e,t){return this.url.searchParams.append(e,`like(all).{${t.join(",")}}`),this}likeAnyOf(e,t){return this.url.searchParams.append(e,`like(any).{${t.join(",")}}`),this}ilike(e,t){return this.url.searchParams.append(e,`ilike.${t}`),this}ilikeAllOf(e,t){return this.url.searchParams.append(e,`ilike(all).{${t.join(",")}}`),this}ilikeAnyOf(e,t){return this.url.searchParams.append(e,`ilike(any).{${t.join(",")}}`),this}regexMatch(e,t){return this.url.searchParams.append(e,`match.${t}`),this}regexIMatch(e,t){return this.url.searchParams.append(e,`imatch.${t}`),this}is(e,t){return this.url.searchParams.append(e,`is.${t}`),this}isDistinct(e,t){return this.url.searchParams.append(e,`isdistinct.${t}`),this}in(e,t){const a=Array.from(new Set(t)).map(n=>typeof n=="string"&&Fb.test(n)?`"${n}"`:`${n}`).join(",");return this.url.searchParams.append(e,`in.(${a})`),this}notIn(e,t){const a=Array.from(new Set(t)).map(n=>typeof n=="string"&&Fb.test(n)?`"${n}"`:`${n}`).join(",");return this.url.searchParams.append(e,`not.in.(${a})`),this}contains(e,t){return typeof t=="string"?this.url.searchParams.append(e,`cs.${t}`):Array.isArray(t)?this.url.searchParams.append(e,`cs.{${t.join(",")}}`):this.url.searchParams.append(e,`cs.${JSON.stringify(t)}`),this}containedBy(e,t){return typeof t=="string"?this.url.searchParams.append(e,`cd.${t}`):Array.isArray(t)?this.url.searchParams.append(e,`cd.{${t.join(",")}}`):this.url.searchParams.append(e,`cd.${JSON.stringify(t)}`),this}rangeGt(e,t){return this.url.searchParams.append(e,`sr.${t}`),this}rangeGte(e,t){return this.url.searchParams.append(e,`nxl.${t}`),this}rangeLt(e,t){return this.url.searchParams.append(e,`sl.${t}`),this}rangeLte(e,t){return this.url.searchParams.append(e,`nxr.${t}`),this}rangeAdjacent(e,t){return this.url.searchParams.append(e,`adj.${t}`),this}overlaps(e,t){return typeof t=="string"?this.url.searchParams.append(e,`ov.${t}`):this.url.searchParams.append(e,`ov.{${t.join(",")}}`),this}textSearch(e,t,{config:a,type:n}={}){let r="";n==="plain"?r="pl":n==="phrase"?r="ph":n==="websearch"&&(r="w");const o=a===void 0?"":`(${a})`;return this.url.searchParams.append(e,`${r}fts${o}.${t}`),this}match(e){return Object.entries(e).forEach(([t,a])=>{this.url.searchParams.append(t,`eq.${a}`)}),this}not(e,t,a){return this.url.searchParams.append(e,`not.${t}.${a}`),this}or(e,{foreignTable:t,referencedTable:a=t}={}){const n=a?`${a}.or`:"or";return this.url.searchParams.append(n,`(${e})`),this}filter(e,t,a){return this.url.searchParams.append(e,`${t}.${a}`),this}},K_=class{constructor(e,{headers:t={},schema:a,fetch:n,urlLengthLimit:r=8e3}){this.url=e,this.headers=new Headers(t),this.schema=a,this.fetch=n,this.urlLengthLimit=r}
437cloneRequestState(){return{url:new URL(this.url.toString()),headers:new Headers(this.headers)}}select(e,t){const{head:a=!1,count:n}=t??{},r=a?"HEAD":"GET";let o=!1;const s=(e??"*").split("").map(d=>/\s/.test(d)&&!o?"":(d==='"'&&(o=!o),d)).join(""),{url:l,headers:c}=this.cloneRequestState();return l.searchParams.set("select",s),n&&c.append("Prefer",`count=${n}`),new Qo({method:r,url:l,headers:c,schema:this.schema,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit})}insert(e,{count:t,defaultToNull:a=!0}={}){var n;const r="POST",{url:o,headers:s}=this.cloneRequestState();if(t&&s.append("Prefer",`count=${t}`),a||s.append("Prefer","missing=default"),Array.isArray(e)){const l=e.reduce((c,d)=>c.concat(Object.keys(d)),[]);if(l.length>0){const c=[...new Set(l)].map(d=>`"${d}"`);o.searchParams.set("columns",c.join(","))}}return new Qo({method:r,url:o,headers:s,schema:this.schema,body:e,fetch:(n=this.fetch)!==null&&n!==void 0?n:fetch,urlLengthLimit:this.urlLengthLimit})}upsert(e,{onConflict:t,ignoreDuplicates:a=!1,count:n,defaultToNull:r=!0}={}){var o;const s="POST",{url:l,headers:c}=this.cloneRequestState();if(c.append("Prefer",`resolution=${a?"ignore":"merge"}-duplicates`),t!==void 0&&l.searchParams.set("on_conflict",t),n&&c.append("Prefer",`count=${n}`),r||c.append("Prefer","missing=default"),Array.isArray(e)){const d=e.reduce((u,h)=>u.concat(Object.keys(h)),[]);if(d.length>0){const u=[...new Set(d)].map(h=>`"${h}"`);l.searchParams.set("columns",u.join(","))}}return new Qo({method:s,url:l,headers:c,schema:this.schema,body:e,fetch:(o=this.fetch)!==null&&o!==void 0?o:fetch,urlLengthLimit:this.urlLengthLimit})}update(e,{count:t}={}){var a;const n="PATCH",{url:r,headers:o}=this.cloneRequestState();return t&&o.append("Prefer",`count=${t}`),new Qo({method:n,url:r,headers:o,schema:this.schema,body:e,fetch:(a=this.fetch)!==null&&a!==void 0?a:fetch,urlLengthLimit:this.urlLengthLimit})}delete({count:e}={}){var t;const a="DELETE",{url:n,headers:r}=this.cloneRequestState();return e&&r.append("Prefer",`count=${e}`),new Qo({method:a,url:n,headers:r,schema:this.schema,fetch:(t=this.fetch)!==null&&t!==void 0?t:fetch,urlLengthLimit:this.urlLengthLimit})}};function Al(e){"@babel/helpers - typeof";return Al=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Al(e)}function Y_(e,t){if(Al(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var n=a.call(e,t||"default");if(Al(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function J_(e){var t=Y_(e,"string");return Al(t)=="symbol"?t:t+""}function Q_(e,t,a){return(t=J_(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Hb(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),a.push.apply(a,n)}return a}function Tc(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?Hb(Object(a),!0).forEach(function(n){Q_(e,n,a[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):Hb(Object(a)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))})}return e}var Z_=class AS{constructor(t,{headers:a={},schema:n,fetch:r,timeout:o,urlLengthLimit:s=8e3}={}){this.url=t,this.headers=new Headers(a),this.schemaName=n,this.urlLengthLimit=s;const l=r??globalThis.fetch;o!==void 0&&o>0?this.fetch=(c,d)=>{const u=new AbortController,h=setTimeout(()=>u.abort(),o),m=d==null?void 0:d.signal;if(m){if(m.aborted)return clearTimeout(h),l(c,d);const p=()=>{clearTimeout(h),u.abort()};return m.addEventListener("abort",p,{once:!0}),l(c,Tc(Tc({},d),{},{signal:u.signal})).finally(()=>{clearTimeout(h),m.removeEventListener("abort",p)})}return l(c,Tc(Tc({},d),{},{signal:u.signal})).finally(()=>clearTimeout(h))}:this.fetch=l}from(t){if(!t||typeof t!="string"||t.trim()==="")throw new Error("Invalid relation name: relation must be a non-empty string.");return new K_(new URL(`${this.url}/${t}`),{headers:new Headers(this.headers),schema:this.schemaName,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit})}schema(t){return new AS(this.url,{headers:this.headers,schema:t,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit})}rpc(t,a={},{head:n=!1,get:r=!1,count:o}={}){var s;let l;const c=new URL(`${this.url}/rpc/${t}`);let d;const u=p=>p!==null&&typeof p=="object"&&(!Array.isArray(p)||p.some(u)),h=n&&Object.values(a).some(u);h?(l="POST",d=a):n||r?(l=n?"HEAD":"GET",Object.entries(a).filter(([p,b])=>b!==void 0).map(([p,b])=>[p,Array.isArray(b)?`{${b.join(",")}}`:`${b}
437`]).forEach(([p,b])=>{c.searchParams.append(p,b)})):(l="POST",d=a);const m=new Headers(this.headers);return h?m.set("Prefer",o?`count=${o},return=minimal`:"return=minimal"):o&&m.set("Prefer",`count=${o}`),new Qo({method:l,url:c,headers:m,schema:this.schemaName,body:d,fetch:(s=this.fetch)!==null&&s!==void 0?s:fetch,urlLengthLimit:this.urlLengthLimit})}};class X_{constructor(){}static detectEnvironment(){var t;if(typeof WebSocket<"u")return{type:"native",constructor:WebSocket};if(typeof globalThis<"u"&&typeof globalThis.WebSocket<"u")return{type:"native",constructor:globalThis.WebSocket};if(typeof global<"u"&&typeof global.WebSocket<"u")return{type:"native",constructor:global.WebSocket};if(typeof globalThis<"u"&&typeof globalThis.WebSocketPair<"u"&&typeof globalThis.WebSocket>"u")return{type:"cloudflare",error:"Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.",workaround:"Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime."};if(typeof globalThis<"u"&&globalThis.EdgeRuntime||typeof navigator<"u"&&(!((t=navigator.userAgent)===null||t===void 0)&&t.includes("Vercel-Edge")))return{type:"unsupported",error:"Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.",workaround:"Use serverless functions or a different deployment target for WebSocket functionality."};const a=globalThis.process;if(a){const n=a.versions;if(n&&n.node){const r=n.node,o=parseInt(r.replace(/^v/,"").split(".")[0]);return o>=22?typeof globalThis.WebSocket<"u"?{type:"native",constructor:globalThis.WebSocket}:{type:"unsupported",error:`Node.js ${o} detected but native WebSocket not found.`,workaround:"Provide a WebSocket implementation via the transport option."}:{type:"unsupported",error:`Node.js ${o} detected without native WebSocket support.`,workaround:`For Node.js < 22, install "ws" package and provide it via the transport option: 438import ws from "ws" 439new RealtimeClient(url, { transport: ws })`}}}return{type:"unsupported",error:"Unknown JavaScript runtime without WebSocket support.",workaround:"Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation."}}static getWebSocketConstructor(){const t=this.detectEnvironment();if(t.constructor)return t.constructor;let a=t.error||"WebSocket not supported in this environment.";throw t.workaround&&(a+=` 440 441Suggested solution: ${t.workaround}`),new Error(a)}static createWebSocket(t,a){const n=this.getWebSocketConstructor();return new n(t,a)}static isWebSocketSupported(){try{const t=this.detectEnvironment();return t.type==="native"||t.type==="ws"}catch{return!1}}}const eq="2.95.3",tq=`realtime-js/${eq}`,aq="1.0.0",PS="2.0.0",Bb=PS,Mm=1e4,nq=1e3,rq=100;var Yn;(function(e){e[e.connecting=0]="connecting",e[e.open=1]="open",e[e.closing=2]="closing",e[e.closed=3]="closed"})(Yn||(Yn={}));var lt;(function(e){e.closed="closed",e.errored="errored",e.joined="joined",e.joining="joining",e.leaving="leaving"})(lt||(lt={}));var Ma;(function(e){e.close="phx_close",e.error="phx_error",e.join="phx_join",e.reply="phx_reply",e.leave="phx_leave",e.access_token="access_token"})(Ma||(Ma={}));var Lm;(function(e){e.websocket="websocket"})(Lm||(Lm={}));var $r;(function(e){e.Connecting="connecting",e.Open="open",e.Closing="closing",e.Closed="closed"})($r||($r={}));class oq{constructor(t){this.HEADER_LENGTH=1,this.USER_BROADCAST_PUSH_META_LENGTH=6,this.KINDS={userBroadcastPush:3,userBroadcast:4},this.BINARY_ENCODING=0,this.JSON_ENCODING=1,this.BROADCAST_EVENT="broadcast",this.allowedMetadataKeys=[],this.allowedMetadataKeys=t??[]}encode(t,a){if(t.event===this.BROADCAST_EVENT&&!(t.payload instanceof ArrayBuffer)&&typeof t.payload.event=="string")return a(this._binaryEncodeUserBroadcastPush(t));let n=[t.join_ref,t.ref,t.topic,t.event,t.payload];return a(JSON.stringify(n))}_binaryEncodeUserBroadcastPush(t){var a;return this._isArrayBuffer((a=t.payload)===null||a===void 0?void 0:a.payload)?this._encodeBinaryUserBroadcastPush(t):this._encodeJsonUserBroadcastPush(t)}_encodeBinaryUserBroadcastPush(t){var a,n;const r=(n=(a=t.payload)===null||a===void 0?void 0:a.payload)!==null&&n!==void 0?n:new ArrayBuffer(0);return this._encodeUserBroadcastPush(t,this.BINARY_ENCODING,r)}_encodeJsonUserBroadcastPush(t){var a,n;const r=(n=(a=t.payload)===null||a===void 0?void 0:a.payload)!==null&&n!==void 0?n:{},s=new TextEncoder().encode(JSON.stringify(r)).buffer;return this._encodeUserBroadcastPush(t,this.JSON_ENCODING,s)}_encodeUserBroadcastPush(t,a,n){var r,o;const s=t.topic,l=(r=t.ref)!==null&&r!==void 0?r:"",c=(o=t.join_ref)!==null&&o!==void 0?o:"",d=t.payload.event,u=this.allowedMetadataKeys?this._pick(t.payload,this.allowedMetadataKeys):{},h=Object.keys(u).length===0?"":JSON.stringify(u);if(c.length>255)throw new Error(`joinRef length ${c.length} exceeds maximum of 255`);if(l.length>255)throw new Error(`ref length ${l.length} exceeds maximum of 255`);if(s.length>255)throw new Error(`topic length ${s.length} exceeds maximum of 255`);if(d.length>255)throw new Error(`userEvent length ${d.length} exceeds maximum of 255`);if(h.length>255)throw new Error(`metadata length ${h.length} exceeds maximum of 255`);const m=this.USER_BROADCAST_PUSH_META_LENGTH+c.length+l.length+s.length+d.length+h.length,p=new ArrayBuffer(this.HEADER_LENGTH+m);let b=new DataView(p),g=0;b.setUint8(g++,this.KINDS.userBroadcastPush),b.setUint8(g++,c.length),b.setUint8(g++,l.length),b.setUint8(g++,s.length),b.setUint8(g++,d.length),b.setUint8(g++,h.length),b.setUint8(g++,a),Array.from(c,w=>
441b.setUint8(g++,w.charCodeAt(0))),Array.from(l,w=>b.setUint8(g++,w.charCodeAt(0))),Array.from(s,w=>b.setUint8(g++,w.charCodeAt(0))),Array.from(d,w=>b.setUint8(g++,w.charCodeAt(0))),Array.from(h,w=>b.setUint8(g++,w.charCodeAt(0)));var v=new Uint8Array(p.byteLength+n.byteLength);return v.set(new Uint8Array(p),0),v.set(new Uint8Array(n),p.byteLength),v.buffer}decode(t,a){if(this._isArrayBuffer(t)){let n=this._binaryDecode(t);return a(n)}if(typeof t=="string"){const n=JSON.parse(t),[r,o,s,l,c]=n;return a({join_ref:r,ref:o,topic:s,event:l,payload:c})}return a({})}_binaryDecode(t){const a=new DataView(t),n=a.getUint8(0),r=new TextDecoder;switch(n){case this.KINDS.userBroadcast:return this._decodeUserBroadcast(t,a,r)}}_decodeUserBroadcast(t,a,n){const r=a.getUint8(1),o=a.getUint8(2),s=a.getUint8(3),l=a.getUint8(4);let c=this.HEADER_LENGTH+4;const d=n.decode(t.slice(c,c+r));c=c+r;const u=n.decode(t.slice(c,c+o));c=c+o;const h=n.decode(t.slice(c,c+s));c=c+s;const m=t.slice(c,t.byteLength),p=l===this.JSON_ENCODING?JSON.parse(n.decode(m)):m,b={type:this.BROADCAST_EVENT,event:u,payload:p};return s>0&&(b.meta=JSON.parse(h)),{join_ref:null,ref:null,topic:d,event:this.BROADCAST_EVENT,payload:b}}_isArrayBuffer(t){var a;return t instanceof ArrayBuffer||((a=t==null?void 0:t.constructor)===null||a===void 0?void 0:a.name)==="ArrayBuffer"}_pick(t,a){return!t||typeof t!="object"?{}:Object.fromEntries(Object.entries(t).filter(([n])=>a.includes(n)))}}class TS{constructor(t,a){this.callback=t,this.timerCalc=a,this.timer=void 0,this.tries=0,this.callback=t,this.timerCalc=a}reset(){this.tries=0,clearTimeout(this.timer),this.timer=void 0}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}}var Ue;(function(e){e.abstime="abstime",e.bool="bool",e.date="date",e.daterange="daterange",e.float4="float4",e.float8="float8",e.int2="int2",e.int4="int4",e.int4range="int4range",e.int8="int8",e.int8range="int8range",e.json="json",e.jsonb="jsonb",e.money="money",e.numeric="numeric",e.oid="oid",e.reltime="reltime",e.text="text",e.time="time",e.timestamp="timestamp",e.timestamptz="timestamptz",e.timetz="timetz",e.tsrange="tsrange",e.tstzrange="tstzrange"})(Ue||(Ue={}));const Vb=(e,t,a={})=>{var n;const r=(n=a.skipTypes)!==null&&n!==void 0?n:[];return t?Object.keys(t).reduce((o,s)=>(o[s]=iq(s,e,t,r),o),{}):{}},iq=(e,t,a,n)=>{const r=t.find(l=>
441l.name===e),o=r==null?void 0:r.type,s=a[e];return o&&!n.includes(o)?IS(o,s):Om(s)},IS=(e,t)=>{if(e.charAt(0)==="_"){const a=e.slice(1,e.length);return dq(t,a)}switch(e){case Ue.bool:return sq(t);case Ue.float4:case Ue.float8:case Ue.int2:case Ue.int4:case Ue.int8:case Ue.numeric:case Ue.oid:return lq(t);case Ue.json:case Ue.jsonb:return cq(t);case Ue.timestamp:return uq(t);case Ue.abstime:case Ue.date:case Ue.daterange:case Ue.int4range:case Ue.int8range:case Ue.money:case Ue.reltime:case Ue.text:case Ue.time:case Ue.timestamptz:case Ue.timetz:case Ue.tsrange:case Ue.tstzrange:return Om(t);default:return Om(t)}},Om=e=>e,sq=e=>{switch(e){case"t":return!0;case"f":return!1;default:return e}},lq=e=>{if(typeof e=="string"){const t=parseFloat(e);if(!Number.isNaN(t))return t}return e},cq=e=>{if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e},dq=(e,t)=>{if(typeof e!="string")return e;const a=e.length-1,n=e[a];if(e[0]==="{"&&n==="}"){let o;const s=e.slice(1,a);try{o=JSON.parse("["+s+"]")}catch{o=s?s.split(","):[]}return o.map(l=>IS(t,l))}return e},uq=e=>typeof e=="string"?e.replace(" ","T"):e,jS=e=>{const t=new URL(e);return t.protocol=t.protocol.replace(/^ws/i,"http"),t.pathname=t.pathname.replace(/\/+$/,"").replace(/\/socket\/websocket$/i,"").replace(/\/socket$/i,"").replace(/\/websocket$/i,""),t.pathname===""||t.pathname==="/"?t.pathname="/api/broadcast":t.pathname=t.pathname+"/api/broadcast",t.href};class Yh{constructor(t,a,n={},r=Mm){this.channel=t,this.event=a,this.payload=n,this.timeout=r,this.sent=!1,this.timeoutTimer=void 0,this.ref="",this.receivedResp=null,this.recHooks=[],this.refEvent=null}resend(t){this.timeout=t,this._cancelRefEvent(),this.ref="",this.refEvent=null,this.receivedResp=null,this.sent=!1,this.send()}send(){this._hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload,ref:this.ref,join_ref:this.channel._joinRef()}))}updatePayload(t){this.payload=Object.assign(Object.assign({},this.payload),t)}receive(t,a){var n;return this._hasReceived(t)&&a((n=this.receivedResp)===null||n===void 0?void 0:n.response),this.recHooks.push({status:t,callback:a}),this}startTimeout(){if(this.timeoutTimer)return;this.ref=this.channel.socket._makeRef(),this.refEvent=this.channel._replyEventName(this.ref);const t=a=>{this._cancelRefEvent(),this._cancelTimeout(),this.receivedResp=a,this._matchReceive(a)};this.channel._on(this.refEvent,{},t),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}trigger(t,a){this.refEvent&&this.channel._trigger(this.refEvent,{status:t,response:a})}destroy(){this._cancelRefEvent(),this._cancelTimeout()}_cancelRefEvent(){this.refEvent&&this.channel._off(this.refEvent,{})}_cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=void 0}_matchReceive({status:t,response:a}){this.recHooks.filter(n=>n.status===t).forEach(n=>n.callback(a))}_hasReceived(t){return this.receivedResp&&this.receivedResp.status===t}}var Wb;(function(e){e.SYNC="sync",e.JOIN="join",e.LEAVE="leave"})(Wb||(Wb={}));class Ks{constructor(t,a){this.channel=t,this.state={},this.pendingDiffs=[],this.joinRef=null,this.enabled=!1,this.caller={onJoin:()=>{},onLeave:()=>{},onSync:()=>{}};const n=(a==null?void 0:a.events)||{state:"presence_state",diff:"presence_diff"};this.channel._on(n.state,{},r=>{const{onJoin:o,onLeave:s,onSync:l}=this.caller;this.joinRef=this.channel._joinRef(),this.state=Ks.syncState(this.state,r,o,s),this.pendingDiffs.forEach(c=>{this.state=Ks.syncDiff(this.state,c,o,s)}),this.pendingDiffs=[],l()}),this.channel._on(n.diff,{},r=>{const{onJoin:o,onLeave:s,onSync:l}=this.caller;this.inPendingSyncState()?this.pendingDiffs.push(r):(this.state=Ks.syncDiff(this.state,r,o,s),l())}),this.onJoin((r,o,s)=>{this.channel._trigger("presence",{event:"join",key:r,currentPresences:o,newPresences:s})}),this.onLeave((r,o,s)=>{this.channel._trigger("presence",{event:"leave",key:r,currentPresences:o,leftPresences:s})}),this.onSync(()=>{this.channel._trigger("presence",{event:"sync"})})}static syncState(t,a,n,r){const o=this.cloneDeep(t),s=this.transformState(a),l={},c={};return this.map(o,(d,u)=>{s[d]||(c[d]=u)}),this.map(s,(d,u)=>{const h=o[d];if(h){const m=u.map(v=>v.presence_ref),p=h.map(v=>v.presence_ref),b=u.filter(v=>p.indexOf(v.presence_ref)<0),g=h.filter(v=>m.indexOf(v.presence_ref)<0);b.length>0&&(l[d]=b),g.length>0&&(c[d]=g)}else l[d]=u}),this.syncDiff(o,{joins:l,leaves:c},n,r)}static syncDiff(t,a,n,r){const{joins:o,leaves:s}={joins:this.transformState(a.joins),leaves:this.transformState(a.leaves)};return n||(n=()=>{}),r||(r=()=>{}),this.map(o,(l,c)=>{var d;const u=(d=t[l])!==null&&d!==void 0?d:[];if(t[l]=this.cloneDeep(c),u.length>0){const h=t[l].map(p=>p.presence_ref),m=u.filter(p=>h.indexOf(p.presence_ref)<0);t[l].unshift(...m)}n(l,u,c)}),this.map(s,(l,c)=>{let d=t[l];if(!d)return;const u=c.map(h=>h.presence_ref);d=d.filter(h=>u.indexOf(h.presence_ref)<0),t[l]=d,r(l,d,c),d.length===0&&delete t[l]}),t}static map(t,a){return Object.getOwnPropertyNames(t).map(n=>a(n,t[n]))}static transformState(t){return t=this.cloneDeep(t),Object.getOwnPropertyNames(t).reduce((a,n)=>{const r=t[n];return"metas"in r?a[n]=r.metas.map(o=>(o.presence_ref=o.phx_ref,delete o.phx_ref,delete o.phx_ref_prev,o)):a[n]=r,a},{})}static cloneDeep(t){return JSON.parse(JSON.stringify(t))}onJoin(t){this.caller.onJoin=t}onLeave(t){this.caller.onLeave=t}onSync(t){this.caller.onSync=t}inPendingSyncState(){return!this.joinRef||this.joinRef!==this.channel._joinRef()}}var $b;(function(e){e.ALL="*",e.INSERT="INSERT",e.UPDATE="UPDATE",e.DELETE="DELETE"})($b||($b={}));var Ys;(function(e){e.BROADCAST="broadcast",e.PRESENCE="presence",e.POSTGRES_CHANGES="postgres_changes",e.SYSTEM="system"})(Ys||(Ys={}));var yn;(function(e){e.SUBSCRIBED="SUBSCRIBED",e.TIMED_OUT="TIMED_OUT",e.CLOSED="CLOSED",e.CHANNEL_ERROR="CHANNEL_ERROR"})(yn||(yn={}));class mi{constructor(t,a={config:{}},n){var r,o;
441if(this.topic=t,this.params=a,this.socket=n,this.bindings={},this.state=lt.closed,this.joinedOnce=!1,this.pushBuffer=[],this.subTopic=t.replace(/^realtime:/i,""),this.params.config=Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},a.config),this.timeout=this.socket.timeout,this.joinPush=new Yh(this,Ma.join,this.params,this.timeout),this.rejoinTimer=new TS(()=>this._rejoinUntilConnected(),this.socket.reconnectAfterMs),this.joinPush.receive("ok",()=>{this.state=lt.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(s=>s.send()),this.pushBuffer=[]}),this._onClose(()=>{this.rejoinTimer.reset(),this.socket.log("channel",`close ${this.topic} ${this._joinRef()}`),this.state=lt.closed,this.socket._remove(this)}),this._onError(s=>{this._isLeaving()||this._isClosed()||(this.socket.log("channel",`error ${this.topic}`,s),this.state=lt.errored,this.rejoinTimer.scheduleTimeout())}),this.joinPush.receive("timeout",()=>{this._isJoining()&&(this.socket.log("channel",`timeout ${this.topic}`,this.joinPush.timeout),this.state=lt.errored,this.rejoinTimer.scheduleTimeout())}),this.joinPush.receive("error",s=>{this._isLeaving()||this._isClosed()||(this.socket.log("channel",`error ${this.topic}`,s),this.state=lt.errored,this.rejoinTimer.scheduleTimeout())}),this._on(Ma.reply,{},(s,l)=>{this._trigger(this._replyEventName(l),s)}),this.presence=new Ks(this),this.broadcastEndpointURL=jS(this.socket.endPoint),this.private=this.params.config.private||!1,!this.private&&(!((o=(r=this.params.config)===null||r===void 0?void 0:r.broadcast)===null||o===void 0)&&o.replay))throw`tried to use replay on public channel '${this.topic}'. It must be a private channel.`}subscribe(t,a=this.timeout){var n,r,o;if(this.socket.isConnected()||this.socket.connect(),this.state==lt.closed){const{config:{broadcast:s,presence:l,private:c}}=this.params,d=(r=(n=this.bindings.postgres_changes)===null||n===void 0?void 0:n.map(p=>p.filter))!==null&&r!==void 0?r:[],u=!!this.bindings[Ys.PRESENCE]&&this.bindings[Ys.PRESENCE].length>0||((o=this.params.config.presence)===null||o===void 0?void 0:o.enabled)===!0,h={},m={broadcast:s,presence:Object.assign(Object.assign({},l),{enabled:u}),postgres_changes:d,private:c};this.socket.accessTokenValue&&(h.access_token=this.socket.accessTokenValue),this._onError(p=>t==null?void 0:t(yn.CHANNEL_ERROR,p)),this._onClose(()=>t==null?void 0:t(yn.CLOSED)),this.updateJoinPayload(Object.assign({config:m},h)),this.joinedOnce=!0,this._rejoin(a),this.joinPush.receive("ok",async({postgres_changes:p})=>{var b;if(this.socket._isManualToken()||this.socket.setAuth(),p===void 0){t==null||t(yn.SUBSCRIBED);return}else{const g=this.bindings.postgres_changes,v=(b=g==null?void 0:g.length)!==null&&b!==void 0?b:0,w=[];for(let y=0;y<v;y++){const x=g[y],{filter:{event:k,schema:C,table:S,filter:A}}=x,P=p&&p[y];if(P&&P.event===k&&mi.isFilterValueEqual(P.schema,C)&&mi.isFilterValueEqual(P.table,S)&&mi.isFilterValueEqual(P.filter,A))w.push(Object.assign(Object.assign({},x),{id:P.id}));else{this.unsubscribe(),this.state=lt.errored,t==null||t(yn.CHANNEL_ERROR,new Error("mismatch between server and client bindings for postgres changes"));return}}this.bindings.postgres_changes=w,t&&t(yn.SUBSCRIBED);return}}).receive("error",p=>{this.state=lt.errored,t==null||t(yn.CHANNEL_ERROR,new Error(JSON.stringify(Object.values(p).join(", ")||"error")))}).receive("timeout",()=>{t==null||t(yn.TIMED_OUT)})}return this}presenceState(){return this.presence.state}async track(t,a={}){return await this.send({type:"presence",event:"track",payload:t},a.timeout||this.timeout)}async untrack(t={}){return await this.send({type:"presence",event:"untrack"},t)}on(t,a,n){return this.state===lt.joined&&t===Ys.PRESENCE&&(this.socket.log("channel",`resubscribe to ${this.topic} due to change in presence callbacks on joined channel`),this.unsubscribe().then(async()=>await this.subscribe())),this._on(t,a,n)}async httpSend(t,a,n={}){var r;if(a==null)return Promise.reject("Payload is required for httpSend()");const o={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"};this.socket.accessTokenValue&&(o.Authorization=`Bearer ${this.socket.accessTokenValue}`);const s={method:"POST",headers:o,body:JSON.stringify({messages:[{topic:this.subTopic,event:t,payload:a,private:this.private}]})},l=await this._fetchWithTimeout(this.broadcastEndpointURL,s,(r=n.timeout)!==null&&r!==void 0?r:this.timeout);if(l.status===202)return{success:!0};let c=l.statusText;
441try{const d=await l.json();c=d.error||d.message||c}catch{}return Promise.reject(new Error(c))}async send(t,a={}){var n,r;if(!this._canPush()&&t.type==="broadcast"){console.warn("Realtime send() is automatically falling back to REST API. This behavior will be deprecated in the future. Please use httpSend() explicitly for REST delivery.");const{event:o,payload:s}=t,l={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"};this.socket.accessTokenValue&&(l.Authorization=`Bearer ${this.socket.accessTokenValue}`);const c={method:"POST",headers:l,body:JSON.stringify({messages:[{topic:this.subTopic,event:o,payload:s,private:this.private}]})};try{const d=await this._fetchWithTimeout(this.broadcastEndpointURL,c,(n=a.timeout)!==null&&n!==void 0?n:this.timeout);return await((r=d.body)===null||r===void 0?void 0:r.cancel()),d.ok?"ok":"error"}catch(d){return d.name==="AbortError"?"timed out":"error"}}else return new Promise(o=>{var s,l,c;const d=this._push(t.type,t,a.timeout||this.timeout);t.type==="broadcast"&&!(!((c=(l=(s=this.params)===null||s===void 0?void 0:s.config)===null||l===void 0?void 0:l.broadcast)===null||c===void 0)&&c.ack)&&o("ok"),d.receive("ok",()=>o("ok")),d.receive("error",()=>o("error")),d.receive("timeout",()=>o("timed out"))})}updateJoinPayload(t){this.joinPush.updatePayload(t)}unsubscribe(t=this.timeout){this.state=lt.leaving;const a=()=>{this.socket.log("channel",`leave ${this.topic}`),this._trigger(Ma.close,"leave",this._joinRef())};this.joinPush.destroy();let n=null;return new Promise(r=>{n=new Yh(this,Ma.leave,{},t),n.receive("ok",()=>{a(),r("ok")}).receive("timeout",()=>{a(),r("timed out")}).receive("error",()=>{r("error")}),n.send(),this._canPush()||n.trigger("ok",{})}).finally(()=>{n==null||n.destroy()})}teardown(){this.pushBuffer.forEach(t=>t.destroy()),this.pushBuffer=[],this.rejoinTimer.reset(),this.joinPush.destroy(),this.state=lt.closed,this.bindings={}}async _fetchWithTimeout(t,a,n){const r=new AbortController,o=setTimeout(()=>r.abort(),n),s=await this.socket.fetch(t,Object.assign(Object.assign({},a),{signal:r.signal}));return clearTimeout(o),s}_push(t,a,n=this.timeout){if(!this.joinedOnce)throw`tried to push '${t}' to '${this.topic}' before joining. Use channel.subscribe() before pushing events`;let r=new Yh(this,t,a,n);return this._canPush()?r.send():this._addToPushBuffer(r),r}_addToPushBuffer(t){if(t.startTimeout(),this.pushBuffer.push(t),this.pushBuffer.length>rq){const a=this.pushBuffer.shift();a&&(a.destroy(),this.socket.log("channel",`discarded push due to buffer overflow: ${a.event}`,a.payload))}}_onMessage(t,a,n){return a}_isMember(t){return this.topic===t}_joinRef(){return this.joinPush.ref}_trigger(t,a,n){var r,o;const s=t.toLocaleLowerCase(),{close:l,error:c,leave:d,join:u}=Ma;if(n&&[l,c,d,u].indexOf(s)>=0&&n!==this._joinRef())return;let m=this._onMessage(s,a,n);if(a&&!m)throw"channel onMessage callbacks must return the payload, modified or unmodified";["insert","update","delete"].includes(s)?(r=this.bindings.postgres_changes)===null||r===void 0||r.filter(p=>{var b,g,v;return((b=p.filter)===null||b===void 0?void 0:b.event)==="*"||((v=(g=p.filter)===null||g===void 0?void 0:g.event)===null||v===void 0?void 0:v.toLocaleLowerCase())===s}).map(p=>p.callback(m,n)):(o=this.bindings[s])===null||o===void 0||o.filter(p=>{var b,g,v,w,y,x;if(["broadcast","presence","postgres_changes"].includes(s))if("id"in p){const k=p.id,C=(b=p.filter)===null||b===void 0?void 0:b.event;return k&&((g=a.ids)===null||g===void 0?void 0:g.includes(k))&&(C==="*"||(C==null?void 0:C.toLocaleLowerCase())===((v=a.data)===null||v===void 0?void 0:v.type.toLocaleLowerCase()))}else{const k=(y=(w=p==null?void 0:p.filter)===null||w===void 0?void 0:w.event)===null||y===void 0?void 0:y.toLocaleLowerCase();return k==="*"||k===((x=a==null?void 0:a.event)===null||x===void 0?void 0:x.toLocaleLowerCase())}else return p.type.toLocaleLowerCase()===s}).map(p=>{if(typeof m=="object"&&"ids"in m){const b=m.data,{schema:g,table:v,commit_timestamp:w,type:y,errors:x}=b;m=Object.assign(Object.assign({},{schema:g,table:v,commit_timestamp:w,eventType:y,new:{},old:{},errors:x}),this._getPayloadRecords(b))}p.callback(m,n)})}_isClosed(){return this.state===lt.closed}_isJoined(){return this.state===lt.joined}_isJoining(){return this.state===lt.joining}_isLeaving(){return this.state===lt.leaving}_replyEventName(t){return`chan_reply_${t}`}_on(t,a,n){const r=t.toLocaleLowerCase(),o={type:r,filter:a,callback:n};return this.bindings[r]?this.bindings[r].push(o):this.bindings[r]=[o],this}_off(t,a){const n=t.toLocaleLowerCase();return this.bindings[n]&&(this.bindings[n]=this.bindings[n].filter(r=>{var o;return!(((o=r.type)===null||o===void 0?void 0:o.toLocaleLowerCase())===n&&mi.isEqual(r.filter,a))})),this}static isEqual(t,a){if(Object.keys(t).length!==Object.keys(a).length)return!1;for(const n in t)if(t[n]!==a[n])return!1;return!0}static isFilterValueEqual(t,a){return(t??void 0)===(a??void 0)}_rejoinUntilConnected(){this.rejoinTimer.scheduleTimeout(),this.socket.isConnected()&&this._rejoin()}_onClose(t){this._on(Ma.close,{},t)}_onError(t){this._on(Ma.error,{},a=>t(a))}_canPush(){return this.socket.isConnected()&&this._isJoined()}_rejoin(t=this.timeout){this._isLeaving()||(this.socket._leaveOpenTopic(this.topic),this.state=lt.joining,this.joinPush.resend(t))}_getPayloadRecords(t){const a={new:{},old:{}};return(t.type==="INSERT"||t.type==="UPDATE")&&(a.new=Vb(t.columns,t.record)),(t.type==="UPDATE"||t.type==="DELETE")&&(a.old=Vb(t.columns,t.old_record)),a}}const Jh=()=>{},Ic={HEARTBEAT_INTERVAL:25e3,RECONNECT_DELAY:10,HEARTBEAT_TIMEOUT_FALLBACK:100},hq=[1e3,2e3,5e3,1e4],pq=1e4,mq=` 442 addEventListener("message", (e) => { 443 if (e.data.event === "start") { 444 setInterval(() => postMessage({ event: "keepAlive" }), e.data.interval); 445 } 446 });`;class fq{constructor(t,a){var n;if(this.accessTokenValue=null,this.apiKey=null,this._manuallySetToken=!1,this.channels=new Array,this.endPoint="",this.httpEndpoint="",this.headers={},this.params={},this.timeout=Mm,this.transport=null,this.heartbeatIntervalMs=Ic.HEARTBEAT_INTERVAL,this.heartbeatTimer=void 0,this.pendingHeartbeatRef=null,this.heartbeatCallback=Jh,this.ref=0,this.reconnectTimer=null,this.vsn=Bb,this.logger=Jh,this.conn=null,this.sendBuffer=[],this.serializer
446=new oq,this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.accessToken=null,this._connectionState="disconnected",this._wasManualDisconnect=!1,this._authPromise=null,this._heartbeatSentAt=null,this._resolveFetch=r=>r?(...o)=>r(...o):(...o)=>fetch(...o),!(!((n=a==null?void 0:a.params)===null||n===void 0)&&n.apikey))throw new Error("API key is required to connect to Realtime");this.apiKey=a.params.apikey,this.endPoint=`${t}/${Lm.websocket}`,this.httpEndpoint=jS(t),this._initializeOptions(a),this._setupReconnectionTimer(),this.fetch=this._resolveFetch(a==null?void 0:a.fetch)}connect(){if(!(this.isConnecting()||this.isDisconnecting()||this.conn!==null&&this.isConnected())){if(this._setConnectionState("connecting"),this.accessToken&&!this._authPromise&&this._setAuthSafely("connect"),this.transport)this.conn=new this.transport(this.endpointURL());else try{this.conn=X_.createWebSocket(this.endpointURL())}catch(t){this._setConnectionState("disconnected");const a=t.message;throw a.includes("Node.js")?new Error(`${a} 447 448To use Realtime in Node.js, you need to provide a WebSocket implementation: 449 450Option 1: Use Node.js 22+ which has native WebSocket support 451Option 2: Install and provide the "ws" package: 452 453 npm install ws 454 455 import ws from "ws" 456 const client = new RealtimeClient(url, { 457 ...options, 458 transport: ws 459 })`):new Error(`WebSocket not available: ${a}`)}this._setupConnectionHandlers()}}endpointURL(){return this._appendParams(this.endPoint,Object.assign({},this.params,{vsn:this.vsn}))}disconnect(t,a){if(!this.isDisconnecting())if(this._setConnectionState("disconnecting",!0),this.conn){const n=setTimeout(()=>{this._setConnectionState("disconnected")},100);this.conn.onclose=()=>{clearTimeout(n),this._setConnectionState("disconnected")},typeof this.conn.close=="function"&&(t?this.conn.close(t,a??""):this.conn.close()),this._teardownConnection()}else this._setConnectionState("disconnected")}getChannels(){return this.channels}async removeChannel(t){const a=await t.unsubscribe();return a==="ok"&&this._remove(t),this.channels.length===0&&this.disconnect(),a}async removeAllChannels(){const t=await Promise.all(this.channels.map(a=>a.unsubscribe()));return this.channels=[],this.disconnect(),t}log(t,a,n){this.logger(t,a,n)}connectionState(){switch(this.conn&&this.conn.readyState){case Yn.connecting:return $r.Connecting;case Yn.open:return $r.Open;case Yn.closing:return $r.Closing;default:return $r.Closed}}isConnected(){return this.connectionState()===$r.Open}isConnecting(){return this._connectionState==="connecting"}isDisconnecting(){return this._connectionState==="disconnecting"}channel(t,a={config:{}}){const n=`realtime:${t}`,r=this.getChannels().find(o=>o.topic===n);if(r)return r;{const o=new mi(`realtime:${t}`,a,this);return this.channels.push(o),o}}push(t){const{topic:a,event:n,payload:r,ref:o}=t,s=()=>{this.encode(t,l=>{var c;(c=this.conn)===null||c===void 0||c.send(l)})};this.log("push",`${a} ${n} (${o})`,r),this.isConnected()?s():this.sendBuffer.push(s)}async setAuth(t=null){this._authPromise=this._performAuth(t);try{await this._authPromise}finally{this._authPromise=null}}_isManualToken(){return this._manuallySetToken}async sendHeartbeat(){var t;if(!this.isConnected()){try{this.heartbeatCallback("disconnected")}catch(a){this.log("error","error in heartbeat callback",a)}return}if(this.pendingHeartbeatRef){this.pendingHeartbeatRef=null,this._heartbeatSentAt=null,this.log("transport","heartbeat timeout. Attempting to re-establish connection");try{this.heartbeatCallback("timeout")}catch(a){this.log("error","error in heartbeat callback",a)}this._wasManualDisconnect=!1,(t=this.conn)===null||t===void 0||t.close(nq,"heartbeat timeout"),setTimeout(()=>{var a;this.isConnected()||(a=this.reconnectTimer)===null||a===void 0||a.scheduleTimeout()},Ic.HEARTBEAT_TIMEOUT_FALLBACK);return}this._heartbeatSentAt=Date.now(),this.pendingHeartbeatRef=this._makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef});try{this.heartbeatCallback("sent")}catch(a){this.log("error","error in heartbeat callback",a)}this._setAuthSafely("heartbeat")}onHeartbeat(t){this.heartbeatCallback=t}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(t=>t()),this.sendBuffer=[])}_makeRef(){let t=this.ref+1;return t===this.ref?this.ref=0:this.ref=t,this.ref.toString()}_leaveOpenTopic(t){let a=this.channels.find(n=>n.topic===t&&(n._isJoined()||n._isJoining()));a&&(this.log("transport",`leaving duplicate topic "${t}"`),a.unsubscribe())}_remove(t){this.channels=this.channels.filter(a=>a.topic!==t.topic)}_onConnMessage(t){this.decode(t.data,a=>{if(a.topic==="phoenix"&&a.event==="phx_reply"&&a.ref&&a.ref===this.pendingHeartbeatRef){const d=this._heartbeatSentAt?Date.now()-this._heartbeatSentAt:void 0;try{this.heartbeatCallback(a.payload.status==="ok"?"ok":"error",d)}catch(u){this.log("error","error in heartbeat callback",u)}this._heartbeatSentAt=null,this.pendingHeartbeatRef=null}const{topic:n,event:r,payload:o,ref:s}=a,l=s?`(${s})`:"",c=o.status||"";this.log("receive",`${c} ${n} ${r} ${l}`.trim(),o),this.channels.filter(d=>
459d._isMember(n)).forEach(d=>d._trigger(r,o,s)),this._triggerStateCallbacks("message",a)})}_clearTimer(t){var a;t==="heartbeat"&&this.heartbeatTimer?(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0):t==="reconnect"&&((a=this.reconnectTimer)===null||a===void 0||a.reset())}_clearAllTimers(){this._clearTimer("heartbeat"),this._clearTimer("reconnect")}_setupConnectionHandlers(){this.conn&&("binaryType"in this.conn&&(this.conn.binaryType="arraybuffer"),this.conn.onopen=()=>this._onConnOpen(),this.conn.onerror=t=>this._onConnError(t),this.conn.onmessage=t=>this._onConnMessage(t),this.conn.onclose=t=>this._onConnClose(t),this.conn.readyState===Yn.open&&this._onConnOpen())}_teardownConnection(){if(this.conn){if(this.conn.readyState===Yn.open||this.conn.readyState===Yn.connecting)try{this.conn.close()}catch(t){this.log("error","Error closing connection",t)}this.conn.onopen=null,this.conn.onerror=null,this.conn.onmessage=null,this.conn.onclose=null,this.conn=null}this._clearAllTimers(),this._terminateWorker(),this.channels.forEach(t=>t.teardown())}_onConnOpen(){this._setConnectionState("connected"),this.log("transport",`connected to ${this.endpointURL()}`),(this._authPromise||(this.accessToken&&!this.accessTokenValue?this.setAuth():Promise.resolve())).then(()=>{this.flushSendBuffer()}).catch(a=>{this.log("error","error waiting for auth on connect",a),this.flushSendBuffer()}),this._clearTimer("reconnect"),this.worker?this.workerRef||this._startWorkerHeartbeat():this._startHeartbeat(),this._triggerStateCallbacks("open")}_startHeartbeat(){this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(()=>this.sendHeartbeat(),this.heartbeatIntervalMs)}_startWorkerHeartbeat(){this.workerUrl?this.log("worker",`starting worker for from ${this.workerUrl}`):this.log("worker","starting default worker");const t=this._workerObjectUrl(this.workerUrl);this.workerRef=new Worker(t),this.workerRef.onerror=a=>{this.log("worker","worker error",a.message),this._terminateWorker()},this.workerRef.onmessage=a=>{a.data.event==="keepAlive"&&this.sendHeartbeat()},this.workerRef.postMessage({event:"start",interval:this.heartbeatIntervalMs})}_terminateWorker(){this.workerRef&&(this.log("worker","terminating worker"),this.workerRef.terminate(),this.workerRef=void 0)}_onConnClose(t){var a;this._setConnectionState("disconnected"),this.log("transport","close",t),this._triggerChanError(),this._clearTimer("heartbeat"),this._wasManualDisconnect||(a=this.reconnectTimer)===null||a===void 0||a.scheduleTimeout(),this._triggerStateCallbacks("close",t)}_onConnError(t){this._setConnectionState("disconnected"),this.log("transport",`${t}`),this._triggerChanError(),this._triggerStateCallbacks("error",t);try{this.heartbeatCallback("error")}catch(a){this.log("error","error in heartbeat callback",a)}}_triggerChanError(){this.channels.forEach(t=>t._trigger(Ma.error))}_appendParams(t,a){if(Object.keys(a).length===0)return t;const n=t.match(/\?/)?"&":"?",r=new URLSearchParams(a);return`${t}${n}${r}`}_workerObjectUrl(t){let a;if(t)a=t;else{const n=new Blob([mq],{type:"application/javascript"});a=URL.createObjectURL(n)}return a}_setConnectionState(t,a=!1){this._connectionState=t,t==="connecting"?this._wasManualDisconnect=!1:t==="disconnecting"&&(this._wasManualDisconnect=a)}async _performAuth(t=null){let a,n=!1;if(t)a=t,n=!0;else if(this.accessToken)try{a=await this.accessToken()}catch(r){this.log("error","Error fetching access token from callback",r),a=this.accessTokenValue}else a=this.accessTokenValue;n?this._manuallySetToken=!0:this.accessToken&&(this._manuallySetToken=!1),this.accessTokenValue!=a&&(this.accessTokenValue=a,this.channels.forEach(r=>{const o={access_token:a,version:tq};a&&r.updateJoinPayload(o),r.joinedOnce&&r._isJoined()&&r._push(Ma.access_token,{access_token:a})}))}async _waitForAuthIfNeeded(){this._authPromise&&await this._authPromise}_setAuthSafely(t="general"){this._isManualToken()||this.setAuth().catch(a=>{this.log("error",`Error setting auth in ${t}`,a)})}_triggerStateCallbacks(t,a){try{this.stateChangeCallbacks[t].forEach(n=>{try{n(a)}catch(r){this.log("error",`error in ${t} callback`,r)}})}catch(n){this.log("error",`error triggering ${t} callbacks`,n)}}_setupReconnectionTimer(){this.reconnectTimer=new TS(async()=>{setTimeout(async()=>{await this._waitForAuthIfNeeded(),this.isConnected()||this.connect()},Ic.RECONNECT_DELAY)},this.reconnectAfterMs)}_initializeOptions(t){var a,n,r,o,s,l,c,d,u,h,m,p;switch(this.transport=(a=t==null?void 0:t.transport)!==null&&a!==void 0?a:null,this.timeout=(n=t==null?void 0:t.t
459imeout)!==null&&n!==void 0?n:Mm,this.heartbeatIntervalMs=(r=t==null?void 0:t.heartbeatIntervalMs)!==null&&r!==void 0?r:Ic.HEARTBEAT_INTERVAL,this.worker=(o=t==null?void 0:t.worker)!==null&&o!==void 0?o:!1,this.accessToken=(s=t==null?void 0:t.accessToken)!==null&&s!==void 0?s:null,this.heartbeatCallback=(l=t==null?void 0:t.heartbeatCallback)!==null&&l!==void 0?l:Jh,this.vsn=(c=t==null?void 0:t.vsn)!==null&&c!==void 0?c:Bb,t!=null&&t.params&&(this.params=t.params),t!=null&&t.logger&&(this.logger=t.logger),(t!=null&&t.logLevel||t!=null&&t.log_level)&&(this.logLevel=t.logLevel||t.log_level,this.params=Object.assign(Object.assign({},this.params),{log_level:this.logLevel})),this.reconnectAfterMs=(d=t==null?void 0:t.reconnectAfterMs)!==null&&d!==void 0?d:b=>hq[b-1]||pq,this.vsn){case aq:this.encode=(u=t==null?void 0:t.encode)!==null&&u!==void 0?u:(b,g)=>g(JSON.stringify(b)),this.decode=(h=t==null?void 0:t.decode)!==null&&h!==void 0?h:(b,g)=>g(JSON.parse(b));break;case PS:this.encode=(m=t==null?void 0:t.encode)!==null&&m!==void 0?m:this.serializer.encode.bind(this.serializer),this.decode=(p=t==null?void 0:t.decode)!==null&&p!==void 0?p:this.serializer.decode.bind(this.serializer);break;default:throw new Error(`Unsupported serializer version: ${this.vsn}`)}if(this.worker){if(typeof window<"u"&&!window.Worker)throw new Error("Web Worker is not supported");this.workerUrl=t==null?void 0:t.workerUrl}}}var Pl=class extends Error{constructor(e,t){var a;super(e),this.name="IcebergError",this.status=t.status,this.icebergType=t.icebergType,this.icebergCode=t.icebergCode,this.details=t.details,this.isCommitStateUnknown=t.icebergType==="CommitStateUnknownException"||[500,502,504].includes(t.status)&&((a=t.icebergType)==null?void 0:a.includes("CommitState"))===!0}isNotFound(){return this.status===404}isConflict(){return this.status===409}isAuthenticationTimeout(){return this.status===419}};function gq(e,t,a){const n=new URL(t,e);if(a)for(const[r,o]of Object.entries(a))o!==void 0&&n.searchParams.set(r,o);return n.toString()}async function yq(e){return!e||e.type==="none"?{}:e.type==="bearer"?{Authorization:`Bearer ${e.token}`}:e.type==="header"?{[e.name]:e.value}:e.type==="custom"?await e.getHeaders():{}}function vq(e){const t=e.fetchImpl??globalThis.fetch;return{async request({method:a,path:n,query:r,body:o,headers:s}){const l=gq(e.baseUrl,n,r),c=await yq(e.auth),d=await t(l,{method:a,headers:{...o?{"Content-Type":"application/json"}:{},...c,...s},body:o?JSON.stringify(o):void 0}),u=await d.text(),h=(d.headers.get("content-type")||"").includes("application/json"),m=h&&u?JSON.parse(u):u;if(!d.ok){const p=h?m:void 0,b=p==null?void 0:p.error;throw new Pl((b==null?void 0:b.message)??`Request failed with status ${d.status}`,{status:d.status,icebergType:b==null?void 0:b.type,icebergCode:b==null?void 0:b.code,details:p})}return{status:d.status,headers:d.headers,data:m}}}}function jc(e){return e.join("�")}var bq=class{constructor(e,t=""){this.client=e,this.prefix=t}async listNamespaces(e){const t=e?{parent:jc(e.namespace)}:void 0;return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces`,query:t})).data.namespaces.map(n=>({namespace:n}))}async createNamespace(e,t){const a={namespace:e.namespace,properties:t==null?void 0:t.properties};return(await this.client.request({method:"POST",path:`${this.prefix}/namespaces`,body:a})).data}async dropNamespace(e){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${jc(e.namespace)}`})}async loadNamespaceMetadata(e){return{properties:(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${jc(e.namespace)}`})).data.properties}}async namespaceExists(e){try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${jc(e.namespace)}`}),!0}catch(t){if(t instanceof Pl&&t.status===404)return!1;throw t}}async createNamespaceIfNotExists(e,t){try{return await this.createNamespace(e,t)}catch(a){if(a instanceof Pl&&a.status===409)return;throw a}}};function Go(e){return e.join("�")}var wq=class{constructor(e,t="",a){this.client=e,this.prefix=t,this.accessDelegation=a}async listTables(e){return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables`})).data.identifiers}async createTable(e,t){const a={};return this.accessDelegation&&(a["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables`,body:t,headers:a})).data.metadata}async updateTable(e,t){const a=await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables/${e.name}`,body:t});return{"metadata-location":a.data["metadata-location"],metadata:a.data.metadata}}async dropTable(e,t){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables/${e.name}`,query:{purgeRequested:String((t==null?void 0:t.purge)??!1)}})}async loadTable(e){const t={};return this.accessDelegation&&(t["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables/${e.name}`,headers:t})).data.metadata}async tableExists(e){const t={};this.accessDelegation&&(t["X-Iceberg-Access-Delegation"]=this.accessDelegation);try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${Go(e.namespace)}/tables/${e.name}`,headers:t}),!0}catch(a){if(a instanceof Pl&&a.status===404)return!1;throw a}}async createTableIfNotExists(e,t){try{return await this.createTable(e,t)}catch(a){if(a instanceof Pl&&a.status===409)return await this.loadTable({namespace:e.namespace,name:t.name});throw a}}},xq=class{constructor(e){var n;let t="v1";e.catalogName&&(t+=`/${e.catalogName}`);const a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;this.client=vq({baseUrl:a,auth:e.auth,fetchImpl:e.fetch}),this.accessDelegation=(n=e.accessDelegation)==null?void 0:n.join(","),this.namespaceOps=new bq(this.client,t),this.tableOps=new wq(this.client,t,this.accessDelegation)}async listNamespaces(e){return this.namespaceOps.listNamespaces(e)}async createNamespace(e,t){return this.namespaceOps.createNamespace(e,t)}async dropNamespace(e){await this.namespaceOps.dropNamespace(e)}async loadNamespaceMetadata(e){return this.namespaceOps.loadNamespaceMetadata(e)}async listTables(e){return this.tableOps.listTables(e)}
459async createTable(e,t){return this.tableOps.createTable(e,t)}async updateTable(e,t){return this.tableOps.updateTable(e,t)}async dropTable(e,t){await this.tableOps.dropTable(e,t)}async loadTable(e){return this.tableOps.loadTable(e)}async namespaceExists(e){return this.namespaceOps.namespaceExists(e)}async tableExists(e){return this.tableOps.tableExists(e)}async createNamespaceIfNotExists(e,t){return this.namespaceOps.createNamespaceIfNotExists(e,t)}async createTableIfNotExists(e,t){return this.tableOps.createTableIfNotExists(e,t)}},Lu=class extends Error{constructor(e,t="storage",a,n){super(e),this.__isStorageError=!0,this.namespace=t,this.name=t==="vectors"?"StorageVectorsError":"StorageError",this.status=a,this.statusCode=n}};function Ou(e){return typeof e=="object"&&e!==null&&"__isStorageError"in e}var Nc=class extends Lu{constructor(e,t,a,n="storage"){super(e,n,t,a),this.name=n==="vectors"?"StorageVectorsApiError":"StorageApiError",this.status=t,this.statusCode=a}toJSON(){return{name:this.name,message:this.message,status:this.status,statusCode:this.statusCode}}},NS=class extends Lu{constructor(e,t,a="storage"){super(e,a),this.name=a==="vectors"?"StorageVectorsUnknownError":"StorageUnknownError",this.originalError=t}};const kq=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),Cq=e=>{if(typeof e!="object"||e===null)return!1;const t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Gm=e=>{if(Array.isArray(e))return e.map(a=>Gm(a));if(typeof e=="function"||e!==Object(e))return e;const t={};return Object.entries(e).forEach(([a,n])=>{const r=a.replace(/([-_][a-z])/gi,o=>o.toUpperCase().replace(/[-_]/g,""));t[r]=Gm(n)}),t},Sq=e=>!e||typeof e!="string"||e.length===0||e.length>100||e.trim()!==e||e.includes("/")||e.includes("\\")?!1:/^[\w!.\*'() &$@=;:+,?-]+$/.test(e);function Tl(e){"@babel/helpers - typeof";return Tl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Tl(e)}function Aq(e,t){if(Tl(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var n=a.call(e,t||"default");if(Tl(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Pq(e){var t=Aq(e,"string");return Tl(t)=="symbol"?t:t+""}function Tq(e,t,a){return(t=Pq(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Kb(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),a.push.apply(a,n)}return a}function de(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?Kb(Object(a),!0).forEach(function(n){Tq(e,n,a[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):Kb(Object(a)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))})}return e}const Yb=e=>{var t;return e.msg||e.message||e.error_description||(typeof e.error=="string"?e.error:(t=e.error)===null||t===void 0?void 0:t.message)||JSON.stringify(e)},Iq=async(e,t,a,n)=>{if(e&&typeof e=="object"&&"status"in e&&"ok"in e&&typeof e.status=="number"&&!(a!=null&&a.noResolveJson)){const r=e,o=r.status||500;if(typeof r.json=="function")r.json().then(s=>{const l=(s==null?void 0:s.statusCode)||(s==null?void 0:s.code)||o+"";t(new Nc(Yb(s),o,l,n))}).catch(()=>{if(n==="vectors"){const s=o+"";t(new Nc(r.statusText||`HTTP ${o} error`,o,s,n))}else{const s=o+"";t(new Nc(r.statusText||`HTTP ${o} error`,o,s,n))}});else{const s=o+"";t(new Nc(r.statusText||`HTTP ${o} error`,o,s,n))}}else t(new NS(Yb(e),e,n))},jq=(e,t,a,n)=>{const r={method:e,headers:(t==null?void 0:t.headers)||{}};return e==="GET"||e==="HEAD"||!n?de(de({},r),a):(Cq(n)?(r.headers=de({"Content-Type":"application/json"},t==null?void 0:t.headers),r.body=JSON.stringify(n)):r.body=n,t!=null&&t.duplex&&(r.duplex=t.duplex),de(de({},r),a))};async function Ss(e,t,a,n,r,o,s){return new Promise((l,c)=>{e(a,jq(t,n,r,o)).then(d=>{if(!d.ok)throw d;if(n!=null&&n.noResolveJson)return d;if(s==="vectors"){const u=d.headers.get("content-type");if(d.headers.get("content-length")==="0"||d.status===204)return{};if(!u||!u.includes("application/json"))return{}}return d.json()}).then(d=>l(d)).catch(d=>Iq(d,c,n,s))})}function ES(e="storage"){return{get:async(t,a,n,r)=>
459Ss(t,"GET",a,n,r,void 0,e),post:async(t,a,n,r,o)=>Ss(t,"POST",a,r,o,n,e),put:async(t,a,n,r,o)=>Ss(t,"PUT",a,r,o,n,e),head:async(t,a,n,r)=>Ss(t,"HEAD",a,de(de({},n),{},{noResolveJson:!0}),r,void 0,e),remove:async(t,a,n,r,o)=>Ss(t,"DELETE",a,r,o,n,e)}}const Nq=ES("storage"),{get:Il,post:Da,put:Fm,head:Eq,remove:ey}=Nq,Zt=ES("vectors");var cs=class{constructor(e,t={},a,n="storage"){this.shouldThrowOnError=!1,this.url=e,this.headers=t,this.fetch=kq(a),this.namespace=n}throwOnError(){return this.shouldThrowOnError=!0,this}async handleOperation(e){var t=this;try{return{data:await e(),error:null}}catch(a){if(t.shouldThrowOnError)throw a;if(Ou(a))return{data:null,error:a};throw a}}},zq=class{constructor(e,t){this.downloadFn=e,this.shouldThrowOnError=t}then(e,t){return this.execute().then(e,t)}async execute(){var e=this;try{return{data:(await e.downloadFn()).body,error:null}}catch(t){if(e.shouldThrowOnError)throw t;if(Ou(t))return{data:null,error:t};throw t}}};let zS;zS=Symbol.toStringTag;var Rq=class{constructor(e,t){this.downloadFn=e,this.shouldThrowOnError=t,this[zS]="BlobDownloadBuilder",this.promise=null}asStream(){return new zq(this.downloadFn,this.shouldThrowOnError)}then(e,t){return this.getPromise().then(e,t)}catch(e){return this.getPromise().catch(e)}finally(e){return this.getPromise().finally(e)}getPromise(){return this.promise||(this.promise=this.execute()),this.promise}async execute(){var e=this;try{return{data:await(await e.downloadFn()).blob(),error:null}}catch(t){if(e.shouldThrowOnError)throw t;if(Ou(t))return{data:null,error:t};throw t}}};const Dq={limit:100,offset:0,sortBy:{column:"name",order:"asc"}},Jb={cacheControl:"3600",contentType:"text/plain;charset=UTF-8",upsert:!1};var _q=class extends cs{constructor(e,t={},a,n){super(e,t,n,"storage"),this.bucketId=a}async uploadOrUpdate(e,t,a,n){var r=this;return r.handleOperation(async()=>{let o;const s=de(de({},Jb),n);let l=de(de({},r.headers),e==="POST"&&{"x-upsert":String(s.upsert)});const c=s.metadata;typeof Blob<"u"&&a instanceof Blob?(o=new FormData,o.append("cacheControl",s.cacheControl),c&&o.append("metadata",r.encodeMetadata(c)),o.append("",a)):typeof FormData<"u"&&a instanceof FormData?(o=a,o.has("cacheControl")||o.append("cacheControl",s.cacheControl),c&&!o.has("metadata")&&o.append("metadata",r.encodeMetadata(c))):(o=a,l["cache-control"]=`max-age=${s.cacheControl}`,l["content-type"]=s.contentType,c&&(l["x-metadata"]=r.toBase64(r.encodeMetadata(c))),(typeof ReadableStream<"u"&&o instanceof ReadableStream||o&&typeof o=="object"&&"pipe"in o&&typeof o.pipe=="function")&&!s.duplex&&(s.duplex="half")),n!=null&&n.headers&&(l=de(de({},l),n.headers));const d=r._removeEmptyFolders(t),u=r._getFinalPath(d),h=await(e=="PUT"?Fm:Da)(r.fetch,`${r.url}/object/${u}`,o,de({headers:l},s!=null&&s.duplex?{duplex:s.duplex}:{}));return{path:d,id:h.Id,fullPath:h.Key}})}async upload(e,t,a){return this.uploadOrUpdate("POST",e,t,a)}async uploadToSignedUrl(e,t,a,n){var r=this;const o=r._removeEmptyFolders(e),s=r._getFinalPath(o),l=new URL(r.url+`/object/upload/sign/${s}`);return l.searchParams.set("token",t),r.handleOperation(async()=>{let c;const d=de({upsert:Jb.upsert},n),u=de(de({},r.headers),{"x-upsert":String(d.upsert)});return typeof Blob<"u"&&a instanceof Blob?(c=new FormData,c.append("cacheControl",d.cacheControl),c.append("",a)):typeof FormData<"u"&&a instanceof FormData?(c=a,c.append("cacheControl",d.cacheControl)):(c=a,u["cache-control"]=`max-age=${d.cacheControl}`,u["content-type"]=d.contentType),{path:o,fullPath:(await Fm(r.fetch,l.toString(),c,{headers:u})).Key}})}async createSignedUploadUrl(e,t){var a=this;return a.handleOperation(async()=>{let n=a._getFinalPath(e);const r=de({},a.headers);t!=null&&t.upsert&&(r["x-upsert"]="true");const o=await Da(a.fetch,`${a.url}/object/upload/sign/${n}`,{},{headers:r}),s=new URL(a.url+o.url),l=s.searchParams.get("token");if(!l)throw new Lu("No token returned by API");return{signedUrl:s.toString(),path:e,token:l}})}async update(e,t,a){return this.uploadOrUpdate("PUT",e,t,a)}async move(e,t,a){var n=this;return n.handleOperation(async()=>await Da(n.fetch,`${n.url}/object/move`,{bucketId:n.bucketId,sourceKey:e,destinationKey:t,de
459stinationBucket:a==null?void 0:a.destinationBucket},{headers:n.headers}))}async copy(e,t,a){var n=this;return n.handleOperation(async()=>({path:(await Da(n.fetch,`${n.url}/object/copy`,{bucketId:n.bucketId,sourceKey:e,destinationKey:t,destinationBucket:a==null?void 0:a.destinationBucket},{headers:n.headers})).Key}))}async createSignedUrl(e,t,a){var n=this;return n.handleOperation(async()=>{let r=n._getFinalPath(e),o=await Da(n.fetch,`${n.url}/object/sign/${r}`,de({expiresIn:t},a!=null&&a.transform?{transform:a.transform}:{}),{headers:n.headers});const s=a!=null&&a.download?`&download=${a.download===!0?"":a.download}`:"";return{signedUrl:encodeURI(`${n.url}${o.signedURL}${s}`)}})}async createSignedUrls(e,t,a){var n=this;return n.handleOperation(async()=>{const r=await Da(n.fetch,`${n.url}/object/sign/${n.bucketId}`,{expiresIn:t,paths:e},{headers:n.headers}),o=a!=null&&a.download?`&download=${a.download===!0?"":a.download}`:"";return r.map(s=>de(de({},s),{},{signedUrl:s.signedURL?encodeURI(`${n.url}${s.signedURL}${o}`):null}))})}download(e,t,a){const n=typeof(t==null?void 0:t.transform)<"u"?"render/image/authenticated":"object",r=this.transformOptsToQueryString((t==null?void 0:t.transform)||{}),o=r?`?${r}`:"",s=this._getFinalPath(e),l=()=>Il(this.fetch,`${this.url}/${n}/${s}${o}`,{headers:this.headers,noResolveJson:!0},a);return new Rq(l,this.shouldThrowOnError)}async info(e){var t=this;const a=t._getFinalPath(e);return t.handleOperation(async()=>Gm(await Il(t.fetch,`${t.url}/object/info/${a}`,{headers:t.headers})))}async exists(e){var t=this;const a=t._getFinalPath(e);try{return await Eq(t.fetch,`${t.url}/object/${a}`,{headers:t.headers}),{data:!0,error:null}}catch(n){if(t.shouldThrowOnError)throw n;if(Ou(n)&&n instanceof NS){const r=n.originalError;if([400,404].includes(r==null?void 0:r.status))return{data:!1,error:n}}throw n}}getPublicUrl(e,t){const a=this._getFinalPath(e),n=[],r=t!=null&&t.download?`download=${t.download===!0?"":t.download}`:"";r!==""&&n.push(r);const o=typeof(t==null?void 0:t.transform)<"u"?"render/image":"object",s=this.transformOptsToQueryString((t==null?void 0:t.transform)||{});s!==""&&n.push(s);let l=n.join("&");return l!==""&&(l=`?${l}`),{data:{publicUrl:encodeURI(`${this.url}/${o}/public/${a}${l}`)}}}async remove(e){var t=this;return t.handleOperation(async()=>await ey(t.fetch,`${t.url}/object/${t.bucketId}`,{prefixes:e},{headers:t.headers}))}async list(e,t,a){var n=this;return n.handleOperation(async()=>{const r=de(de(de({},Dq),t),{},{prefix:e||""});return await Da(n.fetch,`${n.url}/object/list/${n.bucketId}`,r,{headers:n.headers},a)})}async listV2(e,t){var a=this;return a.handleOperation(async()=>{const n=de({},e);return await Da(a.fetch,`${a.url}/object/list-v2/${a.bucketId}`,n,{headers:a.headers},t)})}encodeMetadata(e){return JSON.stringify(e)}toBase64(e){return typeof Buffer<"u"?Buffer.from(e).toString("base64"):btoa(e)}_getFinalPath(e){return`${this.bucketId}/${e.replace(/^\/+/,"")}`}_removeEmptyFolders(e){return e.replace(/^\/|\/$/g,"").replace(/\/+/g,"/")}transformOptsToQueryString(e){const t=[];return e.width&&t.push(`width=${e.width}`),e.height&&t.push(`height=${e.height}`),e.resize&&t.push(`resize=${e.resize}`),e.format&&t.push(`format=${e.format}`),e.quality&&t.push(`quality=${e.quality}`),t.join("&")}};const qq="2.95.3",Zl={"X-Client-Info":`storage-js/${qq}`};var Uq=class extends cs{constructor(e,t={},a,n){const r=new URL(e);n!=null&&n.useNewHostname&&/supabase\.(co|in|red)$/.test(r.hostname)&&!r.hostname.includes("storage.supabase.")&&(r.hostname=r.hostname.replace("supabase.","storage.supabase."));const o=r.href.replace(/\/$/,""),s=de(de({},Zl),t);super(o,s,a,"storage")}async listBuckets(e){var t=this;return t.handleOperation(async()=>{const a=t.listBucketOptionsToQueryString(e);return await Il(t.fetch,`${t.url}/bucket${a}`,{headers:t.headers})})}async getBucket(e){var t=this;return t.handleOperation(async()=>await Il(t.fetch,`${t.url}/bucket/${e}`,{headers:t.headers}))}async createBucket(e,t={public:!1}){var a=this;return a.handleOperation(async()=>await Da(a.fetch,`${a.url}/bucket`,{id:e,name:e,type:t.type,public:t.public,file_size_limit:t.fileSizeLimit,allowed_mime_types:t.allowedMimeTypes},{headers:a.headers}))}async updateBucket(e,t){var a=this;return a.handleOperation(async()=>await Fm(a.fetch,`${a.url}/bucket/${e}`,{id:e,name:e,public:t.public,file_size_limit:t.fileSizeLimit,allowed_mime_types:t.allowedMimeTypes},{headers:a.headers}))}async emptyBucket(e){var t=this;return t.handleOperation(async()=>await Da(t.fetch,`${t.url}/bucket/${e}/empty`,{},{headers:t.headers}))}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await ey(t.fetch,`${t.url}/bucket/${e}`,{},{headers:t.headers}))}listBucketOptionsToQueryString(e){const t={};return e&&("limit"in e&&(t.limit=String(e.limit)),"offset"in e&&(t.offset=String(e.offset)),e.search&&(t.search=e.search),e.sortColumn&&(t.sortColumn=e.sortColumn),e.sortOrder&&(t.sortOrder=e.sortOrder)),Object.keys(t).length>0?"?"+new URLSearchParams(t).toString():""}},Mq=class extends cs{constructor(e,t={},a){const n=e.replace(/\/$/,""),r=de(de({},Zl),t);super(n,r,a,"storage")}async createBucket(e){var t=this;return t.handleOperation(async()=>await Da(t.fetch,`${t.url}/bucket`,{name:e},{headers:t.headers}))}async listBuckets(e){var t=this;return t.handleOperation(async()=>{const a=new URLSearchParams;(e==null?void 0:e.limit)!==void 0&&a.set("limit",e.limit.toString()),(e==null?void 0:e.offset)!==void 0&&a.set("offset",e.offset.toString()),e!=null&&e.sortColumn&&a.set("sortColumn",e.sortColumn),e!=null&&e.sortOrder&&a.set("sortOrder",e.sortOrder),e!=null&&e.search&&a.set("search",e.search);const n=a.toString(),r=n?`${t.url}/bucket?${n}`:`${t.url}/bucket`;return await Il(t.fetch,r,{headers:t.headers})})}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await ey(t.fetch,`${t.url}/bucket/${e}`,{},{headers:t.headers}))}from(e){var t=this;if(!Sq(e))throw new Lu("Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines and should avoid the use of any other characters.");const a=new xq({baseUrl:this.url,catalogName:e,auth:{type:"custom",getHeaders:async()=>t.headers},fetch:this.fetch}),n=this.shouldThrowOnError;return new Proxy(a,{get(r,o){const s=r[o];return typeof s!="function"?s:async(...l)=>{try{return{data:await s.apply(r,l),error:null}}catch(c){if(n)throw c;return{data:null,error:c}}}}})}},Lq=class extends cs{constructor(e,t={},a){const n=e.replace(/\/$/,""),r=de(de({},Zl),{},{"Content-Type":"application/json"},t);super(n,r,a,"vectors")}async createIndex(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/CreateIndex`,e,{headers:t.headers})||{})}async getIndex(e,t){var a=this;return a.handleOperation(async()=>await Zt.post(a.fetch,`${a.url}/GetIndex`,{vectorBucketName:e,indexName:t},{headers:a.headers}))}async listIndexes(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/ListIndexes`,e,{headers:t.headers}))}async deleteIndex(e,t){var a=this;return a.handleOperation(async()=>await Zt.post(a.fetch,`${a.url}/DeleteIndex`,{vectorBucketName:e,indexName:t},{headers:a.headers})||{})}},Oq=class extends cs{constructor(e,t={},a){const n=e.replace(/\/$/,""),r=de(de({},Zl),{},{"Content-Type":"application/json"},t);super(n,r,a,"vectors")}async putVectors(e){var t=this;if(e.vectors.length<1||e.vectors.length>500)throw new Error("Vector batch size must be between 1 and 500 items");return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/PutVectors`,e,{headers:t.headers})||{})}async getVectors(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/GetVectors`,e,{headers:t.headers}))}async listVectors(e){var t=this;if(e.segmentCount!==void 0){if(e.segmentCount<1||e.segmentCount>16)throw new Error("segmentCount must be between 1 and 16");
459if(e.segmentIndex!==void 0&&(e.segmentIndex<0||e.segmentIndex>=e.segmentCount))throw new Error(`segmentIndex must be between 0 and ${e.segmentCount-1}`)}return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/ListVectors`,e,{headers:t.headers}))}async queryVectors(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/QueryVectors`,e,{headers:t.headers}))}async deleteVectors(e){var t=this;if(e.keys.length<1||e.keys.length>500)throw new Error("Keys batch size must be between 1 and 500 items");return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/DeleteVectors`,e,{headers:t.headers})||{})}},Gq=class extends cs{constructor(e,t={},a){const n=e.replace(/\/$/,""),r=de(de({},Zl),{},{"Content-Type":"application/json"},t);super(n,r,a,"vectors")}async createBucket(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/CreateVectorBucket`,{vectorBucketName:e},{headers:t.headers})||{})}async getBucket(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/GetVectorBucket`,{vectorBucketName:e},{headers:t.headers}))}async listBuckets(e={}){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/ListVectorBuckets`,e,{headers:t.headers}))}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await Zt.post(t.fetch,`${t.url}/DeleteVectorBucket`,{vectorBucketName:e},{headers:t.headers})||{})}},Fq=class extends Gq{constructor(e,t={}){super(e,t.headers||{},t.fetch)}from(e){return new Hq(this.url,this.headers,e,this.fetch)}async createBucket(e){var t=()=>super.createBucket,a=this;return t().call(a,e)}async getBucket(e){var t=()=>super.getBucket,a=this;return t().call(a,e)}async listBuckets(e={}){var t=()=>super.listBuckets,a=this;return t().call(a,e)}async deleteBucket(e){var t=()=>super.deleteBucket,a=this;return t().call(a,e)}},Hq=class extends Lq{constructor(e,t,a,n){super(e,t,n),this.vectorBucketName=a}async createIndex(e){var t=()=>super.createIndex,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName}))}async listIndexes(e={}){var t=()=>super.listIndexes,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName}))}async getIndex(e){var t=()=>super.getIndex,a=this;return t().call(a,a.vectorBucketName,e)}async deleteIndex(e){var t=()=>super.deleteIndex,a=this;return t().call(a,a.vectorBucketName,e)}index(e){return new Bq(this.url,this.headers,this.vectorBucketName,e,this.fetch)}},Bq=class extends Oq{constructor(e,t,a,n,r){super(e,t,r),this.vectorBucketName=a,this.indexName=n}async putVectors(e){var t=()=>super.putVectors,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName,indexName:a.indexName}))}async getVectors(e){var t=()=>super.getVectors,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName,indexName:a.indexName}))}async listVectors(e={}){var t=()=>super.listVectors,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName,indexName:a.indexName}))}async queryVectors(e){var t=()=>super.queryVectors,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName,indexName:a.indexName}))}async deleteVectors(e){var t=()=>super.deleteVectors,a=this;return t().call(a,de(de({},e),{},{vectorBucketName:a.vectorBucketName,indexName:a.indexName}))}},Vq=class extends Uq{constructor(e,t={},a,n){super(e,t,a,n)}from(e){return new _q(this.url,this.headers,e,this.fetch)}get vectors(){return new Fq(this.url+"/vector",{headers:this.headers,fetch:this.fetch})}get analytics(){return new Mq(this.url+"/iceberg",this.headers,this.fetch)}};const RS="2.95.3",Zo=30*1e3,Hm=3,Qh=Hm*Zo,Wq="http://localhost:9999",$q="supabase.auth.token",Kq={"X-Client-Info":`gotrue-js/${RS}`},Bm="X-Supabase-Api-Version",DS={"2024-01-01":{timestamp:Date.parse("2024-01-01T00:00:00.0Z"),name:"2024-01-01"}},Yq=/^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$/i,Jq=10*60*1e3;class jl extends Error{constructor(t,a,n){super(t),this.__isAuthError=!0,this.name="AuthError",this.status=a,this.code=n}}function ne(e){return typeof e=="object"&&e!==null&&"__isAuthError"in e}class Qq extends jl{constructor(t,a,n){super(t,a,n),this.name="AuthApiError",this.status=a,this.code=n}}function Zq(e){return ne(e)&&e.name==="AuthApiError"}class Kr extends jl{constructor(t,a){super(t),this.name="AuthUnknownError",this.originalError=a}}class Dn extends jl{constructor(t,a,n,r){super(t,n,r),this.name=a,this.status=n}}class Kt extends Dn{constructor(){super("Auth session missing!","AuthSessionMissingError",400,void 0)}}function Zh(e){return ne(e)&&e.name==="AuthSessionMissingError"}class Fo extends Dn{constructor(){super("Auth session or user missing","AuthInvalidToken
459ResponseError",500,void 0)}}class Ec extends Dn{constructor(t){super(t,"AuthInvalidCredentialsError",400,void 0)}}class zc extends Dn{constructor(t,a=null){super(t,"AuthImplicitGrantRedirectError",500,void 0),this.details=null,this.details=a}toJSON(){return{name:this.name,message:this.message,status:this.status,details:this.details}}}function Xq(e){return ne(e)&&e.name==="AuthImplicitGrantRedirectError"}class Qb extends Dn{constructor(t,a=null){super(t,"AuthPKCEGrantCodeExchangeError",500,void 0),this.details=null,this.details=a}toJSON(){return{name:this.name,message:this.message,status:this.status,details:this.details}}}class eU extends Dn{constructor(){super("PKCE code verifier not found in storage. This can happen if the auth flow was initiated in a different browser or device, or if the storage was cleared. For SSR frameworks (Next.js, SvelteKit, etc.), use @supabase/ssr on both the server and client to store the code verifier in cookies.","AuthPKCECodeVerifierMissingError",400,"pkce_code_verifier_not_found")}}class Vm extends Dn{constructor(t,a){super(t,"AuthRetryableFetchError",a,void 0)}}function Xh(e){return ne(e)&&e.name==="AuthRetryableFetchError"}class Zb extends Dn{constructor(t,a,n){super(t,"AuthWeakPasswordError",a,"weak_password"),this.reasons=n}}class Wm extends Dn{constructor(t){super(t,"AuthInvalidJwtError",400,"invalid_jwt")}}const Hd="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split(""),Xb=` 460\r=`.split(""),tU=(()=>{const e=new Array(128);for(let t=0;t<e.length;t+=1)e[t]=-1;for(let t=0;t<Xb.length;t+=1)e[Xb[t].charCodeAt(0)]=-2;for(let t=0;t<Hd.length;t+=1)e[Hd[t].charCodeAt(0)]=t;return e})();function ew(e,t,a){if(e!==null)for(t.queue=t.queue<<8|e,t.queuedBits+=8;t.queuedBits>=6;){const n=t.queue>>t.queuedBits-6&63;a(Hd[n]),t.queuedBits-=6}else if(t.queuedBits>0)for(t.queue=t.queue<<6-t.queuedBits,t.queuedBits=6;t.queuedBits>=6;){const n=t.queue>>t.queuedBits-6&63;a(Hd[n]),t.queuedBits-=6}}function _S(e,t,a){const n=tU[e];if(n>-1)for(t.queue=t.queue<<6|n,t.queuedBits+=6;t.queuedBits>=8;)a(t.queue>>t.queuedBits-8&255),t.queuedBits-=8;else{if(n===-2)return;throw new Error(`Invalid Base64-URL character "${String.fromCharCode(e)}"`)}}function tw(e){const t=[],a=s=>{t.push(String.fromCodePoint(s))},n={utf8seq:0,codepoint:0},r={queue:0,queuedBits:0},o=s=>{rU(s,n,a)};for(let s=0;s<e.length;s+=1)_S(e.charCodeAt(s),r,o);return t.join("")}function aU(e,t){if(e<=127){t(e);return}else if(e<=2047){t(192|e>>6),t(128|e&63);return}else if(e<=65535){t(224|e>>12),t(128|e>>6&63),t(128|e&63);return}else if(e<=1114111){t(240|e>>18),t(128|e>>12&63),t(128|e>>6&63),t(128|e&63);return}throw new Error(`Unrecognized Unicode codepoint: ${e.toString(16)}`)}function nU(e,t){for(let a=0;a<e.length;a+=1){let n=e.charCodeAt(a);if(n>55295&&n<=56319){const r=(n-55296)*1024&65535;n=(e.charCodeAt(a+1)-56320&65535|r)+65536,a+=1}aU(n,t)}}function rU(e,t,a){if(t.utf8seq===0){if(e<=127){a(e);return}for(let n=1;n<6;n+=1)if(!(e>>7-n&1)){t.utf8seq=n;break}if(t.utf8seq===2)t.codepoint=e&31;else if(t.utf8seq===3)t.codepoint=e&15;else if(t.utf8seq===4)t.codepoint=e&7;else throw new Error("Invalid UTF-8 sequence");t.utf8seq-=1}else if(t.utf8seq>0){if(e<=127)throw new Error("Invalid UTF-8 sequence");t.codepoint=t.codepoint<<6|e&63,t.utf8seq-=1,t.utf8seq===0&&a(t.codepoint)}}function Si(e){const t=[],a={queue:0,queuedBits:0},n=r=>{t.push(r)};for(let r=0;r<e.length;r+=1)_S(e.charCodeAt(r),a,n);return new Uint8Array(t)}function oU(e){const t=[];return nU(e,a=>t.push(a)),new Uint8Array(t)}function eo(e){const t=[],a={queue:0,queuedBits:0},n=r=>{t.push(r)};return e.forEach(r=>ew(r,a,n)),ew(null,a,n),t.join("")}function iU(e){return Math.round(Date.now()/1e3)+e}function sU(){return Symbol("auth-callback")}const yt=()=>typeof window<"u"&&typeof document<"u",Gr={tested:!1,writable:!1},qS=()=>
460{if(!yt())return!1;try{if(typeof globalThis.localStorage!="object")return!1}catch{return!1}if(Gr.tested)return Gr.writable;const e=`lswt-${Math.random()}${Math.random()}`;try{globalThis.localStorage.setItem(e,e),globalThis.localStorage.removeItem(e),Gr.tested=!0,Gr.writable=!0}catch{Gr.tested=!0,Gr.writable=!1}return Gr.writable};function lU(e){const t={},a=new URL(e);if(a.hash&&a.hash[0]==="#")try{new URLSearchParams(a.hash.substring(1)).forEach((r,o)=>{t[o]=r})}catch{}return a.searchParams.forEach((n,r)=>{t[r]=n}),t}const US=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),cU=e=>typeof e=="object"&&e!==null&&"status"in e&&"ok"in e&&"json"in e&&typeof e.json=="function",Xo=async(e,t,a)=>{await e.setItem(t,JSON.stringify(a))},Fr=async(e,t)=>{const a=await e.getItem(t);if(!a)return null;try{return JSON.parse(a)}catch{return a}},gt=async(e,t)=>{await e.removeItem(t)};class Gu{constructor(){this.promise=new Gu.promiseConstructor((t,a)=>{this.resolve=t,this.reject=a})}}Gu.promiseConstructor=Promise;function Rc(e){const t=e.split(".");if(t.length!==3)throw new Wm("Invalid JWT structure");for(let n=0;n<t.length;n++)if(!Yq.test(t[n]))throw new Wm("JWT not in base64url format");return{header:JSON.parse(tw(t[0])),payload:JSON.parse(tw(t[1])),signature:Si(t[2]),raw:{header:t[0],payload:t[1]}}}async function dU(e){return await new Promise(t=>{setTimeout(()=>t(null),e)})}function uU(e,t){return new Promise((n,r)=>{(async()=>{for(let o=0;o<1/0;o++)try{const s=await e(o);if(!t(o,null,s)){n(s);return}}catch(s){if(!t(o,s)){r(s);return}}})()})}function hU(e){return("0"+e.toString(16)).substr(-2)}function pU(){const t=new Uint32Array(56);if(typeof crypto>"u"){const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",n=a.length;let r="";for(let o=0;o<56;o++)r+=a.charAt(Math.floor(Math.random()*n));return r}return crypto.getRandomValues(t),Array.from(t,hU).join("")}async function mU(e){const a=new TextEncoder().encode(e),n=await crypto.subtle.digest("SHA-256",a),r=new Uint8Array(n);return Array.from(r).map(o=>String.fromCharCode(o)).join("")}async function fU(e){if(!(typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof TextEncoder<"u"))return console.warn("WebCrypto API is not supported. Code challenge method will default to use plain instead of sha256."),e;const a=await mU(e);return btoa(a).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function Ho(e,t,a=!1){const n=pU();let r=n;a&&(r+="/PASSWORD_RECOVERY"),await Xo(e,`${t}-code-verifier`,r);const o=await fU(n);return[o,n===o?"plain":"s256"]}const gU=/^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/i;function yU(e){const t=e.headers.get(Bm);if(!t||!t.match(gU))return null;try{return new Date(`${t}T00:00:00.0Z`)}catch{return null}}function vU(e){if(!e)throw new Error("Missing exp claim");const t=Math.floor(Date.now()/1e3);if(e<=t)throw new Error("JWT has expired")}function bU(e){switch(e){case"RS256":return{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}};case"ES256":return{name:"ECDSA",namedCurve:"P-256",hash:{name:"SHA-256"}};default:throw new Error("Invalid alg claim")}}const wU=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function Bo(e){if(!wU.test(e))throw new Error("@supabase/auth-js: Expected parameter to be UUID but is not")}function ep(){const e={};return new Proxy(e,{get:(t,a)=>{if(a==="__isUserNotAvailableProxy")return!0;if(typeof a=="symbol"){const n=a.toString();if(n==="Symbol(Symbol.toPrimitive)"||n==="Symbol(Symbol.toStringTag)"||n==="Symbol(util.inspect.custom)")return}throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Accessing the "${a}" property of the session object is not supported. Please use getUser() instead.`)},set:(t,a)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Setting the "${a}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)},deleteProperty:(t,a)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Deleting the "${a}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)}})}function xU(e,t){return new Proxy(e,{get:(a,n,r)=>{if(n==="__isInsecureUserWarningProxy")return!0;
460if(typeof n=="symbol"){const o=n.toString();if(o==="Symbol(Symbol.toPrimitive)"||o==="Symbol(Symbol.toStringTag)"||o==="Symbol(util.inspect.custom)"||o==="Symbol(nodejs.util.inspect.custom)")return Reflect.get(a,n,r)}return!t.value&&typeof n=="string"&&(console.warn("Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server."),t.value=!0),Reflect.get(a,n,r)}})}function aw(e){return JSON.parse(JSON.stringify(e))}const Wr=e=>e.msg||e.message||e.error_description||e.error||JSON.stringify(e),kU=[502,503,504];async function nw(e){var t;if(!cU(e))throw new Vm(Wr(e),0);if(kU.includes(e.status))throw new Vm(Wr(e),e.status);let a;try{a=await e.json()}catch(o){throw new Kr(Wr(o),o)}let n;const r=yU(e);if(r&&r.getTime()>=DS["2024-01-01"].timestamp&&typeof a=="object"&&a&&typeof a.code=="string"?n=a.code:typeof a=="object"&&a&&typeof a.error_code=="string"&&(n=a.error_code),n){if(n==="weak_password")throw new Zb(Wr(a),e.status,((t=a.weak_password)===null||t===void 0?void 0:t.reasons)||[]);if(n==="session_not_found")throw new Kt}else if(typeof a=="object"&&a&&typeof a.weak_password=="object"&&a.weak_password&&Array.isArray(a.weak_password.reasons)&&a.weak_password.reasons.length&&a.weak_password.reasons.reduce((o,s)=>o&&typeof s=="string",!0))throw new Zb(Wr(a),e.status,a.weak_password.reasons);throw new Qq(Wr(a),e.status||500,n)}const CU=(e,t,a,n)=>{const r={method:e,headers:(t==null?void 0:t.headers)||{}};return e==="GET"?r:(r.headers=Object.assign({"Content-Type":"application/json;charset=UTF-8"},t==null?void 0:t.headers),r.body=JSON.stringify(n),Object.assign(Object.assign({},r),a))};async function ce(e,t,a,n){var r;const o=Object.assign({},n==null?void 0:n.headers);o[Bm]||(o[Bm]=DS["2024-01-01"].name),n!=null&&n.jwt&&(o.Authorization=`Bearer ${n.jwt}`);const s=(r=n==null?void 0:n.query)!==null&&r!==void 0?r:{};n!=null&&n.redirectTo&&(s.redirect_to=n.redirectTo);const l=Object.keys(s).length?"?"+new URLSearchParams(s).toString():"",c=await SU(e,t,a+l,{headers:o,noResolveJson:n==null?void 0:n.noResolveJson},{},n==null?void 0:n.body);return n!=null&&n.xform?n==null?void 0:n.xform(c):{data:Object.assign({},c),error:null}}async function SU(e,t,a,n,r,o){const s=CU(t,n,r,o);let l;try{l=await e(a,Object.assign({},s))}catch(c){throw console.error(c),new Vm(Wr(c),0)}if(l.ok||await nw(l),n!=null&&n.noResolveJson)return l;try{return await l.json()}catch(c){await nw(c)}}function Na(e){var t;let a=null;TU(e)&&(a=Object.assign({},e),e.expires_at||(a.expires_at=iU(e.expires_in)));const n=(t=e.user)!==null&&t!==void 0?t:e;return{data:{session:a,user:n},error:null}}function rw(e){const t=Na(e);return!t.error&&e.weak_password&&typeof e.weak_password=="object"&&Array.isArray(e.weak_password.reasons)&&e.weak_password.reasons.length&&e.weak_password.message&&typeof e.weak_password.message=="string"&&e.weak_password.reasons.reduce((a,n)=>a&&typeof n=="string",!0)&&(t.data.weak_password=e.weak_password),t}function Xn(e){var t;return{data:{user:(t=e.user)!==null&&t!==void 0?t:e},error:null}}function AU(e){return{data:e,error:null}}function PU(e){const{action_link:t,email_otp:a,hashed_token:n,redirect_to:r,verification_type:o}=e,s=ls(e,["action_link","email_otp","hashed_token","redirect_to","verification_type"]),l={action_link:t,email_otp:a,hashed_token:n,redirect_to:r,verification_type:o},c=Object.assign({},s);return{data:{properties:l,user:c},error:null}}function ow(e){return e}function TU(e){return e.access_token&&e.refresh_token&&e.expires_in}const tp=["global","local","others"];class IU{constructor({url:t="",headers:a={},fetch:n}){this.url=t,this.headers=a,this.fetch=US(n),this.mfa={listFactors:this._listFactors.bind(this),deleteFactor:this._deleteFactor.bind(this)},this.oauth={listClients:this._listOAuthClients.bind(this),createClient:this._createOAuthClient.bind(this),getClient:this._getOAuthClient.bind(this),updateClient:this._updateOAuthClient.bind(this),deleteClient:this._deleteOAuthClient.bind(this),regenerateClientSecret:this._regenerateOAuthClientSecret.bind(this)}}async signOut(t,a=tp[0]){if(tp.indexOf(a)<0)throw new Error(`@supabase/auth-js: Parameter scope must be one of ${tp.join(", ")}`);try{return await ce(this.fetch,"POST",`${this.url}/logout?scope=${a}`,{headers:this.headers,jwt:t,noResolveJson:!0}),{data:null,error:null}}catch(n){if(ne(n))return{data:null,error:n};throw n}}async inviteUserByEmail(t,a={}){try{return await ce(this.fetch,"POST",`${this.url}/invite`,{body:{email:t,data:a.data},headers:this.headers,redirectTo:a.redirectTo,xform:Xn})}catch(n){if(ne(n))return{data:{user:null},error:n};throw n}}async generateLink(t){try{const{options:a}=t,n=ls(t,["options"]),r=Object.assign(Object.assign({},n),a);return"newEmail"in n&&(r.new_email=n==null?void 0:n.newEmail,delete r.newEmail),await ce(this.fetch,"POST",`${this.url}/admin/generate_link`,{body:r,headers:this.headers,xform:PU,redirectTo:a==null?void 0:a.redirectTo})}catch(a){if(ne(a))return{data:{properties:null,user:null},error:a};throw a}}async createUser(t){try{return await ce(this.fetch,"POST",`${this.url}/admin/users`,{body:t,headers:this.headers,xform:Xn})}catch(a){if(ne(a))return{data:{user:null},error:a};throw a}}async listUsers(t){var a,n,r,o,s,l,c;try{const d={nextPage:null,lastPage:0,total:0},u=await ce(this.fetch,"GET",`${this.url}/admin/users`,{headers:this.headers,noResolveJson:!0,query:{page:(n=(a=t==null?void 0:t.page)===null||a===void 0?void 0:a.toString())!==null&&n!==void 0?n:"",per_page:(o=(r=t==null?void 0:t.perPage)===null||r===void 0?void 0:r.toString())!==null&&o!==void 0?o:""},xform:ow});if(u.error)throw u.error;const h=await u.json(),m=(s=u.headers.get("x-total-count"))!==null&&s!==void 0?s:0,p=(c=(l=u.headers.get("link"))===null||l===void 0?void 0:l.split(","))!==null&&c!==void 0?c:[];return p.length>
4600&&(p.forEach(b=>{const g=parseInt(b.split(";")[0].split("=")[1].substring(0,1)),v=JSON.parse(b.split(";")[1].split("=")[1]);d[`${v}Page`]=g}),d.total=parseInt(m)),{data:Object.assign(Object.assign({},h),d),error:null}}catch(d){if(ne(d))return{data:{users:[]},error:d};throw d}}async getUserById(t){Bo(t);try{return await ce(this.fetch,"GET",`${this.url}/admin/users/${t}`,{headers:this.headers,xform:Xn})}catch(a){if(ne(a))return{data:{user:null},error:a};throw a}}async updateUserById(t,a){Bo(t);try{return await ce(this.fetch,"PUT",`${this.url}/admin/users/${t}`,{body:a,headers:this.headers,xform:Xn})}catch(n){if(ne(n))return{data:{user:null},error:n};throw n}}async deleteUser(t,a=!1){Bo(t);try{return await ce(this.fetch,"DELETE",`${this.url}/admin/users/${t}`,{headers:this.headers,body:{should_soft_delete:a},xform:Xn})}catch(n){if(ne(n))return{data:{user:null},error:n};throw n}}async _listFactors(t){Bo(t.userId);try{const{data:a,error:n}=await ce(this.fetch,"GET",`${this.url}/admin/users/${t.userId}/factors`,{headers:this.headers,xform:r=>({data:{factors:r},error:null})});return{data:a,error:n}}catch(a){if(ne(a))return{data:null,error:a};throw a}}async _deleteFactor(t){Bo(t.userId),Bo(t.id);try{return{data:await ce(this.fetch,"DELETE",`${this.url}/admin/users/${t.userId}/factors/${t.id}`,{headers:this.headers}),error:null}}catch(a){if(ne(a))return{data:null,error:a};throw a}}async _listOAuthClients(t){var a,n,r,o,s,l,c;try{const d={nextPage:null,lastPage:0,total:0},u=await ce(this.fetch,"GET",`${this.url}/admin/oauth/clients`,{headers:this.headers,noResolveJson:!0,query:{page:(n=(a=t==null?void 0:t.page)===null||a===void 0?void 0:a.toString())!==null&&n!==void 0?n:"",per_page:(o=(r=t==null?void 0:t.perPage)===null||r===void 0?void 0:r.toString())!==null&&o!==void 0?o:""},xform:ow});if(u.error)throw u.error;const h=await u.json(),m=(s=u.headers.get("x-total-count"))!==null&&s!==void 0?s:0,p=(c=(l=u.headers.get("link"))===null||l===void 0?void 0:l.split(","))!==null&&c!==void 0?c:[];return p.length>0&&(p.forEach(b=>{const g=parseInt(b.split(";")[0].split("=")[1].substring(0,1)),v=JSON.parse(b.split(";")[1].split("=")[1]);d[`${v}Page`]=g}),d.total=parseInt(m)),{data:Object.assign(Object.assign({},h),d),error:null}}catch(d){if(ne(d))return{data:{clients:[]},error:d};throw d}}async _createOAuthClient(t){try{return await ce(this.fetch,"POST",`${this.url}/admin/oauth/clients`,{body:t,headers:this.headers,xform:a=>({data:a,error:null})})}catch(a){if(ne(a))return{data:null,error:a};throw a}}async _getOAuthClient(t){try{return await ce(this.fetch,"GET",`${this.url}/admin/oauth/clients/${t}`,{headers:this.headers,xform:a=>({data:a,error:null})})}catch(a){if(ne(a))return{data:null,error:a};throw a}}async _updateOAuthClient(t,a){try{return await ce(this.fetch,"PUT",`${this.url}/admin/oauth/clients/${t}`,{body:a,headers:this.headers,xform:n=>({data:n,error:null})})}catch(n){if(ne(n))return{data:null,error:n};throw n}}async _deleteOAuthClient(t){try{return await ce(this.fetch,"DELETE",`${this.url}/admin/oauth/clients/${t}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(a){if(ne(a))return{data:null,error:a};throw a}}async _regenerateOAuthClientSecret(t){try{return await ce(this.fetch,"POST",`${this.url}/admin/oauth/clients/${t}/regenerate_secret`,{headers:this.headers,xform:a=>({data:a,error:null})})}catch(a){if(ne(a))return{data:null,error:a};throw a}}}function iw(e={}){return{getItem:t=>e[t]||null,setItem:(t,a)=>{e[t]=a},removeItem:t=>{delete e[t]}}}const Vo={debug:!!(globalThis&&qS()&&globalThis.localStorage&&globalThis.localStorage.getItem("supabase.gotrue-js.locks.debug")==="true")};class MS extends Error{constructor(t){super(t),this.isAcquireTimeout=!0}}class jU extends MS{}async function NU(e,t,a){Vo.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquire lock",e,t);const n=new globalThis.AbortController;return t>0&&setTimeout(()=>{n.abort(),Vo.debug&&console.log("@supabase/gotrue-js: navigatorLock acquire timed out",e)},t),await Promise.resolve().then(()=>globalThis.navigator.locks.request(e,t===0?{mode:"exclusive",ifAvailable:!0}:{mode:"exclusive",signal:n.signal},async r=>{if(r){Vo.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquired",e,r.name);try{return await a()}finally{Vo.debug&&console.log("@supabase/gotrue-js: navigatorLock: released",e,r.name)}
460}else{if(t===0)throw Vo.debug&&console.log("@supabase/gotrue-js: navigatorLock: not immediately available",e),new jU(`Acquiring an exclusive Navigator LockManager lock "${e}" immediately failed`);if(Vo.debug)try{const o=await globalThis.navigator.locks.query();console.log("@supabase/gotrue-js: Navigator LockManager state",JSON.stringify(o,null," "))}catch(o){console.warn("@supabase/gotrue-js: Error when querying Navigator LockManager state",o)}return console.warn("@supabase/gotrue-js: Navigator LockManager returned a null lock when using #request without ifAvailable set to true, it appears this browser is not following the LockManager spec https://developer.mozilla.org/en-US/docs/Web/API/LockManager/request"),await a()}}))}function EU(){if(typeof globalThis!="object")try{Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__}catch{typeof self<"u"&&(self.globalThis=self)}}function LS(e){if(!/^0x[a-fA-F0-9]{40}$/.test(e))throw new Error(`@supabase/auth-js: Address "${e}" is invalid.`);return e.toLowerCase()}function zU(e){return parseInt(e,16)}function RU(e){const t=new TextEncoder().encode(e);return"0x"+Array.from(t,n=>n.toString(16).padStart(2,"0")).join("")}function DU(e){var t;const{chainId:a,domain:n,expirationTime:r,issuedAt:o=new Date,nonce:s,notBefore:l,requestId:c,resources:d,scheme:u,uri:h,version:m}=e;{if(!Number.isInteger(a))throw new Error(`@supabase/auth-js: Invalid SIWE message field "chainId". Chain ID must be a EIP-155 chain ID. Provided value: ${a}`);if(!n)throw new Error('@supabase/auth-js: Invalid SIWE message field "domain". Domain must be provided.');if(s&&s.length<8)throw new Error(`@supabase/auth-js: Invalid SIWE message field "nonce". Nonce must be at least 8 characters. Provided value: ${s}`);if(!h)throw new Error('@supabase/auth-js: Invalid SIWE message field "uri". URI must be provided.');if(m!=="1")throw new Error(`@supabase/auth-js: Invalid SIWE message field "version". Version must be '1'. Provided value: ${m}`);if(!((t=e.statement)===null||t===void 0)&&t.includes(` 461`))throw new Error(`@supabase/auth-js: Invalid SIWE message field "statement". Statement must not include '\\n'. Provided value: ${e.statement}`)}const p=LS(e.address),b=u?`${u}://${n}`:n,g=e.statement?`${e.statement} 462`:"",v=`${b} wants you to sign in with your Ethereum account: 463${p} 464 465${g}`;let w=`URI: ${h} 466Version: ${m} 467Chain ID: ${a}${s?` 468Nonce: ${s}`:""} 469Issued At: ${o.toISOString()}`;if(r&&(w+=` 470Expiration Time: ${r.toISOString()}`),l&&(w+=` 471Not Before: ${l.toISOString()}`),c&&(w+=` 472Request ID: ${c}`),d){let y=` 473Resources:`;for(const x of d){if(!x||typeof x!="string")throw new Error(`@supabase/auth-js: Invalid SIWE message field "resources". Every resource must be a valid string. Provided value: ${x}`);y+=` 474- ${x}`}w+=y}return`${v} 475${w}`}class it extends Error{constructor({message:t,code:a,cause:n,name:r}){var o;super(t,{cause:n}),this.__isWebAuthnError=!0,this.name=(o=r??(n instanceof Error?n.name:void 0))!==null&&o!==void 0?o:"Unknown Error",this.code=a}}class Bd extends it{constructor(t,a){super({code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:a,message:t}),this.name="WebAuthnUnknownError",this.originalError=a}}function _U({error:e,options:t}){var a,n,r;const{publicKey:o}=t;if(!o)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new it({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else if(e.name==="ConstraintError"){if(((a=o.authenticatorSelection)===null||a===void 0?void 0:a.requireResidentKey)===!0)return new it({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:e});if(t.mediation==="conditional"&&((n=o.authenticatorSelection)===null||n===void 0?void 0:n.userVerification)==="required")return new it({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:e});if(((r=o.authenticatorSelection)===null||r===void 0?void 0:r.userVerification)==="required")return new it({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:e})}else{if(e.name==="InvalidStateError")return new it({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:e});if(e.name==="NotAllowedError")return new it({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="NotSupportedError")return o.pubKeyCredParams.filter(l=>l.type==="public-key").length===0?new it({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:e}):new it({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:e});if(e.name==="SecurityError"){const s=window.location.hostname;if(OS(s)){if(o.rp.id!==s)return new it({message:`The RP ID "${o.rp.id}
475" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new it({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="TypeError"){if(o.user.id.byteLength<1||o.user.id.byteLength>64)return new it({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:e})}else if(e.name==="UnknownError")return new it({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return new it({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e})}function qU({error:e,options:t}){const{publicKey:a}=t;if(!a)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new it({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else{if(e.name==="NotAllowedError")return new it({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="SecurityError"){const n=window.location.hostname;if(OS(n)){if(a.rpId!==n)return new it({message:`The RP ID "${a.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new it({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="UnknownError")return new it({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return new it({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e})}class UU{createNewAbortSignal(){if(this.controller){const a=new Error("Cancelling existing WebAuthn API call for new one");a.name="AbortError",this.controller.abort(a)}const t=new AbortController;return this.controller=t,t.signal}cancelCeremony(){if(this.controller){const t=new Error("Manually cancelling existing WebAuthn API call");t.name="AbortError",this.controller.abort(t),this.controller=void 0}}}const MU=new UU;function LU(e){if(!e)throw new Error("Credential creation options are required");if(typeof PublicKeyCredential<"u"&&"parseCreationOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseCreationOptionsFromJSON=="function")return PublicKeyCredential.parseCreationOptionsFromJSON(e);const{challenge:t,user:a,excludeCredentials:n}=e,r=ls(e,["challenge","user","excludeCredentials"]),o=Si(t).buffer,s=Object.assign(Object.assign({},a),{id:Si(a.id).buffer}),l=Object.assign(Object.assign({},r),{challenge:o,user:s});if(n&&n.length>0){l.excludeCredentials=new Array(n.length);for(let c=0;c<n.length;c++){const d=n[c];l.excludeCredentials[c]=Object.assign(Object.assign({},d),{id:Si(d.id).buffer,type:d.type||"public-key",transports:d.transports})}}return l}function OU(e){if(!e)throw new Error("Credential request options are required");if(typeof PublicKeyCredential<"u"&&"parseRequestOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseRequestOptionsFromJSON=="function")return PublicKeyCredential.parseRequestOptionsFromJSON(e);const{challenge:t,allowCredentials:a}=e,n=ls(e,["challenge","allowCredentials"]),r=Si(t).buffer,o=Object.assign(Object.assign({},n),{challenge:r});if(a&&a.length>0){o.allowCredentials=new Array(a.length);for(let s=0;s<a.length;s++){const l=a[s];o.allowCredentials[s]=Object.assign(Object.assign({},l),{id:Si(l.id).buffer,type:l.type||"public-key",transports:l.transports})}}return o}function GU(e){var t;if("toJSON"in e&&typeof e.toJSON=="function")return e.toJSON();const a=e;return{id:e.id,rawId:e.id,response:{attestationObject:eo(new Uint8Array(e.response.attestationObject)),clientDataJSON:eo(new Uint8Array(e.response.clientDataJSON))},type:"public-key",clientExtensionResults:e.getClientExtensionResults(),authenticatorAttachment:(t=a.authenticatorAttachment)!==null&&t!==void 0?t:void 0}}function FU(e){var t;if("toJSON"in e&&typeof e.toJSON=="function")return e.toJSON();const a=e,n=e.getClientExtensionResults(),r=e.response;return{id:e.id,rawId:e.id,response:{authenticatorData:eo(new Uint8Array(r.authenticatorData)),clientDataJSON:eo(new Uint8Array(r.clientDataJSON)),signature:eo(new Uint8Array(r.signature)),userHandle:r.userHandle?eo(new Uint8Array(r.userHandle)):void 0},type:"public-key",clientExtensionResults:n,authenticatorAttachment:(t=a.authenticatorAttachment)!==null&&t!==void 0?t:void 0}}function OS(e){return e==="localhost"||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(e)}function sw(){var e,t;return!!(yt()&&"PublicKeyCredential"in window&&window.PublicKeyCredential&&"credentials"in navigator&&typeof((e=navigator==null?void 0:navigator.credentials)===null||e===void 0?void 0:e.create)=="function"&&typeof((t=navigator==null?void 0:navigator.credentials)===null||t===void 0?void 0:t.get)=="function")}async function HU(e){try{const t=await navigator.credentials.create(e);return t?t instanceof PublicKeyCredential?{data:t,error:null}:{data:null,error:new Bd("Browser returned unexpected credential type",t)}:{data:null,error:new Bd("Empty credential response",t)}}
475catch(t){return{data:null,error:_U({error:t,options:e})}}}async function BU(e){try{const t=await navigator.credentials.get(e);return t?t instanceof PublicKeyCredential?{data:t,error:null}:{data:null,error:new Bd("Browser returned unexpected credential type",t)}:{data:null,error:new Bd("Empty credential response",t)}}catch(t){return{data:null,error:qU({error:t,options:e})}}}const VU={hints:["security-key"],authenticatorSelection:{authenticatorAttachment:"cross-platform",requireResidentKey:!1,userVerification:"preferred",residentKey:"discouraged"},attestation:"direct"},WU={userVerification:"preferred",hints:["security-key"],attestation:"direct"};function Vd(...e){const t=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),a=r=>r instanceof ArrayBuffer||ArrayBuffer.isView(r),n={};for(const r of e)if(r)for(const o in r){const s=r[o];if(s!==void 0)if(Array.isArray(s))n[o]=s;else if(a(s))n[o]=s;else if(t(s)){const l=n[o];t(l)?n[o]=Vd(l,s):n[o]=Vd(s)}else n[o]=s}return n}function $U(e,t){return Vd(VU,e,t||{})}function KU(e,t){return Vd(WU,e,t||{})}class YU{constructor(t){this.client=t,this.enroll=this._enroll.bind(this),this.challenge=this._challenge.bind(this),this.verify=this._verify.bind(this),this.authenticate=this._authenticate.bind(this),this.register=this._register.bind(this)}async _enroll(t){return this.client.mfa.enroll(Object.assign(Object.assign({},t),{factorType:"webauthn"}))}async _challenge({factorId:t,webauthn:a,friendlyName:n,signal:r},o){var s;try{const{data:l,error:c}=await this.client.mfa.challenge({factorId:t,webauthn:a});if(!l)return{data:null,error:c};const d=r??MU.createNewAbortSignal();if(l.webauthn.type==="create"){const{user:u}=l.webauthn.credential_options.publicKey;if(!u.name){const h=n;if(h)u.name=`${u.id}:${h}`;else{const p=(await this.client.getUser()).data.user,b=((s=p==null?void 0:p.user_metadata)===null||s===void 0?void 0:s.name)||(p==null?void 0:p.email)||(p==null?void 0:p.id)||"User";u.name=`${u.id}:${b}`}}u.displayName||(u.displayName=u.name)}switch(l.webauthn.type){case"create":{const u=$U(l.webauthn.credential_options.publicKey,o==null?void 0:o.create),{data:h,error:m}=await HU({publicKey:u,signal:d});return h?{data:{factorId:t,challengeId:l.id,webauthn:{type:l.webauthn.type,credential_response:h}},error:null}:{data:null,error:m}}case"request":{const u=KU(l.webauthn.credential_options.publicKey,o==null?void 0:o.request),{data:h,error:m}=await BU(Object.assign(Object.assign({},l.webauthn.credential_options),{publicKey:u,signal:d}));return h?{data:{factorId:t,challengeId:l.id,webauthn:{type:l.webauthn.type,credential_response:h}},error:null}:{data:null,error:m}}}}catch(l){return ne(l)?{data:null,error:l}:{data:null,error:new Kr("Unexpected error in challenge",l)}}}async _verify({challengeId:t,factorId:a,webauthn:n}){return this.client.mfa.verify({factorId:a,challengeId:t,webauthn:n})}async _authenticate({factorId:t,webauthn:{rpId:a=typeof window<"u"?window.location.hostname:void 0,rpOrigins:n=typeof window<"u"?[window.location.origin]:void 0,signal:r}={}},o){if(!a)return{data:null,error:new jl("rpId is required for WebAuthn authentication")};try{if(!sw())return{data:null,error:new Kr("Browser does not support WebAuthn",null)};const{data:s,error:l}=await this.challenge({factorId:t,webauthn:{rpId:a,rpOrigins:n},signal:r},{request:o});if(!s)return{data:null,error:l};const{webauthn:c}=s;return this._verify({factorId:t,challengeId:s.challengeId,webauthn:{type:c.type,rpId:a,rpOrigins:n,credential_response:c.credential_response}})}catch(s){return ne(s)?{data:null,error:s}:{data:null,error:new Kr("Unexpected error in authenticate",s)}}}async _register({friendlyName:t,webauthn:{rpId:a=typeof window<"u"?window.location.hostname:void 0,rpOrigins:n=typeof window<"u"?[window.location.origin]:void 0,signal:r}={}},o){if(!a)return{data:null,error:new jl("rpId is required for WebAuthn registration")};try{if(!sw())return{data:null,error:new Kr("Browser does not support WebAuthn",null)};const{data:s,error:l}=await this._enroll({friendlyName:t});if(!s)return await this.client.mfa.listFactors().then(u=>{var h;
475return(h=u.data)===null||h===void 0?void 0:h.all.find(m=>m.factor_type==="webauthn"&&m.friendly_name===t&&m.status!=="unverified")}).then(u=>u?this.client.mfa.unenroll({factorId:u==null?void 0:u.id}):void 0),{data:null,error:l};const{data:c,error:d}=await this._challenge({factorId:s.id,friendlyName:s.friendly_name,webauthn:{rpId:a,rpOrigins:n},signal:r},{create:o});return c?this._verify({factorId:s.id,challengeId:c.challengeId,webauthn:{rpId:a,rpOrigins:n,type:c.webauthn.type,credential_response:c.webauthn.credential_response}}):{data:null,error:d}}catch(s){return ne(s)?{data:null,error:s}:{data:null,error:new Kr("Unexpected error in register",s)}}}}EU();const JU={url:Wq,storageKey:$q,autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,headers:Kq,flowType:"implicit",debug:!1,hasCustomAuthorizationHeader:!1,throwOnError:!1,lockAcquireTimeout:1e4};async function lw(e,t,a){return await a()}const Wo={};class Nl{get jwks(){var t,a;return(a=(t=Wo[this.storageKey])===null||t===void 0?void 0:t.jwks)!==null&&a!==void 0?a:{keys:[]}}set jwks(t){Wo[this.storageKey]=Object.assign(Object.assign({},Wo[this.storageKey]),{jwks:t})}get jwks_cached_at(){var t,a;return(a=(t=Wo[this.storageKey])===null||t===void 0?void 0:t.cachedAt)!==null&&a!==void 0?a:Number.MIN_SAFE_INTEGER}set jwks_cached_at(t){Wo[this.storageKey]=Object.assign(Object.assign({},Wo[this.storageKey]),{cachedAt:t})}constructor(t){var a,n,r;this.userStorage=null,this.memoryStorage=null,this.stateChangeEmitters=new Map,this.autoRefreshTicker=null,this.autoRefreshTickTimeout=null,this.visibilityChangedCallback=null,this.refreshingDeferred=null,this.initializePromise=null,this.detectSessionInUrl=!0,this.hasCustomAuthorizationHeader=!1,this.suppressGetSessionWarning=!1,this.lockAcquired=!1,this.pendingInLock=[],this.broadcastChannel=null,this.logger=console.log;const o=Object.assign(Object.assign({},JU),t);if(this.storageKey=o.storageKey,this.instanceID=(a=Nl.nextInstanceID[this.storageKey])!==null&&a!==void 0?a:0,Nl.nextInstanceID[this.storageKey]=this.instanceID+1,this.logDebugMessages=!!o.debug,typeof o.debug=="function"&&(this.logger=o.debug),this.instanceID>0&&yt()){const s=`${this._logPrefix()} Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.`;console.warn(s),this.logDebugMessages&&console.trace(s)}if(this.persistSession=o.persistSession,this.autoRefreshToken=o.autoRefreshToken,this.admin=new IU({url:o.url,headers:o.headers,fetch:o.fetch}),this.url=o.url,this.headers=o.headers,this.fetch=US(o.fetch),this.lock=o.lock||lw,this.detectSessionInUrl=o.detectSessionInUrl,this.flowType=o.flowType,this.hasCustomAuthorizationHeader=o.hasCustomAuthorizationHeader,this.throwOnError=o.throwOnError,this.lockAcquireTimeout=o.lockAcquireTimeout,o.lock?this.lock=o.lock:this.persistSession&&yt()&&(!((n=globalThis==null?void 0:globalThis.navigator)===null||n===void 0)&&n.locks)?this.lock=NU:this.lock=lw,this.jwks||(this.jwks={keys:[]},this.jwks_cached_at=Number.MIN_SAFE_INTEGER),this.mfa={verify:this._verify.bind(this),enroll:this._enroll.bind(this),unenroll:this._unenroll.bind(this),challenge:this._challenge.bind(this),listFactors:this._listFactors.bind(this),challengeAndVerify:this._challengeAndVerify.bind(this),getAuthenticatorAssuranceLevel:this._getAuthenticatorAssuranceLevel.bind(this),webauthn:new YU(this)},this.oauth={getAuthorizationDetails:this._getAuthorizationDetails.bind(this),approveAuthorization:this._approveAuthorization.bind(this),denyAuthorization:this._denyAuthorization.bind(this),listGrants:this._listOAuthGrants.bind(this),revokeGrant:this._revokeOAuthGrant.bind(this)},this.persistSession?(o.storage?this.storage=o.storage:qS()?this.storage=globalThis.localStorage:(this.memoryStorage={},this.storage=iw(this.memoryStorage)),o.userStorage&&(this.userStorage=o.userStorage)):(this.memoryStorage={},this.storage=iw(this.memoryStorage)),yt()&&globalThis.BroadcastChannel&&this.persistSession&&this.storageKey){try{this.broadcastChannel=new globalThis.BroadcastChannel(this.storageKey)}catch(s){console.error("Failed to create a new BroadcastChannel, multi-tab state changes will not be available",s)}(r=this.broadcastChannel)===null||r===void 0||r.addEventListener("message",async s=>{this._debug("received broadcast notification from other tab or client",s);try{await this._notifyAllSubscribers(s.data.event,s.data.session,!1)}catch(l){this._debug("#broadcastChannel","error",l)}})}this.initialize().catch(s=>{this._debug("#initialize()","error",s)})}isThrowOnErrorEnabled(){return this.throwOnError}_returnResult(t){if(this.throwOnError&&t&&t.error)throw t.error;return t}_logPrefix(){return`GoTrueClient@${this.storageKey}:${this.instanceID} (${RS}) ${new Date().toISOString()}`}_debug(...t){return this.logDebugMessages&&this.logger(this._logPrefix(),...t),this}async initialize(){return this.initializePromise?await this.initializePromise:(this.initializePromise=(async()=>await this._acquireLock(this.lockAcquireTimeout,async()=>await this._initialize()))(),await this.initializePromise)}async _initialize(){var t;try{let a={},n="none";if(yt()&&(a=lU(window.location.href),this._isImplicitGrantCallback(a)?n="implicit":await this._isPKCECallback(a)&&(n="pkce")),yt()&&this.detectSessionInUrl&&n!=="none"){const{data:r,error:o}=await this._getSessionFromURL(a,n);if(o){if(this._debug("#_initialize()","error detecting session from URL",o),Xq(o)){const c=(t=o.details)===null||t===void 0?void 0:t.code;if(c==="identity_already_exists"||c==="identity_not_found"||c==="single_identity_not_deletable")return{error:o}}return{error:o}}const{session:s,redirectType:l}=r;return this._debug("#_initialize()","detected session in URL",s,"redirect type",l),await this._saveSession(s),setTimeout(async()=>{l==="recovery"?await this._notifyAllSubscribers("PASSWORD_RECOVERY",s):await this._notifyAllSubscribers("SIGNED_IN",s)},0),{error:null}}return await this._recoverAndRefresh(),{error:null}}catch(a){return ne(a)?this._returnResult({error:a}):this._returnResult({error:new Kr("Unexpected error during initialization",a)})}finally{await this._handleVisibilityChange(),this._debug("#_initialize()","end")}}async signInAnonymously(t){var a,n,r;try{const o=await ce(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{data:(n=(a=t==null?void 0:t.options)===null||a===void 0?void 0:a.data)!==null&&n!==void 0?n:{},gotrue_meta_security:{captcha_token:(r=t==null?void 0:t.options)===null||r===void 0?void 0:r.captchaToken}},xform:Na}),{data:s,error:l}=o;if(l||!s)return this._returnResult({data:{user:null,session:null},error:l});const c=s.session,d=s.user;return s.session&&(await this._saveSession(s.session),await this._notifyAllSubscribers("SIGNED_IN",c)),this._returnResult({data:{user:d,session:c},error:null})}catch(o){if(ne(o))return this._returnResult({data:{user:null,session:null},error:o});throw o}}async signUp(t){var a,n,r;try{let o;if("email"in t){const{email:u,password:h,options:m}=t;let p=null,b=null;this.flowType==="pkce"&&([p,b]=await Ho(this.storage,this.storageKey)),o=await ce(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,redirectTo:m==null?void 0:m.emailRedirectTo,body:{email:u,password:h,data:(a=m==null?void 0:m.data)!==null&&a!==void 0?a:{},gotrue_meta_security:{captcha_token:m==null?void 0:m.captchaToken},code_challenge:p,code_challenge_method:b},xform:Na})}else if("phone"in t){const{phone:u,password:h,options:m}=t;o=await ce(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{phone:u,password:h,data:(n=m==null?void 0:m.data)!==null&&n!==void 0?n:{},channel:(r=m==null?void 0:m.channel)!==null&&r!==void 0?r:"sms",gotrue_meta_security:{captcha_token:m==null?void 0:m.captchaToken}},xform:Na})}else throw new Ec("You must provide either an email or phone number and a password");const{data:s,error:l}=o;if(l||!s)return await gt(this.storage,`${this.storageKey}-code-verifier`),this._returnResult({data:{user:null,session:null},error:l});const c=s.session,d=s.user;return s.session&&(await this._saveSession(s.session),await this._notifyAllSubscribers("SIGNED_IN",c)),this._returnResult({data:{user:d,session:c},error:null})}catch(o){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(o))return this._returnResult({data:{user:null,session:null},error:o});throw o}}async signInWithPassword(t){try{let a;if("email"in t){const{email:o,password:s,options:l}=t;a=await ce(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{email:o,password:s,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken}},xform:rw})}else if("phone"in t){const{phone:o,password:s,options:l}=t;a=await ce(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{phone:o,password:s,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken}},xform:rw})}else throw new Ec("You must provide either an email or phone number and a password");const{data:n,error:r}=a;if(r)return this._returnResult({data:{user:null,session:null},error:r});if(!n||!n.session||!n.user){const o=new Fo;return this._returnResult({data:{user:null,session:null},error:o})}return n.session&&(await this._saveSession(n.session),await this._notifyAllSubscribers("SIGNED_IN",n.session)),this._returnResult({data:Object.assign({user:n.user,session:n.session},n.weak_password?{weakPassword:n.weak_password}:null),error:r})}catch(a){if(ne(a))return this._returnResult({data:{user:null,session:null},error:a});throw a}}async signInWithOAuth(t){var a,n,r,o;return await this._handleProviderSignIn(t.provider,{redirectTo:(a=t.options)===null||a===void 0?void 0:a.redirectTo,scopes:(n=t.options)===null||n===void 0?void 0:n.scopes,queryParams:(r=t.options)===null||r===void 0?void 0:r.queryParams,skipBrowserRedirect:(o=t.o
475ptions)===null||o===void 0?void 0:o.skipBrowserRedirect})}async exchangeCodeForSession(t){return await this.initializePromise,this._acquireLock(this.lockAcquireTimeout,async()=>this._exchangeCodeForSession(t))}async signInWithWeb3(t){const{chain:a}=t;switch(a){case"ethereum":return await this.signInWithEthereum(t);case"solana":return await this.signInWithSolana(t);default:throw new Error(`@supabase/auth-js: Unsupported chain "${a}"`)}}async signInWithEthereum(t){var a,n,r,o,s,l,c,d,u,h,m;let p,b;if("message"in t)p=t.message,b=t.signature;else{const{chain:g,wallet:v,statement:w,options:y}=t;let x;if(yt())if(typeof v=="object")x=v;else{const I=window;if("ethereum"in I&&typeof I.ethereum=="object"&&"request"in I.ethereum&&typeof I.ethereum.request=="function")x=I.ethereum;else throw new Error("@supabase/auth-js: No compatible Ethereum wallet interface on the window object (window.ethereum) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'ethereum', wallet: resolvedUserWallet }) instead.")}else{if(typeof v!="object"||!(y!=null&&y.url))throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");x=v}const k=new URL((a=y==null?void 0:y.url)!==null&&a!==void 0?a:window.location.href),C=await x.request({method:"eth_requestAccounts"}).then(I=>I).catch(()=>{throw new Error("@supabase/auth-js: Wallet method eth_requestAccounts is missing or invalid")});if(!C||C.length===0)throw new Error("@supabase/auth-js: No accounts available. Please ensure the wallet is connected.");const S=LS(C[0]);let A=(n=y==null?void 0:y.signInWithEthereum)===null||n===void 0?void 0:n.chainId;if(!A){const I=await x.request({method:"eth_chainId"});A=zU(I)}const P={domain:k.host,address:S,statement:w,uri:k.href,version:"1",chainId:A,nonce:(r=y==null?void 0:y.signInWithEthereum)===null||r===void 0?void 0:r.nonce,issuedAt:(s=(o=y==null?void 0:y.signInWithEthereum)===null||o===void 0?void 0:o.issuedAt)!==null&&s!==void 0?s:new Date,expirationTime:(l=y==null?void 0:y.signInWithEthereum)===null||l===void 0?void 0:l.expirationTime,notBefore:(c=y==null?void 0:y.signInWithEthereum)===null||c===void 0?void 0:c.notBefore,requestId:(d=y==null?void 0:y.signInWithEthereum)===null||d===void 0?void 0:d.requestId,resources:(u=y==null?void 0:y.signInWithEthereum)===null||u===void 0?void 0:u.resources};p=DU(P),b=await x.request({method:"personal_sign",params:[RU(p),S]})}try{const{data:g,error:v}=await ce(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"ethereum",message:p,signature:b},!((h=t.options)===null||h===void 0)&&h.captchaToken?{gotrue_meta_security:{captcha_token:(m=t.options)===null||m===void 0?void 0:m.captchaToken}}:null),xform:Na});if(v)throw v;if(!g||!g.session||!g.user){const w=new Fo;return this._returnResult({data:{user:null,session:null},error:w})}return g.session&&(await this._saveSession(g.session),await this._notifyAllSubscribers("SIGNED_IN",g.session)),this._returnResult({data:Object.assign({},g),error:v})}catch(g){if(ne(g))return this._returnResult({data:{user:null,session:null},error:g});throw g}}async signInWithSolana(t){var a,n,r,o,s,l,c,d,u,h,m,p;let b,g;if("message"in t)b=t.message,g=t.signature;else{const{chain:v,wallet:w,statement:y,options:x}=t;let k;if(yt())if(typeof w=="object")k=w;else{const S=window;if("solana"in S&&typeof S.solana=="object"&&("signIn"in S.solana&&typeof S.solana.signIn=="function"||"signMessage"in S.solana&&typeof S.solana.signMessage=="function"))k=S.solana;else throw new Error("@supabase/auth-js: No compatible Solana wallet interface on the window object (window.solana) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'solana', wallet: resolvedUserWallet }) instead.")}else{if(typeof w!="object"||!(x!=null&&x.url))throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");k=w}const C=new URL((a=x==null?void 0:x.url)!==null&&a!==void 0?a:window.location.href);
475if("signIn"in k&&k.signIn){const S=await k.signIn(Object.assign(Object.assign(Object.assign({issuedAt:new Date().toISOString()},x==null?void 0:x.signInWithSolana),{version:"1",domain:C.host,uri:C.href}),y?{statement:y}:null));let A;if(Array.isArray(S)&&S[0]&&typeof S[0]=="object")A=S[0];else if(S&&typeof S=="object"&&"signedMessage"in S&&"signature"in S)A=S;else throw new Error("@supabase/auth-js: Wallet method signIn() returned unrecognized value");if("signedMessage"in A&&"signature"in A&&(typeof A.signedMessage=="string"||A.signedMessage instanceof Uint8Array)&&A.signature instanceof Uint8Array)b=typeof A.signedMessage=="string"?A.signedMessage:new TextDecoder().decode(A.signedMessage),g=A.signature;else throw new Error("@supabase/auth-js: Wallet method signIn() API returned object without signedMessage and signature fields")}else{if(!("signMessage"in k)||typeof k.signMessage!="function"||!("publicKey"in k)||typeof k!="object"||!k.publicKey||!("toBase58"in k.publicKey)||typeof k.publicKey.toBase58!="function")throw new Error("@supabase/auth-js: Wallet does not have a compatible signMessage() and publicKey.toBase58() API");b=[`${C.host} wants you to sign in with your Solana account:`,k.publicKey.toBase58(),...y?["",y,""]:[""],"Version: 1",`URI: ${C.href}`,`Issued At: ${(r=(n=x==null?void 0:x.signInWithSolana)===null||n===void 0?void 0:n.issuedAt)!==null&&r!==void 0?r:new Date().toISOString()}`,...!((o=x==null?void 0:x.signInWithSolana)===null||o===void 0)&&o.notBefore?[`Not Before: ${x.signInWithSolana.notBefore}`]:[],...!((s=x==null?void 0:x.signInWithSolana)===null||s===void 0)&&s.expirationTime?[`Expiration Time: ${x.signInWithSolana.expirationTime}`]:[],...!((l=x==null?void 0:x.signInWithSolana)===null||l===void 0)&&l.chainId?[`Chain ID: ${x.signInWithSolana.chainId}`]:[],...!((c=x==null?void 0:x.signInWithSolana)===null||c===void 0)&&c.nonce?[`Nonce: ${x.signInWithSolana.nonce}`]:[],...!((d=x==null?void 0:x.signInWithSolana)===null||d===void 0)&&d.requestId?[`Request ID: ${x.signInWithSolana.requestId}`]:[],...!((h=(u=x==null?void 0:x.signInWithSolana)===null||u===void 0?void 0:u.resources)===null||h===void 0)&&h.length?["Resources",...x.signInWithSolana.resources.map(A=>`- ${A}`)]:[]].join(` 476`);const S=await k.signMessage(new TextEncoder().encode(b),"utf8");if(!S||!(S instanceof Uint8Array))throw new Error("@supabase/auth-js: Wallet signMessage() API returned an recognized value");g=S}}try{const{data:v,error:w}=await ce(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"solana",message:b,signature:eo(g)},!((m=t.options)===null||m===void 0)&&m.captchaToken?{gotrue_meta_security:{captcha_token:(p=t.options)===null||p===void 0?void 0:p.captchaToken}}:null),xform:Na});if(w)throw w;if(!v||!v.session||!v.user){const y=new Fo;return this._returnResult({data:{user:null,session:null},error:y})}return v.session&&(await this._saveSession(v.session),await this._notifyAllSubscribers("SIGNED_IN",v.session)),this._returnResult({data:Object.assign({},v),error:w})}catch(v){if(ne(v))return this._returnResult({data:{user:null,session:null},error:v});throw v}}async _exchangeCodeForSession(t){const a=await Fr(this.storage,`${this.storageKey}-code-verifier`),[n,r]=(a??"").split("/");try{if(!n&&this.flowType==="pkce")throw new eU;const{data:o,error:s}=await ce(this.fetch,"POST",`${this.url}/token?grant_type=pkce`,{headers:this.headers,body:{auth_code:t,code_verifier:n},xform:Na});if(await gt(this.storage,`${this.storageKey}-code-verifier`),s)throw s;if(!o||!o.session||!o.user){const l=new Fo;return this._returnResult({data:{user:null,session:null,redirectType:null},error:l})}return o.session&&(await this._saveSession(o.session),await this._notifyAllSubscribers("SIGNED_IN",o.session)),this._returnResult({data:Object.assign(Object.assign({},o),{redirectType:r??null}),error:s})}catch(o){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(o))return this._returnResult({data:{user:null,session:null,redirectType:null},error:o});throw o}}async signInWithIdToken(t){try{const{options:a,provider:n,token:r,access_token:o,nonce:s}=t,l=await ce(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,body:{provider:n,id_token:r,access_token:o,nonce:s,gotrue_meta_security:{captcha_token:a==null?void 0:a.captchaToken}},xform:Na}),{data:c,error:d}=l;if(d)return this._returnResult({data:{user:null,session:null},error:d});if(!c||!c.session||!c.user){const u=new Fo;return this._returnResult({data:{user:null,session:null},error:u})}return c.session&&(await this._saveSession(c.session),await this._notifyAllSubscribers("SIGNED_IN",c.session)),this._returnResult({data:c,error:d})}catch(a){if(ne(a))return this._returnResult({data:{user:null,session:null},error:a});throw a}}async signInWithOtp(t){var a,n,r,o,s;try{if("email"in t){const{email:l,options:c}=t;let d=null,u=null;this.flowType==="pkce"&&([d,u]=await Ho(this.storage,this.storageKey));const{error:h}=await ce(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{email:l,data:(a=c==null?void 0:c.data)!==null&&a!==void 0?a:{},create_user:(n=c==null?void 0:c.shouldCreateUser)!==null&&n!==void 0?n:!0,gotrue_meta_security:{captcha_token:c==null?void 0:c.captchaToken},code_challenge:d,code_challenge_method:u},redirectTo:c==null?void 0:c.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:h})}if("phone"in t){const{phone:l,options:c}=t,{data:d,error:u}=await ce(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{phone:l,data:(r=c==null?void 0:c.data)!==null&&r!==void 0?r:{},create_user:(o=c==null?void 0:c.shouldCreateUser)!==null&&o!==void 0?o:!0,gotrue_meta_security:{captcha_token:c==null?void 0:c.captchaToken},channel:(s=c==null?void 0:c.channel)!==null&&s!==void 0?s:"sms"}});return this._returnResult({data:{user:null,session:null,messageId:d==null?void 0:d.message_id},error:u})}throw new Ec("You must provide either an email or phone number.")}catch(l){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(l))return this._returnResult({data:{user:null,session:null},error:l});throw l}}async verifyOtp(t){var a,n;try{let r,o;
476"options"in t&&(r=(a=t.options)===null||a===void 0?void 0:a.redirectTo,o=(n=t.options)===null||n===void 0?void 0:n.captchaToken);const{data:s,error:l}=await ce(this.fetch,"POST",`${this.url}/verify`,{headers:this.headers,body:Object.assign(Object.assign({},t),{gotrue_meta_security:{captcha_token:o}}),redirectTo:r,xform:Na});if(l)throw l;if(!s)throw new Error("An error occurred on token verification.");const c=s.session,d=s.user;return c!=null&&c.access_token&&(await this._saveSession(c),await this._notifyAllSubscribers(t.type=="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",c)),this._returnResult({data:{user:d,session:c},error:null})}catch(r){if(ne(r))return this._returnResult({data:{user:null,session:null},error:r});throw r}}async signInWithSSO(t){var a,n,r,o,s;try{let l=null,c=null;this.flowType==="pkce"&&([l,c]=await Ho(this.storage,this.storageKey));const d=await ce(this.fetch,"POST",`${this.url}/sso`,{body:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},"providerId"in t?{provider_id:t.providerId}:null),"domain"in t?{domain:t.domain}:null),{redirect_to:(n=(a=t.options)===null||a===void 0?void 0:a.redirectTo)!==null&&n!==void 0?n:void 0}),!((r=t==null?void 0:t.options)===null||r===void 0)&&r.captchaToken?{gotrue_meta_security:{captcha_token:t.options.captchaToken}}:null),{skip_http_redirect:!0,code_challenge:l,code_challenge_method:c}),headers:this.headers,xform:AU});return!((o=d.data)===null||o===void 0)&&o.url&&yt()&&!(!((s=t.options)===null||s===void 0)&&s.skipBrowserRedirect)&&window.location.assign(d.data.url),this._returnResult(d)}catch(l){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(l))return this._returnResult({data:null,error:l});throw l}}async reauthenticate(){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._reauthenticate())}async _reauthenticate(){try{return await this._useSession(async t=>{const{data:{session:a},error:n}=t;if(n)throw n;if(!a)throw new Kt;const{error:r}=await ce(this.fetch,"GET",`${this.url}/reauthenticate`,{headers:this.headers,jwt:a.access_token});return this._returnResult({data:{user:null,session:null},error:r})})}catch(t){if(ne(t))return this._returnResult({data:{user:null,session:null},error:t});throw t}}async resend(t){try{const a=`${this.url}/resend`;if("email"in t){const{email:n,type:r,options:o}=t,{error:s}=await ce(this.fetch,"POST",a,{headers:this.headers,body:{email:n,type:r,gotrue_meta_security:{captcha_token:o==null?void 0:o.captchaToken}},redirectTo:o==null?void 0:o.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:s})}else if("phone"in t){const{phone:n,type:r,options:o}=t,{data:s,error:l}=await ce(this.fetch,"POST",a,{headers:this.headers,body:{phone:n,type:r,gotrue_meta_security:{captcha_token:o==null?void 0:o.captchaToken}}});return this._returnResult({data:{user:null,session:null,messageId:s==null?void 0:s.message_id},error:l})}throw new Ec("You must provide either an email or phone number and a type")}catch(a){if(ne(a))return this._returnResult({data:{user:null,session:null},error:a});throw a}}async getSession(){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>this._useSession(async a=>a))}async _acquireLock(t,a){this._debug("#_acquireLock","begin",t);try{if(this.lockAcquired){const n=this.pendingInLock.length?this.pendingInLock[this.pendingInLock.length-1]:Promise.resolve(),r=(async()=>(await n,await a()))();return this.pendingInLock.push((async()=>{try{await r}catch{}})()),r}return await this.lock(`lock:${this.storageKey}`,t,async()=>{this._debug("#_acquireLock","lock acquired for storage key",this.storageKey);try{this.lockAcquired=!0;const n=a();for(this.pendingInLock.push((async()=>{try{await n}catch{}})()),await n;this.pendingInLock.length;){const r=[...this.pendingInLock];await Promise.all(r),this.pendingInLock.splice(0,r.length)}return await n}finally{this._debug("#_acquireLock","lock released for storage key",this.storageKey),this.lockAcquired=!1}})}finally{this._debug("#_acquireLock","end")}}async _useSession(t){this._debug("#_useSession","begin");try{const a=await this.__loadSession();return await t(a)}finally{this._debug("#_useSession","end")}}async __loadSession(){this._debug("#__loadSession()","begin"),this.lockAcquired||this._debug("#__loadSession()","used outside of an acquired lock!",new Error().stack);try{let t=null;const a=await Fr(this.storage,this.storageKey);if(this._debug("#getSession()","session from storage",a),a!==null&&(this._isValidSession(a)?t=a:(this._debug("#getSession()","session from storage is not val
476id"),await this._removeSession())),!t)return{data:{session:null},error:null};const n=t.expires_at?t.expires_at*1e3-Date.now()<Qh:!1;if(this._debug("#__loadSession()",`session has${n?"":" not"} expired`,"expires_at",t.expires_at),!n){if(this.userStorage){const s=await Fr(this.userStorage,this.storageKey+"-user");s!=null&&s.user?t.user=s.user:t.user=ep()}if(this.storage.isServer&&t.user&&!t.user.__isUserNotAvailableProxy){const s={value:this.suppressGetSessionWarning};t.user=xU(t.user,s),s.value&&(this.suppressGetSessionWarning=!0)}return{data:{session:t},error:null}}const{data:r,error:o}=await this._callRefreshToken(t.refresh_token);return o?this._returnResult({data:{session:null},error:o}):this._returnResult({data:{session:r},error:null})}finally{this._debug("#__loadSession()","end")}}async getUser(t){if(t)return await this._getUser(t);await this.initializePromise;const a=await this._acquireLock(this.lockAcquireTimeout,async()=>await this._getUser());return a.data.user&&(this.suppressGetSessionWarning=!0),a}async _getUser(t){try{return t?await ce(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:t,xform:Xn}):await this._useSession(async a=>{var n,r,o;const{data:s,error:l}=a;if(l)throw l;return!(!((n=s.session)===null||n===void 0)&&n.access_token)&&!this.hasCustomAuthorizationHeader?{data:{user:null},error:new Kt}:await ce(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:(o=(r=s.session)===null||r===void 0?void 0:r.access_token)!==null&&o!==void 0?o:void 0,xform:Xn})})}catch(a){if(ne(a))return Zh(a)&&(await this._removeSession(),await gt(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({data:{user:null},error:a});throw a}}async updateUser(t,a={}){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._updateUser(t,a))}async _updateUser(t,a={}){try{return await this._useSession(async n=>{const{data:r,error:o}=n;if(o)throw o;if(!r.session)throw new Kt;const s=r.session;let l=null,c=null;this.flowType==="pkce"&&t.email!=null&&([l,c]=await Ho(this.storage,this.storageKey));const{data:d,error:u}=await ce(this.fetch,"PUT",`${this.url}/user`,{headers:this.headers,redirectTo:a==null?void 0:a.emailRedirectTo,body:Object.assign(Object.assign({},t),{code_challenge:l,code_challenge_method:c}),jwt:s.access_token,xform:Xn});if(u)throw u;return s.user=d.user,await this._saveSession(s),await this._notifyAllSubscribers("USER_UPDATED",s),this._returnResult({data:{user:s.user},error:null})})}catch(n){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(n))return this._returnResult({data:{user:null},error:n});throw n}}async setSession(t){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._setSession(t))}async _setSession(t){try{if(!t.access_token||!t.refresh_token)throw new Kt;const a=Date.now()/1e3;let n=a,r=!0,o=null;const{payload:s}=Rc(t.access_token);if(s.exp&&(n=s.exp,r=n<=a),r){const{data:l,error:c}=await this._callRefreshToken(t.refresh_token);if(c)return this._returnResult({data:{user:null,session:null},error:c});if(!l)return{data:{user:null,session:null},error:null};o=l}else{const{data:l,error:c}=await this._getUser(t.access_token);if(c)return this._returnResult({data:{user:null,session:null},error:c});o={access_token:t.access_token,refresh_token:t.refresh_token,user:l.user,token_type:"bearer",expires_in:n-a,expires_at:n},await this._saveSession(o),await this._notifyAllSubscribers("SIGNED_IN",o)}return this._returnResult({data:{user:o.user,session:o},error:null})}catch(a){if(ne(a))return this._returnResult({data:{session:null,user:null},error:a});throw a}}async refreshSession(t){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._refreshSession(t))}async _refreshSession(t){try{return await this._useSession(async a=>{var n;if(!t){const{data:s,error:l}=a;if(l)throw l;t=(n=s.session)!==null&&n!==void 0?n:void 0}if(!(t!=null&&t.refresh_token))throw new Kt;const{data:r,error:o}=await this._callRefreshToken(t.refresh_token);return o?this._returnResult({data:{user:null,session:null},error:o}):r?this._returnResult({data:{user:r.user,session:r},error:null}):this._returnResult({data:{user:null,session:null},error:null})})}catch(a){if(ne(a))return this._returnResult({data:{user:null,session:null},error:a});throw a}}async _getSessionFromURL(t,a){try{if(!yt())throw new zc("No browser detected.");
476if(t.error||t.error_description||t.error_code)throw new zc(t.error_description||"Error in URL with unspecified error_description",{error:t.error||"unspecified_error",code:t.error_code||"unspecified_code"});switch(a){case"implicit":if(this.flowType==="pkce")throw new Qb("Not a valid PKCE flow url.");break;case"pkce":if(this.flowType==="implicit")throw new zc("Not a valid implicit grant flow url.");break;default:}if(a==="pkce"){if(this._debug("#_initialize()","begin","is PKCE flow",!0),!t.code)throw new Qb("No code detected.");const{data:y,error:x}=await this._exchangeCodeForSession(t.code);if(x)throw x;const k=new URL(window.location.href);return k.searchParams.delete("code"),window.history.replaceState(window.history.state,"",k.toString()),{data:{session:y.session,redirectType:null},error:null}}const{provider_token:n,provider_refresh_token:r,access_token:o,refresh_token:s,expires_in:l,expires_at:c,token_type:d}=t;if(!o||!l||!s||!d)throw new zc("No session defined in URL");const u=Math.round(Date.now()/1e3),h=parseInt(l);let m=u+h;c&&(m=parseInt(c));const p=m-u;p*1e3<=Zo&&console.warn(`@supabase/gotrue-js: Session as retrieved from URL expires in ${p}s, should have been closer to ${h}s`);const b=m-h;u-b>=120?console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued over 120s ago, URL could be stale",b,m,u):u-b<0&&console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued in the future? Check the device clock for skew",b,m,u);const{data:g,error:v}=await this._getUser(o);if(v)throw v;const w={provider_token:n,provider_refresh_token:r,access_token:o,expires_in:h,expires_at:m,refresh_token:s,token_type:d,user:g.user};return window.location.hash="",this._debug("#_getSessionFromURL()","clearing window.location.hash"),this._returnResult({data:{session:w,redirectType:t.type},error:null})}catch(n){if(ne(n))return this._returnResult({data:{session:null,redirectType:null},error:n});throw n}}_isImplicitGrantCallback(t){return typeof this.detectSessionInUrl=="function"?this.detectSessionInUrl(new URL(window.location.href),t):!!(t.access_token||t.error_description)}async _isPKCECallback(t){const a=await Fr(this.storage,`${this.storageKey}-code-verifier`);return!!(t.code&&a)}async signOut(t={scope:"global"}){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._signOut(t))}async _signOut({scope:t}={scope:"global"}){return await this._useSession(async a=>{var n;const{data:r,error:o}=a;if(o&&!Zh(o))return this._returnResult({error:o});const s=(n=r.session)===null||n===void 0?void 0:n.access_token;if(s){const{error:l}=await this.admin.signOut(s,t);if(l&&!(Zq(l)&&(l.status===404||l.status===401||l.status===403)||Zh(l)))return this._returnResult({error:l})}return t!=="others"&&(await this._removeSession(),await gt(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({error:null})})}onAuthStateChange(t){const a=sU(),n={id:a,callback:t,unsubscribe:()=>{this._debug("#unsubscribe()","state change callback with id removed",a),this.stateChangeEmitters.delete(a)}};return this._debug("#onAuthStateChange()","registered callback with id",a),this.stateChangeEmitters.set(a,n),(async()=>(await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>{this._emitInitialSession(a)})))(),{data:{subscription:n}}}async _emitInitialSession(t){return await this._useSession(async a=>{var n,r;try{const{data:{session:o},error:s}=a;if(s)throw s;await((n=this.stateChangeEmitters.get(t))===null||n===void 0?void 0:n.callback("INITIAL_SESSION",o)),this._debug("INITIAL_SESSION","callback id",t,"session",o)}catch(o){await((r=this.stateChangeEmitters.get(t))===null||r===void 0?void 0:r.callback("INITIAL_SESSION",null)),this._debug("INITIAL_SESSION","callback id",t,"error",o),console.error(o)}})}async resetPasswordForEmail(t,a={}){let n=null,r=null;this.flowType==="pkce"&&([n,r]=await Ho(this.storage,this.storageKey,!0));try{return await ce(this.fetch,"POST",`${this.url}/recover`,{body:{email:t,code_challenge:n,code_challenge_method:r,gotrue_meta_security:{captcha_token:a.captchaToken}},headers:this.headers,redirectTo:a.redirectTo})}catch(o){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(o))return this._returnResult({data:null,error:o});throw o}}async getUserIdentities(){var t;try{const{data:a,error:n}=await this.getUser();if(n)throw n;return this._returnResult({data:{identities:(t=a.user.identities)!==null&&t!==void 0?t:[]},error:null})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async linkIdentity(t){return"token"in t?this.linkIdentityIdToken(t):this.linkIdentityOAuth(t)}async linkIdentityOAuth(t){var a;try{const{data:n,error:r}=await this._useSession(async o=>{var s,l,c,d,u;const{data:h,error:m}=o;if(m)throw m;const p=await this._getUrlForProvider(`${this.url}/user/identities/authorize`,t.provider,{redirectTo:(s=t.options)===null||s===void 0?void 0:s.redirectTo,scopes:(l=t.options)===null||l===void 0?void 0:l.scopes,queryParams:(c=t.options)===null||c===void 0?void 0:c.queryParams,skipBrowserRedirect:!0});return await ce(this.fetch,"GET",p,{headers:this.headers,jwt:(u=(d=h.session)===null||d===void 0?void 0:d.access_token)!==null&&u!==void 0?u:void 0})});if(r)throw r;return yt()&&!(!((a=t.options)===null||a===void 0)&&a.skipBrowserRedirect)&&window.location.assign(n==null?void 0:n.url),this._returnResult({data:{provider:t.provider,url:n==null?void 0:n.url},error:null})}catch(n){if(ne(n))return this._returnResult({data:{provider:t.provider,url:null},error:n});throw n}}async linkIdentityIdToken(t){return await this._useSession(async a=>{var n;try{const{error:r,data:{session:o}}=a;if(r)throw r;const{options:s,provider:l,token:c,access_token:d,nonce:u}=t,h=await ce(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,jwt:(n=o==null?void 0:o.access_token)!==null&&n!==void 0?n:void 0,body:{provider:l,id_token:c,access_token:d,nonce:u,link_identity:!0,gotrue_meta_security:{captcha_token:s==null?void 0:s.captchaToken}},xform:Na}),{data:m,error:p}=h;return p?this._returnResult({data:{user:null,session:null},error:p}):!m||!m.session||!m.user?this._returnResult({data:{user:null,session:null},error:new Fo}):(m.session&&(await this._saveSession(m.session),await this._notifyAllSubscribers("USER_UPDATED",m.session)),this._returnResult({data:m,error:p}))}catch(r){if(await gt(this.storage,`${this.storageKey}-code-verifier`),ne(r))return this._returnResult({data:{user:null,session:null},error:r});throw r}})}async unlinkIdentity(t){try{return await this._useSession(async a=>{var n,r;const{data:o,error:s}=a;if(s)throw s;
476return await ce(this.fetch,"DELETE",`${this.url}/user/identities/${t.identity_id}`,{headers:this.headers,jwt:(r=(n=o.session)===null||n===void 0?void 0:n.access_token)!==null&&r!==void 0?r:void 0})})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async _refreshAccessToken(t){const a=`#_refreshAccessToken(${t.substring(0,5)}...)`;this._debug(a,"begin");try{const n=Date.now();return await uU(async r=>(r>0&&await dU(200*Math.pow(2,r-1)),this._debug(a,"refreshing attempt",r),await ce(this.fetch,"POST",`${this.url}/token?grant_type=refresh_token`,{body:{refresh_token:t},headers:this.headers,xform:Na})),(r,o)=>{const s=200*Math.pow(2,r);return o&&Xh(o)&&Date.now()+s-n<Zo})}catch(n){if(this._debug(a,"error",n),ne(n))return this._returnResult({data:{session:null,user:null},error:n});throw n}finally{this._debug(a,"end")}}_isValidSession(t){return typeof t=="object"&&t!==null&&"access_token"in t&&"refresh_token"in t&&"expires_at"in t}async _handleProviderSignIn(t,a){const n=await this._getUrlForProvider(`${this.url}/authorize`,t,{redirectTo:a.redirectTo,scopes:a.scopes,queryParams:a.queryParams});return this._debug("#_handleProviderSignIn()","provider",t,"options",a,"url",n),yt()&&!a.skipBrowserRedirect&&window.location.assign(n),{data:{provider:t,url:n},error:null}}async _recoverAndRefresh(){var t,a;const n="#_recoverAndRefresh()";this._debug(n,"begin");try{const r=await Fr(this.storage,this.storageKey);if(r&&this.userStorage){let s=await Fr(this.userStorage,this.storageKey+"-user");!this.storage.isServer&&Object.is(this.storage,this.userStorage)&&!s&&(s={user:r.user},await Xo(this.userStorage,this.storageKey+"-user",s)),r.user=(t=s==null?void 0:s.user)!==null&&t!==void 0?t:ep()}else if(r&&!r.user&&!r.user){const s=await Fr(this.storage,this.storageKey+"-user");s&&(s!=null&&s.user)?(r.user=s.user,await gt(this.storage,this.storageKey+"-user"),await Xo(this.storage,this.storageKey,r)):r.user=ep()}if(this._debug(n,"session from storage",r),!this._isValidSession(r)){this._debug(n,"session is not valid"),r!==null&&await this._removeSession();return}const o=((a=r.expires_at)!==null&&a!==void 0?a:1/0)*1e3-Date.now()<Qh;if(this._debug(n,`session has${o?"":" not"} expired with margin of ${Qh}s`),o){if(this.autoRefreshToken&&r.refresh_token){const{error:s}=await this._callRefreshToken(r.refresh_token);s&&(console.error(s),Xh(s)||(this._debug(n,"refresh failed with a non-retryable error, removing the session",s),await this._removeSession()))}}else if(r.user&&r.user.__isUserNotAvailableProxy===!0)try{const{data:s,error:l}=await this._getUser(r.access_token);!l&&(s!=null&&s.user)?(r.user=s.user,await this._saveSession(r),await this._notifyAllSubscribers("SIGNED_IN",r)):this._debug(n,"could not get user data, skipping SIGNED_IN notification")}catch(s){console.error("Error getting user data:",s),this._debug(n,"error getting user data, skipping SIGNED_IN notification",s)}else await this._notifyAllSubscribers("SIGNED_IN",r)}catch(r){this._debug(n,"error",r),console.error(r);return}finally{this._debug(n,"end")}}async _callRefreshToken(t){var a,n;if(!t)throw new Kt;if(this.refreshingDeferred)return this.refreshingDeferred.promise;const r=`#_callRefreshToken(${t.substring(0,5)}...)`;this._debug(r,"begin");try{this.refreshingDeferred=new Gu;const{data:o,error:s}=await this._refreshAccessToken(t);if(s)throw s;if(!o.session)throw new Kt;await this._saveSession(o.session),await this._notifyAllSubscribers("TOKEN_REFRESHED",o.session);const l={data:o.session,error:null};return this.refreshingDeferred.resolve(l),l}catch(o){if(this._debug(r,"error",o),ne(o)){const s={data:null,error:o};return Xh(o)||await this._removeSession(),(a=this.refreshingDeferred)===null||a===void 0||a.resolve(s),s}throw(n=this.refreshingDeferred)===null||n===void 0||n.reject(o),o}finally{this.refreshingDeferred=null,this._debug(r,"end")}}async _notifyAllSubscribers(t,a,n=!0){const r=`#_notifyAllSubscribers(${t})`;this._debug(r,"begin",a,`broadcast = ${n}`);try{this.broadcastChannel&&n&&this.broadcastChannel.postMessage({event:t,session:a});const o=[],s=Array.from(this.stateChangeEmitters.values()).map(async l=>{try{await l.callback(t,a)}catch(c){o.push(c)}});if(await Promise.all(s),o.length>0){for(let l=0;l<o.length;l+=1)console.error(o[l]);throw o[0]}}finally{this._debug(r,"end")}}async _saveSession(t){this._debug("#_saveSession()",t),this.suppressGetSessionWarning=!0,await gt(this.storage,`${this.storageKey}-code-verifier`);const a=Object.assign({},t),n=a.user&&a.user.__isUserNotAvailableProxy===!0;if(this.userStorage){!n&&a.user&&await Xo(this.userStorage,this.storageKey+"-user",{user:a.user});const r=Object.assign({},a);delete r.user;const o=aw(r);await Xo(this.storage,this.storageKey,o)}else{const r=aw(a);await Xo(this.storage,this.storageKey,r)}}async _removeSession(){this._debug("#_removeSession()"),this.suppressGetSessionWarning=!1,await gt(this.storage,this.storageKey),await gt(this.storage,this.storageKey+"-code-verifier"),await gt(this.storage,this.storageKey+"-user"),this.userStorage&&await gt(this.userStorage,this.storageKey+"-user"),await this._notifyAllSubscribers("SIGNED_OUT",null)}_removeVisibilityChangedCallback(){this._debug("#_removeVisibilityChangedCallback()");const t=this.visibilityChangedCallback;this.visibilityChangedCallback=null;try{t&&yt()&&(window!=null&&window.removeEventListener)&&window.removeEventListener("visibilitychange",t)}
476catch(a){console.error("removing visibilitychange callback failed",a)}}async _startAutoRefresh(){await this._stopAutoRefresh(),this._debug("#_startAutoRefresh()");const t=setInterval(()=>this._autoRefreshTokenTick(),Zo);this.autoRefreshTicker=t,t&&typeof t=="object"&&typeof t.unref=="function"?t.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(t);const a=setTimeout(async()=>{await this.initializePromise,await this._autoRefreshTokenTick()},0);this.autoRefreshTickTimeout=a,a&&typeof a=="object"&&typeof a.unref=="function"?a.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(a)}async _stopAutoRefresh(){this._debug("#_stopAutoRefresh()");const t=this.autoRefreshTicker;this.autoRefreshTicker=null,t&&clearInterval(t);const a=this.autoRefreshTickTimeout;this.autoRefreshTickTimeout=null,a&&clearTimeout(a)}async startAutoRefresh(){this._removeVisibilityChangedCallback(),await this._startAutoRefresh()}async stopAutoRefresh(){this._removeVisibilityChangedCallback(),await this._stopAutoRefresh()}async _autoRefreshTokenTick(){this._debug("#_autoRefreshTokenTick()","begin");try{await this._acquireLock(0,async()=>{try{const t=Date.now();try{return await this._useSession(async a=>{const{data:{session:n}}=a;if(!n||!n.refresh_token||!n.expires_at){this._debug("#_autoRefreshTokenTick()","no session");return}const r=Math.floor((n.expires_at*1e3-t)/Zo);this._debug("#_autoRefreshTokenTick()",`access token expires in ${r} ticks, a tick lasts ${Zo}ms, refresh threshold is ${Hm} ticks`),r<=Hm&&await this._callRefreshToken(n.refresh_token)})}catch(a){console.error("Auto refresh tick failed with error. This is likely a transient error.",a)}}finally{this._debug("#_autoRefreshTokenTick()","end")}})}catch(t){if(t.isAcquireTimeout||t instanceof MS)this._debug("auto refresh token tick lock not available");else throw t}}async _handleVisibilityChange(){if(this._debug("#_handleVisibilityChange()"),!yt()||!(window!=null&&window.addEventListener))return this.autoRefreshToken&&this.startAutoRefresh(),!1;try{this.visibilityChangedCallback=async()=>{try{await this._onVisibilityChanged(!1)}catch(t){this._debug("#visibilityChangedCallback","error",t)}},window==null||window.addEventListener("visibilitychange",this.visibilityChangedCallback),await this._onVisibilityChanged(!0)}catch(t){console.error("_handleVisibilityChange",t)}}async _onVisibilityChanged(t){const a=`#_onVisibilityChanged(${t})`;this._debug(a,"visibilityState",document.visibilityState),document.visibilityState==="visible"?(this.autoRefreshToken&&this._startAutoRefresh(),t||(await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>{if(document.visibilityState!=="visible"){this._debug(a,"acquired the lock to recover the session, but the browser visibilityState is no longer visible, aborting");return}await this._recoverAndRefresh()}))):document.visibilityState==="hidden"&&this.autoRefreshToken&&this._stopAutoRefresh()}async _getUrlForProvider(t,a,n){const r=[`provider=${encodeURIComponent(a)}`];if(n!=null&&n.redirectTo&&r.push(`redirect_to=${encodeURIComponent(n.redirectTo)}`),n!=null&&n.scopes&&r.push(`scopes=${encodeURIComponent(n.scopes)}`),this.flowType==="pkce"){const[o,s]=await Ho(this.storage,this.storageKey),l=new URLSearchParams({code_challenge:`${encodeURIComponent(o)}`,code_challenge_method:`${encodeURIComponent(s)}`});r.push(l.toString())}if(n!=null&&n.queryParams){const o=new URLSearchParams(n.queryParams);r.push(o.toString())}return n!=null&&n.skipBrowserRedirect&&r.push(`skip_http_redirect=${n.skipBrowserRedirect}`),`${t}?${r.join("&")}`}async _unenroll(t){try{return await this._useSession(async a=>{var n;const{data:r,error:o}=a;return o?this._returnResult({data:null,error:o}):await ce(this.fetch,"DELETE",`${this.url}/factors/${t.factorId}`,{headers:this.headers,jwt:(n=r==null?void 0:r.session)===null||n===void 0?void 0:n.access_token})})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async _enroll(t){try{return await this._useSession(async a=>{var n,r;const{data:o,error:s}=a;if(s)return this._returnResult({data:null,error:s});const l=Object.assign({friendly_name:t.friendlyName,factor_type:t.factorType},t.factorType==="phone"?{phone:t.phone}:t.factorType==="totp"?{issuer:t.issuer}:{}),{data:c,error:d}=await ce(this.fetch,"POST",`${this.url}/factors`,{body:l,headers:this.headers,jwt:(n=o==null?void 0:o.session)===null||n===void 0?void 0:n.access_token});return d?this._returnResult({data:null,error:d}):(t.factorType==="totp"&&c.type==="totp"&&(!((r=c==null?void 0:c.totp)===null||r===void 0)&&r.qr_code)&&(c.totp.qr_code=`data:image/svg+xml;utf-8,${c.totp.qr_code}`),this._returnResult({data:c,error:null}))})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async _verify(t){return this._acquireLock(this.lockAcquireTimeout,async()=>{try{return await this._useSession(async a=>{var n;const{data:r,error:o}=a;if(o)return this._returnResult({data:null,error:o});const s=Object.assign({challenge_id:t.challengeId},"webauthn"in t?{webauthn:Object.assign(Object.assign({},t.webauthn),{credential_response:t.webauthn.type==="create"?GU(t.webauthn.credential_response):FU(t.webauthn.credential_response)})}:{code:t.code}),{data:l,error:c}=await ce(this.fetch,"POST",`${this.url}/factors/${t.factorId}/verify`,{body:s,headers:this.headers,jwt:(n=r==null?void 0:r.session)===null||n===void 0?void 0:n.access_token});return c?this._returnResult({data:null,error:c}):(await this._saveSession(Object.assign({expires_at:Math.round(Date.now()/1e3)+l.expires_in},l)),await this._notifyAllSubscribers("MFA_CHALLENGE_VERIFIED",l),this._returnResult({data:l,error:c}))})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}})}async _challenge(t){return this._acquireLock(this.lockAcquireTimeout,async()=>{try{return await this._useSession(async a=>{var n;const{data:r,error:o}=a;if(o)return this._returnResult({data:null,error:o});const s=await ce(this.fetch,"POST",`${this.url}/factors/${t.factorId}/challenge`,{body:t,headers:this.headers,jwt:(n=r==null?void 0:r.session)===null||n===void 0?void 0:n.access_token});if(s.error)return s;const{data:l}=s;if(l.type!=="webauthn")return{data:l,error:null};switch(l.webauthn.type){case"create":return{data:Object.assign(Object.assign({},l),{webauthn:Object.assign(Object.assign({},l.webauthn),{credential_options:Object.assign(Object.assign({},l.webauthn.credential_options),{publicKey:LU(l.webauthn.credential_options.publicKey)})})}),error:null};case"request":return{data:Object.assign(Object.assign({},l),{webauthn:Object.assign(Object.assign({},l.webauthn),{credential_options:Object.assign(Object.assign({},l.webauthn.credential_options),{publicKey:OU(l.webauthn.credential_options.publicKey)})})}),error:null}}})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}})}async _challengeAndVerify(t){const{data:a,error:n}=await this._challenge({factorId:t.factorId});return n?this._returnResult({data:null,error:n}):await this._verify({factorId:t.factorId,challengeId:a.id,code:t.code})}async _listFactors(){var t;const{data:{user:a},error:n}=await this.getUser();if(n)return{data:null,error:n};const r={all:[],phone:[],totp:[],webauthn:[]};for(const o of(t=a==null?void 0:a.factors)!==null&&t!==void 0?t:[])r.all.push(o),o.status==="verified"&&r[o.factor_type].push(o);return{data:r,error:null}}async _getAuthenticatorAssuranceLevel(t){var a,n,r,o;
476if(t)try{const{payload:p}=Rc(t);let b=null;p.aal&&(b=p.aal);let g=b;const{data:{user:v},error:w}=await this.getUser(t);if(w)return this._returnResult({data:null,error:w});((n=(a=v==null?void 0:v.factors)===null||a===void 0?void 0:a.filter(k=>k.status==="verified"))!==null&&n!==void 0?n:[]).length>0&&(g="aal2");const x=p.amr||[];return{data:{currentLevel:b,nextLevel:g,currentAuthenticationMethods:x},error:null}}catch(p){if(ne(p))return this._returnResult({data:null,error:p});throw p}const{data:{session:s},error:l}=await this.getSession();if(l)return this._returnResult({data:null,error:l});if(!s)return{data:{currentLevel:null,nextLevel:null,currentAuthenticationMethods:[]},error:null};const{payload:c}=Rc(s.access_token);let d=null;c.aal&&(d=c.aal);let u=d;((o=(r=s.user.factors)===null||r===void 0?void 0:r.filter(p=>p.status==="verified"))!==null&&o!==void 0?o:[]).length>0&&(u="aal2");const m=c.amr||[];return{data:{currentLevel:d,nextLevel:u,currentAuthenticationMethods:m},error:null}}async _getAuthorizationDetails(t){try{return await this._useSession(async a=>{const{data:{session:n},error:r}=a;return r?this._returnResult({data:null,error:r}):n?await ce(this.fetch,"GET",`${this.url}/oauth/authorizations/${t}`,{headers:this.headers,jwt:n.access_token,xform:o=>({data:o,error:null})}):this._returnResult({data:null,error:new Kt})})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async _approveAuthorization(t,a){try{return await this._useSession(async n=>{const{data:{session:r},error:o}=n;if(o)return this._returnResult({data:null,error:o});if(!r)return this._returnResult({data:null,error:new Kt});const s=await ce(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:r.access_token,body:{action:"approve"},xform:l=>({data:l,error:null})});return s.data&&s.data.redirect_url&&yt()&&!(a!=null&&a.skipBrowserRedirect)&&window.location.assign(s.data.redirect_url),s})}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async _denyAuthorization(t,a){try{return await this._useSession(async n=>{const{data:{session:r},error:o}=n;if(o)return this._returnResult({data:null,error:o});if(!r)return this._returnResult({data:null,error:new Kt});const s=await ce(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:r.access_token,body:{action:"deny"},xform:l=>({data:l,error:null})});return s.data&&s.data.redirect_url&&yt()&&!(a!=null&&a.skipBrowserRedirect)&&window.location.assign(s.data.redirect_url),s})}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async _listOAuthGrants(){try{return await this._useSession(async t=>{const{data:{session:a},error:n}=t;return n?this._returnResult({data:null,error:n}):a?await ce(this.fetch,"GET",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:a.access_token,xform:r=>({data:r,error:null})}):this._returnResult({data:null,error:new Kt})})}catch(t){if(ne(t))return this._returnResult({data:null,error:t});throw t}}async _revokeOAuthGrant(t){try{return await this._useSession(async a=>{const{data:{session:n},error:r}=a;return r?this._returnResult({data:null,error:r}):n?(await ce(this.fetch,"DELETE",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:n.access_token,query:{client_id:t.clientId},noResolveJson:!0}),{data:{},error:null}):this._returnResult({data:null,error:new Kt})})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async fetchJwk(t,a={keys:[]}){let n=a.keys.find(l=>l.kid===t);if(n)return n;const r=Date.now();if(n=this.jwks.keys.find(l=>l.kid===t),n&&this.jwks_cached_at+Jq>r)return n;const{data:o,error:s}=await ce(this.fetch,"GET",`${this.url}/.well-known/jwks.json`,{headers:this.headers});if(s)throw s;return!o.keys||o.keys.length===0||(this.jwks=o,this.jwks_cached_at=r,n=o.keys.find(l=>l.kid===t),!n)?null:n}async getClaims(t,a={}){try{let n=t;if(!n){const{data:p,error:b}
476=await this.getSession();if(b||!p.session)return this._returnResult({data:null,error:b});n=p.session.access_token}const{header:r,payload:o,signature:s,raw:{header:l,payload:c}}=Rc(n);a!=null&&a.allowExpired||vU(o.exp);const d=!r.alg||r.alg.startsWith("HS")||!r.kid||!("crypto"in globalThis&&"subtle"in globalThis.crypto)?null:await this.fetchJwk(r.kid,a!=null&&a.keys?{keys:a.keys}:a==null?void 0:a.jwks);if(!d){const{error:p}=await this.getUser(n);if(p)throw p;return{data:{claims:o,header:r,signature:s},error:null}}const u=bU(r.alg),h=await crypto.subtle.importKey("jwk",d,u,!0,["verify"]);if(!await crypto.subtle.verify(u,h,s,oU(`${l}.${c}`)))throw new Wm("Invalid JWT signature");return{data:{claims:o,header:r,signature:s},error:null}}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}}Nl.nextInstanceID={};const QU=Nl,ZU="2.95.3";let Es="";typeof Deno<"u"?Es="deno":typeof document<"u"?Es="web":typeof navigator<"u"&&navigator.product==="ReactNative"?Es="react-native":Es="node";const XU={"X-Client-Info":`supabase-js-${Es}/${ZU}`},e3={headers:XU},t3={schema:"public"},a3={autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"implicit"},n3={};function El(e){"@babel/helpers - typeof";return El=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},El(e)}function r3(e,t){if(El(e)!="object"||!e)return e;var a=e[Symbol.toPrimitive];if(a!==void 0){var n=a.call(e,t||"default");if(El(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function o3(e){var t=r3(e,"string");return El(t)=="symbol"?t:t+""}function i3(e,t,a){return(t=o3(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function cw(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),a.push.apply(a,n)}return a}function Ye(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{};t%2?cw(Object(a),!0).forEach(function(n){i3(e,n,a[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):cw(Object(a)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))})}return e}const s3=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),l3=()=>Headers,c3=(e,t,a)=>{const n=s3(a),r=l3();return async(o,s)=>{var l;const c=(l=await t())!==null&&l!==void 0?l:e;let d=new r(s==null?void 0:s.headers);return d.has("apikey")||d.set("apikey",e),d.has("Authorization")||d.set("Authorization",`Bearer ${c}`),n(o,Ye(Ye({},s),{},{headers:d}))}};function d3(e){return e.endsWith("/")?e:e+"/"}function u3(e,t){var a,n;const{db:r,auth:o,realtime:s,global:l}=e,{db:c,auth:d,realtime:u,global:h}=t,m={db:Ye(Ye({},c),r),auth:Ye(Ye({},d),o),realtime:Ye(Ye({},u),s),storage:{},global:Ye(Ye(Ye({},h),l),{},{headers:Ye(Ye({},(a=h==null?void 0:h.headers)!==null&&a!==void 0?a:{}),(n=l==null?void 0:l.headers)!==null&&n!==void 0?n:{})}),accessToken:async()=>""};return e.accessToken?m.accessToken=e.accessToken:delete m.accessToken,m}function h3(e){const t=e==null?void 0:e.trim();if(!t)throw new Error("supabaseUrl is required.");if(!t.match(/^https?:\/\//i))throw new Error("Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.");try{return new URL(d3(t))}catch{throw Error("Invalid supabaseUrl: Provided URL is malformed.")}}var p3=class extends QU{constructor(e){super(e)}},m3=class{constructor(e,t,a){var n,r;this.supabaseUrl=e,this.supabaseKey=t;const o=h3(e);if(!t)throw new Error("supabaseKey is required.");this.realtimeUrl=new URL("realtime/v1",o),this.realtimeUrl.protocol=this.realtimeUrl.protocol.replace("http","ws"),this.authUrl=new URL("auth/v1",o),this.storageUrl=new URL("storage/v1",o),this.functionsUrl=new URL("functions/v1",o);const s=`sb-${o.hostname.split(".")[0]}-auth-token`,l={db:t3,realtime:n3,auth:Ye(Ye({},a3),{},{storageKey:s}),global:e3},c=u3(a??{},l);if(this.storageKey=(n=c.auth.storageKey)!==null&&n!==void 0?n:"",this.headers=(r=c.global.headers)!==null&&r!==void 0?r:{},c.accessToken)this.accessToken=c.accessToken,this.auth=new Proxy({},{get:(u,h)=>{throw new Error(`@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.${String(h)} is not possible`)}});else{var d;this.auth=this._initSupabaseAuthClient((d=c.auth)!==null&&d!==void 0?d:{},this.headers,c.global.fetch)}this.fetch=c3(t,this._getAccessToken.bind(this),c.global.fetch),this.realtime=this._initRealtimeClient(Ye({headers:this.headers,accessToken:this._getAccessToken.bind(this)},c.realtime)),this.accessToken&&Promise.resolve(this.accessToken()).then(u=>this.realtime.setAuth(u)).catch(u=>console.warn("Failed to set initial Realtime auth token:",u)),this.rest=new Z_(new URL("rest/v1",o).href,{headers:this.headers,schema:c.db.schema,fetch:this.fetch,timeout:c.db.timeout,urlLengthLimit:c.db.urlLengthLimit}),this.storage=new Vq(this.storageUrl.href,this.headers,this.fetch,a==null?void 0:a.storage),c.accessToken||this._listenForAuthEvents()}get functions(){return new B_(this.functionsUrl.href,{headers:this.headers,customFetch:this.fetch})}from(e){return this.rest.from(e)}schema(e){return this.rest.schema(e)}rpc(e,t={},a={head:!1,get:!1,count:void 0}){return this.rest.rpc(e,t,a)}
476channel(e,t={config:{}}){return this.realtime.channel(e,t)}getChannels(){return this.realtime.getChannels()}removeChannel(e){return this.realtime.removeChannel(e)}removeAllChannels(){return this.realtime.removeAllChannels()}async _getAccessToken(){var e=this,t,a;if(e.accessToken)return await e.accessToken();const{data:n}=await e.auth.getSession();return(t=(a=n.session)===null||a===void 0?void 0:a.access_token)!==null&&t!==void 0?t:e.supabaseKey}_initSupabaseAuthClient({autoRefreshToken:e,persistSession:t,detectSessionInUrl:a,storage:n,userStorage:r,storageKey:o,flowType:s,lock:l,debug:c,throwOnError:d},u,h){const m={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new p3({url:this.authUrl.href,headers:Ye(Ye({},m),u),storageKey:o,autoRefreshToken:e,persistSession:t,detectSessionInUrl:a,storage:n,userStorage:r,flowType:s,lock:l,debug:c,throwOnError:d,fetch:h,hasCustomAuthorizationHeader:Object.keys(this.headers).some(p=>p.toLowerCase()==="authorization")})}_initRealtimeClient(e){return new fq(this.realtimeUrl.href,Ye(Ye({},e),{},{params:Ye(Ye({},{apikey:this.supabaseKey}),e==null?void 0:e.params)}))}_listenForAuthEvents(){return this.auth.onAuthStateChange((e,t)=>{this._handleTokenChanged(e,"CLIENT",t==null?void 0:t.access_token)})}_handleTokenChanged(e,t,a){(e==="TOKEN_REFRESHED"||e==="SIGNED_IN")&&this.changedAccessToken!==a?(this.changedAccessToken=a,this.realtime.setAuth(a)):e==="SIGNED_OUT"&&(this.realtime.setAuth(),t=="STORAGE"&&this.auth.signOut(),this.changedAccessToken=void 0)}};const f3=(e,t,a)=>new m3(e,t,a);function g3(){if(typeof window<"u")return!1;const e=globalThis.process;if(!e)return!1;const t=e.version;if(t==null)return!1;const a=t.match(/^v(\d+)\./);return a?parseInt(a[1],10)<=18:!1}g3()&&console.warn("â ï¸ Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");function y3(){var v,w;if(typeof window>"u")return;const e=location.hostname,a=["lovableproject.com","lovableproject-dev.com","lovable.app","gpt-eng.com","gptengineer.run"].some(y=>e===y||e.endsWith("."+y)),n="[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",r=a?((v=e.match(new RegExp("^(?:id-preview(?:-[a-z0-9]+)?|project)--("+n+")(?:-dev)?(?=\\.|$)","i")))==null?void 0:v[1])??((w=e.match(new RegExp("^("+n+")(?=[.-])","i")))==null?void 0:w[1]):void 0,o=window.parent&&window.parent!==window;if(!r||!o)return localStorage;const s=e.endsWith(".lovableproject-dev.com")||e.endsWith(".gpt-eng.com"),l=s?/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$|^http:\/\/localhost:3000$/:/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$/,c=location.ancestorOrigins&&location.ancestorOrigins[0]||(document.referrer?new URL(document.referrer).origin:""),d=c&&l.test(c)?[c]:s?["https://lovable.dev","http://localhost:3000"]:["https://lovable.dev"],u="lovable-preview-auth:result",h=2e3,m=()=>Math.random().toString(36).slice(2)+Date.now().toString(36),p=(y,x,k)=>new Promise(C=>{const S=m();let A=!1,P;const I=z=>{A||(A=!0,clearTimeout(P),window.removeEventListener("message",N),C(z))},N=z=>{if(d.indexOf(z.origin)<0)return;const L=z.data;L&&L.type===u&&L.requestId===S&&I(L)};window.addEventListener("message",N);const V={type:y,requestId:S,projectId:r,key:x};k!==void 0&&(V.value=k);for(const z of d)window.parent.postMessage(V,z);P=setTimeout(()=>I(null),h)});let b=!0;const g=250;return{getItem:async y=>{let x=await p("lovable-preview-auth:get",y);return!x&&b&&(await new Promise(k=>setTimeout(k,g)),x=await p("lovable-preview-auth:get",y)),b=!1,x&&x.ok&&typeof x.value=="string"?x.value===""?(localStorage.removeItem(y),null):x.value:localStorage.getItem(y)},setItem:(y,x)=>(localStorage.setItem(y,x),p("lovable-preview-auth:set",y,x).then(()=>{})),removeItem:y=>(localStorage.removeItem(y),p("lovable-preview-auth:remove",y).then(()=>{}))}}const v3="https://nvnfsxutfggupsawffrl.supabase.co",b3="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im52bmZzeHV0ZmdndXBzYXdmZnJsIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzA0OTk1NzMsImV4cCI6MjA4NjA3NTU3M30.atNa2aOtlFqYhQWzR-jW0-tDbEVvkbfvNs0zK9DxF6c",Qa=f3(v3,b3,{auth:{storage:y3(),persistSession:!0,autoRefreshToken:!0}}),GS=f.createContext(void 0);function w3({children:e}){const[t,a]=f.useState(null),[n,r]=f.useState(null),[o,s]=f.useState(!0);f.useEffect(()=>{const{data:{subscription:m}}=Qa.auth.onAuthStateChange((p,b)=>{r(b),a((b==null?void 0:b.user)??null),s(!1)});return Qa.auth.getSession().then(({data:{session:p}})=>{r(p),a((p==null?void 0:p.user)??null),s(!1)}),()=>m.unsubscribe()},[]);const l=async(m,p,b)=>{const{error:g}=await Qa.auth.signUp({email:m,password:p,options:{emailRedirectTo:`${window.location.origin}/dashboard`,data:{full_name:b==null?void 0:b.fullName,role_type:(b==null?void 0:b.roleType)||"brand",company_name:b==null?void 0:b.companyName,vat_number:b==null?void 0:b.vatNumber}}});return{error:g}},c=async(m,p)=>{const{error:b}=await Qa.auth.signInWithPassword({email:m,password:p});return{error:b}},d=async()=>{const{error:m}=await Qa.auth.signInWithOAuth({provider:"google",options:{redirectTo:`${window.location.origin}/dashboard`}});return{error:m}},u=async m=>{const{error:p}=await Qa.auth.resetPasswordForEmail(m,{redirectTo:"https://app.heroshots.ai/login"});return{error:p}},h=async()=>{await Qa.auth.signOut()};return i.jsx(GS.Provider,{value:{user:t,session:n,loading:o,signUp:l,signIn:c,signInWithGoogle:d,resetPassword:u,signOut:h},children:e})}function x3(){const e=f.useContext(GS);if(!e)throw new Error("useAuth must be used within AuthProvider");return e}function Hr({children:e}){const{user:t,loading:a}=x3(),[n,r]=f.useState(null);return f.useEffect(()=>{t&&Qa.from("user_roles").select("role").eq("user_id",t.id).then(({data:o})=>{r(o&&o.length>0)})},[t]),f.useEffect(()=>{!a&&!t&&(window.location.href="https://app.heroshots.ai/login")},[a,t]),a||t&&n===null?i.jsx("div",{className:"min-h-screen bg-background flex items-center justify-center",children:i.jsx("div",{className:"animate-pulse text-muted-foreground",children:"Caricamento..."})}):t?n?i.jsx(i.Fragment,{children:e}):i.jsx(Xr,{to:"/onboarding/role",replace:!0}):i.jsx("div",{className:"min-h-screen bg-background flex items-center justify-center",children:i.jsx("div",{className:"animate-pulse text-muted-foreground",children:"Redirecting..."})})}const ue=e=>typeof e=="string",As=()=>{let e,t;const a=new Promise((n,r)=>{e=n,t=r});return a.resolve=e,a.reject=t,a},dw=e=>e==null?"":""+e,k3=(e,t,a)=>{e.forEach(n=>{t[n]&&(a[n]=t[n])})},C3=/###/g,uw=e=>e&&e.indexOf("###")>-1?e.replace(C3,"."):e,hw=e=>!e||ue(e),Js=(e,t,a)=>
vendor: 5,862 bytes, line 476
476{const n=ue(t)?t.split("."):t;let r=0;for(;r<n.length-1;){if(hw(e))return{};const o=uw(n[r]);!e[o]&&a&&(e[o]=new a),Object.prototype.hasOwnProperty.call(e,o)?e=e[o]:e={},++r}return hw(e)?{}:{obj:e,k:uw(n[r])}},pw=(e,t,a)=>{const{obj:n,k:r}=Js(e,t,Object);if(n!==void 0||t.length===1){n[r]=a;return}let o=t[t.length-1],s=t.slice(0,t.length-1),l=Js(e,s,Object);for(;l.obj===void 0&&s.length;)o=`${s[s.length-1]}.${o}`,s=s.slice(0,s.length-1),l=Js(e,s,Object),l!=null&&l.obj&&typeof l.obj[`${l.k}.${o}`]<"u"&&(l.obj=void 0);l.obj[`${l.k}.${o}`]=a},S3=(e,t,a,n)=>{const{obj:r,k:o}=Js(e,t,Object);r[o]=r[o]||[],r[o].push(a)},Wd=(e,t)=>{const{obj:a,k:n}=Js(e,t);if(a&&Object.prototype.hasOwnProperty.call(a,n))return a[n]},A3=(e,t,a)=>{const n=Wd(e,a);return n!==void 0?n:Wd(t,a)},FS=(e,t,a)=>{for(const n in t)n!=="__proto__"&&n!=="constructor"&&(n in e?ue(e[n])||e[n]instanceof String||ue(t[n])||t[n]instanceof String?a&&(e[n]=t[n]):FS(e[n],t[n],a):e[n]=t[n]);return e},$o=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var P3={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const T3=e=>ue(e)?e.replace(/[&<>"'\/]/g,t=>P3[t]):e;class I3{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const a=this.regExpMap.get(t);if(a!==void 0)return a;const n=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,n),this.regExpQueue.push(t),n}}const j3=[" ",",","?","!",";"],N3=new I3(20),E3=(e,t,a)=>{t=t||"",a=a||"";const n=j3.filter(s=>t.indexOf(s)<0&&a.indexOf(s)<0);if(n.length===0)return!0;const r=N3.getRegExp(`(${n.map(s=>s==="?"?"\\?":s).join("|")})`);let o=!r.test(e);if(!o){const s=e.indexOf(a);s>0&&!r.test(e.substring(0,s))&&(o=!0)}return o},$m=(e,t,a=".")=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;const n=t.split(a);let r=e;for(let o=0;o<n.length;){if(!r||typeof r!="object")return;let s,l="";for(let c=o;c<n.length;++c)if(c!==o&&(l+=a),l+=n[c],s=r[l],s!==void 0){if(["string","number","boolean"].indexOf(typeof s)>-1&&c<n.length-1)continue;o+=c-o+1;break}r=s}return r},zl=e=>e==null?void 0:e.replace("_","-"),z3={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){var a,n;(n=(a=console==null?void 0:console[e])==null?void 0:a.apply)==null||n.call(a,console,t)}};class $d{constructor(t,a={}){this.init(t,a)}init(t,a={}){this.prefix=a.prefix||"i18next:",this.logger=t||z3,this.options=a,this.debug=a.debug}log(...t){return this.forward(t,"log","",!0)}warn(...t){return this.forward(t,"warn","",!0)}error(...t){return this.forward(t,"error","")}deprecate(...t){return this.forward(t,"warn","WARNING DEPRECATED: ",!0)}forward(t,a,n,r){return r&&!this.debug?null:(ue(t[0])&&(t[0]=`${n}${this.prefix} ${t[0]}`),this.logger[a](t))}create(t){return new $d(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t=t||this.options,t.prefix=t.prefix||this.prefix,new $d(this.logger,t)}}var on=new $d;class Fu{constructor(){this.observers={}}on(t,a){return t.split(" ").forEach(n=>{this.observers[n]||(this.observers[n]=new Map);const r=this.observers[n].get(a)||0;this.observers[n].set(a,r+1)}),this}off(t,a){if(this.observers[t]){if(!a){delete this.observers[t];return}this.observers[t].delete(a)}}emit(t,...a){this.observers[t]&&Array.from(this.observers[t].entries()).forEach(([r,o])=>{for(let s=0;s<o;s++)r(...a)}),this.observers["*"]&&Array.from(this.observers["*"].entries()).forEach(([r,o])=>{for(let s=0;s<o;s++)r.apply(r,[t,...a])})}}class mw extends Fu{constructor(t,a={ns:["translation"],defaultNS:"translation"}){super(),this.data=t||{},this.options=a,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const a=this.options.ns.indexOf(t);a>-1&&this.options.ns.splice(a,1)}getResource(t,a,n,r={}){var d,u;const o=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,s=r.ignoreJSONStructure!==void 0?r.ignoreJSONStructure:this.options.ignoreJSONStructure;let l;t.indexOf(".")>-1?l=t.split("."):(l=[t,a],n&&(Array.isArray(n)?l.push(...n):ue(n)&&o?l.push(...n.split(o)):l.push(n)));const c=Wd(this.data,l);return!c&&!a&&!n&&t.indexOf(".")>-1&&(t=l[0],a=l[1],n=l.slice(2).join(".")),c||!s||!ue(n)?c:$m((u=(d=this.data)==null?void 0:d[t])==null?void 0:u[a],n,o)}addResource(t,a,n,r,o={silent:!1}){const s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let l=[t,a];n&&(l=l.concat(s?n.split(s):n)),t.indexOf(".")>-1&&(l=t.split("."),r=a,a=l[1]),this.addNamespaces(a),pw(this.data,l,r),o.silent||this.emit("added",t,a,n,r)}addResources(t,a,n,r={silent:!1}){for(const o in n)(ue(n[o])||Array.isArray(n[o]))&&this.addResource(t,a,o,n[o],{silent:!0});r.silent||this.emit("added",t,a,n)}addResourceBundle(t,a,n,r,o,s={silent:!1,skipCopy:!1}){let l=[t,a];t.indexOf(".")>-1&&(l=t.split("."),r=n,n=a,a=l[1]),this.addNamespaces(a);let c=Wd(this.data,l)||{};s.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?FS(c,n,o):c={...c,...n},pw(this.data,l,c),s.silent||this.emit("added",t,a,n)}removeResourceBundle(t,a){this.hasResourceBundle(t,a)&&delete this.data[t][a],this.removeNamespaces(a),this.emit("removed",t,a)}hasResourceBundle(t,a){return this.getResource(t,a)!==void 0}getResourceBundle(t,a){return a||(a=this.options.defaultNS),this.getResource(t,a)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const a=this.getDataByLanguage(t);return!!(a&&Object.keys(a)||[]).find(r=>a[r]&&Object.keys(a[r]).length>0)}toJSON(){return this.data}}var HS={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,a,n,r){return e.forEach(o=>{var s;
vendor: 5,273 bytes, line 476
476t=((s=this.processors[o])==null?void 0:s.process(t,a,n,r))??t}),t}};const BS=Symbol("i18next/PATH_KEY");function R3(){const e=[],t=Object.create(null);let a;return t.get=(n,r)=>{var o;return(o=a==null?void 0:a.revoke)==null||o.call(a),r===BS?e:(e.push(r),a=Proxy.revocable(n,t),a.proxy)},Proxy.revocable(Object.create(null),t).proxy}function Km(e,t){const{[BS]:a}=e(R3());return a.join((t==null?void 0:t.keySeparator)??".")}const fw={},ap=e=>!ue(e)&&typeof e!="boolean"&&typeof e!="number";class Kd extends Fu{constructor(t,a={}){super(),k3(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=a,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=on.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t,a={interpolation:{}}){const n={...a};if(t==null)return!1;const r=this.resolve(t,n);if((r==null?void 0:r.res)===void 0)return!1;const o=ap(r.res);return!(n.returnObjects===!1&&o)}extractFromKey(t,a){let n=a.nsSeparator!==void 0?a.nsSeparator:this.options.nsSeparator;n===void 0&&(n=":");const r=a.keySeparator!==void 0?a.keySeparator:this.options.keySeparator;let o=a.ns||this.options.defaultNS||[];const s=n&&t.indexOf(n)>-1,l=!this.options.userDefinedKeySeparator&&!a.keySeparator&&!this.options.userDefinedNsSeparator&&!a.nsSeparator&&!E3(t,n,r);if(s&&!l){const c=t.match(this.interpolator.nestingRegexp);if(c&&c.length>0)return{key:t,namespaces:ue(o)?[o]:o};const d=t.split(n);(n!==r||n===r&&this.options.ns.indexOf(d[0])>-1)&&(o=d.shift()),t=d.join(r)}return{key:t,namespaces:ue(o)?[o]:o}}translate(t,a,n){let r=typeof a=="object"?{...a}:a;if(typeof r!="object"&&this.options.overloadTranslationOptionHandler&&(r=this.options.overloadTranslationOptionHandler(arguments)),typeof r=="object"&&(r={...r}),r||(r={}),t==null)return"";typeof t=="function"&&(t=Km(t,{...this.options,...r})),Array.isArray(t)||(t=[String(t)]);const o=r.returnDetails!==void 0?r.returnDetails:this.options.returnDetails,s=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,{key:l,namespaces:c}=this.extractFromKey(t[t.length-1],r),d=c[c.length-1];let u=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;u===void 0&&(u=":");const h=r.lng||this.language,m=r.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if((h==null?void 0:h.toLowerCase())==="cimode")return m?o?{res:`${d}${u}${l}`,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(r)}:`${d}${u}${l}`:o?{res:l,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(r)}:l;const p=this.resolve(t,r);let b=p==null?void 0:p.res;const g=(p==null?void 0:p.usedKey)||l,v=(p==null?void 0:p.exactUsedKey)||l,w=["[object Number]","[object Function]","[object RegExp]"],y=r.joinArrays!==void 0?r.joinArrays:this.options.joinArrays,x=!this.i18nFormat||this.i18nFormat.handleAsObject,k=r.count!==void 0&&!ue(r.count),C=Kd.hasDefaultValue(r),S=k?this.pluralResolver.getSuffix(h,r.count,r):"",A=r.ordinal&&k?this.pluralResolver.getSuffix(h,r.count,{ordinal:!1}):"",P=k&&!r.ordinal&&r.count===0,I=P&&r[`defaultValue${this.options.pluralSeparator}zero`]||r[`defaultValue${S}`]||r[`defaultValue${A}`]||r.defaultValue;let N=b;x&&!b&&C&&(N=I);const V=ap(N),z=Object.prototype.toString.apply(N);if(x&&N&&V&&w.indexOf(z)<0&&!(ue(y)&&Array.isArray(N))){if(!r.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const L=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,N,{...r,ns:c}):`key '${l} (${this.language})' returned an object instead of string.`;return o?(p.res=L,p.usedParams=this.getUsedParamsDetails(r),p):L}if(s){const L=Array.isArray(N),E=L?[]:{},K=L?v:g;for(const F in N)if(Object.prototype.hasOwnProperty.call(N,F)){const Z=`${K}${s}${F}`;C&&!b?E[F]=this.translate(Z,{...r,defaultValue:ap(I)?I[F]:void 0,joinArrays:!1,ns:c}):E[F]=this.translate(Z,{...r,joinArrays:!1,ns:c}),E[F]===Z&&(E[F]=N[F])}b=E}}else if(x&&ue(y)&&Array.isArray(b))b=b.join(y),b&&(b=this.extendTranslation(b,t,r,n));else{let L=!1,E=!1;!this.isValidLookup(b)&&C&&(L=!0,b=I),this.isValidLookup(b)||(E=!0,b=l);const F=(r.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&E?void 0:b,Z=C&&I!==b&&this.options.updateMissing;if(E||L||Z){if(this.logger.log(Z?"updateKey":"missingKey",h,d,l,Z?I:b),s){const $=this.resolve(l,{...r,keySeparator:!1});$&&$.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let j=[];const T=this.languageUtils.getFallbackCodes(this.options.fallbackLng,r.lng||this.language);if(this.options.saveMissingTo==="fallback"&&T&&T[0])for(let $=0;$<T.length;$++)j.push(T[$]);else this.options.saveMissingTo==="all"?j=this.languageUtils.toResolveHierarchy(r.lng||this.language):j.push(r.lng||this.language);const O=($,W,se)=>{var Re;const le=C&&se!==b?se:F;this.options.missingKeyHandler?this.options.missingKeyHandler($,d,W,le,Z,r):(Re=this.backendConnector)!=null&&Re.saveMissing&&this.backendConnector.saveMissing($,d,W,le,Z,r),this.emit
vendor: 20,830 bytes, line 476
476("missingKey",$,d,W,b)};this.options.saveMissing&&(this.options.saveMissingPlurals&&k?j.forEach($=>{const W=this.pluralResolver.getSuffixes($,r);P&&r[`defaultValue${this.options.pluralSeparator}zero`]&&W.indexOf(`${this.options.pluralSeparator}zero`)<0&&W.push(`${this.options.pluralSeparator}zero`),W.forEach(se=>{O([$],l+se,r[`defaultValue${se}`]||I)})}):O(j,l,I))}b=this.extendTranslation(b,t,r,p,n),E&&b===l&&this.options.appendNamespaceToMissingKey&&(b=`${d}${u}${l}`),(E||L)&&this.options.parseMissingKeyHandler&&(b=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${d}${u}${l}`:l,L?b:void 0,r))}return o?(p.res=b,p.usedParams=this.getUsedParamsDetails(r),p):b}extendTranslation(t,a,n,r,o){var c,d;if((c=this.i18nFormat)!=null&&c.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});const u=ue(t)&&(((d=n==null?void 0:n.interpolation)==null?void 0:d.skipOnVariables)!==void 0?n.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let h;if(u){const p=t.match(this.interpolator.nestingRegexp);h=p&&p.length}let m=n.replace&&!ue(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(m={...this.options.interpolation.defaultVariables,...m}),t=this.interpolator.interpolate(t,m,n.lng||this.language||r.usedLng,n),u){const p=t.match(this.interpolator.nestingRegexp),b=p&&p.length;h<b&&(n.nest=!1)}!n.lng&&r&&r.res&&(n.lng=this.language||r.usedLng),n.nest!==!1&&(t=this.interpolator.nest(t,(...p)=>(o==null?void 0:o[0])===p[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${p[0]} in key: ${a[0]}`),null):this.translate(...p,a),n)),n.interpolation&&this.interpolator.reset()}const s=n.postProcess||this.options.postProcess,l=ue(s)?[s]:s;return t!=null&&(l!=null&&l.length)&&n.applyPostProcessor!==!1&&(t=HS.handle(l,t,a,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),t}resolve(t,a={}){let n,r,o,s,l;return ue(t)&&(t=[t]),t.forEach(c=>{if(this.isValidLookup(n))return;const d=this.extractFromKey(c,a),u=d.key;r=u;let h=d.namespaces;this.options.fallbackNS&&(h=h.concat(this.options.fallbackNS));const m=a.count!==void 0&&!ue(a.count),p=m&&!a.ordinal&&a.count===0,b=a.context!==void 0&&(ue(a.context)||typeof a.context=="number")&&a.context!=="",g=a.lngs?a.lngs:this.languageUtils.toResolveHierarchy(a.lng||this.language,a.fallbackLng);h.forEach(v=>{var w,y;this.isValidLookup(n)||(l=v,!fw[`${g[0]}-${v}`]&&((w=this.utils)!=null&&w.hasLoadedNamespace)&&!((y=this.utils)!=null&&y.hasLoadedNamespace(l))&&(fw[`${g[0]}-${v}`]=!0,this.logger.warn(`key "${r}" for languages "${g.join(", ")}" won't get resolved as namespace "${l}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),g.forEach(x=>{var S;if(this.isValidLookup(n))return;s=x;const k=[u];if((S=this.i18nFormat)!=null&&S.addLookupKeys)this.i18nFormat.addLookupKeys(k,u,x,v,a);else{let A;m&&(A=this.pluralResolver.getSuffix(x,a.count,a));const P=`${this.options.pluralSeparator}zero`,I=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(m&&(a.ordinal&&A.indexOf(I)===0&&k.push(u+A.replace(I,this.options.pluralSeparator)),k.push(u+A),p&&k.push(u+P)),b){const N=`${u}${this.options.contextSeparator||"_"}${a.context}`;k.push(N),m&&(a.ordinal&&A.indexOf(I)===0&&k.push(N+A.replace(I,this.options.pluralSeparator)),k.push(N+A),p&&k.push(N+P))}}let C;for(;C=k.pop();)this.isValidLookup(n)||(o=C,n=this.getResource(x,v,C,a))}))})}),{res:n,usedKey:r,exactUsedKey:o,usedLng:s,usedNS:l}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,a,n,r={}){var o;return(o=this.i18nFormat)!=null&&o.getResource?this.i18nFormat.getResource(t,a,n,r):this.resourceStore.getResource(t,a,n,r)}getUsedParamsDetails(t={}){const a=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],n=t.replace&&!ue(t.replace);let r=n?t.replace:t;if(n&&typeof t.count<"u"&&(r.count=t.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!n){r={...r};for(const o of a)delete r[o]}return r}static hasDefaultValue(t){const a="defaultValue";for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&a===n.substring(0,a.length)&&t[n]!==void 0)return!0;return!1}}class gw{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=on.create("languageUtils")}getScriptPartFromCode(t){if(t=zl(t),!t||t.indexOf("-")<0)return null;const a=t.split("-");return a.length===2||(a.pop(),a[a.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(a.join("-"))}getLanguagePartFromCode(t){if(t=zl(t),!t||t.indexOf("-")<0)return t;const a=t.split("-");return this.formatLanguageCode(a[0])}formatLanguageCode(t){if(ue(t)&&t.indexOf("-")>-1){let a;try{a=Intl.getCanonicalLocales(t)[0]}catch{}return a&&this.options.lowerCaseLng&&(a=a.toLowerCase()),a||(this.options.lowerCaseLng?t.toLowerCase():t)}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let a;return t.forEach(n=>{if(a)return;const r=this.formatLanguageCode(n);(!this.options.supportedLngs||this.isSupportedCode(r))&&(a=r)}),!a&&this.options.supportedLngs&&t.forEach(n=>{if(a)return;const r=this.getScriptPartFromCode(n);if(this.isSupportedCode(r))return a=r;const o=this.getLanguagePartFromCode(n);if(this.isSupportedCode(o))return a=o;a=this.options.supportedLngs.find(s=>{if(s===o)return s;if(!(s.indexOf("-")<0&&o.indexOf("-")<0)&&(s.indexOf("-")>0&&o.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===o||s.indexOf(o)===0&&o.length>1))return s})}),a||(a=this.getFallbackCodes(this.options.fallbackLng)[0]),a}getFallbackCodes(t,a){if(!t)return[];if(typeof t=="function"&&(t=t(a)),ue(t)&&(t=[t]),Array.isArray(t))return t;if(!a)return t.default||[];let n=t[a];return n||(n=t[this.getScriptPartFromCode(a)]),n||(n=t[this.formatLanguageCode(a)]),n||(n=t[this.getLanguagePartFromCode(a)]),n||(n=t.default),n||[]}toResolveHierarchy(t,a){const n=this.getFallbackCodes((a===!1?[]:a)||this.options.fallbackLng||[],t),r=[],o=s=>{s&&(this.isSupportedCode(s)?r.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return ue(t)&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&o(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&o(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&o(this.getLanguagePartFromCode(t))):ue(t)&&o(this.formatLanguageCode(t)),n.forEach(s=>{r.indexOf(s)<0&&o(this.formatLanguageCode(s))}),r}}const yw={zero:0,one:1,two:2,few:3,many:4,other:5},vw={select:e=>e===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class D3{constructor(t,a={}){this.languageUtils=t,this.options=a,this.logger=on.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(t,a={}){const n=zl(t==="dev"?"en":t),r=a.ordinal?"ordinal":"cardinal",o=JSON.stringify({cleanedCode:n,type:r});if(o in this.pluralRulesCache)return this.pluralRulesCache[o];let s;try{s=new Intl.PluralRules(n,{type:r})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),vw;if(!t.match(/-|_/))return vw;const c=this.languageUtils.getLanguagePartFromCode(t);s=this.getRule(c,a)}return this.pluralRulesCache[o]=s,s}needsPlural(t,a={}){let n=this.getRule(t,a);return n||(n=this.getRule("dev",a)),(n==null?void 0:n.resolvedOptions().pluralCategories.length)>1}getPluralFormsOfKey(t,a,n={}){return this.getSuffixes(t,n).map(r=>`${a}${r}`)}getSuffixes(t,a={}){let n=this.getRule(t,a);return n||(n=this.getRule("dev",a)),n?n.resolvedOptions().pluralCategories.sort((r,o)=>yw[r]-yw[o]).map(r=>`${this.options.prepend}${a.ordinal?`ordinal${this.options.prepend}`:""}${r}`):[]}getSuffix(t,a,n={}){const r=this.getRule(t,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${r.select(a)}`:(this.logger.warn(`no plural rule found for: ${t}`),this.getSuffix("dev",a,n))}}const bw=(e,t,a,n=".",r=!0)=>{let o=A3(e,t,a);return!o&&r&&ue(a)&&(o=$m(e,a,n),o===void 0&&(o=$m(t,a,n))),o},np=e=>e.replace(/\$/g,"$$$$");class ww{constructor(t={}){var a;this.logger=on.create("interpolator"),this.options=t,this.format=((a=t==null?void 0:t.interpolation)==null?void 0:a.format)||(n=>n),this.init(t)}init(t={}){t.interpolation||(t.interpolation={escapeValue:!0});const{escape:a,escapeValue:n,useRawValueToEscape:r,prefix:o,prefixEscaped:s,suffix:l,suffixEscaped:c,formatSeparator:d,unescapeSuffix:u,unescapePrefix:h,nestingPrefix:m,nestingPrefixEscaped:p,nestingSuffix:b,nestingSuffixEscaped:g,nestingOptionsSeparator:v,maxReplaces:w,alwaysFormat:y}=t.interpolation;this.escape=a!==void 0?a:T3,this.escapeValue=n!==void 0?n:!0,this.useRawValueToEscape=r!==void 0?r:!1,this.prefix=o?$o(o):s||"{{",this.suffix=l?$o(l):c||"}}",this.formatSeparator=d||",",this.unescapePrefix=u?"":h||"-",this.unescapeSuffix=this.unescapePrefix?"":u||"",this.nestingPrefix=m?$o(m):p||$o("$t("),this.nestingSuffix=b?$o(b):g||$o(")"),this.nestingOptionsSeparator=v||",",this.maxReplaces=w||1e3,this.alwaysFormat=y!==void 0?y:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(a,n)=>(a==null?void 0:a.source)===n?(a.lastIndex=0,a):new RegExp(n,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(t,a,n,r){var p;let o,s,l;const c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},d=b=>{if(b.indexOf(this.formatSeparator)<0){const y=bw(a,c,b,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(y,void 0,n,{...r,...a,interpolationkey:b}):y}const g=b.split(this.formatSeparator),v=g.shift().trim(),w=g.join(this.formatSeparator).trim();return this.format(bw(a,c,v,this.options.keySeparator,this.options.ignoreJSONStructure),w,n,{...r,...a,interpolationkey:v})};this.resetRegExp();const u=(r==null?void 0:r.missingInterpolationHandler)||this.options.missingInterpolationHandler,h=((p=r==null?void 0:r.interpolation)==null?void 0:p.skipOnVariables)!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:b=>np(b)},{regex:this.regexp,safeValue:b=>this.escapeValue?np(this.escape(b)):np(b)}].forEach(b=>{for(l=0;o=b.regex.exec(t);){const g=o[1].trim();if(s=d(g),s===void 0)if(typeof u=="function"){const w=u(t,o,r);s=ue(w)?w:""}else if(r&&Object.prototype.hasOwnProperty.call(r,g))s="";else if(h){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${g} for interpolating ${t}`),s="";else!ue(s)&&!this.useRawValueToEscape&&(s=dw(s));const v=b.safeValue(s);if(t=t.replace(o[0],v),h?(b.regex.lastIndex+=s.length,b.regex.lastIndex-=o[0].length):b.regex.lastIndex=0,l++,l>=this.maxReplaces)break}}),t}nest(t,a,n={}){let r,o,s;const l=(c,d)=>{const u=this.nestingOptionsSeparator;if(c.indexOf(u)<0)return c;const h=c.split(new RegExp(`${u}[ ]*{`));let m=`{${h[1]}`;c=h[0],m=this.interpolate(m,s);const p=m.match(/'/g),b=m.match(/"/g);(((p==null?void 0:p.length)??0)%2===0&&!b||b.length%2!==0)&&(m=m.replace(/'/g,'"'));try{s=JSON.parse(m),d&&(s={...d,...s})}catch(g){return this.logger.warn(`failed parsing options string in nesting for key ${c}`,g),`${c}${u}${m}`}return s.defaultValue&&s.defaultValue.indexOf(this.prefix)>-1&&delete s.defaultValue,c};for(;r=this.nestingRegexp.exec(t);){let c=[];s={...n},s=s.replace&&!ue(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;const d=/{.*}/.test(r[1])?r[1].lastIndexOf("}")+1:r[1].indexOf(this.formatSeparator);if(d!==-1&&(c=r[1].slice(d).split(this.formatSeparator).map(u=>u.trim()).filter(Boolean),r[1]=r[1].slice(0,d)),o=a(l.call(this,r[1].trim(),s),s),o&&r[0]===t&&!ue(o))return o;ue(o)||(o=dw(o)),o||(this.logger.warn(`missed to resolve ${r[1]} for nesting ${t}`),o=""),c.length&&(o=c.reduce((u,h)=>this.format(u,h,n.lng,{...n,interpolationkey:r[1].trim()}),o.trim())),t=t.replace(r[0],o),this.regexp.lastIndex=0}return t}}const _3=e=>{let t=e.toLowerCase().trim();const a={};if(e.indexOf("(")>-1){const n=e.split("(");t=n[0].toLowerCase().trim();const r=n[1].substring(0,n[1].length-1);t==="currency"&&r.indexOf(":")<0?a.currency||(a.currency=r.trim()):t==="relativetime"&&r.indexOf(":")<0?a.range||(a.range=r.trim()):r.split(";").forEach(s=>{if(s){const[l,...c]=s.split(":"),d=c.join(":").trim().replace(/^'+|'+$/g,""),u=l.trim();a[u]||(a[u]=d),d==="false"&&(a[u]=!1),d==="true"&&(a[u]=!0),isNaN(d)||(a[u]=parseInt(d,10))}})}return{formatName:t,formatOptions:a}},xw=e=>{const t={};return(a,n,r)=>{let o=r;r&&r.interpolationkey&&r.formatParams&&r.formatParams[r.interpolationkey]&&r[r.interpolationkey]&&(o={...o,[r.interpolationkey]:void 0});const s=n+JSON.stringify(o);let l=t[s];return l||(l=e(zl(n),r),t[s]=l),l(a)}},q3=e=>(t,a,n)=>e(zl(a),n)(t);class U3{constructor(t={}){this.logger=on.create("formatter"),this.options=t,this.init(t)}init(t,a={interpolation:{}}){this.formatSeparator=a.interpolation.formatSeparator||",";const n=a.cacheInBuiltFormats?xw:q3;this.formats={number:n((r,o)=>{const s=new Intl.NumberFormat(r,{...o});return l=>s.format(l)}),currency:n((r,o)=>{const s=new Intl.NumberFormat(r,{...o,style:"currency"});return l=>s.format(l)}),datetime:n((r,o)=>{const s=new Intl.DateTimeFormat(r,{...o});return l=>s.format(l)}),relativetime:n((r,o)=>{const s=new Intl.RelativeTimeFormat(r,{...o});return l=>s.format(l,o.range||"day")}),list:n((r,o)=>{const s=new Intl.ListFormat(r,{...o});return l=>s.format(l)})}}add(t,a){this.formats[t.toLowerCase().trim()]=a}addCached(t,a){this.formats[t.toLowerCase().trim()]=xw(a)}format(t,a,n,r={}){const o=a.split(this.formatSeparator);if(o.length>1&&o[0].indexOf("(")>1&&o[0].indexOf(")")<0&&o.find(l=>l.indexOf(")")>-1)){const l=o.findIndex(c=>c.indexOf(")")>-1);o[0]=[o[0],...o.splice(1,l)].join(this.formatSeparator)}return o.reduce((l,c)=>{var h;const{formatName:d,formatOptions:u}=_3(c);if(this.formats[d]){let m=l;try{const p=((h=r==null?void 0:r.formatParams)==null?void 0:h[r.interpolationkey])||{},b=p.locale||p.lng||r.locale||r.lng||n;m=this.formats[d](l,b,{...u,...r,...p})}catch(p){this.logger.warn(p)}return m}else this.logger.warn(`there was no format function for ${d}`);return l},t)}}const M3=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)};class L3 extends Fu{constructor(t,a,n,r={}){var o,s;super(),this.backend=t,this.store=a,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=on.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],(s=(o=this.backend)==null?void 0:o.init)==null||s.call(o,n,r.backend,r)}queueLoad(t,a,n,r){const o={},s={},l={},c={};return t.forEach(d=>{let u=!0;a.forEach(h=>{const m=`${d}|${h}`;!n.reload&&this.store.hasResourceBundle(d,h)?this.state[m]=2:this.state[m]<0||(this.state[m]===1?s[m]===void 0&&(s[m]=!0):(this.state[m]=1,u=!1,s[m]===void 0&&(s[m]=!0),o[m]===void 0&&(o[m]=!0),c[h]===void 0&&(c[h]=!0)))}),u||(l[d]=!0)}),(Object.keys(o).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(o),pending:Object.keys(s),toLoadLanguages:Object.keys(l),toLoadNamespaces:Object.keys(c)}}loaded(t,a,n){const r=t.split("|"),o=r[0],s=r[1];a&&this.emit("failedLoading",o,s,a),!a&&n&&this.store.addResourceBundle(o,s,n,void 0,void 0,{skipCopy:!0}),this.state[t]=a?-1:2,a&&n&&(this.state[t]=0);const l={};this.queue.forEach(c=>{S3(c.loaded,[o],s),M3(c,t),a&&c.errors.push(a),c.pendingCount===0&&!c.done&&(Object.keys(c.loaded).forEach(d=>{l[d]||(l[d]={});const u=c.loaded[d];u.length&&u.forEach(h=>{l[d][h]===void 0&&(l[d][h]=!0)})}),c.done=!0,c.errors.length?c.callback(c.errors):c.callback())}),this.emit("loaded",l),this.queue=this.queue.filter(c=>!c.done)}read(t,a,n,r=0,o=this.retryTimeout,s){if(!t.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:a,fcName:n,tried:r,wait:o,callback:s});return}this.readingCalls++;const l=(d,u)=>{if(this.readingCalls--,this.waitingReads.length>0){const h=this.waitingReads.shift();this.read(h.lng,h.ns,h.fcName,h.tried,h.wait,h.callback)}if(d&&u&&r<this.maxRetries){setTimeout(()=>{this.read.call(this,t,a,n,r+1,o*2,s)},o);return}s(d,u)},c=this.backend[n].bind(this.backend);if(c.length===2){try{const d=c(t,a);d&&typeof d.then=="function"?d.then(u=>l(null,u)).catch(l):l(null,d)}catch(d){l(d)}return}return c(t,a,l)}prepareLoading(t,a,n={},r){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),r&&r();ue(t)&&(t=this.languageUtils.toResolveHierarchy(t)),ue(a)&&(a=[a]);const o=this.queueLoad(t,a,n,r);if(!o.toLoad.length)return o.pending.length||r(),null;o.toLoad.forEach(s=>{this.loadOne(s)})}load(t,a,n){this.prepareLoading(t,a,{},n)}reload(t,a,n){this.prepareLoading(t,a,{reload:!0},n)}loadOne(t,a=""){const n=t.split("|"),r=n[0],o=n[1];this.read(r,o,"read",void 0,void 0,(s,l)=>{s&&this.logger.warn(`${a}loading namespace ${o} for language ${r} failed`,s),!s&&l&&this.logger.log(`${a}loaded namespace ${o} for language ${r}`,l),this.loaded(t,s,l)})}saveMissing(t,a,n,r,o,s={},l=()=>{}){var c,d,u,h,m;if((d=(c=this.services)==null?void 0:c.utils)!=null&&d.hasLoadedNamespace&&!((h=(u=this.services)==null?void 0:u.utils)!=null&&h.hasLoadedNamespace(a))){this.logger.warn(`did not save key "${n}" as the namespace "${a}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(n==null||n==="")){if((m=this.backend)!=null&&m.create){const p={...s,isUpdate:o},b=this.backend.create.bind(this.backend);if(b.length<6)try{let g;b.length===5?g=b(t,a,n,r,p):g=b(t,a,n,r),g&&typeof g.then=="function"?g.then(v=>l(null,v)).catch(l):l(null,g)}catch(g){l(g)}else b(t,a,n,r,l,p)}!t||!t[0]||this.store.addResource(t[0],a,n,r)}}}const rp=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]=="object"&&(t=e[1]),ue(e[1])&&(t.defaultValue=e[1]),ue(e[2])&&(t.tDescription=e[2]),typeof e[2]=="object"||typeof e[3]=="object"){const a=e[3]||e[2];Object.keys(a).forEach(n=>{t[n]=a[n]})}return t},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),kw=e=>{var t,a;return ue(e.ns)&&(e.ns=[e.ns]),ue(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),ue(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),((a=(t=e.supportedLngs)==null?void 0:t.indexOf)==null?void 0:a.call(t,"cimode"))<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),typeof e.initImmediate=="boolean"&&(e.initAsync=e.initImmediate),e},Dc=()=>{},O3=e=>
476{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(a=>{typeof e[a]=="function"&&(e[a]=e[a].bind(e))})},G3=e=>{var t,a,n,r,o,s,l,c,d;return!!(((n=(a=(t=e==null?void 0:e.modules)==null?void 0:t.backend)==null?void 0:a.name)==null?void 0:n.indexOf("Locize"))>0||((l=(s=(o=(r=e==null?void 0:e.modules)==null?void 0:r.backend)==null?void 0:o.constructor)==null?void 0:s.name)==null?void 0:l.indexOf("Locize"))>0||(d=(c=e==null?void 0:e.options)==null?void 0:c.backend)!=null&&d.backends&&e.options.backend.backends.some(u=>{var h,m,p;return((h=u==null?void 0:u.name)==null?void 0:h.indexOf("Locize"))>0||((p=(m=u==null?void 0:u.constructor)==null?void 0:m.name)==null?void 0:p.indexOf("Locize"))>0}))};class Qs extends Fu{constructor(t={},a){if(super(),this.options=kw(t),this.services={},this.logger=on,this.modules={external:[]},O3(this),a&&!this.isInitialized&&!t.isClone){if(!this.options.initAsync)return this.init(t,a),this;setTimeout(()=>{this.init(t,a)},0)}}init(t={},a){this.isInitializing=!0,typeof t=="function"&&(a=t,t={}),t.defaultNS==null&&t.ns&&(ue(t.ns)?t.defaultNS=t.ns:t.ns.indexOf("translation")<0&&(t.defaultNS=t.ns[0]));const n=rp();this.options={...n,...this.options,...kw(t)},this.options.interpolation={...n.interpolation,...this.options.interpolation},t.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=t.keySeparator),t.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=t.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!G3(this)&&typeof console<"u"&&typeof console.info<"u"&&console.info("ð i18next is maintained with support from locize.com â consider powering your project with managed localization (AI, CDN, integrations): https://locize.com ð");const r=d=>d?typeof d=="function"?new d:d:null;if(!this.options.isClone){this.modules.logger?on.init(r(this.modules.logger),this.options):on.init(null,this.options);let d;this.modules.formatter?d=this.modules.formatter:d=U3;const u=new gw(this.options);this.store=new mw(this.options.resources,this.options);const h=this.services;h.logger=on,h.resourceStore=this.store,h.languageUtils=u,h.pluralResolver=new D3(u,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==n.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),d&&(!this.options.interpolation.format||this.options.interpolation.format===n.interpolation.format)&&(h.formatter=r(d),h.formatter.init&&h.formatter.init(h,this.options),this.options.interpolation.format=h.formatter.format.bind(h.formatter)),h.interpolator=new ww(this.options),h.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},h.backendConnector=new L3(r(this.modules.backend),h.resourceStore,h,this.options),h.backendConnector.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.languageDetector&&(h.languageDetector=r(this.modules.languageDetector),h.languageDetector.init&&h.languageDetector.init(h,this.options.detection,this.options)),this.modules.i18nFormat&&(h.i18nFormat=r(this.modules.i18nFormat),h.i18nFormat.init&&h.i18nFormat.init(this)),this.translator=new Kd(this.services,this.options),this.translator.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.external.forEach(p=>{p.init&&p.init(this)})}if(this.format=this.options.interpolation.format,a||(a=Dc),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const d=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);d.length>0&&d[0]!=="dev"&&(this.options.lng=d[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(d=>{this[d]=(...u)=>this.store[d](...u)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(d=>{this[d]=(...u)=>(this.store[d](...u),this)});const l=As(),c=()=>{const d=(u,h)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit
vendor: 8,751 bytes, line 476
476("initialized",this.options),l.resolve(h),a(u,h)};if(this.languages&&!this.isInitialized)return d(null,this.t.bind(this));this.changeLanguage(this.options.lng,d)};return this.options.resources||!this.options.initAsync?c():setTimeout(c,0),l}loadResources(t,a=Dc){var o,s;let n=a;const r=ue(t)?t:this.language;if(typeof t=="function"&&(n=t),!this.options.resources||this.options.partialBundledLanguages){if((r==null?void 0:r.toLowerCase())==="cimode"&&(!this.options.preload||this.options.preload.length===0))return n();const l=[],c=d=>{if(!d||d==="cimode")return;this.services.languageUtils.toResolveHierarchy(d).forEach(h=>{h!=="cimode"&&l.indexOf(h)<0&&l.push(h)})};r?c(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(u=>c(u)),(s=(o=this.options.preload)==null?void 0:o.forEach)==null||s.call(o,d=>c(d)),this.services.backendConnector.load(l,this.options.ns,d=>{!d&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(d)})}else n(null)}reloadResources(t,a,n){const r=As();return typeof t=="function"&&(n=t,t=void 0),typeof a=="function"&&(n=a,a=void 0),t||(t=this.languages),a||(a=this.options.ns),n||(n=Dc),this.services.backendConnector.reload(t,a,o=>{r.resolve(),n(o)}),r}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&HS.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1)){for(let a=0;a<this.languages.length;a++){const n=this.languages[a];if(!(["cimode","dev"].indexOf(n)>-1)&&this.store.hasLanguageSomeTranslations(n)){this.resolvedLanguage=n;break}}!this.resolvedLanguage&&this.languages.indexOf(t)<0&&this.store.hasLanguageSomeTranslations(t)&&(this.resolvedLanguage=t,this.languages.unshift(t))}}changeLanguage(t,a){this.isLanguageChangingTo=t;const n=As();this.emit("languageChanging",t);const r=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},o=(l,c)=>{c?this.isLanguageChangingTo===t&&(r(c),this.translator.changeLanguage(c),this.isLanguageChangingTo=void 0,this.emit("languageChanged",c),this.logger.log("languageChanged",c)):this.isLanguageChangingTo=void 0,n.resolve((...d)=>this.t(...d)),a&&a(l,(...d)=>this.t(...d))},s=l=>{var u,h;!t&&!l&&this.services.languageDetector&&(l=[]);const c=ue(l)?l:l&&l[0],d=this.store.hasLanguageSomeTranslations(c)?c:this.services.languageUtils.getBestMatchFromCodes(ue(l)?[l]:l);d&&(this.language||r(d),this.translator.language||this.translator.changeLanguage(d),(h=(u=this.services.languageDetector)==null?void 0:u.cacheUserLanguage)==null||h.call(u,d)),this.loadResources(d,m=>{o(m,d)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(t),n}getFixedT(t,a,n){const r=(o,s,...l)=>{let c;typeof s!="object"?c=this.options.overloadTranslationOptionHandler([o,s].concat(l)):c={...s},c.lng=c.lng||r.lng,c.lngs=c.lngs||r.lngs,c.ns=c.ns||r.ns,c.keyPrefix!==""&&(c.keyPrefix=c.keyPrefix||n||r.keyPrefix);const d=this.options.keySeparator||".";let u;return c.keyPrefix&&Array.isArray(o)?u=o.map(h=>(typeof h=="function"&&(h=Km(h,{...this.options,...s})),`${c.keyPrefix}${d}${h}`)):(typeof o=="function"&&(o=Km(o,{...this.options,...s})),u=c.keyPrefix?`${c.keyPrefix}${d}${o}`:o),this.t(u,c)};return ue(t)?r.lng=t:r.lngs=t,r.ns=a,r.keyPrefix=n,r}t(...t){var a;return(a=this.translator)==null?void 0:a.translate(...t)}exists(...t){var a;return(a=this.translator)==null?void 0:a.exists(...t)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t,a={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const n=a.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,o=this.languages[this.languages.length-1];if(n.toLowerCase()==="cimode")return!0;const s=(l,c)=>{const d=this.services.backendConnector.state[`${l}|${c}`];return d===-1||d===0||d===2};if(a.precheck){const l=a.precheck(this,s);if(l!==void 0)return l}return!!(this.hasResourceBundle(n,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(n,t)&&(!r||s(o,t)))}loadNamespaces(t,a){const n=As();return this.options.ns?(ue(t)&&(t=[t]),t.forEach(r=>{this.options.ns.indexOf(r)<0&&this.options.ns.push(r)}),this.loadResources(r=>{n.resolve(),a&&a(r)}),n):(a&&a(),Promise.resolve())}loadLanguages(t,a){const n=As();ue(t)&&(t=[t]);const r=this.options.preload||[],o=t.filter(s=>r.indexOf(s)<0&&this.services.languageUtils.isSupportedCode(s));return o.length?(this.options.preload=r.concat(o),this.loadResources(s=>{n.resolve(),a&&a(s)}),n):(a&&a(),Promise.resolve())}dir(t){var r,o;if(t||(t=this.resolvedLanguage||(((r=this.languages)==null?void 0:r.length)>0?this.languages[0]:this.language)),!t)return"rtl";try{const s=new Intl.Locale(t);if(s&&s.getTextInfo){const l=s.getTextInfo();if(l&&l.direction)return l.direction}}catch{}const a=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],n=((o=this.services)==null?void 0:o.languageUtils)||new gw(rp());return t.toLowerCase().indexOf("-latn")>1?"ltr":a.indexOf(n.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(t={},a){const n=new Qs(t,a);return n.createInstance=Qs.createInstance,n}cloneInstance(t={},a=Dc){const n=t.forkResourceStore;n&&delete t.forkResourceStore;const r={...this.options,...t,isClone:!0},o=new Qs(r);if((t.debug!==void 0||t.prefix!==void 0)&&(o.logger=o.logger.clone(t)),["store","services","language"].forEach(l=>{o[l]=this[l]}),o.services={...this.services},o.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},n){const l=Object.keys(this.store.data).reduce((c,d)=>(c[d]={...this.store.data[d]},c[d]=Object.keys(c[d]).reduce((u,h)=>(u[h]={...c[d][h]},u),c[d]),c),{});o.store=new mw(l,r),o.services.resourceStore=o.store}if(t.interpolation){const c={...rp().interpolation,...this.options.interpolation,...t.interpolation},d={...r,interpolation:c};o.services.interpolator=new ww(d)}return o.translator=new Kd(o.services,r),o.translator.on("*",(l,...c)=>{o.emit(l,...c)}),o.init(r,a),o.translator.options=r,o.translator.backendConnector.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},o}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Ct=Qs.createInstance();Ct.createInstance;Ct.dir;Ct.init;Ct.loadResources;Ct.reloadResources;Ct.use;Ct.changeLanguage;Ct.getFixedT;Ct.t;Ct.exists;Ct.setDefaultNamespace;Ct.hasLoadedNamespace;Ct.loadNamespaces;Ct.loadLanguages;const F3=(e,t,a,n)=>{var o,s,l,c;const r=[a,{code:t,...n||{}}];if((s=(o=e==null?void 0:e.services)==null?void 0:o.logger)!=null&&s.forward)return e.services.logger.forward(r,"warn","react-i18next::",!0);xo(r[0])&&(r[0]=`react-i18next:: ${r[0]}`),(c=(l=e==null?void 0:e.services)==null?void 0:l.logger)!=null&&c.warn?e.services.logger.warn(...r):console!=null&&console.warn&&console.warn(...r)},Cw={},VS=(e,t,a,n)=>{xo(a)&&Cw[a]||(xo(a)&&(Cw[a]=new Date),F3(e,t,a,n))},WS=(e,t)=>()=>{if(e.isInitialized)t();else{const a=()=>{setTimeout(()=>{e.off("initialized",a)},0),t()};e.on("initialized",a)}},Ym=(e,t,a)=>{e.loadNamespaces(t,WS(e,a))},Sw=(e,t,a,n)=>{if(xo(a)&&(a=[a]),e.options.preload&&e.options.preload.indexOf(t)>-1)return Ym(e,a,n);a.forEach(r=>{e.options.ns.indexOf(r)<0&&e.options.ns.push(r)}),e.loadLanguages(t,WS(e,n))},H3=(e,t,a={})=>
476!t.languages||!t.languages.length?(VS(t,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:a.lng,precheck:(n,r)=>{if(a.bindI18n&&a.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!r(n.isLanguageChangingTo,e))return!1}}),xo=e=>typeof e=="string",B3=e=>typeof e=="object"&&e!==null,V3=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,W3={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"â¦","…":"â¦","/":"/","/":"/"},$3=e=>W3[e],K3=e=>e.replace(V3,$3);let Jm={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:K3,transDefaultProps:void 0};const Y3=(e={})=>{Jm={...Jm,...e}},J3=()=>Jm;let $S;const Q3=e=>{$S=e},Z3=()=>$S,X3={type:"3rdParty",init(e){Y3(e.options.react),Q3(e)}},eM=f.createContext();class tM{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(a=>{this.usedNamespaces[a]||(this.usedNamespaces[a]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var KS={exports:{}},YS={};/** 477 * @license React 478 * use-sync-external-store-shim.production.js 479 * 480 * Copyright (c) Meta Platforms, Inc. and affiliates. 481 * 482 * This source code is licensed under the MIT license found in the 483 * LICENSE file in the root directory of this source tree. 484 */var Hi=f;function aM(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var nM=typeof Object.is=="function"?Object.is:aM,rM=Hi.useState,oM=Hi.useEffect,iM=Hi.useLayoutEffect,sM=Hi.useDebugValue;function lM(e,t){var a=t(),n=rM({inst:{value:a,getSnapshot:t}}),r=n[0].inst,o=n[1];return iM(function(){r.value=a,r.getSnapshot=t,op(r)&&o({inst:r})},[e,a,t]),oM(function(){return op(r)&&o({inst:r}),e(function(){op(r)&&o({inst:r})})},[e]),sM(a),a}function op(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!nM(e,a)}catch{return!0}}function cM(e,t){return t()}var dM=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?cM:lM;YS.useSyncExternalStore=Hi.useSyncExternalStore!==void 0?Hi.useSyncExternalStore:dM;KS.exports=YS;var uM=KS.exports;const hM=(e,t)=>xo(t)?t:B3(t)&&xo(t.defaultValue)?t.defaultValue:Array.isArray(e)?e[e.length-1]:e,pM={t:hM,ready:!1},mM=()=>()=>{},we=(e,t={})=>{var I,N,V;const{i18n:a}=t,{i18n:n,defaultNS:r}=f.useContext(eM)||{},o=a||n||Z3();o&&!o.reportNamespaces&&(o.reportNamespaces=new tM),o||VS(o,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const s=f.useMemo(()=>{var z;return{...J3(),...(z=o==null?void 0:o.options)==null?void 0:z.react,...t}},[o,t]),{useSuspense:l,keyPrefix:c}=s,d=r||((I=o==null?void 0:o.options)==null?void 0:I.defaultNS),u=xo(d)?[d]:d||["translation"],h=f.useMemo(()=>u,u);(V=(N=o==null?void 0:o.reportNamespaces)==null?void 0:N.addUsedNamespaces)==null||V.call(N,h);const m=f.useRef(0),p=f.useCallback(z=>{if(!o)return mM;const{bindI18n:L,bindI18nStore:E}=s,K=()=>{m.current+=1,z()};return L&&o.on(L,K),E&&o.store.on(E,K),()=>{L&&L.split(" ").forEach(F=>o.off(F,K)),E&&E.split(" ").forEach(F=>o.store.off(F,K))}},[o,s]),b=f.useRef(),g=f.useCallback(()=>{if(!o)return pM;const z=!!(o.isInitialized||o.initializedStoreOnce)&&h.every(j=>H3(j,o,s)),L=t.lng||o.language,E=m.current,K=b.current;if(K&&K.ready===z&&K.lng===L&&K.keyPrefix===c&&K.revision===E)return K;const Z={t:o.getFixedT(L,s.nsMode==="fallback"?h:h[0],c),ready:z,lng:L,keyPrefix:c,revision:E};return b.current=Z,Z},[o,h,c,s,t.lng]),[v,w]=f.useState(0),{t:y,ready:x}=uM.useSyncExternalStore(p,g,g);f.useEffect(()=>{if(o&&!x&&!l){const z=()=>w(L=>L+1);t.lng?Sw(o,t.lng,h,z):Ym(o,h,z)}},[o,t.lng,h,x,l,v]);const k=o||{},C=f.useRef(null),S=f.useRef(),A=z=>{const L=Object.getOwnPropertyDescriptors(z);L.__original&&delete L.__original;const E=Object.create(Object.getPrototypeOf(z),L);if(!Object.prototype.hasOwnProperty.call(E,"__original"))try{Object.defineProperty(E,"__original",{value:z,writable:!1,enumerable:!1,
484configurable:!1})}catch{}return E},P=f.useMemo(()=>{const z=k,L=z==null?void 0:z.language;let E=z;z&&(C.current&&C.current.__original===z?S.current!==L?(E=A(z),C.current=E,S.current=L):E=C.current:(E=A(z),C.current=E,S.current=L));const K=[y,E,x];return K.t=y,K.i18n=E,K.ready=x,K},[y,k,x,k.resolvedLanguage,k.language,k.languages]);if(o&&l&&!x)throw new Promise(z=>{const L=()=>z();t.lng?Sw(o,t.lng,h,L):Ym(o,h,L)});return P},fM=Xi("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium ring-offset-background transition-all duration-300 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90 shadow-elegant hover:shadow-glow",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-border/60 bg-transparent hover:bg-muted/50 hover:text-foreground hover:border-border",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-muted/50 hover:text-foreground",link:"text-brand-secondary underline-offset-4 hover:underline",hero:"gradient-hero text-primary-foreground hover:opacity-90 shadow-glow text-base font-semibold tracking-wide"},size:{default:"h-10 px-5 py-2",sm:"h-9 rounded-lg px-4",lg:"h-12 rounded-xl px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),H=f.forwardRef(({className:e,variant:t,size:a,asChild:n=!1,...r},o)=>{const s=n?zj:"button";return i.jsx(s,{className:J(fM({variant:t,size:a,className:e})),ref:o,...r})});H.displayName="Button";const re=f.forwardRef(({className:e,...t},a)=>i.jsx("div",{ref:a,className:J("rounded-lg border bg-card text-card-foreground shadow-sm",e),...t}));re.displayName="Card";const Ze=f.forwardRef(({className:e,...t},a)=>i.jsx("div",{ref:a,className:J("flex flex-col space-y-1.5 p-6",e),...t}));Ze.displayName="CardHeader";const Xe=f.forwardRef(({className:e,...t},a)=>i.jsx("h3",{ref:a,className:J("text-2xl font-semibold leading-none tracking-tight",e),...t}));Xe.displayName="CardTitle";const ma=f.forwardRef(({className:e,...t},a)=>i.jsx("p",{ref:a,className:J("text-sm text-muted-foreground",e),...t}));ma.displayName="CardDescription";const ie=f.forwardRef(({className:e,...t},a)=>i.jsx("div",{ref:a,className:J("p-6 pt-0",e),...t}));ie.displayName="CardContent";const gM=f.forwardRef(({className:e,...t},a)=>i.jsx("div",{ref:a,className:J("flex items-center p-6 pt-0",e),...t}));gM.displayName="CardFooter";var ip="focusScope.autoFocusOnMount",sp="focusScope.autoFocusOnUnmount",Aw={bubbles:!1,cancelable:!0},yM="FocusScope",Hu=f.forwardRef((e,t)=>{const{loop:a=!1,trapped:n=!1,onMountAutoFocus:r,onUnmountAutoFocus:o,...s}=e,[l,c]=f.useState(null),d=tt(r),u=tt(o),h=f.useRef(null),m=ye(t,g=>c(g)),p=f.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;f.useEffect(()=>{if(n){let g=function(x){if(p.paused||!l)return;const k=x.target;l.contains(k)?h.current=k:Wn(h.current,{select:!0})},v=function(x){if(p.paused||!l)return;const k=x.relatedTarget;k!==null&&(l.contains(k)||Wn(h.current,{select:!0}))},w=function(x){if(document.activeElement===document.body)for(const C of x)C.removedNodes.length>0&&Wn(l)};document.addEventListener("focusin",g),document.addEventListener("focusout",v);const y=new MutationObserver(w);return l&&y.observe(l,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",g),document.removeEventListener("focusout",v),y.disconnect()}}},[n,l,p.paused]),f.useEffect(()=>{if(l){Tw.add(p);const g=document.activeElement;if(!l.contains(g)){const w=new CustomEvent(ip,Aw);l.addEventListener(ip,d),l.dispatchEvent(w),w.defaultPrevented||(vM(CM(JS(l)),{select:!0}),document.activeElement===g&&Wn(l))}return()=>{l.removeEventListener(ip,d),setTimeout(()=>{const w=new CustomEvent(sp,Aw);l.addEventListener(sp,u),l.dispatchEvent(w),w.defaultPrevented||Wn(g??document.body,{select:!0}),l.removeEventListener(sp,u),Tw.remove(p)}
vendor: 4,126 bytes, line 484
484,0)}}},[l,d,u,p]);const b=f.useCallback(g=>{if(!a&&!n||p.paused)return;const v=g.key==="Tab"&&!g.altKey&&!g.ctrlKey&&!g.metaKey,w=document.activeElement;if(v&&w){const y=g.currentTarget,[x,k]=bM(y);x&&k?!g.shiftKey&&w===k?(g.preventDefault(),a&&Wn(x,{select:!0})):g.shiftKey&&w===x&&(g.preventDefault(),a&&Wn(k,{select:!0})):w===y&&g.preventDefault()}},[a,n,p.paused]);return i.jsx(ee.div,{tabIndex:-1,...s,ref:m,onKeyDown:b})});Hu.displayName=yM;function vM(e,{select:t=!1}={}){const a=document.activeElement;for(const n of e)if(Wn(n,{select:t}),document.activeElement!==a)return}function bM(e){const t=JS(e),a=Pw(t,e),n=Pw(t.reverse(),e);return[a,n]}function JS(e){const t=[],a=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const r=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||r?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;a.nextNode();)t.push(a.currentNode);return t}function Pw(e,t){for(const a of e)if(!wM(a,{upTo:t}))return a}function wM(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function xM(e){return e instanceof HTMLInputElement&&"select"in e}function Wn(e,{select:t=!1}={}){if(e&&e.focus){const a=document.activeElement;e.focus({preventScroll:!0}),e!==a&&xM(e)&&t&&e.select()}}var Tw=kM();function kM(){let e=[];return{add(t){const a=e[0];t!==a&&(a==null||a.pause()),e=Iw(e,t),e.unshift(t)},remove(t){var a;e=Iw(e,t),(a=e[0])==null||a.resume()}}}function Iw(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}function CM(e){return e.filter(t=>t.tagName!=="A")}var lp=0;function ty(){f.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??jw()),document.body.insertAdjacentElement("beforeend",e[1]??jw()),lp++,()=>{lp===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),lp--}},[])}function jw(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var rd="right-scroll-bar-position",od="width-before-scroll-bar",SM="with-scroll-bars-hidden",AM="--removed-body-scroll-bar-size";function cp(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function PM(e,t){var a=f.useState(function(){return{value:e,callback:t,facade:{get current(){return a.value},set current(n){var r=a.value;r!==n&&(a.value=n,a.callback(n,r))}}}})[0];return a.callback=t,a.facade}var TM=typeof window<"u"?f.useLayoutEffect:f.useEffect,Nw=new WeakMap;function IM(e,t){var a=PM(null,function(n){return e.forEach(function(r){return cp(r,n)})});return TM(function(){var n=Nw.get(a);if(n){var r=new Set(n),o=new Set(e),s=a.current;r.forEach(function(l){o.has(l)||cp(l,null)}),o.forEach(function(l){r.has(l)||cp(l,s)})}Nw.set(a,e)},[e]),a}function jM(e){return e}function NM(e,t){t===void 0&&(t=jM);var a=[],n=!1,r={read:function(){if(n)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return a.length?a[a.length-1]:e},useMedium:function(o){var s=t(o,n);return a.push(s),function(){a=a.filter(function(l){return l!==s})}},assignSyncMedium:function(o){for(n=!0;a.length;){var s=a;a=[],s.forEach(o)}a={push:function(l){return o(l)},filter:function(){return a}}},assignMedium:function(o){n=!0;var s=[];if(a.length){var l=a;a=[],l.forEach(o),s=a}var c=function(){var u=s;s=[],u.forEach(o)},d=function(){return Promise.resolve().then(c)};d(),a={push:function(u){s.push(u),d()},filter:function(u){return s=s.filter(u),a}}}};return r}function EM(e){e===void 0&&(e={});var t=NM(null);return t.options=an({async:!0,ssr:!1},e),t}var QS=function(e){var t=e.sideCar,a=ls(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var n=t.read();if(!n)throw new Error("Sidecar medium not found");return f.createElement(n,an({},a))};
vendor: 4,525 bytes, lines 484-521
484QS.isSideCarExport=!0;function zM(e,t){return e.useMedium(t),QS}var ZS=EM(),dp=function(){},Bu=f.forwardRef(function(e,t){var a=f.useRef(null),n=f.useState({onScrollCapture:dp,onWheelCapture:dp,onTouchMoveCapture:dp}),r=n[0],o=n[1],s=e.forwardProps,l=e.children,c=e.className,d=e.removeScrollBar,u=e.enabled,h=e.shards,m=e.sideCar,p=e.noRelative,b=e.noIsolation,g=e.inert,v=e.allowPinchZoom,w=e.as,y=w===void 0?"div":w,x=e.gapMode,k=ls(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),C=m,S=IM([a,t]),A=an(an({},k),r);return f.createElement(f.Fragment,null,u&&f.createElement(C,{sideCar:ZS,removeScrollBar:d,shards:h,noRelative:p,noIsolation:b,inert:g,setCallbacks:o,allowPinchZoom:!!v,lockRef:a,gapMode:x}),s?f.cloneElement(f.Children.only(l),an(an({},A),{ref:S})):f.createElement(y,an({},A,{className:c,ref:S}),l))});Bu.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};Bu.classNames={fullWidth:od,zeroRight:rd};var RM=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function DM(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=RM();return t&&e.setAttribute("nonce",t),e}function _M(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function qM(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var UM=function(){var e=0,t=null;return{add:function(a){e==0&&(t=DM())&&(_M(t,a),qM(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},MM=function(){var e=UM();return function(t,a){f.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&a])}},XS=function(){var e=MM(),t=function(a){var n=a.styles,r=a.dynamic;return e(n,r),null};return t},LM={left:0,top:0,right:0,gap:0},up=function(e){return parseInt(e||"",10)||0},OM=function(e){var t=window.getComputedStyle(document.body),a=t[e==="padding"?"paddingLeft":"marginLeft"],n=t[e==="padding"?"paddingTop":"marginTop"],r=t[e==="padding"?"paddingRight":"marginRight"];return[up(a),up(n),up(r)]},GM=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return LM;var t=OM(e),a=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-a+t[2]-t[0])}},FM=XS(),Ai="data-scroll-locked",HM=function(e,t,a,n){var r=e.left,o=e.top,s=e.right,l=e.gap;return a===void 0&&(a="margin"),` 485 .`.concat(SM,` { 486 overflow: hidden `).concat(n,`; 487 padding-right: `).concat(l,"px ").concat(n,`; 488 } 489 body[`).concat(Ai,`] { 490 overflow: hidden `).concat(n,`; 491 overscroll-behavior: contain; 492 `).concat([t&&"position: relative ".concat(n,";"),a==="margin"&&` 493 padding-left: `.concat(r,`px; 494 padding-top: `).concat(o,`px; 495 padding-right: `).concat(s,`px; 496 margin-left:0; 497 margin-top:0; 498 margin-right: `).concat(l,"px ").concat(n,`; 499 `),a==="padding"&&"padding-right: ".concat(l,"px ").concat(n,";")].filter(Boolean).join(""),` 500 } 501 502 .`).concat(rd,` { 503 right: `).concat(l,"px ").concat(n,`; 504 } 505 506 .`).concat(od,` { 507 margin-right: `).concat(l,"px ").concat(n,`; 508 } 509 510 .`).concat(rd," .").concat(rd,` { 511 right: 0 `).concat(n,`; 512 } 513 514 .`).concat(od," .").concat(od,` { 515 margin-right: 0 `).concat(n,`; 516 } 517 518 body[`).concat(Ai,`] { 519 `).concat(AM,": ").concat(l,`px; 520 } 521`)},Ew=function(){var e=parseInt(document.body.getAttribute(Ai)||"0",10);return isFinite(e)?e:0},BM=function(){f.useEffect(function(){return document.body.setAttribute(Ai,(Ew()+1).toString()),function(){var e=Ew()-1;e<=0?document.body.removeAttribute(Ai):document.body.setAttribute(Ai,e.toString())}},[])},VM=function(e){var t=e.noRelative,a=e.noImportant,n=e.gapMode,r=n===void 0?"margin":n;BM();var o=f.useMemo(function(){return GM(r)},[r]);return f.createElement(FM,{styles:HM(o,!t,r,a?"":"!important")})},Qm=!1;if(typeof window<"u")try{var _c=Object.defineProperty({},"passive",{get:function(){return Qm=!0,!0}});window.addEventListener("test",_c,_c),window.removeEventListener("test",_c,_c)}catch{Qm=!1}var Ko=Qm?{passive:!1}:!1,WM=function(e){return e.tagName==="TEXTAREA"},e1=function(e,t){if(!(e instanceof Element))return!1;var a=window.getComputedStyle(e);return a[t]!=="hidden"&&!(a.overflowY===a.overflowX&&!WM(e)&&a[t]==="visible")},$M=function(e){return e1(e,"overflowY")},KM=function(e){return e1(e,"overflowX")},zw=function(e,t){var a=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);
vendor: 4,371 bytes, lines 521-524
521var r=t1(e,n);if(r){var o=a1(e,n),s=o[1],l=o[2];if(s>l)return!0}n=n.parentNode}while(n&&n!==a.body);return!1},YM=function(e){var t=e.scrollTop,a=e.scrollHeight,n=e.clientHeight;return[t,a,n]},JM=function(e){var t=e.scrollLeft,a=e.scrollWidth,n=e.clientWidth;return[t,a,n]},t1=function(e,t){return e==="v"?$M(t):KM(t)},a1=function(e,t){return e==="v"?YM(t):JM(t)},QM=function(e,t){return e==="h"&&t==="rtl"?-1:1},ZM=function(e,t,a,n,r){var o=QM(e,window.getComputedStyle(t).direction),s=o*n,l=a.target,c=t.contains(l),d=!1,u=s>0,h=0,m=0;do{if(!l)break;var p=a1(e,l),b=p[0],g=p[1],v=p[2],w=g-v-o*b;(b||w)&&t1(e,l)&&(h+=w,m+=b);var y=l.parentNode;l=y&&y.nodeType===Node.DOCUMENT_FRAGMENT_NODE?y.host:y}while(!c&&l!==document.body||c&&(t.contains(l)||t===l));return(u&&(Math.abs(h)<1||!r)||!u&&(Math.abs(m)<1||!r))&&(d=!0),d},qc=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Rw=function(e){return[e.deltaX,e.deltaY]},Dw=function(e){return e&&"current"in e?e.current:e},XM=function(e,t){return e[0]===t[0]&&e[1]===t[1]},e5=function(e){return` 522 .block-interactivity-`.concat(e,` {pointer-events: none;} 523 .allow-interactivity-`).concat(e,` {pointer-events: all;} 524`)},t5=0,Yo=[];function a5(e){var t=f.useRef([]),a=f.useRef([0,0]),n=f.useRef(),r=f.useState(t5++)[0],o=f.useState(XS)[0],s=f.useRef(e);f.useEffect(function(){s.current=e},[e]),f.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(r));var g=G_([e.lockRef.current],(e.shards||[]).map(Dw),!0).filter(Boolean);return g.forEach(function(v){return v.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),g.forEach(function(v){return v.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var l=f.useCallback(function(g,v){if("touches"in g&&g.touches.length===2||g.type==="wheel"&&g.ctrlKey)return!s.current.allowPinchZoom;var w=qc(g),y=a.current,x="deltaX"in g?g.deltaX:y[0]-w[0],k="deltaY"in g?g.deltaY:y[1]-w[1],C,S=g.target,A=Math.abs(x)>Math.abs(k)?"h":"v";if("touches"in g&&A==="h"&&S.type==="range")return!1;var P=zw(A,S);if(!P)return!0;if(P?C=A:(C=A==="v"?"h":"v",P=zw(A,S)),!P)return!1;if(!n.current&&"changedTouches"in g&&(x||k)&&(n.current=C),!C)return!0;var I=n.current||C;return ZM(I,v,g,I==="h"?x:k,!0)},[]),c=f.useCallback(function(g){var v=g;if(!(!Yo.length||Yo[Yo.length-1]!==o)){var w="deltaY"in v?Rw(v):qc(v),y=t.current.filter(function(C){return C.name===v.type&&(C.target===v.target||v.target===C.shadowParent)&&XM(C.delta,w)})[0];if(y&&y.should){v.cancelable&&v.preventDefault();return}if(!y){var x=(s.current.shards||[]).map(Dw).filter(Boolean).filter(function(C){return C.contains(v.target)}),k=x.length>0?l(v,x[0]):!s.current.noIsolation;k&&v.cancelable&&v.preventDefault()}}},[]),d=f.useCallback(function(g,v,w,y){var x={name:g,delta:v,target:w,should:y,shadowParent:n5(w)};t.current.push(x),setTimeout(function(){t.current=t.current.filter(function(k){return k!==x})},1)},[]),u=f.useCallback(function(g){a.current=qc(g),n.current=void 0},[]),h=f.useCallback(function(g){d(g.type,Rw(g),g.target,l(g,e.lockRef.current))},[]),m=f.useCallback(function(g){d(g.type,qc(g),g.target,l(g,e.lockRef.current))},[]);f.useEffect(function(){return Yo.push(o),e.setCallbacks({onScrollCapture:h,onWheelCapture:h,onTouchMoveCapture:m}),document.addEventListener("wheel",c,Ko),document.addEventListener("touchmove",c,Ko),document.addEventListener("touchstart",u,Ko),function(){Yo=Yo.filter(function(g){return g!==o}),document.removeEventListener("wheel",c,Ko),document.removeEventListener("touchmove",c,Ko),document.removeEventListener("touchstart",u,Ko)}},[]);var p=e.removeScrollBar,b=e.inert;return f.createElement(f.Fragment,null,b?f.createElement(o,{styles:e5(r)}):null,p?f.createElement(VM,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function n5(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const r5=zM(ZS,a5);var Vu=f.forwardRef(function(e,t){return f.createElement(Bu,an({},e,{ref:t,sideCar:r5}))});Vu.classNames=Bu.classNames;var o5=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Jo=new WeakMap,Uc=new WeakMap,Mc={},hp=0,n1=function(e){return e&&(e.host||n1(e.parentNode))}
vendor: 7,605 bytes, lines 524-528
524,i5=function(e,t){return t.map(function(a){if(e.contains(a))return a;var n=n1(a);return n&&e.contains(n)?n:(console.error("aria-hidden",a,"in not contained inside",e,". Doing nothing"),null)}).filter(function(a){return!!a})},s5=function(e,t,a,n){var r=i5(t,Array.isArray(e)?e:[e]);Mc[a]||(Mc[a]=new WeakMap);var o=Mc[a],s=[],l=new Set,c=new Set(r),d=function(h){!h||l.has(h)||(l.add(h),d(h.parentNode))};r.forEach(d);var u=function(h){!h||c.has(h)||Array.prototype.forEach.call(h.children,function(m){if(l.has(m))u(m);else try{var p=m.getAttribute(n),b=p!==null&&p!=="false",g=(Jo.get(m)||0)+1,v=(o.get(m)||0)+1;Jo.set(m,g),o.set(m,v),s.push(m),g===1&&b&&Uc.set(m,!0),v===1&&m.setAttribute(a,"true"),b||m.setAttribute(n,"true")}catch(w){console.error("aria-hidden: cannot operate on ",m,w)}})};return u(t),l.clear(),hp++,function(){s.forEach(function(h){var m=Jo.get(h)-1,p=o.get(h)-1;Jo.set(h,m),o.set(h,p),m||(Uc.has(h)||h.removeAttribute(n),Uc.delete(h)),p||h.removeAttribute(a)}),hp--,hp||(Jo=new WeakMap,Jo=new WeakMap,Uc=new WeakMap,Mc={})}},ay=function(e,t,a){a===void 0&&(a="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),r=o5(e);return r?(n.push.apply(n,Array.from(r.querySelectorAll("[aria-live]"))),s5(n,r,a,"aria-hidden")):function(){return null}},Wu="Dialog",[r1,pF]=Wt(Wu),[l5,$a]=r1(Wu),o1=e=>{const{__scopeDialog:t,children:a,open:n,defaultOpen:r,onOpenChange:o,modal:s=!0}=e,l=f.useRef(null),c=f.useRef(null),[d,u]=Vt({prop:n,defaultProp:r??!1,onChange:o,caller:Wu});return i.jsx(l5,{scope:t,triggerRef:l,contentRef:c,contentId:_t(),titleId:_t(),descriptionId:_t(),open:d,onOpenChange:u,onOpenToggle:f.useCallback(()=>u(h=>!h),[u]),modal:s,children:a})};o1.displayName=Wu;var i1="DialogTrigger",s1=f.forwardRef((e,t)=>{const{__scopeDialog:a,...n}=e,r=$a(i1,a),o=ye(t,r.triggerRef);return i.jsx(ee.button,{type:"button","aria-haspopup":"dialog","aria-expanded":r.open,"aria-controls":r.contentId,"data-state":oy(r.open),...n,ref:o,onClick:q(e.onClick,r.onOpenToggle)})});s1.displayName=i1;var ny="DialogPortal",[c5,l1]=r1(ny,{forceMount:void 0}),c1=e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,o=$a(ny,t);return i.jsx(c5,{scope:t,forceMount:a,children:f.Children.map(n,s=>i.jsx(ft,{present:a||o.open,children:i.jsx(Zi,{asChild:!0,container:r,children:s})}))})};c1.displayName=ny;var Yd="DialogOverlay",d1=f.forwardRef((e,t)=>{const a=l1(Yd,e.__scopeDialog),{forceMount:n=a.forceMount,...r}=e,o=$a(Yd,e.__scopeDialog);return o.modal?i.jsx(ft,{present:n||o.open,children:i.jsx(u5,{...r,ref:t})}):null});d1.displayName=Yd;var d5=yo("DialogOverlay.RemoveScroll"),u5=f.forwardRef((e,t)=>{const{__scopeDialog:a,...n}=e,r=$a(Yd,a);return i.jsx(Vu,{as:d5,allowPinchZoom:!0,shards:[r.contentRef],children:i.jsx(ee.div,{"data-state":oy(r.open),...n,ref:t,style:{pointerEvents:"auto",...n.style}})})}),ko="DialogContent",u1=f.forwardRef((e,t)=>{const a=l1(ko,e.__scopeDialog),{forceMount:n=a.forceMount,...r}=e,o=$a(ko,e.__scopeDialog);return i.jsx(ft,{present:n||o.open,children:o.modal?i.jsx(h5,{...r,ref:t}):i.jsx(p5,{...r,ref:t})})});u1.displayName=ko;var h5=f.forwardRef((e,t)=>{const a=$a(ko,e.__scopeDialog),n=f.useRef(null),r=ye(t,a.contentRef,n);return f.useEffect(()=>{const o=n.current;if(o)return ay(o)},[]),i.jsx(h1,{...e,ref:r,trapFocus:a.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:q(e.onCloseAutoFocus,o=>{var s;o.preventDefault(),(s=a.triggerRef.current)==null||s.focus()}),onPointerDownOutside:q(e.onPointerDownOutside,o=>{const s=o.detail.originalEvent,l=s.button===0&&s.ctrlKey===!0;(s.button===2||l)&&o.preventDefault()}),onFocusOutside:q(e.onFocusOutside,o=>o.preventDefault())})}),p5=f.forwardRef((e,t)=>{const a=$a(ko,e.__scopeDialog),n=f.useRef(!1),r=f.useRef(!1);return i.jsx(h1,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var s,l;(s=e.onCloseAutoFocus)==null||s.call(e,o),o.defaultPrevented||(n.current||(l=a.triggerRef.current)==null||l.focus(),o.preventDefault()),n.current=!1,r.current=!1},onInteractOutside:o=>{var c,d;(c=e.onInteractOutside)==null||c.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(r.current=!0));const s=o.target;((d=a.triggerRef.current)==null?void 0:d.contains(s))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&r.current&&o.preventDefault()}})}),h1=f.forwardRef((e,t)=>{const{__scopeDialog:a,trapFocus:n,onOpenAutoFocus:r,onCloseAutoFocus:o,...s}=e,l=$a(ko,a),c=f.useRef(null),d=ye(t,c);return ty(),i.jsxs(i.Fragment,{children:[i.jsx(Hu,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:r,onUnmountAutoFocus:o,children:i.jsx(zo,{role:"dialog",id:l.contentId,"aria-describedby":l.descriptionId,"aria-labelledby":l.titleId,"data-state":oy(l.open),...s,ref:d,onDismiss:()=>l.onOpenChange(!1)})}),i.jsxs(i.Fragment,{children:[i.jsx(m5,{titleId:l.titleId}),i.jsx(g5,{contentRef:c,descriptionId:l.descriptionId})]})]})}),ry="DialogTitle",p1=f.forwardRef((e,t)=>{const{__scopeDialog:a,...n}=e,r=$a(ry,a);return i.jsx(ee.h2,{id:r.titleId,...n,ref:t})});p1.displayName=ry;var m1="DialogDescription",f1=f.forwardRef((e,t)=>{const{__scopeDialog:a,...n}=e,r=$a(m1,a);return i.jsx(ee.p,{id:r.descriptionId,...n,ref:t})});f1.displayName=m1;var g1="DialogClose",y1=f.forwardRef((e,t)=>{const{__scopeDialog:a,...n}=e,r=$a(g1,a);return i.jsx(ee.button,{type:"button",...n,ref:t,onClick:q(e.onClick,()=>r.onOpenChange(!1))})});y1.displayName=g1;function oy(e){return e?"open":"closed"}var v1="DialogTitleWarning",[mF,b1]=Nj(v1,{contentName:ko,titleName:ry,docsSlug:"dialog"}),m5=({titleId:e})=>{const t=b1(v1),a=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users. 525 526If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component. 527 528For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return f.useEffect(()=>{e&&(document.getElementById(e)||console.error(a))},[a,e]),null},f5="DialogDescriptionWarning",g5=({contentRef:e,descriptionId:t})=>{const n=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${b1(f5).contentName}}.`;return f.useEffect(()=>{var o;const r=(o=e.current)==null?void 0:o.getAttribute("aria-describedby");t&&r&&(document.getElementById(t)||console.warn(n))},[n,e,t]),null},y5=o1,v5=s1,b5=c1,w1=d1,x1=u1,k1=p1,C1=f1,w5=y1;const x5=y5,k5=v5,C5=b5,S1=f.forwardRef(({className:e,...t},a)=>i.jsx(w1,{className:J("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t,ref:a}));S1.displayName=w1.displayName;const S5=Xi("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),A1=f.forwardRef(({side:e="right",className:t,children:a,...n},r)=>i.jsxs(C5,{children:[i.jsx(S1,{}),i.jsxs(x1,{ref:r,className:J(S5({side:e}),t),...n,children:[a,i.jsxs(w5,{className:"absolute right-4 top-4 roun
528ded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-secondary hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",children:[i.jsx(Tg,{className:"h-4 w-4"}),i.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));A1.displayName=x1.displayName;const A5=f.forwardRef(({className:e,...t},a)=>i.jsx(k1,{ref:a,className:J("text-lg font-semibold text-foreground",e),...t}));A5.displayName=k1.displayName;const P5=f.forwardRef(({className:e,...t},a)=>i.jsx(C1,{ref:a,className:J("text-sm text-muted-foreground",e),...t}));P5.displayName=C1.displayName;var T5=f.createContext(void 0);function ds(e){const t=f.useContext(T5);return e||t||"ltr"}function iy(e){const t=f.useRef({value:e,previous:e});return f.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}var Ro="NavigationMenu",[sy,P1,I5]=Eo(Ro),[Zm,j5,N5]=Eo(Ro),[ly,fF]=Wt(Ro,[I5,N5]),[E5,ka]=ly(Ro),[z5,R5]=ly(Ro),T1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,value:n,onValueChange:r,defaultValue:o,delayDuration:s=200,skipDelayDuration:l=300,orientation:c="horizontal",dir:d,...u}=e,[h,m]=f.useState(null),p=ye(t,I=>m(I)),b=ds(d),g=f.useRef(0),v=f.useRef(0),w=f.useRef(0),[y,x]=f.useState(!0),[k,C]=Vt({prop:n,onChange:I=>{const N=I!=="",V=l>0;N?(window.clearTimeout(w.current),V&&x(!1)):(window.clearTimeout(w.current),w.current=window.setTimeout(()=>x(!0),l)),r==null||r(I)},defaultProp:o??"",caller:Ro}),S=f.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>C(""),150)},[C]),A=f.useCallback(I=>{window.clearTimeout(v.current),C(I)},[C]),P=f.useCallback(I=>{k===I?window.clearTimeout(v.current):g.current=window.setTimeout(()=>{window.clearTimeout(v.current),C(I)},s)},[k,C,s]);return f.useEffect(()=>()=>{window.clearTimeout(g.current),window.clearTimeout(v.current),window.clearTimeout(w.current)},[]),i.jsx(I1,{scope:a,isRootMenu:!0,value:k,dir:b,orientation:c,rootNavigationMenu:h,onTriggerEnter:I=>{window.clearTimeout(g.current),y?P(I):A(I)},onTriggerLeave:()=>{window.clearTimeout(g.current),S()},onContentEnter:()=>window.clearTimeout(v.current),onContentLeave:S,onItemSelect:I=>{C(N=>N===I?"":I)},onItemDismiss:()=>C(""),children:i.jsx(ee.nav,{"aria-label":"Main","data-orientation":c,dir:b,...u,ref:p})})});T1.displayName=Ro;var Xm="NavigationMenuSub",D5=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,value:n,onValueChange:r,defaultValue:o,orientation:s="horizontal",...l}=e,c=ka(Xm,a),[d,u]=Vt({prop:n,onChange:r,defaultProp:o??"",caller:Xm});return i.jsx(I1,{scope:a,isRootMenu:!1,value:d,dir:c.dir,orientation:s,rootNavigationMenu:c.rootNavigationMenu,onTriggerEnter:h=>u(h),onItemSelect:h=>u(h),onItemDismiss:()=>u(""),children:i.jsx(ee.div,{"data-orientation":s,...l,ref:t})})});D5.displayName=Xm;var I1=e=>{const{scope:t,isRootMenu:a,rootNavigationMenu:n,dir:r,orientation:o,children:s,value:l,onItemSelect:c,onItemDismiss:d,onTriggerEnter:u,onTriggerLeave:h,onContentEnter:m,onContentLeave:p}=e,[b,g]=f.useState(null),[v,w]=f.useState(new Map),[y,x]=f.useState(null);return i.jsx(E5,{scope:t,isRootMenu:a,rootNavigationMenu:n,value:l,previousValue:iy(l),baseId:_t(),dir:r,orientation:o,viewport:b,onViewportChange:g,indicatorTrack:y,onIndicatorTrackChange:x,onTriggerEnter:tt(u),onTriggerLeave:tt(h),onContentEnter:tt(m),onContentLeave:tt(p),onItemSelect:tt(c),onItemDismiss:tt(d),onViewportContentChange:f.useCallback((k,C)=>{w(S=>(S.set(k,C),new Map(S)))},[]),onViewportContentRemove:f.useCallback(k=>{w(C=>C.has(k)?(C.delete(k),new Map(C)):C)},[]),children:i.jsx(sy.Provider,{scope:t,children:i.jsx(z5,{scope:t,items:v,children:s})})})},j1="NavigationMenuList",N1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,...n}=e,r=ka(j1,a),o=i.jsx(ee.ul,{"data-orientation":r.orientation,...n,ref:t});return i.jsx(ee.div,{style:{position:"relative"},ref:r.onIndicatorTrackChange,children:i.jsx(sy.Slot,{scope:a,children:r.isRootMenu?i.jsx(O1,{asChild:!0,children:o}):o})})});N1.displayName=j1;var E1="NavigationMenuItem",[_5,z1]=ly(E1),R1=f.forwardRef((e,t)=>
vendor: 4,323 bytes, line 528
528{const{__scopeNavigationMenu:a,value:n,...r}=e,o=_t(),s=n||o||"LEGACY_REACT_AUTO_VALUE",l=f.useRef(null),c=f.useRef(null),d=f.useRef(null),u=f.useRef(()=>{}),h=f.useRef(!1),m=f.useCallback((b="start")=>{if(l.current){u.current();const g=tf(l.current);g.length&&uy(b==="start"?g:g.reverse())}},[]),p=f.useCallback(()=>{if(l.current){const b=tf(l.current);b.length&&(u.current=F5(b))}},[]);return i.jsx(_5,{scope:a,value:s,triggerRef:c,contentRef:l,focusProxyRef:d,wasEscapeCloseRef:h,onEntryKeyDown:m,onFocusProxyEnter:m,onRootContentClose:p,onContentFocusOutside:p,children:i.jsx(ee.li,{...r,ref:t})})});R1.displayName=E1;var ef="NavigationMenuTrigger",D1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,disabled:n,...r}=e,o=ka(ef,e.__scopeNavigationMenu),s=z1(ef,e.__scopeNavigationMenu),l=f.useRef(null),c=ye(l,s.triggerRef,t),d=F1(o.baseId,s.value),u=H1(o.baseId,s.value),h=f.useRef(!1),m=f.useRef(!1),p=s.value===o.value;return i.jsxs(i.Fragment,{children:[i.jsx(sy.ItemSlot,{scope:a,value:s.value,children:i.jsx(G1,{asChild:!0,children:i.jsx(ee.button,{id:d,disabled:n,"data-disabled":n?"":void 0,"data-state":hy(p),"aria-expanded":p,"aria-controls":u,...r,ref:c,onPointerEnter:q(e.onPointerEnter,()=>{m.current=!1,s.wasEscapeCloseRef.current=!1}),onPointerMove:q(e.onPointerMove,Jd(()=>{n||m.current||s.wasEscapeCloseRef.current||h.current||(o.onTriggerEnter(s.value),h.current=!0)})),onPointerLeave:q(e.onPointerLeave,Jd(()=>{n||(o.onTriggerLeave(),h.current=!1)})),onClick:q(e.onClick,()=>{o.onItemSelect(s.value),m.current=p}),onKeyDown:q(e.onKeyDown,b=>{const v={horizontal:"ArrowDown",vertical:o.dir==="rtl"?"ArrowLeft":"ArrowRight"}[o.orientation];p&&b.key===v&&(s.onEntryKeyDown(),b.preventDefault())})})})}),p&&i.jsxs(i.Fragment,{children:[i.jsx(q0,{"aria-hidden":!0,tabIndex:0,ref:s.focusProxyRef,onFocus:b=>{const g=s.contentRef.current,v=b.relatedTarget,w=v===l.current,y=g==null?void 0:g.contains(v);(w||!y)&&s.onFocusProxyEnter(w?"start":"end")}}),o.viewport&&i.jsx("span",{"aria-owns":u})]})]})});D1.displayName=ef;var q5="NavigationMenuLink",_w="navigationMenu.linkSelect",_1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,active:n,onSelect:r,...o}=e;return i.jsx(G1,{asChild:!0,children:i.jsx(ee.a,{"data-active":n?"":void 0,"aria-current":n?"page":void 0,...o,ref:t,onClick:q(e.onClick,s=>{const l=s.target,c=new CustomEvent(_w,{bubbles:!0,cancelable:!0});if(l.addEventListener(_w,d=>r==null?void 0:r(d),{once:!0}),fl(l,c),!c.defaultPrevented&&!s.metaKey){const d=new CustomEvent(id,{bubbles:!0,cancelable:!0});fl(l,d)}},{checkForDefaultPrevented:!1})})})});_1.displayName=q5;var cy="NavigationMenuIndicator",q1=f.forwardRef((e,t)=>{const{forceMount:a,...n}=e,r=ka(cy,e.__scopeNavigationMenu),o=!!r.value;return r.indicatorTrack?wg.createPortal(i.jsx(ft,{present:a||o,children:i.jsx(U5,{...n,ref:t})}),r.indicatorTrack):null});q1.displayName=cy;var U5=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,...n}=e,r=ka(cy,a),o=P1(a),[s,l]=f.useState(null),[c,d]=f.useState(null),u=r.orientation==="horizontal",h=!!r.value;f.useEffect(()=>{var g;const b=(g=o().find(v=>v.value===r.value))==null?void 0:g.ref.current;b&&l(b)},[o,r.value]);const m=()=>{s&&d({size:u?s.offsetWidth:s.offsetHeight,offset:u?s.offsetLeft:s.offsetTop})};return af(s,m),af(r.indicatorTrack,m),c?i.jsx(ee.div,{"aria-hidden":!0,"data-state":h?"visible":"hidden","data-orientation":r.orientation,...n,ref:t,style:{position:"absolute",...u?{left:0,width:c.size+"px",transform:`translateX(${c.offset}px)`}:{top:0,height:c.size+"px",transform:`translateY(${c.offset}px)`},...n.style}}):null}),Bi="NavigationMenuContent",U1=f.forwardRef((e,t)=>{const{forceMount:a,...n}=e,r=ka(Bi,e.__scopeNavigationMenu),o=z1(Bi,e.__scopeNavigationMenu),s=ye(o.contentRef,t),l=o.value===r.value,c={value:o.value,triggerRef:o.triggerRef,focusProxyRef:o.focusProxyRef,wasEscapeCloseRef:o.wasEscapeCloseRef,onContentFocusOutside:o.onContentFocusOutside,onRootContentClose:o.onRootContentClose,...n};return r.viewport?i.jsx(M5,{forceMount:a,...c,ref:s}):i.jsx(ft,{present:a||l,children:i.jsx(M1,{"data-state":hy(l),...c,ref:s,onPointerEnter:q(e.onPointerEnter,r.onContentEnter),onPointerLeave:q(e.onPointerLeave,Jd(r.onContentLeave)),style:{pointerEvents:!l&&r.isRootMenu?"none":void 0,...c.style}})})});U1.displayName=Bi;var M5=f.forwardRef((e,t)=>
528{const a=ka(Bi,e.__scopeNavigationMenu),{onViewportContentChange:n,onViewportContentRemove:r}=a;return rt(()=>{n(e.value,{ref:t,...e})},[e,t,n]),rt(()=>()=>r(e.value),[e.value,r]),null}),id="navigationMenu.rootContentDismiss",M1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,value:n,triggerRef:r,focusProxyRef:o,wasEscapeCloseRef:s,onRootContentClose:l,onContentFocusOutside:c,...d}=e,u=ka(Bi,a),h=f.useRef(null),m=ye(h,t),p=F1(u.baseId,n),b=H1(u.baseId,n),g=P1(a),v=f.useRef(null),{onItemDismiss:w}=u;f.useEffect(()=>{const x=h.current;if(u.isRootMenu&&x){const k=()=>{var C;w(),l(),x.contains(document.activeElement)&&((C=r.current)==null||C.focus())};return x.addEventListener(id,k),()=>x.removeEventListener(id,k)}},[u.isRootMenu,e.value,r,w,l]);const y=f.useMemo(()=>{const k=g().map(N=>N.value);u.dir==="rtl"&&k.reverse();const C=k.indexOf(u.value),S=k.indexOf(u.previousValue),A=n===u.value,P=S===k.indexOf(n);if(!A&&!P)return v.current;const I=(()=>{if(C!==S){if(A&&S!==-1)return C>S?"from-end":"from-start";if(P&&C!==-1)return C>S?"to-start":"to-end"}return null})();return v.current=I,I},[u.previousValue,u.value,u.dir,g,n]);return i.jsx(O1,{asChild:!0,children:i.jsx(zo,{id:b,"aria-labelledby":p,"data-motion":y,"data-orientation":u.orientation,...d,ref:m,disableOutsidePointerEvents:!1,onDismiss:()=>{var k;const x=new Event(id,{bubbles:!0,cancelable:!0});(k=h.current)==null||k.dispatchEvent(x)},onFocusOutside:q(e.onFocusOutside,x=>{var C;c();const k=x.target;(C=u.rootNavigationMenu)!=null&&C.contains(k)&&x.preventDefault()}),onPointerDownOutside:q(e.onPointerDownOutside,x=>{var A;const k=x.target,C=g().some(P=>{var I;return(I=P.ref.current)==null?void 0:I.contains(k)}),S=u.isRootMenu&&((A=u.viewport)==null?void 0:A.contains(k));(C||S||!u.isRootMenu)&&x.preventDefault()}),onKeyDown:q(e.onKeyDown,x=>{var S;const k=x.altKey||x.ctrlKey||x.metaKey;if(x.key==="Tab"&&!k){const A=tf(x.currentTarget),P=document.activeElement,I=A.findIndex(z=>z===P),V=x.shiftKey?A.slice(0,I).reverse():A.slice(I+1,A.length);uy(V)?x.preventDefault():(S=o.current)==null||S.focus()}}),onEscapeKeyDown:q(e.onEscapeKeyDown,x=>{s.current=!0})})})}),dy="NavigationMenuViewport",L1=f.forwardRef((e,t)=>{const{forceMount:a,...n}=e,o=!!ka(dy,e.__scopeNavigationMenu).value;return i.jsx(ft,{present:a||o,children:i.jsx(L5,{...n,ref:t})})});L1.displayName=dy;var L5=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,children:n,...r}=e,o=ka(dy,a),s=ye(t,o.onViewportChange),l=R5(Bi,e.__scopeNavigationMenu),[c,d]=f.useState(null),[u,h]=f.useState(null),m=c?(c==null?void 0:c.width)+"px":void 0,p=c?(c==null?void 0:c.height)+"px":void 0,b=!!o.value,g=b?o.value:o.previousValue;return af(u,()=>{u&&d({width:u.offsetWidth,height:u.offsetHeight})}),i.jsx(ee.div,{"data-state":hy(b),"data-orientation":o.orientation,...r,ref:s,style:{pointerEvents:!b&&o.isRootMenu?"none":void 0,"--radix-navigation-menu-viewport-width":m,"--radix-navigation-menu-viewport-height":p,...r.style},onPointerEnter:q(e.onPointerEnter,o.onContentEnter),onPointerLeave:q(e.onPointerLeave,Jd(o.onContentLeave)),children:Array.from(l.items).map(([w,{ref:y,forceMount:x,...k}])=>{const C=g===w;return i.jsx(ft,{present:x||C,children:i.jsx(M1,{...k,ref:Wl(y,S=>{C&&S&&h(S)})})},w)})})}),O5="FocusGroup",O1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,...n}=e,r=ka(O5,a);return i.jsx(Zm.Provider,{scope:a,children:i.jsx(Zm.Slot,{scope:a,children:i.jsx(ee.div,{dir:r.dir,...n,ref:t})})})}),qw=["ArrowRight","ArrowLeft","ArrowUp","ArrowDown"],G5="FocusGroupItem",G1=f.forwardRef((e,t)=>{const{__scopeNavigationMenu:a,...n}=e,r=j5(a),o=ka(G5,a);return i.jsx(Zm.ItemSlot,{scope:a,children:i.jsx(ee.button,{...n,ref:t,onKeyDown:q(e.onKeyDown,s=>{if(["Home","End",...qw].includes(s.key)){let c=r().map(h=>h.ref.current);if([o.dir==="rtl"?"ArrowRight":"ArrowLeft","ArrowUp","End"].includes(s.key)&&c.reverse(),qw.includes(s.key)){const h=c.indexOf(s.currentTarget);c=c.slice(h+1)}setTimeout(()=>uy(c)),s.preventDefault()}})})})});function tf(e){const t=[],a=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const r=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||r?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;a.nextNode();)t.push(a.currentNode);return t}function uy(e){const t=document.activeElement;return e.some(a=>a===t?!0:(a.focus(),document.activeElement!==t))}function F5(e){return e.forEach(t=>{t.dataset.tabindex=t.getAttribute("tabindex")||"",t.setAttribute("tabindex","-1")}),()=>{e.forEach(t=>{const a=t.dataset.tabindex;t.setAttribute("tabindex",a)})}}function af(e,t){const a=tt(t);rt(()=>{let n=0;if(e){const r=new ResizeObserver(()=>{cancelAnimationFrame(n),n=window.requestAnimationFrame(a)});return r.observe(e),()=>{window.cancelAnimationFrame(n),r.unobserve(e)}}},[e,a])}function hy(e){return e?"open":"closed"}function F1(e,t){return`${e}-trigger-${t}`}function H1(e,t){return`${e}-content-${t}`}function Jd(e){return t=>t.pointerType==="mouse"?e(t):void 0}var B1=T1,V1=N1,H5=R1,W1=D1,B5=_1,$1=q1,K1=U1,Y1=L1;const nf=f.forwardRef(({className:e,children:t,...a},n)=>i.jsxs(B1,{ref:n,className:J("relative z-10 flex max-w-max flex-1 items-center justify-center",e),...a,children:[t,i.jsx(J1,{})]}));nf.displayName=B1.displayName;const rf=f.forwardRef(({className:e,...t},a)=>i.jsx(V1,{ref:a,className:J("group flex flex-1 list-none items-center justify-center space-x-1",e),...t}));rf.displayName=V1.displayName;const Uw=H5,V5=Xi("group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50"),of=f.forwardRef(({className:e,children:t,...a},n)=>i.jsxs(W1,{ref:n,className:J(V5(),"group",e),...a,children:[t," ",i.jsx(Pu,{className:"relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180","aria-hidden":"true"})]}));of.displayName=W1.displayName;const sf=f.forwardRef(({className:e,...t},a)=>i.jsx(K1,{ref:a,className:J("left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto",e),...t}));sf.displayName=K1.displayName;const W5=B5,J1=f.forwardRef(({className:e,...t},a)=>i.jsx("div",{className:J("absolute left-0 top-full flex justify-center"),children:i.jsx(Y1,{className:J("origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",e),ref:a,...t})}));J1.displayName=Y1.displayName;const $5=f.forwardRef(({className:e,...t},a)=>i.jsx($1,{ref:a,className:J("top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",e),...t,children:i.jsx("div",{className:"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md"})}));$5.displayName=$1.displayName;var pp="rovingFocusGroup.onEntryFocus",K5={bubbles:!1,cancelable:!0},Xl="RovingFocusGroup",[lf,Q1,Y5]=Eo(Xl),[J5,$u]=Wt(Xl,[Y5]),[Q5,Z5]=J5(Xl),Z1=f.forwardRef((e,t)=>
vendor: 17,142 bytes, line 528
528i.jsx(lf.Provider,{scope:e.__scopeRovingFocusGroup,children:i.jsx(lf.Slot,{scope:e.__scopeRovingFocusGroup,children:i.jsx(X5,{...e,ref:t})})}));Z1.displayName=Xl;var X5=f.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:a,orientation:n,loop:r=!1,dir:o,currentTabStopId:s,defaultCurrentTabStopId:l,onCurrentTabStopIdChange:c,onEntryFocus:d,preventScrollOnEntryFocus:u=!1,...h}=e,m=f.useRef(null),p=ye(t,m),b=ds(o),[g,v]=Vt({prop:s,defaultProp:l??null,onChange:c,caller:Xl}),[w,y]=f.useState(!1),x=tt(d),k=Q1(a),C=f.useRef(!1),[S,A]=f.useState(0);return f.useEffect(()=>{const P=m.current;if(P)return P.addEventListener(pp,x),()=>P.removeEventListener(pp,x)},[x]),i.jsx(Q5,{scope:a,orientation:n,dir:b,loop:r,currentTabStopId:g,onItemFocus:f.useCallback(P=>v(P),[v]),onItemShiftTab:f.useCallback(()=>y(!0),[]),onFocusableItemAdd:f.useCallback(()=>A(P=>P+1),[]),onFocusableItemRemove:f.useCallback(()=>A(P=>P-1),[]),children:i.jsx(ee.div,{tabIndex:w||S===0?-1:0,"data-orientation":n,...h,ref:p,style:{outline:"none",...e.style},onMouseDown:q(e.onMouseDown,()=>{C.current=!0}),onFocus:q(e.onFocus,P=>{const I=!C.current;if(P.target===P.currentTarget&&I&&!w){const N=new CustomEvent(pp,K5);if(P.currentTarget.dispatchEvent(N),!N.defaultPrevented){const V=k().filter(F=>F.focusable),z=V.find(F=>F.active),L=V.find(F=>F.id===g),K=[z,L,...V].filter(Boolean).map(F=>F.ref.current);tA(K,u)}}C.current=!1}),onBlur:q(e.onBlur,()=>y(!1))})})}),X1="RovingFocusGroupItem",eA=f.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:a,focusable:n=!0,active:r=!1,tabStopId:o,children:s,...l}=e,c=_t(),d=o||c,u=Z5(X1,a),h=u.currentTabStopId===d,m=Q1(a),{onFocusableItemAdd:p,onFocusableItemRemove:b,currentTabStopId:g}=u;return f.useEffect(()=>{if(n)return p(),()=>b()},[n,p,b]),i.jsx(lf.ItemSlot,{scope:a,id:d,focusable:n,active:r,children:i.jsx(ee.span,{tabIndex:h?0:-1,"data-orientation":u.orientation,...l,ref:t,onMouseDown:q(e.onMouseDown,v=>{n?u.onItemFocus(d):v.preventDefault()}),onFocus:q(e.onFocus,()=>u.onItemFocus(d)),onKeyDown:q(e.onKeyDown,v=>{if(v.key==="Tab"&&v.shiftKey){u.onItemShiftTab();return}if(v.target!==v.currentTarget)return;const w=a4(v,u.orientation,u.dir);if(w!==void 0){if(v.metaKey||v.ctrlKey||v.altKey||v.shiftKey)return;v.preventDefault();let x=m().filter(k=>k.focusable).map(k=>k.ref.current);if(w==="last")x.reverse();else if(w==="prev"||w==="next"){w==="prev"&&x.reverse();const k=x.indexOf(v.currentTarget);x=u.loop?n4(x,k+1):x.slice(k+1)}setTimeout(()=>tA(x))}}),children:typeof s=="function"?s({isCurrentTabStop:h,hasTabStop:g!=null}):s})})});eA.displayName=X1;var e4={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function t4(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function a4(e,t,a){const n=t4(e.key,a);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(n))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(n)))return e4[n]}function tA(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}function n4(e,t){return e.map((a,n)=>e[(t+n)%e.length])}var aA=Z1,nA=eA,cf=["Enter"," "],r4=["ArrowDown","PageUp","Home"],rA=["ArrowUp","PageDown","End"],o4=[...r4,...rA],i4={ltr:[...cf,"ArrowRight"],rtl:[...cf,"ArrowLeft"]},s4={ltr:["ArrowLeft"],rtl:["ArrowRight"]},ec="Menu",[Rl,l4,c4]=Eo(ec),[Do,oA]=Wt(ec,[c4,rs,$u]),Ku=rs(),iA=$u(),[d4,_o]=Do(ec),[u4,tc]=Do(ec),sA=e=>{const{__scopeMenu:t,open:a=!1,children:n,dir:r,onOpenChange:o,modal:s=!0}=e,l=Ku(t),[c,d]=f.useState(null),u=f.useRef(!1),h=tt(o),m=ds(r);return f.useEffect(()=>{const p=()=>{u.current=!0,document.addEventListener("pointerdown",b,{capture:!0,once:!0}),document.addEventListener("pointermove",b,{capture:!0,once:!0})},b=()=>u.current=!1;return document.addEventListener("keydown",p,{capture:!0}),()=>{document.removeEventListener("keydown",p,{capture:!0}),document.removeEventListener("pointerdown",b,{capture:!0}),document.removeEventListener("pointermove",b,{capture:!0})}},[]),i.jsx(Mg,{...l,children:i.jsx(d4,{scope:t,open:a,onOpenChange:h,content:c,onContentChange:d,children:i.jsx(u4,{scope:t,onClose:f.useCallback(()=>h(!1),[h]),isUsingKeyboardRef:u,dir:m,modal:s,children:n})})})};sA.displayName=ec;var h4="MenuAnchor",py=f.forwardRef((e,t)=>{const{__scopeMenu:a,...n}=e,r=Ku(a);return i.jsx(Lg,{...r,...n,ref:t})});py.displayName=h4;var my="MenuPortal",[p4,lA]=Do(my,{forceMount:void 0}),cA=e=>{const{__scopeMenu:t,forceMount:a,children:n,container:r}=e,o=_o(my,t);return i.jsx(p4,{scope:t,forceMount:a,children:i.jsx(ft,{present:a||o.open,children:i.jsx(Zi,{asChild:!0,container:r,children:n})})})};cA.displayName=my;var ya="MenuContent",[m4,fy]=Do(ya),dA=f.forwardRef((e,t)=>{const a=lA(ya,e.__scopeMenu),{forceMount:n=a.forceMount,...r}=e,o=_o(ya,e.__scopeMenu),s=tc(ya,e.__scopeMenu);return i.jsx(Rl.Provider,{scope:e.__scopeMenu,children:i.jsx(ft,{present:n||o.open,children:i.jsx(Rl.Slot,{scope:e.__scopeMenu,children:s.modal?i.jsx(f4,{...r,ref:t}):i.jsx(g4,{...r,ref:t})})})})}),f4=f.forwardRef((e,t)=>{const a=_o(ya,e.__scopeMenu),n=f.useRef(null),r=ye(t,n);return f.useEffect(()=>{const o=n.current;if(o)return ay(o)},[]),i.jsx(gy,{...e,ref:r,trapFocus:a.open,disableOutsidePointerEvents:a.open,disableOutsideScroll:!0,onFocusOutside:q(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>a.onOpenChange(!1)})}),g4=f.forwardRef((e,t)=>{const a=_o(ya,e.__scopeMenu);return i.jsx(gy,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>a.onOpenChange(!1)})}),y4=yo("MenuContent.ScrollLock"),gy=f.forwardRef((e,t)=>{const{__scopeMenu:a,loop:n=!1,trapFocus:r,onOpenAutoFocus:o,onCloseAutoFocus:s,disableOutsidePointerEvents:l,onEntryFocus:c,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:h,onInteractOutside:m,onDismiss:p,disableOutsideScroll:b,...g}=e,v=_o(ya,a),w=tc(ya,a),y=Ku(a),x=iA(a),k=l4(a),[C,S]=f.useState(null),A=f.useRef(null),P=ye(t,A,v.onContentChange),I=f.useRef(0),N=f.useRef(""),V=f.useRef(0),z=f.useRef(null),L=f.useRef("right"),E=f.useRef(0),K=b?Vu:f.Fragment,F=b?{as:y4,allowPinchZoom:!0}:void 0,Z=T=>{var B,Pe;const O=N.current+T,$=k().filter(Te=>!Te.disabled),W=document.activeElement,se=(B=$.find(Te=>Te.ref.current===W))==null?void 0:B.textValue,le=$.map(Te=>Te.textValue),Re=j4(le,O,se),_e=(Pe=$.find(Te=>Te.textValue===Re))==null?void 0:Pe.ref.current;(function Te(xe){N.current=xe,window.clearTimeout(I.current),xe!==""&&(I.current=window.setTimeout(()=>Te(""),1e3))})(O),_e&&setTimeout(()=>_e.focus())};f.useEffect(()=>()=>window.clearTimeout(I.current),[]),ty();const j=f.useCallback(T=>{var $,W;return L.current===(($=z.current)==null?void 0:$.side)&&E4(T,(W=z.current)==null?void 0:W.area)},[]);return i.jsx(m4,{scope:a,searchRef:N,onItemEnter:f.useCallback(T=>{j(T)&&T.preventDefault()},[j]),onItemLeave:f.useCallback(T=>{var O;j(T)||((O=A.current)==null||O.focus(),S(null))},[j]),onTriggerLeave:f.useCallback(T=>{j(T)&&T.preventDefault()},[j]),pointerGraceTimerRef:V,onPointerGraceIntentChange:f.useCallback(T=>{z.current=T},[]),children:i.jsx(K,{...F,children:i.jsx(Hu,{asChild:!0,trapped:r,onMountAutoFocus:q(o,T=>{var O;T.preventDefault(),(O=A.current)==null||O.focus({preventScroll:!0})}),onUnmountAutoFocus:s,children:i.jsx(zo,{asChild:!0,disableOutsidePointerEvents:l,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:h,onInteractOutside:m,onDismiss:p,children:i.jsx(aA,{asChild:!0,...x,dir:w.dir,orientation:"vertical",loop:n,currentTabStopId:C,onCurrentTabStopIdChange:S,onEntryFocus:q(c,T=>{w.isUsingKeyboardRef.current||T.preventDefault()}),preventScrollOnEntryFocus:!0,children:i.jsx(Og,{role:"menu","aria-orientation":"vertical","data-state":PA(v.open),"data-radix-menu-content":"",dir:w.dir,...y,...g,ref:P,style:{outline:"none",...g.style},onKeyDown:q(g.onKeyDown,T=>{const $=T.target.closest("[data-radix-menu-content]")===T.currentTarget,W=T.ctrlKey||T.altKey||T.metaKey,se=T.key.length===1;$&&(T.key==="Tab"&&T.preventDefault(),!W&&se&&Z(T.key));const le=A.current;if(T.target!==le||!o4.includes(T.key))return;T.preventDefault();const _e=k().filter(B=>!B.disabled).map(B=>B.ref.current);rA.includes(T.key)&&_e.reverse(),T4(_e)}),onBlur:q(e.onBlur,T=>{T.currentTarget.contains(T.target)||(window.clearTimeout(I.current),N.current="")}),onPointerMove:q(e.onPointerMove,Dl(T=>{const O=T.target,$=E.current!==T.clientX;if(T.currentTarget.contains(O)&&$){const W=T.clientX>E.current?"right":"left";L.current=W,E.current=T.clientX}}))})})})})})})});dA.displayName=ya;var v4="MenuGroup",yy=f.forwardRef((e,t)=>{const{__scopeMenu:a,...n}=e;return i.jsx(ee.div,{role:"group",...n,ref:t})});yy.displayName=v4;var b4="MenuLabel",uA=f.forwardRef((e,t)=>{const{__scopeMenu:a,...n}=e;return i.jsx(ee.div,{...n,ref:t})});uA.displayName=b4;var Qd="MenuItem",Mw="menu.itemSelect",Yu=f.forwardRef((e,t)=>{const{disabled:a=!1,onSelect:n,...r}=e,o=f.useRef(null),s=tc(Qd,e.__scopeMenu),l=fy(Qd,e.__scopeMenu),c=ye(t,o),d=f.useRef(!1),u=()=>{const h=o.current;if(!a&&h){const m=new CustomEvent(Mw,{bubbles:!0,cancelable:!0});h.addEventListener(Mw,p=>n==null?void 0:n(p),{once:!0}),fl(h,m),m.defaultPrevented?d.current=!1:s.onClose()}};return i.jsx(hA,{...r,ref:c,disabled:a,onClick:q(e.onClick,u),onPointerDown:h=>{var m;(m=e.onPointerDown)==null||m.call(e,h),d.current=!0},onPointerUp:q(e.onPointerUp,h=>{var m;d.current||(m=h.currentTarget)==null||m.click()}),onKeyDown:q(e.onKeyDown,h=>{const m=l.searchRef.current!=="";a||m&&h.key===" "||cf.includes(h.key)&&(h.currentTarget.click(),h.preventDefault())})})});Yu.displayName=Qd;var hA=f.forwardRef((e,t)=>{const{__scopeMenu:a,disabled:n=!1,textValue:r,...o}=e,s=fy(Qd,a),l=iA(a),c=f.useRef(null),d=ye(t,c),[u,h]=f.useState(!1),[m,p]=f.useState("");return f.useEffect(()=>{const b=c.current;b&&p((b.textContent??"").trim())},[o.children]),i.jsx(Rl.ItemSlot,{scope:a,disabled:n,textValue:r??m,children:i.jsx(nA,{asChild:!0,...l,focusable:!n,children:i.jsx(ee.div,{role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":n||void 0,"data-disabled":n?"":void 0,...o,ref:d,onPointerMove:q(e.onPointerMove,Dl(b=>{n?s.onItemLeave(b):(s.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:q(e.onPointerLeave,Dl(b=>s.onItemLeave(b))),onFocus:q(e.onFocus,()=>h(!0)),onBlur:q(e.onBlur,()=>h(!1))})})})}),w4="MenuCheckboxItem",pA=f.forwardRef((e,t)=>{const{checked:a=!1,onCheckedChange:n,...r}=e;return i.jsx(vA,{scope:e.__scopeMenu,checked:a,children:i.jsx(Yu,{role:"menuitemcheckbox","aria-checked":Zd(a)?"mixed":a,...r,ref:t,"data-state":by(a),onSelect:q(r.onSelect,()=>n==null?void 0:n(Zd(a)?!0:!a),{checkForDefaultPrevented:!1})})})});pA.displayName=w4;var mA="MenuRadioGroup",[x4,k4]=Do(mA,{value:void 0,onValueChange:()=>{}}),fA=f.forwardRef((e,t)=>{const{value:a,onValueChange:n,...r}=e,o=tt(n);return i.jsx(x4,{scope:e.__scopeMenu,value:a,onValueChange:o,children:i.jsx(yy,{...r,ref:t})})});fA.displayName=mA;var gA="MenuRadioItem",yA=f.forwardRef((e,t)=>{const{value:a,...n}=e,r=k4(gA,e.__scopeMenu),o=a===r.value;return i.jsx(vA,{scope:e.__scopeMenu,checked:o,children:i.jsx(Yu,{role:"menuitemradio","aria-checked":o,...n,ref:t,"data-state":by(o),onSelect:q(n.onSelect,()=>{var s;return(s=r.onValueChange)==null?void 0:s.call(r,a)},{checkForDefaultPrevented:!1})})})});yA.displayName=gA;var vy="MenuItemIndicator",[vA,C4]=Do(vy,{checked:!1}),bA=f.forwardRef((e,t)=>{const{__scopeMenu:a,forceMount:n,...r}=e,o=C4(vy,a);return i.jsx(ft,{present:n||Zd(o.checked)||o.checked===!0,children:i.jsx(ee.span,{...r,ref:t,"data-state":by(o.checked)})})});bA.displayName=vy;var S4="MenuSeparator",wA=f.forwardRef((e,t)=>{const{__scopeMenu:a,...n}=e;return i.jsx(ee.div,{role:"separator","aria-orientation":"horizontal",...n,ref:t})});wA.displayName=S4;var A4="MenuArrow",xA=f.forwardRef((e,t)=>{const{__scopeMenu:a,...n}=e,r=Ku(a);return i.jsx(Gg,{...r,...n,ref:t})});xA.displayName=A4;var P4="MenuSub",[gF,kA]=Do(P4),zs="MenuSubTrigger",CA=f.forwardRef((e,t)=>{const a=_o(zs,e.__scopeMenu),n=tc(zs,e.__scopeMenu),r=kA(zs,e.__scopeMenu),o=fy(zs,e.__scopeMenu),s=f.useRef(null),{pointerGraceTimerRef:l,onPointerGraceIntentChange:c}=o,d={__scopeMenu:e.__scopeMenu},u=f.useCallback(()=>{s.current&&window.clearTimeout(s.current),s.current=null},[]);return f.useEffect(()=>u,[u]),f.useEffect(()=>{const h=l.current;return()=>{window.clearTimeout(h),c(null)}},[l,c]),i.jsx(py,{asChild:!0,...d,children:i.jsx(hA,{id:r.triggerId,"aria-haspopup":"menu","aria-expanded":a.open,"aria-controls":r.contentId,"data-state":PA(a.open),...e,ref:Wl(t,r.onTriggerChange),onClick:h=>{var m;(m=e.onClick)==null||m.call(e,h),!(e.disabled||h.defaultPrevented)&&(h.currentTarget.focus(),a.open||a.onOpenChange(!0))},onPointerMove:q(e.onPointerMove,Dl(h=>{o.onItemEnter(h),!h.defaultPrevented&&!e.disabled&&!a.open&&!s.current&&(o.onPointerGraceIntentChange(null),s.current=window.setTimeout(()=>{a.onOpenChange(!0),u()},100))})),onPointerLeave:q(e.onPointerLeave,Dl(h=>{var p,b;u();const m=(p=a.content)==null?void 0:p.getBoundingClientRect();if(m){const g=(b=a.content)==null?void 0:b.dataset.side,v=g==="right",w=v?-5:5,y=m[v?"left":"right"],x=m[v?"right":"left"];o.onPointerGraceIntentChange({area:[{x:h.clientX+w,y:h.clientY},{x:y,y:m.top},{x,y:m.top},{x,y:m.bottom},{x:y,y:m.bottom}],side:g}),window.clearTimeout(l.current),l.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(h),h.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:q(e.onKeyDown,h=>{var p;const m=o.searchRef.current!=="";e.disabled||m&&h.key===" "||i4[n.dir].includes(h.key)&&(a.onOpenChange(!0),(p=a.content)==null||p.focus(),h.preventDefault())})})})});CA.displayName=zs;var SA="MenuSubContent",AA=f.forwardRef((e,t)=>{const a=lA(ya,e.__scopeMenu),{forceMount:n=a.forceMount,...r}=e,o=_o(ya,e.__scopeMenu),s=tc(ya,e.__scopeMenu),l=kA(SA,e.__scopeMenu),c=f.useRef(null),d=ye(t,c);return i.jsx(Rl.Provider,{scope:e.__scopeMenu,children:i.jsx(ft,{present:n||o.open,children:i.jsx(Rl.Slot,{scope:e.__scopeMenu,children:i.jsx(gy,{id:l.contentId,"aria-labelledby":l.triggerId,...r,ref:d,align:"start",side:s.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{var h;s.isUsingKeyboardRef.current&&((h=c.current)==null||h.focus()),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:q(e.onFocusOutside,u=>{u.target!==l.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:q(e.onEscapeKeyDown,u=>{s.onClose(),u.preventDefault()}),onKeyDown:q(e.onKeyDown,u=>{var p;const h=u.currentTarget.contains(u.target),m=s4[s.dir].includes(u.key);h&&m&&(o.onOpenChange(!1),(p=l.trigger)==null||p.focus(),u.preventDefault())})})})})})});AA.displayName=SA;function PA(e){return e?"open":"closed"}function Zd(e){return e==="indeterminate"}function by(e){return Zd(e)?"indeterminate":e?"checked":"unchecked"}function T4(e){const t=document.activeElement;for(const a of e)if(a===t||(a.focus(),document.activeElement!==t))return}function I4(e,t){return e.map((a,n)=>e[(t+n)%e.length])}function j4(e,t,a){const r=t.length>1&&Array.from(t).every(d=>d===t[0])?t[0]:t,o=a?e.indexOf(a):-1;let s=I4(e,Math.max(o,0));r.length===1&&(s=s.filter(d=>d!==a));const c=s.find(d=>d.toLowerCase().startsWith(r.toLowerCase()));return c!==a?c:void 0}function N4(e,t){const{x:a,y:n}=e;let r=!1;for(let o=0,s=t.length-1;o<t.length;s=o++){const l=t[o],c=t[s],d=l.x,u=l.y,h=c.x,m=c.y;u>n!=m>n&&a<(h-d)*(n-u)/(m-u)+d&&(r=!r)}return r}function E4(e,t){if(!t)return!1;const a={x:e.clientX,y:e.clientY};return N4(a,t)}function Dl(e){return t=>t.pointerType==="mouse"?e(t):void 0}var z4=sA,R4=py,D4=cA,_4=dA,q4=yy,U4=uA,M4=Yu,L4=pA,O4=fA,G4=yA,F4=bA,H4=wA,B4=xA,V4=CA,W4=AA,Ju="DropdownMenu",[$4,yF]=Wt(Ju,[oA]),Mt=oA(),[K4,TA]=$4(Ju),IA=e=>{const{__scopeDropdownMenu:t,children:a,dir:n,open:r,defaultOpen:o,onOpenChange:s,modal:l=!0}=e,c=Mt(t),d=f.useRef(null),[u,h]=Vt({prop:r,defaultProp:o??!1,onChange:s,caller:Ju});return i.jsx(K4,{scope:t,triggerId:_t(),triggerRef:d,contentId:_t(),open:u,onOpenChange:h,onOpenToggle:f.useCallback(()=>h(m=>!m),[h]),modal:l,children:i.jsx(z4,{...c,open:u,onOpenChange:h,dir:n,modal:l,children:a})})};IA.displayName=Ju;var jA="DropdownMenuTrigger",NA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,disabled:n=!1,...r}=e,o=TA(jA,a),s=Mt(a);return i.jsx(R4,{asChild:!0,...s,children:i.jsx(ee.button,{type:"button",id:o.triggerId,"aria-haspopup":"menu","aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?"open":"closed","data-disabled":n?"":void 0,disabled:n,...r,ref:Wl(t,o.triggerRef),onPointerDown:q(e.onPointerDown,l=>{!n&&l.button===0&&l.ctrlKey===!1&&(o.onOpenToggle(),o.open||l.preventDefault())}),onKeyDown:q(e.onKeyDown,l=>{n||(["Enter"," "].includes(l.key)&&o.onOpenToggle(),l.key==="ArrowDown"&&o.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(l.key)&&l.preventDefault())})})})});NA.displayName=jA;var Y4="DropdownMenuPortal",EA=e=>{const{__scopeDropdownMenu:t,...a}=e,n=Mt(t);return i.jsx(D4,{...n,...a}
528)};EA.displayName=Y4;var zA="DropdownMenuContent",RA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=TA(zA,a),o=Mt(a),s=f.useRef(!1);return i.jsx(_4,{id:r.contentId,"aria-labelledby":r.triggerId,...o,...n,ref:t,onCloseAutoFocus:q(e.onCloseAutoFocus,l=>{var c;s.current||(c=r.triggerRef.current)==null||c.focus(),s.current=!1,l.preventDefault()}),onInteractOutside:q(e.onInteractOutside,l=>{const c=l.detail.originalEvent,d=c.button===0&&c.ctrlKey===!0,u=c.button===2||d;(!r.modal||u)&&(s.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});RA.displayName=zA;var J4="DropdownMenuGroup",Q4=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(q4,{...r,...n,ref:t})});Q4.displayName=J4;var Z4="DropdownMenuLabel",DA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(U4,{...r,...n,ref:t})});DA.displayName=Z4;var X4="DropdownMenuItem",_A=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(M4,{...r,...n,ref:t})});_A.displayName=X4;var eL="DropdownMenuCheckboxItem",qA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(L4,{...r,...n,ref:t})});qA.displayName=eL;var tL="DropdownMenuRadioGroup",aL=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(O4,{...r,...n,ref:t})});aL.displayName=tL;var nL="DropdownMenuRadioItem",UA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(G4,{...r,...n,ref:t})});UA.displayName=nL;var rL="DropdownMenuItemIndicator",MA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(F4,{...r,...n,ref:t})});MA.displayName=rL;var oL="DropdownMenuSeparator",LA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(H4,{...r,...n,ref:t})});LA.displayName=oL;var iL="DropdownMenuArrow",sL=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(B4,{...r,...n,ref:t})});sL.displayName=iL;var lL="DropdownMenuSubTrigger",OA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(V4,{...r,...n,ref:t})});OA.displayName=lL;var cL="DropdownMenuSubContent",GA=f.forwardRef((e,t)=>{const{__scopeDropdownMenu:a,...n}=e,r=Mt(a);return i.jsx(W4,{...r,...n,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});GA.displayName=cL;var dL=IA,uL=NA,hL=EA,FA=RA,HA=DA,BA=_A,VA=qA,WA=UA,$A=MA,KA=LA,YA=OA,JA=GA;const pL=dL,mL=uL,fL=f.forwardRef(({className:e,inset:t,children:a,...n},r)=>i.jsxs(YA,{ref:r,className:J("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent",t&&"pl-8",e),...n,children:[a,i.jsx(SN,{className:"ml-auto h-4 w-4"})]}));fL.displayName=YA.displayName;const gL=f.forwardRef(({className:e,...t},a)=>i.jsx(JA,{ref:a,className:J("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));gL.displayName=JA.displayName;const QA=f.forwardRef(({className:e,sideOffset:t=4,...a},n)=>i.jsx(hL,{children:i.jsx(FA,{ref:n,sideOffset:t,className:J("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
528de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...a})}));QA.displayName=FA.displayName;const ZA=f.forwardRef(({className:e,inset:t,...a},n)=>i.jsx(BA,{ref:n,className:J("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",t&&"pl-8",e),...a}));ZA.displayName=BA.displayName;const yL=f.forwardRef(({className:e,children:t,checked:a,...n},r)=>i.jsxs(VA,{ref:r,className:J("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",e),checked:a,...n,children:[i.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:i.jsx($A,{children:i.jsx(Cn,{className:"h-4 w-4"})})}),t]}));yL.displayName=VA.displayName;const vL=f.forwardRef(({className:e,children:t,...a},n)=>i.jsxs(WA,{ref:n,className:J("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",e),...a,children:[i.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:i.jsx($A,{children:i.jsx(IN,{className:"h-2 w-2 fill-current"})})}),t]}));vL.displayName=WA.displayName;const bL=f.forwardRef(({className:e,inset:t,...a},n)=>i.jsx(HA,{ref:n,className:J("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...a}));bL.displayName=HA.displayName;const wL=f.forwardRef(({className:e,...t},a)=>i.jsx(KA,{ref:a,className:J("-mx-1 my-1 h-px bg-muted",e),...t}));wL.displayName=KA.displayName;const xL=[{code:"en",label:"English",flag:"ð¬ð§"},{code:"es",label:"Español",flag:"ðªð¸"},{code:"de",label:"Deutsch",flag:"ð©ðª"},{code:"it",label:"Italiano",flag:"ð®ð¹"},{code:"fr",label:"Français",flag:"ð«ð·"}];function kL(){const e=typeof window<"u"?window.location.pathname:"/",t=ss(e),a=Mu(e);return i.jsxs(pL,{children:[i.jsx(mL,{asChild:!0,children:i.jsx(H,{variant:"ghost",size:"icon",className:"h-9 w-9","aria-label":"Change language",children:i.jsx(Tu,{className:"h-4 w-4"})})}),i.jsx(QA,{align:"end",className:"min-w-[140px]",children:xL.map(n=>i.jsx(ZA,{asChild:!0,className:t===n.code?"bg-muted":"",children:i.jsxs("a",{href:Zg(n.code,a),hrefLang:n.code,lang:n.code,children:[i.jsx("span",{className:"mr-2",children:n.flag}),n.label]})},n.code))})]})}const Rs=D.forwardRef(({className:e,title:t,children:a,icon:n,...r},o)=>i.jsx("li",{children:i.jsx(W5,{asChild:!0,children:i.jsxs("a",{ref:o,className:J("block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",e),...r,children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium leading-none",children:[n,t]}),i.jsx("p",{className:"line-clamp-2 text-xs leading-snug text-muted-foreground mt-1.5",children:a})]})})}));Rs.displayName="ListItem";const Ee=()=>{const{t:e}=we(),t=SS(ss(typeof window<"u"?window.location.pathname:"/"))??"";e("nav.product"),e("nav.pricing"),e("nav.docs"),e("nav.models"),e("nav.blog","Blog");const a=[{name:e("nav.forBrands"),desc:e("nav.forBrandsDesc"),href:"/for-brands",icon:i.jsx(Zr,{className:"h-4 w-4 text-primary"})},{name:e("nav.forAgencies"),desc:e("nav.forAgenciesDesc"),href:"/for-agencies",icon:i.jsx(ON,{className:"h-4 w-4 text-primary"}),sub:[{name:e("nav.talentAgencies"),desc:e("nav.talentAgenciesDesc"),href:"/for-agencies/talent"},{name:e("nav.merchantAgencies"),desc:e("nav.merchantAgenciesDesc"),href:"/for-agencies/merchant"}]},{name:e("nav.forCreators"),desc:e("nav.forCreatorsDesc"),href:"/for-creators",icon:i.jsx(oC,{className:"h-4 w-4 text-primary"})}],n=[{name:e("nav.ecommerce"),desc:e("nav.ecommerceDesc"),href:"/solutions/ecommerce",icon:i.jsx(uC,{className:"h-4 w-4 text-primary"})},{name:e("nav.solutions"),desc:e("nav.forAgenciesDesc"),href:"/solutions",icon:i.jsx(Kl,{className:"h-4 w-4 text-primary"})}],r=[{name:e("integrations.cardClaudeTitle"),desc:e("integrations.cardClaudeDesc"),href:"/integrations/claude",icon:i.jsx(bo,{className:"h-4 w-4 text-primary"}),badge:"New"},{name:e("integrations.cardAmazonTitle"),desc:e("integrations.cardAmazonDesc"),href:"/product/amazon-import",icon:i.jsx(xa,{
528className:"h-4 w-4 text-primary"}),badge:"New"},{name:e("integrations.cardSdksTitle"),desc:e("integrations.cardSdksDesc"),href:"/sdks",icon:i.jsx(zr,{className:"h-4 w-4 text-primary"}),badge:"New"},{name:e("integrations.exploreAll"),desc:e("integrations.heroSubtitle"),href:"/integrations",icon:i.jsx(cC,{className:"h-4 w-4 text-primary"})}];return i.jsx("header",{className:"sticky top-0 z-50 w-full border-b border-border/30 bg-background/80 backdrop-blur-2xl supports-[backdrop-filter]:bg-background/50",children:i.jsxs("nav",{className:"container flex h-14 sm:h-16 items-center justify-between px-4",children:[i.jsx(M,{to:"/",className:"flex items-center space-x-2 shrink-0",children:i.jsx("span",{className:"text-xl sm:text-2xl font-display font-bold tracking-tight logo-gradient",children:"HeroShots"})}),i.jsxs("div",{className:"hidden lg:flex lg:items-center lg:gap-1 xl:gap-2",children:[i.jsx(M,{to:"/product",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.product")}),i.jsx(nf,{children:i.jsx(rf,{children:i.jsxs(Uw,{children:[i.jsx(of,{className:"text-sm font-medium text-muted-foreground hover:text-foreground bg-transparent hover:bg-transparent data-[state=open]:bg-transparent",children:e("nav.solutions")}),i.jsx(sf,{children:i.jsx("div",{className:"w-[480px] p-4",children:i.jsxs("div",{className:"grid grid-cols-2 gap-1",children:[i.jsxs("div",{children:[i.jsx("p",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 pb-2",children:e("nav.whoItsFor")}),i.jsx("ul",{className:"space-y-0",children:a.map(o=>i.jsxs("li",{children:[i.jsx(Rs,{href:t+o.href,title:o.name,icon:o.icon,children:o.desc}),"sub"in o&&o.sub&&i.jsx("ul",{className:"pl-6 space-y-0",children:o.sub.map(s=>i.jsx(Rs,{href:t+s.href,title:s.name,children:s.desc},s.href))})]},o.href))})]}),i.jsxs("div",{children:[i.jsx("p",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 pb-2",children:e("nav.useCases")}),i.jsx("ul",{className:"space-y-0",children:n.map(o=>i.jsx(Rs,{href:t+o.href,title:o.name,icon:o.icon,children:o.desc},o.href))})]})]})})})]})})}),i.jsx(M,{to:"/pricing",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.pricing")}),i.jsx(nf,{children:i.jsx(rf,{children:i.jsxs(Uw,{children:[i.jsx(of,{className:"text-sm font-medium text-muted-foreground hover:text-foreground bg-transparent hover:bg-transparent data-[state=open]:bg-transparent",children:e("integrations.badge")}),i.jsx(sf,{children:i.jsx("div",{className:"w-[360px] p-4",children:i.jsx("ul",{className:"space-y-0",children:r.map(o=>i.jsx(Rs,{href:t+o.href,title:o.name,icon:o.icon,children:o.desc},o.href))})})})]})})}),i.jsx(M,{to:"/docs",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.docs")}),i.jsx(M,{to:"/blog",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.blog","Blog")}),i.jsx(M,{to:"/talent",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.models")}),i.jsx(M,{to:"/faq",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:"FAQ"}),i.jsx(M,{to:"/pre-sales",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 whitespace-nowrap px-3 py-2",children:e("nav.presales")})]}),i.jsxs("div",{className:"flex items-center gap-1 sm:gap-2",children:[i.jsx(kL,{}),i.jsx("a",{href:"https://app.heroshots.ai/login",className:"hidden md:block",children:i.jsx(H,{variant:"ghost",size:"sm",children:e("nav.login")})}),i.jsx(XC,{children:i.jsxs(eS,{children:[i.jsx(tS,{asChild:!0,children:i.jsx(H,{variant:"hero",size:"sm",asChild:!0,className:"hidden md:inline-flex text-xs sm:text-sm",children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("nav.tryNow")})})}),i.jsx(Bg,{children:i.jsx("p",{children:e("common.noCreditCard")})})]})}),i.jsxs(x5,{children:[i.jsx(k5,{asChild:!0,className:"lg:hidden",children:i.jsx(H,{variant:"ghost",size:"icon",className:"h-9 w-9",children:i.jsx(GN,{className:"h-5 w-5"})})}),i.jsx(A1,{side:"right",className:"w-[280px] sm:w-[350px]",children:i.jsxs("div",{className:"flex flex-col gap-4 mt-8",children:[i.jsx(M,{to:"/product",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.product")}),i.jsxs("div",{children:[i.jsx("p",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2",children:e("nav.solutions")}),i.jsx("div",{className:"flex flex-col gap-1 pl-3 border-l-2 border-border",children:[...a,...n].map(o=>i.jsxs(M,{to:o.href,className:"flex items-center gap-2 py-1.5 text-sm font-medium text-foreground hover:text-primary transition-colors",children:[o.icon,o.name]},o.href))})]}),i.jsxs("div",{children:[i.jsx("p",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2",children:e("integrations.badge")}),i.jsx("div",{className:"flex flex-col gap-1 pl-3 border-l-2 border-border",children:r.map(o=>i.jsxs(M,{to:o.href,className:"flex items-center gap-2 py-1.5 text-sm font-medium text-foreground hover:text-primary transition-colors",children:[o.icon,o.name]},o.href))})]}),i.jsx(M,{to:"/pricing",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.pricing")}),i.jsx(M,{to:"/docs",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.docs")}),i.jsx(M,{to:"/blog",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.blog","Blog")}),i.jsx(M,{to:"/talent",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.models")}),i.jsx(M,{to:"/faq",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:"FAQ"}),i.jsx(M,{to:"/pre-sales",className:"text-lg font-medium text-foreground hover:text-primary transition-colors",children:e("nav.presales")}),i.jsxs("div",{className:"border-t border-border pt-4 mt-2 flex flex-col gap-3",children:[i.jsx(H,{variant:"ghost",asChild:!0,className:"justify-start",children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("nav.login")})}),i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("nav.tryNow")})}),i.jsx("p",{className:"text-xs text-muted-foreground text-center",children:e("common.noCreditCard")})]})]})})]})]})]})})},XA=[{slug:"what-is-ugc-and-why-it-works-2026",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["ugc","awareness","marketing"],translations:{en:{title:"What Is UGC? User-Generated Content Explained, and Why It Still Works in 2026",description:"UGC is content made by real people, not brands. What c
528ounts as UGC, the formats it takes, where brands source it, and how AI UGC fits alongside it.",body:`User-generated content (UGC) is any photo, video, review or post created by a real person â a customer, a fan, a hired creator â rather than by a brand's own studio. It works because viewers read it as a peer's account of using a product rather than a brand's claim about it â a recommendation rather than an advertisement. 529 530## What counts as user-generated content? 531 532UGC is defined by authorship, not by production value. If the person holding the camera sits outside the brand's marketing function â a customer, a community member, a freelance creator filming in their own kitchen â the output is UGC. If a studio, agency crew or art director produced it on a set, it is branded content, however casual it looks. 533 534Three practical tests separate the two: 535 536- **Authorship.** Who decided what to say? UGC carries the creator's own words, pacing and framing, even when a brand supplied a brief. 537- **Context.** UGC is shot where the product is actually used â a bathroom counter, a car boot, a gym bag â not against a seamless backdrop. 538- **Format.** It is made for the feed it will live in: vertical, handheld, spoken to camera, rather than a 16:9 master cropped down. 539 540The compact definition lives in the glossary entry for [user-generated content](/glossary/user-generated-content); this page is the long version. 541 542### What is not UGC 543 544Stock photography is not UGC: it is professionally produced imagery licensed from a library, and audiences have learned to recognise the look â see [UGC vs stock photography](/glossary/ugc-vs-stock). A polished studio ad is not UGC either, even cropped to 9:16 with a shaky-cam filter. A celebrity endorsement is different again: its persuasion runs through fame, not peer similarity. 545 546## What formats does UGC take? 547 548UGC is a category, not a single asset type. The formats brands actually reuse fall into a handful of recognisable shapes: 549 550- **Reviews and ratings** â the oldest form of UGC, and the one most product pages are already built to display. 551- **Photo reviews** â a customer's own image attached to a review, showing scale, colour and real lighting. 552- **Unboxings** â first contact with the packaging, filmed in one take. 553- **Testimonials** â a person on camera explaining the problem the product solved. 554- **Tutorials and how-tos** â the format that answers "will I actually be able to use this?" 555- **Before-and-after** â common in beauty, fitness, home and repair categories, where the change is visible in one frame. 556- **Hauls and get-ready-with-me** â the product appears inside a routine rather than as the subject. 557- **Duets, stitches and reaction clips** â UGC responding to other UGC. 558- **Community threads and forum posts** â text UGC that ranks, gets quoted, and increasingly gets cited by AI answer engines. 559 560Testimonials are the easiest format to commission, which is why libraries fill up with them. But a testimonial-only library leaves one question unanswered â whether the buyer will manage to use the product â which is what tutorials and photo reviews exist to handle. 561 562## Why does UGC read as credible to viewers? 563 564The credibility of UGC is not about video quality. It comes from a small set of signals that are hard to fake: 565 566**A peer authorship signal.** The viewer assumes the speaker has nothing to gain, so the claim is processed as information rather than persuasion. That assumption is fragile â the moment a piece looks scripted, the signal inverts and the content reads worse than an honest ad. 567 568**Imperfection as evidence.** A cluttered counter, a slightly clipped mic, a stumble mid-sentence: each of these says "not staged". Polish removes the very artefacts that carry proof. 569 570**Specificity.** "It fits a 15-inch laptop and my water bottle" persuades where "great capacity" does not. UGC tends to be specific because the creator is describing a real object in a real situation. 571 572**Native format fit.** UGC matches the grammar of the feed it appears in, so it is scrolled through rather than skipped past. This is why UGC is a staple of [performance creative](/glossary/performance-creative) â it is built to be tested, not admired. 573 574**Representation.** Real bodies, homes and accents let a wider range of viewers picture themselves owning the product. 575 576The limits matter too. UGC works against you when the category depends on institutional trust rather than peer relatability, when the claim is regulated and needs substantiation, or when the problem is awareness rather than conversion. Studio work still earns its place there. 577 578## Where do brands source UGC? 579 580There are five practical routes, and mature programmes run several at once. 581 582| Source | Who creates it | Message control | Rights you must secure | Best used for | 583|---|---|---|---|---| 584| Organic customer content | Existing customers, unprompted | None | Written permission to repost; a separate licence before any paid use | Product-page social proof, organic reposts | 585| Commissioned creator UGC | Paid creators filming to a brief | Brief-level | Usage rights by channel and term, model release, renewal terms | Testimonials, launches, hero moments | 586| Community, affiliate and ambassador content | Programme members | Guideline-level | Programme terms covering reuse and disclosure | Steady volume, seeding, loyalty | 587| Employee-generated content | Staff on camera | High | Internal
587consent and employment-safe usage terms | Founder stories, behind-the-scenes | 588| AI UGC | Generated from a licensed creator or AI avatar plus a product and a prompt | Prompt-level | Consent and likeness licence applied at generation time | Variant volume, iteration, always-on testing | 589 590Each route trades control against credibility in the same direction: the more the brand controls the message, the less the content behaves like a recommendation. Match route to job rather than picking a favourite. 591 592## Is commissioned creator content still UGC? 593 594Yes, with a caveat. A paid creator filming in their own home, in their own words, produces content that carries the authorship, context and format signals above â that is what the industry means by "UGC creator": a paid production role, not a spontaneous customer act. What breaks the category is not payment but voice: the moment a creator reads a brand script verbatim to camera in a rented studio, you have branded content delivered by a freelancer. 595 596The honest framing is that UGC has become a *style* as well as a *source*, and the two should be tracked separately. Content from real customers earns trust you cannot buy; content produced in the UGC style earns attention in the feed. Confusing them is how brands end up with assets that look authentic and behave like ads. 597 598## How does AI UGC fit alongside human UGC? 599 600[AI UGC](/glossary/ai-ugc) is content produced in the UGC style by pairing a product, a creator's licensed likeness or an [AI avatar](/glossary/ai-avatar), and a written prompt â no shoot required. On HeroShots the likeness side is the point: a [creator avatar](/glossary/creator-avatar) is built from a real, consenting person, and [creator royalties](/glossary/creator-royalties) are part of the licence, so the person whose face appears on screen is credited rather than copied. 601 602The mechanics are deliberately unglamorous: a product imported from an Amazon URL or uploaded, paired with an avatar and a prompt, returned as photo or video UGC. Paid plans expose an API with official SDKs on npm, PyPI and Packagist, so generation can sit inside an existing pipeline. 603 604AI UGC does not replace the customer review or the founder-to-camera testimonial. It replaces the part of the workload that was never really about authenticity â the twelfth background variant, the fifteenth hook, the version reshot because the packaging changed. The head-to-head breakdowns in [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators) and [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot) cover which layer to move first. 605 606A workable division of labour looks like this: real customers for proof, commissioned creators for the flagship narrative, and AI UGC for the volume layer underneath both. 607 608## How do you judge whether a piece of UGC is any good? 609 610Run each asset through these checks before it enters rotation: 611 6121. **Does the first second show the product in use?** Not the logo, not the creator's face â the thing being sold, doing its job. 6132. **Would this person say this sentence unpaid?** If the line only exists because a brand wrote it, cut it. 6143. **Is there one specific, checkable detail?** A measurement, a duration, a failure mode. Generic praise persuades nobody. 6154. **Does the setting match the buyer's setting?** A product filmed in a location the target audience will never occupy loses the "peo
615ple like me" signal. 6165. **Is it legible with sound off?** Much of the feed is muted; the story must survive captions alone. 6176. **Does it name the objection?** Great UGC handles the reason someone would not buy, not the reason they would. 6187. **Is the identity consistent across the set?** If you are running a series, the same person should look like the same person â see [avatar consistency](/glossary/avatar-consistency). 6198. **Are the rights on file before it runs?** No asset ships without a documented licence. 620 621## What rights do you need before you publish UGC? 622 623This is where UGC programmes quietly accumulate risk. A repost on your own social account and a paid ad using the same clip are different permissions, and a customer saying "sure, go ahead" in a DM does not cover the second. 624 625At minimum you want a [model release](/glossary/model-release) for anyone recognisable on camera, explicit [usage rights](/glossary/usage-rights) stating channel, territory and duration, and â where a likeness is reused to generate new content â a [likeness licence](/glossary/likeness-licensing) that covers synthetic outputs, not just the original footage. Rights expire;
625 calendar the renewals. Music is a separate clearance and easy to overlook. 626 627For AI UGC the same obligations apply, plus disclosure. Platforms increasingly expect realistic AI-generated or AI-altered content to be labelled, and transparency rules for synthetic media are tightening in several jurisdictions â the glossary entry on [watermarks](/glossary/watermark) covers how visible marking works in practice. Building consent into the generation step rather than bolting it on afterwards is what keeps a programme defensible at scale. 628 629## What does UGC cost, and how do teams budget for it? 630 631The cost of traditional UGC is driven by variables rather than a single line item: creator fees, product cost and shipping, the length of the usage licence, exclusivity, revisions, and whether you need the same creator again next quarter. Licence length and paid-media rights are usually the biggest drivers, and they are negotiated creator by creator, which is why the total is hard to forecast. 632 633AI UGC prices differently because there is no shoot to schedule. On HeroShots, images are billed by batch of four variants: the first batch in a project is â¬4.90, and each further batch in that same project is â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 on HeroShots Pro. Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Using a real catalog model adds a likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. A custom AI avatar setup is â¬100 one-time; bringing your own model is â¬300 one-time. 634 635HeroShots Pro is â¬99/month and removes watermarks, adds direct downloads and a priority queue, makes edits cheaper and takes â15% off videos. For teams working at video volume there are pre-paid packages: Starter at â¬350 (â¬70/video), Growth at â¬650 (â¬65/video) and Scale at â¬1,500 (â¬60/video). All prices exclude VAT; the full breakdown is on the [pricing page](/pricing). 636 637The free plan gives 10 watermarked images a month and one video preview with no credit card, which is enough to judge whether the output clears the quality bar above before committing budget. Start there, then read [what the platform actually does](/product) once you have something worth scaling.`,faqs:[{q:"What does UGC stand for?",a:"UGC stands for user-generated content: photos, videos, reviews, social posts or forum comments created by real people rather than by a brand's in-house team or paid studio. The defining trait is authorship â the content originates with a customer, fan or independent creator. In marketing, UGC is valued because audiences read it as a peer's account of using a product rather than a brand's claim about it."},{q:"Is a paid creator's video still UGC?",a:"Generally yes. A creator filming in their own home, in their own words, to a loose brief produces content with the authorship, context and format signals that make UGC work â payment does not remove them. What does break the category is voice: a creator reading a brand script verbatim on a rented set is branded content delivered by a freelancer, not UGC, however casual the framing looks."},{q:"What is the difference between UGC and influencer marketing?",a:"Influencer marketing buys distribution: you pay for access to someone's audience, and the post runs on their channel. UGC buys content: you commission or license an asset and run it on your own channels, usually as paid media. The same person can supply both, but the deliverable, the pricing and the usage rights differ. A UGC creator is often hired purely for the footage, in which case audience size is beside the point."},{q:"Is AI UGC really UGC?",a:"AI UGC is content produced in the UGC style using generative AI rather than a filmed shoot, built from a product, a prompt and a licensed likeness or AI avatar. When it is grounded in a real, consenting creator with a likeness licence and royalties, it carries a genuine human identity. Fully synthetic personas are a separate category â closer to a virtual influencer â and should be described that way rather than passed off as customer content."},{q:"Do I need permission to repost a customer's photo?",a:"Yes. Public posting does not grant a brand a licence to reuse content commercially. Ask for written permission that names the specific asset and the intended use, and get a separate, broader licence before running anything as paid media. If a recognisable person appears, you also want a model release. Keep the paper trail with the file, because permissions expire and reposts outlive the conversation that authorised them."},{q:"Which UGC formats work best on product pages?",a:"Photo reviews and short tutorials answer the two questions a product description cannot: what the item actually looks like in a normal room, and whether the buyer will manage to use it. That makes them a natural fit on the page itself. Testimonials are usually better suited to feed placements, where the job is to interrupt rather than to resolve a specific doubt. Before-and-after content suits beauty, fitness and home categories but attracts claim-substantiation scrutiny, so check the wording with whoever signs off on claims."},{q:"How many UGC variants should I test?",a:"Enough that the winner is a finding rather than an accident, which means treating hooks, creators, settings and openings as separate variables instead of shipping one hero asset a month. The historical constraint was production cost: when every variant needs a shoot, the test plan shrinks to fit the budget rather than the question. When variants are cheap to produce, the bottleneck moves to how fast you can read results and how much traffic each variant needs before the read means anything. Size the test from your measurement plan, not your calendar."},{q:"Does UGC have to look low quality?",a:"No. It has to look unstaged, which is not the same thing. Sharp footage, clean audio and good lighting all help; what hurts is production grammar the feed reads as advertising â seamless backdrops, logo lockups in the opening frame, scripted delivery, colour grading that no phone produces. Aim for the best-looking content a well-equipped real person could plausibly have filmed at home."},{q:"How much does AI UGC cost on HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project, â¬1.90 for each further batch in that project. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Using a real catalog model adds a likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. Prices exclude VAT; see the pricing page for pre-paid packages."},{q:"Do I have to disclose that UGC was AI-generated?",a:"Plan for it. Major social platforms expect realistic AI-generated or AI-altered content to be labelled, and transparency obligations for synthetic media are tightening in several jurisdictions. Treat disclosure as a default rather than an exception, keep any AI labelling in place through export and publishing, and check current platform policy and local rules before a campaign runs â requirements in this area change faster than most creative calendars."}],metaTitle:"What Is UGC? Definition, Formats, Examples"},it:{title:"Cos'è l'UGC e perché batte la pubblicità tradizionale nel 2026",description:"L'UGC è contenuto creato da persone reali, non dai brand. Sul paid social batte tipicamente gli ad da studio â e l'AI UGC permette di produrlo a una frazione del costo di uno shooting.",body:`Lo user-generated content (UGC) è qualsiasi foto, video o recensione creato da una persona reale â un cliente, un creator, un fan â invece che dallo studio interno del brand. Nel 2026 l'UGC genera tipicamente **click-through rate più alti** e **conversioni migliori** rispetto al creative da studio su Meta e TikTok, perché il cervello lo interpreta come una raccomandazione, non come una pubblicità . 638 639## Perché l'UGC batte il creative da studio 640 641- **Bias di autenticità **: il cervello tratta il contenuto peer come prova sociale. 642- **Fit nativo**: sembra il feed, non un'interruzione. 643- **Diversità **: corpi, case e accenti reali fanno percepire il prodotto come usabile da "gente come me". 644 645## Perché i brand hanno faticato con l'UGC fino al 2025 646 647Trovare creator, spedire prodotti, licenze e montaggio richiedevano 2â4 settimane per video e un budget di produzione vero. Scalare su 50 SKU in 5 lingue era fuori portata per la maggior parte dei team. 648 649## Cosa è cambiato nel 2026: l'AI UGC 650 651Piattaforme come HeroShots permettono ai brand di generare UGC in 60 secondi con **model reali licenziati** che ricevono una royalty su ogni uso. Stessi segnali di autenticità , una frazione del costo, lead time quasi zero. L'UGC tradizionale non è morto: viene riservato ai momenti ad alta fi
651ducia (testimonial, campagne hero), mentre l'AI UGC gestisce il volume.`,faqs:[{q:"L'AI UGC è ancora considerato UGC?",a:"Sì, quando è costruito su creator reali licenziati come su HeroShots. I volti solo sintetici sono una categoria a parte e performano peggio sulle metriche di fiducia."},{q:"Meta e TikTok penalizzano l'AI UGC?",a:"No. Richiedono disclosure per contenuti completamente sintetici o ingannevoli, ma l'AI UGC con creator reali e licenza viene trattato come qualsiasi altro creative."},{q:"Quanto costa l'AI UGC vs tradizionale?",a:"Su HeroShots il primo batch di 4 varianti immagine in un progetto costa â¬4,90, ogni batch successivo â¬1,90, e il video parte da â¬15 fino a 15 secondi (prezzi IVA esclusa). Una frazione di quanto costa uno shooting UGC tradizionale."},{q:"Posso fare A/B test su 20 creative in un giorno?",a:"Sì. Generare 20 varianti richiede minuti su HeroShots; il collo di bottiglia passa dalla produzione all'apprendimento."}]},es:{title:"Qué es el UGC y por qué supera a la publicidad tradicional en 2026",description:"El UGC es contenido creado por personas reales, no por marcas. En paid social suele superar a los anuncios de estudio â y el AI UGC permite producirlo a una fracción del coste de un shooting.",body:`El user-generated content (UGC) es cualquier foto, vÃdeo o reseña creado por una persona real â un cliente, un creator, un fan â en vez del estudio interno de la marca. En 2026 el UGC genera normalmente **más click-through rate** y **mejor conversión** que el creative de estudio en Meta y TikTok, porque el cerebro lo procesa como una recomendación, no como un anuncio. 652 653## Por qué el UGC supera al creative de estudio 654 655- **Sesgo de autenticidad**: el cerebro trata el contenido peer como prueba social. 656- **Fit nativo**: parece el feed, no una interrupción. 657- **Diversidad**: cuerpos, casas y acentos reales hacen que el producto se perciba usable por "gente como yo". 658 659## Por qué las marcas sufrieron con el UGC hasta 2025 660 661Buscar creators, enviar producto, licencias y edición requerÃan 2â4 semanas por vÃdeo y un presupuesto de producción real. Escalar a 50 SKUs en 5 idiomas quedaba fuera del alcance de la mayorÃa de equipos. 662 663## Qué cambió en 2026: el AI UGC 664 665Plataformas como HeroShots permiten a las marcas generar UGC en 60 segundos con **models reales licenciados** que reciben royalty en cada uso. Mismas señales de autenticidad, una fracción del coste, lead time casi cero. El UGC tradicional no está muerto: se reserva para momentos de alta confianza (testimonios, campañas hero), mientras el AI UGC gestiona el volumen.`,faqs:[{q:"¿El AI UGC sigue siendo UGC?",a:"SÃ, cuando se basa en creators reales licenciados como en HeroShots. Las caras puramente sintéticas son otra categorÃa y rinden peor en métricas de confianza."},{q:"¿Meta y TikTok penalizan el AI UGC?",a:"No. Exigen disclosure para contenido totalmente sintético o engañoso, pero el AI UGC con creators reales y licencia se trata como cualquier otro creative."},{q:"¿Cuánto cuesta el AI UGC vs tradicional?",a:"En HeroShots el primer batch de 4 variantes de imagen de un proyecto cuesta â¬4,90, cada batch adicional â¬1,90, y el vÃdeo arranca en â¬15 hasta 15 segundos (precios sin IVA). Una fracción de lo que cuesta un shooting UGC tradicional."},{q:"¿Puedo testear 20 creatives en un dÃa?",a:"SÃ. Generar 20 variantes lleva minutos en HeroShots; el cuello de botella pasa de la producción al aprendizaje."}]},de:{title:"Was ist UGC und warum schlägt es 2026 klassische Werbung",description:"UGC ist Content von echten Menschen, nicht von Marken. Auf Paid Social schlägt UGC Studio-Ads in der Regel â und AI UGC senkt die Produktionskosten auf einen Bruchteil eines Shoots.",body:`User-Generated Content (UGC) ist jedes Foto, Video oder Review von einer echten Person â Kunde, Creator, Fan â statt vom Inhouse-Studio der Marke. 2026 erzielt UGC in der Regel **höhere Click-Through-Rates** und **bessere Conversion** vs. Studio-Creative auf Meta und TikTok, weil das Gehirn es als Empfehlung statt als Werbung verarbeitet. 666 667## Warum UGC Studio-Creative schlägt 668 669- **Authentizitäts-Bias**: Peer-Content gilt als Social Proof. 670- **Native Fit**: sieht aus wie der Feed, nicht wie eine Unterbrechung. 671- **Diversität**: echte Körper, Wohnungen und Akzente machen das Produkt für "Leute wie mich" nutzbar. 672 673## Warum Marken bis 2025 mit UGC kämpften 674 675Creator finden, Produkte versenden, Lizenzen, Schnitt â 2â4 Wochen pro Video und ein echtes Produktionsbudget. Skalierung auf 50 SKUs in 5 Sprachen war für die meisten Teams nicht machbar. 676 677## Was sich 2026 ändert: AI UGC 678 679Plattformen wie HeroShots erlauben Marken, UGC in 60 Sekunden mit **echten lizenzierten Models** zu erzeugen, die für jede Nutzung Royalty erhalten. Gleiche Authentizität, ein Bruchteil der Kosten, nahezu null Vorlaufzeit. Klassisches UGC bleibt für vertrauenslastige Momente (Testimonials, Hero-Kampagnen); AI UGC übernimmt das Volumen.`,faqs:[{q:"Gilt AI UGC noch als UGC?",a:"Ja, wenn es auf echten lizenzierten Creators basiert wie bei HeroShots. Rein synthetische Gesichter sind eine separate Kategorie und schneiden bei Vertrauensmetriken schlechter ab."},{q:"Bestrafen Meta und TikTok AI UGC?",a:"Nein. Sie verlangen Disclosure für vollsynthetische oder irreführende Inhalte, behandeln aber lizenziertes AI UGC mit echten Creators wie jedes andere Creative."},{q:"Was kostet AI UGC vs klassisch?",a:"Auf HeroShots kostet der erste Batch mit 4 Bildvarianten pro Projekt â¬4,90, jeder weitere Batch â¬1,90, Video startet bei â¬15 für bis zu 15 Sekunden (Preise zzgl. MwSt.). Ein Bruchteil dessen, was ein klassischer UGC-Dreh kostet."},{q:"Kann ich 20 Creatives an einem Tag testen?",a:"Ja. 20 Varianten generieren dauert Minuten auf HeroShots; der Flaschenhals verschiebt sich von Produktion zu Learning."}]},fr:{title:"Qu'est-ce que l'UGC et pourquoi il bat la pub classique en 2026",description:"L'UGC, c'est du contenu cr
679éé par de vraies personnes, pas par les marques. En paid social, il surperforme généralement les ads studio â et l'AI UGC le produit pour une fraction du coût d'un tournage.",body:`Le user-generated content (UGC) désigne toute photo, vidéo ou avis créé par une vraie personne â client, créateur, fan â plutôt que par le studio interne de la marque. En 2026, l'UGC génère généralement **un meilleur click-through rate** et **une meilleure conversion** que le creative studio sur Meta et TikTok, parce que le cerveau le traite comme une recommandation, pas comme une pub. 680 681## Pourquoi l'UGC bat le creative studio 682 683- **Biais d'authenticité** : le cerveau lit le contenu pair comme preuve sociale. 684- **Fit natif** : on dirait le feed, pas une interruption. 685- **Diversité** : corps, intérieurs et accents réels rendent le produit utilisable par "des gens comme moi". 686 687## Pourquoi les marques galéraient avec l'UGC jusqu'en 2025 688 689Sourcer les créateurs, expédier les produits, licences et montage : 2â4 semaines par vidéo et un vrai budget de production. Passer à 50 SKU en 5 langues restait hors de portée pour la plupart des équipes. 690 691## Ce qui change en 2026 : l'AI UGC 692 693Des plateformes comme HeroShots permettent de générer de l'UGC en 60 secondes avec de **vrais models licenciés** qui touchent une royalty à chaque usage. Mêmes signaux d'authenticité, une fraction du coût, lead time quasi nul. L'UGC traditionnel n'est pas mort : il est réservé aux moments à forte confiance (témoignages, campagnes hero), tandis que l'AI UGC gère le volume.`,faqs:[{q:"L'AI UGC est-il toujours de l'UGC ?",a:"Oui, quand il s'appuie sur des créateurs réels licenciés comme sur HeroShots. Les visages purement synthétiques sont une catégorie à part et performent moins bien sur les métriques de confiance."},{q:"Meta et TikTok pénalisent-ils l'AI UGC ?",a:"Non. Ils exigent un disclosure pour le contenu entièrement synthétique ou trompeur, mais l'AI UGC avec créateurs réels et licence est traité comme n'importe quel creative."},{q:"Combien coûte l'AI UGC vs traditionnel ?",a:"Sur HeroShots, le premier batch de 4 variantes d'image d'un projet coûte â¬4,90, chaque batch suivant â¬1,90, et la vidéo démarre à â¬15 jusqu'à 15 secondes (prix HT). Une fraction du coût d'un tournage UGC traditionnel."},{q:"Puis-je tester 20 creatives en une journée ?",a:"Oui. Générer 20 variantes prend quelques minutes sur HeroShots ; le goulot passe de la production à l'apprentissage."}]}}},{slug:"ugc-vs-branded-content-data-costs-conversion",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["ugc","branded-content","performance"],translations:{en:{title:"UGC vs Branded Content: Costs, Conversion and How to Decide Your Mix",description:"UGC and branded studio content do different jobs. Compare what each signals, where each fits the funnel, how costs differ, and how to test your own mix.",body:`UGC-style creative and branded studio content do different jobs. UGC reads as a peer recommendation and earns attention inside a feed; branded content reads as an institution and builds recognition and trust. Their costs differ structurally, not by some fixed multiplier. So rather than trusting a published average â from anyone, vendors included â decide your mix by testing both on your own account. 694 695## What "UGC" and "branded content" actually mean in this comparison 696 697[User-generated content](/glossary/user-generated-content) is content whose apparent author is a person, not a brand: a customer filming an unboxing, a creator talking to camera, a phone photo of the product on a kitchen counter. Commissioned UGC is the paid version of the same thing â a brand hires a creator to produce content in that voice. [AI UGC](/glossary/ai-ugc) is the same style produced from a product image, a [creator avatar](/glossary/creator-avatar) or an AI avatar, and a [prompt](/glossary/prompt). 698 699Branded content is the opposite convention: authored, art-directed, openly the brand speaking. Studio product photography, campaign films, lifestyle shoots with a consistent grade, a logo lockup, a tagline. Deliberate, controlled, unmistakably paid for. 700 701These are **conventions, not quality tiers**. A UGC-style asset can be shot on a cinema camera and still read as UGC, because framing, pacing and voice carry the signal. A studio asset can be shot on a phone and still read as branded. You are cho
701osing a signal, not a budget. 702 703## What each format signals to a viewer 704 705A UGC-style asset signals *someone like me tried this*. That framing borrows the credibility of a recommendation and lowers the viewer's advertising defences, which is why it tends to survive in feeds where people are scrolling to be entertained, not sold to. It carries a limit: it says nothing about whether the company behind the product is real, durable, or safe to give a card number to. 706 707A branded asset signals *this is an established company that invested in how it presents itself* â a trust signal of a different kind. It is what a considered buyer looks for on a product page, in a category where the purchase is expensive, regulated, or embarrassing to get wrong. 708 709Most brands do not have a UGC problem or a branded content problem. They have a **coverage problem**: one signal is missing at the exact point in the journey where it does the work. 710 711## Where each format belongs in the funnel 712 713| Dimension | UGC-style creative | Branded / studio content | 714|---|---|---| 715| Core signal | Peer recommendation, relatability | Authority, permanence, craft | 716| Native home | Paid social feeds, Reels/TikTok, retargeting, reviews | Product pages, hero banners, PR, OOH, retail, decks | 717| Job to be done | Stop the scroll, earn the click, handle objections | Establish legitimacy, carry positioning, look consistent | 718| Format bias | Vertical, handheld, spoken, imperfect | Composed, lit, graded, typographically branded | 719| Variant appetite | High â many hooks per concept | Low â a few definitive assets | 720| Fatigue behaviour | Burns out faster; needs regular refresh | Ages slowly; refreshed per campaign cycle | 721| Main cost driver | Number of assets and people involved | Production complexity per asset | 722| Rights complexity | High if a real person appears | Lower, but still needs releases | 723 724The practical reading: UGC is a *volume* format and branded content is a *set-piece* format. Budgeting them the same way is where teams go wrong â they either commission a few polished assets and have nothing left to test with, or flood the feed with UGC and leave a product page that looks like nobody owns the brand. 725 726## Why you should not trust published UGC-vs-branded benchmarks 727 728Search this topic and you will find confident multipliers: UGC converts *X* times better, costs *Y* times less, lifts click-through by *Z* percent. Treat them as marketing. Here is why those averages break down. 729 730- **Survivorship bias.** Case studies get published when the new format won. Tests where UGC lost quietly never become a blog post. 731- **Category dominates.** Relatability tends to do more work in impulse categories; the balance shifts where the buyer is spending real money or buying for an employer. 732- **The offer is usually the confound.** A UGC test that also changed the hook, the landing page, or the discount is not a format test. 733- **Attribution settings are not comparable.** Different attribution windows and optimisation events can flip which format looks better on identical data. 734- **Publisher incentive.** Many published figures come from someone selling one of the two formats. 735 736A number you cannot trace back to a method you could replicate is decoration. The honest version of this article is not a multiplier â it is a test design. 737 738## How the production economics actually differ 739 740Look at what *drives* cost in each model; that structure stays stable even as rates change. 741 742**Branded studio content** front-loads cost. You pay for planning, talent, location, crew, equipment, styling, and post. The marginal cost of one *more* concept is high, because a new concept usually means a new setup or a new shoot day. Cost scales with production complexity, and the timeline is set by the calendar â you are booking people and places, so lead time is a scheduling problem before it is a budget problem. 743 744**Commissioned creator UGC** scales with the number of assets. Each asset means sourcing, briefing, shipping product, waiting, reviewing, requesting revisions, and negotiating [usage rights](/glossary/usage-rights). Cost per asset is driven by the creator's rate and the licence term rather than by a production day â but coordination overhead does not disappear with volume, because more assets means more people to brief,
744chase and clear. Our [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators) comparison walks through that workflow. 745 746**AI UGC** decouples asset count from human coordination. Setup happens once â product, avatar, prompt structure â and additional variants are a generation, not a booking. What it does *not* remove is the strategic work: hooks, scripts, and the judgement about which variants deserve spend. For the studio side of the same trade-off, see [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). 747 748## What HeroShots charges, stated as a formula 749 750We publish the formula rather than a total: a frozen total becomes wrong the day a price moves. All prices exclude VAT and are listed on the [pricing page](/pricing). 751 752- Images are billed per **batch of 4 variants** via [batch generation](/glossary/batch-generation): â¬4.90 for the first batch in a project, â¬1.90 for each further batch in that same project. A larger set therefore costs the first batch plus â¬1.90 for every additional batch. 753- Editing a chosen image is â¬0.39, or â¬0.23 on HeroShots Pro. 754- Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds; extra retries are â¬5 per 15-second block. 755- Using a real catalog model adds a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no likeness fee. A custom AI avatar is a â¬100 one-time setup; bringing your own model is â¬300 one-time. 756- HeroShots Pro is â¬99/month and removes watermarks, enables direct downloads, cuts video prices by 15%, lowers edit prices, and adds priority queue access. 757- The free plan gives 10 watermarked images per month and 1 video preview, with no credit card â enough to build the UGC arm of the test below before spending anything. 758 759Pre-paid packages bring the per-video rate down for teams generating continuously: Starter is â¬350 at â¬70 per video, Growth is â¬650 at â¬65 per video, and Scale is â¬1,500 at â¬60 per video. 760 761Two workflow details help when producing a test rather than a one-off: a project can start from an Amazon product URL, and paid plans include API access with official npm, PyPI and Packagist SDKs, so a re
761curring refresh can be scripted rather than clicked. 762 763## How to measure UGC vs branded content on your own account 764 765This is the part nobody's benchmark can do for you. 766 7671. **Pick one product and one audience.** Not a portfolio, not a broad prospecting set. Confounds multiply with scope. 7682. **Freeze everything downstream.** Same landing page, same offer, same price, same checkout. If you change the page, you are testing the page. 7693. **Write one message, then express it twice.** The same claim, once as a peer-voice UGC script and once as a branded studio treatment. Two different messages produce an uninterpretable result. 7704. **Produce several variants per format, never one.** A workable rule of thumb is three to five per side. Generate the UGC arm in batches so hooks vary while [avatar consistency](/glossary/avatar-consistency) keeps the identity stable. 7715. **Split budget evenly and let the platform learn.** Give each arm enough spend and enough days to leave the learning phase, then leave it alone. 7726. **Decide the metric before you look.** For [performance creative](/glossary/performance-creative), that usually means cost per acquisition or contribution margin per euro spent â not click-through, which rewards curiosity over intent. 7737. **Record the settings.** Attribution window, optimisation event, placements, dates. A result without its settings cannot be compared to the next one. 7748. **Read it as a cohort, not a winner.** Compare format averages across variants. The single best asset in either arm is noise. 7759. **Re-run it periodically.** Feed conventions shift, and last quarter's winner ages. 776 777### Guardrails that keep the read honest 778 779Watch fatigue: UGC-style assets tend to decay faster, so a short measurement window and a long one can disagree about the same test. Watch placement mix, because a format can win on one surface and lose on another. Check whether the losing arm is genuinely weaker or simply produced worse. And be honest about what a short test cannot see: the brand-building effect of polished content shows up in later demand, not in this week's cost per acquisition. 780 781## How to choose the mix 782 783Bias toward UGC-style volume when the purchase is low-consideration, the audience discovers you in a feed, you have many SKUs or markets to cover, and your bottleneck is iteration speed. Bias toward branded content when the purchase is high-consideration or regulated, when the buyer researches you before deciding, when the asset has to live on a product page or in retail for a long time, or when your positioning still needs to land. 784 785For most e-commerce teams the workable shape is a small, durable set of branded assets â [AI product photography](/solutions/ai-product-photography) covers a good share of those â plus a continuously refreshed UGC layer for paid social. Weighing that layer against a stock library rather than a shoot? See [AI UGC vs stock photography](/compare/ai-ugc-vs-stock-photography). 786 787## Rights, consent and disclosure apply to both formats 788 789Neither format exempts you from the paperwork. Studio shoots need model releases; commissioned UGC needs clear usage rights and a defined term; AI UGC involving a real person needs [likeness licensing](/glossary/likeness-licensing) and documented [AI likeness consent](/glossary/ai-likeness-consent). HeroShots builds consent, likeness licensing and creator royalties into the generation flow, so the rights travel with the asset instead of living in someone's inbox. 790 791Add a [brand safety](/glossary/brand-safety) review before anything ships: check that claims in a UGC script are ones you can substantiate, that the product is represented accurately, and that AI involvement is disclosed where the platform or the law requires it. A format that converts and then has to be pulled is not a cheap format. See [how the product works](/product) for how consent and licensing are recorded at generation time.`,faqs:[{q:"Does UGC really convert better than branded content?",a:"Sometimes, in some categories, on some placements â and no published average can tell you which applies to you. UGC tends to perform well in social feeds and impulse categories, while branded content tends to matter more for considered, expensive or regulated purchases. The only reliable answer comes from a controlled test on your own product, audience and landing page, with the offer held constant across both arms."},{q:"Which format should I use at each stage of the funnel?",a:"As a starting point: UGC-style creative for feed-based discovery, retargeting and objection handling, where it needs to read as a peer recommendation; branded content for product pages, hero placements, retail, PR and anywhere a buyer is checking whether your company is legitimate. Most brands need both, because the two send different trust signals and either one alone leaves a gap in the journey."},{q:"Why does UGC creative burn out faster than branded content?",a:"UGC lives in feeds where the same audience sees it repeatedly, and its effect depends on feeling fresh and unscripted. Once viewers recognise the hook, the peer-recommendation signal weakens. Branded assets usually sit in slower-moving contexts like product pages and campaigns, so they age on a campaign cycle instead. Practically, this means budgeting for continuous UGC refresh rather than a single one-
791off drop."},{q:"How do the costs of studio content, creator UGC and AI UGC differ structurally?",a:"Studio content front-loads cost into a production day, so each additional concept is expensive. Commissioned creator UGC scales with the number of assets, because every asset carries sourcing, shipping, review and licensing overhead. AI UGC decouples asset count from human coordination: setup happens once and each extra variant is a generation. That structural difference is far more durable than any cost multiplier you will read online."},{q:"What does AI UGC cost on HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in that same project. Editing a chosen image is â¬0.39, or â¬0.23 on Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. All prices exclude VAT; the pricing page carries the current list."},{q:"Do I pay extra to use a real creator instead of an AI avatar?",a:"Yes. Using a real catalog model adds a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. That fee funds the royalty attached to the creator's licensed likeness. AI avatars add no likeness fee. A custom AI avatar costs â¬100 as a one-time setup, and bringing your own model costs â¬300 one-time."},{q:"How many variants do I need for a fair UGC vs branded test?",a:"More than one per side. A workable rule of thumb is three to five per format: a single asset per side measures the luck of one execution rather than the format itself, and creative variance within a format is often larger than the gap between formats. Compare cohort averages rather than the best individual performer, and keep the message, offer and landing page identical so format is genuinely the only variable."},{q:"Which metric should decide the winner?",a:"Choose it before you look at the data, and prefer a metric close to money: cost per acquisition or contribution margin per euro spent. Click-through rate and thumb-stop rate are useful diagnostics but reward curiosity rather than intent, so a format can win them and still lose on revenue. Record your attribution window and optimisation event, because results are not comparable across different measurement settings."},{q:"Can AI UGC replace branded studio content entirely?",a:"Not usually, and it is not designed to. AI UGC is a volume format built for testing and refreshing feed creative. Branded content still carries positioning, art direction, typography and the sense that a real company stands behind the product â signals that matter most on product pages and in considered purchases. The realistic setup is a durable branded core plus a continuously refreshed AI UGC layer."},{q:"Do I need to disclose that content is AI-generated?",a:"Requirements depend on the platform and your jurisdiction, so check both before publishing. Regardless of what is mandated, treat consent and licensing as non-negotiable: any AI content featuring a real person needs documented likeness consent and a licence covering the intended use. HeroShots records consent, likeness licensing and creator royalties at generation time, and the free plan applies a watermark that Pro removes."}],metaTitle:"UGC vs Branded Content: How to Decide"},it:{title:"UGC vs branded content: costi e conversione a confronto",description:"Sul paid social l'UGC batte in genere il branded studio su click-through e conversione, con un costo per asset molto più basso. Ecco il confronto lungo tutto il funnel.",body:`Sul paid social, l'**UGC supera in genere il branded studio lungo tutto il funnel**: click-through rate più alto, conversion rate migliore e un costo per asset molto inferiore a quello di uno shooting. Ecco il dettaglio. 792 793## CTR e thumb-stop rate 794 795L'UGC ottiene tipicamente un **CTR più alto** su Meta Advantage+ rispetto al creative da studio, e un thumb-stop rate (visualizzazioni 3s %) migliore. Il motivo è il framing feed-native: 9:16 verticale, energia "fatto a mano", nessun logo lockup nel primo frame. 796 797## Conversion e CPA 798 799Sulle stesse audience e landing, l'UGC tende a produrre una **conversion più alta** e un **CPA più basso** rispetto allo studio. Il gap si allarga nelle categorie a bassa considerazione (DTC apparel, beauty, integratori) e si restringe in B2B e finance, dove i segnali di fiducia degli asset brand contano ancora. 800 801## Costo per asset 802 803- Shooting studio: un budget di produzione pieno per asset finito (model, location, crew, montaggio). 804- UGC tradizionale: una fee per asset più prodotto, spedizione e licenza. 805- AI UGC su HeroShots: â¬4,90 il primo batch di 4 varianti immagine in un progetto, â¬1,90 ogni batch successivo, â¬15 per un video fino a 15 secondi (IVA esclusa). 806 807Con questi prezzi, un A/B test di 20 creative smette di essere una decisione di budget. Il collo di bottiglia diventa l'apprendimento, non il budget. 808 809## Quando il branded vince ancora 810 811Campagne hero, OOH, brand film, lanci che definiscono categoria. Il branded studio è ancora lo strumento giusto quando l'obiettivo è la **brand equity**, non il click. Lo stack 2026 usa studio per l'hero, UGC tradizionale per i testimonial e AI UGC per il volume.`,faqs:[{q:"Il vantaggio di CTR è costante tra categorie?",a:"Più forte in DTC, beauty, fashion. Più contenuto in B2B e finance. Segue l'asse fiducia vs relatability."},{q:"L'UGC si stanca più in fretta del branded?",a:"Sì â un creative UGC su Meta si brucia più in fretta del branded. Per questo servono volume e AI UGC: ti servono molte più varianti in rotazione."},{q:"L'AI UGC può raggiungere la conversion dell'UGC tradizionale?",a:"Se costruito su creator reali licenziati, l'AI UGC ci va vicino. I volti puramente sintetici performano nettamente peggio, perché il segnale di fiducia è il creator reale."},{q:"Qual è il mix giusto per un brand DTC?",a:"Circa 70% AI UGC, 20% UGC tradizionale, 10% studio. Da regolare in base alla fiducia richiesta dalla categoria."}]},es:{title:"UGC vs contenido de marca: costes y conversión comparados",description:"En paid social el UGC suele superar al contenido de marca en click-through y conversión, con un coste por asset muy inferior. Asà se comparan a lo largo del funnel.",body:`En paid social, el **UGC suele superar al contenido de marca en todo el funnel**: mayor click-through rate, mejor conversión y un coste por asset muy por debajo de un shooting. Aquà el desglose. 812 813## CTR y thumb-stop rate 814 815El UGC logra normalmente un **CTR más alto** en Meta Advantage+ que el creative de estudio, y un mejor thumb-stop rate (visualizaciones 3s %). La razón es el framing feed-native: 9:16 vertical, energÃa hecha a mano, sin lockup de logo en el primer frame. 816 817## Conversión y CPA 818
819Sobre las mismas audiencias y landings, el UGC tiende a generar **más conversión** y un **CPA más bajo** frente al estudio. La brecha se amplÃa en categorÃas de baja consideración (DTC apparel, beauty, suplementos) y se reduce en B2B y finance, donde las señales de confianza de los assets de marca aún cuentan. 820 821## Coste por asset 822 823- Shooting de estudio: un presupuesto de producción completo por asset terminado (model, location, crew, edición). 824- UGC tradicional: una fee por asset más producto, envÃo y licencia. 825- AI UGC en HeroShots: â¬4,90 el primer batch de 4 variantes de imagen de un proyecto, â¬1,90 cada batch adicional, â¬15 por un vÃdeo de hasta 15 segundos (sin IVA). 826 827Con estos precios, un A/B test de 20 creatives deja de ser una decisión de presupuesto. El cuello de botella se traslada del presupuesto a la velocidad de aprendizaje. 828 829## Cuándo gana el branded 830 831Campañas hero, OOH, brand films, lanzamientos que definen categorÃa. El branded studio sigue siendo la herramienta correcta cuando el objetivo es la **brand equity**, no el click. El stack 2026 usa estudio para hero, UGC tradicional para testimonios y AI UGC para el volumen.`,faqs:[{q:"¿La ventaja de CTR es consistente entre categorÃas?",a:"Más fuerte en DTC, beauty, fashion. Más moderada en B2B y finance. Sigue el eje confianza vs relatabilidad."},{q:"¿El UGC se quema más rápido que el branded?",a:"Sà â un creative UGC en Meta se agota antes que el branded. Por eso importan el volumen y el AI UGC: necesitas muchas más variantes en rotación."},{q:"¿El AI UGC puede igualar la conversión del UGC tradicional?",a:"Si se basa en creators reales licenciados, el AI UGC se acerca mucho. Las caras puramente sintéticas rinden claramente peor, porque la señal de confianza es el creator real."},{q:"¿Cuál es el mix correcto para una marca DTC?",a:"Aproximadamente 70% AI UGC, 20% UGC tradicional, 10% estudio. Ajustar según la confianza requerida por la categorÃa."}]},de:{title:"UGC vs. Branded Content: Kosten und Conversion im Vergleich",description:"Auf Paid Social schlägt UGC Branded Studio in der Regel bei Click-Through und Conversion â bei deutlich niedrigeren Kosten pro Asset. So vergleichen sich beide über den Funnel.",body:`Auf Paid Social **schlägt UGC Branded Studio in der Regel über den gesamten Funnel**: höhere Click-Through-Rate, bessere Conversion und Kosten pro Asset weit unter einem Studio-Shoot. Hier die Aufschlüsselung. 832 833## CTR und Thumb-Stop-Rate 834 835UGC erzielt auf Meta Advantage+ typischerweise eine **höhere CTR** als Studio-Creative und eine bessere Thumb-Stop-Rate (3-Sekunden-Views %). Grund: feed-natives Framing â 9:16 vertikal, Handheld-Energie, kein Logo-Lockup im ersten Frame. 836 837## Conversion und CPA 838 839Bei gleichen Zielgruppen und Landingpages erreicht UGC tendenziell eine **höhere Conversion** und einen **niedrigeren CPA** als Studio. Der Abstand vergröÃert sich in Low-Consideration-Kategorien (DTC Apparel, Beauty, Supplements) und verringert sich in B2B und Finance, wo Trust-Signale polierter Markenassets weiterhin zählen. 840 841## Kosten pro Asset 842 843- Studio-Shoot: ein volles Produktionsbudget pro fertigem Asset (Model, Location, Crew, Schnitt). 844- Klassisches UGC: eine Fee pro Asset plus Produkt, Versand und Lizenz. 845- AI UGC auf HeroShots: â¬4,90 für den ersten Batch mit 4 Bildvarianten pro Projekt, â¬1,90 pro weiterem Batch, â¬15 für ein Video bis 15 Sekunden (zzgl. MwSt.). 846 847Zu diesen Preisen ist ein A/B-Test von 20 Creatives keine Budgetfrage mehr. Der Flaschenhals wandert von Budget zu Lern-Geschwindigkeit. 848 849## Wann Branded weiterhin gewinnt 850 851Hero-Kampagnen, OOH, Brand Films, kategoriedefinierende Launches. Branded Studio ist weiterhin das richtige Werkzeug, wenn es um **Brand Equity** geht, nicht um den Click. Der 2026-Stack nutzt Studio für Hero, klassisches UGC für Testimonials und AI UGC für das Volumen.`,faqs:[{q:"Ist der CTR-Vorteil über Kategorien konsistent?",a:"Am stärksten in DTC, Beauty, Fashion. Moderater in B2B und Finance. Folgt der Achse Vertrauen vs Relatability."},{q:"Verbraucht sich UGC schneller als Branded?",a:"Ja â ein UGC-Creative nutzt sich auf Meta schneller ab als ein Branded-Creative. Deshalb sind Volumen und AI UGC entscheidend: man braucht deutlich mehr Varianten in Rotation."},{q:"Kann AI UGC die Conversion von klassischem UGC erreichen?",a:"Auf Basis echter lizenzierter Creators kommt AI UGC nah heran. Rein synthetische Gesichter schneiden merklich schlechter ab, weil das Trust-Signal der echte Creator ist."},{q:"Was ist der richtige Mix für eine DTC-Marke?",a:"Etwa 70% AI UGC, 20% klassisches UGC, 10% Studio. Je nach Vertrauensbedarf der Kategorie anpassen."}]},fr:{title:"UGC vs branded content : coûts et conversion comparés",description:"En paid social, l'UGC bat généralement le branded studio sur le click-through et la conversion, pour un coût par asset bien plus bas. Voici la comparaison sur tout le funnel.",body:`En paid social, l'**UGC bat généralement le branded studio sur tout le funnel** : meilleur click-through rate, meilleure conversion et un coût par asset très inférieur à celui d'un shooting. Voici le détail. 852 853## CTR et thumb-stop rate 854 855L'UGC obtient typiquement un **meilleur CTR** sur Meta Advantage+ que le creative studio, ainsi qu'un meilleur thumb-stop rate (vues 3s %). Raison : framing feed-native â 9:16 vertical, énergie handheld, pas de lockup logo dans le premier frame. 856 857## Conversion et CPA 858 859Sur les mêmes audiences et landings, l'UGC tend à produire une **meilleure conversion** et un **CPA plus bas** que le studio. L'écart se creuse sur les catégories à faible considération (DTC apparel, beauty, suppléments) et se réduit en B2B et finance, où les signaux de confiance des assets de marque comptent encore. 860 861## Coût par asset 862 863- Shooting studio : un budget de production complet par asset fini (model, location, crew, montage). 864- UGC traditionnel : une fee par asset, plus produit, envoi et licence. 865- AI UGC sur HeroShots : â¬4,90 le premier batch de 4 variantes d'image d'un projet, â¬1,90 chaque batch suivant, â¬
86515 pour une vidéo jusqu'à 15 secondes (HT). 866 867à ces tarifs, un A/B test de 20 creatives cesse d'être une décision de budget. Le goulot passe du budget à la vitesse d'apprentissage. 868 869## Quand le branded gagne encore 870 871Campagnes hero, OOH, brand films, lancements qui définissent une catégorie. Le branded studio reste le bon outil quand l'objectif est la **brand equity**, pas le click. Le stack 2026 utilise studio pour l'hero, UGC traditionnel pour les témoignages et AI UGC pour le volume.`,faqs:[{q:"L'avantage de CTR est-il constant entre catégories ?",a:"Plus fort en DTC, beauty, fashion. Plus modéré en B2B et finance. Suit l'axe confiance vs relatabilité."},{q:"L'UGC s'use-t-il plus vite que le branded ?",a:"Oui â un creative UGC s'épuise plus vite sur Meta qu'un creative branded. D'où l'importance du volume et de l'AI UGC : il faut beaucoup plus de variantes en rotation."},{q:"L'AI UGC peut-il égaler la conversion de l'UGC traditionnel ?",a:"S'il est basé sur des créateurs réels licenciés, l'AI UGC s'en approche de près. Les visages purement synthétiques performent nettement moins bien, car le signal de confiance, c'est le créateur réel."},{q:"Quel est le bon mix pour une marque DTC ?",a:"Environ 70% AI UGC, 20% UGC traditionnel, 10% studio. à ajuster selon la confiance requise par la catégorie."}]}}},{slug:"how-ai-is-changing-ugc-production",date:"2026-06-03",author:"HeroShots",tags:["ai-ugc","production","workflow"],translations:{en:{title:"How AI Is Changing UGC Production in 2026",description:"AI compresses UGC production from weeks to minutes and cuts cost per asset, while licensed-creator platforms keep authenticity and royalties intact.",body:`AI is collapsing UGC production timelines from **weeks to minutes** and cutting the unit cost per finished asset **dramatically**. The shift is not "AI replaces creators" â it is "AI multiplies licensed creators". Here is what changed in the workflow. 872 873## The old workflow (2022â2024) 874 875Brief â casting â shipping â shoot â editing â licensing â delivery. Six steps, three weeks, four to six people in the loop. Every variant required a new shoot or a re-edit. 876 877## The 2026 workflow 878 879Upload product â pick a licensed Real Model â write a prompt â generate. One person, one minute, infinite variants. The creator gets a royalty on every output through Tik Joy; the brand gets a clean license and an audit trail. 880 881## What AI is actually good at now 882 883- **Photorealistic product-on-model imagery** with correct lighting and shadow. 884- **Short-form vertical video** (3â15 s) with believable motion. 885- **Localization**: same scene, 5 languages, different model selections. 886- **Background and outfit swaps** without re-shooting. 887 888## What AI is still bad at 889 890- Long-form spoken testimonials with natural voice and gesture. 891- Complex multi-product interactions (hands manipulating 3+ objects). 892- Brand-defining hero campaigns where every pixel matters. 893 894## The new bottleneck 895 896It used to be production. Now it is **learning velocity**: which creative wins, why, and how fast you can iterate. Brands that win in 2026 ship 50â200 variants a month and let the algorithm sort it out.`,faqs:[{q:"Does AI UGC require disclosure on Meta or TikTok?",a:"Only for fully synthetic or misleading content. Licensed-creator AI UGC with real likeness rights is treated like any other creative."},{q:"How long does a single generation take on HeroShots?",a:"Photos: 20â40 seconds. Short-form video: 60â120 seconds. Batch jobs (50+ variants) run in parallel and finish in 5â10 minutes."},{q:"Can I use my own model?",a:"Yes. You can upload your own creator (with their signed consent) as a Private Model. They earn royalties exactly like catalog creators."},{q:"Does it work for video?",a:"Yes â short-form 9:16 vertical video up to 15 seconds is production-ready in 2026. Longer formats are still hit-or-miss."}]},it:{title:"Come l'AI sta cambiando la produzione di UGC nel 2026",description:"L'AI comprime la produzione UGC da settimane a minuti e abbatte drasticamente il costo per asset, mentre le piattaforme con creator licenziati mantengono autenticità e royalty.",body:`L'AI sta comprimendo i tempi di produzione UGC da **settimane a minuti** e abbattendo **drasticamente** il costo unitario per asset finito. Il salto non è "l'AI sostituisce i creator" â è "l'AI moltiplica i creator licenziati". Ecco cosa è cambiato nel workflow. 897 898## Il vecchio workflow (2022â2024) 899 900Brief â casting â spedizione â shoot â montaggio â licenza â consegna. Sei step, tre settimane, quattro-sei persone nel loop. Ogni variante richiedeva un nuovo shoot o un re-edit. 901 902## Il workflow 2026 903 904Carica prodotto â scegli un Real Model licenziato â scrivi prompt â genera. Una persona, un minuto, varianti infinite. Il creator riceve una royalty su ogni output via Tik Joy; il brand ottiene una licenza pulita e un audit trail. 905 906## In cosa l'AI è davvero brava ora 907 908- **Immagini fotorealistiche prodotto-su-modello** con luci e ombre corrette. 909- **Video verticali short-form** (3â15 s) con movimento credibile. 910- **Localizzazione**: stessa scena, 5 lingue, selezione di model diversa. 911- **Cambio sfondo e outfit** senza rifare lo shoot. 912 913## In cosa l'AI è ancora debole 914
915- Testimonial parlati lunghi con voce e gestualità naturali. 916- Interazioni multi-prodotto complesse (mani che maneggiano 3+ oggetti). 917- Campagne hero che definiscono il brand, dove ogni pixel conta. 918 919## Il nuovo collo di bottiglia 920 921Prima era la produzione. Ora è la **velocità di apprendimento**: quale creative vince, perché, quanto in fretta puoi iterare. I brand che vincono nel 2026 pubblicano 50â200 varianti al mese e lasciano decidere l'algoritmo.`,faqs:[{q:"L'AI UGC richiede disclosure su Meta o TikTok?",a:"Solo per contenuti completamente sintetici o ingannevoli. L'AI UGC con creator licenziati e diritti d'immagine reali è trattato come qualsiasi altro creative."},{q:"Quanto dura una singola generazione su HeroShots?",a:"Foto: 20â40 secondi. Video short-form: 60â120 secondi. I batch (50+ varianti) vanno in parallelo e finiscono in 5â10 minuti."},{q:"Posso usare il mio model?",a:"Sì. Puoi caricare il tuo creator (con consenso firmato) come Private Model. Riceve royalty esattamente come i creator del catalogo."},{q:"Funziona per il video?",a:"Sì â video verticali 9:16 fino a 15 secondi sono production-ready nel 2026. Formati più lunghi sono ancora altalenanti."}]},es:{title:"Cómo la AI está cambiando la producción de UGC en 2026",description:"La AI comprime la producción de UGC de semanas a minutos y reduce drásticamente el coste por asset, mientras las plataformas con creators licenciados mantienen autenticidad y royalties.",body:`La AI está comprimiendo los tiempos de producción UGC de **semanas a minutos** y reduciendo **drásticamente** el coste unitario por asset terminado. El cambio no es "la AI sustituye a los creators" â es "la AI multiplica a los creators licenciados". Esto es lo que cambió en el workflow. 922 923## El workflow antiguo (2022â2024) 924 925Brief â casting â envÃo â shoot â edición â licencia â entrega. Seis pasos, tres semanas, cuatro a seis personas en el loop. Cada variante requerÃa un nuevo shoot o re-edit. 926 927## El workflow 2026 928 929Sube producto â elige un Real Model licenciado â escribe prompt â genera. Una persona, un minuto, variantes infinitas. El creator recibe royalty en cada output vÃa Tik Joy; la marca obtiene una licencia limpia y un audit trail. 930 931## En qué la AI es realmente buena ahora 932 933- **Imágenes fotorrealistas producto-sobre-modelo** con luces y sombras correctas. 934- **VÃdeo vertical short-form** (3â15 s) con movimiento creÃble. 935- **Localización**: misma escena, 5 idiomas, selección de model distinta. 936- **Cambio de fondo y outfit** sin volver a grabar. 937 938## En qué la AI sigue floja 939 940- Testimonios hablados largos con voz y gestualidad naturales. 941- Interacciones multi-producto complejas (manos manipulando 3+ objetos). 942- Campañas hero que definen marca, donde cada pÃxel cuenta. 943 944## El nuevo cuello de botella 945 946Antes era la producción. Ahora es la **velocidad de aprendizaje**: qué creative gana, por qué, qué tan rápido puedes iterar. Las marcas que ganan en 2026 publican 50â200 variantes al mes y dejan que el algoritmo decida.`,faqs:[{q:"¿El AI UGC requiere disclosure en Meta o TikTok?",a:"Solo para contenido totalmente sintético o engañoso. El AI UGC con creators licenciados y derechos de imagen reales se trata como cualquier otro creative."},{q:"¿Cuánto dura una generación en HeroShots?",a:"Fotos: 20â40 segundos. VÃdeo short-form: 60â120 segundos. Los batch (50+ variantes) van en paralelo y terminan en 5â10 minutos."},{q:"¿Puedo usar mi propio model?",a:"SÃ. Puedes subir tu creator (con consentimiento firmado) como Private Model. Cobra royalties exactamente igual que los creators del catálogo."},{q:"¿Funciona para vÃdeo?",a:"Sà â vÃdeo vertical 9:16 hasta 15 segundos está production-ready en 2026. Formatos más largos siguen siendo irregulares."}]},de:{title:"Wie AI die UGC-Produktion 2026 verändert",description:"AI verkürzt die UGC-Produktion von Wochen auf Minuten und senkt die Kosten pro Asset drastisch, während Plattformen mit lizenzierten Creators Authentizität und Royalties bewahren.",body:`AI komprimiert die UGC-Produktionszeiten von **Wochen auf Minuten** und senkt die Stückkosten pro fertigem Asset **drastisch**. Der Wandel ist nicht "AI ersetzt Creators", sondern "AI multipliziert lizenzierte Creators". Was sich im Workflow geändert hat. 947 948## Der alte Workflow (2022â2024) 949 950Briefing â Casting â Versand â Shoot â Schnitt â Lizenzierung â Lieferung. Sechs Schritte, drei Wochen, vier bis sechs Personen im Loop. Jede Variante erforderte einen neuen Shoot oder Re-Edit. 951 952## Der 2026-Workflow 953 954Produkt hochladen â lizenziertes Real Model wählen â Prompt schreiben â generieren. Eine Person, eine Minute, unendliche Varianten. Der Creator erhält bei jedem Output über Tik Joy eine Royalty; die Marke bekommt eine saubere Lizenz und einen Audit-Trail. 955 956## Worin AI jetzt wirklich gut ist 957 958- **Fotorealistische Produkt-am-Model-Bilder** mit korrektem Licht und Schatten.
959- **Short-Form Vertikalvideo** (3â15 s) mit glaubhafter Bewegung. 960- **Lokalisierung**: gleiche Szene, 5 Sprachen, andere Model-Auswahl. 961- **Hintergrund- und Outfit-Tausch** ohne erneuten Shoot. 962 963## Worin AI noch schwach ist 964 965- Lange gesprochene Testimonials mit natürlicher Stimme und Gestik. 966- Komplexe Multi-Produkt-Interaktionen (Hände mit 3+ Objekten). 967- Markenprägende Hero-Kampagnen, bei denen jedes Pixel zählt. 968 969## Der neue Flaschenhals 970 971Früher war es die Produktion. Jetzt ist es die **Lern-Geschwindigkeit**: welches Creative gewinnt, warum, wie schnell kannst du iterieren. Marken, die 2026 gewinnen, liefern 50â200 Varianten pro Monat aus und lassen den Algorithmus entscheiden.`,faqs:[{q:"Erfordert AI UGC einen Disclosure auf Meta oder TikTok?",a:"Nur für vollsynthetische oder irreführende Inhalte. AI UGC mit lizenzierten Creators und echten Bildrechten wird wie jedes andere Creative behandelt."},{q:"Wie lange dauert eine Generierung auf HeroShots?",a:"Fotos: 20â40 Sekunden. Short-Form-Video: 60â120 Sekunden. Batch-Jobs (50+ Varianten) laufen parallel und sind in 5â10 Minuten fertig."},{q:"Kann ich mein eigenes Model nutzen?",a:"Ja. Du kannst deinen Creator (mit unterschriebener Einwilligung) als Private Model hochladen. Er erhält Royalties genau wie Katalog-Creators."},{q:"Funktioniert es für Video?",a:"Ja â 9:16 Vertikalvideos bis 15 Sekunden sind 2026 produktionsreif. Längere Formate sind noch unbeständig."}]},fr:{title:"Comment l'AI change la production d'UGC en 2026",description:"L'AI comprime la production d'UGC de semaines à minutes et réduit drastiquement le coût par asset, tandis que les plateformes à créateurs licenciés préservent authenticité et royalties.",body:`L'AI comprime les délais de production UGC de **semaines à minutes** et réduit **drastiquement** le coût unitaire par asset fini. Le shift n'est pas "l'AI remplace les créateurs", c'est "l'AI multiplie les créateurs licenciés". Voici ce qui a changé dans le workflow. 972 973## L'ancien workflow (2022â2024) 974 975Brief â casting â envoi â shoot â montage â licence â livraison. Six étapes, trois semaines, quatre à six personnes dans la boucle. Chaque variante nécessitait un nouveau shoot ou un re-edit. 976 977## Le workflow 2026 978 979Upload produit â choisir un Real Model licencié â écrire un prompt â générer. Une personne, une minute, variantes infinies. Le créateur reçoit une royalty sur chaque output via Tik Joy ; la marque obtient une licence propre et un audit trail. 980 981## Ce que l'AI fait vraiment bien aujourd'hui 982 983- **Images photoréalistes produit-sur-model** avec lumière et ombres correctes. 984- **Vidéo verticale short-form** (3â15 s) avec mouvement crédible. 985- **Localisation** : même scène, 5 langues, sélection de model différente. 986- **Changement de fond et de tenue** sans re-tourner. 987 988## Ce que l'AI fait encore mal 989 990- Témoignages parlés longs avec voix et gestes naturels. 991- Interactions multi-produits complexes (mains manipulant 3+ objets). 992- Campagnes hero qui définissent la marque, où chaque pixel compte. 993 994## Le nouveau goulot 995 996Avant, c'était la production. Maintenant, c'est la **vitesse d'apprentissage** : quel creative gagne, pourquoi, à quelle vitesse tu peux itérer. Les marques qui gagnent en 2026 livrent 50â200 variantes par mois et laissent l'algorithme décider.`,faqs:[{q:"L'AI UGC nécessite-t-il un disclosure sur Meta ou TikTok ?",a:"Uniquement pour le contenu entièrement synthétique ou trompeur. L'AI UGC avec créateurs licenciés et vrais droits à l'image est traité comme tout autre creative."},{q:"Combien de temps prend une génération sur HeroShots ?",a:"Photos : 20â40 secondes. Vidéo short-form : 60â120 secondes. Les batchs (50+ variantes) tournent en parallèle et finissent en 5â10 minutes."},{q:"Puis-je utiliser mon propre model ?",a:"Oui. Tu peux uploader ton créateur (avec consentement signé) comme Private Model. Il touche des royalties exactement comme les créateurs du catalogue."},{q:"Ãa marche pour la vidéo ?",a:"Oui â la vidéo verticale 9:16 jusqu'à 15 secondes est production-ready en 2026. Les formats plus longs restent inégaux."}]}}},{slug:"ai-ugc-authenticity-trust-2026",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["authenticity","trust","ai-ugc"],translations:{en:{title:"Is AI UGC Still Authentic? What Actually Drives Trust, Disclosure and Consent in 2026",description:"AI UGC keeps its trust signal when a real, consenting creator stands behind it. Disclosure norms, EU AI Act transparency and practical honesty rules.",body:`Vie
996wers rarely trust or reject AI UGC because it is AI. They react to whether it feels honest: a real person who agreed to be there, a claim the product can actually keep, and a label that matches reality. Trust in AI-generated content comes from consent, disclosure and accuracy â not from hiding which tools you used. 997 998## What actually makes a viewer trust or reject AI content 999 1000Nobody scrolling a feed runs a forensic check. Trust is settled on impression rather than evidence, then revised later if something turns out to have been concealed. 1001 1002So there are two trust events, governed by different things. The first is **perceptual**: does this look and sound like a person in a real place? The second is **reputational**: when the audience finds out how this was made, does the brand look consistent or does it look caught? 1003 1004Most teams optimise the first and ignore the second. The second produces the screenshots. 1005 1006### The signals that build trust 1007 1008- **Specific, unglamorous environment.** A kitchen with a cluttered counter reads more real than a seamless studio void. 1009- **Ordinary imperfection.** Uneven light, a slightly off frame, texture in the skin rather than a rendered plastic surface. 1010- **Physical plausibility with the product.** Weight, grip, how the packaging bends, how liquid pours. 1011- **A claim the product can deliver.** Overreaching copy breaks trust faster than any visual artefact. 1012- **Consistency across the campaign.** A face that stays the same person from asset to asset. That is what [avatar consistency](/glossary/avatar-consistency) means in practice, and its absence is uncanny even when each frame looks fine alone. 1013 1014### The signals that break it 1015 1016- Eyes and mouth that don't quite belong to the same performance â a familiar tell in video. 1017- Warped fingers, melting jewellery, text on packaging that dissolves under a close-up. 1018- A "nowhere" room: no dust, no directional shadows, no evidence anyone lives there. 1019- The same face endorsing two competing brands in the same week. 1020- A brand that publicly promised "no AI" and was later shown to have used it. 1021 1022**The hardest trust breaker to recover from is not the pixels. It is the gap between what a brand said and what it did.** Artefacts get fixed with a better generation. A credibility gap does not. 1023 1024## Real licensed creator or fully synthetic face: why the distinction matters 1025 1026There is a meaningful difference between generating content from a real, consenting person's licensed likeness and inventing a face that belongs to nobody. Both are [synthetic media](/glossary/synthetic-media), but they carry different obligations and different risks. 1027 1028A [creator avatar](/glossary/creator-avatar) is anchored to an identifiable human being who agreed, in writing, to have their likeness used in defined ways. There is someone whose rights were cleared and who is compensated. 1029 1030A [virtual influencer](/glossary/virtual-influencer) is a fictional persona. That is not dishonest by default; audiences have accepted fictional brand characters for years. It becomes dishonest when the persona is presented as a real customer giving a genuine opinion. 1031 1032The failure mode most people fear â someone's face used in an ad they never agreed to â is a consent failure, not an AI failure. It sits under [right of publicity](/glossary/right-of-publicity) and would be a problem with a camera too. 1033 1034## Trust profile by content type 1035 1036| Content type | Who is depicted | Main trust risk to manage | What keeps it honest | 1037|---|---|---|---| 1038| Filmed creator UGC | A real, present person | Undisclosed paid relationship | Ad disclosure, clear [usage rights](/glossary/usage-rights) | 1039| AI UGC from a licensed creator avatar | A real, consenting person | Audience assumes it was filmed live | Documented consent, AI labelling where the content is realistic | 1040| Fully synthetic avatar or virtual influencer | Nobody real | Persona read as a genuine customer | Never framed as a real testimonial; visible AI framing | 1041| AI product photography with no person | No person | Product shown better than it is | Depiction matches the shipped product | 1042| Any likeness used without permission | A real, non-consenting person | Legal and reputational exposure | Don't. There is no compliant version of this | 1043 1044The pattern in that table is the argument of this article: risk does not track "AI or not AI". It tracks consent, and whether the audience is being led to believe something untrue. 1045
1046## Do you have to disclose that content is AI-generated? 1047 1048Assume yes for realistic content depicting people, and treat the exact mechanics as a pre-publish check rather than settled knowledge. 1049 1050### Platform expectations move â verify before each launch 1051 1052Major social and ad platforms have converged on a broad direction: creators and advertisers are asked to label realistic AI-generated or AI-modified content depicting real-seeming people, places or events, and platforms increasingly apply their own labels when they detect provenance signals. The details â formats, toggles, enforcement â change often and differ by platform and market. 1053 1054Treat platform policy as a checklist item you re-read at the start of each campaign, not a fact you memorised last year. The rule of thumb: **if a reasonable viewer could mistake the content for an unaltered recording of real events, label it.** 1055 1056### Where disclosure actually breaks down 1057 1058Few teams decide not to disclose. They lose the disclosure in the handoff: 1059 1060- **The export step.** A render or re-encode drops the provenance metadata attached at generation. 1061- **The ad account.** The organic post carries a label; the same file re-uploaded into an ads manager does not. 1062- **The repurpose.** A compliant launch asset gets cut down months later by someone who was never in the original conversation. 1063 1064### Advertising law has no AI exception 1065 1066Everything already true about advertising remains true. Testimonials must reflect genuine experience. Demonstrations must not misrepresent performance. Before-and-after imagery must be achievable. Paid relationships must be disclosed. 1067 1068Generating the asset loosens none of that. If anything it tightens the operational burden, because you can now produce variant after variant of a claim you never validated. That is where [brand safety](/glossary/brand-safety) work belongs: at the claim layer, before generation, not in a review of finished files. 1069 1070## What the EU AI Act signals about synthetic media 1071 1072The EU's AI regulation â [Regulation (EU) 2024/1689, 2024](https://eur-lex.europa.eu/eli/reg/2024/1689/oj) â sets out transparency obligations for AI-generated content: broadly, providers of generative systems should mark synthetic outputs in a machine-readable way, and deployers publishing realistic synthetic depictions of people, places or events should disclose that the content is artificially generated or manipulated. Obligations phase in on a staged timetable, and guidance is still developing. 1073 1074Read it as a direction of travel rather than a checklist. Two practical consequences hold regardless of how the fine print lands: 1075 1076**Provenance metadata is becoming infrastructure.** Content credentials â signed metadata describing how an asset was produced, of the kind standardised by [C2PA](https://c2pa.org) â plus visible or embedded [watermark](/glossary/watermark) signals are how marking gets implemented at scale. 1077 1078**Disclosure is cheaper than defence.** Teams that already label are not exposed by a policy change. Teams whose model depends on the audience not finding out are one enforcement update away from a rewrite. 1079 1080If you operate in the EU, get a lawyer to map your obligations. Nothing here is legal advice. 1081 1082## Consent, licensing and royalties: the paperwork behind honest AI UGC 1083 1084The ethical core is unglamorous and entirely documentary. [AI likeness consent](/glossary/ai-likeness-consent) has to be specific enough that the person understood they were agreeing to content they would never personally perform. Good consent records, at minimum: 1085 1086- **Scope**: which content types, which product categories, which channels. 1087- **Exclusions**: contexts the person refuses â political, adult, gambling, health claims, whatever they name. 1088- **Duration and territory**: when the permission ends and where it applies. 1089- **Derivative coverage**: explicitly that AI-generated outputs are included, not only captured footage. A standard [model release](/glossary/model-release) written for a photoshoot often does not cover this. 1090- **Compensation**: how [creator royalties](/glossary/creator-royalties) are calculated and paid when the likeness generates value. 1091- **Revocability**: what happens to live assets when someone withdraws. 1092 1093A [likeness licence](/glossary/likeness-licensing) turns that consent into enforceable terms. Treat it as an operational record, not a signature you file once: it should be retrievable per asset, so a question about one specific video has an answer. The trade-offs against booking people directly are laid out in [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators). 1094 1095## Eight rules for keeping AI UGC honest 1096 10971. **Never generate a real person's likeness without documented, specific consent.** No exceptions, no "it's just a test". 10982. **Label realistic synthetic content depicting people.** Default to disclosure; reserve the judgement call for cases where nothing is depicted as real. 10993. **Never stage a testimonial with someone who did not say it.** An avatar reading a scripted opinion is an advertisement, not a customer review. 11004. **Keep the product depiction truthful.** Colour, size, texture and behaviour must match what ships â this is where [AI product photography](/glossary/ai-product-photography) drifts. 11015. **Validate the claim before you scale the creative.** [Batch generation](/glossary/batch-generation) multiplies whatever you put in, including a claim you cannot substantiate. 11026. **Preserve provenance metadata end to end.** Do not let an export step strip content credentials. 11037. **Keep a human review gate on anything featuring a face.** Volume is not a reason to skip it; it is the reason you need it. 11048. **Say the same thing publicly and internally.** If your brand narrative is "all human", make it true or change it first. 1105 1106## How HeroShots is set up for this 1107 1108HeroShots pairs a product, a creator or AI avatar and a prompt to produce photo and video [AI UGC](/glossary/ai-ugc), with consent, likeness licensing and creator royalties built into the workflow rather than bolted on. 1109 1110Using a real catalog model applies a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos â the visible line item for a real person's face being involved. AI avatars carry no likeness fee, because no real person's rights are engaged. A custom AI avatar is a â¬100 one-time setup; bringing your own model is a â¬300 one-time setup, and that is the route where your own consent paperwork has to be watertight. 1111 1112Images are billed per batch of four variants: â¬4.90 for a project's first batch and â¬1.90 for each further batch in the same project, with edits on a chosen image at â¬0.39, or â¬0.23 on HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Prices exclude VAT; the full breakdown lives on [pricing](/pricing). 1113 1114Disclosure mechanics sit in the plan structure. The free plan produces watermarked images â 10 per month, plus one video preview, no credit card â so nothing leaves unmarked by accident. HeroShots Pro at â¬99/month removes watermarks and gives direct downloads, along with cheaper edits, a 15% discount on videos and a priority queue. Once the watermark comes off, labelling your published output is a decision you own. See [product](/product) for how the pipeline fits together. 1115 1116## A better question than "is it authentic?" 1117 1118"Is AI UGC authentic" is unanswerable because authenticity was never a property of the capture method. A filmed testimonial from someone paid to read a script is less authentic than a generated one from a creator who uses the product and licensed their likeness knowingly. 1119 1120Ask these instead. Is the person real and did they consent, in writing, to this use? Are they being paid? Is the claim true? Would the audience feel deceived if they learned exactly how this was made? 1121 1122Four yeses and the trust holds. One no and you are not managing an AI problem â you are managing an honesty problem, and no model upgrade fixes that one.`,faqs:[{q:"Do consumers actually care whether a creative was AI-generated?",a:"The reliable driver is not the technology but whether anything was concealed. AI UGC that comes from a real, consenting creator and makes claims the product can keep tends to be judged on those merits. What damages trust is a brand that positioned itself as entirely human-made and was later shown to have used AI. The objection is to being misled, not to the tools."},{q:"Do I have to label AI-generated content on social platforms?",a:"Major platforms have converged on asking creators and advertisers to label realistic AI-generated or AI-modified content depicting people, places or events, and some apply automatic labels when they detect provenance signals. The specifics change often and differ by platform and market, so verify current policy before each campaign. A safe default: if a viewer could mistake it for an unaltered recording, label it."},{q:"What does the EU AI Act say about AI-generated content?",a:"Regulation (EU) 2024/1689 sets transparency obligations for synthetic media: broadly, providers of generative systems should mark AI outputs in machine-readable form, and those publishing realistic synthetic depictions of people or events should disclose that the content is artificially generated or manipulated. Obligations phase in on a staged timetable and guidance is still developing. Treat it as direction of travel and take local legal advice."},{q:"Is it legal to use a real creator's face in AI-generated ads?",a:"It is lawful when the person gave specific, documented consent covering AI-generated derivatives, not only originally captured footage, and when the use falls inside the agreed scope, territory and duration. Without that, you are exposed under right-of-publicity and image-rights law in most jurisdictions. A photoshoot-era model release usually does not cover synthetic outputs, so the paperwork needs updating."},{q:"What is the difference between an AI avatar and a virtual influencer?",a:"An AI avatar in a UGC context usually stands in for a specific consenting person whose likeness is licensed for defined uses. A virtual influencer is a wholly fictional persona with no real individual behind it. Both are synthetic media, but the avatar carries consent and royalty obligations, while the virtual influencer carries a disclosure obligation not to be read as a genuine customer."},{q:"Can AI UGC be used for customer testimonials?",a:"Not as a testimonial. Advertising rules require that testimonials reflect genuine customer experience, and a generated avatar reading a script does not. You can use AI UGC to dramatise a benefit, demonstrate a product or present brand messaging, provided it is framed as advertising rather than as an unsolicited customer opinion, and the underlying claim is substantiated."},{q:"How do watermarks and content credentials work together?",a:"A visible watermark tells a human the content is AI-generated. Invisible or forensic watermarks embed a signal designed to survive resizing and compression. Content credentials, such as the C2PA standard, attach cryptographically signed metadata describing how an asset was produced. They are complementary layers, and the practical failure is an export or upload step that silently strips the metadata."},{q:"What should AI likeness consent cover?",a:"Scope of permitted content types and channels; excluded contexts the person refuses, such as political, adult or gambling material; duration and territory; explicit coverage of AI-generated derivatives rather than only captured footage; how compensation and royalties are calculated; and what happens to live assets if consent is withdrawn. Consent that is granular, auditable and revocable is far more defensible than a one-time blanket sign-off."},{q:"Does using a real creator cost more than an AI avatar on HeroShots?",a:"Yes. A real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no likeness fee, since no real person's rights are engaged. Images are billed per batch of four variants at â¬4.90 for a project's first batch and â¬1.90 for each further batch in the same project. Prices exclude VAT."},{q:"How do I keep AI UGC brand-safe when generating at volume?",a:"Move the controls upstream. Validate claims before generation rather than reviewing finished files, restrict prompts to approved messaging, keep a human review gate on anything featuring a face, and check that product depictions match what actually ships. Volume multiplies whatever enters the pipeline, so one unchecked claim becomes an entire batch of non-compliant assets."}],metaTitle:"Is AI UGC Authentic? Trust, Consent, Rules"},it:{title:"L'AI UGC è ancora autentico? Cosa determina davvero la fiducia nel 2026",description:"L'AI UGC costruito su creator reali licenziati mantiene gran parte del segnale di fiducia dell'UGC tradizionale. I volti puramente sintetici ne perdono molto di più. La differenza è la licenza.",body:`L'AI UGC costruito su **creator reali licenziati** mantiene **gran parte del segnale di fiducia** dell'UGC tradizionale. I volti puramente sintetici â generati da zero senza una persona reale â ne perdono molto di più. La variabile che spiega il gap non è "AI vs umano" ma **licenza e diritti d'immagine**. 1123 1124## Perché l'AI UGC con creator reali mantiene la fiducia 1125 1126Gli spettatori non verificano davvero se un creative è stato girato o generato. Leggono **micro-segnali**: texture della pelle, frequenza dei blink, imperfezione ambientale, proporzioni del corpo. L'AI basata sul reference shoot di un creator reale eredita tutto questo. I modelli solo sintetici lo mancano in modi sottili che il cervello coglie. 1127 1128## Cosa erode la fiducia più in fretta 1129 1130- Occhi uncanny (il tell più comune nel video). 1131- Gioielli fluttuanti e dita deformate nei close-up. 1132- Stesso volto su brand concorrenti della stessa categoria. 1133- Uso nascosto di AI dopo che il brand si era impegnato pubblicamente al "100% umano". 1134 1135## Come HeroShots protegge il segnale di fiducia 1136 1137- Ogni Real Model è una persona reale, KYC-verificata, con consenso firmato. 1138- Royalty su ogni uso, tracciate via Tik Joy. 1139- Esclusioni di categoria per creator (può escludere gambling, adult, ecc.). 1140- Tag opzionale di disclosure nei metadati per i brand che vogliono essere espliciti. 1141 1142## La sintesi 1143 1144Il dibattito "l'AI UGC è autentico?" è mal posto. La domanda giusta è "questo creator è reale, consenziente e pagato?" Se sì, la matematica della fiducia regge. Se no, stai giocando col fuoco.`,faqs:[{q:"Ai consumatori importa se un creative è AI-generated?",a:"La maggior parte non lo riconosce in modo affidabile. Chi lo riconosce di solito non si lamenta se il model è una persona reale â si lamenta se il brand ha mentito."},{q:"I brand devono fare disclosure dell'AI UGC?",a:"La disclosure di contenuti completamente sintetici è richiesta da Meta/TikTok. Per l'AI UGC con creator reali è opzionale ma è una pratica trasparente. HeroShots supporta un tag opzionale nei metadati."},{q:"L'AI UGC influisce sui brand lift study?",a:"L'AI UGC con creator reali si avvicina molto all'UGC tradizionale su brand lift e ad recall. Il solo sintetico resta nettamente indietro."},{q:"Lo stesso creator AI può apparire per brand concorrenti?",a:"Su HeroShots i creator possono impostare esclusività per categoria. Un creator che lavora con un brand cosmetico può bloccare altri brand cosmetici dall'usare la sua immagine."}]},es:{title:"¿El AI UGC sigue siendo auténtico? Qué determina de verdad la confianza en 2026",description:"El AI UGC basado en creators reales licenciados mantiene la mayor parte de la señal de confianza del UGC tradicional. Las caras puramente sint
1144éticas pierden mucha más. La diferencia es la licencia.",body:`El AI UGC basado en **creators reales licenciados** mantiene **la mayor parte de la señal de confianza** del UGC tradicional. Las caras puramente sintéticas â generadas desde cero sin una persona real detrás â pierden mucha más. La variable que explica la brecha no es "AI vs humano" sino **licencia y derechos de imagen**. 1145 1146## Por qué el AI UGC con creators reales conserva la confianza 1147 1148Los espectadores no verifican realmente si un creative fue grabado o generado. Leen **micro-señales**: textura de piel, frecuencia de parpadeo, imperfección ambiental, proporción corporal. La AI basada en el reference shoot de un creator real hereda todo eso. Los modelos puramente sintéticos lo fallan de formas sutiles que el cerebro detecta. 1149 1150## Qué erosiona la confianza más rápido 1151 1152- Ojos uncanny (el tell más habitual en vÃdeo). 1153- Joyas flotantes y dedos deformados en primeros planos. 1154- Misma cara en marcas competidoras de la misma categorÃa. 1155- Uso oculto de AI después de que la marca se comprometió públicamente al "100% humano". 1156 1157## Cómo HeroShots protege la señal de confianza 1158 1159- Cada Real Model es una persona real, KYC-verificada, con consentimiento firmado. 1160- Royalties en cada uso, trackeadas vÃa Tik Joy. 1161- Exclusiones de categorÃa por creator (puede excluir gambling, adult, etc.). 1162- Tag opcional de disclosure en los metadatos para marcas que quieran ser explÃcitas. 1163 1164## El resumen 1165 1166El debate "¿el AI UGC es auténtico?" está mal planteado. La pregunta correcta es "¿este creator es real, consintió y cobra?" Si sÃ, las matemáticas de la confianza funcionan. Si no, juegas con fuego.`,faqs:[{q:"¿A los consumidores les importa si un creative es AI-generated?",a:"La mayorÃa no lo reconoce de forma fiable. Quien lo reconoce no suele quejarse si el model es una persona real â se queja si la marca mintió."},{q:"¿Las marcas deben hacer disclosure del AI UGC?",a:"El disclosure de contenido totalmente sintético lo exigen Meta/TikTok. Para AI UGC con creators reales es opcional pero es práctica transparente. HeroShots soporta un tag opcional en metadatos."},{q:"¿El AI UGC afecta los estudios de brand lift?",a:"El AI UGC con creators reales se acerca mucho al UGC tradicional en brand lift y ad recall. El puramente sintético queda claramente por detrás."},{q:"¿El mismo creator AI puede aparecer en marcas competidoras?",a:"En HeroShots los creators pueden fijar exclusividad por categorÃa. Un creator que trabaja con una marca cosmética puede bloquear a otras marcas cosméticas para usar su imagen."}]}
1166,de:{title:"Ist AI UGC noch authentisch? Was 2026 wirklich über Vertrauen entscheidet",description:"AI UGC auf Basis echter lizenzierter Creators behält den GroÃteil des Vertrauenssignals klassischen UGCs. Rein synthetische Gesichter verlieren deutlich mehr davon. Der Unterschied: Lizenzierung.",body:`AI UGC auf Basis **echter lizenzierter Creators** behält **den GroÃteil des Vertrauenssignals** klassischen UGCs. Rein synthetische Gesichter â von Grund auf ohne echte Person erzeugt â verlieren deutlich mehr davon. Die Variable, die diesen Gap erklärt, ist nicht "AI vs Mensch", sondern **Lizenzierung und Bildrechte**. 1167 1168## Warum Real-Creator-AI-UGC Vertrauen behält 1169 1170Zuschauer prüfen nicht wirklich, ob ein Creative gedreht oder generiert wurde. Sie lesen **Mikrosignale**: Hauttextur, Blinzelrate, Umgebungsfehler, Körperproportionen. AI auf Basis des Reference-Shoots eines echten Creators erbt all das. Rein synthetische Modelle verfehlen es auf subtile Weise, die das Gehirn registriert. 1171 1172## Was Vertrauen am schnellsten erodiert 1173 1174- Uncanny-Augen (das häufigste Tell im Video). 1175- Schwebender Schmuck und verzerrte Finger in Close-Ups. 1176- Dasselbe Gesicht bei konkurrierenden Marken derselben Kategorie. 1177- Versteckter AI-Einsatz, nachdem eine Marke öffentlich "100% menschlich" versprochen hat. 1178 1179## Wie HeroShots das Vertrauenssignal schützt 1180 1181- Jedes Real Model ist eine echte, KYC-verifizierte Person mit unterschriebener Einwilligung. 1182- Royalties bei jeder Nutzung, getrackt über Tik Joy. 1183- Kategorie-Ausschlüsse pro Creator (Gambling, Adult etc. abwählbar). 1184- Optionaler Disclosure-Tag im Metadata für Marken, die explizit sein wollen. 1185 1186## Das Fazit 1187 1188Die Debatte "Ist AI UGC authentisch?" ist falsch gestellt. Die richtige Frage ist "Ist dieser Creator echt, einwilligend, bezahlt?" Wenn ja, geht die Vertrauensrechnung auf. Wenn nein, spielst du mit dem Feuer.`,faqs:[{q:"Interessiert es Konsumenten, ob ein Creative AI-generiert ist?",a:"Die meisten erkennen es nicht zuverlässig. Wer es erkennt, stört sich meist nicht daran, wenn das Model eine echte Person ist â sondern daran, wenn die Marke gelogen hat."},{q:"Sollten Marken AI UGC offenlegen?",a:"Offenlegung vollsynthetischer Inhalte ist von Meta/TikTok gefordert. Für Real-Creator-AI-UGC ist sie optional, aber transparente Praxis. HeroShots unterstützt einen optionalen Metadata-Tag."},{q:"Beeinflusst AI UGC Brand-Lift-Studien?",a:"Real-Creator-AI-UGC liegt bei Brand-Lift und Ad-Recall nah am klassischen UGC. Rein Synthetisches fällt deutlich zurück."},{q:"Kann derselbe AI-Creator für konkurrierende Marken auftreten?",a:"Auf HeroShots können Creators kategoriespezifische Exklusivität festlegen. Wer mit einer Kosmetikmarke arbeitet, kann andere Kosmetikmarken blockieren."}]},fr:{title:"L'AI UGC est-il encore authentique ? Ce qui détermine vraiment la confiance en 2026",description:"L'AI UGC basé sur de vrais créateurs licenciés conserve l'essentiel du signal de confiance de l'UGC traditionnel. Les visages purement synthétiques en perdent bien davantage. La différence : la licence.",body:`L'AI UGC basé sur de **vrais créateurs licenciés** conserve **l'essentiel du signal de confiance** de l'UGC traditionnel. Les visages purement synthétiques â générés de zéro sans personne réelle derrière â en perdent bien davantage. La variable qui explique l'écart n'est pas "AI vs humain" mais **licence et droits à l'image**. 1189 1190## Pourquoi l'AI UGC avec vrais créateurs garde la confiance 1191 1192Les spectateurs ne vérifient pas vraiment si un creative a été filmé ou généré. Ils lisent des **micro-signaux** : texture de peau, taux de clignement, imperfection environnementale, proportion du corps. L'AI basée sur le reference shoot d'un vrai créateur en hérite. Les modèles purement synthétiques les ratent de manière subtile que le cerveau capte. 1193 1194## Ce qui érode la confiance le plus vite 1195 1196- Yeux uncanny (le tell le plus fréquent en vidéo). 1197- Bijoux flottants et doigts déformés en gros plan. 1198- Même visage chez des marques concurrentes de la même catégorie.
1199- Usage caché d'AI après qu'une marque s'est publiquement engagée au "100% humain". 1200 1201## Comment HeroShots protège le signal de confiance 1202 1203- Chaque Real Model est une vraie personne KYC-vérifiée avec consentement signé. 1204- Royalties sur chaque usage, trackées via Tik Joy. 1205- Exclusions de catégorie par créateur (peut exclure gambling, adult, etc.). 1206- Tag de disclosure optionnel dans les metadata pour les marques qui veulent être explicites. 1207 1208## La synthèse 1209 1210Le débat "l'AI UGC est-il authentique ?" est mal posé. La bonne question est "ce créateur est-il réel, consentant, payé ?" Si oui, le calcul de la confiance tient. Sinon, tu joues avec le feu.`,faqs:[{q:"Les consommateurs s'en soucient-ils si un creative est AI-generated ?",a:"La plupart ne le détectent pas de façon fiable. Ceux qui le détectent ne s'en plaignent généralement pas si le model est une vraie personne â ils s'en plaignent si la marque a menti."},{q:"Les marques doivent-elles disclore l'AI UGC ?",a:"Le disclosure du contenu entièrement synthétique est exigé par Meta/TikTok. Pour l'AI UGC avec vrais créateurs c'est optionnel mais c'est une pratique transparente. HeroShots supporte un tag optionnel dans les metadata."},{q:"L'AI UGC affecte-t-il les études de brand lift ?",a:"L'AI UGC avec vrais créateurs se rapproche fortement de l'UGC traditionnel sur brand lift et ad recall. Le purement synthétique reste nettement en retrait."},{q:"Le même créateur AI peut-il apparaître pour des marques concurrentes ?",a:"Sur HeroShots les créateurs peuvent fixer une exclusivité par catégorie. Un créateur travaillant avec une marque cosmétique peut bloquer d'autres marques cosmétiques."}]}}},{slug:"ai-ugc-vs-influencer-marketing-cost-roi",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["ugc","influencer","roi"],translations:{en:{title:"AI UGC vs Influencer Marketing: What You Are Actually Buying, and How to Model the ROI",description:"An influencer sells access to an audience; AI UGC sells production capacity. Compare budget structure, rights, risk and how to model your own ROI.",body:`AI UGC and influencer marketing buy two different things. An influencer sells access to an audience and an implied endorsement, priced per placement and negotiated per deal. AI UGC sells production capacity: on HeroShots the first batch of 4 image variants in a project costs â¬4.90, each further batch â¬1.90, and video starts at â¬15 for up to 15 seconds (excl. VAT). Most teams need both. 1211 1212## What are you actually buying: audience or production capacity? 1213 1214An influencer deal bundles several things into one invoice: reach into an audience that already exists, an implied endorsement from someone that audience trusts, the creative labour, and sometimes the right to reuse the asset elsewhere. Unbundle it and the value sits mostly in the first two. You are renting attention and borrowed credibility; the content is the vehicle. 1215 1216[AI UGC](/glossary/ai-ugc) buys the production layer only, and buys it as a utility. You supply a product, pick a [creator avatar](/glossary/creator-avatar) or an [AI avatar](/glossary/ai-avatar), write a prompt, and get photo and video content in the UGC style. Nobody is watching when it lands in your library; distribution is a separate decision and a separate budget line. 1217 1218There is a clean test to run before signing anything. If this content performed brilliantly but nobody outside your own ad account ever saw it, would the deal still have been worth it? If yes, you are buying production, and should price it against production alternatives â the comparison in [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators). If no, you are buying an audience, and no amount of cheap generation substitutes for it. 1219 1220## How does the budget structure differ? 1221 1222Influencer spend is lumpy and negotiated. Every deal is bespoke and there is no rate card, because the drivers are relational rather than mechanical: audience size and engagement quality, the category, exclusivity windows, how many deliverables are in scope, whether usage extends past an organic post on the creator's own channel, whether whitelisting is included, and how fast you need it. Change any one of those and the quote moves. Two brands can pay very different amounts to the same creator in the same month for entirely legitimate reasons. 1223
1224AI UGC spend behaves more like infrastructure. It is metered, published in advance, and scales in small increments rather than deal-sized jumps. Instead of committing a quarter's budget to a handful of partnerships, you commit a monthly floor to generation and let volume follow what your testing tells you. 1225 1226| What you are comparing | Influencer marketing | AI UGC | 1227| --- | --- | --- | 1228| Primary thing purchased | Audience access and implied endorsement | Production capacity | 1229| Pricing model | Negotiated per deal or placement | Published and metered, per batch or per video | 1230| Main cost drivers | Audience, category, exclusivity, deliverables, usage window, turnaround | Number of batches, video length, whether a real catalog model is used, plan | 1231| Lead time | Days to weeks, plus scheduling and revisions | Minutes per generation, plus briefing and review | 1232| Who controls the creative | The creator, working inside your brief | The brand, through prompts and edits | 1233| Distribution included | Yes â their audience | No â paid or owned media is a separate budget | 1234| Rights by default | Organic use on the creator's channel; paid usage and extensions are negotiated | Consent, licensing and royalties defined in the platform before you generate | 1235| Natural unit of measure | Cost per placement | Cost per usable asset | 1236| How it scales | Book more people | Run more batches | 1237| Main failure mode | One person's schedule and reputation | Sameness and weak briefs | 1238 1239## What does AI UGC cost, and how is it billed? 1240 1241HeroShots bills images per **batch of 4 variants**, not per image. The first batch in a project is â¬4.90, and each further batch in that same project is â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. All prices exclude VAT. 1242 1243Two modifiers matter for planning. First, using a real model from the catalog adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos â this funds [creator royalties](/glossary/creator-royalties). AI avatars add no fee. A custom AI avatar setup is â¬100 one-time; bringing your own model is â¬300 one-time. Second, teams buying video in volume can pre-pay: Starter â¬350 (â¬70 per video), Growth â¬650 (â¬65 per video), Scale â¬1,500 (â¬60 per video). HeroShots Pro at â¬99 per month removes watermarks, enables direct downloads, cuts 15% off videos, lowers edit prices and adds a priority queue. 1244 1245Model your own week rather than copying someone else's total. The shape of the calculation is: the first batch at â¬4.90, plus however many further batches at â¬1.90 each, plus the likeness fee if you pick a real catalog model, plus â¬0.39 (or â¬0.23 on Pro) for each edit on an image you intend to run. Video sits on its own line at â¬15 or â¬35 depending on length. The [pricing page](/pricing) is the source of truth, and a free plan â 10 watermarked images a month, one video preview, no credit card â lets you sanity-check the output on your own product before committing anything. 1246 1247## Who owns the content, and who owns the face? 1248 1249This is where the two models diverge most sharply, and where cost comparisons usually go wrong. 1250 1251With an influencer, you typically start with organic use on their channel. Everything beyond that â paid amplification, whitelisting to your ad account, longer terms, additional territories, use on your product pages â is a separately negotiated clause, and it is priced. Teams that forget to scope [usage rights](/glossary/usage-rights) discover the gap when a post performs and they cannot legally put media behind it: the worst possible moment to reopen a negotiation. 1252 1253With AI UGC built on real people, the rights architecture is decided before generation rather than after. [Likeness licensing](/glossary/likeness-licensing) and documented consent define what may be produced and where it may run, and creator royalties are part of the published pricing rather than a separate negotiation. That does not make rights free â it makes them predictable, moving the question from "can we clear this?" to "what did we license?". Behind both models sits the same legal principle, the [right of publicity](/glossary/right-of-publicity): a person's control over the commercial use of their identity. Fully invented personas sidestep it entirely, which is precisely why a [virtual influencer](/glossary/virtual-influencer) is a different product with a different trust profile. 1254 1255## Where does the risk sit in each model? 1256 1257Influencer risk is concentrated. One partnership is one person's schedule, judgement and reputation. Content can arrive late, off-br
1257ief, or in the middle of an unrelated controversy. Disclosure compliance is theirs to execute and yours to be liable for. 1258 1259AI UGC risk is diffuse but real. The failure mode is sameness â a library of assets that all read as the same generic angle because the briefs were thin. It shifts effort to [brand safety](/glossary/brand-safety) review, because volume without a review gate is just faster mistakes. And it comes with no audience attached, so a bad media plan will hide a good creative library indefinitely. 1260 1261Both share one risk: measurement. If you cannot tell which creative or placement moved the number, the next budget decision gets made on vibes. 1262 1263## How do you model ROI without borrowed benchmarks? 1264 1265Ignore any published multiplier claiming AI UGC returns some fixed factor more than influencer spend. Those figures travel well and mean nothing, because they average across categories, price points and media plans that look nothing like yours. Build the model from your own data instead. 1266 12671. **Name the job.** Decide whether this budget is buying awareness in a community or creative for a testing engine. One buy cannot be judged on the other's metric. 12682. **Fix the unit.** Cost per placement for influencer spend, cost per usable asset for AI UGC. Never compare a per-post price to a per-asset price. 12693. **Count usable, not generated.** Divide your AI UGC spend by the assets that survive review, not by everything the model produced. Counting generations instead of survivors is where AI UGC math most often flatters itself. 12704. **Add the media line.** AI UGC has no audience. Whatever you would have spent to distribute it belongs on that side of the ledger before you compare. 12715. **Hold the plan constant.** Change one variable at a time â same audiences, same budget, same window â or you are measuring seasonality. 12726. **Use a full attribution window.** Influencer effects often show up outside a click-based window; performance creative usually shows up inside one. A mismatched window flatters one side by construction. 12737. **Recompute quarterly.** Rates, platform behaviour and your own baseline all move. A model built once is wrong later. 1274 1275## How do brands combine influencer marketing and AI UGC? 1276 1277The strongest pattern treats them as stages of the same loop rather than rival line items. A small number of influencer partnerships each quarter generate awareness, earned proof and â crucially â evidence about which claims and hooks land with real people. Those winning angles become prompt briefs. [Performance creative](/glossary/performance-creative) production then runs continuously on AI UGC, using [batch generation](/glossary/batch-generation) to test variations of the angles that already showed signal, across every SKU and market, without booking anything. 1278 1279Where contracts allow, the loop closes: a top-performing variant can be whitelisted to run from the creator's handle, with explicit permission and disclosure agreed in advance. A [talent agency](/glossary/talent-agency) managing a roster's AI rights can sit on both sides of that arrangement â negotiating the human campaigns, and licensing the likeness that keeps producing between them. 1280 1281## When should you spend on an influencer instead of more variants? 1282 1283Spend on a person when the endorsement *is* the message: entering a category where you have no credibility, launching into a tight community, long-form storytelling that needs a voice, or a considered purchase where a real user's experience carries the argument. Spend on a person when your problem is that nobody has heard of you. 1284 1285Spend on production capacity when you already know what to say and cannot say it often enough: many SKUs, many markets, always-on retargeting, or a testing cadence your shoot schedule cannot feed. If you have more winning angles than budget to run them, production is not your bottleneck â buy media. If you have budget running against three tired creatives, production is exactly your bottleneck, and [AI product photography](/solutions/ai-product-photography) plus UGC-style video is the fastest way to unblock it. 1286 1287## What do people get wrong when comparing the two? 1288 1289Four mistakes come up again and again. Comparing incompatible units. Forgetting that AI UGC needs a media budget while influencer spend already includes distribution. Assuming AI UGC has no human cost â briefing, prompting, reviewing and rights checks are real work that scales with volume. And treating rights as an afterthought on the influencer side, then being surprised when an extension has to be quoted from scratch. Get those four right and the comparison stops being a price fight and becomes a question about which constraint is holding your marketing back.`,faqs:[{q:"Can AI UGC replace influencer marketing?",a:"No, because they sell different things. AI UGC replaces the production layer â the shooting, the scheduling, the reshoots â but it does not come with an audie
1289nce or a trusted voice attached. If your bottleneck is not having enough creative to test, AI UGC solves it directly. If your bottleneck is that nobody in a community has heard of you, an influencer partnership does something AI UGC structurally cannot."},{q:"Which is cheaper per acquired customer, AI UGC or influencers?",a:"There is no universal answer, and any published multiplier claiming one should be treated with suspicion. The honest method is to hold your media plan constant, run both, and compare blended cost per acquisition over a full attribution window. AI UGC lowers the cost of producing test creative; an influencer can lower acquisition cost inside their own audience. Which effect dominates depends on your category, price point and stage."},{q:"How much does AI UGC cost on HeroShots?",a:"Images are billed per batch of four variants, not per image: the first batch in a project costs â¬4.90 and each further batch in the same project â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Prices exclude VAT."},{q:"What does the creator likeness fee add?",a:"When a generation uses a real model from the HeroShots catalog, a creator likeness fee of +25% is added to the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee. A custom AI avatar setup is â¬100 one-time, and bringing your own model is â¬300 one-time. Prices exclude VAT. This fee is what funds creator royalties."},{q:"Do I get usage rights with AI UGC?",a:"On HeroShots, consent, likeness licensing and creator royalties are built into the product rather than negotiated deal by deal, so the rights governing a generation are defined before you press generate. That differs structurally from an influencer agreement, where anything beyond organic posting on the creator's own channel â paid amplification, whitelisting, longer terms, extra territories â is typically a separately negotiated and separately priced clause."},{q:"Can I run AI UGC on an influencer's handle?",a:"Only with explicit contractual permission from the creator and disclosure that follows each platform's current rules. Running content from someone else's handle attaches their identity to a claim they may not personally have made, so the right to do it belongs in the influencer contract from the first draft â alongside how AI-assisted assets may be used, for how long, and who approves each one before it runs."},{q:"How does AI UGC fit with a talent agency?",a:"A talent agency represents creators, negotiates their deals and manages their likeness rights. An AI UGC platform is relevant to that work because it turns a likeness into something licensed for repeat use rather than booked shoot by shoot. On HeroShots, consent, likeness licensing and creator royalties are built into the product, so a roster's AI rights are defined in the same place the content is generated â alongside human campaigns rather than instead of them."},{q:"How do I compare an influencer quote to AI UGC spend fairly?",a:"Convert both to the same unit before comparing anything. For an influencer, the unit is cost per placement including the usage rights you actually need, not the headline fee. For AI UGC, the unit is cost per usable asset â total spend divided by the assets that survive review, not the number generated. Then add a media budget to the AI UGC side, because it has no audience attached."},{q:"Do I have to disclose AI UGC?",a:"Assume yes for realistic AI-generated content, and check the current policy of every platform you publish on, because these rules change. Disclosure requirements generally focus on realistic synthetic depictions of people and on anything that could mislead viewers. Content built on a real, consenting creator's licensed likeness still depicts a real person, so treat labelling as a brand-safety decision rather than a legal minimum to work around."},{q:"What if I have no budget to test AI UGC at all?",a:"The HeroShots free plan includes 10 watermarked images per month and one video preview with no credit card, which is enough to judge whether the output suits your product and category before spending anything. HeroShots Pro at â¬99 per month then removes watermarks, enables direct downloads, cuts 15% off video prices, lowers edit prices and adds a priority queue. Prices exclude VAT."}],metaTitle:"AI UGC vs Influencer Marketing: Cost & ROI"},it:{title:"AI UGC vs Influencer Marketing: costi e ROI a confronto (2026)",description:"L'AI UGC produce un creative in circa un minuto, da â¬4,90 per un batch di 4 immagini o â¬15 per un video fino a 15 secondi (IVA esclusa); un post influencer si negozia per singolo posizionamento e richiede giorni o settimane. A parità di budget di test, l'AI UGC genera molti più creative testati â ma l'influencer vince ancora sull'awareness top-of-funnel in community di nicchia.",body:`AI UGC e influencer marketing non sono lo stesso acquisto. **L'AI UGC parte da â¬4,90 per un batch di 4 varianti immagine â â¬15 per un video fino a 15 secondi, prezzi IVA esclusa â e si consegna in minuti**, ottimizzato per volume di test su paid social. **L'influencer si paga a post e arriva in giorni o settimane**, ottimizzato per fiducia di community e reach in una nicchia. A parità di euro
1289speso in testing, l'AI UGC produce molte più varianti. A parità di euro speso in awareness in una community stretta, l'influencer vince ancora. 1290 1291## Quando vince l'AI UGC 1292 1293- Creative di performance a scala (20+ varianti/settimana). 1294- Asset localizzati per 5+ mercati. 1295- Retargeting always-on e DPA. 1296- Brand di catalogo con 50+ SKU. 1297 1298## Quando vince l'influencer marketing 1299 1300- Lancio in una community dove l'endorsement di un creator = fiducia istantanea. 1301- Storytelling long-form (YouTube, podcast). 1302- Revenue affiliate con prodotto ad alto LTV. 1303 1304## Il playbook blended del 2026 1305 13061. **2â4 drop hero con influencer/trimestre** per awareness e contenuto earned. 13072. **AI UGC** come motore di testing su paid e always-on. 13083. **Whitelisting della miglior variante AI UGC** come dark post sull'handle dell'influencer (dove il contratto lo permette). 1309 1310La logica: spostare una parte del budget influencer su varianti AI UGC ti compra in genere più creative testato a parità di spesa â e un CAC migliore.`,faqs:[{q:"L'AI UGC può sostituire del tutto gli influencer?",a:"No. L'AI UGC sostituisce il layer di produzione dell'UGC, non la fiducia di community che porta un influencer. Quasi tutti i brand nel 2026 usano entrambi."},{q:"Cosa costa meno per cliente acquisito?",a:"Di solito il mix. L'AI UGC vince sul CPM; l'influencer vince sul conversion rate dentro il suo pubblico. Insieme tendono a far scendere il CAC."},{q:"Le agenzie influencer usano l'AI UGC?",a:"Sì â le Talent Agency su HeroShots gestiscono i diritti AI dei loro talent e prendono royalty su ogni uso brand, spesso finanziando le campagne umane."},{q:"à permesso fare whitelisting di AI UGC sull'handle di un influencer?",a:"Solo con autorizzazione contrattuale esplicita e disclosure di piattaforma. Mettilo nel contratto dal giorno uno."}]},es:{title:"AI UGC vs Influencer Marketing: coste y ROI comparados (2026)",description:"El AI UGC produce un creative en cerca de un minuto, desde â¬4,90 por un batch de 4 imágenes o â¬15 por un vÃdeo de hasta 15 segundos (sin IVA); un post de influencer se negocia por colocación y tarda dÃas o semanas. A igualdad de presupuesto de test, el AI UGC genera muchos más creatives testeados â pero el influencer sigue ganando en awareness top-of-funnel en comunidades de nicho.",body:`AI UGC e influencer marketing no son la misma compra. **El AI UGC arranca en â¬4,90 por un batch de 4 variantes de imagen â â¬15 por un vÃdeo de hasta 15 segundos, precios sin IVA â y se entrega en minutos**, optimizado para volumen de testing en paid social. **El influencer se paga por post y llega en dÃas o semanas**, optimizado para confianza de comunidad y reach en un nicho. Por euro gastado en testing, el AI UGC produce muchas más variantes. Por euro gastado en awareness en una comunidad cerrada, el influencer sigue ganando. 1311 1312## Cuándo gana el AI UGC 1313 1314- Creative de performance a escala (20+ variantes/semana). 1315- Assets localizados para 5+ mercados. 1316- Retargeting always-on y DPA. 1317- Brands de catálogo con 50+ SKUs. 1318 1319## Cuándo gana el influencer marketing 1320 1321- Lanzamiento en una comunidad donde el endorsement de un creator = confianza instantánea. 1322- Storytelling long-form (YouTube, podcasts). 1323- Revenue de afiliación con producto de alto LTV. 1324 1325## El playbook mixto de 2026 1326 13271. **2â4 drops hero con influencers/trimestre** para awareness y contenido earned. 13282. **AI UGC** como motor de testing en paid y always-on. 13293. **Whitelisting de la mejor variante AI UGC** como dark post en el handle del influencer (donde el contrato lo permita). 1330 1331La lógica: mover parte del presupuesto de influencer a variantes de AI UGC suele comprarte más creative testeado por el mismo gasto â y un CAC mejor.`,faqs:[{q:"¿Puede el AI UGC reemplazar totalmente a los influencers?",a:"No. El AI UGC reemplaza la capa de producción del UGC, no la confianza de comunidad que aporta un influencer. La mayorÃa de brands en 2026 usan ambos."},{q:"¿Qué cuesta menos por cliente captado?",a:"Normalmente la mezcla. El AI UGC gana en CPM; el influencer gana en tasa de conversión dentro de su audiencia. Juntos tienden a bajar el CAC."},{q:"¿Las agencias de influencers usan AI UGC?",a:"Sà â las Talent Agency en HeroShots gestionan los derechos AI de sus talents y cobran royalties por cada uso de brand, financiando a menudo las campañas humanas."},{q:"¿Se permite el whitelisting de AI UGC en el handle de un influencer?",a:"Solo con autorización contractual explÃcita y disclosure de plataforma. Métalo en el contrato desde el dÃa uno."}]},de:{title:"AI UGC vs Influencer Marketing: Kosten und ROI im Vergleich (2026)",description:"AI UGC produziert ein Creative in etwa einer Minute, ab â¬4,90 für einen Batch mit 4 Bildern oder â¬15 für ein Video bis 15 Sekunden (zzgl. MwSt.); ein Influencer-Post wird pro Platzierung verhandelt und braucht Tage bis Wochen. Pro Euro Testbudget liefert AI UGC deutlich mehr getestete Creatives â Influencer gewinnen aber weiter beim Top-Funnel-Awareness in Nischen-Communities.",body:`AI UGC und Influencer Marketing sind nicht derselbe Einkauf. **AI UGC startet bei â¬4,90 für einen Batch mit 4 Bildvarianten â â¬15 für ein Video bis 15 Sekunden, Preise zzgl. MwSt. â und ist in Minuten geliefert**, optimiert auf Test-Volumen im Paid Social. **Influencer werden pro Post bezahlt und brauchen Tage bis Wochen**, optimiert auf Community-Vertrauen und Reach in einer Nische. Pro Euro Testing produziert AI UGC deutlich mehr Varianten. Pro Euro Awareness in einer engen Community gewinnt der Influencer weiter. 1332 1333## Wann AI UGC gewinnt 1334 1335- Performance-Creative im Scale (20+ Varianten/Woche). 1336- Lokalisierte Assets für 5+ Märkte. 1337- Always-on Retargeting und DPA. 1338- Katalog-Brands mit 50+ SKUs. 1339 1340## Wann Influencer Marketing gewinnt 1341 1342- Launch in einer Community, in der ein Creator-Endorsement = sofortiges Vertrauen. 1343- Long-Form Storytelling (YouTube, Podcasts). 1344- Affiliate-Revenue mit High-LTV-Produkt. 1345
1346## Das Blended-Playbook 2026 1347 13481. **2â4 Hero-Influencer-Drops/Quartal** für Awareness und Earned Content. 13492. **AI UGC** als Test-Motor im Paid und Always-on. 13503. **Whitelisting der besten AI-UGC-Variante** als Dark Post auf dem Influencer-Handle (wo der Vertrag es erlaubt). 1351 1352Die Logik: einen Teil des reinen Influencer-Budgets in AI-UGC-Varianten zu verschieben, kauft dir bei gleichem Spend meist mehr getestetes Creative â und einen besseren CAC.`,faqs:[{q:"Kann AI UGC Influencer komplett ersetzen?",a:"Nein. AI UGC ersetzt die Produktionsschicht des UGC, nicht das Community-Vertrauen eines Influencers. Die meisten Brands 2026 nutzen beides."},{q:"Was ist günstiger pro gewonnenem Kunden?",a:"Meist der Mix. AI UGC gewinnt beim CPM; Influencer gewinnen bei der Conversion-Rate in ihrer Audience. Zusammen drücken sie den CAC."},{q:"Nutzen Influencer-Agenturen AI UGC?",a:"Ja â Talent Agencies auf HeroShots verwalten die AI-Rechte ihres Rosters und verdienen Royalties auf jede Brand-Nutzung, was oft die menschlichen Kampagnen finanziert."},{q:"Ist Whitelisting von AI UGC auf einem Influencer-Handle erlaubt?",a:"Nur mit expliziter vertraglicher Freigabe und Plattform-Disclosure. Direkt in den Influencer-Vertrag vom Tag eins."}]},fr:{title:"AI UGC vs Influencer Marketing : coût et ROI comparés (2026)",description:"L'AI UGC produit un creative en une minute environ, à partir de â¬4,90 pour un batch de 4 images ou â¬15 pour une vidéo jusqu'à 15 secondes (HT) ; un post influencer se négocie par placement et prend des jours ou des semaines. à budget de test égal, l'AI UGC génère beaucoup plus de creatives testés â mais l'influencer gagne encore sur l'awareness top-of-funnel dans les communautés de niche.",body:`AI UGC et influencer marketing ne sont pas le même achat. **L'AI UGC démarre à â¬4,90 pour un batch de 4 variantes d'image â â¬15 pour une vidéo jusqu'à 15 secondes, prix HT â et se livre en minutes**, optimisé pour le volume de tests sur paid social. **L'influencer se paie au post et arrive en jours ou en semaines**, optimisé pour la confiance de communauté et le reach dans une niche. Par euro dépensé en testing, l'AI UGC produit beaucoup plus de variantes. Par euro dépensé en awareness dans une communauté étroite, l'influencer gagne encore. 1353 1354## Quand l'AI UGC gagne 1355 1356- Creative de performance à l'échelle (20+ variantes/semaine). 1357- Assets localisés pour 5+ marchés. 1358- Retargeting always-on et DPA. 1359- Brands catalogue avec 50+ SKUs. 1360 1361## Quand l'influencer marketing gagne 1362 1363- Lancement dans une communauté où l'endorsement d'un créateur = confiance instantanée. 1364- Storytelling long-form (YouTube, podcasts). 1365- Revenue d'affiliation avec produit haut LTV. 1366 1367## Le playbook mixte de 2026 1368 13691. **2â4 drops hero d'influencers/trimestre** pour awareness et contenu earned. 13702. **AI UGC** comme moteur de tests sur paid et always-on. 13713. **Whitelisting de la meilleure variante AI UGC** en dark post sur le handle de l'influencer (quand le contrat l'autorise). 1372 1373La logique : basculer une partie d'un budget purement influencer vers des variantes AI UGC t'achète généralement plus de creative testé à dépense égale â et un meilleur CAC.`,faqs:[{q:"L'AI UGC peut-il remplacer totalement les influencers ?",a:"Non. L'AI UGC remplace la couche de production de l'UGC, pas la confiance de communauté qu'apporte un influencer. La plupart des brands en 2026 utilisent les deux."},{q:"Qu'est-ce qui coûte le moins par client acquis ?",a:"Le mix, en général. L'AI UGC gagne sur le CPM ; l'influencer gagne sur le taux de conversion dans son audience. Ensemble, ils tirent le CAC vers le bas."},{q:"Les agences d'influencers utilisent-elles l'AI UGC ?",a:"Oui â les Talent Agency sur HeroShots gèrent les droits AI de leur roster et touchent des royalties à chaque usage brand, finançant souvent les campagnes humaines."},{q:"Le whitelisting d'AI UGC sur le handle d'un influencer est-il autorisé ?",a:"Uniquement avec autorisation contractuelle explicite et disclosure de plateforme. à mettre dans le contrat dès le jour un."}]}}},{slug:"how-to-start-with-ai-ugc-brand-guide",date:"2026-06-03",author:"HeroShots",tags:["ugc","how-to","brands"],translations:{en:{title:"How to Start with AI UGC: A 5-Step Guide for Brands (2026)",metaTitle:"How to Start with AI UGC: A 5-Step Guide",description:"Ship your first AI UGC campaign in under 48 hours: one hero SKU, ten variants in two ratios, a small paid test, then kill losers and scale the winner.",body:`**You can ship your first AI UGC campaign in under 48 hours and â¬200 of media.** Pick one hero SKU, generate 10 variants across 2 aspect ratios, split-test on Meta and TikTok, kill losers at day 3, scale the winner. Below is the exact 5-step playbook brands use on HeroShots. 1374 1375## Step 1 â Pick the right product (15 min) 1376 1377Choose 1 SKU with: clear visual benefit, existing organic demand, margin ⥠40%. Skip hero launches and complex products for the first test. 1378 1379## Step 2 â Brief the creative (30 min) 1380 1381Pick 2â3 Real Models matching your ICP. Pick 2 scenes (e.g. kitchen morning, outdoor afternoon). Pick 2 ratios (9:16 + 1:1). That's 12 cells; generate 1â2 variants per cell. 1382 1383## Step 3 â Generate and approve (60 min) 1384 1385Generate 10â20 assets on HeroShots (â¬4.90 for the first batch of 4 variants, â¬1.90 per further batch in the same project, excl. VAT). Approve those that pass three checks: (1) face/hands clean, (2) product accurate,
1385(3) scene believable. 1386 1387## Step 4 â Test (48h, â¬200 media budget) 1388 1389Push 5 ads to Meta and 5 to TikTok, â¬20/day each, broad targeting. Single KPI: cost per outbound click or cost per add-to-cart. 1390 1391## Step 5 â Kill, scale, iterate (day 3+) 1392 1393Kill bottom 60%. Scale top 20% to â¬100/day. Regenerate winners with hook/CTA variants. Restart the loop weekly.`,faqs:[{q:"Do I need a creative agency to start?",a:"No. The HeroShots wizard handles model selection, scene and brief. A solo marketer ships the first test in an afternoon."},{q:"What's a healthy first-test CPM?",a:"It depends on market, placement and season â use your own account's historical CPM as the baseline. A CPM well above your usual range normally means the creative isn't native enough."},{q:"How many variants before I know a winner?",a:"10 variants on â¬200 of media give you early signal on cost per click. Conversion-level signal needs considerably more spend per variant."},{q:"Can I reuse Real Models across campaigns?",a:"Yes. Royalties accrue per generation, and most brands settle on 3â5 favourite creators they re-use across campaigns."}]},it:{title:"Come iniziare con l'AI UGC: guida in 5 step per i brand (2026)",description:"Puoi mandare in onda la prima campagna AI UGC in meno di 48 ore: scegli 1 SKU hero, genera 10 varianti in 2 rapporti, fai un test da â¬200 su Meta + TikTok, killa i perdenti al giorno 3, scala il vincitore. Ecco il playbook esatto.",body:`**Puoi mandare in onda la prima campagna AI UGC in meno di 48 ore con â¬200 di media.** Scegli un SKU hero, genera 10 varianti su 2 rapporti, split test su Meta e TikTok, killa i perdenti al giorno 3, scala il vincitore. Sotto il playbook esatto in 5 step che i brand usano su HeroShots. 1394 1395## Step 1 â Scegli il prodotto giusto (15 min) 1396 1397Scegli 1 SKU con: beneficio visivo chiaro, domanda organica esistente, margine ⥠40%. Salta i lanci hero e i prodotti complessi per il primo test. 1398 1399## Step 2 â Briefa il creative (30 min) 1400 1401Scegli 2â3 Real Model in linea con la tua ICP. Scegli 2 scene (es. cucina mattina, outdoor pomeriggio). Scegli 2 rapporti (9:16 + 1:1). Sono 12 celle; genera 1â2 varianti a cella. 1402 1403## Step 3 â Genera e approva (60 min) 1404 1405Genera 10â20 asset su HeroShots (â¬4,90 il primo batch di 4 varianti, â¬1,90 ogni batch successivo nello stesso progetto, IVA esclusa). Approva quelli che passano tre check: (1) volto/mani pulite, (2) prodotto fedele, (3) scena credibile. 1406 1407## Step 4 â Testa (48h, â¬200 di media budget) 1408 1409Pubblica 5 ad su Meta e 5 su TikTok, â¬20/giorno ciascuno, targeting broad. KPI singolo: costo per click outbound o costo per add-to-cart. 1410 1411## Step 5 â Killa, scala, itera (giorno 3+) 1412 1413Killa il 60% peggiore. Scala il 20% top a â¬100/giorno. Rigenera i vincenti con varianti di hook/CTA. Riavvia il loop ogni settimana.`,faqs:[{q:"Mi serve un'agenzia creativa per partire?",a:"No. Il wizard HeroShots gestisce scelta del model, scena e brief. Un marketer solo manda in onda il primo test in un pomeriggio."},{q:"Qual è un CPM sano al primo test?",a:"Dipende da mercato, placement e stagione â usa come baseline lo storico CPM del tuo account. Un CPM molto sopra il tuo range abituale di solito vuol dire che il creative non è abbastanza nativo."},{q:"Quante varianti prima di sapere chi vince?",a:"10 varianti su â¬200 di media danno un primo segnale sul costo per click. Per le conversioni serve una spesa per variante decisamente maggiore."},{q:"Posso riusare i Real Model su più campagne?",a:"Sì. Le royalty maturano per generazione, e la maggior parte dei brand si fissa su 3â5 creator preferiti che riusa su più campagne."}]},es:{title:"Cómo empezar con AI UGC: guÃa en 5 pasos para brands (2026)",description:"Puedes lanzar tu primera campaña AI UGC en menos de 48 horas: elige 1 SKU hero, genera 10 variantes en 2 ratios, haz un test de â¬200 en Meta + TikTok, mata a los perdedores al dÃa 3, escala al ganador. Aquà el playbook exacto.",body:`**Puedes lanzar tu primera campaña AI UGC en menos de 48 horas con â¬200 de media.** Elige un SKU hero, genera 10 variantes en 2 ratios, split test en Meta y TikTok, mata a los perdedores al dÃa 3, escala al ganador. Abajo el playbook exacto en 5 pasos que los brands usan en HeroShots. 1414 1415## Paso 1 â Elige el producto correcto (15 min) 1416 1417Elige 1 SKU con: beneficio visual claro, demanda orgánica existente, margen ⥠40%. Sáltate los lanzamientos hero y productos complejos para el primer test. 1418 1419## Paso 2 â Brief del creative (30 min) 1420 1421Elige 2â3 Real Models alineados con tu ICP. Elige 2 escenas (p. ej. cocina mañana, outdoor tarde). Elige 2 ratios (9:16 + 1:1). Son 12 celdas; genera 1â2 variantes por celda. 1422 1423## Paso 3 â Genera y aprueba (60 min) 1424 1425Genera 10â20 assets en HeroShots (â¬4,90 el primer batch de 4 variantes, â¬1,90 cada batch adicional del mismo proyecto, sin IVA). Aprueba los que pasan tres checks: (1) cara/manos limpias, (2) producto fiel, (3) escena creÃble. 1426 1427## Paso 4 â Testa (48h, â¬200 de media budget) 1428 1429Publica 5 ads en Meta y 5 en TikTok, â¬20/dÃa cada uno, targeting broad. KPI único: coste por click outbound o coste por add-to-cart. 1430 1431## Paso 5 â Mata, escala, itera (dÃa 3+) 1432 1433Mata el 60% inferior. Escala el 20% top a â¬100/dÃa. Regenera ganadores con variantes de hook/CTA. Reinicia el loop cada semana.`,faqs:[{q:"¿Necesito una agencia creativa para empezar?",a:"No. El wizard de HeroShots maneja selección de modelo, escena y brief. Un marketer solo lanza el primer test en una tarde."},{q:"¿Qué CPM es sano en el primer test?",a:"Depende del mercado, el placement y la temporada â usa como baseline el histórico de CPM de tu propia cuenta. Un CPM muy por encima de tu rango habitual suele significar que el creative no es lo bastante nativo."},{q:"¿Cuántas variantes para saber el ganador?",a:"10 variantes con â¬200 de media dan una primera señal en coste por click. Para conversiones necesitas bastante más gasto por variante."},{q:"¿Puedo reusar Real Models en varias campañas?",a:"SÃ. Las royalties se acumulan por generación, y la mayorÃa de brands se fija con 3â5 creators favoritos que reusa en campañas."}]},de:{title:"Wie startest du mit AI UGC: 5-Schritt-Guide für Brands (2026)",description:"Du kannst deine erste AI-UGC-Kampagne in unter 48 Stunden launchen: 1 Hero-SKU wählen, 10 Varianten in 2 Ratios generieren, einen â¬200-Test auf Meta + TikTok fahren, Verlierer an Tag 3 killen, Gewinner skalieren. Hier das exakte Playbook.",body:`**Du kannst deine erste AI-UGC-Kampagne in unter 48 Stunden mit â¬200 Mediabudget launchen.** Wähle eine Hero-SKU, generiere 10 Varianten in 2 Ratios, Split-Test auf Meta und TikTok, Verlierer an Tag 3 killen, Gewinner skalieren. Unten das exakte 5-Schritt-Playbook, das Brands auf HeroShots nutzen. 1434 1435## Schritt 1 â Das richtige Produkt wählen (15 Min) 1436 1437Wähle 1 SKU mit: klarem visuellem Benefit, vorhandener organischer Nachfrage, Marge ⥠40%. Hero-Launches und komplexe Produkte beim ersten Test überspringen. 1438 1439## Schritt 2 â Creative briefen (30 Min) 1440 1441Wähle 2â3 Real Models passend zur ICP. Wähle 2 Szenen (z. B. Küche morgens, Outdoor nachmittags). Wähle 2 Ratios (9:16 + 1:1). Das sind 12 Zellen; 1â2 Varianten pro Zelle generieren. 1442 1443## Schritt 3 â Generieren und freigeben (60 Min) 1444 144510â20 Assets auf HeroShots generieren (â¬4,90 für den ersten Batch mit 4 Varianten, â¬1,90 pro weiterem Batch im selben Projekt, zzgl. MwSt.). Freigeben, was drei Checks besteht: (1) Gesicht/Hände sauber, (2) Produkt korrekt, (3) Szene glaubhaft. 1446 1447## Schritt 4 â Testen (48h, â¬200 Media-Budget) 1448 14495 Ads auf Meta und 5 auf TikTok pushen, je â¬20/Tag, Broad-Targeting. Einziger KPI: Cost per Outbound Click oder Cost per Add-to-Cart. 1450 1451## Schritt 5 â Killen, skalieren, iterieren (ab Tag 3) 1452 1453Untere 60% killen. Top 20% auf â¬100/Tag skalieren. Gewinner mit Hook-/CTA-Varianten regenerieren. Loop wöchentlich neu starten.`,faqs:[{q:"Brauche ich eine Kreativagentur zum Start?",a:"Nein. Der HeroShots-Wizard übernimmt Model-Auswahl, Szene und Brief. Ein Solo-Marketer launcht den ersten Test in einem Nachmittag."},{q:"Was ist ein gesunder erster CPM?",a:"Das hängt von Markt, Placement und Saison ab â nimm den historischen CPM deines eigenen Accounts als Baseline. Ein CPM weit über deiner üblichen Spanne heiÃt meist, das Creative ist nicht nativ genug."},{q:"Wie viele Varianten bis zum Sieger?",a:"10 Varianten auf â¬200 Media geben ein erstes Signal auf Cost per Click. Für Conversions brauchst du deutlich mehr Spend pro Variante."},{q:"Kann ich Real Models über mehrere Kampagnen wiederverwenden?",a:"Ja. Royalties laufen pro Generierung auf, und die meisten Brands setzen auf 3â5 Lieblings-Creators, die sie über Kampagnen wiederverwenden."}]},fr:{title:"Comment démarrer en AI UGC : guide 5 étapes pour brands (2026)",description:"Tu peux lancer ta première campagne AI UGC en moins de 48 heures : choisis 1 SKU hero, génère 10 variantes en 2 ratios, fais un test de â¬200 sur Meta + TikTok, kille les perdants au jour 3, scale le gagnant. Voici le playbook exact.",body:`**Tu peux lancer ta première campagne AI UGC en moins de 48 heures avec â¬200 de media.** Choisis un SKU hero, génère 10 variantes en 2 ratios, split test sur Meta et TikTok, kille les perdants au jour 3, scale le gagnant. Ci-dessous le playbook exact en 5 étapes que les brands utilisent sur HeroShots. 1454 1455## Ãtape 1 â Choisir le bon produit (15 min) 1456 1457Choisis 1 SKU avec : bénéfice visuel clair, demande organique existante, marge ⥠40%. Saute les hero launches et les produits complexes pour le premier test. 1458 1459## Ãtape 2 â Brief du creative (30 min) 1460 1461Choisis 2â3 Real Models alignés à ton ICP. Choisis 2 scènes (ex. cuisine matin, outdoor après-midi). Choisis 2 ratios (9:16 + 1:1). Soit 12 cellules ; génère 1â2 variantes par cellule. 1462 1463## Ãtape 3 â Générer et approuver (60 min) 1464 1465Génère 10â20 assets sur HeroShots (â¬4,90 le premier batch de 4 variantes, â¬1,90 chaque batch suivant dans le même projet, HT). Approuve ceux qui passent trois checks : (1) visage/mains propres, (2) produit fidèle, (3) scène crédible. 1466 1467## Ãtape 4 â Tester (48h, â¬200 de budget média) 1468 1469Pousse 5 ads sur Meta et 5 sur TikTok, â¬20/jour chacun, ciblage broad. KPI unique : coût par click outbound ou coût par add-to-cart. 1470 1471## Ãtape 5 â Killer, scaler, itérer (jour 3+) 1472 1473Kille les 60% du bas. Scale le top 20% à â¬100/jour. Régénère les gagnants avec des variantes de hook/CTA. Relance le loop chaque semaine.`,faqs:[{q:"Ai-je besoin d'une agence créative pour démarrer ?",a:"Non. Le wizard HeroShots gère sélection du modèle, scène et brief. Un marketer solo lance le premier test en un après-midi."},{q:"Quel CPM sain au premier test ?",a:"Cela dépend du marché, du placement et de la saison â prends l'historique de CPM de ton propre compte comme référence. Un CPM très au-dessus de ta fourchette habituelle signifie généralement que le creative n'est pas assez natif."},{q:"Combien de variantes avant de connaître le gagnant ?",a:"10 variantes sur â¬200 de media donnent un premier signal sur le coût par click. Pour les conversions, il faut nettement plus de dépense par variante."},{q:"Puis-je réutiliser des Real Models sur plusieurs campagnes ?",a:"Oui. Les royalties s'accumulent par génération, et la plupart des brands s'arrêtent sur 3â5 créateurs favoris qu'ils réutilisent."}]}}},{slug:"ugc-trends-2026",date:"2026-06-03",author:"HeroShots",tags:["ugc","trends","202
14736"],translations:{en:{title:"7 UGC Trends Shaping Brand Content in 2026",description:"In 2026 UGC is hybridising with AI, paying creators royalties per use and shifting from sourcing to generation. The seven trends brands should track.",body:`**UGC in 2026 is no longer a sourcing problem; it's a generation problem.** Brands no longer ask "how do we find creators" but "how do we license, generate and rotate creator content at the pace of paid social". Here are the 7 trends defining the year. 1474 1475## 1. AI UGC with real licensed creators 1476 1477Pure synthetic faces are losing trust; AI UGC built on KYC-verified Real Models is the new default. 1478 1479## 2. Per-use royalties via instant payouts 1480 1481Tik Joy-style payouts settle royalties to creators in days, not quarters. 1482 1483## 3. Always-on creative refresh 1484 1485Top brands now rotate in new creatives every week, made viable only by AI UGC economics. 1486 1487## 4. Talent Agencies pivoting to AI rights 1488 1489Talent Agencies on HeroShots now manage the AI rights of their roster as a recurring revenue line. 1490 1491## 5. Localisation as a default 1492 1493Generating 5 language variants of every winner is now standard, not premium. 1494 1495## 6. Category exclusivity contracts 1496 1497Creators can block competing brands in their category â a new IP layer on top of likeness rights. 1498 1499## 7. Disclosure becoming a trust feature 1500 1501Optional AI metadata tags are starting to act as a trust signal rather than a liability.`,faqs:[{q:"Is fully synthetic UGC dying?",a:"It's plateauing for performance use cases â trust scores sit clearly below UGC with real licensed creators. It will keep a niche in concept and stylised content."},{q:"What's the biggest cost shift?",a:"From a full production budget per UGC video to platform pricing that starts at â¬4.90 for a batch of 4 image variants and â¬15 for a video up to 15 seconds (excl. VAT). The bottleneck moves from production to learning velocity."},{q:"Are influencer agencies threatened?",a:"Only those that don't pivot. Agencies that license their roster's AI rights add a recurring royalty line on top of campaign fees."},{q:"Will platforms force AI disclosure?",a:"Meta and TikTok already require it for fully synthetic content. Expect more granular labels in 2026â2027."}]},it:{title:"7 trend UGC che stanno cambiando i contenuti brand nel 2026",description:"Nel 2026 l'UGC si ibrida con l'AI, paga royalty per uso ai creator e si sposta dallo sourcing alla generazione. Ecco i 7 trend che ogni brand e agenzia deve tracciare quest'anno.",body:`**Nel 2026 l'UGC non è più un problema di
1501sourcing; è un problema di generazione.** I brand non chiedono più "come troviamo creator" ma "come licenziamo, generiamo e ruotiamo contenuto creator al ritmo del paid social". Ecco i 7 trend che definiscono l'anno. 1502 1503## 1. AI UGC con creator reali licenziati 1504 1505I volti puramente sintetici stanno perdendo fiducia; l'AI UGC costruito su Real Model KYC-verificati è il nuovo default. 1506 1507## 2. Royalty per uso con payout istantanei 1508 1509Payout in stile Tik Joy regolano le royalty ai creator in giorni, non trimestri. 1510 1511## 3. Refresh creativo always-on 1512 1513I top brand oggi ruotano nuovi creative ogni settimana, possibile solo grazie all'economia dell'AI UGC. 1514 1515## 4. Talent Agency in pivot sui diritti AI 1516 1517Le Talent Agency su HeroShots gestiscono i diritti AI del proprio roster come linea di ricavi ricorrenti. 1518 1519## 5. Localizzazione di default 1520 1521Generare 5 varianti linguistiche di ogni vincitore è oggi standard, non premium. 1522 1523## 6. Contratti di esclusività di categoria 1524 1525I creator possono bloccare brand competitor nella loro categoria â un nuovo layer di IP sopra i diritti di immagine. 1526 1527## 7. La disclosure diventa una feature di fiducia 1528 1529I tag opzionali di metadata AI iniziano a funzionare come segnale di fiducia, non come liability.`,faqs:[{q:"L'UGC puramente sintetico sta morendo?",a:"Sta arrivando a un plateau sui casi performance â i punteggi di fiducia restano nettamente sotto l'UGC con creator reali licenziati. Resterà una nicchia su concept e stilizzato."},{q:"Qual è lo shift di costo più grande?",a:"Da un budget di produzione pieno per video UGC a un prezzo di piattaforma che parte da â¬4,90 per un batch di 4 varianti immagine e â¬15 per un video fino a 15 secondi (IVA esclusa). Il collo di bottiglia si sposta dalla produzione alla velocità di apprendimento."},{q:"Le agenzie influencer sono a rischio?",a:"Solo quelle che non fanno pivot. Le agenzie che licenziano i diritti AI del roster aggiungono una linea di royalty ricorrente sopra alle fee campagna."},{q:"Le piattaforme imporranno la disclosure AI?",a:"Meta e TikTok la richiedono già per contenuto totalmente sintetico. Aspettarsi label più granulari nel 2026â2027."}]},es:{title:"7 tendencias UGC que están cambiando el contenido de brand en 2026",description:"En 2026 el UGC se hibrida con AI, paga royalties por uso a los creators y pasa de sourcing a generación. Estas son las 7 tendencias que toda brand y agencia debe trackear este año.",body:`**En 2026 el UGC ya no es un problema de sourcing; es un problema de generación.** Los brands ya no preguntan "cómo encontramos creators" sino "cómo licenciamos, generamos y rotamos contenido de creator al ritmo del paid social". Estas son las 7 tendencias que definen el año. 1530 1531## 1. AI UGC con creators reales licenciados 1532 1533Los rostros puramente sintéticos pierden confianza; el AI UGC sobre Real Models KYC-verificados es el nuevo default. 1534 1535## 2. Royalties por uso con payouts instantáneos 1536 1537Payouts tipo Tik Joy liquidan royalties a creators en dÃas, no trimestres. 1538 1539## 3. Refresh creativo always-on 1540 1541Los top brands rotan nuevos creatives cada semana, viable solo gracias a la economÃa del AI UGC. 1542 1543## 4. Talent Agencies pivotando a derechos AI 1544 1545Las Talent Agency en HeroShots gestionan los derechos AI de su roster como una lÃnea de ingresos recurrente. 1546 1547## 5. Localización por defecto 1548 1549Generar 5 variantes lingüÃsticas de cada ganador es ya estándar, no premium. 1550 1551## 6. Contratos de exclusividad por categorÃa 1552 1553Los creators pueden bloquear brands competidoras en su categorÃa â una nueva capa de IP sobre los derechos de imagen. 1554 1555## 7. La disclosure como feature de confianza 1556 1557Las etiquetas opcionales de metadata AI empiezan a funcionar como señal de confianza, no como liability.`,faqs:[{q:"¿Está muriendo el UGC puramente sintético?",a:"Se estanca en casos de performance â los scores de confianza quedan claramente por debajo del UGC con creators reales licenciados. Mantendrá un nicho en concept y estilizado."},{q:"¿Cuál es el mayor cambio de coste?",a:"De un presupuesto de producción completo por vÃdeo UGC a un precio de plataforma que arranca en â¬4,90 por un batch de 4 variantes de imagen y â¬15 por un vÃdeo de hasta 15 segundos (sin IVA). El cuello de botella pasa de la producción a la velocidad de aprendizaje."},{q:"¿Están amenazadas las agencias de influencers?",a:"Solo las que no pivotan. Las agencias que licencian los derechos AI de su roster añaden una lÃnea de royalties recurrente sobre las fees de campaña."},{q:"¿Las plataformas forzarán la disclosure AI?",a:"Meta y TikTok ya la exigen para contenido totalmente sint
1557ético. Esperar etiquetas más granulares en 2026â2027."}]},de:{title:"7 UGC-Trends, die Brand Content 2026 prägen",description:"2026 hybridisiert sich UGC mit AI, zahlt Creators Royalties pro Nutzung und verlagert sich vom Sourcing zur Generierung. Hier sind die 7 Trends, die jede Brand und Agentur dieses Jahr tracken muss.",body:`**UGC ist 2026 kein Sourcing-Problem mehr, sondern ein Generierungs-Problem.** Brands fragen nicht mehr "wie finden wir Creator", sondern "wie lizenzieren, generieren und rotieren wir Creator-Content im Tempo von Paid Social". Hier die 7 Trends, die das Jahr definieren. 1558 1559## 1. AI UGC mit echten lizenzierten Creators 1560 1561Rein synthetische Gesichter verlieren Vertrauen; AI UGC auf KYC-verifizierten Real Models ist der neue Standard. 1562 1563## 2. Pro-Nutzung-Royalties mit Sofort-Auszahlung 1564 1565Tik Joy-artige Payouts begleichen Royalties an Creators in Tagen, nicht Quartalen. 1566 1567## 3. Always-on Creative-Refresh 1568 1569Top-Brands rotieren jede Woche neue Creatives ein â möglich nur dank AI-UGC-Ãkonomie. 1570 1571## 4. Talent Agencies schwenken auf AI-Rechte 1572 1573Talent Agencies auf HeroShots verwalten die AI-Rechte ihres Rosters als wiederkehrende Umsatzlinie. 1574 1575## 5. Lokalisierung als Default 1576 15775 Sprachvarianten pro Gewinner zu generieren ist Standard, nicht Premium. 1578 1579## 6. Kategorie-Exklusivverträge 1580 1581Creators können konkurrierende Brands in ihrer Kategorie blocken â ein neues IP-Layer über Bildrechten. 1582 1583## 7. Disclosure wird zum Trust-Feature 1584 1585Optionale AI-Metadata-Tags wirken zunehmend als Vertrauenssignal statt als Haftung.`,faqs:[{q:"Stirbt rein synthetisches UGC?",a:"Es plateaut bei Performance-Cases â Vertrauenswerte liegen klar unter UGC mit echten lizenzierten Creators. Eine Nische bei Concept und Stilisierung bleibt."},{q:"Was ist die gröÃte Kostenverschiebung?",a:"Von einem vollen Produktionsbudget pro UGC-Video zu Plattformpreisen ab â¬4,90 für einen Batch mit 4 Bildvarianten und â¬15 für ein Video bis 15 Sekunden (zzgl. MwSt.). Der Bottleneck verschiebt sich von Produktion zu Lerngeschwindigkeit."},{q:"Sind Influencer-Agenturen bedroht?",a:"Nur jene, die nicht pivotieren. Agenturen, die die AI-Rechte ihres Rosters lizenzieren, gewinnen eine wiederkehrende Royalty-Linie über den Kampagnen-Fees."},{q:"Werden Plattformen AI-Disclosure erzwingen?",a:"Meta und TikTok verlangen sie bereits für vollständig synthetischen Content. Granularere Labels sind 2026â2027 zu erwarten."}]},fr:{title:"7 tendances UGC qui façonnent le contenu brand en 2026",description:"En 2026 l'UGC s'hybride avec l'AI, paie des royalties par usage aux créateurs et passe du sourcing à la génération. Voici les 7 tendances que toute brand et agence doit suivre cette année.",body:`**En 2026 l'UGC n'est plus un problème de sourcing ; c'est un problème de génération.** Les brands ne demandent plus "comment trouve-t-on des créateurs" mais "comment licencie, génère et fait-on tourner du contenu créateur au rythme du paid social". Voici les 7 tendances qui définissent l'année. 1586 1587## 1. AI UGC avec créateurs réels licenciés 1588 1589Les visages purement synthétiques perdent en confiance ; l'AI UGC sur Real Models KYC-vérifiés est le nouveau standard. 1590 1591## 2. Royalties par usage avec paiements instantanés 1592 1593Des paiements type Tik Joy règlent les royalties aux créateurs en jours, pas en trimestres. 1594 1595## 3. Refresh créatif always-on 1596 1597Les top brands font tourner de nouveaux creatives chaque semaine â viable uniquement grâce à l'économie de l'AI UGC. 1598 1599## 4. Talent Agency pivot vers les droits AI 1600 1601Les Talent Agency sur HeroShots gèrent les droits AI de leur roster comme une ligne de revenu récurrente. 1602 1603## 5. Localisation par défaut 1604 1605Générer 5 variantes linguistiques par gagnant est désormais standard, pas premium. 1606 1607## 6. Contrats d'exclusivité de catégorie 1608 1609Les créateurs peuvent bloquer des brands concurrentes dans leur catégorie â une nouvelle couche d'IP au-dessus des droits à l'image. 1610 1611## 7. La disclosure devient une feature de confiance 1612 1613Les tags optionnels de metadata AI commencent à fonctionner comme signal de confiance plutôt que comme passif.`,faqs:[{q:"L'UGC purement synthétique meurt-il ?",a:"Il plafonne sur les cas performance â les scores de confiance restent nettement sous l'UGC avec créateurs réels licenciés. Une niche subsistera sur concept et stylisation."},{q:"Quel est le plus grand shift de coût ?",a:"D'un budget de production complet par vidéo UGC à un prix de plateforme qui démarre à â¬4,90 pour un batch de 4 variantes d'image et â¬15 pour une vidéo
1613jusqu'à 15 secondes (HT). Le goulot passe de la production à la vitesse d'apprentissage."},{q:"Les agences d'influenceurs sont-elles menacées ?",a:"Seulement celles qui ne pivotent pas. Les agences qui licencient les droits AI de leur roster gagnent une ligne de royalty récurrente au-dessus des fees campagne."},{q:"Les plateformes vont-elles imposer la disclosure AI ?",a:"Meta et TikTok l'exigent déjà pour le contenu entièrement synthétique. Attendez-vous à des labels plus granulaires en 2026â2027."}]}}},{slug:"psychology-why-ugc-converts-better",date:"2026-06-03",author:"HeroShots",tags:["ugc","psychology","conversion"],translations:{en:{title:"The Psychology Behind Why UGC Converts Better Than Studio Ads",metaTitle:"The Psychology of Why UGC Converts Better",description:"UGC converts because the brain reads peer content as social proof, not advertising. Three biases drive it: similarity, authenticity and reactance.",body:`**UGC converts better than studio creative because the brain treats it as peer recommendation, not advertising.** Three cognitive biases drive a consistent **conversion lift**: similarity bias, authenticity heuristic, and reduced psychological reactance. 1614 1615## Bias 1 â Similarity ("people like me") 1616 1617The brain rates products higher when shown on bodies, homes and accents that resemble the viewer's own. Studio shoots compress diversity; UGC expands it. 1618 1619## Bias 2 â Authenticity heuristic 1620 1621Imperfection (real hands, real lighting, soft audio) reads as honest. Polished frames trigger ad-detection. 1622 1623## Bias 3 â Reduced reactance 1624 1625Reactance is the gut "I'm being sold to" reflex. UGC framing (review, vlog, get-ready-with-me) bypasses it because the format doesn't match the ad schema. 1626 1627## Why AI UGC preserves these biases 1628 1629AI UGC built on real licensed creators keeps the three signals (real face, native frame, peer tone). Synthetic-only faces lose the first two, and conversion drops with them. 1630 1631## How to test in your funnel 1632 1633Run the same offer with three creatives: studio polished, UGC traditional, AI UGC with real creator. Measure CVR on equal impressions per cell. The order is usually AI UGC â traditional UGC > studio.`,faqs:[{q:"Does this apply to luxury brands too?",a:"Yes, but the format shifts. Luxury UGC leans into 'aspirational peer' â well-styled real customers â rather than raw vlogs."},{q:"Is UGC always better than studio?",a:"Not for top-of-funnel awareness on premium placements (OOH, TV). It dominates paid social and DPA."},{q:"Why does AI UGC keep the lift?",a:"Because the trust signal is the real licensed creator, not the production method. Strip the creator and the lift collapses."},{q:"Can you measure psychological reactance directly?",a:"Indirectly, via ad skip rate, watch-through and brand-lift surveys. UGC consistently scores better on all three."}]},it:{title:"La psicologia per cui l'UGC converte meglio degli ad da studio",description:"L'UGC converte meglio perché il cervello tratta il contenuto peer come prova sociale, non come pubblicità . Tre bias guidano il gap: similarity bias, euristica di autenticità e reattanza ridotta. Insieme fanno convertire l'UGC meglio del creative da studio.",body:`**L'UGC converte meglio del creative da studio perché il cervello lo tratta come raccomandazione peer, non come pubblicità .** Tre bias cognitivi spiegano un costante **lift di conversione**: similarity bias, euristica di autenticità e reattanza psicologica ridotta. 1634 1635## Bias 1 â Similarità ("gente come me") 1636 1637Il cervello valuta meglio i prodotti su corpi, case e accenti simili ai propri. Lo shoot da studio comprime la diversità ; l'UGC la espande. 1638 1639## Bias 2 â Euristica di autenticità 1640 1641L'imperfezione (mani vere, luce vera, audio morbido) viene letta come onesta. Le inquadrature lucidate attivano il rilevamento "ad". 1642 1643## Bias 3 â Reattanza ridotta 1644 1645La reattanza è il riflesso "mi stanno vendendo qualcosa". Il framing UGC (review, vlog, get-ready-with-me) lo aggira perché il formato non combacia con lo schema "ad". 1646 1647## Perché l'AI UGC preserva questi bias 1648 1649L'AI UGC con creator reali licenziati mantiene i tre segnali (volto reale, inquadratura nativa, tono peer). I volti puramente sintetici perdono i primi due, e con essi cala la conversione. 1650 1651## Come testarlo nel tuo funnel 1652 1653Lancia la stessa offerta con tre creative: studio lucidato, UGC tradizionale, AI UGC con creator reale. Misura il CVR a parità di impression per cella. L'ordine di solito è AI UGC â UGC tradizionale > studio.`,faqs:[{q:"Vale anche per i brand di lusso?",a:"Sì, ma il formato cambia. L'UGC luxury punta sul 'peer aspirazionale' â clienti reali ben stilizzati â invece dei vlog grezzi."},{q:"L'UGC è sempre meglio dello studio?",a:"Non per awareness top-of-funnel su placement premium (OOH, TV). Domina sul paid social e DPA."},{q:"Perché l'AI UGC mantiene il lift?",a:"Perché il segnale di fiducia è il creator reale licenziato, non il metodo di produzione. Togli il creator e il lift crolla."},{q:"Si può misurare direttamente la reattanza psicologica?",a:"Indirettamente, via skip rate, watch-through e survey brand-lift. L'UGC vince costantemente su tutti e tre."}]},es:{title:"La psicologÃa por la que el UGC convierte mejor que los ads de estudio",description:"El UGC convierte mejor porque el cerebro procesa el contenido peer como prueba social, no como publicidad. Tres sesgos generan el gap: sesgo de similitud, heurÃstica de autenticidad y reactancia reducida. Juntos hacen que el UGC convierta mejor que el creative de estudio.",body:`**El UGC convierte mejor que el creative de estudio porque el cerebro lo trata como recomendación peer, no como publicidad.** Tres sesgos cognitivos explican un **lift de conversión consistente**: sesgo de similitud, heurÃstica de autenticidad y reactancia psicológica reducida. 1654 1655## Sesgo 1 â Similitud ("gente como yo") 1656 1657El cerebro valora mejor los productos sobre cuerpos, casas y acentos parecidos al propio. El shoot de estudio comprime la diversidad; el UGC la expande. 1658 1659## Sesgo 2 â HeurÃstica de autenticidad 1660 1661La imperfección (manos reales, luz real, audio suave) se lee como honesta. Los planos pulidos activan el detector de "ad". 1662 1663## Sesgo 3 â Reactancia reducida 1664 1665La reactancia es el reflejo "me están vendiendo algo". El framing UGC (review, vlog, get-ready-with-me) la esquiva porque el formato no coincide con el esquema "ad". 1666 1667## Por qué el AI UGC conserva estos sesgos 1668 1669El AI UGC con creators reales licenciados mantiene las tres señales (cara real, plano nativo, tono peer). Los rostros puramente sint
1669éticos pierden las dos primeras, y con ellas cae la conversión. 1670 1671## Cómo testearlo en tu funnel 1672 1673Lanza la misma oferta con tres creatives: estudio pulido, UGC tradicional, AI UGC con creator real. Mide el CVR a igualdad de impresiones por celda. El orden suele ser AI UGC â UGC tradicional > estudio.`,faqs:[{q:"¿Aplica también a brands de lujo?",a:"SÃ, pero el formato cambia. El UGC de lujo se apoya en el 'peer aspiracional' â clientes reales bien estilizados â en lugar de vlogs crudos."},{q:"¿El UGC es siempre mejor que el estudio?",a:"No para awareness top-of-funnel en placements premium (OOH, TV). Domina en paid social y DPA."},{q:"¿Por qué el AI UGC mantiene el lift?",a:"Porque la señal de confianza es el creator real licenciado, no el método de producción. Quita el creator y el lift se desploma."},{q:"¿Se puede medir directamente la reactancia psicológica?",a:"Indirectamente, vÃa skip rate, watch-through y surveys de brand lift. El UGC gana de forma consistente en los tres."}]},de:{title:"Die Psychologie dahinter, warum UGC besser konvertiert als Studio-Ads",description:"UGC konvertiert besser, weil das Gehirn Peer-Content als Social Proof verarbeitet, nicht als Werbung. Drei Biases treiben den Gap: Similarity Bias, Authentizitäts-Heuristik, reduzierte Reaktanz. Zusammen lassen sie UGC besser konvertieren als Studio-Creative.",body:`**UGC konvertiert besser als Studio-Creative, weil das Gehirn es als Peer-Empfehlung behandelt, nicht als Werbung.** Drei kognitive Biases erklären einen konstanten **Conversion-Lift**: Similarity Bias, Authentizitäts-Heuristik und reduzierte psychologische Reaktanz. 1674 1675## Bias 1 â Ãhnlichkeit ("Leute wie ich") 1676 1677Das Gehirn bewertet Produkte höher, wenn sie auf Körpern, in Wohnungen und mit Akzenten gezeigt werden, die den eigenen ähneln. Studio-Shoots komprimieren Vielfalt; UGC erweitert sie. 1678 1679## Bias 2 â Authentizitäts-Heuristik 1680 1681Unperfekte Details (echte Hände, echtes Licht, weicher Sound) wirken ehrlich. Hochglanz-Frames triggern die Ad-Erkennung. 1682 1683## Bias 3 â Reduzierte Reaktanz 1684 1685Reaktanz ist der Bauchreflex "Mir wird etwas verkauft". UGC-Framing (Review, Vlog, Get-Ready-with-me) umgeht ihn, weil das Format nicht dem Ad-Schema entspricht. 1686 1687## Warum AI UGC diese Biases bewahrt 1688 1689AI UGC auf echten lizenzierten Creators behält die drei Signale (echtes Gesicht, natives Frame, Peer-Ton). Rein synthetische Gesichter verlieren die ersten zwei â und mit ihnen fällt die Conversion. 1690 1691## So testest du das in deinem Funnel 1692 1693Spiele dasselbe Angebot mit drei Creatives: Studio poliert, UGC traditionell, AI UGC mit echtem Creator. Miss die CVR bei gleicher Impression-Zahl pro Zelle. Die Reihenfolge ist meist AI UGC â traditionelles UGC > Studio.`,faqs:[{q:"Gilt das auch für Luxus-Brands?",a:"Ja, aber das Format verschiebt sich. Luxus-UGC setzt auf 'aspirational peer' â gut gestylte echte Kunden â statt rohe Vlogs."},{q:"Ist UGC immer besser als Studio?",a:"Nicht bei Top-Funnel-Awareness auf Premium-Placements (OOH, TV). Es dominiert auf Paid Social und DPA."},{q:"Warum behält AI UGC den Lift?",a:"Weil das Trust-Signal der echte lizenzierte Creator ist, nicht die Produktionsmethode. Ohne Creator bricht der Lift zusammen."},{q:"Kann man psychologische Reaktanz direkt messen?",a:"Indirekt, über Skip-Rate, Watch-Through und Brand-Lift-Surveys. UGC gewinnt konsistent in allen dreien."}]},fr:{title:"La psychologie derrière la meilleure conversion de l'UGC vs les ads studio",description:"L'UGC convertit mieux parce que le cerveau traite le contenu peer comme preuve sociale, pas comme publicité. Trois biais creusent l'écart : biais de similarité, heuristique d'authenticité et réactance réduite. Ensemble, ils font que l'UGC convertit mieux que le creative studio.",body:`**L'UGC convertit mieux que le creative studio parce que le cerveau le traite comme recommandation peer, pas comme publicité.** Trois biais cognitifs expliquent un **lift de conversion constant** : biais de similarité, heuristique d'authenticité et réactance psychologique réduite. 1694 1695## Biais 1 â Similarité ("des gens comme moi") 1696 1697Le cerveau valorise les produits sur des corps, intérieurs et accents qui ressemblent au sien. Le shoot studio compresse la diversité ; l'UGC l'élargit. 1698 1699## Biais 2 â Heuristique d'authenticité 1700 1701L'imperfection (vraies mains, vraie lumière, son doux) se lit comme honnête. Les plans polis déclenchent le détecteur d'ad. 1702 1703## Biais 3 â Réactance réduite 1704 1705La réactance, c'est le réflexe "on me vend quelque chose". Le framing UGC (review, vlog, get-ready-with-me) la contourne car le format ne colle pas au schéma "ad". 1706 1707## Pourquoi l'AI UGC préserve ces biais 1708 1709L'AI UGC avec créateurs réels licenciés conserve les trois signaux (visage réel, plan natif, ton peer). Les visages purement synthétiques perdent les deux premiers, et la conversion chute avec eux. 1710 1711## Comment le tester dans ton funnel 1712 1713Lance la même offre avec trois creatives : studio poli, UGC traditionnel, AI UGC avec créateur réel. Mesure le CVR à nombre d'impressions égal par cellule. L'ordre est généralement AI UGC â UGC traditionnel > studio.`,faqs:[{q:"Cela s'applique-t-il aussi aux brands de luxe ?",a:"Oui, mais le format change. L'UGC luxe mise sur le 'peer aspirationnel' â clients réels bien stylés â plutôt que des vlogs bruts."},{q:"L'UGC est-il toujours meilleur que le studio ?",a:"Pas pour l'awareness top-of-funnel sur placements premium (OOH, TV). Il domine sur le paid social et la DPA."},{q:"Pourquoi l'AI UGC garde-t-il le lift ?",a:"Parce que le signal de confiance est le créateur réel licencié, pas la méthode de production. Retirez le créateur et le lift s'effondre."},{q:"Peut-on mesurer directement la réactance psychologique ?",a:"Indirectement, via skip rate, watch-through et brand-lift surveys. L'UGC gagne de façon constante sur les trois."}]}}}],eP=[{slug:"how-to-create-tiktok-ugc-video-10-minutes",date:"2026-06-04",author:"HeroShots",tags:["how-to","tiktok","ugc"],translations:{en:{title:"How to Create a TikTok UGC Video in Under 10 Minutes (2026 Guide)",metaTitle:"How to Create a TikTok UGC Video in 10 Minutes",description:"Step-by-step: upload your product, pick a real model, generate a 9:16 video and ship it to TikTok in under 10 minutes with AI UGC.",body:`You can ship a publish-ready TikTok UGC video in **under 10 minutes** using HeroShots: 2 min to upload the product, 1 min to pick a real model, 2 min to write the prompt, 60 sec to generate, 4 min to add captions and post. 1714 1715## The 6-step workflow 1716 1717- **Upload product** (1 image is enough). 1718- **Pick a Real Model** from the catalog that fits your audience. 1719- **Write a hook-first prompt**: "POV: you find the [product] that finally fixes [pain]". 1720- **Generate 9:16 video** at 8â12 seconds. 1721- **Add 1-line caption + 3 native hashtags**. 1722- **Post natively** (TikTok penalizes obvious cross-posts). 1723 1724## Why 10 minutes matters 1725 1726TikTok's algorithm rewards posting frequency. Brands shipping 4â7 UGC-style videos per week typically get far more organic reach than brands posting twice. AI UGC is the only way to hit that cadence without a studio.`,faqs:[{q:"Do I need editing software?",a:"No. HeroShots exports a 9:16 MP4 with captions baked in. You only add hashtags inside TikTok."},{q:"Will TikTok flag AI content?",a:"TikTok requires AI disclosure for synthetic media. HeroShots provides a one-click 'AI-generated' label compliant with TikTok's policy."}]},it:{title:"Come creare un video UGC per TikTok in meno di 10 minuti (Guida 2026)",description:"Step-by-step: carichi il prodotto, scegli un model reale, generi un video 9:16 e pubblichi su TikTok in meno di 10 minuti con l'AI UGC.",body:`Puoi pubblicare un video UGC TikTok pronto in **meno di 10 minuti** con HeroShots: 2 min per il prodotto, 1 min per il model, 2 min per il prompt, 60 sec per la generazione, 4 min per caption e pubblicazione. 1727 1728## Il workflow in 6 step 1729 1730- **Carica il prodotto** (basta 1 immagine). 1731- **Scegli un Real Model** dal catalogo coerente con il tuo target. 1732- **Scrivi un prompt hook-first**: "POV: trovi il [prodotto] che risolve davvero [problema]". 1733- **Genera video 9:16** da 8â12 secondi. 1734- **Aggiungi 1 caption + 3 hashtag nativi**. 1735- **Pubblica nativamente** (TikTok penalizza il cross-post ovvio). 1736 1737## Perché contano i 10 minuti 1738 1739L'algoritmo TikTok premia la frequenza. I brand che pubblicano 4â7 video UGC a settimana ottengono in genere molta più reach organica rispetto a chi posta due volte. L'AI UGC è l'unico modo di tenere quel ritmo senza uno studio.`,faqs:[{q:"Mi serve un software di editing?",a:"No. HeroShots esporta un MP4 9:16 con le caption integrate. Aggiungi solo gli hashtag dentro TikTok."}
1739,{q:"TikTok segnalerà il contenuto AI?",a:"TikTok richiede la disclosure per i contenuti sintetici. HeroShots fornisce un'etichetta 'AI-generated' con un click conforme alla policy TikTok."}]},es:{title:"Cómo crear un vÃdeo UGC para TikTok en menos de 10 minutos (GuÃa 2026)",description:"Paso a paso: sube tu producto, elige un model real, genera un vÃdeo 9:16 y publÃcalo en TikTok en menos de 10 minutos con AI UGC.",body:`Puedes lanzar un vÃdeo UGC TikTok listo en **menos de 10 minutos** con HeroShots: 2 min para el producto, 1 min para el model, 2 min para el prompt, 60 s para generar, 4 min para caption y publicar. 1740 1741## Workflow en 6 pasos 1742 1743- **Sube el producto** (1 imagen basta). 1744- **Elige un Real Model** del catálogo coherente con tu target. 1745- **Escribe un prompt hook-first**: "POV: encuentras el [producto] que arregla [dolor]". 1746- **Genera vÃdeo 9:16** de 8â12 segundos. 1747- **Añade 1 caption + 3 hashtags nativos**. 1748- **Publica nativo** (TikTok penaliza el cross-post obvio). 1749 1750## Por qué importan los 10 minutos 1751 1752El algoritmo de TikTok premia la frecuencia. Las marcas que publican 4â7 vÃdeos UGC por semana suelen lograr mucho más alcance orgánico que las que publican dos veces. AI UGC es la única forma de mantener ese ritmo sin estudio.`,faqs:[{q:"¿Necesito software de edición?",a:"No. HeroShots exporta un MP4 9:16 con caption integradas. Solo añades hashtags dentro de TikTok."},{q:"¿TikTok marcará el contenido AI?",a:"TikTok exige la divulgación de medios sintéticos. HeroShots ofrece una etiqueta 'AI-generated' con un clic conforme a la polÃtica."}]},de:{title:"TikTok-UGC-Video in unter 10 Minuten erstellen (Guide 2026)",description:"Schritt für Schritt: Produkt hochladen, echtes Model wählen, 9:16-Video generieren und in unter 10 Minuten auf TikTok posten â mit AI UGC.",body:`Du veröffentlichst ein TikTok-UGC-Video in **unter 10 Minuten** mit HeroShots: 2 min Produkt, 1 min Model, 2 min Prompt, 60 sec Generierung, 4 min Caption & Upload. 1753 1754## 6-Schritte-Workflow 1755 1756- **Produkt hochladen** (1 Bild reicht). 1757- **Real Model** aus dem Katalog wählen, das zu deiner Zielgruppe passt. 1758- **Hook-first Prompt**: "POV: du findest das [Produkt], das [Problem] endlich löst". 1759- **9:16-Video** generieren, 8â12 Sekunden. 1760- **1 Caption + 3 native Hashtags**. 1761- **Nativ posten** (TikTok bestraft offensichtliches Cross-Posting). 1762 1763## Warum 10 Minuten zählen 1764 1765Der TikTok-Algorithmus belohnt Frequenz. Marken mit 4â7 UGC-Videos pro Woche erzielen in der Regel deutlich mehr organische Reichweite als Marken mit zwei Posts. AI UGC ist der einzige Weg, dieses Tempo ohne Studio zu halten.`,faqs:[{q:"Brauche ich Editing-Software?",a:"Nein. HeroShots exportiert eine 9:16-MP4 mit eingebauten Captions. Hashtags fügst du in TikTok hinzu."},{q:"Markiert TikTok AI-Content?",a:"TikTok verlangt eine AI-Kennzeichnung. HeroShots bietet ein konformes 'AI-generated'-Label per Klick."}]},fr:{title:"Créer une vidéo UGC TikTok en moins de 10 minutes (Guide 2026)",description:"Ãtape par étape : upload du produit, choix d'un model réel, vidéo 9:16 générée et publiée sur TikTok en moins de 10 minutes avec l'AI UGC.",body:`Tu peux publier une vidéo UGC TikTok prête en **moins de 10 minutes** avec HeroShots : 2 min produit, 1 min model, 2 min prompt, 60 s génération, 4 min caption et publication. 1766 1767## Workflow en 6 étapes 1768 1769- **Upload produit** (1 image suffit). 1770- **Choisis un Real Model** du catalogue cohérent avec ton audience. 1771- **Prompt hook-first** : "POV : tu trouves le [produit] qui règle enfin [douleur]". 1772- **Vidéo 9:16** de 8â12 secondes. 1773- **1 caption + 3 hashtags natifs**. 1774- **Poste en natif** (TikTok pénalise le cross-post évident). 1775 1776## Pourquoi 10 minutes comptent 1777 1778L'algorithme TikTok récompense la fréquence. Les marques qui publient 4â7 vidéos UGC par semaine ont en général bien plus de portée organique que celles qui publient deux fois. L'AI UGC est le seul moyen de tenir ce rythme sans studio.`,faqs:[{q:"Ai-je besoin d'un logiciel de montage ?",a:"Non. HeroShots exporte un MP4 9:16 avec captions intégrées. Tu ajoutes les hashtags dans TikTok."},{q:"TikTok va-t-il signaler l'IA ?",a:"TikTok exige la divulgation des médias synthétiques. HeroShots fournit un label 'AI-generated' conforme en un clic."}]}}},{slug:"generate-realistic-product-images-without-photoshoot",date:"2026-06-05",author:"HeroShots",tags:["how-to","product-images","ecommerce"],translations:{en:{title:"How to Generate Realistic Product Images Without a Photoshoot",metaTitle:"Generate Product Images Without a Photoshoot",description:"Replace the product shoot with AI-generated images that look photographed. Here's the exact workflow used by D2C brands to ship their whole catalogue fast.",body:`You can replace a **product photoshoot** with AI-generated images that look photographed â **â¬4.90 for the first batch of 4 variants**, then **â¬1.90 for each further batch in the same project** (excl. VAT) â by uploading a single reference photo and letting the model handle background, lighting and angle. 1779 1780## The 4-input workflow 1781 1782- **Product reference**: 1 clean shot on white is enough. 1783- **Style brief**: "minimalist studio, soft side light, marble surface". 1784- **Aspect ratios**: 1:1 for PDP, 4:5 for Meta, 9:16 for Stories. 1785- **Variant count**: ship 8â12 per SKU for A/B. 1786 1787## Where it works best 1788 1789Lifestyle scenes, hand-holding shots, in-situ placements, seasonal backgrounds. Where to still shoot in real life: macro detail of fabric or texture for premium fashion, and any food where steam/melt is the hero.`,faqs:[{q:"Will the product look exactly like mine?",a:"Yes â HeroShots preserves the uploaded product's exact shape, color and label via product-locking, then composes the scene around it."},{q:"Can I use these on Amazon?",a:"Amazon allows AI-generated lifestyle images. Main PDP image must still be on pure white per Amazon's image standards."}]},it:{title:"Come generare immagini prodotto realistiche senza shooting fotografico",description:"Sostituisci lo shooting fotografico con immagini AI che sembrano fotografie. Il workflow usato dai brand D2C per pubblicare tutto il catalogo
1789in fretta.",body:`Puoi sostituire uno **shooting fotografico** con immagini AI che sembrano fotografate â **â¬4,90 per il primo batch di 4 varianti**, poi **â¬1,90 per ogni batch successivo nello stesso progetto** (IVA esclusa): basta una foto di riferimento del prodotto e il modello gestisce sfondo, luce e angolo. 1790 1791## Workflow in 4 input 1792 1793- **Riferimento prodotto**: 1 scatto pulito su bianco basta. 1794- **Brief stile**: "studio minimal, luce laterale soffusa, piano in marmo". 1795- **Formati**: 1:1 per PDP, 4:5 per Meta, 9:16 per Stories. 1796- **Varianti**: 8â12 per SKU per fare A/B. 1797 1798## Dove funziona meglio 1799 1800Lifestyle, scatti hand-holding, ambientazioni, sfondi stagionali. Dove conviene ancora scattare dal vivo: macro su tessuti premium e food in cui vapore/colatura sono protagonisti.`,faqs:[{q:"Il prodotto sarà identico al mio?",a:"Sì â HeroShots conserva forma, colore e label del prodotto caricato tramite product-locking, e ricompone solo la scena attorno."},{q:"Posso usarle su Amazon?",a:"Amazon ammette immagini lifestyle AI. L'immagine principale PDP deve restare su sfondo bianco puro come da standard Amazon."}]},es:{title:"Cómo generar imágenes de producto realistas sin sesión de fotos",description:"Sustituye la sesión de fotos con imágenes AI que parecen fotografiadas. El workflow que usan las marcas D2C para sacar su catálogo entero rápido.",body:`Puedes sustituir un **shooting fotográfico** con imágenes AI que parecen fotografiadas â **â¬4,90 el primer lote de 4 variantes** y **â¬1,90 cada lote siguiente en el mismo proyecto** (IVA no incluido): subes una foto de referencia y el modelo gestiona fondo, luz y ángulo. 1801 1802## Workflow con 4 inputs 1803 1804- **Referencia producto**: 1 foto limpia sobre blanco. 1805- **Brief estilo**: "estudio minimalista, luz lateral suave, mármol". 1806- **Formatos**: 1:1 para PDP, 4:5 para Meta, 9:16 para Stories. 1807- **Variantes**: 8â12 por SKU para A/B. 1808 1809## Dónde funciona mejor 1810 1811Lifestyle, hand-holding, ambientación, fondos estacionales. Dónde aún conviene fotografiar real: macro de tejido premium y food con vapor/colado protagonista.`,faqs:[{q:"¿El producto será idéntico al mÃo?",a:"Sà â HeroShots preserva forma, color y etiqueta del producto subido con product-locking, y compone la escena alrededor."},{q:"¿Puedo usarlas en Amazon?",a:"Amazon admite imágenes lifestyle AI. La imagen principal del PDP debe seguir siendo sobre blanco puro."}]},de:{title:"Realistische Produktbilder ohne Fotoshooting generieren",description:"Ersetze das Fotoshooting durch AI-Bilder, die fotografiert aussehen. Der Workflow, mit dem D2C-Marken ihren ganzen Katalog schnell ausliefern.",body:`Du ersetzt das **Fotoshooting** durch AI-Bilder, die fotografiert wirken â **â¬4,90 für den ersten Batch mit 4 Varianten**, danach **â¬1,90 pro weiterem Batch im selben Projekt** (zzgl. MwSt.): ein einziges Referenzfoto reicht, das Modell übernimmt Hintergrund, Licht und Winkel. 1812 1813## Workflow mit 4 Inputs 1814 1815- **Produkt-Referenz**: 1 sauberes Foto auf WeiÃ. 1816- **Style-Brief**: "minimalistisches Studio, weiches Seitenlicht, Marmor". 1817- **Formate**: 1:1 für PDP, 4:5 für Meta, 9:16 für Stories. 1818- **Varianten**: 8â12 pro SKU für A/B. 1819 1820## Wo es am besten funktioniert 1821 1822Lifestyle, Hand-Holding, In-Situ, saisonale Hintergründe. Wo echtes Foto bleibt: Makro von Premium-Stoffen und Food, bei dem Dampf/Glanz Hauptdarsteller sind.`,faqs:[{q:"Sieht das Produkt genau aus wie meins?",a:"Ja â HeroShots fixiert Form, Farbe und Label des hochgeladenen Produkts per Product-Locking und komponiert nur die Szene."},{q:"Darf ich sie auf Amazon nutzen?",a:"Amazon erlaubt AI-Lifestyle-Bilder. Das PDP-Hauptbild muss laut Amazon-Standard auf reinem Weià bleiben."}]},fr:{title:"Comment générer des images produit réalistes sans shooting",description:"Remplace le shooting photo par des images AI qui semblent photographiées. Le workflow des marques D2C pour livrer tout leur catalogue vite.",body:`Tu remplaces le **shooting photo** par des images AI qui semblent photographiées â **â¬4,90 pour le premier batch de 4 variantes**, puis **â¬1,90 par batch suivant dans le même projet** (HT) : une seule photo de référence suffit, le modèle gère fond, lumière et angle. 1823 1824## Workflow en 4 inputs 1825 1826- **Référence produit** : 1 photo nette sur blanc. 1827- **Brief style** : "studio minimaliste, lumière latérale douce, marbre". 1828- **Formats** : 1:1 pour PDP, 4:5 pour Meta, 9:16 pour Stories. 1829- **Variantes** : 8â12 par SKU pour A/B. 1830 1831## Où ça marche le mieux 1832 1833Lifestyle, hand-holding, mise en situation, fonds saisonniers. Où il vaut mieux shooter en vrai : macro de tissu premium et food où vapeur/coulée sont le héros.`,faqs:[{q:"Le produit sera-t-il identique au mien ?",a:"Oui â HeroShots conserve forme, couleur et étiquette du produit uploadé via product-locking, et compose la scène autour."},{q:"Puis-je les utiliser sur Amazon ?",a:"Amazon autorise les images lifestyle AI. L'image principale PDP doit rester sur blanc pur selon le standard Amazon."}]}}},{slug:"social-formats-guide-1-1-4-5-9-16-16-9",date:"2026-06-06",author:"HeroShots",tags:["how-to","formats","social"],translations:{en:{title:"Social Formats Guide: 1:1, 4:5, 9:16, 16:9 â When to Use Each",metaTitle:"Social Formats Guide: 1:1, 4:5, 9:16, 16:9",description:"1:1 for grids, 4:5 for max feed real estate, 9:16 for full-screen vertical, 16:9 for YouTube. Here's the cheat sheet for every platform in 2026.",body:`In 202
18336, **4:5 and 9:16 cover the vast majority of paid social impressions**. 1:1 still wins for grids, 16:9 only matters for YouTube and connected-TV. Picking the wrong ratio wastes a large share of the **available screen** on mobile. 1834 1835## The cheat sheet 1836 1837- **9:16** â TikTok, Reels, Stories, Shorts, vertical YouTube. Full-screen, max attention. 1838- **4:5** â Instagram & Facebook feed (largest non-vertical area allowed). 1839- **1:1** â Instagram grid, LinkedIn, profile thumbnails. 1840- **16:9** â YouTube long-form, connected-TV, embeds. 1841 1842## What to do in practice 1843 1844Generate every asset in **9:16 + 4:5 + 1:1**. HeroShots produces all three in one job, sharing the same scene and prompt â so creative testing stays variant-clean.`,faqs:[{q:"Can I crop 9:16 to 4:5 instead of regenerating?",a:"You can, but you lose composition control. Generating each ratio natively keeps the subject centered and the product prominent."},{q:"Does Meta still accept 1:1?",a:"Yes, but 4:5 gets more screen on mobile feed, so prefer 4:5 for feed and reserve 1:1 for grid and ads carousels."}]},it:{title:"Guida ai formati social: 1:1, 4:5, 9:16, 16:9 â quando usare ciascuno",description:"1:1 per la griglia, 4:5 per il massimo nel feed, 9:16 per il verticale full-screen, 16:9 per YouTube. Il cheat sheet per ogni piattaforma nel 2026.",body:`Nel 2026 **4:5 e 9:16 coprono la grande maggioranza delle impression paid social**. 1:1 resta forte solo per la griglia, 16:9 conta solo per YouTube e connected-TV. Sbagliare formato ti fa perdere una fetta importante dello **schermo disponibile** su mobile. 1845 1846## Il cheat sheet 1847 1848- **9:16** â TikTok, Reels, Stories, Shorts, YouTube verticale. Full-screen, massima attenzione. 1849- **4:5** â Feed Instagram e Facebook (la massima area non verticale ammessa). 1850- **1:1** â Griglia Instagram, LinkedIn, thumbnail profilo. 1851- **16:9** â YouTube long-form, connected-TV, embed. 1852 1853## Cosa fare in pratica 1854 1855Genera ogni asset in **9:16 + 4:5 + 1:1**. HeroShots produce i tre formati in un solo job, condividendo scena e prompt â così il creative testing resta variant-clean.`,faqs:[{q:"Posso croppare 9:16 a 4:5 invece di rigenerare?",a:"Sì, ma perdi controllo sulla composizione. Generare nativamente ogni ratio mantiene soggetto centrato e prodotto in primo piano."},{q:"Meta accetta ancora 1:1?",a:"Sì, ma 4:5 occupa più schermo nel feed mobile: preferisci 4:5 per il feed e tieni 1:1 per griglia e carousel ads."}]},es:{title:"GuÃa de formatos sociales: 1:1, 4:5, 9:16, 16:9 â cuándo usar cada uno",description:"1:1 para el grid, 4:5 para máxima pantalla en feed, 9:16 para vertical full-screen, 16:9 para YouTube. La cheat sheet para cada plataforma en 2026.",body:`En 2026 **4:5 y 9:16 cubren la gran mayorÃa de las impresiones paid social**. 1:1 sigue ganando en grid, 16:9 solo importa para YouTube y connected-TV. El formato equivocado desperdicia buena parte de la **pantalla disponible** en móvil. 1856 1857## Cheat sheet 1858 1859- **9:16** â TikTok, Reels, Stories, Shorts, YouTube vertical. 1860- **4:5** â Feed Instagram y Facebook. 1861- **1:1** â Grid Instagram, LinkedIn, thumbnails. 1862- **16:9** â YouTube long-form, connected-TV, embeds. 1863 1864## En la práctica 1865 1866Genera cada asset en **9:16 + 4:5 + 1:1**. HeroShots produce los tres en un solo job, compartiendo escena y prompt â el creative testing se queda variant-clean.`,faqs:[{q:"¿Puedo recortar 9:16 a 4:5 en lugar de regenerar?",a:"SÃ, pero pierdes control de composición. Generar cada ratio nativo mantiene al sujeto centrado y el producto destacado."},{q:"¿Meta sigue aceptando 1:1?",a:"SÃ, pero 4:5 ocupa más pantalla en feed móvil: prefiere 4:5 para feed y deja 1:1 para grid y carousel ads."}]},de:{title:"Social-Formate-Guide: 1:1, 4:5, 9:16, 16:9 â wann was nutzen",description:"1:1 fürs Grid, 4:5 für maximalen Feed-Platz, 9:16 für vertikales Full-Screen, 16:9 für YouTube. Cheat Sheet für jede Plattform 2026.",body:`202
18666 decken **4:5 und 9:16 den GroÃteil der Paid-Social-Impressions** ab. 1:1 gewinnt nur noch im Grid, 16:9 zählt für YouTube und Connected-TV. Falsches Ratio verschenkt einen groÃen Teil des **Bildschirms** auf Mobile. 1867 1868## Cheat Sheet 1869 1870- **9:16** â TikTok, Reels, Stories, Shorts, vertikales YouTube. 1871- **4:5** â Instagram-/Facebook-Feed. 1872- **1:1** â Instagram-Grid, LinkedIn, Thumbnails. 1873- **16:9** â YouTube-Longform, Connected-TV, Embeds. 1874 1875## In der Praxis 1876 1877Generiere jedes Asset in **9:16 + 4:5 + 1:1**. HeroShots produziert alle drei in einem Job mit derselben Szene und demselben Prompt â Creative-Testing bleibt variant-clean.`,faqs:[{q:"Kann ich 9:16 zu 4:5 croppen statt neu zu generieren?",a:"Möglich, aber du verlierst Kompositionskontrolle. Native Generierung hält Subjekt und Produkt zentriert."},{q:"Akzeptiert Meta noch 1:1?",a:"Ja, aber 4:5 nimmt mehr Bildschirm im Mobile-Feed ein. 4:5 für Feed, 1:1 für Grid und Carousel-Ads."}]},fr:{title:"Guide des formats sociaux : 1:1, 4:5, 9:16, 16:9 â quand utiliser chacun",description:"1:1 pour le grid, 4:5 pour la surface max en feed, 9:16 pour le vertical plein écran, 16:9 pour YouTube. Cheat sheet par plateforme en 2026.",body:`En 2026, **4:5 et 9:16 couvrent la grande majorité des impressions paid social**. 1:1 ne gagne plus que sur le grid, 16:9 ne compte que pour YouTube et connected-TV. Le mauvais ratio gaspille une bonne partie de l'**écran disponible** sur mobile. 1878 1879## Cheat sheet 1880 1881- **9:16** â TikTok, Reels, Stories, Shorts, YouTube vertical. 1882- **4:5** â Feed Instagram & Facebook. 1883- **1:1** â Grid Instagram, LinkedIn, thumbnails. 1884- **16:9** â YouTube long-form, connected-TV, embeds. 1885 1886## En pratique 1887 1888Génère chaque asset en **9:16 + 4:5 + 1:1**. HeroShots produit les trois en un seul job partageant scène et prompt â le creative testing reste variant-clean.`,faqs:[{q:"Puis-je recadrer 9:16 en 4:5 plutôt que régénérer ?",a:"Possible, mais tu perds le contrôle de composition. Générer chaque ratio en natif garde le sujet centré et le produit en avant."},{q:"Meta accepte-t-il encore 1:1 ?",a:"Oui, mais 4:5 occupe plus d'écran en feed mobile : préfère 4:5 pour le feed et garde 1:1 pour grid et carousel."}]}}},{slug:"how-to-write-ugc-video-script-hook-problem-solution-cta",date:"2026-06-07",author:"HeroShots",tags:["how-to","scripting","ugc"],translations:{en:{title:"How to Write a UGC Video Script: The Hook-Problem-Solution-CTA Framework",metaTitle:"How to Write a UGC Video Script",description:"The 4-beat UGC script formula that converts on TikTok and Reels: 3-second hook, named problem, product as solution, single CTA. With templates.",body:`A winning UGC script has 4 beats in **under 15 seconds**: hook (0â3s), problem (3â7s), solution (7â12s), CTA (12â15s). Scripts that follow this structure typically hold attention better than free-form ones on TikTok. 1889 1890## The 4 beats, with templates 1891 1892- **Hook (3s)**: "I tried [product] for 7 days, here's what happened" / "POV: you finally fix [pain]". 1893- **Problem (4s)**: name a specific, painful, named scenario. 1894- **Solution (5s)**: show product in use, name the one feature that solves it. 1895- **CTA (3s)**: single action â "link in bio", "code in caption", "save this". 1896 1897## What kills scripts 1898 1899Multiple CTAs, generic openings ("Hey guys"), 2 features instead of 1, brand logo in first 3 seconds.`,faqs:[{q:"Should the model speak or just show?",a:"Either works. Voice-on adds trust for high-consideration products; voice-off + captions wins for low-consideration impulse buys."},{q:"How long should the video be?",a:"8â15 seconds for awareness, 20â30 seconds for consideration. Above 30s, completion rate drops off sharply on TikTok."}]},it:{title:"Come scrivere uno script video UGC: il framework Hook-Problema-Soluzione-CTA",description:"La formula in 4 beat che converte su TikTok e Reels: hook in 3 secondi, problema, prodotto come soluzione, una sola CTA. Con template.",body:`Uno script UGC vincente ha 4 beat in **meno di 15 secondi**: hook (0â3s), problema (3â7s), soluzione (7â12s), CTA (12â15s). Gli script con questa struttura tengono in genere l'attenzione meglio dei free-form su TikTok. 1900 1901## I 4 beat con template 1902 1903- **Hook (3s)**: "Ho provato [prodotto] per 7 giorni, ecco com'è andata" / "POV: risolvi finalmente [problema]". 1904- **Problema (4s)**: nomina uno scenario specifico, doloroso, nominato. 1905- **Soluzione (5s)**: prodotto in uso, una sola feature che lo risolve. 1906- **CTA (3s)**: una sola azione â "link in bio", "codice nella caption", "salva questo". 1907 1908## Cosa uccide gli script 1909 1910Più CTA, aperture generiche ("Ciao ragazzi"), 2 feature al posto di 1, logo brand nei primi 3 secondi.`,faqs:[{q:"Il model deve parlare o solo mostrare?",a:"Entrambi funzionano. Voice-on aumenta la fiducia per prodotti high-consideration; voice-off + caption vince per impulse buy low-consideration."},{q:"Quanto deve durare il video?",a:"8â15 secondi per awareness, 20â30 secondi per consideration. Sopra i 30s il completion rate crolla su TikTok."}]},es:{title:"Cómo escribir un script de vÃdeo UGC: el framework Hook-Problema-Solución-CTA",description:"La fórmula de 4 beats que convierte en TikTok y Reels: hook en 3s, problema, producto como solución, una sola CTA. Con plantillas.",body:`Un script UGC ganador tiene 4 beats en **menos de 15 segundos**: hook (0â3s), problema (3â7s), solución (7â12s), CTA (12â15s). Los scripts con esta estructura suelen retener mejor la atención que los free-form en TikTok. 1911 1912## Los 4 beats con plantillas 1913 1914- **Hook (3s)**: "Probé [producto] 7 dÃas, esto pasó" / "POV: por fin solucionas [dolor]". 1915- **Problema (4s)**: escenario especÃfico, doloroso, nombrado. 1916- **Solución (5s)**: producto en uso, una sola feature que lo resuelve. 1917- **CTA (3s)**: una sola acción â "link en bio", "código en caption", "guarda esto". 1918 1919## Qué mata los scripts 1920 1921Múltiples CTAs, aperturas genéricas ("Hola chicos"), 2 features en vez de 1, logo en los primeros 3 segundos.`,faqs:[{q:"¿El model debe hablar o solo mostrar?",a:"Ambos funcionan. Voice-on suma confianza para productos high-consideration; voice-off + captions gana en impulse buys."},{q:"¿Cuánto debe durar el vÃdeo?",a:"8â15s para awareness, 20â30s para consideration. Por encima de 30s el completion rate cae en picado en TikTok."}]},de:{title:"UGC-Video-Skript schreiben: das Hook-Problem-Lösung-CTA-Framework",description:"Die 4-Beat-Formel, die auf TikTok und Reels konvert
1921iert: 3-Sekunden-Hook, benanntes Problem, Produkt als Lösung, ein einziger CTA. Mit Templates.",body:`Ein gewinnendes UGC-Skript hat 4 Beats in **unter 15 Sekunden**: Hook (0â3s), Problem (3â7s), Lösung (7â12s), CTA (12â15s). Skripte mit dieser Struktur halten die Aufmerksamkeit meist besser als Free-Form auf TikTok. 1922 1923## Die 4 Beats mit Templates 1924 1925- **Hook (3s)**: "Ich habe [Produkt] 7 Tage getestet â das ist passiert" / "POV: du löst endlich [Problem]". 1926- **Problem (4s)**: ein konkretes, schmerzhaftes Szenario benennen. 1927- **Lösung (5s)**: Produkt im Einsatz, das eine Feature, die es löst. 1928- **CTA (3s)**: eine einzige Aktion â "Link in Bio", "Code in Caption", "Speichern". 1929 1930## Was Skripte tötet 1931 1932Mehrere CTAs, generische Openings ("Hi Leute"), 2 Features statt 1, Markenlogo in den ersten 3 Sekunden.`,faqs:[{q:"Soll das Model sprechen oder nur zeigen?",a:"Beides funktioniert. Voice-on schafft Vertrauen für High-Consideration-Produkte; Voice-off + Captions gewinnt bei Impulse-Buys."},{q:"Wie lang soll das Video sein?",a:"8â15s für Awareness, 20â30s für Consideration. Ãber 30s fällt die Completion-Rate auf TikTok deutlich ab."}]},fr:{title:"Comment écrire un script vidéo UGC : le framework Hook-Problème-Solution-CTA",description:"La formule 4 beats qui convert
1932it sur TikTok et Reels : hook en 3s, problème, produit comme solution, un seul CTA. Avec templates.",body:`Un script UGC gagnant a 4 beats en **moins de 15 secondes** : hook (0â3s), problème (3â7s), solution (7â12s), CTA (12â15s). Les scripts qui suivent cette structure retiennent en général mieux l'attention que le free-form sur TikTok. 1933 1934## Les 4 beats avec templates 1935 1936- **Hook (3s)** : "J'ai testé [produit] 7 jours, voilà ce qui s'est passé" / "POV : tu règles enfin [douleur]". 1937- **Problème (4s)** : scénario spécifique, douloureux, nommé. 1938- **Solution (5s)** : produit en usage, une seule feature qui résout. 1939- **CTA (3s)** : une seule action â "lien en bio", "code en caption", "enregistre ça". 1940 1941## Ce qui tue les scripts 1942 1943Plusieurs CTA, ouvertures génériques ("Salut les amis"), 2 features au lieu d'1, logo dans les 3 premières secondes.`,faqs:[{q:"Le model doit-il parler ou juste montrer ?",a:"Les deux marchent. Voice-on ajoute de la confiance sur high-consideration ; voice-off + captions gagne sur l'impulse buy."},{q:"Quelle durée pour la vidéo ?",a:"8â15s en awareness, 20â30s en consideration. Au-delà de 30s le completion rate chute nettement sur TikTok."}]}}},{slug:"test-20-creative-variants-in-one-day",date:"2026-06-08",author:"HeroShots",tags:["how-to","creative-testing","performance"],translations:{en:{title:"How to Test 20 Creative Variants in One Day Without Blowing Your Budget",metaTitle:"How to Test 20 Creative Variants in One Day",description:"A repeatable testing protocol: 20 AI-generated variants, 4 hooks à 5 visuals, decided in 24 hours.",body:`You can test **20 creative variants in a single day** â image generation is â¬4.90 for the first batch of 4 variants and â¬1.90 for each further batch in the same project (excl. VAT), plus whatever Meta ad budget you allocate â and have a clear winner in **24â36 hours**. The unlock is removing production from the bottleneck. 1944 1945## The 4Ã5 matrix 1946 1947- **4 hooks**: pain-led, curiosity-led, social-proof, contrarian. 1948- **5 visuals**: same product, 5 different models/scenes. 1949- **20 cells** = 20 ads. Each generated in <2 min. 1950 1951## How to run the test 1952 1953- Single ad-set, **dynamic creative off**, equal weighting. 1954- Daily ad budget: the same small amount on every cell (~â¬10 of ad spend per variant). 1955- Kill after 24h anything below median CTR. Scale top 2.`,faqs:[{q:"Is 20 variants enough?",a:"For first-pass discovery yes. After identifying the top 2, run a deeper 10-variant follow-up on each winning hook for incremental gains."},{q:"How do I keep brand consistency across variants?",a:"Save a brand prompt template in HeroShots. Every variant inherits palette, lighting and prop guidelines."}]},it:{title:"Come testare 20 varianti creative in un giorno senza esplodere il budget",description:"Protocollo ripetibile: 20 varianti generate con AI, 4 hook à 5 visual, decisione in 24 ore.",body:`Puoi testare **20 varianti creative in un giorno** â la generazione immagini costa â¬4,90 per il primo batch di 4 varianti e â¬1,90 per ogni batch successivo nello stesso progetto (IVA esclusa), più il budget Meta che decidi tu â e avere un vincitore chiaro in **24â36 ore**. Lo sblocco è togliere la produzione dal collo di bottiglia. 1956 1957## La matrice 4Ã5 1958 1959- **4 hook**: pain-led, curiosity-led, social-proof, contrarian. 1960- **5 visual**: stesso prodotto, 5 model/scene diversi. 1961- **20 celle** = 20 ads. Ciascuna generata in <2 min. 1962 1963## Come fare il test 1964 1965- Singolo ad-set, **dynamic creative off**, peso uguale. 1966- Budget ads giornaliero: la stessa piccola cifra su ogni cella (~â¬10 di spesa ads per variante). 1967- Killa dopo 24h tutto sotto il CTR mediano. Scala i top 2.`,faqs:[{q:"20 varianti bastano?",a:"Per la discovery iniziale sì. Identificati i top 2, fai un follow-up di 10 varianti su ciascun hook vincente per guadagni incrementali."},{q:"Come mantengo la brand consistency?",a:"Salva un template prompt di brand in HeroShots. Ogni variante eredita palette, lighting e linee guida prop."}]},es:{title:"Cómo testar 20 variantes creativas en un dÃa sin reventar el presupuesto",description:"Protocolo repetible: 20 variantes generadas con AI, 4 hooks à 5 visuales, decisión en 24 horas.",body:`Puedes testar **20 variantes creativas en un dÃa** â la generación de imágenes cuesta â¬4,90 el primer lote de 4 variantes y â¬1,90 cada lote siguiente en el mismo proyecto (IVA no incluido), más el budget Meta que decidas â y tener un ganador claro en **24â36 horas**. La clave es sacar la producción del cuello de botella. 1968 1969## La matriz 4Ã5 1970 1971- **4 hooks**: pain-led, curiosity-led, social-proof, contrarian. 1972- **5 visuales**: mismo producto, 5 models/escenas distintas. 1973- **20 celdas** = 20 ads. Cada una en <2 min. 1974 1975## Cómo correr el test 1976 1977- Ãnico ad-set, **dynamic creative off**, peso igual. 1978- Budget de ads diario: la misma cantidad pequeña en cada celda (~â¬10 de inversión publicitaria por variante). 1979- Mata tras 24h lo que esté bajo el CTR mediano. Escala los top 2.`,faqs:[{q:"¿20 variantes alcanzan?",a:"Para discovery inicial sÃ. Identificados los top 2, haz un follow-up de 10 variantes sobre cada hook ganador para ganancias incrementales."},{q:"¿Cómo mantengo la consistencia de marca?",a:"Guarda un template de prompt de marca en HeroShots. Cada variante hereda paleta, luz y guidelines de props."}]},de:{title:"20 Creative-Varianten an einem Tag testen â ohne Budget zu sprengen",description:"Wiederholbares Test-Protokoll: 20 AI-Varianten, 4 Hooks à 5 Visuals, Entscheidung in 24 Stunden.",body:`Du testest **20 Creative-Varianten an einem Tag** â die Bildgenerierung kostet â¬4,90 für den ersten Batch mit 4 Varianten und â¬1,90 pro weiterem Batch im selben Projekt (zzgl. MwSt.), dazu dein Meta-Budget â und hast einen klaren Gewinner in **24â36 Stunden**. Der Hebel: Produktion raus aus dem Bottleneck. 1980 1981## Die 4Ã5-Matrix 1982 1983- **4 Hooks**: Pain, Curiosity, Social Proof, Contrarian. 1984- **5 Visuals**: gleiches Produkt, 5 verschiedene Models/Szenen. 1985- **20 Zellen** = 20 Ads. Jede in <2 min generiert. 1986 1987## So läuft der Test 1988 1989- Ein Ad-Set, **Dynamic Creative off**, gleiche Gewichtung. 1990- Tages-Ad-Budget: derselbe kleine Betrag auf jeder Zelle (~â¬10 Werbebudget pro Variante). 1991- Nach 24h alles unter Median-CTR killen. Top 2 skalieren.`,faqs:[{q:"Reichen 20 Varianten?",a:"Für die erste Discovery ja. Danach 10 Folge-Varianten je Gewinner-Hook für inkrementelle Gewinne."},{q:"Wie halte ich Markenkonsistenz?",a:"Speichere ein Brand-Prompt-Template in HeroShots. Jede Variante erbt Palette, Licht und Prop-Guidelines."}]},fr:{title:"Comment tester 20 variantes créatives en un jour sans exploser le budget",description:"Protocole reproductible : 20 variantes générées en AI, 4 hooks à 5 visuels, décision en 24 heures.",body:`Tu peux tester **20 variantes créatives en un jour** â la génération d'images coûte â¬4,90 pour le premier batch de 4 variantes et â¬1,90 par batch suivant dans le même projet (HT), plus le budget Meta que tu choisis â et avoir un gagnant clair en **24â36 heures**. Le déblocage : sortir la production du bottleneck. 1992 1993## La matrice 4Ã5 1994 1995- **4 hooks** : pain, curiosity, social proof, contrarian. 1996- **5 visuels** : même produit, 5 models/scènes différents. 1997- **20 cellules** = 20 ads. Chacune en <2 min. 1998 1999## Comment lancer le test 2000 2001- Un seul ad-set, **dynamic creative off**, poids égal. 2002- Budget pub quotidien : le même petit montant sur chaque cellule (~â¬10 de budget pub par variante). 2003- Tue après 24h tout ce qui est sous le CTR médian. Scale le top 2.`,faqs:[{q:"20 variantes suffisent-elles ?",a:"Pour la discovery initiale oui. Une fois les top 2 identifiés, fais un follow-up de 10 variantes par hook gagnant pour des gains incrémentaux."},{q:"Comment garder la cohérence de marque ?",a:"Sauvegarde un template de prompt de marque dans HeroShots. Chaque variante hérite palette, lumière et guidelines props."}]}}},{slug:"ai-content-for-ecommerce-product-pages",date:"2026-06-09",author:"HeroShots",tags:["how-to","ecommerce","pdp"],translations:{en:{title:"How to Create Content for Your eCommerce Product Pages With AI",metaTitle:"AI Content for eCommerce Product Pages",description:"PDPs with 6+ images and a 15s lifestyle video convert better. Here's how to ship that for every SKU using AI UGC.",body:`Adding **6 images + 1 short lifestyle video** to a product page typically lifts add-to-cart. The cost barr
2003ier disappears with AI: images are â¬4.90 for the first batch of 4 variants and â¬1.90 for each further batch in the same project, and a lifestyle video up to 15 seconds is â¬15 (excl. VAT). 2004 2005## The PDP starter pack 2006 2007- **Hero on white** (Amazon/Google-safe). 2008- **3 lifestyle**: in-use, in-context, scale reference. 2009- **1 macro detail**. 2010- **1 size/fit shot** (apparel only). 2011- **1 15-second 9:16 lifestyle video** for embed and ads. 2012 2013## How to scale across SKUs 2014 2015Define the template once. HeroShots' batch generation applies the same scene blueprint to N products, preserving brand style across the catalog.`,faqs:[{q:"Will Google Shopping accept AI images?",a:"Yes. Google Merchant Center's policy is product accuracy, not capture method. The product must match what's shipped."},{q:"What about Shopify Magic?",a:"Shopify Magic does basic background swaps. HeroShots adds real models, true lifestyle scenes and video â work Magic doesn't cover."}]},it:{title:"Come creare contenuti per le PDP del tuo eCommerce con l'AI",description:"Le PDP con 6+ immagini e un video lifestyle da 15s convertono meglio. Ecco come farlo per ogni SKU con l'AI UGC.",body:`Aggiungere **6 immagini + 1 video lifestyle breve** a una product page in genere aumenta l'add-to-cart. Il muro di costo cade con l'AI: le immagini costano â¬4,90 per il primo batch di 4 varianti e â¬1,90 per ogni batch successivo nello stesso progetto, e un video lifestyle fino a 15 secondi costa â¬15 (IVA esclusa). 2016 2017## Lo starter pack PDP 2018 2019- **Hero su bianco** (sicuro per Amazon/Google). 2020- **3 lifestyle**: in uso, in contesto, riferimento scala. 2021- **1 macro dettaglio**. 2022- **1 size/fit** (solo apparel). 2023- **1 video lifestyle 9:16 da 15 secondi** per embed e ads. 2024 2025## Come scalare sulle SKU 2026 2027Definisci il template una volta. La batch generation di HeroShots applica lo stesso blueprint a N prodotti, mantenendo lo stile di brand su tutto il catalogo.`,faqs:[{q:"Google Shopping accetta immagini AI?",a:"Sì. La policy di Google Merchant Center è sull'accuratezza del prodotto, non sul metodo di acquisizione. Il prodotto deve corrispondere a quanto spedito."},{q:"E Shopify Magic?",a:"Shopify Magic fa swap di sfondo base. HeroShots aggiunge model reali, scene lifestyle vere e video â cose che Magic non copre."}]},es:{title:"Cómo crear contenido para las PDP de tu eCommerce con AI",description:"Las PDP con 6+ imágenes y un vÃdeo lifestyle de 15s convierten mejor. Cómo hacerlo para cada SKU con AI UGC.",body:`Añadir **6 imágenes + 1 vÃdeo lifestyle corto** a una product page suele subir el add-to-cart. El muro de coste cae con AI: las imágenes cuestan â¬4,90 el primer lote de 4 variantes y â¬1,90 cada lote siguiente en el mismo proyecto, y un vÃdeo lifestyle de hasta 15 segundos cuesta â¬15 (IVA no incluido). 2028 2029## Starter pack PDP 2030 2031- **Hero sobre blanco** (compatible Amazon/Google). 2032- **3 lifestyle**: en uso, en contexto, referencia de escala. 2033- **1 macro detalle**. 2034- **1 size/fit** (solo apparel). 2035- **1 vÃdeo lifestyle 9:16 de 15s** para embed y ads. 2036 2037## Cómo escalar entre SKUs 2038 2039Define el template una vez. La batch generation de HeroShots aplica el mismo blueprint a N productos manteniendo el estilo de marca en todo el catálogo.`,faqs:[{q:"¿Google Shopping admite imágenes AI?",a:"SÃ. La polÃtica de Google Merchant Center es la precisión del producto, no el método de captura. Debe coincidir con lo enviado."},{q:"¿Y Shopify Magic?",a:"Shopify Magic hace swaps de fondo básicos. HeroShots añade models reales, escenas lifestyle y vÃdeo â cosas que Magic no cubre."}]},de:{title:"Content für deine eCommerce-Produktseiten mit AI erstellen",description:"PDPs mit 6+ Bildern und einem 15s-Lifestyle-Video konvertieren besser. So lieferst du das für jede SKU mit AI UGC.",body:`**6 Bilder + 1 kurzes Lifestyle-Video** auf einer PDP heben in der Regel die Add-to-Cart-Rate. Die Kostenmauer fällt mit AI: Bilder kosten â¬4,90 für den ersten Batch mit 4 Varianten und â¬1,90 pro weiterem Batch im selben Projekt, ein Lifestyle-Video bis 15 Sekunden kostet â¬15 (zzgl. MwSt.). 2040 2041## PDP-Starter-Pack 2042 2043- **Hero auf WeiÃ** (Amazon/Google-konform). 2044- **3 Lifestyle**: in Use, in Context, MaÃstabsreferenz. 2045- **1 Makro-Detail**. 2046- **1 Size/Fit** (nur Apparel). 2047- **1 15-Sekunden 9:16 Lifestyle-Video** für Embed und Ads. 2048 2049## Skalierung über SKUs 2050 2051Template einmal definieren. HeroShots' Batch-Generierung wendet dasselbe Szenen-Blueprint auf N Produkte an und hält Brand-Style über den Katalog konstant.`,faqs:[{q:"Akzeptiert Google Shopping AI-Bilder?",a:"Ja. Google Merchant Centers Policy zielt auf Produktgenauigkeit, nicht Aufnahmemethode. Das Produkt muss dem Versand entsprechen."},{q:"Was ist mit Shopify Magic?",a:"Shopify Magic macht Basis-Hintergrund-Swaps. HeroShots liefert echte Models, echte Lifestyle-Szenen und Video â Magic nicht."}]},fr:{title:"Comment créer du contenu pour les PDP de ton eCommerce avec l'AI",description:"Les PDP avec 6+ images et une vidéo lifestyle de 15s convert
2051issent mieux. Comment livrer ça pour chaque SKU avec l'AI UGC.",body:`Ajouter **6 images + 1 vidéo lifestyle courte** sur une product page augmente en général l'add-to-cart. Le mur de coût tombe avec l'AI : les images coûtent â¬4,90 pour le premier batch de 4 variantes et â¬1,90 par batch suivant dans le même projet, et une vidéo lifestyle jusqu'à 15 secondes coûte â¬15 (HT). 2052 2053## Starter pack PDP 2054 2055- **Hero sur blanc** (compatible Amazon/Google). 2056- **3 lifestyle** : en usage, en contexte, échelle. 2057- **1 macro détail**. 2058- **1 size/fit** (apparel seulement). 2059- **1 vidéo lifestyle 9:16 de 15s** pour embed et ads. 2060 2061## Comment scaler sur les SKU 2062 2063Définis le template une fois. La batch generation HeroShots applique le même blueprint à N produits en gardant le style de marque sur tout le catalogue.`,faqs:[{q:"Google Shopping accepte-t-il les images AI ?",a:"Oui. La politique Google Merchant Center vise l'exactitude produit, pas la méthode de capture. Le produit doit correspondre à ce qui est expédié."},{q:"Et Shopify Magic ?",a:"Shopify Magic fait des swaps de fond basiques. HeroShots ajoute models réels, scènes lifestyle vraies et vidéo â ce que Magic ne couvre pas."}]}}},{slug:"tiktok-hooks-30-formulas-first-3-seconds",date:"2026-06-10",author:"HeroShots",tags:["how-to","tiktok","hooks"],translations:{en:{title:"TikTok Hooks: 30 Formulas for the First 3 Seconds",metaTitle:"TikTok Hooks: 30 Formulas for First 3 Seconds",description:"30 proven hook formulas grouped into 6 families â POV, contrarian, listicle, social proof, curiosity, transformation â with examples.",body:`**Most TikTok views are decided in the first 3 seconds.** A strong hook is the single biggest lever on completion rate, more than editing or music. 2064 2065## 6 hook families with examples 2066 2067- **POV**: "POV: you finally find a [product] that doesn't [pain]". 2068- **Contrarian**: "Stop [common advice]. Here's why." 2069- **Listicle**: "3 things I wish I knew before buying [X]". 2070- **Social proof**: "Why everyone in [city/niche] is using [X]". 2071- **Curiosity gap**: "This costs â¬X but does the job of a â¬Y product". 2072- **Transformation**: "Day 1 vs Day 30 of [X]". 2073 2074## How to test hooks 2075 2076Keep the **same body video** and swap only the first 3 seconds. Run 6 variants â one per family â and the winner becomes your template.`,faqs:[{q:"Which family converts best in 2026?",a:"POV and curiosity-gap formulas tend to perform well across beauty, food and consumer tech. B2B leans on contrarian and listicle."},{q:"Do hooks need on-screen text?",a:"Yes â most feeds play muted. The hook line must appear as caption in the first frame, not just spoken."}]},it:{title:"Hook TikTok: 30 formule per i primi 3 secondi del video",description:"30 formule di hook testate raggruppate in 6 famiglie â POV, contrarian, listicle, social proof, curiosity, transformation â con esempi.",body:`La **maggior parte delle view TikTok si decide nei primi 3 secondi.** Un hook forte è la leva più grande sul completion rate, più del montaggio o della musica. 2077 2078## 6 famiglie di hook con esempi 2079 2080- **POV**: "POV: finalmente trovi un [prodotto] che non [problema]". 2081- **Contrarian**: "Smetti di [consiglio comune]. Ecco perché." 2082- **Listicle**: "3 cose che vorrei sapere prima di comprare [X]". 2083- **Social proof**: "Perché tutti a [città /nicchia] stanno usando [X]". 2084- **Curiosity gap**: "Costa â¬X ma fa il lavoro di un prodotto da â¬Y". 2085- **Transformation**: "Giorno 1 vs Giorno 30 di [X]". 2086 2087## Come testare gli hook 2088 2089Mantieni lo **stesso body video** e cambia solo i primi 3 secondi. Lancia 6 varianti â una per famiglia â e il vincitore diventa il tuo template.`,faqs:[{q:"Quale famiglia converte meglio nel 2026?",a:"POV e curiosity-gap tendono a funzionare bene su beauty, food e consumer tech. Il B2B punta su contrarian e listicle."},{q:"Gli hook devono avere testo on-screen?",a:"Sì â la maggior parte dei feed va in muto. La riga di hook deve apparire come caption nel primo frame, non solo parlata."}]},es:{title:"Hooks de TikTok: 30 fórmulas para los primeros 3 segundos",description:"30 fórmulas de hook probadas agrupadas en 6 familias â POV, contrarian, listicle, social proof, curiosity, transformation â con ejemplos.",body:`La **mayorÃa de las visualizaciones de TikTok se deciden en los primeros 3 segundos.** Un hook fuerte es la mayor palanca sobre el completion rate, más que el montaje o la música. 2090 2091## 6 familias de hook con ejemplos 2092 2093- **POV**: "POV: por fin encuentras un [producto] que no [dolor]". 2094- **Contrarian**: "Deja de [consejo común]. Te explico por qué." 2095- **Listicle**: "3 cosas que ojalá supiera antes de comprar [X]". 2096- **Social proof**: "Por qué todos en [ciudad/nicho] usan [X]". 2097- **Curiosity gap**: "Cuesta â¬X pero hace lo que uno de â¬Y". 2098- **Transformation**: "DÃa 1 vs DÃa 30 de [X]". 2099 2100## Cómo testar hooks 2101
2102Mantén el **mismo body video** y cambia solo los primeros 3 segundos. Lanza 6 variantes â una por familia â y el ganador se vuelve tu template.`,faqs:[{q:"¿Qué familia convierte mejor en 2026?",a:"POV y curiosity-gap suelen funcionar bien en beauty, food y consumer tech. B2B se apoya en contrarian y listicle."},{q:"¿Los hooks necesitan texto en pantalla?",a:"Sà â la mayorÃa del feed va sin audio. La lÃnea del hook debe aparecer como caption en el primer frame, no solo hablada."}]},de:{title:"TikTok-Hooks: 30 Formeln für die ersten 3 Sekunden",description:"30 erprobte Hook-Formeln in 6 Familien â POV, Contrarian, Listicle, Social Proof, Curiosity, Transformation â mit Beispielen.",body:`**Die meisten TikTok-Views entscheiden sich in den ersten 3 Sekunden.** Ein starker Hook ist der gröÃte Hebel auf die Completion-Rate â mehr als Schnitt oder Musik. 2103 2104## 6 Hook-Familien mit Beispielen 2105 2106- **POV**: "POV: du findest endlich ein [Produkt], das nicht [Problem]". 2107- **Contrarian**: "Hör auf mit [verbreiteter Rat]. Hier ist warum." 2108- **Listicle**: "3 Dinge, die ich vor [X] wissen wollte". 2109- **Social Proof**: "Warum alle in [Stadt/Nische] [X] nutzen". 2110- **Curiosity Gap**: "Kostet â¬X, kann was â¬Y kostet". 2111- **Transformation**: "Tag 1 vs Tag 30 mit [X]". 2112 2113## Hooks testen 2114 2115Gleicher **Body-Video**, nur erste 3 Sekunden tauschen. 6 Varianten â eine pro Familie â und der Gewinner wird dein Template.`,faqs:[{q:"Welche Familie konvertiert 2026 am besten?",a:"POV und Curiosity-Gap funktionieren in der Regel gut in Beauty, Food und Consumer Tech. B2B setzt auf Contrarian und Listicle."},{q:"Brauchen Hooks On-Screen-Text?",a:"Ja â die meisten Feeds laufen stumm. Die Hook-Zeile muss im ersten Frame als Caption stehen, nicht nur gesprochen sein."}]},fr:{title:"Hooks TikTok : 30 formules pour les 3 premières secondes",description:"30 formules de hook éprouvées en 6 familles â POV, contrarian, listicle, social proof, curiosity, transformation â avec exemples.",body:`**La plupart des vues TikTok se décident dans les 3 premières secondes.** Un hook fort est le plus gros levier du completion rate, plus que le montage ou la musique. 2116 2117## 6 familles de hook avec exemples 2118 2119- **POV** : "POV : tu trouves enfin un [produit] qui ne [douleur] pas". 2120- **Contrarian** : "Arrête de [conseil commun]. Voilà pourquoi." 2121- **Listicle** : "3 choses que j'aurais voulu savoir avant [X]". 2122- **Social proof** : "Pourquoi tout le monde à [ville/niche] utilise [X]". 2123- **Curiosity gap** : "Coûte â¬X mais fait le boulot d'un â¬Y". 2124- **Transformation** : "Jour 1 vs Jour 30 de [X]". 2125 2126## Comment tester les hooks 2127 2128Garde la **même body video** et change uniquement les 3 premières secondes. 6 variantes â une par famille â et le gagnant devient ton template.`,faqs:[{q:"Quelle famille convertit le mieux en 2026 ?",a:"POV et curiosity-gap fonctionnent en général bien sur beauty, food et consumer tech. Le B2B s'appuie sur contrarian et listicle."},{q:"Les hooks ont-ils besoin de texte à l'écran ?",a:"Oui â la plupart des feeds sont muets. La ligne du hook doit apparaître en caption sur la première frame, pas seulement parlée."}]}}},{slug:"adapt-one-asset-tiktok-reels-stories-shorts",date:"2026-06-11",author:"HeroShots",tags:["how-to","repurposing","social"],translations:{en:{title:"How to Adapt One Asset to TikTok, Reels, Stories and Shorts",metaTitle:"Adapt One Asset to TikTok, Reels and Shorts",description:"One scene, four native exports. The repurposing workflow that turns one AI generation into 8 platform-native assets without re-shooting.",body:`Repurposing **one AI scene into 4 platform-native exports** lets you cover TikTok, Reels, Stories and Shorts from a single generation â one production cost instead of four. 2129 2130## The 4 export specs 2131 2132- **TikTok**: 9:16, 8â15s, captions baked, AI label on. 2133- **Reels**: 9:16, 15â30s, music-friendly cut, brand handle in caption. 2134- **Stories**: 9:16, 5â10s, stickers/CTA buttons added natively. 2135- **Shorts**: 9:16, <60s, vertical title card with keyword. 2136 2137## Why native exports beat cross-posts 2138 2139Cross-posted TikToks visibly stamped on Reels get **noticeably less reach**. Each platform's algorithm detects watermarks and de-prioritizes them. HeroShots strips and re-renders per platform.`,faqs:[{q:"Can I reuse the same caption?",a:"Hashtag style differs: Reels prefers 5â8 broad, TikTok prefers 3 niche, Shorts wants keywords in title. Hook line can stay."},{q:"Do Stories need a different aspect?",a:"Same 9:16, but compose with safe zones â top 14% and bottom 20% are covered by UI."}]},it:{title:"Come adattare un solo asset a TikTok, Reels, Stories e Shorts",description:"Una scena, quattro export nativi. Il workflow di repurposing che trasforma una generazione AI in 8 asset nativi senza rifare lo shooting.",body:`Riusare **una scena AI
2139in 4 export nativi per piattaforma** copre TikTok, Reels, Stories e Shorts con una sola generazione â un solo costo di produzione invece di quattro. 2140 2141## I 4 export 2142 2143- **TikTok**: 9:16, 8â15s, caption integrate, label AI on. 2144- **Reels**: 9:16, 15â30s, taglio music-friendly, handle brand in caption. 2145- **Stories**: 9:16, 5â10s, sticker/CTA aggiunti nativamente. 2146- **Shorts**: 9:16, <60s, title card verticale con keyword. 2147 2148## Perché gli export nativi battono il cross-post 2149 2150I TikTok cross-postati con watermark visibile su Reels hanno **molta meno reach**. Ogni algoritmo riconosce i watermark e li penalizza. HeroShots li rimuove e rifa il rendering per piattaforma.`,faqs:[{q:"Posso riusare la stessa caption?",a:"Lo stile hashtag cambia: Reels preferisce 5â8 broad, TikTok 3 niche, Shorts vuole keyword nel titolo. La riga di hook può restare."},{q:"Le Stories servono un aspect diverso?",a:"Sempre 9:16, ma componi con safe zone â top 14% e bottom 20% sono coperti dalla UI."}]},es:{title:"Cómo adaptar un solo asset a TikTok, Reels, Stories y Shorts",description:"Una escena, cuatro exportaciones nativas. El workflow de repurposing que convierte una generación AI en 8 assets nativos sin reshoot.",body:`Reusar **una escena AI en 4 exportaciones nativas** te cubre TikTok, Reels, Stories y Shorts desde una sola generación â un solo coste de producción en vez de cuatro. 2151 2152## Las 4 exportaciones 2153 2154- **TikTok**: 9:16, 8â15s, captions integradas, etiqueta AI on. 2155- **Reels**: 9:16, 15â30s, corte music-friendly, handle marca en caption. 2156- **Stories**: 9:16, 5â10s, stickers/CTA añadidos nativos. 2157- **Shorts**: 9:16, <60s, title card vertical con keyword. 2158 2159## Por qué los exports nativos ganan al cross-post 2160 2161Los TikToks cross-posteados con watermark visible en Reels tienen **bastante menos alcance**. Cada algoritmo detecta watermarks y los penaliza. HeroShots los quita y re-renderiza por plataforma.`,faqs:[{q:"¿Puedo reusar la misma caption?",a:"El estilo de hashtag cambia: Reels prefiere 5â8 broad, TikTok 3 niche, Shorts quiere keywords en tÃtulo. La lÃnea de hook puede quedarse."},{q:"¿Stories necesitan otro aspect?",a:"Mismo 9:16, pero compón con safe zones â top 14% y bottom 20% los cubre la UI."}]},de:{title:"Ein Asset für TikTok, Reels, Stories und Shorts anpassen",description:"Eine Szene, vier native Exports. Repurposing-Workflow, der eine AI-Generierung in 8 plattform-native Assets verwandelt â ohne neuen Dreh.",body:`Eine **AI-Szene als 4 plattform-native Exports** wiederzuverwenden deckt TikTok, Reels, Stories und Shorts mit einer Generierung â eine Produktion statt vier. 2162 2163## Die 4 Exports 2164 2165- **TikTok**: 9:16, 8â15s, Captions eingebrannt, AI-Label an. 2166- **Reels**: 9:16, 15â30s, Music-Friendly-Cut, Brand-Handle in Caption. 2167- **Stories**: 9:16, 5â10s, Sticker/CTAs nativ. 2168- **Shorts**: 9:16, <60s, vertikale Title-Card mit Keyword. 2169 2170## Warum native Exports Cross-Posts schlagen 2171 2172Cross-gepostete TikToks mit sichtbarem Watermark auf Reels haben **deutlich weniger Reach**. Jeder Algorithmus erkennt Watermarks und priorisiert sie ab. HeroShots entfernt sie und rendert pro Plattform neu.`,faqs:[{q:"Kann ich dieselbe Caption nutzen?",a:"Hashtag-Style unterscheidet sich: Reels 5â8 breit, TikTok 3 nische, Shorts Keywords im Titel. Hook-Zeile darf bleiben."},{q:"Brauchen Stories ein anderes Aspect?",a:"Gleiches 9:16, aber mit Safe-Zones komponieren â oberes 14% und unteres 20% sind UI."}]},fr:{title:"Adapter un seul asset à TikTok, Reels, Stories et Shorts",description:"Une scène, quatre exports natifs. Le workflow de repurposing qui transforme une génération AI en 8 assets natifs sans re-tournage.",body:`Réutiliser **une scène AI en 4 exports natifs** couvre TikTok, Reels, Stories et Shorts depuis une seule génération â un seul coût de production au lieu de quatre. 2173 2174## Les 4 exports 2175 2176- **TikTok** : 9:16, 8â15s, captions intégrées, label AI on. 2177- **Reels** : 9:16, 15â30s, montage music-friendly, handle marque en caption. 2178- **Stories** : 9:16, 5â10s, stickers/CTA ajoutés en natif. 2179- **Shorts** : 9:16, <60s, title card verticale avec keyword. 2180 2181## Pourquoi les exports natifs battent le cross-post 2182 2183Les TikToks cross-postés avec watermark visible sur Reels ont **nettement moins de portée**. Chaque algorithme détecte les watermarks et les déprioritise. HeroShots les retire et re-render par plateforme.`,faqs:[{q:"Puis-je réutiliser la même caption ?",a:"Le style hashtag diffère : Reels préfère 5â8 broad, TikTok 3 niche, Shorts veut des keywords en titre. La ligne de hook peut rester."},{q:"Les Stories ont-elles besoin d'un autre aspect ?",a:"Même 9:16, mais compose avec safe zones â top 14% et bas 20% sont couverts par l'UI."}]}}}
2183,{slug:"i-found-this-place-video-local-business",date:"2026-06-12",author:"HeroShots",tags:["how-to","local-business","video"],translations:{en:{title:"How to Create an 'I Found This Place' Video for Your Local Business",metaTitle:"How to Make an 'I Found This Place' Video",description:"The discovery-style POV video drives far more saves than a standard menu post. Here's the formula for restaurants, cafés, gyms and salons.",body:`'I Found This Place' POV videos generate **far more saves and shares** than menu/promo posts on TikTok and Reels â making them the highest-leverage format for local businesses in 2026. 2184 2185## The formula 2186 2187- **Hook (3s)**: handheld walk-in shot + caption "I found this place in [neighborhood] and..." 2188- **Wow moment (4s)**: the one signature thing (latte art, equipment, vibe). 2189- **Proof (4s)**: people enjoying it (or AI model in the scene). 2190- **Detail (3s)**: price, time, name. 2191- **CTA (1s)**: location pin + handle. 2192 2193## How HeroShots helps if you can't film 2194 2195Upload one photo of your space and one of the signature item. Generate the POV walk-in scene with a Real Model â same vibe, no production day.`,faqs:[{q:"Will it look fake?",a:"Not if you ground the AI scene in real photos of your space. HeroShots preserves architecture, lighting and signage."},{q:"Should I geotag?",a:"Yes. Geotagged 'found this place' videos keep surfacing in TikTok Search 'near me' well after posting."}]},it:{title:"Come creare un video 'I found this place' per la tua attività locale",description:"Il video POV stile discovery porta molti più save di un post menù standard. La formula per ristoranti, caffè, palestre e saloni.",body:`I video POV 'I found this place' generano **molti più save e share** dei post menu/promo su TikTok e Reels â il formato a maggior leva per le attività locali nel 2026. 2196 2197## La formula 2198 2199- **Hook (3s)**: shot handheld in ingresso + caption "Ho trovato questo posto a [quartiere] e..." 2200- **Wow moment (4s)**: l'unica cosa signature (latte art, attrezzatura, vibe). 2201- **Proof (4s)**: persone che ne godono (o model AI nella scena). 2202- **Detail (3s)**: prezzo, orario, nome. 2203- **CTA (1s)**: pin location + handle. 2204 2205## Come ti aiuta HeroShots se non puoi filmare 2206 2207Carica una foto dello spazio e una dell'item signature. Genera la scena POV d'ingresso con un Real Model â stessa vibe, senza giornata di produzione.`,faqs:[{q:"Sembrerà finto?",a:"No se ancori la scena AI a foto reali dello spazio. HeroShots conserva architettura, illuminazione e insegne."},{q:"Devo geotaggare?",a:"Sì. I video 'found this place' geotaggati continuano a emergere nella TikTok Search 'near me' a lungo dopo la pubblicazione."}]}
2207,es:{title:"Cómo crear un vÃdeo 'I found this place' para tu negocio local",description:"El vÃdeo POV estilo discovery genera muchos más saves que un post de menú estándar. La fórmula para restaurantes, cafés, gimnasios y salones.",body:`Los vÃdeos POV 'I found this place' generan **muchos más saves y shares** que los posts de menú/promo en TikTok y Reels â el formato con mayor palanca para negocios locales en 2026. 2208 2209## La fórmula 2210 2211- **Hook (3s)**: shot handheld al entrar + caption "Encontré este sitio en [barrio] y..." 2212- **Wow (4s)**: la cosa signature (latte art, equipo, vibe). 2213- **Proof (4s)**: personas disfrutándolo (o model AI en escena). 2214- **Detail (3s)**: precio, horario, nombre. 2215- **CTA (1s)**: pin ubicación + handle. 2216 2217## Cómo te ayuda HeroShots si no puedes filmar 2218 2219Sube una foto del espacio y una del item signature. Genera la escena POV de entrada con un Real Model â misma vibe, sin jornada de producción.`,faqs:[{q:"¿Va a parecer falso?",a:"No si anclas la escena AI a fotos reales del local. HeroShots conserva arquitectura, iluminación y rótulos."},{q:"¿Debo geotaggear?",a:"SÃ. Los vÃdeos 'found this place' geotaggeados siguen apareciendo en la TikTok Search 'near me' mucho después de publicarse."}]},de:{title:"'I Found This Place'-Video für dein lokales Business erstellen",description:"Discovery-Style-POV-Videos bringen deutlich mehr Saves als Standard-Menü-Posts. Die Formel für Restaurants, Cafés, Gyms, Salons.",body:`'I Found This Place'-POV-Videos generieren **deutlich mehr Saves und Shares** als Menü-/Promo-Posts auf TikTok und Reels â das Format mit dem gröÃten Hebel für lokale Businesses 2026. 2220 2221## Die Formel 2222 2223- **Hook (3s)**: Handheld-Walk-In-Shot + Caption "Ich habe diesen Ort in [Viertel] gefunden und..." 2224- **Wow (4s)**: das Signature-Element (Latte-Art, Equipment, Vibe). 2225- **Proof (4s)**: Leute, die es genieÃen (oder AI-Model in der Szene). 2226- **Detail (3s)**: Preis, Zeit, Name. 2227- **CTA (1s)**: Location-Pin + Handle. 2228 2229## Wie HeroShots hilft, wenn du nicht drehen kannst 2230 2231Lad ein Foto deines Ladens und eins des Signature-Items hoch. Generiere die POV-Walk-In-Szene mit einem Real Model â gleiche Vibe, ohne Dreh-Tag.`,faqs:[{q:"Wirkt es fake?",a:"Nicht, wenn die AI-Szene auf echten Fotos deines Ladens basiert. HeroShots erhält Architektur, Licht und Beschilderung."},{q:"Soll ich geotaggen?",a:"Ja. Geotaggte 'found this place'-Videos tauchen noch lange nach dem Posten in der TikTok-Search 'in der Nähe' auf."}]},fr:{title:"Créer une vidéo 'I found this place' pour ton activité locale",description:"La vidéo POV style discovery génère bien plus de saves qu'un post menu standard. La formule pour restaurants, cafés, gyms et salons.",body:`Les vidéos POV 'I found this place' génèrent **bien plus de saves et de shares** que les posts menu/promo sur TikTok et Reels â le format à plus gros levier pour les business locaux en 2026. 2232 2233## La formule 2234 2235- **Hook (3s)** : shot handheld à l'entrée + caption "J'ai trouvé cet endroit à [quartier] et..." 2236- **Wow (4s)** : la chose signature (latte art, équipement, vibe). 2237- **Proof (4s)** : gens qui en profitent (ou model AI en scène). 2238- **Detail (3s)** : prix, horaire, nom. 2239- **CTA (1s)** : pin location + handle. 2240 2241## Comment HeroShots aide si tu ne peux pas filmer 2242 2243Upload une photo de ton espace et une de l'item signature. Génère la scène POV d'entrée avec un Real Model â même vibe, sans journée de prod.`,faqs:[{q:"Ãa va paraître faux ?",a:"Non si tu ancres la scène AI sur des photos réelles de ton lieu. HeroShots conserve architecture, éclairage et enseignes."},{q:"Dois-je geotagger ?",a:"Oui. Les vidéos 'found this place' geotaggées continuent de remonter dans TikTok Search 'près de moi' longtemps après la publication."}]}}},{slug:"ai-voice-over-tts-voice-clone-guide",date:"2026-06-13",author:"HeroShots",tags:["how-to","voice","video"],translations:{en:{title:"AI Voice-Over Guide: Text-to-Speech, Voice Clone â When to Use Each",metaTitle:"AI Voice-Over Guide: TTS vs Voice Clone",description:"TTS is fine for captions-on muted feeds. Voice clone is needed when you want a creator's brand-recognizable voice on every video.",body:`**Use TTS for ad creative testing; use voice clone for owned channel content.** TTS handles most of paid social, where users watch muted. Voice clone matters when your audience associates a specific voice with your brand (founder, ambassador, repeat creator). 2244 2245## TTS â when to use it 2246 2247- Multilingual ad localization (20+ languages, one prompt). 2248- Quick variants for A/B testing. 2249- Captions-on feeds where audio is fallback. 2250 2251## Voice clone â when to use it 2252 2253- Long-form YouTube and podcast snippets. 2254- Founder-led brand content where voice = trust. 2255- Repeat creators on HeroShots who licensed their voice with explicit consent. 2256 2257## Compliance 2258 2259Never clone a voice you don't own or have explicit written consent for. HeroShots requires a granular voice-rights signature in the creator agreement, same as image rights.`,faqs:[{q:"Does TTS still sound robotic?",a:"Modern TTS (2026 models) is hard to tell apart from a real voice at short lengths. Above 30s, prosody breaks and viewers notice."}
2259,{q:"Can I clone an influencer's voice from public videos?",a:"Legally no â you need explicit written consent. HeroShots blocks uploads of voices without a signed consent record."}]},it:{title:"Guida al voice-over AI: text-to-speech, voice clone e quando usarli",description:"TTS va bene per i feed muti con captions. Il voice clone serve quando vuoi la voce riconoscibile di un brand su ogni video.",body:`**Usa TTS per il creative testing degli ad; usa il voice clone per i canali owned.** Il TTS copre gran parte del paid social, dove si guarda in muto. Il voice clone conta quando il pubblico associa una voce specifica al tuo brand (founder, ambassador, creator ricorrente). 2260 2261## TTS â quando usarlo 2262 2263- Localizzazione ad multilingua (20+ lingue, un prompt). 2264- Varianti rapide per A/B testing. 2265- Feed con captions on dove l'audio è fallback. 2266 2267## Voice clone â quando usarlo 2268 2269- Long-form YouTube e clip podcast. 2270- Contenuto founder-led dove voce = fiducia. 2271- Creator ricorrenti su HeroShots che hanno licenziato la voce con consenso esplicito. 2272 2273## Compliance 2274 2275Mai clonare una voce senza diritti o consenso scritto esplicito. HeroShots richiede una firma granulare sui diritti voce nel contratto creator, come per i diritti d'immagine.`,faqs:[{q:"Il TTS suona ancora robotico?",a:"Il TTS moderno (modelli 2026) è difficile da distinguere da una voce reale su tracce brevi. Oltre i 30s la prosodia salta e si nota."},{q:"Posso clonare la voce di un influencer da video pubblici?",a:"Legalmente no â serve consenso scritto esplicito. HeroShots blocca upload di voci senza record di consenso firmato."}]},es:{title:"GuÃa de voice-over AI: text-to-speech, voice clone â cuándo usar cada uno",description:"TTS basta para feeds muteados con captions. El voice clone se necesita cuando quieres una voz reconocible de marca en cada vÃdeo.",body:`**Usa TTS para creative testing de ads; usa voice clone para canales owned.** TTS cubre la mayor parte del paid social muteado. Voice clone importa cuando tu audiencia asocia una voz especÃfica a tu marca (founder, embajador, creator recurrente). 2276 2277## TTS â cuándo usarlo 2278 2279- Localización multilingüe (20+ idiomas, un prompt). 2280- Variantes rápidas para A/B. 2281- Feeds con captions on, audio como fallback. 2282 2283## Voice clone â cuándo usarlo 2284 2285- Long-form YouTube y snippets podcast. 2286- Contenido founder-led donde voz = confianza. 2287- Creators recurrentes en HeroShots con consentimiento explÃcito. 2288 2289## Compliance 2290 2291Nunca clones una voz sin derechos o consentimiento escrito. HeroShots exige firma granular de derechos de voz, igual que de imagen.`,faqs:[{q:"¿El TTS sigue sonando robótico?",a:"El TTS moderno (modelos 2026) es difÃcil de distinguir de una voz real en tracks cortos. Por encima de 30s la prosodia falla y se nota."},{q:"¿Puedo clonar la voz de un influencer desde vÃdeos públicos?",a:"Legalmente no â necesitas consentimiento escrito explÃcito. HeroShots bloquea uploads sin registro firmado."}]},de:{title:"AI-Voice-Over-Guide: Text-to-Speech, Voice Clone â wann was",description:"TTS reicht für stumme Feeds mit Captions. Voice-Clone braucht es, wenn deine Marke an einer wiedererkennbaren Stimme hängt.",body:`**TTS für Creative-Testing in Ads; Voice-Clone für Owned-Channels.** TTS deckt den GroÃteil des stumm konsumierten Paid Social. Voice-Clone zählt, wenn deine Audience eine spezifische Stimme mit deiner Marke verbindet (Founder, Botschafter, Repeat-Creator). 2292 2293## TTS â wann 2294 2295- Mehrsprachige Ad-Lokalisierung (20+ Sprachen, ein Prompt). 2296- Schnelle Varianten für A/B. 2297- Captions-on-Feeds mit Audio als Fallback. 2298 2299## Voice-Clone â wann 2300 2301- YouTube-Longform und Podcast-Snippets. 2302- Founder-getriebener Content, wo Stimme = Vertrauen. 2303- Repeat-Creator auf HeroShots mit expliziter Stimmen-Einwilligung. 2304 2305## Compliance 2306 2307Klonen ohne Rechte oder schriftliche Einwilligung: nie. HeroShots verlangt granulare Stimm-Rechte im Creator-Vertrag â wie Bildrechte.`,faqs:[{q:"Klingt TTS noch roboterhaft?",a:"Moderne TTS (2026) ist bei Kurztracks kaum von einer echten Stimme zu unterscheiden. Ãber 30s bricht die Prosodie und fällt auf."},{q:"Darf ich Influencer-Stimmen aus Public Videos klonen?",a:"Rechtlich nein â explizite schriftliche Einwilligung nötig. HeroShots blockt Uploads ohne Consent-Record."}]},fr:{title:"Guide voice-over AI : text-to-speech, voice clone â quand utiliser",description:"TTS suffit pour les feeds muets avec captions. Le voice clone s'impose quand tu veux une voix de marque reconnaissable sur chaque vidéo.",body:`**TTS pour creative testing d'ads ; voice clone pour les canaux owned.** Le TTS couvre l'essentiel du paid social muet. Le voice clone compte quand ton audie
2307nce associe une voix spécifique à ta marque (founder, ambassadeur, créateur récurrent). 2308 2309## TTS â quand l'utiliser 2310 2311- Localisation ad multilingue (20+ langues, un prompt). 2312- Variantes rapides pour A/B. 2313- Feeds captions-on, audio en fallback. 2314 2315## Voice clone â quand l'utiliser 2316 2317- YouTube long-form et snippets podcast. 2318- Contenu founder-led où voix = confiance. 2319- Créateurs récurrents sur HeroShots ayant licencié leur voix avec consentement explicite. 2320 2321## Compliance 2322 2323Ne jamais cloner une voix sans droits ou consentement écrit explicite. HeroShots exige une signature granulaire des droits voix dans le contrat créateur, comme pour l'image.`,faqs:[{q:"Le TTS sonne-t-il encore robotique ?",a:"Le TTS moderne (modèles 2026) est difficile à distinguer d'une voix réelle sur tracks courts. Au-delà de 30s la prosodie casse et se remarque."},{q:"Puis-je cloner la voix d'un influenceur depuis vidéos publiques ?",a:"Légalement non â il faut un consentement écrit explicite. HeroShots bloque les uploads sans record signé."}]}}}],tP=[{slug:"ugc-skincare-brands-guide",date:"2026-06-14",updated:"2026-07-27",author:"HeroShots",tags:["vertical","skincare","beauty"],translations:{en:{title:"UGC for Skincare Brands: The Complete Guide",description:"Skincare UGC rests on routine, texture and skin-tone match. The formats, shot lists, prompts, claim rules and costs for scaling creator-style video.",body:`Skincare UGC works when it answers the three questions a shopper silently asks before buying: what does the routine look like, how does the product feel on skin, and does it look right on skin like mine. That maps to three formats â the **routine video** (20â30s), the **texture close-up** (5â10s, no script) and a **skin-tone matched still set** â plus one discipline to settle before any of it runs as an ad: how you talk about results. Before/after imagery and efficacy language are the fastest route to a rejected ad or a letter from a regulator. This guide covers the shot list, the prompting, the casting, the claim rules, and how to produce a whole month with [AI UGC](/glossary/ai-ugc) instead of booking a shoot per SKU. 2324 2325## What kinds of skincare UGC actually convert? 2326 2327Skincare shoppers frequently skip past hero-on-marble product shots and slow down for content that shows a product being *used*. Four formats carry most of the weight, each doing a different job in the funnel. 2328 2329| Format | Length | Must show | Best used for | 2330| --- | --- | --- | --- | 2331| Routine video | 20â30s | Order of steps, hands on face, real bathroom light | Cold traffic, TikTok/Reels, education | 2332| Texture close-up | 5â10s | Pump, spread, absorb â macro, no face | Retargeting, hooks, silent autoplay | 2333| Skin-tone matched stills | Still image | Same product, different skin tones | Product-page galleries, catalog, dynamic ads | 2334| Talking testimonial | 15â30s | Face, one specific benefit, no result claim | Mid-funnel, comment-objection replies | 2335 2336Keep the routine video and the texture close-up in permanent rotation. The texture clip is the cheapest thing to produce and the most reusable: it works as a standalone ad, as the opening seconds of a longer edit, and as a loop on the product page. 2337 2338### Why texture punches above its weight 2339 2340Texture is the part of skincare a still photo cannot communicate. A shopper wants to know whether a serum is watery or tacky, whether a cream pills under makeup, whether an oil sinks in. A five-second macro answers that better than any bullet point, and it needs no script, no face on camera and no voiceover to localise. 2341 2342## How do you build a routine video that doesn't look staged? 2343 2344Structure the 20â30 seconds as four beats and prompt each one separately, then edit them together. Trying to generate a whole routine in one shot is where things start to look synthetic. 2345 2346- **0â3s â the hook.** Product already in hand, mid-motion. No logo card, no "hi guys". A hand reaching for the bottle on a cluttered bathroom shelf tends to hold attention better than an empty studio counter. 2347- **3â12s â application.** Face in frame, fingertips touching skin, a little imprecision. Two products maximum, or it stops reading as a routine and starts reading as a catalog. 2348- **12â20s â texture insert.** Cut to the macro. This is where you reuse a clip you already generated. 2349- **20â30s â the payoff.** Face again, natural light, a sensory line rather than a results line: "sinks in before I even get to sunscreen." 2350 2351Write the prompt like a shot description, not a wish: subject, skin tone, setting, light source, camera distance, action, and what to exclude. "Close-up, warm bathroom morning light from a window on the left, hands pressing a lightweight gel into cheeks, slight sheen, no makeup, handheld phone framing" gives a usable clip far more reliably than "woman applying skincare, cinematic." 2352 2353Keep every generation for one campaign inside one project. Batches are billed per project: **â¬4.90 for the first batch of 4 variants, â¬1.90 for each further batch in the same project**, so the exploration after the first attempt is the cheap part. 2354 2355## How do you get texture close-ups that look real? 2356 2357Macro is unforgiving, so be specific about the physics you want. 2358 23591. **Name the viscosity.** "Thin, watery essence that beads slightly", "thick balm that stays proud of the skin", "gel-cream that flattens as it spreads". Vague words like "luxurious" produce vague results. 23602. **Name the surface.** Back of the hand, inner forearm, cheekbone. Each behaves differently and reads differently to a viewer. 23613. **Name the light.** Hard side light shows relief. Flat front light kills it. Backlight makes droplets glow but tips easily into CGI-looking. 23624. **Name the motion.** Pump, drip, dollop, swipe, tap, absorb. The absorb beat tends to be what holds attention to the end. 23635. **Exclude the tells.** Over-glossy skin, perfectly symmetric droplets and dust-free glass most often make a texture clip look artificial. 2364 2365Generate a batch of four, pick one, then use **an edit on the chosen image at â¬0.39 (â¬0.23 with HeroShots Pro)** to fix the one thing that's off â a label rotation, a highlight, a crop â rather than re-rolling the batch. 2366 2367## How do you cover skin-tone diversity without running a casting call? 2368 2369This is where AI production genuinely changes what a small brand can do. A traditional shoot forces you to pick two or three models and hope they cover your customer base. Generating lets you build a set that spans a wide range of skin tones for the same campaign. Two rules matter. 2370
2371**Cast, don't recolour.** Do not take one avatar and ask a model to darken or lighten the skin. Beyond the obvious ethical problem, it produces images where lighting, undertone and features don't agree with each other, and audiences notice. Use a separate creator or AI avatar per skin tone, each with its own identity. 2372 2373**Hold identity across the set.** A serum ad only works as a series if the same person is recognisably the same person from hook to payoff â that's [avatar consistency](/glossary/avatar-consistency), the difference between a campaign and four unrelated clips. 2374 2375If you use a real catalog model rather than an AI avatar, a creator likeness fee applies: **+25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos**, and consent and [likeness licensing](/glossary/likeness-licensing) sit behind it so the creator is credited and paid. AI avatars add no fee. For a house face you own end to end, custom AI avatar setup is **â¬100 one-time** and bringing your own model is **â¬300 one-time**. 2376 2377## What can you say about results â and what should you never claim? 2378 2379Skincare is a heavily regulated advertising category, and the risk is not evenly spread: cosmetic claims about appearance are treated differently from claims that a product treats a condition. Ad platforms generally restrict or discourage before/after imagery in health and beauty categories, and generally expect efficacy claims to be substantiated â but the wording changes, so check current policy on each platform first. National regulators and cosmetics rules differ by market too. 2380 2381Practical guardrails that hold up across most of them: 2382 2383- **Don't generate a "result".** Never prompt a model to produce clearer, brighter or younger-looking skin as the *after* of a pair. A synthetic before/after is a fabricated result, and no disclaimer rescues it. 2384- **Show sensation, not outcome.** "Absorbs fast", "no sticky finish", "layers under SPF" describe the product. "Fades dark spots" describes a medical-adjacent outcome and needs evidence you actually hold. 2385- **If you have real evidence, use real assets.** Photography from your own consumer test, with its actual timeframe and conditions on screen and the standard "results vary" framing. Use generated content around it, never for the result itself. 2386- **Avoid condition language.** Acne, eczema, rosacea and melasma can move a cosmetic product toward being treated as a medicinal one in many markets. 2387- **Keep a paper trail.** Which avatar, which prompt, which claim, which approval. That is ordinary [brand safety](/glossary/brand-safety) hygiene, and it is what makes an ad account review survivable. 2388 2389Disclose AI content where the platform or your market requires it. Free-plan output is watermarked; if you need clean files for paid distribution, that is a paid-plan question, not a policy workaround. 2390 2391## How do you produce a month of skincare UGC, step by step? 2392 23931. **Pick three angles, not thirty.** Texture, routine fit, and one objection ("won't it pill under makeup?"). Everything else is a variant. 23942. **Import the product.** Upload clean product shots or pull them from an Amazon URL. 23953. **Cast four to six avatars** across skin tones, mixing AI avatars and licensed creators. 23964. **Generate texture first.** One project, several batches. Four variants come back per batch, typically in under a minute. 23975. **Pick and edit,** don't re-roll. Fix the single flaw at â¬0.39 per edit. 23986. **Build routine videos** from the winning texture beats: **â¬15 for video up to 15s, â¬35 for video up to 30s**, with extra retries at **â¬5 per 15s block**. 23997. **Run claim review before edit-out.** Cheaper to kill a prompt than a finished video. 24008. **Ship in pairs** â same script, different skin tone â so you can read which casting resonates. 24019. **Keep the losers.** Second-choice variants become organic posts and product-page loops. 240210. **Rebuild monthly** from the winning hook, not from scratch. 2403 2404### Wiring it into your stack 2405 2406At volume you need not work only in the browser: API access is available on paid plans, with official SDKs for npm, PyPI and Packagist, plus a Claude skill for driving generation from chat. The interface ships in five public languages. 2407 2408## What does this cost to run? 2409 2410Start on the **free plan**: 10 watermarked images a month and one video preview, no credit card, enough to test whether your product renders well in macro. From there images are billed per batch of 4 variants (â¬4.90 for the first batch in a project, â¬1.90 for each further batch in the same project) and videos are â¬15 or â¬35 by length â see [pricing](/pricing) for the full breakdown. 2411 2412If video is your main format, the pre-paid packages lower the per-unit cost: **Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video)**. **HeroShots Pro at â¬99/month** removes the watermark, enables direct downloads, applies â15% on videos, cheaper edits and a priority queue. All prices exclude VAT. 2413 2414For the wider trade-off against booking talent, a studio and a photographer for every seasonal drop, see [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). 2415 2416## What mistakes make skincare UGC fall flat? 2417 2418- **Too many products in one clip.** A five-step routine is a catalog, not a recommendation. 2419- **Studio lighting.** Bathroom light, window light, slightly imperfect framing. Polish reads as an ad. 2420- **No hands.** Skincare is tactile; a product never touched never feels real. 2421- **Recycling one avatar across every skin tone.** Cast properly. 2422- **Leaving claims to the end.** Compliance is a brief input, not a final approval step. 2423- **Only making video.** Texture stills carry the product pages and dynamic ad slots video cannot fill.`,faqs:[{q:"What are the best UGC formats for a skincare brand?",a:"Four formats do most of the work: a 20â30 second routine video showing the order of steps and hands on skin, a 5â10 second texture close-up with no script, a set of skin-tone matched stills for product pages and dynamic ads, and a 15â30 second talking testimonial focused on one specific, non-medical benefit. Keep the routine video and the texture close-up in permanent rotation, since the texture clip also doubles as a hook for longer edits and as a loop on the product page."},{q:"How long should a skincare routine video be?",a:"Twenty to thirty seconds, built as four beats: a three-second hook with the product already in hand and in motion, roughly nine seconds of application with fingertips actually touching skin, a texture insert around the twelve-second mark, and a payoff line at the end that describes sensation rather than results. Generate each beat separately and edit them together â trying to produce a full routine in a single generation is where the output starts to look synthetic."},{q:"Are before-and-after images allowed in skincare ads?",a:"Ad platforms generally restrict or discourage before/after imagery in health and beauty categories, and generally expect efficacy claims to be substantiated, but the rules differ by platform and by market and change over time, so check current policy before building a campaign around one. The firm rule regardless of platform: never generate the 'after' with AI. A synthetic result is a fabricated claim, and n
2423o on-screen disclaimer fixes that. If you hold real consumer-test evidence, use the actual photography from that test with its real timeframe and conditions stated."},{q:"Can I use AI to generate skincare before/after content?",a:"No â not for the result itself. Prompting a model to produce clearer, brighter or younger-looking skin as the 'after' of a pair fabricates evidence of efficacy. You can use AI UGC for everything around the claim: routine videos, texture close-ups, application shots, and testimonials about how a product feels or fits into a routine. The result frame should come from real photography backed by real testing."},{q:"How do I show skin-tone diversity in AI-generated skincare content?",a:"Cast a separate creator or AI avatar for each skin tone rather than recolouring one avatar. Recolouring is both an ethical problem and a technical one: lighting, undertone and facial features stop agreeing with each other and audiences notice. Build four to six avatars across a wide range of skin tones for the same campaign, keep each one's identity stable across the shot sequence, and ship in pairs â same script, different skin tone â so you can see which casting resonates."},{q:"What should a skincare texture close-up actually show?",a:"Three moments: the dispense (pump, drip or dollop), the spread, and the absorb. The absorb beat tends to be what holds attention to the end. Prompt the physics explicitly â name the viscosity ('thin watery essence', 'thick balm that stays proud of the skin'), the surface (back of hand, inner forearm, cheekbone), the light direction, and the motion. Hard side light reveals relief; flat front light kills it. Exclude over-glossy skin and perfectly symmetric droplets, which are common tells that a macro clip is artificial."},{q:"How much does it cost to produce skincare UGC with HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project, with an edit on a chosen image at â¬0.39 (â¬0.23 with HeroShots Pro). Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Pre-paid video packages lower the unit cost: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). All prices exclude VAT."},{q:"Is there a fee for using a real creator instead of an AI avatar?",a:"Yes. Using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos â this is what funds the creator royalty behind the licensed likeness. AI avatars add no fee. If you want a proprietary face, custom AI avatar setup is â¬100 one-time and bringing your own model is â¬300 one-time. All prices exclude VAT."},{q:"Can I test skincare UGC before paying?",a:"Yes. The free plan gives you 10 watermarked images a month and one video preview with no credit card, which is enough to check how your packaging and textures render before committing budget. Free-plan output carries a watermark, so for clean files intended for paid distribution you will need a paid plan or HeroShots Pro at â¬99/month, which removes the watermark, enables direct downloads, applies â15% on videos, cheaper edits and a priority queue."},{q:"What claims should skincare UGC avoid entirely?",a:"Avoid condition language â acne, eczema, rosacea, melasma â which can push a cosmetic product toward being regulated as a medicinal one in many markets. Avoid outcome claims you cannot substantiate with your own testing, such as fading pigmentation or reducing wrinkles. Stick to what the product does in the moment: absorbs quickly, no sticky finish, layers under SPF, doesn't pill under makeup. Run claim review at the brief stage rather than after the video is finished, and keep a record of which avatar, prompt and claim were approved."}],metaTitle:"UGC for Skincare Brands: A Practical Guide"},it:{title:"Contenuti UGC per brand skincare: la guida completa",description:"L'UGC skincare converte su routine, texture e prima/dopo. Come scalare 50+ video stile creator al mese con l'AI.",body:`L'UGC skincare batte tipicamente gli ad da studio sull'add-to-cart perché lo spettatore vuole vedere texture, applicazione e match con il proprio fototipo. I due formati che vincono: **routine** (mattina/sera, 20â30s) e **close-up texture** (5â10s, no script). 2424 2425## Cosa mostrare 2426 2427- **Texture**: pump, stesura, assorbimento. Vince la macro. 2428- **Diversità fototipi**: 5â7 Real Model su scala Fitzpatrick. 2429- **Prima/Dopo**: solo con dati clinici â evita i flag Meta.`,faqs:[{q:"I prima/d
2429opo sono ammessi su Meta?",a:"Solo con evidenza clinica documentata e disclaimer on-screen. Altrimenti Meta rifiuta. Usa il framing 'dopo 4 settimane di routine' invece del claim visivo puro."}]},es:{title:"UGC para marcas skincare: la guÃa completa",description:"El UGC skincare convierte en rutina, textura y antes/después. Cómo escalar 50+ vÃdeos estilo creator al mes con AI.",body:`El UGC skincare suele superar a los ads de estudio en add-to-cart porque el espectador quiere ver textura, aplicación y match con su fototipo. Los dos formatos ganadores: **rutina** (mañana/noche, 20â30s) y **close-up textura** (5â10s, sin script). 2430 2431## Qué mostrar 2432 2433- **Textura**: pump, extensión, absorción. Gana el macro. 2434- **Diversidad fototipos**: 5â7 Real Models en escala Fitzpatrick. 2435- **Antes/Después**: solo con datos clÃnicos â evita flags Meta.`,faqs:[{q:"¿Antes/Después se permiten en Meta?",a:"Solo con evidencia clÃnica y disclaimer en pantalla. Si no, Meta rechaza. Usa el framing 'tras 4 semanas de rutina' en vez de claim visual puro."}]},de:{title:"UGC für Skincare-Marken: Der komplette Guide",description:"Skincare-UGC konvertiert über Routine, Textur und Before/After. So skalierst du 50+ Creator-Style-Videos pro Monat mit AI.",body:`Skincare-UGC schlägt Studio-Ads typischerweise beim Add-to-Cart, weil Zuschauer Textur, Anwendung und Hauttyp-Match sehen wollen. Die zwei Gewinner-Formate: **Routine** (morgens/abends, 20â30s) und **Textur-Close-Ups** (5â10s, ohne Skript). 2436 2437## Was zeigen 2438 2439- **Textur**: Pump, Aufstrich, Aufnahme. Makro gewinnt. 2440- **Hauttyp-Vielfalt**: 5â7 Real Models über Fitzpatrick-Skala. 2441- **Before/After**: nur mit klinischen Daten â Meta-Policy-Flags vermeiden.`,faqs:[{q:"Sind Before/After-Claims auf Meta erlaubt?",a:"Nur mit belegbarer klinischer Evidenz und On-Screen-Disclaimer. Sonst lehnt Meta ab. Besser 'nach 4 Wochen Routine' statt purem Visual-Claim."}]},fr:{title:"UGC pour marques skincare : le guide complet",description:"L'UGC skincare convertit sur routine, texture et avant/après. Comment scaler 50+ vidéos style créateur par mois avec l'AI.",body:`L'UGC skincare bat souvent les ads studio sur l'add-to-cart parce que le spectateur veut voir texture, application et match avec son phototype. Les deux formats gagnants : **routine** (matin/soir, 20â30s) et **close-up texture** (5â10s, sans script). 2442 2443## Quoi montrer 2444 2445- **Texture** : pump, étalement, absorption. Le macro gagne. 2446- **Diversité phototypes** : 5â7 Real Models sur l'échelle Fitzpatrick. 2447- **Avant/Après** : seulement avec données cliniques â éviter les flags Meta.`,faqs:[{q:"Les avant/après sont-ils admis sur Meta ?",a:"Seulement avec preuve clinique et disclaimer à l'écran. Sinon Meta rejette. Préfère 'après 4 semaines de routine' au pur claim visuel."}]}}},{slug:"haircare-product-demo-videos-ai",date:"2026-06-15",updated:"2026-07-27",author:"HeroShots",tags:["vertical","haircare","beauty"],translations:{en:{title:"How to Create Haircare Product Demo Videos With AI: Shots, Hair Types, and What's Hard to Fake",description:"Shot list, hair-type coverage and production order for AI haircare demo videos, plus what generative video still gets wrong on hair and how to fix it.",body:`A haircare demo works when it proves three things fast: how the product goes on, how the hair moves once it is in, and what the texture looks like at close range. Everything else is packaging. AI video makes that sequence cheap to produce and, more usefully, cheap to *repeat*: the same curl cream demo can run on loose waves and on tight coils without booking two shoots. The catch is that hair is one of the harder subjects for a generative model to render honestly, so the winning workflow is not "write a prompt and hit render". It is storyboarding in stills first, buying motion only for the beats that need it, and designing shots around what the model handles well. On HeroShots that shape is easy to price: images are billed per batch of 4 variants, â¬4.90 for the first batch of a project and â¬1.90 for each further batch in the same project, while video is â¬15 up to 15 seconds and â¬35 up to 30 seconds. The storyboard is the cheap part; the render is worth protecting. 2448 2449## What makes a haircare demo video work? 2450 2451Haircare is a proof category, not a mood category. Someone watching a mask demo has one slightly anxious question â *will this do anything to hair like mine?* â and the video either answers it almost immediately or gets scrolled. 2452 2453Three jobs, by weight: 2454 2455- **Application legibility.** The viewer needs to see dose and placement. A pea of serum on mid-lengths and a palm of mask through the ends are different products, and a demo that hides the amount reads as evasive. 2456- **Movement.** Shine, weight, separation and bounce only exist as motion cues. A still can be lit into looking healthy, so movement tends to carry more credibility. 2457- **Result at close range.** A mid-shot result is not a result. Frizz halo, curl definition and root lift live in a tight frame. 2458 2459One rule matters more here than in most categories: **one promise per video.** A clip claiming shine *and* volume *and* heat protection *and* colour safety proves none of them. Make four short videos, not one long one â which is what [performance creative](/glossary/performance-creative) testing wants anyway. 2460
2461## What should each shot in a haircare demo show? 2462 2463The classic three-shot structure still holds and fits inside a single 15-second render. 2464 2465### The three-shot core 2466 2467- **Application (about 5s).** Product in hand, dispense, distribute. Keep the pack label readable for a beat â this is the only moment the viewer connects the result to the bottle. 2468- **Movement (about 7s).** Hair flip, head turn, or a hand running down the lengths. Light should travel across the hair rather than sit flat on it. 2469- **Result (about 5s).** Final look, simple background, tighter crop than you think you need. 2470 2471### Beats worth adding by product type 2472 2473- **Sectioning and parting** for scalp-care products â the parting shot is the whole demo. 2474- **Comb drag** for detanglers and conditioners; resistance and release are the promise. 2475- **Second-day shot** for hold, dry shampoo and texture sprays, framed as "next morning" rather than as any kind of clinical result. 2476- **Wet-to-dry cut** for masks and treatments, as a hard cut rather than a morph (more on why below). 2477 2478## Which video format fits which haircare product? 2479 2480| Product | Hero shot | Suggested length | What it has to prove | 2481| --- | --- | --- | --- | 2482| Shampoo | Lather build at the scalp | 15s | Cleansing feel; foam per dose | 2483| Conditioner or mask | Finger glide through wet ends | 15s | Slip and detangling, not shine | 2484| Leave-in curl cream | Scrunch, then dry curl close-up | 30s | Definition on a stated curl pattern | 2485| Hair oil or serum | Mid-length application, then movement | 15s | Shine without greasiness; dose control | 2486| Heat protectant | Spray, tool contact, result | 30s | Routine placement, not an outcome | 2487| Dry shampoo | Root close-up, then brush-out | 15s | Root lift and no white cast | 2488| Styling gel or wax | Reshaping, cast break, hold check | 30s | Stated hold strength, and flexibility | 2489| Scalp serum | Parting, dropper, massage | 15s | Precision and comfort of application | 2490 2491The two-length split matters commercially. A single-promise beat fits a 15-second video at â¬15; a routine with a wet stage, a dry stage and a result needs the 30-second format at â¬35. Building that routine as two 15-second videos and cutting them together is often more flexible: you can re-render one half without paying for the other. 2492 2493## How do you cover hair-type diversity without ten separate shoots? 2494 2495This is where AI production changes the economics, not just the workflow. A traditional shoot forces a brand to pick a handful of hair types and hope the rest of the audience extrapolates. They frequently do not â shoppers with textured, fine, greying or colour-treated hair tend to look for hair like theirs before they believe a claim. 2496 2497A practical coverage plan: 2498 2499- Use the standard curl-pattern typing (straight, wavy, curly, coily) as your casting grid, and cover at least one type per band your product actually serves. Do not feature a type you have not tested the product on. 2500- Keep script, framing and product handling identical across versions and change only the creator. That isolates the variable and keeps the set coherent. 2501- Treat density and length as separate variables from curl pattern. Fine and thick straight hair behave nothing alike in a movement shot. 2502- Lock the creator or avatar before you generate, so the matrix comes from one stable identity. 2503 2504When you use a real catalog model, [likeness licensing](/glossary/likeness-licensing) and creator royalties are handled inside the platform, and the likeness fee is +25% on the base price with a floor of â¬0.90 on images and â¬5 on videos. AI avatars carry no likeness fee, which makes them a sensible choice for early tests. Either way, [avatar consistency](/glossary/avatar-consistency) keeps that face the same across the whole matrix; if the model drifts between the application shot and the result shot, the demo stops reading as one person and the proof evaporates. 2505 2506## What is hard to fake in AI haircare video? 2507 2508Design around these failure modes rather than fighting them. 2509 2510| Generally renders well | Needs care and review | Best avoided or cut around | 2511| --- | --- | --- | 2512| Head turns, flips, light across lengths | Wet-to-dry continuity in one clip | A hand pushing through dense hair, close up |
2513| Product held at a fixed angle | Flyaways and frizz halo at the edge | A continuous brush pass, root to tip | 2514| Mid-shot application on straight hair | Tight coil definition and clump edges | Lather forming and collapsing in real time | 2515| Scalp partings held still | Length continuity across renders | Clips or tools occluding hair mid-motion | 2516 2517### Why these break 2518 2519Strand-level collision is the root cause. Anything where a solid object passes *through* hair â fingers, a comb, a round brush â asks the model to resolve an enormous number of occlusions per frame, and that is where you get melting, merging, or a comb that quietly vanishes. Foam is a second problem: lather has volume, moves and changes state, and state changes over time are what generative video is weakest at. Wet-to-dry in one shot is the same problem in slow motion. 2520 2521### The workarounds 2522 2523Cut on movement instead of rendering the transition: frame the comb entering and leaving as two beats, and let the edit imply the middle. Keep hands at the periphery of the hair rather than buried in it. Generate the "before" and the "after" as two renders from the same locked avatar rather than asking for a morph, holding framing constant so the cut reads as continuity. And produce close-ups as stills wherever you can â a still frame of coil definition survives scrutiny far better than four seconds of it moving. 2524 2525## How do you produce a haircare demo set, step by step? 2526 25271. **Write the single promise.** One sentence: "defines curls without crunch." If you cannot write it, you do not have a video yet. 25282. **Get the product in cleanly.** Import from an Amazon URL or upload a clean pack shot; label legibility depends on this input. 25293. **Pick the creator or AI avatar and lock the hair type.** Curl pattern, density and length, decided before you generate anything. 25304. **Storyboard in stills first.** Generate your three key frames as images: the first batch of a project is â¬4.90 for 4 variants, each further batch in the same project â¬1.90. A batch typically returns in under a minute, so a storyboard is a few euros of iteration rather than a shoot day. See [batch generation](/glossary/batch-generation) for how variants work. 25315. **Fix near-misses with edits** at â¬0.39 per edit (â¬0.23 with HeroShots Pro) instead of re-rolling a whole batch. 25326. **Buy motion only for approved frames.** Video up to 15s is â¬15, up to 30s is â¬35, extra retries â¬5 per 15s block. This is the reason to storyboard: you convert â¬15 mistakes into â¬1.90 ones. 25337. **Assemble and caption.** Hard-cut on movement; keep the first frame a face or a hand on product, not a logo. 25348. **Version across the matrix.** Same script, different hair type. Teams working at volume can drive this through the API, available on paid plans alongside official npm, PyPI and Packagist SDKs. 2535 2536## What does a haircare demo set cost on HeroShots? 2537 2538| Item | Price | 2539| --- | --- | 2540| First image batch in a project (4 variants) | â¬4.90 | 2541| Each further batch, same project (4 variants) | â¬1.90 | 2542| Edit on a chosen image | â¬0.39 (â¬0.23 with Pro) | 2543| Video up to 15s | â¬15 | 2544| Video up to 30s | â¬35 | 2545| Extra retries | â¬5 per 15s block | 2546| HeroShots Pro | â¬99/month | 2547 2548Pro removes the watermark, enables direct downloads, applies â15% on videos, lowers edit pricing and adds a priority queue. The free plan gives 10 watermarked images a month and one video preview, no credit card. Pre-paid video packages start at Starter â¬350 (â¬70/video). All prices exclude VAT. Full rates sit on [pricing](/pricing), and the [AI UGC vs product photoshoot comparison](/compare/ai-ugc-vs-product-photoshoot) covers where each approach wins. 2549 2550## What can you say about haircare results without getting the ad rejected? 2551 2552Treat this as a live compliance question, and take proper advice for your markets. Advertising platforms generally apply extra scrutiny to before-and-after imagery in beauty and personal care, and tend to be stricter again where a claim edges toward a health or medical outcome. Rules differ by platform and market and they change, so check current policy for each channel before you scale a format. 2553 2554Safer framing in practice: show a routine rather than a transformation, describe what the product does rather than what the user will get, and anchor any comparative visual to a stated, honest condition ("day three, no wash"). Cosmetic-effect language â smoothing, defining, adding shine â is generally on firmer ground than outcome language about growth or thickness. Disclose that c
2554ontent is AI-generated where the platform or local rules require it; free-plan outputs carry a watermark, while Pro removes it and leaves disclosure to your own policy. And make sure the demo actually shows what you claim: a video that promises definition and delivers a shine shot is a conversion problem long before it is a compliance one.`,faqs:[{q:"Can AI render realistic hair in a product demo?",a:"For most demo work, yes. Current models handle straight, wavy and curly hair convincingly in head turns, flips and mid-shot application. The weak spots are strand-level interactions: fingers or a comb passing through dense hair, lather forming and collapsing, and very tight coil definition in close-up. Design shots to avoid the weak spots â tighter framing, hands at the periphery, hard cuts instead of morphs â rather than trying to prompt your way through them."},{q:"How long should a haircare demo video be?",a:"Fifteen seconds for a single promise, thirty for a full routine with a wet stage and a dry stage. The classic structure fits comfortably in fifteen: about five seconds of application, seven of movement, five of result. If you need more than thirty seconds, you are almost certainly making two videos instead of one."},{q:"What does it cost to produce a haircare demo video on HeroShots?",a:"Video up to 15 seconds is â¬15 and video up to 30 seconds is â¬35, with extra retries at â¬5 per 15-second block. Storyboarding in stills first is much cheaper: the first image batch of a project is â¬4.90 for four variants and each further batch in the same project is â¬1.90, with edits at â¬0.39 (â¬0.23 with HeroShots Pro). Pre-paid video packages are Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). All prices exclude VAT."},{q:"Do I pay extra to use a real model instead of an AI avatar?",a:"Yes. Using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos, and that fee funds the creator's royalty. AI avatars carry no likeness fee. Custom AI avatar setup is â¬100 one-time and bringing your own model is â¬300 one-time."},{q:"How do I show the same product on different hair types?",a:"Keep the script, framing and product handling identical and change only the creator. Cover at least one creator per curl-pattern band your product genuinely serves, and treat density and length as separate variables from curl pattern â fine and thick straight hair behave completely differently in a movement shot. Do not feature a hair type you have not actually tested the product on."},{q:"Why does the wet-to-dry transition look wrong in AI video?",a:"State changes over time are among the hardest things for generative video to sustain. Wet hair has different weight, clumping and specularity than dry hair, and asking a model to interpolate between them inside one continuous shot usually produces melting or drifting geometry. Render the wet stage and the dry stage as two separate clips from the same avatar with matched framing, then hard-cut between them."},{q:"Can I use before-and-after shots in haircare ads?",a:"Cautiously, and only after checking the current policy for each platform and market. Advertising platforms generally apply extra scrutiny to before-and-after imagery in beauty and personal care, and more again where a claim moves toward a health or medical outcome. Framing the content as a routine, using cosmetic-effect language such as smoothing or defining, and anchoring any comparison to an honest stated condition is lower-risk than a pure visual transformation claim. Take proper advice for your own markets."},{q:"How do I keep the same model across a whole haircare campaign?",a:"That is avatar consistency: anchoring one identity so the face, hair and proportions stay stable across every generation. It matters more in haircare than elsewhere, because a demo only works if the viewer accepts that the application shot and the result shot show the same head of hair. Generate a campaign's shots from the same locked avatar rather than re-describing the person in each prompt."},{q:"Should I generate haircare content as images or video?",a:"Both, in that order. Stills are the right medium for close-ups of curl definition, frizz and root lift, because a still frame survives scrutiny better than motion of the same detail â and at â¬1.90 per additional batch of four variants in the same project, iteration is cheap. Use video for what only motion can prove: bounce, weight and light travelling across the lengths. Approving the key frames as stills before you buy motion keeps a wrong creative decision at a couple of euros instead of fifteen."},{q:"Can I automate haircare demo production across a large catalogue?",a:"Yes. Official npm, PyPI and Packagist SDKs and API access are available on paid plans, so a brand with many SKUs can drive product import, batch generation and versioning programmatically. The practical pattern is to standardise one shot template per product type, then loop it across SKUs and hair types rather than hand-prompting each asset."}
2554],metaTitle:"AI Haircare Demo Videos: Formats & Prompts"},it:{title:"Come creare video demo per un prodotto haircare con l'AI",description:"Chi compra haircare converte su brillantezza, movimento e cambio di texture. Il formato demo a 3 shot che funziona per shampoo, maschere e styling.",body:`Le demo haircare vincono quando mostrano **movimento, brillantezza e un cambio di texture netto** in meno di 20 secondi. L'AI permette di generare la sequenza a 3 shot con lo stesso model in stati capello diversi senza coordinare uno shooting. 2555 2556## La demo a 3 shot 2557 2558- **Applicazione** (5s): prodotto in mano, dose, distribuzione. 2559- **Movimento** (7s): flip / passata di spazzola, luce che cattura la brillantezza. 2560- **Risultato** (5s): look finale, sfondo semplice.`,faqs:[{q:"L'AI rende capelli realistici?",a:"I modelli 2026 gestiscono lisci, mossi e ricci con buona resa. I ricci 4C molto stretti richiedono ancora prompt accurato e foto reference del Real Model."}]},es:{title:"Cómo crear vÃdeos demo de productos haircare con AI",description:"El comprador de haircare convierte en brillo, movimiento y cambio de textura. El formato demo de 3 shots para champú, mascarillas y styling.",body:`Las demos haircare ganan cuando muestran **movimiento, brillo y un cambio claro de textura** en menos de 20 segundos. AI permite generar la secuencia de 3 shots con el mismo model en distintos estados del pelo sin coordinar shooting. 2561 2562## La demo de 3 shots 2563 2564- **Aplicación** (5s): producto en mano, dosis, distribución. 2565- **Movimiento** (7s): flip / cepillado, luz que capta brillo. 2566- **Resultado** (5s): look final, fondo simple.`,faqs:[{q:"¿AI renderiza cabello realista?",a:"Los modelos 2026 manejan liso, ondulado y rizado de forma convincente. Rizos 4C muy cerrados aún requieren prompt cuidado y foto reference del Real Model."}]},de:{title:"Haircare-Produkt-Demo-Videos mit AI erstellen",description:"Haircare-Käufer konvertieren über Glanz, Bewegung und Texturwechsel. Das 3-Shot-Demo-Format für Shampoo, Masken und Styling.",body:`Haircare-Demos gewinnen, wenn sie **Bewegung, Glanz und einen klaren Texturwechsel** in unter 20 Sekunden zeigen. AI generiert die 3-Shot-Sequenz mit demselben Model in verschiedenen Haar-Zuständen â ohne Dreh-Koordination. 2567 2568## Die 3-Shot-Demo 2569 2570- **Auftrag** (5s): Produkt in der Hand, Dosierung, Verteilung. 2571- **Bewegung** (7s): Flip / Bürstenzug, Licht fängt Glanz. 2572- **Ergebnis** (5s): Final-Look, einfacher Hintergrund.`,faqs:[{q:"Rendert AI realistisches Haar?",a:"2026-Modelle bewältigen glattes, welliges und lockiges Haar überzeugend. Sehr enge 4C-Locken brauchen noch sorgfältige Prompts und Real-Model-Referenzfotos."}]},fr:{title:"Créer des vidéos démo de produits haircare avec l'AI",description:"L'acheteur haircare convertit sur brillance, mouvement et changement de texture. Le format démo 3 shots pour shampooing, masques et styling.",body:`Les démos haircare gagnent quand elles montrent **mouvement, brillance et un changement net de texture** en moins de 20 secondes. L'AI permet de générer la séquence 3 shots avec le même model dans des états capillaires différents sans coordonner un shooting. 2573 2574## La démo 3 shots 2575 2576- **Application** (5s) : produit en main, dose, distribution. 2577- **Mouvement** (7s) : flip / passage de brosse, lumière qui capte la brillance. 2578- **Résultat** (5s) : look final, fond simple.`,faqs:[{q:"L'AI rend-elle des cheveux réalistes ?",a:"Les modèles 2026 gèrent lisse, ondulé et bouclé de façon convaincante. Les boucles 4C très serrées demandent encore un prompt soigné et une photo réf. du Real Model."}]}}},{slug:"supplements-wellness-ugc-claims",date:"2026-06-16",updated:"2026-07-27",author:"HeroShots",tags:["vertical","supplements","wellness","compliance"],translations:{en:{title:"UGC for Supplements and Wellness: Routine Content That Sells Without Health Claims",description:"Supplement UGC works best as routine, not promise. How to show benefits without health claims: shot lists, prompt patterns and a production workflow.",body:`The most durable supplement and wellness UGC says almost nothing about health. It shows a routine: the jar next to the kettle, the scoop into a shaker, the gym bag by the door, the 9pm wind-down with the phone face-down. The benefit lives in the *context* â time of day, ritual, the mood of the person holding the product â not in a sentence asserting an outcome. That framing gives reviewers far less to object to than carefully lawyered claim copy, and it tends to be the kind of content shoppers actually stop on. So the real creative question in this category is not "how do I say my product works", it's "how do I show the life this product belongs to". This guide covers the language swaps, the shot list, the prompt patterns and the production workflow for building a rout
2578ine-led [AI UGC](/glossary/ai-ugc) library. 2579 2580## Why is supplement and wellness UGC harder to run than other categories? 2581 2582Two separate systems judge your creative, and they don't apply the same test. 2583 2584The first is regulatory. Rules on what you may say about a food supplement differ by market, and in several regions health-related claims are permitted only in specific, pre-approved forms with defined conditions of use. Broadly, language asserting that a product diagnoses, treats, cures or prevents a disease sits outside what supplement advertising is allowed to do in most places. The detail varies by jurisdiction and changes over time, so treat this article as orientation and nothing more â it is not legal advice. Have your claim set reviewed by a qualified regulatory advisor for every market you sell in. 2585 2586The second is ad-platform review, which is faster, blunter and mostly pattern-matching. In health-adjacent categories, review generally looks at more than the caption: on-screen text, spoken audio, thumbnails and the visual setup itself can all be assessed. Policies vary by platform and are updated regularly, so check the current published policy before a launch rather than relying on what worked last quarter. What stays fairly consistent is the *shape* of what draws scrutiny â implied personal transformation, body scrutiny, medical authority and urgency around a health problem. 2587 2588### The creative consequence 2589 2590If claim language is your riskiest surface, shrink that surface. Push the meaning into imagery and situation, where a routine can imply an occasion without asserting a result. This is a [brand safety](/glossary/brand-safety) decision as much as a compliance one: content built on ritual ages well, travels across markets with different claim rules, and doesn't need re-editing every time a policy shifts. 2591 2592## What can you say about a supplement without making a health claim? 2593 2594There is more safe territory than most brands use. Reliable, non-claim material includes sensory and physical facts (flavour, texture, how it dissolves, whether the powder clumps), format and convenience (sachet in a pocket, no fridge needed, one scoop), on-label facts stated exactly as they appear on your own label, price and pack size, taste preferences expressed as opinion, and adherence â the plain fact that someone keeps doing it. 2595 2596Adherence is the underused one. "Week three of actually remembering" is a story about a person and a habit, not about physiology, and it is one of the most relatable things a supplement buyer can hear. 2597 2598| The claim you want to make | What to show or say instead | Why it holds up better | 2599| --- | --- | --- | 2600| "Boosts your energy" | 6am kitchen: kettle, sachet into a glass, out the door with the dog | Time-of-day cue implies the occasion without asserting an effect | 2601| "Helps you sleep" | 9pm wind-down: lamp on, phone face-down, mug on the nightstand | Ritual framing carries the mood; nothing is promised | 2602| "Reduces bloating" | Macro shot of the powder dissolving clear, no residue on the glass | A product attribute anyone can verify, not a bodily outcome | 2603| "Clinically proven formula" | On-label facts read plainly: one scoop, unflavoured, exactly as the pack states | Factual and matches the label, so nothing new is being claimed | 2604| "Before and after, 30 days" | Same person, same kitchen, three different mornings | A continuity story about habit, with no body comparison | 2605| "Fixes your gut" | "This is week three of me actually keeping it up" | Speaks to adherence, which is honest and specific | 2606| "Doctor recommended" | Ordinary home setting, plus a plain "this is my routine, not medical advice" | Avoids implied clinical authority and medicalised staging | 2607 2608### Two rules that catch most mistakes 2609 2610An outcome implied by editing is still an outcome: a tired face, a cut, then a smiling face is a before/after even with no words on screen. And a creator saying it out loud is still your claim â you commissioned it, you ran it, you own it. 2611 2612## What lifestyle and routine shots belong in a supplement content library? 2613 2614Build the library around moments, not around the product. A useful starting set: 2615 2616**Stills.** Product on a real kitchen counter with morning side-light and a used coffee cup in frame. Hand mid-scoop over an open jar. Powder dissolving in a glass on a wooden table. The pack half-visible in an open gym bag next to keys and headphones. Nightstand still life: pack, water glass, book, lamp. Flat-lay of the weekly routine â jar, shaker, trainers â shot from above. Restock moment: two jars, one nearly empty. Travel: sachets tucked into a toiletry bag. Shoot the same product in several kitchens and you have a natural-looking grid of everyday moments without a single claim in it. 2617 2618**Video.** Five formats worth having, all short: the *five-shot morning* (wake, kettle, scoop, sip, leave); *what's in my gym bag*, product appearing without commentary; *honest first taste*, a real face reacting to flavour; *the three-second routine*, arguing convenience rather than efficacy; and *restock*, opening a new pack and putting it exactly where the old one lived. None of these need a benefit line to work â the occasion does the arguing. 2619 2620## How do you produce a month of routine content without booking a shoot? 2621 26221. **Import the product.** Upload clean pack shots, or pull them straight from an Amazon URL. Get the label legible in at least one reference image so text stays readable in generations. 26232. **Pick your face.** An AI avatar adds no likeness fee; a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. For wellness, one consistent everyday-looking person usually beats a rotating cast. 26243. **Write routine-first prompts.** Describe person, time, place, action, product and light. Do not describe results. 26254. **Generate the first batch.** A batch returns 4 variants, typically in under a minute â the first batch of a project is â¬4.90, each further batch in the same project â¬1.90. 26265. **Judge on realism, not beauty.** Keep the frames with clutter, imperfect light and a plausible kitchen. Discard anything that looks like a studio ad or a clinic. 26276. **Fix specifics with edits.** An edit on a chosen image is â¬0.39 (â¬0.23 with HeroShots Pro) â use it for label legibility, a stray artefact, or a background object that reads as medical. 26287. **Promote the two or three strongest stills into video.** Video up to 15s is â¬15 and up to 30s is â¬35, with extra retries at â¬5 per 15s block. 26298. **Run a claims pass before publishing.** Read every frame the way a reviewer would: on-screen text, spoken words, thumbnail,
2629caption. Log who approved what and when â in a regulated category, the approval trail matters as much as the asset. 2630 2631## How do you write prompts that stay clear of health claims? 2632 2633Keep the prompt about the scene. A workable anatomy is *person + time + place + action + product + mood + camera*, with no adjective describing how anyone feels physically. 2634 2635Example: "Woman in her early thirties in a small, slightly cluttered kitchen at around 7am, soft window light from the left, wearing a worn sweatshirt, scooping powder from a jar into a glass of water, half-eaten toast on the counter, shot handheld on a phone at chest height, natural colours, no styling." 2636 2637Note what's absent: no "energised", "glowing", "revitalised", "detoxing", "healing". Those words don't just risk a flag, they push the model towards glossy pharma-advert lighting, which is exactly the look that reads as a claim. Keep an explicit exclusion list in your team's prompt template: no white coats, no clinics, no stethoscopes, no measuring tape, no scales, no body close-ups, no charts or graphs on screen. 2638 2639## How do you keep the same person across a whole routine series? 2640 2641A routine only reads as real if it is one person's routine. That is what [avatar consistency](/glossary/avatar-consistency) delivers â the same face, hair and build across every morning, every gym bag, every restock, so twelve assets look like one life instead of twelve strangers. 2642 2643If you use a real creator's likeness, [likeness licensing](/glossary/likeness-licensing) and consent should be explicit and recorded, and the creator should know the category their face is appearing in. In wellness this cuts both ways: a creator who is comfortable with a product routine may not be comfortable with a script that edges into personal health outcomes. Keeping the scripts claim-free makes the licensing conversation easier too. 2644 2645## What does routine-led supplement content cost? 2646 2647Photo work is priced per batch of 4 variants: â¬4.90 for the first batch of a project, â¬1.90 for each further batch in the same project, and â¬0.39 per edit on a chosen image. Video is â¬15 up to 15s and â¬35 up to 30s, with pre-paid packages at Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). HeroShots Pro is â¬99/month and removes the watermark, adds direct downloads, â15% on videos, cheaper edits and a priority queue. There is a free plan with 10 watermarked images per month and one video preview, no credit card. All prices exclude VAT â full details on [pricing](/pricing), and a format-by-format comparison with traditional production in [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). 2648 2649The budgeting point specific to this category: because compliant creative leans on variation of *occasion* rather than variation of *message*, per-batch economics matter more than headline video cost. You will iterate on kitchens, not on claims. 2650 2651## What should never make it into a supplement ad? 2652 2653Before anything ships, check that none of these are present: before/after body imagery of any kind; scales, measuring tapes or body-part close-ups framed as a problem; white coats, clinics, stethoscopes or lab settings; the words cure, treat, prevent, heal or detox, or any disease name; testimonials describing a personal health outcome; urgency framed around a health risk; charts implying trial results; and any claim that is not on your approved, market-specific list. Build it as a literal checklist, put it in front of whoever hits publish, and keep the sign-off record. In this category the process is part of the product.`,faqs:[{q:"Can I show people taking the supplement?",a:"Yes, but contextualise it as a ritual rather than a treatment. Everyday lifestyle settings â a kitchen counter, a gym bag, a nightstand â read as routine. Medical-looking staging such as white coats, clinics or lab benches implies clinical authority and tends to attract more scrutiny in ad review."},{q:"How do I talk about a benefit without making a health claim?",a:"Move the benefit into context instead of copy. Show the time of day, the occasion and the habit â a 6am kettle-and-scoop sequence, or a 9pm wind-down â and let the viewer draw the inference. Keep spoken and on-screen language to sensory facts, on-label facts, convenience and adherence, and get any explicit claim approved by a qualified advisor for each market you sell in."},{q:"Are before-and-after images ever safe in supplements UGC?",a:"Treat them as off-limits by default. Body-composition comparisons tend to attract heavy scrutiny in this category, and an implied transformation created purely through editing is generally treated the same as one stated in words. A continuity story â the same person, same kitchen, three different mornings â gives you the habit narrative without the body comparison."},{q:"If a creator says the product worked for them, is that my claim?",a:"Effe
2653ctively yes. Content you commission, approve and run is your advertising, so a spoken personal outcome is generally treated as a brand claim regardless of who said it. Script creator content the same way you would script your own: routine, taste, texture, convenience and adherence, not results."},{q:"What visual details make supplement content look non-compliant even with clean copy?",a:"Medicalised environments, scales and measuring tapes, body-part close-ups framed as a problem, charts implying trial data, and pharma-style clinical lighting. Any of these can carry an implied claim on their own. Real, slightly imperfect home settings with natural light are the safer aesthetic, and often the one shoppers respond to."},{q:"Do platform rules for health and wellness ads change often?",a:"Platforms revise their health-related advertising policies from time to time, and enforcement can differ by market and account. Check the current published policy before each launch rather than relying on what was approved previously, and keep a record of what you ran and when it was approved."},{q:"How many assets do I need to launch a routine-led content library?",a:"A workable starting set is roughly one still per moment â morning, gym bag, nightstand, restock, travel, dissolving close-up â plus two or three short videos built from the strongest stills. On HeroShots each batch returns 4 variants, so a handful of batches covers the moment list before you commit budget to video."},{q:"Should I use an AI avatar or a real creator for a wellness brand?",a:"An AI avatar adds no likeness fee and gives full control over the routine you depict. A real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos, and brings a recognisably human face with consent and licensing handled on the platform. Whichever you choose, keep one consistent person across the series so the routine reads as a single life."},{q:"What does supplement UGC cost on HeroShots?",a:"Images are billed per batch of 4 variants: â¬4.90 for the first batch of a project and â¬1.90 for each further batch in the same project, with edits at â¬0.39 (â¬0.23 with HeroShots Pro). Video is â¬15 up to 15s and â¬35 up to 30s, with extra retries at â¬5 per 15s block. Pre-paid video packages start at Starter â¬350. Prices exclude VAT."},{q:"Who should sign off on supplement creative before it goes live?",a:"Whoever owns regulatory responsibility for the markets you advertise in, reviewing the full asset â visuals, on-screen text, spoken audio, thumbnail and caption â not just the caption. Keep a written approval record for each asset and market; in a regulated category the audit trail is part of the deliverable."}],metaTitle:"Supplements UGC: Claims You Can Safely Make"},it:{title:"UGC per integratori e wellness: cosa puoi (e non puoi) dichiarare",description:"L'UGC integratori è in equilibrio regolatorio. Cosa è sicuro mostrare, cosa fa scattare il rifiuto Meta/TikTok, come restare in zona EFSA/FDA-friendly.",body:`Gli integratori sono **tra le verticali più esposte al rifiuto degli ad** su Meta e TikTok nel 2026. La regola: mostra **lifestyle, ritualità , mood** â evita promesse di cura, perdita peso o outcome di salute specifici. Vincono routine e framing estetico, non i claim. 2654 2655## Sicuro mostrare 2656 2657- Pour, scoop, momenti di ritualità . 2658- Framing "parte della mia mattina". 2659- Claim autorizzati (EFSA UE / FDA structure-function USA). 2660 2661## Evitare 2662 2663- Prima/dopo peso, composizione corporea. 2664- "Cura", "tratta", "previene" on-screen o in voice. 2665- Ambienti che sembrano medicali.`,faqs:[{q:"Posso mostrare persone che assumono l'integratore?",a:"Sì, ma contestualizzato come rituale, non trattamento. Lifestyle (cucina, borsa palestra) ok; ambienti medicali (camice, clinica) vengono flaggati."}]},es:{title:"UGC para suplementos y wellness: qué puedes (y no) afirmar",description:"El UGC de suplementos camina sobre cuerda floja regulatoria. Qué es seguro mostrar, qué activa rechazo en Meta/TikTok, cómo quedar EFSA/FDA-fr
2665iendly.",body:`Los suplementos son **una de las verticales más expuestas al rechazo de ads** en Meta y TikTok en 2026. La regla: muestra **lifestyle, ritual, mood** â evita promesas de cura, pérdida de peso o resultados de salud especÃficos. Ganan rutina y framing estético, no los claims. 2666 2667## Seguro mostrar 2668 2669- Pour, scoop, momentos de ritual. 2670- Framing "parte de mi mañana". 2671- Claims autorizados (EFSA UE / FDA structure-function USA). 2672 2673## Evitar 2674 2675- Antes/después de peso, composición corporal. 2676- "Cura", "trata", "previene" en pantalla o voz. 2677- Entornos que parecen médicos.`,faqs:[{q:"¿Puedo mostrar a personas tomando el suplemento?",a:"SÃ, pero contextualizado como ritual, no tratamiento. Lifestyle (cocina, mochila gym) ok; entornos médicos (bata, clÃnica) son flaggeados."}]},de:{title:"UGC für Supplements und Wellness: Was du behaupten darfst â und was nicht",description:"Supplement-UGC balanciert auf dem regulatorischen Hochseil. Was sicher ist, was Meta/TikTok-Ablehnung triggert, wie du EFSA/FDA-konform bleibst.",body:`Supplements sind 2026 **eine der am stärksten von Ad-Ablehnung betroffenen Vertikalen** auf Meta und TikTok. Die Regel: zeige **Lifestyle, Ritual, Mood** â vermeide Heilversprechen, Gewichtsverlust oder spezifische Gesundheits-Outcomes. Gewinner: Routine und ästhetisches Framing, nicht Claims. 2678 2679## Sicher zu zeigen 2680 2681- Pour, Scoop, Ritual-Momente. 2682- "Teil meines Morgens"-Framing. 2683- Autorisierte Claims (EU EFSA / US FDA structure-function). 2684 2685## Vermeiden 2686 2687- Before/After Gewicht, Körperkomposition. 2688- "Heilt", "behandelt", "verhindert" on-screen oder gesprochen. 2689- Medizinisch wirkende Settings.`,faqs:[{q:"Darf ich Personen beim Einnehmen zeigen?",a:"Ja, aber als Ritual kontextualisiert, nicht als Behandlung. Lifestyle (Küche, Gym-Bag) ok; medizinische Settings (Kittel, Klinik) werden geflaggt."}]},fr:{title:"UGC pour suppléments et wellness : ce que tu peux (et ne peux pas) revendiquer",description:"L'UGC suppléments marche sur une corde raide réglementaire. Ce qui est sûr de montrer, ce qui déclenche rejet Meta/TikTok, comment rester EFSA/FDA-fr
2689iendly.",body:`Les suppléments sont **l'une des verticales les plus exposées au rejet d'ads** sur Meta et TikTok en 2026. La règle : montre **lifestyle, rituel, mood** â évite promesses de cure, perte de poids ou résultats santé spécifiques. Gagnent la routine et le framing esthétique, pas les claims. 2690 2691## Sûr à montrer 2692 2693- Pour, scoop, moments rituels. 2694- Framing "ça fait partie de ma matinée". 2695- Claims autorisés (EFSA UE / FDA structure-function US). 2696 2697## à éviter 2698 2699- Avant/après poids, composition corporelle. 2700- "Guérit", "traite", "prévient" à l'écran ou en voix. 2701- Environnements d'allure médicale.`,faqs:[{q:"Puis-je montrer des personnes prenant le supplément ?",a:"Oui, mais contextualisé comme rituel, pas traitement. Lifestyle (cuisine, sac de gym) ok ; environnements médicaux (blouse, clinique) sont flaggés."}]}}},{slug:"saas-app-ugc-founder-style-video",date:"2026-06-17",updated:"2026-07-27",author:"HeroShots",tags:["vertical","saas","b2b"],translations:{en:{title:"UGC Videos for SaaS and Apps: The Founder-Style Format That Converts",description:"Founder-style UGC video for SaaS: why B2B buyers respond to a face, plus the shot list, the script beats and what a first test set really costs.",body:`Founder-style UGC for SaaS is a short, single-person, talking-head clip in which someone who sounds like they built or actually use the product names a specific problem, shows the fix on a real screen, and asks for one low-friction next step. It works because a B2B buyer is not simply being sold a product â they are being handed an argument they will have to repeat to a manager, a security reviewer and a finance lead. A face carries signals that a motion-graphics explainer strips out: hesitation, job-specific vocabulary, and a visible willingness to be associated with the claim. And you no longer need a studio, a script doctor, or your founder's calendar to make one. Pair a licensed [creator avatar](/glossary/creator-avatar) with a screen recording of your own product and a working test set becomes an afternoon's job rather than a quarter's. 2702 2703## What actually makes a video "founder-style"? 2704 2705Founder-style is a set of production choices, not a job title. The person on camera does not have to be a founder â they have to sound like one. Four markers do most of the work: 2706 2707- **One person, one idea, one take.** No cutaways to smiling stock teams, no b-roll of a city skyline. A single subject holding a single argument. 2708- **A first-person opening with no branding.** The first seconds are a sentence, not a logo. "Every quarter-close, we lost days reconciling two systems that were never meant to talk" beats a wordmark animation. 2709- **Spoken language, not narration.** Contractions, mid-sentence corrections, and a concrete detail that comes from the speaker's own workflow rather than from a marketing deck. 2710- **The screen appears as evidence, not as a tour.** One click, one state change, one visible result. A full feature walkthrough belongs on a docs page. 2711 2712This is [AI UGC](/glossary/ai-ugc) applied to a B2B audience: the same casual, native-to-feed grammar that works for consumer products, aimed at a buyer whose real objection is "will this survive contact with my stack?" 2713 2714## Why do B2B buyers respond to a face? 2715 2716Three mechanisms, none of which needs a number attached to be persuasive. 2717 2718**Accountability.** A claim attached to a face is a claim someone is standing behind. An animated explainer makes assertions that belong to nobody. A person saying "we built this because X was broken" is implicitly offering to be wrong in public, and buyers tend to read that as confidence. 2719 2720**Vocabulary as proof of competence.** B2B buyers screen for insiders. A practitioner can usually tell within the first couple of sentences whether the speaker has actually done the job. Saying "the handoff between the SDR's notes and the CRM field" signals more than any adjective. You cannot fake that with a voiceover script written by someone who has never done the work â and you should not try. 2721 2722**Forwardability.** SaaS purchases are committee decisions, and the artifact that travels is whatever a champion can paste into a Slack thread. A short clip of a person explaining a problem tends to survive forwarding better than a slide deck, because the receiving colleague can evaluate it without committing to a meeting. Founder-style content often circulates inside the buying group, which is where most of the actual persuading happens. 2723 2724## Founder-style vs. explainer vs. screen-only: which format should you run? 2725 2726| Format | What it looks like | Best placement | Main weakness | 2727| --- | --- | --- | --- | 2728| Founder-style talking head | One person, webcam or phone framing, first-person problem statement | Cold paid social, LinkedIn feed, landing-page hero | Weak on "how does it actually work" detail | 2729| Hybrid face + screen inset | Talking head with product capture picture-in-picture or cut in mid-clip | Retargeting, sales follow-up, onboarding email | Needs real product footage; more edit work | 2730| Screen-only walkthrough | Cursor-led capture with voiceover, no face | Docs, in-app tours, technical evaluation stage | Scrolls past on social; no trust signal | 2731| Animated explainer | Motion graphics, abstract UI, brand-safe narration | Trade-show loops, investor pages | Reads as corporate; hard to differentiate | 2732| Customer testimonial | Named user on camera describing an outcome | Bottom-funnel, case-study pages | Slow to source; approvals and legal review | 2733 2734The practical answer for most SaaS teams: run founder-style at the top, hybrid in the middle, screen-only at the bottom. Do not ask one asset to do all three jobs. 2735 2736## What should a founder-style SaaS video actually show? 2737 2738Here is a shot list you can film or generate tomorrow. 2739 2740### The cold open (0â3s) 2741Person mid-sentence, framed chest-up at a desk, natural window light, slightly off-centre. The sentence is a symptom, not a category: "Our support queue worked fine right up until the week it didn't." Avoid greetings entirely. 2742 2743### The problem beat (3â10s) 2744Keep the face on screen. Add one concrete artifact â a messy spreadsheet turned toward the camera, a phone showing a pile-up of notifications, a second monitor buried in tabs. The artifact makes the abstraction physical. 2745 2746### The proof beat (10â22s) 2747Cut to your real UI. One action, one visible outcome: a filter applied, a report generated, a status flipping to green. Record this yourself at native resolution â never generate fake dashboards or invented metrics, because a buyer who spots a fabricated figure stops trusting everything else in the clip. 2748 2749### The ask (22â30s) 2750Back to the face. One instruction, no stacking. "Free tier, no card, link below." A second call to action mostly competes with the first. 2751 2752Useful variants once the core clip works: the "I'll just show you" pivot, where the speaker turns the laptop toward camera; the objection open ("You probably already have a tool for this â here's why it still breaks"); and the ugly-before/clean-after cut with almost no narration. 2753 2754## How do you produce this if nobody wants to be on camera? 2755 2756This is the real blocker in most SaaS teams, and it is solvable. The presenter can be a licensed catalog creator or a fully synthetic presenter, while the product footage stays entirely real and entirely yours. 2757 27581. **Pick one job-to-be-done.** Not a persona, not a feature â a task someone does on a Tuesday and hates. 27592. **Write the script as spoken words** and read it aloud with a timer. Fifteen seconds holds roughly 35â40 spoken words; thirty seconds roughly 70â80. If it does not fit, cut the qualifier, not the specific. 27603. **Record your own screen first.** Your UI must be your UI. Capture at the resolution you will publish, hide personal data, and grab a few seconds more than you think you need at each end. 27614. **Choose the presenter.** An [AI avatar](/glossary/ai-avatar) adds no likeness fee. A real catalog creator adds 25% on the base price, with a â¬5 floor on video â so a 15-second clip at â¬15 carries a â¬5 likeness fee. Consent, likeness licensing and creator royalties are handled on the platform side; see [how the workflow fits together](/product). 27625. **Generate the talking head** at 15s (â¬15) or 30s (â¬35), delivered from your script. Extra retries are â¬5 per 15-second block, so budget one or tw
2762o rather than open-ended re-rolls. 27636. **Cut the screen capture into the middle** in your own editor. Face â screen â face is the reliable shape. Resist the urge to stay on the UI. 27647. **Caption everything.** Assume sound-off. Burn captions in, keep them large, and make the first line readable in the thumbnail crop. 27658. **Ship three or four variants changing one thing each** â the opening line, the presenter, the CTA. Anything else and you cannot read the result. 2766 2767### Keeping a series recognisable 2768If the same presenter is going to front five clips, [avatar consistency](/glossary/avatar-consistency) matters more than any single frame's quality. A face that subtly drifts between episodes reads as unstable and undoes the trust the format is built on. Lock the presenter, the framing and the wardrobe early, and reuse them. 2769 2770## What does a founder-style test set cost? 2771 2772Four 15-second variants at â¬15 each is â¬60 in video generation, before any likeness fee and excluding VAT. Static assets for thumbnails, LinkedIn cards and ad placements come from image batches: images are billed per batch of 4 variants, at â¬4.90 for the first batch of a project and â¬1.90 for each further batch in the same project, with an edit on a chosen image at â¬0.39 (â¬0.23 on HeroShots Pro). A batch returns four variants, typically in under a minute. 2773 2774If video becomes a standing channel, pre-paid packages bring the per-video price down: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). HeroShots Pro at â¬99/month removes the watermark, enables direct downloads, takes 15% off videos, makes edits cheaper and gives you a priority queue â worth it once you are shipping weekly rather than occasionally. The free plan (10 watermarked images a month, one video preview, no credit card) is enough to sanity-check the format before you commit. All prices exclude VAT; full details are on [pricing](/pricing). 2775 2776## What mistakes kill founder-style SaaS videos? 2777 2778Over-scripting is the most common: the moment the delivery sounds like a voiceover artist, the format's entire advantage evaporates. Close behind are logo-first openings, feature lists delivered as a rapid-fire montage, and manufactured urgency that no B2B buyer believes. 2779 2780Two more deserve specific care. First, **never put invented numbers on screen** â mocked-up revenue charts, fake user counts, imaginary review scores. Beyond the trust cost, advertising platforms generally scrutinise performance and earnings claims, and their rules change; check the current policy for your placements before you promise anything measurable. Second, **be straight about synthetic presenters.** If the person on camera is an AI avatar or a licensed creator likeness rather than your actual founder, do not stage the clip as a personal founder confession. Present it as your company explaining a problem. The format survives that honesty easily; it does not survive being caught. 2781 2782## How do you turn one good clip into a system? 2783 2784Once a variant works, treat it as a template rather than a one-off. Keep the structure and swap the job-to-be-done: one clip per painful task, one presenter across the series, one CTA style. Feed the winners into your other surfaces â the landing-page hero, the onboarding email nobody reads, the sales follow-up where a short clip does more than a PDF. Repurpose the strongest frame as a static ad and generate a batch of thumbnail variants around it. The point of producing at this cost and speed is not to make more videos; it is to be able to abandon the ones that do not work without it hurting.`,faqs:[{q:"Does the person on camera have to be an actual founder?",a:"No. Founder-style refers to production choices â one person, first-person language, unbranded opening, screen as evidence â not to the speaker's job title. A licensed catalog creator or an AI avatar can front the clip while your company owns the argument. What you should not do is stage a synthetic presenter as a personal founder story; present it as the company explaining a problem instead."},{q:"Won't B2B buyers expect polished production?",a:"B2B buyers expect credibility, and polish is only one route to it. A committee-driven purchase gets decided in forwarded messages and internal arguments, where a short clip of a person explaining a specific problem tends to travel better than a produced brand film. Save the polish for trade-show loops and investor pages."},{q:"Can AI generate my actual product interface?",a:"No, and you should not want it to. Record your real UI yourself with a screen capture, then use AI generation for the human presenter and the surrounding context. That combination keeps the product footage completely accurate while removing the casting, scheduling and filming overhead from the talking-head half of the clip."},{q:"How long should a founder-style SaaS video be?",a:"Fifteen seconds for cold placements, thirty seconds when you need a proof beat with real screen footage. Read the script aloud against a timer: roughly 35 to 40 spoken words fit fifteen seconds, roughly 70 to 80 fit thirty. If the script overruns, cut qualifiers and adjectives before you cut the specific detail that makes it credible."},{q:"What does a first set of founder-style videos cost on HeroShots?",a:"Video up to 15 seconds
2784is â¬15 and up to 30 seconds is â¬35, so four short variants come to â¬60 excluding VAT. Extra retries are â¬5 per 15-second block. Using a real catalog model adds 25% on the base price with a â¬5 floor on video; AI avatars add no likeness fee. Pre-paid packages start at Starter â¬350, which works out at â¬70 per video."},{q:"What do the static assets around the videos cost?",a:"Images are billed per batch of 4 variants: â¬4.90 for the first batch of a project and â¬1.90 for each further batch in the same project, with an edit on a chosen image at â¬0.39 (â¬0.23 with HeroShots Pro). A batch returns four variants, typically in under a minute, which is enough for thumbnail, social card and ad-placement crops. Prices exclude VAT."},{q:"Should the video show the face or the screen?",a:"Both, in that order: face, then screen, then face. Opening on the interface loses the trust signal that makes the format work, and staying on the interface turns the clip into a walkthrough that belongs in documentation. One click and one visible state change is usually enough product footage for a top-of-funnel asset."},{q:"How do I keep the same presenter across a whole video series?",a:"Lock the presenter, framing and wardrobe before you generate the second clip, and reuse the same avatar rather than re-selecting each time. Avatar consistency matters more across a series than any single frame's quality, because a face that drifts between episodes reads as unstable and undermines the credibility the format depends on."},{q:"Can I put performance numbers or customer results on screen?",a:"Only real, verifiable ones you can substantiate, and never mocked-up dashboards or invented metrics. Buyers who spot a fabricated figure discount everything else in the clip, and advertising platforms generally scrutinise performance, earnings and results claims â the specifics differ by platform and change over time, so check the current policy for your placements before publishing."},{q:"Do I need a paid plan to try this?",a:"You can validate the format on the free plan, which includes 10 watermarked images a month and one video preview with no credit card. For unwatermarked output, direct downloads, cheaper edits, 15% off videos and a priority queue, HeroShots Pro is â¬99 a month. API access is available on paid plans if you want to generate variants programmatically."}],metaTitle:"Founder-Style Video Ads for SaaS"},it:{title:"Video UGC per SaaS e app: il formato founder-style che converte",description:"Il SaaS B2B non ha bisogno di ad patinati â serve una persona in camera che spiega il problema. Il formato founder-style porta più demo signup.",body:`L'UGC SaaS che converte sembra un **founder davanti a una webcam** che spiega un problema e una soluzione, non un ad corporate. Questo formato porta tipicamente più demo signup degli animated explainer di prodotto nel 2026. 2785 2786## Lo script founder a 3 beat 2787 2788- **"Ho costruito X perché Y non funzionava"** (10s). 2789- **Mostra il prodotto in 1 click** (15s). 2790- **"Provalo â link in bio"** (5s). 2791 2792Con HeroShots puoi renderizzarlo con un Real Model se non vuoi metterti in camera â stessa vibe autentica, zero tempo founder.`,faqs:[{q:"Il buyer B2B non si aspetta produzione patinata?",a:"Il B2B nel 2026 si fida di più del contenuto che sembra personale. Lo stile founder passa sotto il filtro corporate ed entra nel consideration set."}]},es:{title:"VÃdeos UGC para SaaS y apps: el formato founder-style que convierte",description:"El SaaS B2B no necesita ads pulidos â necesita una persona en cámara explicando el problema. El formato founder-style genera más demo signups.",body:`El UGC SaaS que convierte parece un **founder ante una webcam** explicando un problema y una solución, no un ad corporate. Este formato suele generar más demo signups que los animated explainers en 2026. 2793 2794## Script founder de 3 beats 2795 2796- **"Construà X porque Y estaba roto"** (10s). 2797- **Producto en 1 click** (15s). 2798- **"Pruébalo â link en bio"** (5s). 2799 2800Con HeroShots puedes renderizarlo con un Real Model si no quieres estar en cámara â misma vibe auténtica, sin tiempo founder.`,faqs:[{q:"¿No espera el comprador B2B pulido?",a:"El B2B en 2026 confÃa más en contenido que se siente personal. Founder-style cruza el filtro corporate y entra al consideration set."}]}
2800,de:{title:"UGC-Videos für SaaS und Apps: Das Founder-Style-Format, das konvertiert",description:"B2B-SaaS braucht keine polierten Ads â sondern eine Person vor der Kamera, die das Problem erklärt. Founder-Style bringt mehr Demo-Signups.",body:`SaaS-UGC, das konvertiert, sieht aus wie ein **Founder vor der Webcam**, der Problem und Lösung erklärt â nicht wie ein Corporate-Ad. Dieses Format bringt 2026 typischerweise mehr Demo-Signups als animierte Produkt-Explainer. 2801 2802## 3-Beat-Founder-Skript 2803 2804- **"Ich habe X gebaut, weil Y kaputt war"** (10s). 2805- **Produkt in 1 Klick zeigen** (15s). 2806- **"Probier's â Link in Bio"** (5s). 2807 2808Mit HeroShots rendert man das auch mit einem Real Model, wenn man nicht vor die Kamera will â gleiche authentische Vibe, ohne Founder-Zeit.`,faqs:[{q:"Erwartet der B2B-Käufer nicht Politur?",a:"B2B vertraut 2026 persönlich wirkendem Content stärker. Founder-Style umgeht den Corporate-Filter und landet im Consideration-Set."}]},fr:{title:"Vidéos UGC pour SaaS et apps : le format founder-style qui convertit",description:"Le SaaS B2B n'a pas besoin d'ads polis â il faut une personne face caméra qui explique le problème. Founder-style génère plus de demo signups.",body:`L'UGC SaaS qui convert
2808it ressemble à un **founder face à une webcam** expliquant un problème et une solution, pas à un ad corporate. Ce format génère généralement plus de demo signups que les animated explainers en 2026. 2809 2810## Script founder en 3 beats 2811 2812- **"J'ai construit X parce que Y était cassé"** (10s). 2813- **Produit en 1 clic** (15s). 2814- **"Essaie â lien en bio"** (5s). 2815 2816Avec HeroShots tu peux le rendre avec un Real Model si tu ne veux pas être face caméra â même vibe authentique, sans temps founder.`,faqs:[{q:"L'acheteur B2B n'attend-il pas du poli ?",a:"Le B2B en 2026 fait plus confiance au contenu qui semble personnel. Le founder-style passe sous le filtre corporate et entre dans le consideration set."}]}}},{slug:"b2b-app-ad-creative-without-video-team",date:"2026-06-18",updated:"2026-07-27",author:"HeroShots",tags:["vertical","b2b","saas"],translations:{en:{title:"How a B2B App Can Create Ad Creative Without an In-House Video Team",description:"No video producer, no shoot day. The formats, workflow and testing loop a B2B app team can use to ship LinkedIn and Meta creative with AI UGC.",body:`A B2B app team with no producer, no studio and no shoot budget can ship a full LinkedIn and Meta creative set in a day, because the real bottleneck in [performance creative](/glossary/performance-creative) has never been camera quality. It is the number of distinct *angles* you can put in front of an audie
2816nce before your budget runs out. A small team covers that ground with a hybrid stack: screen recordings for anything showing the actual product, [AI UGC](/glossary/ai-ugc) for the human wrapper around it, and a fixed weekly cadence so creative stops being a project and becomes a process. This guide covers the formats that work for software, what to capture versus generate, a repeatable seven-step loop, and how to test angles rather than re-cutting the same one. 2817 2818## Why does B2B software struggle to produce ad creative? 2819 2820B2B apps hit a specific wall. There is no physical product to photograph, the interface is the product, and the buyer is a working professional who scrolls the same feeds as everyone else. So the team ends up choosing between two weak options: a screen-recording demo with a voice-over that loses the viewer almost immediately, or an agency quote for a "brand film" that eats a large share of the quarter's budget and produces one asset. 2821 2822The common result is an account running on the same handful of creatives for months. When performance decays, the team edits captions instead of testing new angles, because a new angle means a new shoot. Breaking that loop does not require becoming a video studio. It requires separating the two things a video ad is made of: the *proof* (your UI, your data, your workflow) and the *hook* (a human, a problem, a moment of recognition). Proof you can capture on your own laptop. The hook is what AI generation is good at producing in volume. 2823 2824## What ad formats actually work for a B2B app? 2825 2826Four formats cover most of what a B2B app needs. Each one is cheap to produce and, more importantly, each one tests a different *hypothesis* about why someone would sign up. 2827 2828### Founder or operator POV (15â20s) 2829 2830A single person, talking to camera, naming one problem your ICP has this week. No logo card, no music bed. The script is three beats: the problem in their words, the moment it becomes expensive, and one line about what your app does instead. This format tends to hold attention because it does not look like an ad â it looks like something a colleague sent you. 2831 2832### Persona problem video (15s) 2833 2834Same structure, different narrator. If you sell to both RevOps and finance, make one of each. The persona video is your cheapest segmentation test: identical offer, different opening line, different [AI avatar](/glossary/ai-avatar). Whichever persona responds tells you where to point media budget next month. 2835 2836### Product walkthrough (30s) 2837 2838Screen recording of a real workflow, not a feature tour. Pick one job the user actually does â build the report, approve the invoice, catch the anomaly â and show it end to end at speed. Layer an AI-generated presenter into the intro and outro so it opens on a face rather than a spreadsheet. 2839 2840### Static concept cards 2841 2842Do not skip static. A set of stills â a laptop on a real desk, a person mid-frustration at a meeting table, a phone showing a notification â gives you frames for LinkedIn single-image ads, retargeting and video thumbnails. Stills are also where [batch generation](/glossary/batch-generation) pays off most: a batch returns four variants of the same scene, so you can test setting and mood without rewriting anything. 2843 2844## Should I generate the creative or capture it myself? 2845 2846The honest answer is both, split by what each method is actually good at. Use this as your default routing table. 2847 2848| Creative element | Best source | Why | 2849| --- | --- | --- | 2850| Product UI, dashboards, real data | Screen recording you make | Never let a model invent your interface | 2851| Talking-head hook and outro | AI avatar video | No casting, no re-shoot when the script changes | 2852| Persona variations (RevOps vs finance) | AI avatars, same script | One script, several faces, no extra shoot day | 2853| Desk and laptop lifestyle stills | AI image batches | Cheap volume, no location, no releases to chase | 2854| Customer quotes and case studies | Real customer, real approval | Never synthesise a customer | 2855| Voice-over for walkthroughs | AI or your own mic | Consistency matters more than polish | 2856| Logos, awards, security badges | Your own asset library | Trust marks must be exact and current | 2857 2858The line to hold: AI handles the wrapper, you handle the proof. That split also keeps you out of trouble, because nothing a viewer could reasonably read as a factual claim about your product or your customers comes out of a generator. 2859 2860## How do I build a repeatable weekly creative process? 2861 2862The value is in the loop, not in any single asset. Here is a seven-step cycle a two-pers
2862on growth team can run without a producer. 2863 28641. **Write the angle list first, not the scripts.** Angles are reasons to care: "your reporting takes four days", "your team is doing this in spreadsheets", "the audit is coming". Aim for a handful of genuinely distinct angles, not several variations of one. 28652. **Turn each angle into a one-paragraph script.** Hook line, problem, mechanism, call to action. If the hook does not survive being read aloud in a normal speaking voice, rewrite it. 28663. **Lock your avatars once.** Pick one presenter per persona and reuse them across the quarter so the account builds recognition. Avatar consistency is what makes a set look like a campaign instead of a pile of clips. 28674. **Batch the stills before the videos.** Generate a batch of four variants per scene, pick the best frame, and use it to sanity-check the setting and wardrobe before you spend on video. 28685. **Record the proof clips in one sitting.** Block a single session, capture every workflow you might need at your screen's full resolution, and file them with clear names. This is the only "shoot" you will do. 28696. **Assemble, then ship in pairs.** Launch two creatives per angle â same message, different presenter or opening frame. A single asset cannot tell you whether the angle or the execution failed. 28707. **Review on a fixed day and retire ruthlessly.** Same weekday, every week. Kill what has stopped delivering, promote what is working into new variants, and pull the next angle off the list. 2871 2872Teams that want this automated can drive generation from their own stack: HeroShots exposes an API on paid plans with official npm, PyPI and Packagist SDKs, so a script can fire a batch when a new feature ships. 2873 2874## How do I test angles instead of just testing edits? 2875 2876It is easy to believe you are testing when you are really iterating. Changing the caption, the CTA button or the opening frame is iteration. Testing means two creatives a single viewer would judge differently, for different reasons. 2877 2878A practical rule: if you can explain the difference between two variants in terms of *what the ad argues*, it is an angle test. If you can only explain it in terms of what the ad *looks like*, it is an execution test. Both are useful, but angle tests are where the larger wins tend to sit â and they are exactly what a team without a video pipeline usually cannot afford to run. 2879 2880### Give each angle a fair shot 2881 2882Ship angles in small cohorts rather than one per week, so they compete under the same conditions. Keep audience, placement and landing page fixed while the creative varies. Write the hypothesis down before launch â "finance buyers respond to audit risk, not time saved" â so the result teaches you something even when the ad loses. 2883 2884## What does a month of B2B ad creative actually cost? 2885 2886You can size this precisely before committing. On [HeroShots pricing](/pricing), images are billed per batch of four variants: the first batch in a project is â¬4.90 and each further batch in the same project is â¬1.90, so sixteen stills across four scenes is the first batch plus three more at â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 for up to 15s and â¬35 for up to 30s, with extra retries at â¬5 per 15s block. Prices exclude VAT, and a batch typically returns its four variants in under a minute. 2887 2888So the four-asset starter set â two 15s persona videos, one 30s walkthrough and one batch of stills â lands at â¬65 in video plus â¬4.90 for that first image batch. Using a real catalog model adds a likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. If you run continuously, pre-paid video packages bring the unit down: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). HeroShots Pro is â¬99/month and removes the watermark, enables direct downloads, cuts 15% off videos, lowers edit costs and moves you into the priority queue. There is also a free plan â 10 watermarked images a month and one video preview, no credit card â enough to check whether your avatars and prompts hold up before you spend. For the wider trade-off against a traditional production day, see [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). 2889 2890## What compliance and brand-safety issues should I watch for? 2891 2892Three things matter more in B2B than most teams expect. 2893 2894**Disclosure and provenance.** If a presenter is AI-generated, do not imply they are a named customer or employee. Generic personas are fine; fabricated endorsements are not. Platforms generally expect synthetic or altered depictions of people to be disclosed in some form, and the requirements change over time, so check the current policy for each channel before a launch. 2895 2896**Consent and licensing.** Anyone whose likeness appears should be there under a clear licence with defined usage rights. Working through a platform that handles consent, likeness licensing and creator royalties keeps that paperwork out of your inbox. 2897 2898**Claim discipline.** Ad platforms tend to scrutinise performance and outcome claims closely. Keep anything numeric on screen to things you can evidence, keep the creative focused on the problem rather than the promise, and route anything in a regulated category past whoever owns legal review. 2899 2900## How do I know a creative is actually working? 2901 2902Judge creative on the metric closest to the decision you want. For a B2B app that usually means qualified signups or booked demos, not view-through rate. A clip with a strong hook and weak follow-through can look excellent on shallow view metrics and produce nothing downstream. 2903 2904Give each creative a fixed observation window, decided before launch, so you are not calling winners on the first afternoon. Watch for the pattern where every variant of one angle underperforms â that is a message problem, not a production problem, and no amount of new footage will fix it. When something wins, do not simply scale spend on that exact file; scale the *angle*, with new executions of the same argument. That is the loop, and once it is running, the absence of an in-house video team stops being the constraint it looks like today.`,faqs:[{q:"Can AI show my actual product UI?",a:"No, and it should not try. Record your real app for anything showing the interface, data or workflow, and use AI generation only for the human wrapper around it: the presenter, the desk, the lifestyle context. That split keeps product accuracy absolute while giving you the volume of hooks that testing needs."}
2904,{q:"How many creatives does a B2B app need to start testing?",a:"A workable starter set is four assets: two 15-second persona videos covering different ICP segments, one 30-second product walkthrough built on a screen recording, and a batch of stills for single-image placements and thumbnails. That is enough to run angle testing across two segments at once rather than iterating on a single ad."},{q:"What does that starter set cost on HeroShots?",a:"Two 15-second videos at â¬15 each plus one 30-second video at â¬35 comes to â¬65. Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project, so one batch of stills adds â¬4.90 and each further batch in the same project adds â¬1.90. Prices exclude VAT."},{q:"Do I need a real creator, or is an AI avatar enough?",a:"AI avatars add no likeness fee and are usually the right default for persona videos, where the point is the script rather than the face. Using a real catalog model adds a likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos, which is worth it when recognisable, human-verified talent matters to the concept."},{q:"Can I use the same presenter across a whole quarter?",a:"Yes, and you should. Locking one avatar per persona and reusing it across every creative in the quarter makes the account read as a campaign rather than a pile of unrelated clips. Consistency of presenter, framing and tone is what gives a small creative set the feel of a much bigger production."},{q:"How do I test angles rather than just testing edits?",a:"If you can explain the difference between two variants in terms of what the ad argues, it is an angle test. If you can only explain it in terms of what the ad looks like, it is an execution test. Ship angles in small cohorts so they compete under the same conditions, keep audience and landing page fixed, and write the hypothesis down before launch."},{q:"What do I do about disclosure when the presenter is AI-generated?",a:"Never present a generated persona as a named customer or employee, and never synthesise a testimonial. Generic personas describing a problem are fine; fabricated endorsements are not. Platforms generally expect some form of disclosure for synthetic depictions of people, and the requirements change over time, so check the current policy for each channel before a launch."},{q:"Is there a way to try this before committing budget?",a:"The free plan gives 10 watermarked images per month and one video preview with no credit card, which is enough to check whether your avatars, prompts and scene direction hold up. HeroShots Pro is â¬99/month and removes the watermark, enables direct downloads, cuts 15% off videos, lowers edit costs and adds priority queue access."},{q:"How much does it cost to fix an image I already generated?",a:"An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Because a batch of four variants comes back in typically under a minute, it is often cheaper to generate another batch in the same project at â¬1.90 than to edit repeatedly when the whole scene direction is wrong rather than one detail."},{q:"Can I automate creative production from my own stack?",a:"Yes. The API is available on paid plans, with official npm, PyPI and Packagist SDKs, so you can trigger a batch from your own scripts, for example when a new feature ships or a new market opens, instead of producing every asset by hand in the interface."}],metaTitle:"B2B Ad Creative Without a Video Team"},it:{title:"Come un'app B2B può creare ad creativi senza un team video interno",description:"Non serve un video producer per pubblicare ad LinkedIn e Meta. Lo starter pack a 4 asset che qualsiasi app B2B può lanciare questa settimana con l'AI.",body:`Un'app B2B può pubblicare un **set creative completo per LinkedIn + Meta in un giorno** con l'AI UGC: 1 video founder-style, 2 video customer-persona, 1 walkthrough prodotto. Tutto generato con l'AI: **nessuna troupe, nessun giorno di shooting**. 2905 2906## Lo starter pack a 4 asset 2907 2908- **Founder POV** (20s). 2909- **Persona problem video** Ã2 â segmenti ICP diversi. 2910- **Walkthrough prodotto** (30s) â screen recording + voice-over AI. 2911 2912Volume sufficiente per fare discovery testing su due ICP per una settimana.`,faqs:[{q:"L'AI può mostrare la mia UI reale?",a:"Usa screen recording dell'app reale per gli shot UI e AI per il wrapper umano/lifestyle. La combinazione preserva l'accuratezza prodotto e aggiunge contesto emotivo."}]},es:{title:"Cómo una app B2B puede crear ad creatives sin un equipo de vÃdeo interno",description:"No hace falta un video producer para lanzar ads en LinkedIn y Meta. El starter pack de 4 assets que cualquier app B2B puede lanzar esta semana con AI.",body:`Una app B2B puede lanzar un **set creativo completo para LinkedIn + Meta en un dÃa** con AI UGC: 1 vÃdeo founder-style, 2 vÃdeos customer-persona, 1 walkthrough producto. Todo generado con AI: **sin equipo, sin dÃa de rodaje**. 2913 2914## Starter pack de 4 assets 2915 2916- **Founder POV** (20s). 2917- **Persona problem video** Ã2 â segmentos ICP distintos. 2918- **Walkthrough producto** (30s) â screen recording + voice-over AI. 2919 2920Volumen suficiente para discovery testing en dos ICPs durante una semana.`,faqs:[{q:"¿Puede AI mostrar mi UI real?",a:"Usa screen recordings de la app real para los shots UI y AI para el wrapper humano/lifestyle. La combinación preserva exactitud y añade contexto emocional."}]},de:{title:"Wie eine B2B-App Ad-Creatives ohne internes Video-Team baut",description:"Du brauchst keinen Video-Producer für LinkedIn- und Meta-Ads. Das 4-Asset-Starter-Pack, das jede B2B-App diese Woche mit AI launchen kann.",body:`Eine B2B-App liefert mit AI-UGC ein **komplettes LinkedIn-+ Meta-Creative-Set an einem Tag**: 1 Founder-Style-Video, 2 Customer-Persona-Videos, 1 Produkt-Walkthrough. Alles AI-generiert: **keine Crew, kein Drehtag**. 2921 2922## 4-Asset-Starter-Pack 2923 2924- **Founder POV** (20s). 2925- **Persona-Problem-Video** Ã2 â verschiedene ICP-Segmente. 2926- **Produkt-Walkthrough** (30s) â Screen-Recording + AI-Voice-Over. 2927 2928Genug Volumen für Discovery-Testing über zwei ICPs eine Woche lang.`,faqs:[{q:"Kann AI meine echte UI zeigen?",a:"Nutze Screen-Recordings deiner App für UI-Shots, AI für den menschlichen/Lifestyle-Wrapper. Die Kombi erhält Produktgenauigkeit und liefert emotionalen Kontext."}]},fr:{title:"Comment une app B2B peut créer des ad creatives sans équipe vidéo interne",description:"Pas besoin d'un video producer pour lancer des ads LinkedIn et Meta. Le starter pack 4 assets que toute app B2B peut lancer cette semaine avec l'AI.",body:`Une app B2B peut livrer un **set créatif complet LinkedIn + Meta en un jour** avec l'AI UGC : 1 vidéo founder-style, 2 vidéos customer-persona, 1 walkthrough produit. Tout est généré par l'AI : **pas d'équipe, pas de jour de tournage**. 2929 2930## Starter pack 4 assets 2931 2932- **Founder POV** (20s). 2933- **Persona problem video** Ã2 â segments ICP différents. 2934- **Walkthrough produit** (30s) â screen recording + voice-over AI. 2935 2936Volume suffisant pour discovery testing sur deux ICP pendant une semaine.`,faqs:[{q:"L'AI peut-elle montrer mon UI réelle ?",a:"Utilise des screen recordings de l'app réelle pour les shots UI et l'AI pour le wrapper humain/lifestyle. La combinaison préserve l'exactitude et ajoute du contexte émotionnel."}]}}},{slug:"ai-content-restaurants-bars-pov-videos",date:"2026-06-19",updated:"2026-07-27",author:"HeroShots",tags:["vertical","restaurants","local"],translations:{en:{title:"AI Content for Restaurants and Bars: POV Videos That Actually Work",description:"AI content for restaurants and bars: POV and atmosphere clips that work, why the dish must be photographed, a weekly workflow and what it costs.",body:`For restaurants and bars, the useful split is simple: generate the atmosphere, photograph the food. AI video is very good at the walk-in POV, the room filling up at golden hour, the hand closing around a glass â the shots a busy service never leaves you time to film. It is much weaker at the plate itself: a generated dish is a promise you may
2936not be able to serve. A workable rhythm is a three-clip week â one walk-in POV, one dish-led close-up built from a real photo of your food, one atmosphere shot â plus a few stills for your map listing and website. Below: the shot list, the workflow, the costs, and the limits. 2937 2938## What kinds of AI video actually work for a restaurant or bar? 2939 2940Three formats carry most of what a single venue needs. They repeat weekly without feeling repetitive because the dish, the light, and the hour change. 2941 2942### The walk-in POV 2943 2944Chest-height camera, eight to ten seconds, moving through the door and into the room. The beat that matters is the reveal: two steps of dim entrance, then the room opens â bar lights, a full banquette, a pass in the background. Vertical, no on-screen text for the first second, a track carrying the mood. It answers the question a stranger is actually asking, which is "what is it like in there", not "what is on the menu". 2945 2946### The dish-led close-up 2947 2948Five to eight seconds, tight, one action: sauce hitting the plate, a pour, a cut through a crust, steam off a bowl. Build it from a real photo of the real dish. Generation here is not pure [text-to-video](/glossary/text-to-video) â your own photo goes in as the reference so the plate stays yours, and the prompt only adds motion, breath and light. The food stays accurate and you still get movement a phone on a tripod would miss during service. 2949 2950### The atmosphere pan 2951 2952Eight seconds of the room without a hero: candles, glassware, a bartender's hands, rain on the window, the terrace at the hour you want to fill. Atmosphere clips get cut into ads and stories all season and age slowly, so one good batch tends to stretch across months. 2953 2954### Two extras worth having 2955 2956A **staff or host moment** â greeting, plating, explaining a dish â reads as human, and belongs to a real person or a licensed creator avatar rather than a generic stock face. And a **quiet-hours clip** for the slots you need to sell: Tuesday dinner, late aperitivo, Sunday lunch. 2957 2958## Should you generate the food, or photograph the real dish? 2959 2960Photograph the dish. This is the single hard rule in restaurant content, and it is both a trust rule and a compliance one. Advertising rules in many markets generally expect food imagery to represent what a customer will actually be served, so a generated plate with an extra prawn or a portion nobody would recognise risks being treated as misleading â check the rules that apply where you operate. It is also a quick route to the review that starts with "nothing like the photo". 2961 2962There are technical reasons too. Generative models still drift on the things a regular customer notices instantly: ingredient counts, the exact cut of a topping, how a regional dish is actually assembled, the viscosity of a sauce, printed text on labels and menus. A generated negroni looks like a negroni; your negroni, in your glassware, does not. 2963 2964| Asset | Best source | Why | 2965| --- | --- | --- | 2966| Walk-in POV, corridor, entrance | Generate from real photos of your space | Smooth motion a handheld phone can't hold, and the geometry is still yours | 2967| Room atmosphere, light, mood | Generate | Weather and hour on demand, no closing the room to film | 2968| Signature dish hero shot | Photograph, always | Portion, garnish and plating must match what arrives | 2969| Dish in motion (pour, steam, cut) | Real photo, then animate | Keeps the plate accurate, adds the movement stills lack | 2970| Drinks and cocktails | Photograph, then animate | Glassware and colour are brand signatures | 2971| Staff and guests on camera | Real people with releases, or licensed avatars | Consent and [likeness licensing](/glossary/likeness-licensing) apply to anyone recognisable | 2972| Menu boards, price lists, labels | Photograph | Generated text garbles, and wrong prices are a real problem | 2973 2974The same logic applies to stills. [AI product photography](/glossary/ai-product-photography) is a strong fit for packaged goods you also sell â bottled sauce, coffee bags, a retail jar â and a poor fit for tonight's special. 2975 2976## How do I produce a week of restaurant content, step by step? 2977 29781. **Collect source photos once.** Ten to fifteen shots of the room at different hours, the entrance from outside and inside, the bar, the terrace, and clean overheads of your four or five signature dishes. Phone photos are fine if they are sharp and well lit. 29792. **Pick the week's angle.** One dish, one occasion, one time slot you want to fill. Everything else follows from that. 29803. **Generate stills first.** A batch returns four variants, typically in under a minute. Use the still round to lock the look â framing, light, colour â before you spend on video. 29814. **Choose one frame per clip.** The best variant becomes the reference image for the video, which is what keeps the plate and the room consistent across the week. 29825. **Fix small things with an edit** rather than regenerating the whole batch. A crop, a light change, a removed distraction in the background costs far less than a new batch.
29836. **Generate the video.** Fifteen seconds is more than enough for a POV or an atmosphere clip; most of them are stronger cut to eight. 29847. **Cut your exports in your own editor** â vertical for Reels and TikTok, square for feed, and a silent version with captions burned in for autoplay. 29858. **Caption for local discovery.** Name the neighbourhood, the dish in the local language, and the occasion. See the section below. 29869. **Log what you used.** Which source photo, which prompt, which dish. Next month you rebuild the week in a fraction of the time. 2987 2988A good prompt is concrete and boring: room, light source, hour, lens feel, single action. "Warm interior, late evening, low tungsten light from the bar, handheld, slow push-in through the doorway" beats any adjective pile. 2989 2990## What does a month of this cost? 2991 2992Prices below exclude VAT. 2993 2994- **Images:** the first batch of 4 variants in a project is â¬4.90, each further batch in the same project â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. 2995- **Video:** â¬15 for up to 15 seconds, â¬35 for up to 30 seconds. Extra retries are â¬5 per 15-second block. 2996- **People:** AI avatars add no fee. Using a real catalog model adds 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. A custom AI avatar is a â¬100 one-time setup; bringing your own model is â¬300 one-time. 2997- **Volume:** pre-paid video packages run Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). 2998- **Pro:** â¬99/month removes the watermark, gives direct downloads, â15% on videos, cheaper edits and priority queue. 2999 3000Because images are billed per batch, a month is easy to plan: one project per week, a â¬4.90 first batch to set the look, follow-up batches at â¬1.90 in the same project, a few â¬0.39 edits, and a video or two on top. 3001 3002You can test the workflow on the free plan first â 10 watermarked images a month and one video preview, no credit card. Full details are on the [pricing page](/pricing); if you are weighing this against booking a photographer for the room, the [AI UGC vs product photoshoot comparison](/compare/ai-ugc-vs-product-photoshoot) lays out where each one wins. 3003 3004## How does this content help with local discovery? 3005 3006Local discovery is now three surfaces at once: map listings, short-form search inside TikTok and Instagram, and AI assistants answering "where should I eat near X". They reward different things, and video helps with all three for the same reason â it shows the room. 3007 3008- **Map and business listings** need fresh stills more than clips. Keep a rotating set of real dish photos and generated room shots, and update them seasonally. 3009- **Short-form search** rewards spoken and written specificity. Say the neighbourhood and the dish out loud in the clip, and write them in the caption; people frequently search for a dish plus a neighbourhood rather than a broad category. 3010- **Assistants and review surfaces** pull from your own pages. A POV clip and a clear atmosphere gallery on your site give them something concrete to summarise. 3011 3012If you serve a tourist crowd, produce captions in more than one language â HeroShots ships in five public languages, and the same clip with a different caption set covers a lot of ground. 3013 3014## Do I need a person on camera? 3015 3016Not for POV and atmosphere â that is the point of the format. But a face helps for anything explanatory: a dish walkthrough, a "what to order first", a seasonal announcement. Three options, in order of effort. 3017 3018Your own staff, filmed normally, with a signed [model release](/glossary/model-release) before anything goes into a generation tool. A licensed catalog creator, where consent, likeness licensing and creator royalties are handled through the platform. Or an AI avatar, which carries no likeness fee and stays consistent across a series â useful if you want the same "host" all season without tying your brand to one employee who may leave. 3019 3020Never generate a recognisable face â a regular, a local figure, a member of staff who did not agree â from a photo you happen to have. 3021 3022## How should I disclose AI, and what about ad rules? 3023 3024Label it, plainly, in the caption: "atmosphere shots styled with AI, food photographed at the restaurant" is a sentence that c
3024osts you nothing and pre-empts the comment section. Guests tend to be more forgiving of a generated room than of a generated plate that arrives looking different. 3025 3026For paid distribution, platforms generally require some form of disclosure for AI-generated or significantly edited content, and the rules change often â check the current policy in your ad account before a campaign, and keep the food footage real regardless. Categories such as alcohol, anything that could read as a health or nutrition benefit, and content aimed at minors are commonly restricted on top of that, so treat those as legal questions rather than creative ones. 3027 3028## What makes AI restaurant content look fake? 3029 3030Five things worth watching for: motion that is too smooth to be a phone; a room that does not match the room in your other photos; generated text on signage or menus; guests whose hands or cutlery behave oddly; and food that is prettier than food. Fixing the first is a prompt note â handheld, slight sway. Fixing the rest is mostly discipline about source material: your room, your plates, your light. Get that right and the format does the one thing a menu photo cannot â it shows people what walking in feels like.`,faqs:[{q:"What is the best AI video format for a restaurant or bar?",a:"The walk-in POV: a chest-height, vertical clip of eight to ten seconds that moves through the entrance and reveals the room. It answers what a stranger actually wants to know â what the place feels like â which a menu photo cannot do. Pair it with a dish-led close-up built from a real photo of your food and an atmosphere pan of the room, and you have a repeatable three-clip week."},{q:"Can I generate photos of my dishes with AI?",a:"You should photograph the dish and use AI only to add motion, light or context around it. Advertising rules in many markets generally expect food imagery to represent what a customer will actually be served, and generative models still drift on ingredient counts, plating, portion size and printed text. A generated plate that does not match the plate a guest receives is a trust problem and a compliance risk at the same time, so check the rules that apply where you operate."},{q:"How long should a restaurant POV video be?",a:"Eight to ten seconds for a walk-in or atmosphere clip, five to eight for a dish close-up. Generating up to 15 seconds gives you room to trim; most clips get stronger when cut down. On HeroShots a video up to 15 seconds is â¬15 and up to 30 seconds is â¬35, excluding VAT."},{q:"How much does AI content cost for a single venue?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Prices exclude VAT."},{q:"Do I have to disclose that a clip is AI-generated?",a:'Say so in the caption â a line like "atmosphere shots styled with AI, food photographed at the restaurant" is clear and costs you nothing. For paid distribution, platforms generally require some form of disclosure for AI-generated or significantly edited content, and the rules change often, so check the current policy in your ad account before launching a campaign.'},{q:"Can I put my staff or my regular customers in AI content?",a:"Only with their explicit written consent. Anyone recognisable needs a signed model release before their image goes into a generation tool, and you should never generate a face from a photo you happen to have. If you want a face without that admin, use an AI avatar, which carries no likeness fee, or a licensed catalog creator where consent, likeness licensing and royalties are handled through the platform."},{q:"What source photos do I need before I start?",a:"Roughly ten to fifteen: the room at two or three different hours, the entrance from outside and inside, the bar, the terrace if you have one, and clean overhead shots of your four or five signature dishes. Sharp, well-lit phone photos are enough. Collecting them once gives you material for months of clips."},{q:"Will this help my restaurant show up in local search?",a:"It helps indirectly, by giving each surface what it rewards. Map and business listings want fresh, real stills updated seasonally. Short
3030-form search inside TikTok and Instagram rewards saying and writing the neighbourhood and the dish specifically. AI assistants and review surfaces pull from your own site, so a POV clip and a clear atmosphere gallery give them something concrete to summarise."},{q:"Does using a real catalog model cost extra?",a:"Yes. A real catalog model adds 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos, and consent, likeness licensing and creator royalties are handled through the platform. AI avatars add no likeness fee. A custom AI avatar is a â¬100 one-time setup and bringing your own model is â¬300 one-time. Prices exclude VAT."},{q:"Is there a free way to test it before paying?",a:"Yes. The free plan includes 10 watermarked images per month and one video preview, with no credit card required. That is enough to run one dish and one room photo through a batch and see whether the look matches your venue before committing to a paid batch or video."}],metaTitle:"POV Videos for Restaurants and Bars"},it:{title:"Contenuti AI per ristoranti e bar: attrarre clienti con video POV",description:"I ristoranti che pubblicano 3 video POV a settimana vedono spesso più prenotazioni dai social. Come produrli con l'AI senza filmare tu.",body:`Ristoranti e bar che pubblicano **3 video POV a settimana** ottengono tipicamente più prenotazioni da Instagram e TikTok rispetto a chi pubblica foto menù. Il formato che vince: walk-in handheld + close-up piatto signature + vibe ambient. 3031 3032## La settimana in 3 clip 3033 3034- **Walk-in POV** (8s) â ingresso, la sala si rivela. 3035- **Macro piatto signature** (5s) â vapore, salsa, impiattamento. 3036- **Vibe pan** (8s) â luce, musica, persone che si godono. 3037 3038Con HeroShots carichi una foto dello spazio + una del piatto; al resto pensa l'AI.`,faqs:[{q:"I clienti si sentiranno ingannati se è AI?",a:"Non se l'AI è ancorata a foto reali del locale e dei piatti. Dichiara 'shot styled with AI' in caption per restare compliant e costruire fiducia."}]},es:{title:"Contenido AI para restaurantes y bares: atraer clientes con vÃdeos POV",description:"Los restaurantes que publican 3 vÃdeos POV por semana suelen ver más reservas desde social. Cómo producirlos con AI sin filmar tú.",body:`Restaurantes y bares que publican **3 vÃdeos POV por semana** suelen ver más reservas desde Instagram y TikTok que los que publican fotos de menú. El formato ganador: walk-in handheld + close-up plato signature + vibe ambient. 3039 3040## La semana en 3 clips 3041 3042- **Walk-in POV** (8s) â entrada, la sala se revela. 3043- **Macro plato signature** (5s) â vapor, salsa, emplatado. 3044- **Vibe pan** (8s) â luz, música, gente disfrutando. 3045 3046Con HeroShots subes una foto del local + una del plato; al resto se encarga la AI.`,faqs:[{q:"¿El cliente se sentirá engañado si es AI?",a:"No si la AI está anclada en fotos reales del local y los platos. Declara 'shot styled with AI' en caption para quedar compliant y construir confianza."}]},de:{title:"AI-Content für Restaurants und Bars: Gäste mit POV-Videos gewinnen",description:"Restaurants mit 3 POV-Videos pro Woche sehen oft mehr Reservierungen aus Social. So produzierst du sie mit AI, ohne selbst zu filmen.",body:`Restaurants und Bars, die **3 POV-Videos pro Woche** posten, sehen typischerweise mehr Reservierungen aus Instagram und TikTok als Menu-Foto-Poster. Gewinner-Format: Handheld-Walk-In + Signature-Dish-Close-Up + Ambient-Vibe-Shot. 3047 3048## Die Woche in 3 Clips 3049 3050- **Walk-In POV** (8s) â Eingang, Raum offenbart sich. 3051- **Signature-Dish-Makro** (5s) â Dampf, Sauce, Anrichten. 3052- **Vibe-Pan** (8s) â Licht, Musik, Menschen, die genieÃen. 3053 3054Mit HeroShots lädst du ein Foto deines Lokals + eins des Gerichts hoch; den Rest übernimmt AI.`,faqs:[{q:"Fühlen sich Gäste betrogen, wenn es AI ist?",a:"Nicht, wenn die AI auf echten Fotos des Lokals und der Gerichte basiert. Im Caption 'shot styled with AI' angeben â bleibt compliant und baut Vertrauen."}]},fr:{title:"Contenu AI pour restaurants et bars : attirer des clients avec des vidéos POV",description:"Les restaurants qui publient 3 vidéos POV par semaine ont souvent plus de réservations depuis les réseaux. Comment les produire avec l'AI sans filmer.",body:`Restaurants et bars qui publient **3 vidéos POV par semaine** voient souvent plus de réservations depuis Instagram et TikTok que ceux qui publient des photos de menu. Format gagnant : walk-in handheld + close-up plat signature + vibe ambient. 3055 3056## La semaine en 3 clips 3057 3058- **Walk-in POV** (8s) â entrée, la salle se révèle. 3059- **Macro plat signature** (5s) â vapeur, sauce, dressage. 3060- **Vibe pan** (8s) â lumière, musique, gens qui profitent. 3061 3062Avec HeroShots tu upload une photo du lieu + une du plat ; l'AI gère le reste.`,faqs:[{q:"Le client se sentira-t-il trompé si c'est AI ?",a:"Pas
3062si l'AI est ancrée sur des photos réelles du lieu et des plats. Déclare 'shot styled with AI' en caption pour rester compliant et bâtir la confiance."}]}}},{slug:"hotel-boutique-experience-ai-content",date:"2026-06-20",updated:"2026-07-27",author:"HeroShots",tags:["vertical","hospitality","hotels"],translations:{en:{title:"Marketing for Boutique Hotels: Experience-Led AI Content That Sells Moments, Not Rooms",description:"How boutique hotels use AI to sell moments, not rooms: what to generate, what to photograph, seasonal planning, disclosure rules and real costs.",body:`A boutique hotel's content problem is rarely that the rooms look bad. It's that a room photo answers *what will I get* and never answers *what will this feel like*. The practical fix is a split: keep a small, honest set of real photographs of every bookable space, and use [AI UGC](/glossary/ai-ugc) to generate the moments around them â the 7am coffee on the terrace, the walk to the market, the last look at the courtyard before checkout. Rooms are proof. Moments are the reason people book. Only one of the two needs a crew, a stylist and a shoot day. The rest of this guide covers what to generate, what must stay photographic, how to run a seasonal calendar that leads the booking window instead of trailing it, and where the honesty line sits when you depict a real property with synthetic imagery. 3063 3064## Should a boutique hotel post rooms or moments? 3065 3066Both â but not in the same place, and not for the same job. 3067 3068Room photography is inventory documentation. It belongs on room-type pages, the booking engine, OTA galleries, and any surface where a guest is comparing a Junior Suite against a Deluxe and deciding whether the bathroom is acceptable. It must be literal, current, and taken in the actual room being sold. 3069 3070Moments are demand generation. They belong in the feed, in paid social, in the email hero, in the hotel's Reels and TikTok grid. A person scrolling at 10pm is not comparing your two room categories. They are deciding whether they want *this kind of trip at all* â a slow Tuesday in a hill town, a rooftop in shoulder season, a hotel where breakfast lasts two hours. That decision is emotional, and a well-lit empty bed rarely makes it. 3071 3072### The one-line honesty test 3073 3074Before you generate anything, say out loud what the frame promises. 3075 3076- "This is our room" is a **factual** promise. Photograph it. 3077- "This is what a morning here feels like" is an **evocative** promise. AI can carry it, as long as the setting starts from real images of your actual property. 3078 3079Everything downstream follows from that distinction. 3080 3081## What should be photographed for real, and what can be generated? 3082 3083| Asset | Where it should come from | Why | 3084| --- | --- | --- | 3085| Room interiors as sold â bed, bathroom, the view out the window | Real photograph | It is the product. Guests will stand in that room and compare. | 3086| Signature dish, breakfast spread | Real photograph, then edited | The dish must be yours; light, props and table dressing can be reworked | 3087| Guest-in-frame lifestyle moments â coffee on the terrace, robe, book by the pool | Generated, starting from real images of that exact terrace or pool | No shoot day, no per-guest releases, variants on demand | 3088| Seasonal versions of a space you already shot | Generated restyle of the real image | Avoids re-shooting the same courtyard four times a year | 3089| Neighbourhood b-roll â market, alley, coastline | Real, or generated only if the place stays recognisably yours | Guests tend to fact-check the town harder than you would expect | 3090| Concierge tips, host welcome, "what to do on a rainy day" | Real video, or an avatar-led generated video | Voice-led formats work either way | 3091| Paid social hero video | Generated | This is where volume and variant testing pay off | 3092 3093The pattern: anything a guest can walk up to and verify stays photographic. Anything that describes a feeling, a season, or a type of person having a good time can be generated. 3094 3095## How do you stay honest about a property you're actually depicting? 3096 3097This is the part that separates hotel content from most e-commerce work. You are not selling a bottle that arrives in a box â you are selling a place someone will physically stand in, and the gap between the image and the reality shows up in reviews. 3098 3099Five rules that keep you clean: 3100 3101- **Never generate an amenity you don't have.** No pool, no sea view, no balcony, no fireplace, no spa unless it exists and is bookable. It is one of the fastest ways to turn a booking into a complaint. 3102- **Start from your own images.** Use the real terrace, staircase, tile or courtyard as the input rather than a bare text prompt. Generic Mediterranean luxury reads as generic Mediterranean luxury. 3103- **Frame instead of invent.** Tight crops, over-the-shoulder angles, hands and details, shallow depth of field. You are showing a mood in a real place, not reconstructing an architectural elevation. 3104- **Disclose.** A short caption note such as "styled with AI, shot in our
3104courtyard" costs nothing and pre-empts the accusation. Platforms and regulators are generally moving toward labelling expectations for synthetic media, and some platforms add their own labels â check current policy in your markets rather than assuming. 3105- **Respect faces.** Never generate a person who resembles an actual guest or a staff member without a signed [model release](/glossary/model-release). Use licensed catalog creators or AI avatars, where consent and [likeness licensing](/glossary/likeness-licensing) are handled up front. 3106 3107A useful internal standard: *would I be comfortable if a guest held up this image at reception?* If the answer is no, it's a room shot pretending to be a mood shot. 3108 3109## What does a seasonal content calendar look like for a hotel? 3110 3111Seasonality is where independents tend to beat chains, and where AI generation earns its keep â because you can produce autumn imagery in July, when the property is full and nobody has time to style a shoot. 3112 3113The rule is to **lead the booking window, not the weather**. Publish the mood people are booking for, roughly one to two months ahead of the stay, adjusted for how far out your segment books. City weekenders book short; a summer villa week books long. 3114 3115- **Winter:** rain on the window, fireplace, long breakfast, the empty bar at 4pm, steam rising off the plunge pool. Sell shelter, not sunshine. 3116- **Spring:** first open window, terrace tables coming out, the town on foot before the crowds. 3117- **Summer:** shoot the edges of the day â dawn swim, 7pm aperitivo â not harsh noon. Summer content that avoids crowds signals a calmer property. 3118- **Autumn:** harvest, quiet corridors, the workation angle, long-stay offers. 3119- **Holidays:** only depict decorations you will actually put up. A generated Christmas tree in a lobby that gets a wreath is a complaint waiting to happen. 3120 3121Run one theme per month. A boutique property does not need thirty ideas; it needs one promise repeated in five formats. 3122 3123## How do you produce a month of experience content, step by step? 3124 31251. **Build the reference set once.** Fifteen to twenty-five real photos of the property: each key space at two times of day, plus details â tiles, the tap, the key fob, linen, tableware, the breakfast china. This library is reused all year and is the difference between "a hotel" and "your hotel". 31262. **Pick the month's single promise.** For example: *slow mornings in the old town.* Everything you make that month serves it. 31273. **Cast it.** AI avatars add no likeness fee. A real catalog creator adds +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. If you want a recurring face all season, a custom AI avatar setup is â¬100 one-time; bringing your own model â your host, your owner, with the paperwork done â is â¬300 one-time. 31284. **Generate stills first.** A batch returns 4 variants, typically in under a minute: â¬4.90 for the first batch in a project, â¬1.90 for each further batch in the same project. Stills are the cheap way to find the frame before you pay for motion. 31295. **Edit the keeper.** An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Use it to fix a prop, a colour, a crop â not to invent an amenity. 31306. **Promote two or three stills to video.** Video up to 15s is â¬15; video up to 30s is â¬35; extra retries are â¬5 per 15s block. Short tends to beat long in the feed; keep the 30s cut for paid. 31317. **Caption with the disclosure line** and a booking-relevant CTA â direct rate, breakfast included, the thing the OTA can't offer. 31328. **Route the assets correctly.** Generated moments go to feed, ads, email, and your own site's storytelling blocks. They do **not** go into OTA room galleries or the booking-engine room cards, which should stay photographic. 3133 3134## What does a realistic month cost per property? 3135 3136Arithmetic on list prices, one property, using AI avatars and no likeness fee: 3137 3138| Line item | Quantity | Cost | 3139| --- | --- | --- | 3140| Image batches (4 variants each) | 1 first + 5 further, same project | â¬4.90 + 5 à â¬1.90 | 3141| Edits on chosen images | 3 | 3 à â¬0.39 | 3142| Video up to 15s | 2 | 2 à â¬15 | 3143| Video up to 30s | 1 | â¬35 | 3144| **Month total (excl. VAT)** | 24 stills, 3 videos | **sum of the rows above** | 3145 3146Add +25% on the base price if you cast a real catalog creator. HeroShots Pro at â¬99/month removes the watermark, enables direct downloads, applies â15% on videos, lowers edit cost, and adds a priority queue â worth considering once you are producing for more than one property. To test the workflow first, the Free plan gives 10 watermarked images per month and 1 video preview, with no credit card. Properties and groups producing video at volume can pre-pay: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). Full details are on [pricing](/pricing); all prices exclude VAT. 3147 3148Compared with commissioning a seasonal shoot four times a year, the trade-off is not only cost but *cadence* â you can respond to a rainy week or a last-minute gap in the calendar the same afternoon. The [AI UGC vs product photoshoot comparison](/compare/ai-ugc-vs-product-photoshoot) breaks down where each approach still wins. 3149 3150## What makes AI hotel content backfire? 3151 3152- **Generic luxury.** Marble, infinity pool, white curtains â a property that could be anywhere sells nothing. 3153- **Impossible geography.** A sea view from a building three streets inland is a direct route to a review that mentions your marketing. 3154- **A different face every post.** Consistency reads as a returning guest and builds a recognisable brand; see [avatar consistency](/glossary/avatar-consistency) for why a recurring identity matters more than variety. 3155- **Over-polish.** Experience content should look like something a guest shot, not like a brochure. Handheld framing, imperfect light, real clutter. 3156- **Silence about AI.** Disclosure is cheap; being caught is not. 3157- **Using it where facts live.** Booking pages, room cards, OTA galleries â photographic only, always. 3158 3159Get those six right and the split works: generated moments create the desire, real photographs close the booking, and nobody arrives feeling misled.`,faqs:[{q:"Should a boutique hotel show rooms or experiences in its content?",a:"Both, in different places. Real room photography belongs on room-type pages, the booking engine and OTA galleries, where guests compare what they will physically get. Experience content â mornings, terraces, neighbourhood walks â belongs in the feed, paid social and email, where the decision being made is whether to take this kind of trip at all. Rooms are proof; moments are the reason."},{q:"Won't guests feel misled if hotel content is AI-generated?",a:"Not if the imagery starts from real images of your actual property, never depicts an amenity you don't have, and is disclosed in the caption. The risk is not that content is synthetic â it is that it promises something the guest won't find on arrival. Keep factual promises photographic and evocative promises grounded, and the gap disappears."},{q:"What should never be AI-generated for a hotel?",a:"Anything a guest can walk up to and verify: room interiors as sold, the bathroom, the actual view from the window, amenities like a pool, balcony, fireplace or spa, and decorations you won't actually put up. Also avoid generating faces that resemble real guests or staff without a signed model release."},{q:"Can I use AI-generated images in my OTA listing gallery?",a:"Treat OTA room galleries and your own booking-engine room cards as photographic-only surfaces. Distribution platforms generally expect listing photos to depict the actual property and room being sold, and requirements differ by platform, so check current policy. Use generated experience content on channels you control: social, ads, email and storytelling blocks on your own site."},{q:"How far ahead should hotel seasonal content be published?",a:"Lead the booking window rather than the weather â roughly one to two months ahead of the stay, adju
3159sted for how far in advance your segment books. City weekend guests book short, so autumn content can go out in early September; a summer week books far earlier, so that imagery should be generated in winter or spring."},{q:"How many experience clips does a boutique property need per month?",a:"One theme per month, expressed in a handful of formats, works better than scattered ideas. A workable rhythm is around two dozen still variants and two or three short videos â enough for weekly posting, a paid test and an email hero, all serving a single promise such as slow mornings or a rainy-day retreat."},{q:"What does a month of AI content cost for one hotel?",a:"On HeroShots list prices, a month with six image batches of 4 variants (â¬4.90 for the first batch in a project, â¬1.90 for each further batch in the same project), three edits at â¬0.39, two videos up to 15s at â¬15 and one video up to 30s at â¬35 comes to the sum of the rows above excluding VAT. Casting a real catalog creator adds +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos."},{q:"Should I use an AI avatar or a real creator for hotel content?",a:"AI avatars add no likeness fee and are the cheapest way to keep a consistent face across a season; a custom AI avatar setup is â¬100 one-time. Real catalog creators add +25% on the base price and are worth it when the guest persona needs to feel specific and recognisable. Many properties use an AI avatar for recurring seasonal storytelling and a real creator for campaign pushes."},{q:"Do I need to label AI-generated hotel content?",a:'Platforms and regulators are generally moving toward disclosure expectations for synthetic media, and some platforms add their own labels, so check current policy in the markets where you advertise. Independently of policy, a short caption note such as "styled with AI, shot in our courtyard" is cheap and pre-empts any accusation of misleading guests.'},{q:"Can AI content replace a professional hotel photoshoot?",a:"No â it replaces the repeat seasonal shoots, not the base one. You still need a real photographic set of every bookable space and a reference library of fifteen to twenty-five property photos covering each key area at different times of day plus details. From that base, generation handles seasonal restyles, lifestyle moments and ad variants without booking a new shoot."}],metaTitle:"AI Content for Boutique Hotels"},it:{title:"Marketing per hotel e boutique: contenuti experience generati con l'AI",description:"Gli hotel vendono esperienza, non camere. La ricetta di contenuto AI per far crescere le prenotazioni dirette: 4
3159clip esperienziali al mese per struttura.",body:`Gli hotel e i boutique stay fanno crescere le prenotazioni dirette quando pubblicano **4 clip esperienziali AI al mese**. Il framing che converte: non 'vedi la camera' ma 'vediti in questo momento'. 3160 3161## 4 clip al mese 3162 3163- **Rituale del mattino** (caffè in terrazza, 8s). 3164- **Micro-momento locale** (passeggiata al mercato, 10s). 3165- **Wind-down al tramonto** (rooftop / piscina, 8s). 3166- **Sensazione di partenza** (riconsegna chiave, 5s). 3167 3168Usa Real Model coerenti con il guest persona e ancora ogni scena a foto reali della struttura.`,faqs:[{q:"Gli ospiti non vorranno vedere la camera vera?",a:"Sì â tieni 3â4 foto reali delle camere sul sito. Le clip esperienziali AI generano desiderio; le foto reali confermano la prenotazione."}]},es:{title:"Marketing para hoteles y boutique: contenido experiencial generado con AI",description:"Los hoteles venden experiencia, no habitaciones. La receta de contenido AI para hacer crecer las reservas directas: 4 clips experienciales al mes por propiedad.",body:`Hoteles y boutique stays hacen crecer las reservas directas cuando publican **4 clips experienciales AI al mes**. El framing que convierte: no 've la habitación' sino 'vete a ti en este momento'. 3169 3170## 4 clips al mes 3171 3172- **Ritual de mañana** (café en terraza, 8s). 3173- **Micro-momento local** (paseo por mercado, 10s). 3174- **Wind-down al atardecer** (rooftop / piscina, 8s). 3175- **Sensación de salida** (entrega de llave, 5s). 3176 3177Usa Real Models coherentes con tu guest persona y ancla cada escena a fotos reales de la propiedad.`,faqs:[{q:"¿No querrán los huéspedes ver la habitación real?",a:"Sà â mantén 3â4 fotos reales de habitaciones en el sitio. Los clips experienciales AI generan deseo; las fotos reales confirman la reserva."}]},de:{title:"Marketing für Hotels und Boutiques: Erlebnis-Content mit AI",description:"Hotels verkaufen Erlebnis, nicht Zimmer. Das AI-Content-Rezept für mehr Direktbuchungen: 4 Erlebnis-Clips pro Monat pro Haus.",body:`Hotels und Boutique-Stays steigern Direktbuchungen, wenn sie **4 Erlebnis-AI-Clips pro Monat** posten. Framing, das konvertiert: nicht 'sieh das Zimmer', sondern 'sieh dich in diesem Moment'. 3178 3179## 4 monatliche Clips 3180 3181- **Morgenritual** (Kaffee auf der Terrasse, 8s). 3182- **Lokaler Mikro-Moment** (Markt-Spaziergang, 10s). 3183- **Sunset-Wind-Down** (Rooftop / Pool, 8s). 3184- **Abreisegefühl** (Schlüssel-Ãbergabe, 5s). 3185 3186Real Models passend zur Gäste-Persona, jede Szene in echten Property-Fotos verankert.`,faqs:[{q:"Erwarten Gäste nicht das echte Zimmer?",a:"Ja â halte 3â4 echte Zimmerfotos auf der Website. Erlebnis-AI-Clips erzeugen Begehren; echte Fotos bestätigen die Buchung."}]},fr:{title:"Marketing pour hôtels et boutiques : contenu experience généré avec l'AI",description:"Les hôtels vendent une expérience, pas une chambre. La recette de contenu AI pour faire croître les réservations directes : 4 clips experience par mois.",body:`Les hôtels et boutique stays augmentent leurs réservations directes quand ils publient **4 clips experience AI par mois**. Framing qui convertit : pas 'vois la chambre' mais 'vois-toi dans ce moment'. 3187 3188## 4 clips par mois 3189 3190- **Rituel du matin** (café en terrasse, 8s). 3191- **Micro-moment local** (marché, 10s). 3192- **Wind-down au coucher** (rooftop / piscine, 8s). 3193- **Sensation de départ** (remise de clé, 5s). 3194 3195Real Models cohérents avec la guest persona, chaque scène ancrée sur photos réelles de la propriété.`,faqs:[{q:"Les clients ne voudront-ils pas voir la vraie chambre ?",a:"Si â garde 3â4 photos réelles de chambres sur le site. Les clips experience AI génèrent le désir ; les vraies photos confirment la réservation."}]}}},{slug:"gym-fitness-ugc-demo-routines",date:"2026-06-21",updated:"2026-07-27",author:"HeroShots",tags:["vertical","fitness","gym"],translations:{en:{title:"UGC for Gyms and Fitness Brands: Demo Videos, Routines and Class Promos",description:"How gyms and fitness brands make exercise demos, class promos and community UGC with AI avatars: formats, consent rules, weekly workflow and costs.",body:`The gym content that actually fills a trial slot is a **complete, copyable rep** â setup, working set, and the one cue that makes it click â in a clip short enough to finish. Equipment glamour shots and drone passes over the squat racks look expensive and tend to move very little, because nobody joins a gym for the flooring. A coach fixing a beginner'
3195s hip hinge, a 30-second class preview with the real energy of the room, a members' board on a Friday morning: these give the viewer something to imitate or somewhere to belong, which is what a trial signup really is. This guide covers the formats worth producing, how to handle transformation-adjacent content without creating a compliance problem, and a weekly workflow you can run without a videographer on payroll. 3196 3197## What makes gym content convert instead of just looking good? 3198 3199Three things separate a post that fills a trial slot from one that collects passive likes. 3200 3201**It is imitable.** The viewer should be able to picture themselves doing the thing on Tuesday. That means visible load selection, a rep count, and a range of body types that reflects your actual floor â not only the fittest coach on staff. 3202 3203**It is specific to your room.** "Get strong" is wallpaper. "Our 6:15am strength class starts with the same four warm-up drills every week so you never walk in confused" is a reason to try it. Specificity
3203is also what makes a post feel like genuine [user-generated content](/glossary/user-generated-content) rather than a stock library asset. 3204 3205**It resolves.** Short-form viewers tend to abandon clips that end mid-lift or fade out on a logo. Land the last rep, land the cue, land the caption. 3206 3207### The one thing to stop making 3208 3209Stop producing carousels of clean equipment with a price on top. Price-led posts get compared against the cheapest chain nearby. Routine-led and community-led posts get compared against sitting on the sofa, which is a much easier fight to win. 3210 3211## Which exercise demo formats are worth producing? 3212 3213Build a small library of repeatable formats so nobody has to invent an idea on a Monday morning. 3214 3215- **Single-lift breakdown (20â30s).** One movement, three cues, one common error shown and corrected. The most durable format you have â it stays useful for years and can be reposted seasonally. 3216- **Machine explainer (15s).** Seat height, pad position, first working weight. Aimed squarely at the beginner who finds the machine section intimidating. 3217- **Full micro-routine (30s).** Warm-up, working set, finisher, end to end. This is the flagship format for trial signups because it shows a whole session compressed. 3218- **Substitution clip (15s).** "Rack busy? Do this instead." Practical, and it stops people abandoning a session halfway. 3219- **Accessibility or low-impact variant (20s).** Chair-supported, band-assisted, seated alternatives. Widens your audience and reads as competence â keep the framing on options available in your room, not on treating anything. 3220- **Coach's-eye POV (15s).** What the coach is watching for during a set. Positions your staff as the product, which is the natural path into personal training. 3221 3222### Shot ideas that hold up in a feed 3223 3224Low-angle from the plate side on a deadlift so the bar path is visible. Over-the-shoulder on a cable row to show the shoulder blades moving. A hands-only close-up of grip and knurling. A mirror shot where the coach's correction and the member's adjustment land in the same frame. A static wide of the room filling up before the start â no music trickery, just a busy floor. 3225 3226## Should you feature coaches, members, or an avatar? 3227 3228Most clubs need all four sources, used for different jobs. Real members are the most persuasive and the most logistically painful; a licensed [creator avatar](/glossary/creator-avatar) or an AI avatar closes the gap when consent, scheduling or staff turnover makes filming impossible. 3229 3230| Source | Best for | Consent burden | Practical constraint | 3231| --- | --- | --- | --- | 3232| Real members | Trial signups, community proof, relatability | Signed release per person, per use | Hardest to schedule; releases go stale when people leave | 3233| Coaches and staff | Technique authority, personal-training upsell | Covered by employment or a standing release | The same faces get repetitive fast across a content calendar | 3234| Licensed creator avatar | Face-led demos at volume when you need a real human likeness | Handled through built-in likeness licensing and creator royalties | Adds a likeness fee on top of the base generation price | 3235| AI avatar | Filler formats, apparel and retail shots, multi-language variants | No individual to clear | Disclose it as AI-assisted; never imply it is a real member | 3236 3237Members tend to work better for trial signups, because relatability is the mechanism; coaches tend to work better for personal-training and small-group upsells, because authority is. Mix both across the week rather than picking a side. 3238 3239## How do you handle transformation content responsibly? 3240 3241Transformation posts are the highest-risk category in fitness marketing and one of the easiest ways to get an ad account restricted. Platforms generally place restrictions on before-and-after body imagery and idealised body claims, especially in paid placements, and health-adjacent advertising rules change often â check current policy per platform before you put spend behind anything here, and assume paid and organic are judged differently. 3242 3243Keep captions clear of medical, health-outcome and weight-loss promises entirely. Describe what happens in the room, not what will happen to somebody's body. 3244 3245The safer alternative is **transformation-adjacent** content, which keeps the emotional payoff without the body-comparison framing: 3246 3247- **Capability milestones.** First unbroken pull-up. First 60kg squat. First full class without stopping. The subject stays clothed, the achievement is measurable, and nothing implies a body-shape promise. 3248- **Consistency streaks.** "Forty sessions since January." Show the check-in board, not the waistline. 3249- **Confidence-in-the-room content.** Someone using the free-weight area for the first time, with a coach nearby. 3250- **Skill progressions.** Week one to week eight of a movement pattern, filmed from the same angle. 3251 3252If you do publish a genuine member before-and-after, you need an explicit, dated, written model release that names the channels and the duration, and
3252you should re-confirm before any reuse in paid ads. Never generate a synthetic body change on a real person's likeness â that misrepresents an identifiable individual and is a straightforward brand-safety failure regardless of what the caption says. 3253 3254## How do you promote a class or a new timetable slot? 3255 3256Class promotion is where volume beats artistry. Each class needs its own variant, not one generic "new timetable" post. 3257 3258Give every slot a three-asset kit: a **static** with the day, time and coach name; a **15-second energy clip** showing the first minute of the session; and a **stakes-lowering post** that answers the unspoken question ("you can stand at the back, nobody is looking at you, just bring trainers"). Rerun the kit as the slot fills, swapping only the copy. This is exactly the kind of many-variant work that suits [batch generation](/glossary/batch-generation) â one product reference, one avatar, a prompt per class, four variants back per batch. 3259 3260For anything you sell as an object â branded tees, shakers, resistance bands, on-site retail â the same pipeline produces the product imagery too, without a separate shoot every time a line changes ([AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot)). 3261 3262## How do you run a weekly gym content routine without a videographer? 3263 32641. **Pick four formats for the month**, not fourteen. For example: single-lift breakdown, micro-routine, class energy clip, milestone post. 32652. **Batch the real footage once a fortnight.** Book ninety minutes on the floor with one coach and one consenting member, shoot every real-facility asset you need, and stop. 32663. **Write prompts, not briefs.** For generated assets, describe the exact frame: camera height, lighting, apparel colour, what the subject is holding, what they are doing with their hands. Vague prompts produce vague output. 32674. **Generate in one project per campaign** so the first batch and its follow-ups stay grouped and the follow-up batches price correctly. 32685. **Keep the same avatar across a campaign.** Avatar consistency is what makes a series read as one person rather than four strangers who happen to wear your logo. 32696. **Edit the winner, don't regenerate the set.** When one of the four variants is nearly right, run a targeted edit on that image instead of burning a new batch. 32707. **Caption for the objection, not the feature.** Every post should answer "why would I not come?" â parking, intimidation, contract length, whether beginners are welcome. 32718. **Disclose AI-assisted assets** in the caption, and keep genuine facility photos on your site and Google Business profile so what people see before arriving matches what they walk into. 3272 3273## What does a month of gym content cost to produce? 3274 3275Image work is billed per batch of four variants: the first batch in a project is â¬4.90 and every further batch in the same project is â¬1.90, so four batches â sixteen variants â is the first batch plus three more at â¬1.90. A batch typically returns in under a minute. Refining a chosen image costs â¬0.39 per edit, or â¬0.23 with HeroShots Pro. 3276 3277Video is priced by length: â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Using a real catalog model adds a 25% likeness fee on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. If you want a dedicated look, a custom AI avatar is a â¬100 one-time setup and bringing your own model is â¬300 one-time. 3278 3279Clubs running a steady video cadence often move to pre-paid packages: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). HeroShots Pro is â¬99/month and removes the watermark, enables direct downloads, cuts video prices by 15%, lowers edit prices and gives priority queue access. If you want to test the format first, the free plan gives 10 watermarked images a month and one video preview, with no credit card. All prices exclude VAT â full detail on the [pricing page](/pricing). 3280 3281## What should a gym check before publishing? 3282 3283Run a short pre-publish pass on every asset. Do you hold a current, written release for every identifiable person? Does the caption avoid health outcomes, weight-loss promises and anything that reads as medical advice? Is AI involvement disclosed? Does the generated scene avoid implying equipment, classes or facilities you do not have â a promise your front desk has to honour on Monday? And are the rights you hold broad enough for the placement, since organic and paid usage are often licensed separately under [usage rights](/glossary/usage-rights)? 3284 3285Get those five checks into a habit and the rest is repetition: a small library of formats, a fortnightly shoot, and a pipeline that turns one good idea into a month of variants.`,faqs:[{q:"Should gym content feature coaches or members?",a:"Both, for different jobs. Members tend to work better for trial signups because relatability is the mechanism â a viewer needs to see someone like themselves succeeding. Coaches tend to work better for personal-training and small-group upsells because authority is the mechanism. Mix both across a week rather than committing to one."},{q:"How long should a gym exercise demo video be?",a:"Long enough to show a complete, imitable unit and short enough to finish. A single-lift breakdown works well at 20â30 seconds: setup, three cues, one common error corrected. A machine explainer or substitution clip can land in 15 seconds. What matters more than the exact duration is that the clip resolves â land the last rep rather than fading out on a logo."},{q:"Is it safe to post before-and-after transformation photos?",a:"Treat it as the highest-risk category in fitness marketing. Platforms generally place restrictions on before-and-after body imagery and idealised body claims, especially in paid placements, and the rules change â check current policy per platform before spending. If you publish a genuine member transformation, you need an explicit, dated written release naming the channels and duration, and
3285you should re-confirm before reusing it in ads."},{q:"What is transformation-adjacent content?",a:"Content that delivers the emotional payoff of a transformation post without the body-comparison framing: capability milestones (first unbroken pull-up, first full class without stopping), consistency streaks shown on a check-in board, skill progressions filmed from the same angle over several weeks, and first-time-in-the-free-weights confidence clips. It is less likely to run into advertising-policy problems and tends to feel less alienating to beginners."},{q:"Can I use an AI avatar to show a body transformation on a real member?",a:"No. Generating a synthetic body change on an identifiable person's likeness misrepresents that individual and is a brand-safety failure regardless of the caption or the consent you hold for the original photo. Use capability-based milestones instead, and keep AI-generated bodies confined to avatars that are not presented as specific real members."},{q:"How much does it cost to produce gym images with HeroShots?",a:"Images are billed per batch of four variants: the first batch in a project is â¬4.90 and each further batch in the same project is â¬1.90, so four batches â sixteen variants â is the first batch plus three more at â¬1.90. Editing a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. A batch typically returns in under a minute. Prices exclude VAT."},{q:"What does a gym promo video cost?",a:"Video is priced by length: â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Clubs with a steady cadence often move to pre-paid packages â Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) or Scale â¬1,500 (â¬60/video). HeroShots Pro at â¬99/month cuts video prices by 15% and removes the watermark. Prices exclude VAT."},{q:"Do I pay extra to use a real model instead of an AI avatar?",a:"Yes. Using a real catalog model adds a 25% likeness fee on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee. If you want a dedicated look, a custom AI avatar is a â¬100 one-time setup and bringing your own model is â¬300 one-time. Prices exclude VAT."},{q:"Do I have to disclose that gym content was made with AI?",a:"Disclose it in the caption as a default practice â it protects trust, and platform transparency expectations vary and change over time, so check current policy for each channel. Alongside that, keep genuine photos of your actual facility on your website and Google Business profile so what a prospect sees before arriving matches the room they walk into."},{q:"Can I promote every class slot separately without a new shoot each time?",a:"Yes â that is where batch generation pays off. Build a three-asset kit per slot (static with day, time and coach; a 15-second energy clip; a stakes-lowering post for nervous beginners), then generate variants from one avatar and one prompt per class. Keep the same avatar across a campaign so the series reads as one consistent person."}],metaTitle:"Gym & Fitness UGC: Demos and Routines"},it:{title:"UGC per palestre e centri fitness: video demo e routine",description:"I post che mostrano routine reali convertono più trial signup degli scatti glamour delle attrezzature. Il piano UGC settimanale.",body:`L'UGC palestre che porta trial signup mostra **una routine reale, end-to-end, in meno di 30 secondi** â warm-up, set, finisher. I post in questo formato generano tipicamente più trial signup degli scatti glamour delle sole attrezzature. 3286 3287## Piano UGC settimanale 3288 3289- **2 video routine** (member/coach diversi, 20â30s). 3290- **1 snippet trasformazione** (con consenso + datato). 3291- **1 walkthrough struttura** (vibe + pulizia, 15s). 3292 3293Usa Real Model AI coerenti con il membership demographic quando coordinare le riprese è difficile.`,faqs:[{q:"Mostrare coach o member?",a:"I member convertono meglio per trial signup (relatability). I coach convertono meglio per upsell PT. Mescola in settimana."}]},es:{title:"UGC para gimnasios y centros fitness: vÃdeos demo y rutinas",description:"Los posts que muestran rutinas reales convierten más trial signups que los shots glamour de equipamiento. El plan UGC semanal.",body:`El UGC de gimnasio que genera trial signups muestra **una rutina real, end-to-e
3293nd, en menos de 30 segundos** â warm-up, set, finisher. Los posts en este formato suelen generar más trial signups que los shots glamour de equipo. 3294 3295## Plan UGC semanal 3296 3297- **2 vÃdeos rutina** (members/coaches distintos, 20â30s). 3298- **1 snippet transformación** (con consentimiento + fechado). 3299- **1 walkthrough instalación** (vibe + limpieza, 15s). 3300 3301Usa Real Models AI coherentes con tu demographic cuando coordinar grabaciones es difÃcil.`,faqs:[{q:"¿Mostrar coaches o members?",a:"Members convierten mejor en trial signups (relatability). Coaches convierten mejor en upsell PT. Mezcla en la semana."}]},de:{title:"UGC für Fitnessstudios: Demo-Videos und Routinen",description:"Posts mit echten Routinen konvertieren mehr Trial-Signups als Glamour-Shots von Geräten. Der wöchentliche UGC-Plan.",body:`Gym-UGC, das Trial-Signups bringt, zeigt **eine echte Routine, end-to-end, in unter 30 Sekunden** â Warm-Up, Arbeitssatz, Finisher. Posts in diesem Format generieren typischerweise mehr Trial-Signups als reine Equipment-Glamour-Shots. 3302 3303## Wochenplan UGC 3304 3305- **2 Routine-Videos** (verschiedene Mitglieder/Coaches, 20â30s). 3306- **1 Transformation-Snippet** (mit Einwilligung + datiert). 3307- **1 Facility-Walkthrough** (Vibe + Sauberkeit, 15s). 3308 3309AI-Real-Models passend zur Mitgliederdemografie, wenn Drehs schwer zu koordinieren sind.`,faqs:[{q:"Coaches oder Mitglieder zeigen?",a:"Mitglieder konvertieren besser für Trial-Signups (Relatability). Coaches besser für PT-Upsell. In der Woche mischen."}]},fr:{title:"UGC pour salles de sport et centres fitness : vidéos démo et routines",description:"Les posts qui montrent des routines réelles convert
3309issent plus de trial signups que les shots glamour d'équipement. Le plan UGC hebdo.",body:`L'UGC gym qui amène des trial signups montre **une routine réelle, end-to-end, en moins de 30 secondes** â warm-up, set, finisher. Les posts dans ce format génèrent généralement plus de trial signups que les shots glamour d'équipement seul. 3310 3311## Plan UGC hebdo 3312 3313- **2 vidéos routine** (members/coaches différents, 20â30s). 3314- **1 snippet transformation** (avec consentement + daté). 3315- **1 walkthrough installation** (vibe + propreté, 15s). 3316 3317Utilise des Real Models AI cohérents avec le demographic quand coordonner des tournages est dur.`,faqs:[{q:"Montrer coaches ou members ?",a:"Les members convertissent mieux pour trial signups (relatability). Les coaches mieux pour l'upsell PT. Mélange dans la semaine."}]}}},{slug:"salon-beauty-social-content-ideas",date:"2026-06-22",updated:"2026-07-27",author:"HeroShots",tags:["vertical","salon","beauty"],translations:{en:{title:"Salon and Beauty Social Content Ideas That Actually Drive Bookings",description:"Salon social that books clients: showcase formats, consent-safe before/after, local reach tactics, a monthly workflow and what generated assets cost.",body:`Salon social that actually fills the calendar runs on three formats â **before/after transformations, te
3317chnique close-ups, and behind-the-chair POV** â with each post tied to one nameable, bookable service and a caption that gives the service, a "from" price, and the neighbourhood. Everything else (vibe pans, quote cards, trending audio with no service attached) keeps the grid alive but rarely moves the diary. The practical version for a small team: shoot inside the salon on the days you have willing clients and good light, and generate the rest â retail product shots, seasonal promos, ad variants â with [AI UGC](/glossary/ai-ugc) so the feed does not go silent on a fully-booked week. Below: the format list, the consent workflow, the local-reach tactics, and a production afternoon you can repeat monthly. 3318 3319## What kind of salon content actually gets people to book? 3320 3321Every post that turns a scroller into a booking does one of three jobs. Most salon feeds do the first over and over and skip the other two. 3322 3323**Prove the result.** The transformation, the reveal, the finished set. This stops the scroll, but on its own it tends to build admiration rather than appointments. 3324 3325**Prove the process.** Sectioning, foiling, lash mapping, the fade guard change, the order of steps in a facial. Process content answers the silent question "will this person know what they are doing with *my* hair?" It also gives you something to post when no client wants their face online. 3326 3327**Remove friction.** Price ranges, appointment length, what a consultation involves, parking, whether you take card, how far out you are booked. The least glamorous content, and often the most booking-driven, because it removes reasons to hesitate. A healthy week has all three: results alone tend to collect followers, while process and friction-removal tend to collect appointments. 3328 3329## Which service showcase formats are worth shooting? 3330 3331Nine formats that work, with the actual shot spec â not just the idea. 3332 3333- **Transformation reveal.** Chair spin, static camera at chest height, same spot each time. Eight to twelve seconds. Caption names the service and the price band. 3334- **Colour formula close-up.** Bowl and brush, overhead, natural window light. Say the *type* of formula (root shadow, gloss, lived-in blonde), not the recipe if it is your signature. 3335- **Blow-dry finish.** Side angle, hands and hair only, single continuous shot. Works when the client agreed to be filmed but not identified. 3336- **Nail set 360.** Hand rotating slowly on a plain surface, macro. Show the cuticle line â that is what nail clients judge. 3337- **Lash mapping macro.** Tweezers, isolation, tape lines visible. Process content that photographs beautifully and shows skill. 3338- **Barber fade time-lapse.** Fixed camera behind the chair, compressed to fifteen or twenty seconds. Guard numbers on screen as text. 3339- **Stylist intro POV.** The stylist speaks to camera for about fifteen seconds: name, specialism, who they are best for. One of the most directly bookable posts a salon can make. 3340- **Booking process explainer.** Screen recording of your booking page with a voiceover: pick the service, pick the stylist, deposit, done. 3341- **Retail product in use.** Product in hand in the salon, then a clean product-only frame for the shop page. The one you can generate rather than shoot. 3342 3343### Give every format a repeatable frame 3344 3345Pick one wall, one chair, one window position, and shoot every transformation there. Consistent framing is what makes a grid look like a brand rather than a camera roll, and the same logic applies to generated assets: one avatar, one prompt skeleton, one setting is what makes a run of posts read as a campaign. Put the service name on screen immediately â viewers often decide whether to keep watching well before the reveal arrives. 3346 3347## How do you handle before/after content without a consent problem? 3348 3349Before/after tends to be the strongest-performing salon format and the one carrying the most exposure. Three rules keep it clean. 3350 3351**Match the conditions.** Same spot, same distance, same lens, same light, no filter, no retouching on the "after". Shoot the before under warm downlights and the after under a window and you have made a lighting comparison, not a service comparison â the kind of mismatch ad reviewers tend to treat as misleading. 3352 3353**Get the release in writing, before you shoot.** A verbal "sure, post it" is not a [model release](/glossary/model-release). A usable one names the person, states that their likeness may be used in organic social *and
3353* paid advertising if that is your intent, and states the duration and the territory. Keep it with the photo file, not in a drawer. 3354 3355**Separate face consent from crop consent.** Many clients who refuse to show their face are happy with a back-of-head, hands-only, or shoulders-down crop. Ask the narrower question and you will get far more yeses. 3356 3357### When the client says no 3358 3359Do not negotiate. Shoot the process instead â the foiling, the sectioning, the product â or generate a demonstration asset with a consented AI avatar or a licensed catalogue creator, where [likeness licensing](/glossary/likeness-licensing), consent and creator royalties are handled at the source. Never present a generated image as a specific client's real result: generated visuals can illustrate a service or a product, but they are not evidence of an individual outcome. 3360 3361Beauty and cosmetic-adjacent messaging deserves extra care. Platforms generally restrict before/after imagery and promises about results, especially where skin, body or wellbeing are involved, and the rules differ by market and change over time. Avoid wording that reads as a treatment, health or efficacy claim, and check each platform's current policy before running a before/after as a paid ad. 3362 3363## How do salons get local reach instead of random views? 3364 3365Reach from the wrong city is a vanity metric. The local signals you actually control: 3366 3367- **Say the place out loud.** Neighbourhood name in the caption and in the spoken audio, not just a geotag. Systems that surface content read text; so do humans scanning captions. 3368- **Name the stylist in every post.** People book a person, not a salon. A stylist with a recognisable face and a stated specialism gets requested by name. 3369- **Collaborate sideways, not up.** The coffee place two doors down, the florist, the gym around the corner. Co-posted content reaches an audience already physically nearby, which is worth more to a diary than a large but geographically random following. 3370- **Reply to local comments quickly.** Comment threads are where "how much for that?" turns into a DM, and a DM turns into a booking. 3371- **Keep your profile link pointing at the booking page**, not a link tree with a dozen options. 3372 3373If you run paid, keep the radius tight and the creative specific to it: an ad that names your street competes with almost nothing. 3374 3375## How do you produce a month of salon content in one afternoon? 3376 33771. **List the services you want more of.** Not the whole menu â the three or four with the best margin or the biggest gap in the diary. 33782. **Assign one format per service.** Balayage gets the transformation reveal, lashes get the mapping macro, the retail range gets the product shot. 33793. **Block one ninety-minute shooting window** on a quieter day, with one client per service who has already signed a release. 33804. **Shoot vertical, sound on, static camera.** One take per format, then a safety take. Do not direct â let the work be the content. 33815. **Generate the non-client assets.** Upload the retail products, pick an AI avatar or a licensed catalogue creator, and run a [batch](/glossary/batch-generation): four variants come back, typically in under a minute, so you choose between angles or moods rather than one guess. 33826. **Cut everything in one sitting.** Roughly eight to fifteen seconds for reveals, fifteen to thirty for talking POV, service named on screen at the top of the clip. 33837. **Write captions from a template**: service name, who it suits, price from, how to book, neighbourhood. 33848. **Schedule across four weeks in a fixed rhythm** â two results, one process, one friction-removal per week â and keep one slot open for whatever happens in the room that day. 3385 3386The generated half is what stops the feed collapsing in a busy month, when nobody has time to film. 3387 3388## Should you film in the salon or generate the asset? 3389 3390| Situation | Film in the salon | Generate with HeroShots | 3391| --- | --- | --- | 3392| Signature transformation on a real client | Yes â proof must be real | No | 3393| Process and technique close-ups | Yes â cheap and fast | Only as illustration, labelled as such | 3394| Retail product shots for the shop page | Optional | Yes â consistent lighting, no styling day | 3395| Seasonal or promo creative | Slow to organise | Yes â swap the concept, keep the look | 3396| Many ad variants of one message | Impractical | Yes â batches give you variants to test | 3397| Client declines to appear | Not possible | Yes, with consented avatars or licensed creators | 3398| Fully-booked week, empty content queue | Not possible | Yes | 3399 3400If you are weighing a full styled shoot against generated assets for the retail and promo half of your calendar, the [AI UGC vs product photoshoot comparison](/compare/ai-ugc-vs-product-photoshoot) shows where each earns its cost. 3401 3402## What does it cost to produce the generated half? 3403 3404Per output, no retainer. Images are billed per batch of four variants: **the first batch of a project is â¬4.90, each further batch in the same project â¬1.90**. An edit on a chosen image is **â¬0.39**, or **â¬0.23 with HeroShots Pro**. Video is **â¬15 up to 15 seconds** and **â¬35 up to 30 seconds**, with extra retries at **â¬5 per 15-second block**. Using a real catalogue model adds a **creator likeness fee of +25% on the base price** (floor â¬0.90 on images and â¬5 on videos); AI avatars add no fee. A custom AI avatar setup is **â¬100 one-time**, bringing your own model **â¬300 one-time**. HeroShots Pro is **â¬99/month** for no watermark, direct downloads, â15% on videos, cheaper edits and a priority queue. The **free plan gives 10 watermarked images per month and 1 video preview, no credit card**, which is enough to test whether generated retail shots match your salon's look. All prices exclude VAT; full details are on the [pricing page](/pricing). 3405 3406## What mistakes quietly kill salon content? 3407 3408Posting results with no service name. Filming vertically but editing horizontally. Filters on before/after. Music so loud the scissors disappear. A bio link that leads to a link tree instead of the booking page. Six posts a week for a fortnight and then nothing for a month â an inconsistent feed reads as an inconsistent business. And the most expensive one: never asking the happy client, in the chair, at the moment they love their hair, whether you can film it and where you may use it.`,faqs:[{q:"Do I need a model release for client transformations?",a:"Yes. Always get written consent before posting a client's face, and get it before the shoot rather than after. A usable model release names the person, states that their likeness may appear in organic social and, if relevant, in paid advertising, and states the duration and territory. Store it with the image file. When consent is unclear or refused, shoot a hands-only or back-of-head crop, post process content instead, or use a consented AI avatar or licensed catalogue creator to illustrate the service â without presenting a generated image as a specific client's real result."},{q:"Can I run before/after content as a paid ad?",a:"Sometimes, but check the current policy of each platform first. Platforms generally restrict before/after imagery and promises about results in advertising, particularly for anything that touches skin, body or wellbeing, and the rules differ by market and change over time. If in doubt, keep before/after as organic content, avoid wording that reads as a treatment or efficacy claim, and run process, stylist introduction or offer-led creative as your paid ads."},{q:"How often should a salon post?",a:"A consistent rhythm you can sustain beats a burst followed by silence. A workable weekly pattern is t
3408wo results posts, one process post, and one friction-removal post (price, timing, or booking explainer), with one slot kept open for whatever happens in the room that day. Consistency matters more than volume: an irregular feed reads as an irregular business."},{q:"What do I post if none of my clients want to be filmed?",a:"Process and product. Sectioning, foiling, colour mixing, lash mapping, fade guard changes, blow-dry finishing, retail products in use, tool flat-lays, and stylist-to-camera introductions all work without a single identifiable client. Many clients who decline a face shot will happily agree to a hands-only or shoulders-down crop, so ask the narrower question before you give up on the shot."},{q:"Should I put prices in salon social posts?",a:"Yes, at least as a 'from' price or a range. Price transparency removes a common reason people hesitate before sending a DM, and it filters out enquiries that were never going to convert. It also saves your team from answering the same question over and over in the inbox."},{q:"How do I get local reach instead of random views?",a:"Put local signals in the content itself, not only in the geotag: say the neighbourhood in the caption and in the spoken audio, name the stylist in every post, and co-post with nearby businesses whose customers are already physically close to you. Reply to local comments quickly, and point your profile link at the booking page rather than a link tree. If you run paid, keep the radius tight and make the creative specific to that radius."},{q:"How much does it cost to produce salon content with HeroShots?",a:"Images are billed per batch of four variants: the first batch of a project is â¬4.90 and each further batch in the same project is â¬1.90. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Using a real catalogue model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. HeroShots Pro is â¬99/month. All prices exclude VAT."},{q:"Can I test it before paying anything?",a:"Yes. The free plan includes 10 watermarked images per month and 1 video preview, with no credit card required. That is enough to check whether generated retail and promo visuals match your salon's lighting and look before you commit to a paid plan or a custom avatar."},{q:"Can I use the same look across a whole campaign?",a:"Yes. Generating with the same AI avatar and a stable prompt structure keeps the same face, styling, and setting across a series, which is what makes a set of posts read as one campaign rather than unrelated images. A custom AI avatar setup is â¬100 one-time if you want a face that belongs only to your salon; bring-your-own-model setup is â¬300 one-time."},{q:"How long should a salon video be?",a:"Match the length to the job. Reveals and transformations work at roughly 8 to 15 seconds â long enough to land the change, short enough to be rewatched. Talking pieces such as a stylist introduction or a booking explainer need 15 to 30 seconds. Put the service name on screen within the first second either way, because viewers often decide whether to keep watching before the reveal arrives."}],metaTitle:"Salon Social Content Ideas That Book Clients"},it:{title:"Contenuti social per saloni e beauty: idee pronte all'uso",description:"10 idee pronte da girare che gli stylist booked stanno usando questo mese â trasformazioni, close-up tecnica, POV dietro la sedia.",body:`Il social per saloni che porta prenotazioni gira su **trasformazioni, close-up tecnica e POV dietro la sedia**. I saloni che postano 4à a settimana in questi formati prenotano sensibilmente più clienti nuovi da Instagram e TikTok. 3409 3410## 10 idee pronte da girare 3411 3412- Trasformazione prima/dopo (con consenso). 3413- Close-up formula colore. 3414- Brush-out reveal. 3415- Post trasparenza prezzi. 3416- Intro stylist POV. 3417- Testimonial cliente (15s). 3418- Flat-lay tool/prodotto. 3419- Spotlight servizio della settimana. 3420- Spiegazione del processo di booking. 3421- Vibe pan del salone.`,faqs:[{q:"Mi serve un model release per le trasformazioni clienti?",a:"Sì. Sempre consenso firmato prima di postare volti clienti. HeroShots può generare trasformazioni AI con Real Model quando il consenso cliente non è chiaro."}]},es:{title:"Contenido social para salones y beauty: ideas listas para usar",description:"10 ideas listas para grabar que los estilistas booked usan este mes â transformaciones, close-ups de técnica, POV detrás del sillón.",body:`El social de salón que genera reservas se mueve en **transformaciones, close-ups de técnica y POV detrás del sillón**. Los salones que publican 4à por semana en estos formatos reservan bastantes más clientes nuevos desde Instagram y TikTok. 3422 3423## 10 ideas listas 3424 3425- Transformación antes/después (con consentimiento). 3426- Close-up fórmula color. 3427- Brush-out reveal. 3428- Post de transparencia de precios. 3429- Intro stylist POV. 3430- Testimonio cliente (15s). 3431- Flat-lay tools/producto. 3432- Spotlight servicio de la semana. 3433- Explainer del proceso de booking. 3434- Vibe pan del salón.`,faqs:[{q:"¿Necesito model release para transformaciones de cliente?",a:"SÃ. Siempre consentimiento firmado antes de publicar caras de cliente. HeroShots puede generar transformaciones AI con Real Models cuando el consentimiento no está claro."}]},de:{title:"Social-Content für Salons und Beauty: Sofort umsetzbare Ideen",description:"10 sofort drehbare Ideen, die ausgebuchte Stylisten diesen Monat einsetzen â Transformationen, Technik-Close-Ups, Behind-the-Chair-POV.",body:`Salon-Social, das Buchungen bringt, lebt von **Transformationen, Technik-Close-Ups und Behind-the-Chair-POV**. Salons mit 4 Posts pro Woche in diesen Formaten buchen spürbar mehr Neukunden via Instagram und TikTok. 3435 3436## 10 sofortige Ideen 3437 3438- Before/After-Transformation (mit Einwilligung). 3439- Color-Formula-Close-Up. 3440- Brush-Out-Reveal. 3441- Preis-Transparenz-Post. 3442- Stylist-Intro-POV. 3443- Kunden-Testimonial (15s). 3444- Tool-/Produkt-Flat-Lay. 3445- Service-Spotlight der Woche. 3446- Booking-Prozess-Explainer. 3447- Salon-Vibe-Pan.`,faqs:[{q:"Brauche ich ein Model-Release für Kunden-Transformationen?",a:"Ja. Vor Veröffentlichung von Kundengesichtern immer schriftliche Einwilligung. HeroShots kann AI-Real-Model-Transformationen liefern, wenn Consent unklar ist."}]}
3447,fr:{title:"Contenu social pour salons et beauty : idées prêtes à l'emploi",description:"10 idées prêtes à tourner que les stylistes booked utilisent ce mois â transformations, close-ups de technique, POV derrière le fauteuil.",body:`Le social de salon qui amène des réservations tourne sur **transformations, close-ups de technique et POV derrière le fauteuil**. Les salons qui publient 4à par semaine dans ces formats réservent nettement plus de nouveaux clients via Instagram et TikTok. 3448 3449## 10 idées prêtes 3450 3451- Transformation avant/après (avec consentement). 3452- Close-up formule couleur. 3453- Brush-out reveal. 3454- Post transparence prix. 3455- Intro styliste POV. 3456- Témoignage client (15s). 3457- Flat-lay tools/produit. 3458- Spotlight service de la semaine. 3459- Explainer du processus de booking. 3460- Vibe pan du salon.`,faqs:[{q:"Ai-je besoin d'un model release pour les transformations clientes ?",a:"Oui. Toujours un consentement signé avant de publier des visages clients. HeroShots peut générer des transformations AI avec Real Models si le consentement n'est pas clair."}]}}},{slug:"aesthetic-clinic-content-regulated-claims",date:"2026-06-23",updated:"2026-07-27",author:"HeroShots",tags:["vertical","clinic","compliance"],translations:{en:{title:"How Aesthetic Clinics Can Create Content While Respecting Regulated Claims",description:"A practical content framework for aesthetic clinics: what you can show, what triggers ad rejections, how before/after really works, and compliant AI UGC.",body:`Aesthetic clinics can run a strong content engine without ever making a regulated claim â but only if the hook moves off the *result* and onto everything surrounding it: the consultation, the practitioner, the device, the downtime, the aftercare. Three rulebooks overlap here â advertising-platform policy, health and medical-device advertising law, and professional-body codes â and they broadly converge on one principle: you may describe what a treatment is and how it is performed, but you may not promise an outcome, imply a guaranteed transformation, or address someone by a health attribute you have inferred. Content built inside that boundary is cheaper to produce, tends to clear ad review more reliably, and often converts better anyway, because it answers the questions people actually have before they book. Below: what tends to trigger rejections, what you can show instead, how before/after really works, where AI UGC fits, and a monthly production plan. 3461 3462## Why do aesthetic clinic ads keep getting rejected? 3463 3464Because the category sits at the intersection of health, personal appearance, and prescription-only products â three things ad platforms police hardest. Policies change, so check the current version in your ad account's policy centre before each campaign; the recurring themes are stable enough to design around. 3465 3466Platforms generally restrict advertising that implies knowledge of a person's health condition or body, imagery that presents an "ideal" body or singles out a perceived flaw, and side-by-side result imagery for cosmetic and weight-related treatments. Health and medicines law in many markets separately restricts promoting prescription-only products to the public â which is why naming an injectable brand in a caption is usually a bigger risk than describing "a consultation about injectable treatments". Professional codes add a third layer, often the strictest of all on testimonials and on discount-driven urgency. 3467 3468The triggers clinics run into repeatedly tend to be: before/after grids in paid placements, second-person copy that names an insecurity ("hate your jawline?"), numeric outcome claims, superlatives like *best*, *permanent* or *guaranteed*, language implying diagnosis or cure, prescription product names, price-led offers on regulated procedures, and countdown pressure. Appealing a rejection generally costs more time than avoiding it, and repeated rejections may affect account standing â so build the guardrail into the brief, not the appeal. 3469 3470## What can a clinic show, and what can't it? 3471 3472| Element | Generally workable | Usually a problem | Safer alternative | 3473| --- | --- | --- | --- | 3474| Results | Process, technique, what the appointment feels like | Before/after pairs in paid social; outcome promises | "Here's what the treatment does and who it isn't for" | 3475| Patients | Consenting staff, hands-only shots, anonymised angles | Recognisable patient faces without documented consent | Practitioner-led or educator-led delivery | 3476| Copy | Descriptive, factual, conditional ("results vary") | Superlatives, guarantees, numbers, cure language | Question-led headlines that set expectations | 3477| Products | Retail skincare and aftercare lines | Prescription-only product names in public ads |
3477Category language: "injectable consultation" | 3478| Testimonials | Service experience (booking, staff, comfort) | Clinical outcome testimonials | Reviews about care quality, not results | 3479| Targeting | Broad interest and location targeting | Audiences built around an inferred condition | Let creative do the qualifying, not the targeting | 3480| Offers | Consultation availability, package clarity | Countdown discounts on regulated procedures | Transparent pricing pages linked from the ad | 3481 3482The pattern: the further your creative sits from *proving a result*, the more freedom you have â and the wider the range of formats you can produce at volume. 3483 3484## Can aesthetic clinics use before-and-after photos at all? 3485 3486Sometimes â it depends on your jurisdiction, your professional body, and the channel. Some regulators restrict or prohibit before/after imagery for certain procedures; others permit it under conditions. Platforms are frequently stricter than the law, so material that is lawful on your own website may still be disallowed in a paid ad. Verify current rules with your professional body and in the platform's policy centre before publishing. 3487 3488### If you do use it, the standard is clinical, not editorial 3489 3490Standardised photography: same camera and lens, same distance and angle, same lighting, same background, neutral expression, no makeup, no filters, no retouching, no flattering posture change. Keep the raw files. Document informed consent that specifically covers marketing use, name the channels it covers, and record how the patient can withdraw it â a signed [model release](/glossary/model-release) for marketing is not the same document as clinical treatment consent. Add plain disclaimers that results vary, and note the time elapsed between images. 3491 3492### Split your channels 3493 3494A defensible pattern: documented case galleries on your own site, behind a deliberate click, with disclaimers and consent on file â and no result imagery leading paid social. Ads earn the click; the website does the proving. 3495 3496## What content formats work when results can't be the hook? 3497 3498This is where most clinics under-produce. The formats below carry no regulated claim and are useful to a prospective patient. 3499 3500### The consultation walkthrough 3501 3502Shoot the appointment, not the outcome: reception, the intake conversation, the assessment, the moment the practitioner explains what they would *not* recommend. That last beat builds more trust than any result image. 3503 3504### The device and technique explainer 3505 3506Macro shots of the handpiece, the tray setup, the cooling unit, the settings screen. A short clip explaining what the device does, in plain language, with no promise attached. 3507 3508### The honest downtime video 3509 3510Redness, swelling, what day three looks like, what you can't do afterwards, when to call the clinic. Prospective patients frequently search for exactly this, and few clinics publish it well. 3511 3512### Practitioner credentials and philosophy 3513 3514Name, qualification, years practising, what they refuse to do and why. Faces of the actual clinical team, filmed properly, are among the highest-value assets a clinic owns. 3515 3516### Myth-busting FAQ 3517 3518Short, direct answers to the questions your team fields in consultation week after week. These double as the FAQ schema on your treatment pages. 3519 3520### Facility and hygiene 3521 3522Sterilisation protocol, single-use packaging opened on camera, equipment certification. Quiet, unglamorous, disproportionately reassuring. 3523 3524## How does AI UGC fit into a regulated clinic's content mix? 3525 3526Carefully, and with one absolute line: never use generative tools to fabricate a patient, a result, or a testimonial. A synthesised before/after is a fabricated claim regardless of the technology behind it, and the fastest way to turn an advertising problem into a legal one. 3527 3528Where [AI UGC](/glossary/ai-ugc) earns its place is the non-clinical layer, usually the larger part of a clinic's content calendar: the retail skincare and aftercare shelf, gift cards and seasonal campaigns, treatment-explainer visuals, and a recurring on-camera educator persona that delivers factual explainers without ever claiming an outcome. An [AI avatar](/glossary/ai-avatar) used as a labelled brand presenter gives you a consistent face across months of educational content without repeatedly booking a shoot â and because it isn't presented as a patient, it makes no implicit result claim. 3529
3530Two hygiene rules. First, disclosure: transparency expectations for synthetic media are tightening and platforms increasingly expect AI-generated people to be labelled, so check current requirements and label them anyway, in-caption and on-screen. Second, consent: a real person's face must sit on a proper [likeness licensing](/glossary/likeness-licensing) agreement with defined channels and duration. HeroShots handles consent, likeness licensing and creator royalties as part of the product rather than as paperwork you assemble yourself â which matters where a documented chain of permission is what saves you in a complaint. 3531 3532## How do you produce a month of compliant clinic content? 3533 35341. **Write a claim register.** One page listing phrases the clinic will never publish (guarantees, superlatives, prescription brand names, condition-targeting language) and approved alternatives. Everyone writing copy works from it. 35352. **Pick four education topics** from the questions your front desk answers most often. Not four treatments â four *questions*. 35363. **Book one half-day filming block** for practitioner-led pieces. Hands, devices, room, team. No patients unless consent paperwork is already signed and filed. 35374. **Generate the non-clinical visuals** â retail products, aftercare kits, campaign imagery â from product photos and a written prompt, in batches of four variants so you can pick per placement. 35385. **Cut vertical and square versions** of every video at the point of export, not later. 35396. **Run a two-person claim review.** One clinical, one marketing. Both sign off in writing before anything is scheduled. 35407. **Log every asset**: file, source, prompt or shoot date, consent record, reviewer, approval date. This log is what you send if a regulator or platform asks. 35418. **Publish organic first**, then promote only the pieces that hold up under the claim register. 35429. **Re-review quarterly.** Policies move; assets that cleared review a year ago may not clear it now. 3543 3544## What does compliant clinic content cost to produce? 3545 3546The clinical-team footage needs a real camera and real time â budget for it once a quarter. The surrounding volume is where AI production changes the arithmetic. On [HeroShots pricing](/pricing), images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project, with an edit on a chosen image at â¬0.39 (â¬0.23 with HeroShots Pro). Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Pre-paid video packages run Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). Using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. A custom AI avatar setup is â¬100 one-time, bring-your-own-model setup â¬300 one-time. HeroShots Pro is â¬99/month and removes the watermark, adds direct downloads, â15% on videos, cheaper edits and a priority queue. The free plan gives 10 watermarked images a month and one video preview with no card. All prices exclude VAT. 3547 3548Weighing this against a studio day, the comparison worth reading is [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot): the shoot still wins for the clinical team and the room, while the retail and campaign layer is where per-batch generation removes the bottleneck. 3549 3550## How do you stop compliance from becoming the bottleneck? 3551 3552Make the guardrail upstream and cheap. A claim register plus a two-person sign-off costs minutes per asset; a rejected campaign or a professional-body complaint costs weeks. Keep the asset log religiously, keep raw before/after files, keep consent documents retrievable by patient name and date, and treat any content that survives a policy change as a template for the next quarter. The clinics that publish the most in this category are not the ones taking the most risk â they are the ones who decided early which part of their calendar makes no regulated claim at all, and then produced that part at volume.`,faqs:[{q:"Can ae
3552sthetic clinics show before-and-after photos in advertising?",a:"It depends on jurisdiction, professional body, and channel. Some regulators restrict or prohibit before/after imagery for certain procedures, and ad platforms are frequently stricter than the law â material that is lawful on your own website may still be disallowed in a paid ad. Where it is permitted, the standard is clinical: identical camera, distance, angle, lighting and background, no filters or retouching, raw files retained, disclaimers that results vary, and documented informed consent that specifically covers marketing use and names the channels."},{q:"Why do aesthetic clinic ads get rejected on social platforms?",a:"Common triggers include before/after imagery in paid placements, copy that names a perceived flaw in the second person, numeric outcome claims, superlatives like best, permanent or guaranteed, language implying diagnosis or cure, prescription-only product names, price-led offers on regulated procedures, and countdown urgency. Platforms also generally restrict targeting that implies knowledge of a person's health condition. Policies change, so check your ad account's current policy centre before each campaign."},{q:"What content can an aesthetic clinic publish without making a regulated claim?",a:"Consultation walkthroughs, device and technique explainers, honest downtime and aftercare videos, practitioner credentials and treatment philosophy, myth-busting FAQ answers, and facility hygiene and sterilisation content. None of these depend on showing a result, all of them answer questions prospective patients genuinely research, and they can be produced at far higher volume than result-led creative."},{q:"Can you use AI-generated content for a medical aesthetic clinic?",a:"Yes, for the non-clinical layer â retail skincare and aftercare products, gift cards, seasonal campaigns, treatment-explainer visuals, and a labelled on-camera educator persona. The absolute line is that you must never generate a patient, a result, or a testimonial. A synthesised before/after is a fabricated claim regardless of the technology behind it."},{q:"Do you have to disclose AI-generated people in clinic marketing?",a:"Label them. Transparency expectations for synthetic media are tightening and advertising platforms increasingly expect AI-generated people to be disclosed, so check the current requirements for your markets and channels. Practically: state it in the caption and on-screen, and record which assets are AI-generated in your content log. In a regulated category, disclosing more than the minimum is the safer default."},{q:"Can patient testimonials be used in aesthetic clinic advertising?",a:"Professional codes in many markets are strict about testimonials that describe clinical outcomes, and some restrict them outright. A safer pattern is to collect and publish reviews about the service experience â booking, communication, staff, comfort, aftercare follow-up â rather than about the result achieved. Check your local professional body's guidance before publishing any testimonial tied to a procedure."},{q:"What does a claim register do and who should write it?",a:"A claim register is a one-page document listing the phrases your clinic will never publish â guarantees, superlatives, prescription brand names, condition-targeting language â alongside approved alternatives. It is written jointly by a clinical lead and the marketing owner, and everyone producing copy works from it. It turns compliance from a per-asset debate into a lookup."},{q:"How much does it cost to produce clinic content with HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project, with an edit on a chosen image at â¬0.39 (â¬0.23 with HeroShots Pro). Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Pre-paid video packages are Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). Prices exclude VAT."},{q:"Is there a fee for using a real model rather than an AI avatar?",a:"Yes. Using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee. A custom AI avatar setup is â¬100 one-time and bring-your-own-model setup is â¬300 one-time."},{q:"Can a clinic test HeroShots before committing budget?",a:"Yes. The free plan includes 10 watermarked images per month and one video preview with no credit card required. HeroShots Pro at â¬99/month removes the watermark and adds direct downloads, â15% on videos, cheaper edits and a priority queue."}],metaTitle:"Aesthetic Clinic Content and Ad Rules"},it:{title:"Come le cliniche estetiche possono fare contenuti rispettando i claim regolamentati",description:"Le cliniche estetiche affrontano le policy ads più severe nel 2026. Un framework di contenuto che ottiene reach senza violazioni Meta/TikTok o EU MDR.",body:`Le
3552cliniche estetiche affrontano le **policy contenuto più severe su Meta e TikTok** â più le regole EU MDR. Il framework sicuro: mostra **processo, ambiente, credenziali professionali** â mai prima/dopo espliciti senza disclaimer e substantiation. 3553 3554## Pilastri sicuri 3555 3556- **Walkthrough consulto** (senza volto paziente). 3557- **Ambiente clinico e attrezzatura** (pulizia, certificazioni). 3558- **Intro practitioner** (credenziali, filosofia). 3559- **Myth-busting in stile FAQ**. 3560 3561## Cosa evitare 3562 3563Prima/dopo diretti senza evidenza medica, claim proibiti EU MDR, promesse di outcome irrealistiche.`,faqs:[{q:"Posso mostrare prima/dopo?",a:"Sì, con substantiation: fotografia clinica in luce identica, disclaimer, consenso informato reale, dentro MDR e regole pubblicitarie locali."}]},es:{title:"Cómo las clÃnicas estéticas pueden crear contenido respetando claims regulados",description:"Las clÃnicas estéticas afrontan las policies ads más estrictas en 2026. Un framework de contenido que logra alcance sin violar Meta/TikTok o EU MDR.",body:`Las clÃnicas estéticas afrontan las **policies de contenido más estrictas en Meta y TikTok** â más las reglas EU MDR. Framework seguro: muestra **proceso, ambiente, credenciales profesionales** â nunca antes/después explÃcitos sin disclaimers ni substantiation. 3564 3565## Pilares seguros 3566 3567- **Walkthrough de consulta** (sin cara de paciente). 3568- **Ambiente clÃnico y equipo** (limpieza, certificaciones). 3569- **Intro practitioner** (credenciales, filosofÃa). 3570- **Myth-busting tipo FAQ**. 3571 3572## Qué evitar 3573 3574Antes/después directos sin evidencia médica, claims prohibidos por EU MDR, promesas de resultado irrealistas.`,faqs:[{q:"¿Puedo mostrar antes/después?",a:"SÃ, con substantiation: fotografÃa clÃnica con luz idéntica, disclaimers, consentimiento informado real, dentro de MDR y reglas publicitarias locales."}]},de:{title:"Wie ästhetische Kliniken Content schaffen â und regulierte Claims respektieren",description:"Ãsthetische Kliniken stehen 2026 vor den strengsten Ad-Policies. Ein Content-Framework, das Reichweite bringt ohne Meta/TikTok- oder EU-MDR-Verletzung.",body:`Ãsthetische Kliniken stehen vor den **strengsten Content-Policies auf Meta und TikTok** â plus EU-MDR. Sicheres Framework: zeige **Prozess, Ambiente, professionelle Credentials** â nie explizite Before/After ohne On-Screen-Disclaimer und Belege. 3575 3576## Sichere Säulen 3577 3578- **Beratungs-Walkthrough** (kein Patientengesicht). 3579- **Klinik-Ambiente und Equipment** (Sauberkeit, Zertifikate). 3580- **Practitioner-Intros** (Credentials, Philosophie). 3581- **Myth-Busting im FAQ-Stil**. 3582 3583## Vermeiden 3584 3585Direkte Before/After ohne medizinische Evidenz, EU-MDR-verbotene Claims, unrealistische Outcome-Versprechen.`,faqs:[{q:"Darf ich Before/After überhaupt zeigen?",a:"Ja, mit Belegen: klinische Fotografie in identischem Licht, Disclaimer, echte Einwilligung, innerhalb MDR und lokaler Werberegeln."}]},fr:{title:"Comment les cliniques esthétiques créent du contenu en respectant les claims réglementés",description:"Les cliniques esthétiques affrontent les policies ads les plus strictes en 2026. Un framework de contenu qui obtient de la portée sans violer Meta/TikTok ou EU MDR.",body:`Les cliniques esthétiques affrontent les **policies de contenu les plus strictes sur Meta et TikTok** â plus les règles EU MDR. Framework sûr : montre **processus, ambiance, credentials professionnels** â jamais d'avant/après explicites sans disclaimers ni substantiation. 3586 3587## Piliers sûrs 3588 3589- **Walkthrough consultation** (sans visage patient). 3590- **Ambiance clinique et équipement** (propreté, certifications). 3591- **Intro praticien** (credentials, philosophie). 3592- **Myth-busting style FAQ**. 3593 3594## à éviter 3595 3596Avant/après directs sans preuve médicale, claims interdits EU MDR, promesses de résultat irréalistes.`,faqs:[{q:"Puis-je montrer avant/après ?",a:"Oui, avec substantiation : photographie clinique en lumière identique, disclaimers, consentement éclairé réel, dans MDR et règles publicitaires locales."}]}}},{slug:"fashion-accessories-ugc-lookbook",date:"2026-06-24",updated:"2026-07-27",author:"HeroShots",tags:["vertical","fashion","accessories"],translations:{en:{title:"UGC for Fashion and Accessories: How to Build an AI Lookbook",description:"AI lookbooks for fashion and accessories: how to plan the drop grid, brief styling and model variety, and which fabric shots still need a camera.",body:`Treat an AI lookbook as a variety engine rather than a replacement for your camera. Generate the permutations â the same jacket on different body types, in five settings, at three times of day, cropped for feed and for PDP â and keep real photography for the handful of shots where the fabric *is* the product: sheer, sequin, deep pile, complex drape, and any colour a shopper will c
3596ompare closely against the swatch. A practical split for a seasonal drop is one short reference shoot plus a large library of generated variants, produced in runs of four images at a time. Below is the shot list, the drop grid, the workflow, the diversity brief, and the honest limits. 3597 3598## What is an AI lookbook, and how is it different from a campaign shoot? 3599 3600A lookbook is a structured set of *looks* â not a pile of product photos. Each look answers one question for the shopper: what does this piece go with, on a body like mine, in a place I actually go? A campaign shoot answers that question a handful of times and stops, because every extra answer costs another hour of studio, stylist and model time. 3601 3602An AI lookbook answers it as many times as you need. You feed the system a product reference (flat lay, ghost mannequin, or an on-model frame), a creator or [AI avatar](/glossary/ai-avatar), and a prompt describing setting, styling and framing. Each run returns four variants, typically in under a minute, so you iterate on the *brief* rather than on the calendar. 3603 3604The distinction worth holding onto: a lookbook is editorial and brand-voice, while [AI UGC](/glossary/ai-ugc) is first-person and casual â phone-height framing, imperfect light, someone talking to camera. Both come out of the same asset base, so shoot your references once and decide per channel which register the output should sit in. 3605 3606## How big should a seasonal drop grid be? 3607 3608Size the grid by *placement*, not by ambition. Every asset should have a slot waiting for it before it is generated, otherwise you are paying to fill a folder. 3609 3610A workable starting grid for a drop of six to eight hero pieces: 3611 3612- **Five model archetypes** mapped to your real customer segments â not five faces, five *builds and ages*. 3613- **Five settings**: street, café or interior, gallery or studio-white, coastal or park, evening. 3614- **Three styling pairings** per hero piece, each a genuine merchandising bet (workwear, off-duty, occasion). 3615- **Two short clips** per hero look: one walk, one detail â cuff, closure, hem. 3616- **Three crops** per keeper: 4:5 for feed, 9:16 for Stories and Reels, 1:1 or 3:4 for PDP and email. 3617 3618That grid produces a few hundred stills before crops, which sounds excessive until you map it against real slots: PDP secondary images, category tiles, paid social variants, email hero, retargeting, size-guide context, and a seasonal refresh six weeks later. Variety here is working inventory rather than vanity â it is what keeps a drop in market once the first round of creative starts to tire. 3619 3620## Which fashion shots can AI generate, and which still need a camera? 3621 3622This is the question that decides whether the approach works for your catalogue. The split runs along two lines: how the material behaves under light, and how much commercial risk sits behind the image. 3623 3624| Shot or material | Generate it | Shoot it for real | Why | 3625| --- | --- | --- | --- | 3626| Denim, leather, heavy knit, canvas | Yes | Reference only | Structured fabrics hold their form and render convincingly | 3627| Sheer, chiffon, organza, mesh | Reference-led only | Yes | Layered transparency and light transmission are hard to fake | 3628| Sequins, metallics, iridescents | Reference-led only | Yes | Specular highlights shift per angle; errors read instantly as fake | 3629| Bags, belts, sunglasses in scene | Yes | Hero macro | Scale and context generate well; stitching needs macro | 3630| Fine jewellery and watches | Contextual shots | Yes | Facets, engraving and dial detail are colour-critical | 3631| Colour-critical PDP hero | No | Yes | Colour accuracy drives the buying decision; the hero must be a true capture | 3632| Fit on real bodies, size guide | No | Yes | How a garment sits on a specific measurement is a factual claim | 3633| Setting, season, weather, time of day | Yes | No | Pure context â the cheapest, highest-yield thing to generate | 3634 3635### Why fit and fabric are the hardest things to fake 3636 3637Fit is not a look, it is a promise. When a shopper reads a lookbook image as evidence that a given size sits a certain way at the waist, that image is doing the job of a spec sheet. Generated imagery is good at *implying* fit and unreliable at *documenting* it, so put real capture behind anything a customer could reasonably dispute: size guides, "model wears size X, height Y", and any garment with a difficult returns history. 3638 3639Fabric is the same argument in miniature. Structured materials survive generation because their behaviour is predictable. Anything that transmits, refracts or piles â organza, sequin, velvet, bouclé, shearling â should be photographed once under controlled light and used as a reference, so the model has real texture to work from rather than an idea of one. 3640
3641## How do I produce a drop lookbook step by step? 3642 36431. **Shoot the reference block first.** Half a day, neutral light, a colour chart in frame. Per hero piece: one flat, one ghost mannequin, two or three on-model angles, plus a macro of hardware or trim. 36442. **Load the product assets.** Upload the references directly, or pull listing imagery in with Amazon URL import when the piece is already live. 36453. **Cast the grid.** Mix AI avatars with real catalogue models. AI avatars add no likeness fee; a real catalogue model adds a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. 36464. **Write one prompt template per setting.** Fix the framing, lens language, light and mood; leave only garment, model and time of day as variable slots. One template, many fills. 36475. **Pilot on your hardest garment.** Run a single batch on the trickiest fabric in the drop, not the easiest. Four variants tell you whether the reference is strong enough to carry the rest. 36486. **Edit rather than reroll.** When a frame is nearly right, an edit on the chosen image is â¬0.39 (â¬0.23 with HeroShots Pro) and preserves everything you already liked. 36497. **Scale inside one project.** The first batch of a project is â¬4.90 and every further batch in the same project is â¬1.90, so keep a drop in a single project rather than scattering it. 36508. **Add motion only on hero looks.** A clip up to 15 seconds is â¬15; up to 30 seconds is â¬35. Two clips per hero piece is usually enough â a walk and a detail. 36519. **QA against the reference.** Check colour versus your chart, hardware count, logo placement, hands, seams and hemlines. Reject anything ambiguous rather than editing around it. 365210. **Log rights and file names as you export.** Model or avatar ID, licence scope, drop code, crop. Future-you, re-running the drop, will need all of it. 3653 3654## How do I brief model diversity so it reads as real? 3655 3656Cast by body architecture, not by demographic label. A brief that says "add diversity" produces five different faces on one silhouette. A brief that specifies height bands, size range, shoulder-to-hip ratio and age range produces a set a customer can actually locate themselves in. 3657 3658Two rules make the difference. First, **hold styling constant across the diversity set** â same garment, same setting, same light â so the viewer compares fit rather than vibe. Second, **keep each identity stable across the whole drop**, which is the point of [avatar consistency](/glossary/avatar-consistency): the same recognisable person walking through five settings reads as a lookbook, while a drifting face reads as a glitch. 3659 3660If you are using real catalogue talent, the diversity you show is licensed diversity â scope, territory and duration live in the [likeness licensing](/glossary/likeness-licensing) terms, and royalties flow to the creator on each use. That is a feature rather than friction: you can bring the same cast back next season without negotiating from zero. 3661 3662## How do I keep hundreds of images looking like one collection? 3663 3664Lock a small number of variables and never touch them mid-drop: 3665 3666- **One lighting recipe per setting.** Write it into the template and reuse the exact wording. 3667- **A background palette of four or five tones**, chosen against the collection's colourway. 3668- **A fixed framing language** â full length, three-quarter, waist-up, detail â with the same lens character throughout. 3669- **Consistent crop ratios**, exported in the same order every time. 3670- **Reference reuse**, not fresh prompts, when you extend the drop later in the season. 3671 3672Coherence comes from repeating the invariants; variety comes from a handful of deliberate slots. Swap everything at once and you end up with several hundred images that belong to no season in particular. 3673 3674## What does an AI lookbook cost per drop? 3675 3676Images are billed per batch of four variants: the first batch of a project is â¬4.90 and each further batch in the same project is â¬1.90. So a project with twenty batches â eighty variants â comes to â¬4.90 + 19 à â¬1.90 before VAT with AI avatars, which carry no likeness fee. Edits on a chosen image are â¬0.39, or â¬0.23 with HeroShots Pro. 3677 3678Video is priced by length: â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. If motion is central to your drops, pre-paid packages bring the per-video rate down â Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). 3679 3680Using a real catalogue model adds a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos.
3680Custom AI avatar setup is â¬100 one-time; bringing your own model is â¬300 one-time. HeroShots Pro is â¬99/month and removes the watermark, enables direct downloads, takes 15% off videos, makes edits cheaper and adds a priority queue. Full detail sits on [pricing](/pricing); to weigh this against a studio day, [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot) lays the two workflows side by side. All prices exclude VAT. 3681 3682To size the workload first, the free plan gives 10 watermarked images a month and one video preview, with no credit card. 3683 3684## What do I need to get right on rights, disclosure and brand safety? 3685 3686Three things. 3687 3688**Consent and licensing.** Every real creator's likeness needs documented consent and a licence whose scope covers your actual usage â paid social is not the same permission as out-of-home. HeroShots handles consent, likeness licensing and creator royalties inside the product, but the scope decision is yours. 3689 3690**Disclosure.** Platforms generally expect synthetic or AI-altered media to be labelled in some form, and requirements differ by platform and by market and change over time. Check the current policy for each channel before a drop ships rather than after. 3691 3692**Substantiation.** Keep generated imagery away from factual claims â sizing, material composition, sustainability, provenance. Those belong to real capture and real copy. Everything else is styling, and styling is exactly where generation earns its place.`,faqs:[{q:"Can AI render fabric drape realistically?",a:"Structured fabrics â denim, leather, heavy knits, canvas â tend to render convincingly, because their behaviour under light is predictable. Sheer, sequined, iridescent and hyper-textured fabrics still benefit from a real reference shoot, since layered transparency and angle-dependent highlights are where generated imagery most often gives itself away. The practical rule: photograph the difficult material once under controlled light, then use that capture as the reference for every generated variant."},{q:"Do I still need a photoshoot for a seasonal drop?",a:"Yes, but a much shorter one. A workable pattern is a half-day reference block per drop: one flat, one ghost mannequin and two or three on-model angles per hero piece, plus macros of hardware and trim, all under neutral light with a colour chart in frame. Everything after that â settings, seasons, styling pairings, model variety, crops â can be generated from those references."},{q:"How many images does a fashion drop lookbook actually need?",a:"Size it by placement, not ambition. A workable grid for six to eight hero pieces is five model archetypes, five settings, three styling pairings per piece and three crops per keeper, which lands in the low hundreds of stills. Every asset should have a slot waiting â PDP secondary, category tile, paid social variant, email hero, retargeting â before it is generated."},{q:"How much does an AI lookbook cost on HeroShots?",a:"Images are billed per batch of four variants: the first batch of a project is â¬4.90 and each further batch in the same project is â¬1.90. Twenty batches (eighty variants) in one project comes to â¬4.90 + 19 à â¬1.90 before VAT with AI avatars. Edits on a chosen image are â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds. Prices exclude VAT."},{q:"Can I use real models instead of AI avatars?",a:"Yes. Real catalogue models carry a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no likeness fee. Custom AI avatar setup is â¬100 one-time, and bringing your own model is â¬300 one-time. Consent, likeness licensing and creator royalties are handled inside the product."},{q:"How do I keep the same model across an entire lookbook?",a:"That is avatar consistency: anchoring an identity to fixed references so the same face, hair and proportions appear across every setting and every clip in the drop. Combine it with a locked framing language, one lighting recipe per setting and a small background palette, and a few hundred images will read as one collection rather than a series of unrelated shoots."},{q:"Can I generate video for a lookbook, not just stills?",a:"Yes. The most useful pattern is t
3692wo short clips per hero look â one walk to show movement and one detail on a cuff, closure or hem. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Pre-paid packages lower the per-video rate: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). All prices exclude VAT."},{q:"Do I have to disclose that lookbook images are AI-generated?",a:"Platforms generally expect synthetic or AI-altered media to be labelled in some form, and the specific requirements vary by platform and by market and change over time. Check the current policy for each channel before a drop ships rather than afterwards. Keep generated imagery away from factual claims such as sizing, material composition or provenance â those belong to real capture and real copy."},{q:"Does this work for accessories like jewellery and bags?",a:"Partly. Contextual and in-scene shots of bags, belts and eyewear generate well, because scale and setting are exactly what generation is good at. Fine jewellery, watches, stitching and hardware detail still want real macro photography â facets, engraving and dial detail are both colour-critical and detail-critical, and errors there are immediately visible to a buyer."},{q:"Can I try this before paying?",a:"Yes. The free plan includes 10 watermarked images per month and one video preview, with no credit card required. That is enough to run a pilot batch on the hardest garment in your drop and see whether your references are strong enough before committing to a full grid."}],metaTitle:"Fashion UGC and AI Lookbooks"},it:{title:"UGC per fashion e accessori: lookbook e demo prodotto con l'AI",description:"I brand fashion che pubblicano lookbook AI su 8+ model e 5 ambientazioni vedono un ROAS più alto. La ricetta produttiva.",body:`I brand fashion che pubblicano **lookbook AI con 8+ Real Model e 5 ambientazioni per drop** vedono **un ROAS più alto** sul paid social rispetto alle campagne single-shoot. Lo sblocco è la varietà senza giorni di shooting aggiuntivi. 3693 3694## Ricetta produttiva per drop 3695 3696- **5 archetipi model** coerenti con i segmenti ICP. 3697- **5 ambientazioni** (street, caffè, galleria, mare, evening). 3698- **3 abbinamenti outfit** per model. 3699- **2 clip video** (walk + detail) per look. 3700 3701Output totale per drop: ~150 asset in meno di un giorno.`,faqs:[{q:"L'AI rende realistico il drappeggio dei tessuti?",a:"I modelli 2026 gestiscono molto bene tessuti strutturati (denim, pelle, knit). Trasparenze, paillettes e tessuti iper-texturati beneficiano ancora di una reference reale per il fine-tuning."}]},es:{title:"UGC para fashion y accesorios: lookbooks y demos de producto con AI",description:"Las marcas fashion que publican lookbooks AI con 8+ models y 5 settings ven un ROAS más alto. La receta productiva.",body:`Las marcas fashion que publican **lookbooks AI con 8+ Real Models y 5 settings por drop** ven **un ROAS más alto** en paid social que las campañas single-shoot. El desbloqueo es la variedad sin dÃas de rodaje adicionales. 3702 3703## Receta de drop 3704 3705- **5 arquetipos de model** que matchean segmentos ICP. 3706- **5 settings** (street, café, galerÃa, playa, evening). 3707- **3 outfit pairings** por model. 3708- **2 clips video** (walk + detail) por look. 3709 3710Output total por drop: ~150 assets en menos de un dÃa.`,faqs:[{q:"¿AI renderiza drapeado de tela realista?",a:"Los modelos 2026 manejan muy bien tejidos estructurados (denim, cuero, knit). Tejidos transparentes, lentejuelas o hipertexturados aún se benefician de una reference real para fine-tuning."}]},de:{title:"UGC für Fashion und Accessoires: AI-Lookbooks und Produkt-Demos",description:"Fashion-Marken mit AI-Lookbooks über 8+ Models und 5 Settings sehen einen höheren ROAS. Das Produktions-Rezept.",body:`Fashion-Marken, die **AI-Lookbooks mit 8+ Real Models und 5 Settings pro Drop** ausliefern, sehen **einen höheren ROAS** auf Paid Social als Single-Shoot-Kampagnen. Der Hebel: Vielfalt ohne zusätzliche Drehtage. 3711 3712## Drop-Rezept 3713 3714- **5 Model-Archetypen**, passend zu ICP-Segmenten. 3715- **5 Settings** (Street, Café, Galerie, Strand, Evening). 3716- **3 Outfit-Pairings** pro Model. 3717- **2 Video-Clips** (Walk + Detail) pro Look.
3718 3719Gesamt-Output pro Drop: ~150 Assets in unter einem Tag.`,faqs:[{q:"Rendert AI Stoff-Drapierung realistisch?",a:"2026-Modelle bewältigen strukturierte Stoffe (Denim, Leder, Strick) sehr gut. Transparente, Paillette- oder hyper-texturierte Stoffe profitieren weiter von einem realen Referenz-Shoot."}]},fr:{title:"UGC pour fashion et accessoires : lookbooks AI et démos produit",description:"Les marques fashion qui publient des lookbooks AI avec 8+ models et 5 settings voient un meilleur ROAS. La recette de production.",body:`Les marques fashion qui livrent **des lookbooks AI avec 8+ Real Models et 5 settings par drop** voient **un meilleur ROAS** sur paid social que les campagnes single-shoot. Le déblocage : la variété sans jours de tournage supplémentaires. 3720 3721## Recette de drop 3722 3723- **5 archétypes model** alignés aux segments ICP. 3724- **5 settings** (street, café, galerie, plage, evening). 3725- **3 outfit pairings** par model. 3726- **2 clips vidéo** (walk + detail) par look. 3727 3728Output total par drop : ~150 assets en moins d'un jour.`,faqs:[{q:"L'AI rend-elle le drapé des tissus de façon réaliste ?",a:"Les modèles 2026 gèrent très bien les tissus structurés (denim, cuir, maille). Les tissus transparents, à paillettes ou hyper-texturés bénéficient encore d'une réf. réelle pour le fine-tuning."}]}}},{slug:"food-cpg-unboxing-demo-videos",date:"2026-06-25",updated:"2026-07-27",author:"HeroShots",tags:["vertical","food","cpg"],translations:{en:{title:"Food and CPG UGC: Unboxing, Demo and Usage Videos That Sell",description:"Unboxing, prep demos and usage videos for food and CPG brands: shot lists, a packaging-accuracy workflow, appetite-appeal tips and real batch costs.",body:`Food and packaged-goods brands convert on three physical questions a product listing cannot answer: what arrives in the box, what the product looks like out of the package, and what it is like to actually use it. The content that sells answers all three â a packaging reveal, a preparation or usage demo, and an in-context moment â shot close, shot honestly, and refreshed often enough that the feed does not go stale. [AI UGC](/glossary/ai-ugc) makes that cadence affordable: you lock the packaging identity once, then vary scene, hands, creator and lighting instead of rebooking a food shoot every time a flavour, size or seasonal SKU lands. On HeroShots, images are billed per batch of four variants â â¬4.90 for the first batch in a project and â¬1.90 for each further batch in that project â and video is â¬15 for up to 15 seconds. Below: the shot list, the packaging-accuracy workflow, the details that make generated food look appetising rather than uncanny, and what a working set costs. 3729 3730## What makes food and CPG content different from other UGC? 3731 3732Two things. First, the package *is* the product for most of the purchase journey â a shopper recognises a carton long before they taste anything, so distorting the label, the pack shape or the colour is not a stylistic choice, it is a misrepresentation. Second, food is judged almost instantly on cues that are entirely physical: gloss, crumb, steam, viscosity, the way a sauce falls off a spoon. Apparel can survive a slightly odd render. A pasta sauce cannot. 3733 3734That pushes food and CPG creative toward tight framing and short runtimes: wide lifestyle shots with a distant pack rarely do the selling work, macro tends to. It also means the quality bar for [AI product photography](/glossary/ai-product-photography) sits on the label, not the scene â an implausible kitchen is forgivable, a mangled ingredient panel is not. 3735 3736### The four jobs your content has to do 3737 3738- **Recognition** â the pack in the ad is the pack that arrives. 3739- **Comprehension** â how much is in it, how it is portioned, how it is prepared. 3740- **Desire** â texture, colour, sound cues, the moment of consumption. 3741- **Reassurance** â the pack survives shipping, the seal is intact, the format matches the description. 3742 3743Comprehension is the usual casualty: a beautiful macro shot with no sense of portion size leaves the shopper guessing, and guessing is where carts get abandoned. 3744 3745## Which video formats actually sell packaged food? 3746 3747Three formats on rotation cover almost every food and CPG catalogue, plus a cutaway type that feeds all of them. Keep them short and keep them separate â one clip that tries to unbox, prepare and eat usually does none of the three well. 3748 3749| Format | Typical length | What it must show | Best placement | 3750| --- | --- | --- | --- | 3751| Packaging reveal / unboxing | 6â10s | Outer box, seal, pack front, size in hand | First-touch ads, PDP hero | 3752| Preparation or usage demo | 10â20s | Portioning, pour, cook, mix, dose | PDP gallery, retention email | 3753| In-context moment | 8â15s | Table, desk, gym bag, picnic, fridge shelf | Retargeting, organic social | 3754| Macro texture cutaway | 3â5s | Crumb, gloss, drip, snap, steam | Hook footage, B-roll, ad testing | 3755 3756The cutaway earns its row because it is the cheapest thing to produce and the most reusable: one short pour or snap can front several edits without anyone noticing the repetition. Every runtime above fits a single 15-second video block at â¬15. 3757 3758## How do I shoot an unboxing that shows the real package? 3759 3760An unboxing works when the viewer feels the reveal happen in the right order â outer shipper, then inner pack, then product. Cutting straight to the hero pack throws away the reassurance function. 3761 3762A shot list that holds up: 3763 3764- Hands entering frame with the sealed shipper, on a surface a customer would recognise (kitchen counter, hallway floor). 3765- The seal or tape being broken, as one continuous beat, no cut. 3766- Pack lifted out, front label held toward camera long enough to read. 3767- Pack rotated to a side or back panel. Nutrition, dosage and provenance live here, and it is the shot most brands skip. 3768- A scale reference â the pack beside a hand or a mug. 3769- Opening the pack itself: peel, twist, pop. Sound matters even for silent autoplay, because the visual rhythm still reads. 3770 3771Two failure modes recur: a pack that floats without weight â hands that do not deform a carton, a bag that never crinkles â and a reveal with no friction. Real packaging resists slightly, and content that ignores that resistance reads as a render no matter how clean the lighting is. 3772 3773## How do I keep packaging accurate in AI-generated content? 3774 3775This is the part that decides whether the whole programme is usable. Treat pack fidelity as a controlled input, not something to patch afterwards. 3776 37771. **Photograph the real pack first** â front, back, both sides, top and a three-quarter angle, on a plain background in even light. These become the reference assets for everything downstream. 37782. **Import what already exists.** If the SKU is listed on Amazon, pull the existing imagery in via URL import instead of re-shooting it. 37793. **Generate in project-scoped batches**, one project per SKU, so every variant stays tied to the same reference set. [Batch generation](/glossary/batch-generation) returns four variants at a time, typically in under a minute. 37804. **Review the label at full size**, never in a thumbnail grid. Check the brand mark, the claim line, the net weight, the barcode area and any certification logos. 37815. **Reject rather than repair** anything with garbled text on the front panel. Secondary panels can stay out of focus or out of frame. 37826. **Fix near-misses with an edit** on the chosen image rather than regenerating the whole batch â an edit is â¬0.39, or â¬0.23 on HeroShots Pro. 37837. **Approve the stills before you commission video.** The cheapest place to catch a pack error is before you have paid for a video. 37848. **Keep your own approved-frames folder per SKU** so the next flavour starts from a known-good baseline, not a blank prompt. 3785 3786The rule of thumb: if a legal or regulatory element has to be legible, it should come from a real photograph or stay deliberately out of frame. Never let a generated panel imply a claim your actual pack does not make. 3787 3788### Where a real reference shot still earns its keep 3789 3790Dry, ambient and shelf-stable goods render well. The harder categories are defined by phase change and motion â melting ice cream, rising steam, frying, carbonation, cheese pull, condensation on a chilled glass. There, one real reference photograph beats a long run of blind prompt attempts: it gives the generated set something physically correct to imitate. 3791 3792## What actually creates appetite appeal on camera? 3793 3794Appetite appeal is mostly light and specular detail, and it tends to come down to a handful of choices: 3795 3796- **Directional light, not flat light.** Side or three-quarter backlight creates the highlight on a sauce or glaze that the eye reads as fresh. 3797- **One dominant texture per frame.** Crumb *or* gloss *or* drip. Stacking all three looks synthetic. 3798- **Movement in the food, not only in the camera.** A pour, a lift, a break, a stir. Static hero food is a packaging shot, not an appetite shot. 3799- **Temperature cues.** Condensation for cold, gentle motion for hot. Go light on steam unless you have a reference frame. 3800- **Human proximity.** A hand, a fork, a lip. Proximity tends to outperform an empty styled table. 3801- **Plausible imperfection.** A crumb on the board, a drip on the rim. Immaculate food reads as CGI. 3802 3803If a real person eats or prepares on camera, that runs through [likeness licensing](/glossary/likeness-licensing) with consent and creator royalties handled in-platform. An AI avatar is the alternative when you only need hands, presence and a plausible kitchen â and it adds no likeness fee. 3804 3805## What does a food UGC batch actually cost? 3806 3807Images are billed per batch of four variants: â¬4.90 for the first batch in a project, then â¬1.90 for each further batch in the same project. A working set of six batches â twenty-four variants of a single SKU â is â¬4.90 plus five batches at â¬1.90. Edits on a chosen image are â¬0.39, or â¬0.23 with Pro. 3808 3809Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. Using a real catalog model adds 25% to the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. If video is the main channel, pre-paid packages lower the per-video price: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). HeroShots Pro is â¬99/month and removes the watermark, enables direct downloads, takes 15% off videos, lowers edit prices and adds priority queue. Setting up a custom AI avatar is â¬100 one-time; bringing your own model is â¬300 one-time. The free plan gives 10 watermarked images a month and one video preview with no card â enough to check whether your pack renders cleanly. Full detail is on the [pricing page](/pricing), and the trade-offs against booking a studio sit in [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). All prices exclude VAT. 3810 3811## What claims should food and CPG brands avoid? 3812 3813Food is a heavily policed advertising category. Health, nutrition, weight and supplement claims are restricted in many markets, platforms generally layer their own requirements on top, and those requirements change â check current platform policy and your local regulator before a script is
3813written, rather than assuming a competitor's ad is permitted. Practical guardrails: 3814 3815- Show the product and let the pack's own approved claim line do the claiming. 3816- Avoid implying a health outcome through visual shorthand: before/after bodies, clinical settings, medical props. 3817- Do not depict a preparation the pack does not actually support. 3818- Disclose AI-generated creative wherever the platform or local rules require it. 3819- If a creator appears, keep testimonial language to experience rather than efficacy. 3820 3821None of this replaces review by whoever signs off your labelling. 3822 3823## How do I run this across a whole catalogue? 3824 3825Build once per SKU, then reuse. For each product: one project, one reference pack set, roughly six image batches covering unboxing, prep, in-context and macro, one 15-second demo and one short cutaway. That is the SKU's baseline library. 3826 3827From there the refresh is cheap â swap the scene, the creator, the surface and the season while the pack stays fixed, and every new batch after the first in that project is â¬1.90. Seasonal packs branch from the approved frames instead of starting over. Teams running large catalogues can drive the same workflow through the API, available on paid plans, using the official npm, PyPI or Packagist SDKs so generation runs from their own systems and returned assets get filed into whatever PIM or DAM they already use. The platform is available in five languages, so distributed teams can work in the interface that suits them. 3828 3829The discipline that matters is not the volume. It is keeping the pack honest in every frame while everything around it changes.`,faqs:[{q:"Can AI render real food convincingly?",a:"AI handles dry, packaged, ambient and shelf-stable food well, along with most packaging materials. The harder cases involve phase change and motion â melting, steam, frying, carbonation, cheese pull and condensation â where a real reference photograph of the product tends to improve realism across the whole generated set."},{q:"How do I stop AI from garbling my packaging label?",a:"Photograph the real pack from front, back, both sides, top and a three-quarter angle on a plain background, and use those as reference assets for every generation. Review chosen frames at full size rather than as thumbnails, reject anything with distorted front-panel text instead of trying to repair it, and keep legally required text either photographed for real or deliberately out of frame."},{q:"How long should an unboxing video be for food and CPG?",a:"Six to ten seconds is usually enough for a packaging reveal if the order is right: outer shipper, seal broken, pack lifted out, front label held long enough to read, then a rotation to a side or back panel. Preparation and usage demos need more room, usually ten to twenty seconds, because they have to show portioning or dosing clearly."},{q:"What does a set of food UGC images cost on HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project. Six batches â twenty-four variants of one SKU â is the first batch plus five more at â¬1.90. Edits on a chosen image are â¬0.39, or â¬0.23 with HeroShots Pro. All prices exclude VAT."},{q:"How much does a food demo video cost?",a:"A video up to 15 seconds is â¬15 and a video up to 30 seconds is â¬35, with extra retries at â¬5 per 15-second block. Pre-paid packages lower the per-video price: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). HeroShots Pro at â¬99/month takes a further 15% off videos. Prices exclude VAT."},{q:"Do I pay extra to use a real creator instead of an AI avatar?",a:"Yes. Using a real catalog model adds 25% to the base price, with a floor of â¬0.90 on images and â¬5 on videos, and that fee covers consent, likeness licensing and creator royalties handled in-platform. AI avatars add no likeness fee. Setting up a custom AI avatar is a one-time â¬100, and bringing your own model is a one-time â¬300."},{q:"Can I use my existing Amazon product images as a starting point?",a:"Yes. HeroShots supports importing product imagery from an Amazon URL, which is usually faster than re-shooting a SKU you have already photographed for a marketplace listing. Those images then act as the reference set for generating unboxing, demo and in-context variants of the same pack."},{q:"What health or nutrition claims can I make in food ad creative?",a:"Health, nutrition, weight and supplement claims are restricted in many markets, and advertising platforms generally apply their own requirements on top, which change over time. The safe approach is to show the product and let the pack's own approved claim line do the claiming, avoid visual shorthand that implies a health outcome, and check current platform policy and your local regulator before scripting. This is not legal advice."},{q:"How do I test the platform before spending anything?",a:"The free plan includes 10 watermarked images per month and one video preview with no credit card required. That is generally enough to check whether your specific packaging renders cleanly â label legibility, pack shape, colour accuracy â before committing to a paid batch or a video."},{q:"Can I generate food UGC programmatically for a large catalogue?",a:"Yes. API access is available on paid plans, with official npm, PyPI and Packagist SDKs, so generation can be driven from your own systems and the returned assets filed into your PIM or DAM. That makes it practical to keep one project per SKU, reuse an approved reference set, and refresh scenes on a
3829schedule across a whole catalogue."}],metaTitle:"Food & CPG Unboxing and Demo Videos"},it:{title:"Contenuti per food e packaged goods: unboxing e demo che vendono",description:"Il food CPG converte su first bite, pour e reveal del packaging. Il piano contenuti AI a 3 formati che alza la conversione sul D2C.",body:`Il food e i packaged goods convertono quando il contenuto mostra **first bite, pour o reveal del packaging in macro**. I brand che fanno ruotare questi 3 formati vedono **un conversion lift** su product page D2C e ad Meta nel 2026. 3830 3831## La rotazione a 3 formati 3832 3833- **Unboxing macro** (8s) â reveal lento, packaging. 3834- **Pour / first bite** (5s) â texture, colore, suono (se audio on). 3835- **Uso in contesto** (10s) â cucina, picnic, snack table. 3836 3837Con HeroShots tieni bloccata l'identità del packaging mentre vari scena, model e luce.`,faqs:[{q:"L'AI può rendere food reale in modo convincente?",a:"L'AI gestisce molto bene food secco, packaged e ambient. Vapore, colatura e ghiaccio beneficiano ancora di un reference shot reale per spingere il realismo."}]},es:{title:"Contenido para food y packaged goods: unboxings y demos que venden",description:"El food CPG convierte en first bite, pour y reveal del packaging. Plan de contenido AI a 3 formatos que sube la conversión en D2C.",body:`El food y los packaged goods convierten cuando el contenido muestra **first bite, pour o reveal del packaging en macro**. Las marcas que rotan estos 3 formatos ven **un conversion lift** en product pages D2C y ads Meta en 2026. 3838 3839## Rotación 3 formatos 3840 3841- **Unboxing macro** (8s) â reveal lento, packaging. 3842- **Pour / first bite** (5s) â textura, color, sonido (con audio on). 3843- **Uso en contexto** (10s) â cocina, picnic, snack table. 3844 3845Con HeroShots bloqueas la identidad del packaging mientras varÃas escena, model y luz.`,faqs:[{q:"¿AI puede renderizar food real convincentemente?",a:"AI maneja muy bien food seco, packaged y ambient. Vapor, derretido y hielo aún se benefician de un reference shot real para empujar el realismo."}]},de:{title:"Content für Food und Packaged Goods: Unboxings und Demos, die verkaufen",description:"Food-CPG konvertiert über First Bite, Pour und Packaging-Reveal. Der 3-Format-AI-Content-Plan, der die D2C-Conversion hebt.",body:`Food und Packaged Goods konvertieren, wenn Content **First Bite, Pour oder Packaging-Reveal in Makro** zeigt. Marken mit dieser 3-Format-Rotation sehen **einen Conversion-Lift** auf D2C-Produktseiten und Meta-Ads in 2026. 3846 3847## Die 3-Format-Rotation 3848 3849- **Unboxing-Makro** (8s) â Slow Reveal, Packaging. 3850- **Pour / First Bite** (5s) â Textur, Farbe, Sound (bei Audio on). 3851- **In-Context-Nutzung** (10s) â Küche, Picknick, Snack-Table. 3852 3853Mit HeroShots bleibt die Packaging-Identität fix, während Szene, Model und Licht variieren.`,faqs:[{q:"Rendert AI echtes Essen überzeugend?",a:"AI bewältigt trockenes, verpacktes und Ambient-Food sehr gut. Dampf, Schmelze und Eis profitieren weiterhin von einem realen Referenz-Shot."}]},fr:{title:"Contenu pour food et packaged goods : unboxings et démos qui vendent",description:"Le food CPG convertit sur first bite, pour et reveal du packaging. Le plan contenu AI à 3 formats qui hausse la conversion en D2C.",body:`Le food et les packaged goods convertissent quand le contenu montre **first bite, pour ou reveal du packaging en macro**. Les marques qui font tourner ces 3 formats voient **un conversion lift** sur les product pages D2C et ads Meta en 2026. 3854 3855## Rotation 3 formats 3856 3857- **Unboxing macro** (8s) â reveal lent, packaging. 3858- **Pour / first bite** (5s) â texture, couleur, son (si audio on). 3859- **Usage en contexte** (10s) â cuisine, pique-nique, snack table. 3860 3861Avec HeroShots tu verrouilles l'identité du packaging tout en faisant varier scène, model et lumière.`,faqs:[{q:"L'AI peut-elle rendre du vrai food de façon convaincante ?",a:"L'AI gère très bien le food sec, packaged et ambient. Vapeur, fonte et glace bénéficient encore d'un reference shot réel pour pousser le réalisme."}]}}}],ja=(e,t,a,n)=>({slug:e,date:a,author:"HeroShots",tags:t,translations:n}),aP=[ja("creative-testing-volume-beats-perfection",["performance","creative-testing","ads"],"2026-06-26",{en:{title:"Creative Testing: Why Variant Volume Beats Single-Asset Perfection",metaTitle:"Creative Testing: Why Volume Beats Perfection",description:"Brands testing 20+ creative variants per week scale faster than those polishing one hero. Here's why volume wins in 2026.",body:`Brands that test **20+ creative variants per week** scale faster than brands polishing one hero asset, because winners are unpredictable and the only way to find them is to flood the auction with cheap, distinct attempts. 3862 3863## The logic 3864 3865- Only a small share of variants ever becomes a winner. 3866- More variants per week â far better odds of finding one. 3867- One hero per week â you can burn a whole month without a winner. 3868 3869AI UGC collapses the production cost per variant, making volume the dominant strategy.`,faqs:[{q:"Doesn't quality still matter?",a:"Yes â but qual
3869ity of the *winner*, not the average. Volume finds the winner; once found, polish it for scale spend."}]},it:{title:"Creative testing: perché il volume di varianti batte la perfezione del singolo asset",description:"I brand che testano 20+ varianti a settimana scalano più velocemente di chi rifinisce un solo hero. Perché il volume vince nel 2026.",body:`I brand che testano **20+ varianti a settimana** scalano più velocemente di chi rifinisce un singolo hero, perché i vincitori sono imprevedibili e l'unico modo di trovarli è inondare l'asta di tentativi distinti ed economici. 3870 3871## La logica 3872 3873- Solo una piccola parte delle varianti diventa un vincitore. 3874- Più varianti a settimana â molte più probabilità di trovarne uno. 3875- 1 hero a settimana â puoi bruciare un mese intero senza vincitori. 3876 3877L'AI UGC abbatte il costo di produzione per variante, rendendo il volume la strategia dominante.`,faqs:[{q:"La qualità non conta più?",a:"Conta â ma quella del *vincitore*, non della media. Il volume trova il vincitore; trovato, lo rifinisci per la scala in spend."}]},es:{title:"Creative testing: por qué el volumen de variantes gana a la perfección del asset único",description:"Las marcas que testan 20+ variantes por semana escalan más rápido que las que pulen un único hero. Por qué el volumen gana en 2026.",body:`Las marcas que testan **20+ variantes por semana** escalan más rápido que las que pulen un único hero, porque los ganadores son impredecibles y la única forma de encontrarlos es inundar la subasta con intentos distintos y baratos. 3878 3879## La lógica 3880 3881- Solo una pequeña parte de las variantes llega a ganar. 3882- Más variantes por semana â muchas más probabilidades de encontrar una. 3883- 1 hero por semana â puedes quemar un mes entero sin ganadores. 3884 3885AI UGC reduce el coste de producción por variante, haciendo del volumen la estrategia dominante.`,faqs:[{q:"¿La calidad ya no importa?",a:"Importa â pero la del *ganador*, no la del promedio. El volumen lo encuentra; encontrado, lo pules para escalar spend."}]},de:{title:"Creative-Testing: Warum Variantenvolumen die Single-Asset-Perfektion schlägt",description:"Marken, die 20+ Varianten pro Woche testen, skalieren schneller als jene, die einen Hero polieren. Warum Volumen 2026 gewinnt.",body:`Marken, die **20+ Creative-Varianten pro Woche** testen, skalieren schneller als jene, die einen einzelnen Hero polieren â Gewinner sind unvorhersehbar und nur durch eine Flut günstiger, unterschiedlicher Versuche zu finden. 3886 3887## Die Logik 3888 3889- Nur ein kleiner Teil der Varianten wird je zum Gewinner. 3890- Mehr Varianten pro Woche â deutlich bessere Chancen, einen zu finden. 3891- 1 Hero pro Woche â ein ganzer Monat kann ohne Gewinner vergehen. 3892 3893AI-UGC senkt die Produktionskosten pro Variante deutlich â Volumen wird zur dominanten Strategie.`,faqs:[{q:"Zählt Qualität nicht mehr?",a:"Doch â aber die des *Gewinners*, nicht des Durchschnitts. Volumen findet den Gewinner; gefunden, poliere ihn für Skalierung."}]},fr:{title:"Creative testing : pourquoi le volume de variantes bat la perfection du single asset",description:"Les marques qui testent 20+ variantes par semaine scalent plus vite que celles qui peaufinent un hero. Pourquoi le volume gagne en 2026.",body:`Les marques qui testent **20+ variantes par semaine** scalent plus vite que celles qui peaufinent un seul hero â les gagnants sont imprévisibles, et la seule façon de les trouver est de noyer l'enchère de tentatives distinctes et bon marché. 3894 3895## La logique 3896 3897- Seule une petite part des variantes devient gagnante. 3898- Plus de variantes par semaine â bien plus de chances d'en trouver une. 3899- 1 hero par semaine â tu peux brûler un mois entier sans gagnant. 3900 3901L'AI UGC réduit fortement le coût de production par variante, ce qui fait du volume la stratégie dominante.`,faqs:[{q:"La qualité ne compte plus ?",a:"Si â mais celle du *gagnant*, pas de la moyenne. Le volume trouve le gagnant ; trouvé, tu le peaufines pour scaler."}]}}),ja("reduce-cac-continuous-ugc-creative",["performance","cac","ads"],"2026-06-27",{en:{title:"How to Reduce CAC With a Continuous Flow of UGC Creative",metaTitle:"How to Reduce CAC With Continuous UGC Creative",description:"Brands shipping fresh UGC weekly cut CAC by killing creative fatigue. Here's the production cadence and budget split.",body:`Brands that ship **fresh UGC creative every week** cut CAC because creative fatigue is the #1 silent c
3901ost driver on paid social. Frequencies above 3.0 tend to drag CTR down sharply in the same audience. 3902 3903## The cadence 3904 3905- **5â8 new variants weekly** per active campaign. 3906- **Refresh top performer monthly** with format/scene swap. 3907- **Kill anything past 14 days** as primary spend.`,faqs:[{q:"How do I know I'm in fatigue?",a:"Watch frequency and CTR together. When frequency >2.5 and CTR drops >20% week-over-week, refresh now."}]},it:{title:"Come ridurre il CAC con un flusso continuo di creatività UGC",description:"I brand che pubblicano UGC fresco ogni settimana tagliano il CAC eliminando la fatica creativa. Cadenza e budget split.",body:`I brand che pubblicano **UGC fresco ogni settimana** tagliano il CAC perché la fatica creativa è il primo driver di costo silenzioso sul paid social. Frequenze sopra 3.0 tendono a far scendere rapidamente il CTR sullo stesso pubblico. 3908 3909## La cadenza 3910 3911- **5â8 nuove varianti a settimana** per campagna attiva. 3912- **Rinfresca il top performer ogni mese** con swap di formato/scena. 3913- **Killa tutto oltre 14 giorni** come spend primario.`,faqs:[{q:"Come capisco di essere in fatica?",a:"Guarda frequency e CTR insieme. Quando frequency >2.5 e CTR cala >20% week-over-week, rinfresca subito."}]},es:{title:"Cómo reducir el CAC con un flujo continuo de creatividad UGC",description:"Las marcas que lanzan UGC fresco cada semana bajan el CAC eliminando la fatiga creativa. Cadencia y split de presupuesto.",body:`Las marcas que lanzan **UGC fresco cada semana** bajan el CAC porque la fatiga creativa es el primer driver de coste silencioso en paid social. Frecuencias sobre 3.0 tienden a hundir rápidamente el CTR en la misma audiencia. 3914 3915## La cadencia 3916 3917- **5â8 nuevas variantes semanales** por campaña activa. 3918- **Refresca el top performer cada mes** con swap de formato/escena. 3919- **Mata todo más de 14 dÃas** como spend primario.`,faqs:[{q:"¿Cómo sé que estoy en fatiga?",a:"Mira frecuencia y CTR juntos. Cuando frecuencia >2.5 y CTR cae >20% semana sobre semana, refresca ya."}]},de:{title:"Wie du CAC mit kontinuierlichem UGC-Creative-Flow senkst",description:"Marken mit wöchentlichem Fresh-UGC senken CAC, indem sie Creative-Fatigue töten. Kadenz und Budget-Split.",body:`Marken, die **wöchentlich frisches UGC-Creative** ausliefern, senken CAC â Creative-Fatigue ist der #1 stille Kostentreiber im Paid Social. Frequenzen >3.0 lassen CTR im selben Publikum tendenziell deutlich sinken. 3920 3921## Die Kadenz 3922 3923- **5â8 neue Varianten pro Woche** je aktiver Kampagne. 3924- **Top-Performer monatlich refreshen** mit Format-/Szenen-Swap. 3925- **Alles über 14 Tagen** als Primary-Spend killen.`,faqs:[{q:"Wie erkenne ich Fatigue?",a:"Frequenz und CTR zusammen beobachten. Frequenz >2.5 und CTR -20% Woche-zu-Woche: sofort refreshen."}]},fr:{title:"Comment réduire le CAC avec un flux continu de créativité UGC",description:"Les marques qui publient de l'UGC frais chaque semaine baissent le CAC en tuant la fatigue créative. Cadence et split budget.",body:`Les marques qui publient **de l'UGC frais chaque semaine** baissent le CAC â la fatigue créative est le 1er driver de coût silencieux en paid social. Des fréquences >3.0 ont tendance à faire nettement chuter le CTR sur la même audience. 3926 3927## La cadence 3928 3929- **5â8 nouvelles variantes par semaine** par campagne active. 3930- **Refresh du top performer chaque mois** avec swap format/scène. 3931- **Tue tout au-delà de 14 jours** en spend primaire.`,faqs:[{q:"Comment savoir que je suis en fatigue ?",a:"Surveille fréquence et CTR ensemble. Fréquence >2.5 et CTR -20% semaine sur semaine : refresh tout de suite."}]}}),ja("meta-tiktok-ads-best-ugc-formats",["performance","meta","tiktok"],"2026-06-28",{en:{title:"Meta Ads vs TikTok Ads: Which UGC Formats Work Best on Each",metaTitle:"Meta Ads vs TikTok Ads: Best UGC Formats",description:"Meta rewards problem-solution UGC with on-screen text. TikTok rewards POV and trend-native styles. The format split for 2026.",body:`Meta and TikTok reward **different UGC formats** in 2026: Meta favors **problem-solution** with on-screen captions and clear
3931CTA; TikTok favors **POV / trend-native** clips that hide the ad intent. 3932 3933## Meta winners 3934 3935- 4:5 problemâsolution (15â30s). 3936- Static carousel with creator quote overlay. 3937- Stories sequence (3â5 frames). 3938 3939## TikTok winners 3940 3941- 9:16 POV hook (8â15s). 3942- Talking-head reaction / commentary. 3943- Trend-native sound + 3-second twist.`,faqs:[{q:"Can I reuse the same creative?",a:"Same scene, different edit. Meta wants captions and CTA; TikTok wants native sound and an unscripted feel."}]},it:{title:"Meta Ads vs TikTok Ads: che tipo di UGC funziona meglio su ciascuna",description:"Meta premia l'UGC problem-solution con testo on-screen. TikTok premia POV e stili trend-nativi. Lo split di formato per il 2026.",body:`Meta e TikTok premiano **formati UGC diversi** nel 2026: Meta favorisce **problem-solution** con caption on-screen e CTA chiara; TikTok favorisce **POV / trend-native** che nascondono l'intento ad. 3944 3945## Meta winner 3946 3947- 4:5 problemaâsoluzione (15â30s). 3948- Carousel statica con overlay quote creator. 3949- Sequenza Stories (3â5 frame). 3950 3951## TikTok winner 3952 3953- 9:16 POV hook (8â15s). 3954- Talking-head reaction / commento. 3955- Sound nativo trend + twist nei 3 secondi.`,faqs:[{q:"Posso riusare lo stesso creative?",a:"Stessa scena, edit diverso. Meta vuole caption e CTA; TikTok vuole audio nativo e vibe non scriptata."}]},es:{title:"Meta Ads vs TikTok Ads: qué formatos UGC funcionan mejor en cada uno",description:"Meta premia el UGC problema-solución con texto en pantalla. TikTok premia POV y estilos trend-nativos. El split de formato para 2026.",body:`Meta y TikTok premian **formatos UGC distintos** en 2026: Meta favorece **problema-solución** con captions en pantalla y CTA clara; TikTok favorece **POV / trend-native** que esconden el intent ad. 3956 3957## Meta winners 3958 3959- 4:5 problemaâsolución (15â30s). 3960- Carrusel estático con overlay de quote creator. 3961- Secuencia Stories (3â5 frames). 3962 3963## TikTok winners 3964 3965- 9:16 POV hook (8â15s). 3966- Talking-head reaction / comentario. 3967- Sound nativo trend + twist en 3 segundos.`,faqs:[{q:"¿Puedo reusar el mismo creative?",a:"Misma escena, edit distinto. Meta quiere captions y CTA; TikTok quiere audio nativo y vibe sin script."}]},de:{title:"Meta-Ads vs TikTok-Ads: Welche UGC-Formate auf welcher Plattform am besten ziehen",description:"Meta belohnt Problem-Solution-UGC mit On-Screen-Text. TikTok belohnt POV und trend-native Styles. Der Format-Split für 2026.",body:`Meta und TikTok belohnen 2026 **unterschiedliche UGC-Formate**: Meta bevorzugt **Problem-Solution** mit On-Screen-Captions und klarem CTA; TikTok bevorzugt **POV / trend-native** Clips, die die Ad-Absicht verbergen. 3968 3969## Meta-Gewinner 3970 3971- 4:5 ProblemâLösung (15â30s). 3972- Statisches Carousel mit Creator-Quote-Overlay. 3973- Stories-Sequenz (3â5 Frames). 3974 3975## TikTok-Gewinner 3976 3977- 9:16 POV-Hook (8â15s). 3978- Talking-Head-Reaction / Commentary. 3979- Trend-Native-Sound + 3-Sekunden-Twist.`,faqs:[{q:"Kann ich dasselbe Creative wiederverwenden?",a:"Gleiche Szene, anderer Edit. Meta will Captions und CTA; TikTok will Native-Audio und unskriptierte Vibe."}]},fr:{title:"Meta Ads vs TikTok Ads : quels formats UGC fonctionnent le mieux sur chaque",description:"Meta récompense l'UGC problème-solution avec texte à l'écran. TikTok récompense POV et styles trend-natifs. Le split de format pour 2026.",body:`Meta et TikTok récompensent **des formats UGC différents** en 2026 : Meta favorise **problème-solution** avec captions et CTA clair ; TikTok favorise **POV / trend-natif** qui cachent l'intent ad. 3980 3981## Gagnants Meta 3982 3983- 4:5 problèmeâsolution (15â30s). 3984- Carousel statique avec overlay quote créateur. 3985- Séquence Stories (3â5 frames). 3986 3987## Gagnants TikTok 3988 3989- 9:16 POV hook (8â15s). 3990- Talking-head reaction / commentaire. 3991- Sound natif trend + twist en 3 secondes.`,faqs:[{q:"Puis-je réutiliser le même creative ?",a:"Même scène, edit différent. Meta veut captions et CTA ; TikTok veut audio natif et vibe non scripté."}]}}),ja("how-many-creatives-to-find-winning-ad",["performance","creative-testing","ads"],"2026-06-29",{en:{title:"How Many Creatives Do You Need to Find a Winning Ad? What Actually Matters",metaTitle:"How Many Creatives to Find a Winning Ad",description:"Finding one statistically significant winner on Meta or TikTok takes many distinct variants, not one polished hero. The full breakdown.",body:`Finding **one statistically significant winner** on Meta or TikTok in 2026 takes **many distinct creative variants**, not one or tw
3991o â and even more in saturated verticals (skincare, supplements). 3992 3993## What "distinct" means 3994 3995- New hook (not a re-edit). 3996- New visual model or scene. 3997- New angle on the same value prop. 3998 3999Producing that many variants used to be the blocker. On HeroShots the first generation of 4 image variants in a project costs â¬4.90, and each further batch in the same project â¬1.90 (prices exclude VAT).`,faqs:[{q:"What if I find a winner on variant 3?",a:"Lucky early hit. Still test 10â15 more â second-best winners often outperform the first in scale spend after fatigue sets in."}]},it:{title:"Quante creatività servono per trovare un winning ad? Quello che conta davvero",description:"Trovare un vincitore statisticamente significativo su Meta o TikTok richiede molte varianti distinte, non un solo hero rifinito. Il quadro completo.",body:`Trovare **un vincitore statisticamente significativo** su Meta o TikTok nel 2026 richiede **molte varianti creative distinte**, non una o due â e ancora di più nei verticali saturi (skincare, integratori). 4000 4001## Cosa significa "distinte" 4002 4003- Nuovo hook (non un re-edit). 4004- Nuovo model o scena. 4005- Nuovo angolo sulla stessa value prop. 4006 4007Produrre tutte queste varianti era il collo di bottiglia. Su HeroShots la prima generazione di 4 varianti immagine in un progetto costa â¬4,90 e ogni batch successivo nello stesso progetto â¬1,90 (prezzi IVA esclusa).`,faqs:[{q:"Se trovo il vincitore alla variante 3?",a:"Fortuna iniziale. Testane comunque altre 10â15 â i secondi vincitori spesso superano il primo nello scale spend, quando subentra la fatica."}]},es:{title:"¿Cuántas creatividades necesitas para encontrar un winning ad? Lo que de verdad importa",description:"Encontrar un ganador estadÃsticamente significativo en Meta o TikTok exige muchas variantes distintas, no un único hero pulido. El desglose completo.",body:`Encontrar **un ganador estadÃsticamente significativo** en Meta o TikTok en 2026 exige **muchas variantes creativas distintas**, no una o dos â y todavÃa más en verticales saturadas (skincare, suplementos). 4008 4009## Qué significa "distintas" 4010 4011- Nuevo hook (no un re-edit). 4012- Nuevo model o escena. 4013- Nuevo ángulo sobre la misma value prop. 4014 4015Producir tantas variantes era el cuello de botella. En HeroShots la primera generación de 4 variantes de imagen en un proyecto cuesta â¬4,90 y cada batch siguiente del mismo proyecto â¬1,90 (precios sin IVA).`,faqs:[{q:"¿Y si encuentro el ganador en la variante 3?",a:"Suerte inicial. Aun asà testea 10â15 más â los segundos ganadores suelen superar al primero en scale spend cuando llega la fatiga."}]},de:{title:"Wie viele Creatives braucht es für einen Winning-Ad? Worauf es wirklich ankommt",description:"Ein statistisch signifikanter Gewinner auf Meta oder TikTok braucht viele distinkte Varianten, nicht einen polierten Hero. Die volle Aufschlüsselung.",body:`Um **einen statistisch signifikanten Gewinner** auf Meta oder TikTok 2026 zu finden, braucht es **viele distinkte Creative-Varianten** â in gesättigten Verticals (Skincare, Supplements) noch mehr. 4016 4017## Was "distinkt" heiÃt 4018 4019- Neuer Hook (kein Re-Edit). 4020- Neues Model oder neue Szene. 4021- Neuer Angle auf dieselbe Value-Prop. 4022 4023So viele Varianten zu produzieren war früher der Flaschenhals. Auf HeroShots kostet die erste Generierung von 4 Bildvarianten in einem Projekt â¬4,90, jeder weitere Batch im selben Projekt â¬1,90 (Preise zzgl. MwSt.).`,faqs:[{q:"Was, wenn der Winner schon Variante 3 ist?",a:"Glücksfall. Trotzdem 10â15 weitere testen â Second-Best-Gewinner schlagen den ersten oft im Scale-Spend, wenn Fatigue einsetzt."}]},fr:{title:"Combien de créatives faut-il pour trouver un winning ad ? Ce qui compte vraiment",description:"Trouver un gagnant statistiquement significatif sur Meta ou TikTok demande beaucoup de variantes distinctes, pas un seul hero peaufiné. Le détail complet.",body:`Trouver **un gagnant statistiquement significatif** sur Meta ou TikTok en 2026 demande **beaucoup de variantes créatives distinctes**, pas une ou deux â et davantage encore dans les verticales saturées (skincare, suppléments). 4024 4025## Ce que veut dire "distinct" 4026 4027- Nouveau hook (pas un re-edit). 4028- Nouveau model ou scène. 4029- Nouvel angle sur la même value prop. 4030 4031Produire autant de variantes était le goulot d'étranglement. Sur HeroShots, la première génération de 4 variantes d'image dans un projet coûte â¬4,90 et chaque batch suivant du même projet â¬1,90 (prix hors TVA).`,faqs:[{q:"Et si je trouve le gagnant à la variante 3 ?",a:"Chance précoce. Teste-en quand même 10â15 de plus â les second-best gagnants battent souvent le premier en scale spend quand la fatigue arrive."}]}}),ja("ab-test-hooks-formats-cta",["performance","ab-testing","ads"],"2026-06-30",{en:{title:"How to Structure an A/B Test of Hook, Format and CTA",metaTitle:"How to A/B Test Hook, Format and CTA",description:"A clean A/B test isolates one variable at a time. Here's the 3-week sequenced testing framework for hook, format, then CTA.",body:`Run **one variable per week**: week 1 hook, week 2 format, week 3 CTA. Multi-variable tests confuse signal and waste budget â sequential isolation finds the compounding winner. 4032 4033## The 3-week plan 4034 4035- **Week 1 â Hook**: 6 hooks, identical body + CTA. Pick winner. 4036- **Week 2 â Format**: winning hook, swap 9:16 / 4:5 / static / carousel. 4037- **Week 3 â CTA**: winning hook + format, test 3 CTA copies. 4038 4039End-of-month: scale the stacked winner at 5à budget.`,faqs:[{q:"Why not test everything at once?",a:"16-cell matrices need huge spend for significance. Sequential testing costs far less and tells you why each lever worked."}]},it:{title:"Come strutturare un test A/B di hook, formato e CTA",description:"Un A/B test pulito isola una variabile alla volta. Il framework sequenziale a 3 settimane per hook, formato e CTA.",body:`Testa **un
4039a variabile a settimana**: settimana 1 hook, settimana 2 formato, settimana 3 CTA. I test multi-variabile confondono il segnale e sprecano budget â l'isolamento sequenziale trova il vincitore composto. 4040 4041## Piano a 3 settimane 4042 4043- **Sett 1 â Hook**: 6 hook, body + CTA identici. Scegli il winner. 4044- **Sett 2 â Formato**: hook vincente, swap 9:16 / 4:5 / static / carousel. 4045- **Sett 3 â CTA**: hook + formato vincenti, testa 3 copy CTA. 4046 4047Fine mese: scala il vincitore impilato a 5à budget.`,faqs:[{q:"Perché non testare tutto insieme?",a:"Le matrici 16 celle richiedono spend enormi per essere significative. Il sequenziale costa molto meno e ti dice perché ogni leva ha funzionato."}]},es:{title:"Cómo estructurar un test A/B de hook, formato y CTA",description:"Un A/B test limpio aÃsla una variable a la vez. Framework secuencial de 3 semanas para hook, formato y CTA.",body:`Testa **una variable por semana**: sem 1 hook, sem 2 formato, sem 3 CTA. Los tests multi-variable confunden la señal y queman budget â el aislamiento secuencial encuentra el ganador compuesto. 4048 4049## Plan de 3 semanas 4050 4051- **Sem 1 â Hook**: 6 hooks, body + CTA idénticos. Elige ganador. 4052- **Sem 2 â Formato**: hook ganador, swap 9:16 / 4:5 / static / carousel. 4053- **Sem 3 â CTA**: hook + formato ganadores, testa 3 copies CTA. 4054 4055Fin de mes: escala el ganador apilado a 5à budget.`,faqs:[{q:"¿Por qué no testar todo a la vez?",a:"Las matrices 16 celdas requieren spend enormes para significancia. Secuencial cuesta mucho menos y te dice por qué cada palanca funcionó."}]},de:{title:"Wie du einen A/B-Test von Hook, Format und CTA strukturierst",description:"Ein sauberer A/B-Test isoliert eine Variable. 3-Wochen-Sequenz-Framework für Hook, Format und CTA.",body:`Teste **eine Variable pro Woche**: Woche 1 Hook, Woche 2 Format, Woche 3 CTA. Multi-Variablen-Tests verwirren das Signal und verbrennen Budget â sequenzielle Isolation findet den kumulierten Gewinner. 4056 4057## 3-Wochen-Plan 4058 4059- **Woche 1 â Hook**: 6 Hooks, identischer Body + CTA. Sieger wählen. 4060- **Woche 2 â Format**: Sieger-Hook, Swap 9:16 / 4:5 / Static / Carousel. 4061- **Woche 3 â CTA**: Sieger-Hook + Format, 3 CTA-Copies testen. 4062 4063Monatsende: gestapelten Gewinner mit 5à Budget skalieren.`,faqs:[{q:"Warum nicht alles auf einmal?",a:"16-Zellen-Matrizen brauchen riesigen Spend für Signifikanz. Sequenziell kostet deutlich weniger und erklärt, warum jeder Hebel zog."}]},fr:{title:"Comment structurer un A/B test de hook, format et CTA",description:"Un A/B test propre isole une variable à la fois. Framework séquentiel sur 3 semaines pour hook, format et CTA.",body:`Teste **une variable par semaine** : sem 1 hook, sem 2 format, sem 3 CTA. Les tests multi-variables brouillent le signal et brûlent du budget â l'isolation séquentielle trouve le gagnant cumulé. 4064 4065## Plan 3 semaines 4066 4067- **Sem 1 â Hook** : 6 hooks, body + CTA identiques. Sélectionne le gagnant. 4068- **Sem 2 â Format** : hook gagnant, swap 9:16 / 4:5 / static / carousel. 4069- **Sem 3 â CTA** : hook + format gagnants, teste 3 copies CTA. 4070 4071Fin de mois : scale le gagnant empilé à 5à budget.`,faqs:[{q:"Pourquoi pas tout tester en même temps ?",a:"Les matrices 16 cellules demandent un spend énorme pour la significativité. Séquentiel coûte bien moins cher et explique pourquoi chaque levier a marché."}]}}),ja("retargeting-ugc-formats-cart-recovery",["performance","retargeting","ads"],"2026-07-01",{en:{title:"Retargeting: The UGC Formats That Bring Customers Back to Checkout",metaTitle:"Retargeting: UGC Formats for Cart Recovery",description:"Retargeting with UGC testimonials and FAQ-style answers recovers abandoned carts far better than generic discount ads. The format set that works in 2026.",body:`Retargeting ads with **UGC testimonials and FAQ-answer formats** recover **abandoned carts** far more reliably than generic discount ads in 2026. The reason: lapsed shoppers need objection-handling, not pressure. 4072 4073## The 3-format retargeting set 4074 4075- **Testimonial UGC** (15â20s, real model). 4076- **Questionâanswer micro-video** ("Does it fit XL?" / "Worth â¬X?"). 4077- **Reassurance reel** (returns, shipping, guarantee).`,faqs:[{q:"Should I include a discount?",a:"Only after objection-handling fails. First reduce friction with information; price is the last lever, not the first."}]},it:{title:"Retargeting: i formati UGC che riportano i clienti al checkout",description:"Il retargeting con UGC testimonial e formati FAQ recupera i carrelli abbandonati molto meglio degli ad sconto generici. Il set di formati che funziona nel 2026.",body:`Gli ad di retargeting con **UGC testimonial e formati FAQ-answer** recuperano **carrelli abbandonati
4077** molto più efficacemente degli ad sconto generici nel 2026. Il motivo: chi è uscito ha bisogno di gestione obiezioni, non pressione. 4078 4079## Il set retargeting a 3 formati 4080 4081- **Testimonial UGC** (15â20s, model reale). 4082- **Micro-video questionâanswer** ("Calza XL?" / "Vale â¬X?"). 4083- **Reassurance reel** (resi, spedizione, garanzia).`,faqs:[{q:"Devo includere uno sconto?",a:"Solo dopo che la gestione obiezioni fallisce. Prima riduci attrito con informazioni; il prezzo è l'ultima leva, non la prima."}]},es:{title:"Retargeting: los formatos UGC que devuelven al cliente al checkout",description:"El retargeting con UGC testimonios y formatos FAQ recupera carritos abandonados mucho mejor que los ads de descuento genéricos. El set de formatos que funciona en 2026.",body:`Los ads de retargeting con **UGC testimonios y formatos FAQ-answer** recuperan **carritos abandonados** mucho mejor que los ads de descuento genéricos en 2026. Razón: el que se fue necesita manejo de objeciones, no presión. 4084 4085## Set retargeting 3 formatos 4086 4087- **Testimonio UGC** (15â20s, model real). 4088- **Micro-vÃdeo questionâanswer** ("¿Calza XL?" / "¿Vale â¬X?"). 4089- **Reassurance reel** (devoluciones, envÃo, garantÃa).`,faqs:[{q:"¿Debo incluir descuento?",a:"Solo si el manejo de objeciones falla. Primero reduce fricción con información; el precio es la última palanca, no la primera."}]},de:{title:"Retargeting: Die UGC-Formate, die Kunden zurück zum Checkout bringen",description:"Retargeting mit UGC-Testimonials und FAQ-Formaten holt abgebrochene Warenkörbe deutlich besser zurück als generische Rabatt-Ads. Das Format-Set, das 2026 zieht.",body:`Retargeting-Ads mit **UGC-Testimonials und FAQ-Answer-Formaten** holen **abgebrochene Warenkörbe** 2026 deutlich zuverlässiger zurück als generische Rabatt-Ads. Grund: Wer abgebrochen hat, braucht Einwand-Behandlung, keinen Druck. 4090 4091## 3-Format-Retargeting-Set 4092 4093- **UGC-Testimonial** (15â20s, Real Model). 4094- **QuestionâAnswer-Micro-Video** ("Passt XL?" / "Wert â¬X?"). 4095- **Reassurance-Reel** (Retouren, Versand, Garantie).`,faqs:[{q:"Soll ich einen Rabatt mitgeben?",a:"Erst wenn Einwand-Behandlung scheitert. Zuerst Reibung mit Information reduzieren; Preis ist der letzte Hebel, nicht der erste."}]},fr:{title:"Retargeting : les formats UGC qui ramènent les clients au checkout",description:"Le retargeting avec UGC témoignages et formats FAQ récupère bien mieux les paniers abandonnés que les ads remise génériques. Le set de formats qui marche en 2026.",body:`Les ads retargeting avec **UGC témoignages et formats FAQ-answer** récupèrent **les paniers abandonnés** bien mieux que les ads remise génériques en 2026. Raison : qui a quitté veut du traitement d'objection, pas de la pression. 4096 4097## Set retargeting 3 formats 4098 4099- **Témoignage UGC** (15â20s, model réel). 4100- **Micro-vidéo questionâréponse** ("Taille XL ?" / "Vaut â¬X ?"). 4101- **Reassurance reel** (retours, livraison, garantie).`,faqs:[{q:"Faut-il inclure une remise ?",a:"Seulement si le traitement d'objection échoue. D'abord réduis la friction par l'info ; le prix est le dernier levier, pas le premier."}]}}),ja("creative-agencies-scale-multi-client-ugc-production",["audience","agencies","production"],"2026-07-02",{en:{title:"How Creative Agencies Can Scale UGC Production Across Multiple Clients",metaTitle:"How Agencies Scale Multi-Client UGC Production",description:"Workspaces, brand-locked templates and per-client billing let an agency scale output without scaling headcount. The HeroShots agency stack.",body:`Agencies that adopt **AI UGC workflows with brand-locked templates and multi-workspace billing** can deliver **far more output without hiring**, because production stops being the bottleneck. 4102 4103## The agency stack 4104 4105- **One Workspace per client** with locked brand prompts. 4106- **Shared Real Model roster** across clients (where exclusivity allows). 4107- **Per-workspace usage billing** for clean P&L. 4108- **Approval workflow** with client review before publish.`,faqs:[{q:"How do I bill clients fairly?",a:"Use per-generation cost as the line item, plus a creative-direction retainer. HeroShots exports workspace usage reports monthly."}]},it:{title:"Come le agenzie creative possono scalare la produzione per più clienti",description:"Worksp
4108ace, template brand-locked e billing per cliente permettono di scalare l'output senza scalare il personale. Lo stack agency di HeroShots.",body:`Le agenzie che adottano **workflow AI UGC con template brand-locked e billing multi-workspace** possono produrre **molto più output senza assunzioni**, perché la produzione non è più collo di bottiglia. 4109 4110## Lo stack agency 4111 4112- **Un Workspace per cliente** con prompt brand bloccati. 4113- **Roster Real Model condiviso** tra clienti (dove l'esclusività lo consente). 4114- **Billing usage per workspace** per P&L puliti. 4115- **Approval workflow** con review cliente prima della pubblicazione.`,faqs:[{q:"Come fatturo equamente i clienti?",a:"Usa il costo per generazione come line item, più un retainer di direzione creativa. HeroShots esporta i report di usage per workspace ogni mese."}]},es:{title:"Cómo las agencias creativas pueden escalar producción UGC entre múltiples clientes",description:"Workspaces, plantillas brand-locked y billing por cliente permiten escalar el output sin escalar la plantilla. El stack agency de HeroShots.",body:`Las agencias que adoptan **workflows AI UGC con plantillas brand-locked y billing multi-workspace** pueden producir **mucho más output sin contratar**, porque la producción deja de ser cuello de botella. 4116 4117## Stack agency 4118 4119- **Un Workspace por cliente** con prompts brand bloqueados. 4120- **Roster Real Model compartido** entre clientes (cuando la exclusividad lo permite). 4121- **Billing usage por workspace** para P&L limpios. 4122- **Approval workflow** con review cliente antes de publicar.`,faqs:[{q:"¿Cómo facturo a los clientes de forma justa?",a:"Usa el coste por generación como line item, más un retainer de dirección creativa. HeroShots exporta reports de usage por workspace cada mes."}]},de:{title:"Wie Kreativagenturen die UGC-Produktion über mehrere Kunden skalieren",description:"Workspaces, brand-gelockte Templates und Per-Client-Billing skalieren den Output ohne mehr Personal. Der HeroShots-Agency-Stack.",body:`Agenturen, die **AI-UGC-Workflows mit brand-gelockten Templates und Multi-Workspace-Billing** einsetzen, können **deutlich mehr Output ohne Neueinstellungen** liefern â Produktion ist kein Bottleneck mehr. 4123 4124## Der Agency-Stack 4125 4126- **Ein Workspace pro Kunde** mit fixierten Brand-Prompts. 4127- **Gemeinsames Real-Model-Roster** über Kunden (wo Exklusivität es zulässt). 4128- **Workspace-basiertes Usage-Billing** für saubere P&L. 4129- **Approval-Workflow** mit Kunden-Review vor Veröffentlichung.`,faqs:[{q:"Wie rechne ich fair ab?",a:"Per-Generation-Kosten als Line-Item plus Kreativ-Retainer. HeroShots liefert monatliche Workspace-Usage-Reports."}]},fr:{title:"Comment les agences créatives peuvent scaler la production UGC sur plusieurs clients",description:"Workspaces, templates brand-locked et billing par client permettent de scaler l'output sans scaler les effectifs. Le stack agency HeroShots.",body:`Les agences qui adoptent **les workflows AI UGC avec templates brand-locked et billing multi-workspace** peuvent produire **beaucoup plus d'output sans recrutement** â la production cesse d'être le bottleneck. 4130 4131## Le stack agency 4132 4133- **Un Workspace par client** avec prompts brand verrouillés. 4134- **Roster Real Model partagé** entre clients (quand l'exclusivité l'autorise). 4135- **Billing usage par workspace** pour des P&L propres. 4136- **Approval workflow** avec review client avant publication.`,faqs:[{q:"Comment facturer équitablement ?",a:"Coût par génération en line item, plus un retainer de direction créative. HeroShots exporte des reports d'usage par workspace chaque mois."}]}}),ja("d2c-brand-guide-scalable-ugc-content",["audience","d2c","brand"],"2026-07-03",{en:{title:"The D2C Brand Guide to Scalable UGC Content Production",metaTitle:"The D2C Guide to Scalable UGC Production",description:"How fast-growing D2C brands ship a high volume of UGC assets every month with a small creative team using AI. The 5-step operating model.",body:`Fast-growing D2C brands ship **a high volume of UGC assets every month with a small creative team** by adopting a 5-step AI o
4136perating model: brand prompt â batch generation â human review â publish â archive with metadata. 4137 4138## The 5-step model 4139 4140- **Brand prompt** locks tone, color, model archetypes. 4141- **Batch generation** runs nightly across new SKUs and campaigns. 4142- **Human review** (a few minutes per batch) keeps quality bar. 4143- **Publish** to ads, PDPs, social with one click. 4144- **Archive with metadata** for audit and reuse.`,faqs:[{q:"Do I still need an in-house photographer?",a:"Yes, but their role shifts â from production volume to brand standards and macro detail work. Volume moves to AI."}]},it:{title:"La guida del brand D2C alla produzione di contenuti UGC scalabile",description:"Come i brand D2C in crescita pubblicano molti asset UGC al mese con un team creativo ridotto usando l'AI. Il modello operativo a 5 step.",body:`I brand D2C in crescita pubblicano **molti asset UGC al mese con un team creativo ridotto** adottando un modello operativo AI a 5 step: brand prompt â batch generation â human review â publish â archive con metadata. 4145 4146## Il modello a 5 step 4147 4148- **Brand prompt** blocca tono, colore, archetipi model. 4149- **Batch generation** notturna su nuove SKU e campagne. 4150- **Human review** (pochi minuti per batch) mantiene il bar qualità . 4151- **Publish** su ad, PDP, social con un click. 4152- **Archive con metadata** per audit e riuso.`,faqs:[{q:"Mi serve ancora un fotografo interno?",a:"Sì, ma il ruolo cambia â da volume produttivo a brand standard e macro detail. Il volume passa all'AI."}]},es:{title:"La guÃa del brand D2C a la producción de contenido UGC escalable",description:"Cómo las marcas D2C en crecimiento publican un alto volumen de assets UGC al mes con un equipo creativo pequeño usando AI. El modelo operativo de 5 pasos.",body:`Las marcas D2C en crecimiento publican **un alto volumen de assets UGC al mes con un equipo creativo pequeño** adoptando un modelo operativo AI de 5 pasos: brand prompt â batch generation â human review â publish â archive con metadata. 4153 4154## Modelo de 5 pasos 4155 4156- **Brand prompt** bloquea tono, color, arquetipos de model. 4157- **Batch generation** nocturna sobre nuevos SKUs y campañas. 4158- **Human review** (unos minutos por batch) mantiene el bar de calidad. 4159- **Publish** a ads, PDPs, social con un click. 4160- **Archive con metadata** para audit y reuso.`,faqs:[{q:"¿Sigo necesitando un fotógrafo interno?",a:"SÃ, pero el rol cambia â de volumen productivo a brand standards y trabajo macro. El volumen pasa a la AI."}]},de:{title:"Der D2C-Brand-Guide zur skalierbaren UGC-Content-Produktion",description:"Wie schnell wachsende D2C-Marken viele UGC-Assets pro Monat mit einem kleinen Kreativteam ausliefern. Das 5-Schritte-Operating-Modell.",body:`Schnell wachsende D2C-Marken liefern **viele UGC-Assets pro Monat mit einem kleinen Kreativteam** durch ein 5-Schritte-AI-Operating-Modell: Brand-Prompt â Batch-Generierung â Human-Review â Publish â Archive mit Metadata. 4161 4162## Das 5-Schritte-Modell 4163 4164- **Brand-Prompt** fixiert Ton, Farbe, Model-Archetypen. 4165- **Batch-Generierung** nachts über neue SKUs und Kampagnen. 4166- **Human-Review** (wenige Minuten pro Batch) hält Qualitätslevel. 4167- **Publish** zu Ads, PDPs, Social mit einem Klick. 4168- **Archive mit Metadata** für Audit und Reuse.`,faqs:[{q:"Brauche ich noch einen In-House-Fotografen?",a:"Ja â aber die Rolle wandert: von Produktionsvolumen zu Brand-Standards und Macro-Detail. Volumen geht an AI."}]},fr:{title:"Le guide de la marque D2C pour une production de contenu UGC scalable",description:"Comment les marques D2C en croissance livrent beaucoup d'assets UGC chaque mois avec une petite équipe créative via l'AI. Modèle opératoire en 5 étapes.",body:`Les marques D2C en croissance livrent **beaucoup d'assets UGC chaque mois avec une petite équipe créative** en adoptant un modèle opératoire AI en 5 étapes : brand prompt â batch generation â human review â publish â archive avec metadata. 4169 4170## Le modèle 5 étapes 4171
4172- **Brand prompt** verrouille ton, couleur, archétypes model. 4173- **Batch generation** nocturne sur nouveaux SKU et campagnes. 4174- **Human review** (quelques minutes par batch) tient la barre qualité. 4175- **Publish** vers ads, PDP, social en un clic. 4176- **Archive avec metadata** pour audit et reuse.`,faqs:[{q:"Ai-je encore besoin d'un photographe interne ?",a:"Oui, mais le rôle change â du volume de production aux brand standards et macro detail. Le volume va à l'AI."}]}}),ja("creators-monetize-face-voice-templates",["audience","creators","monetization"],"2026-07-04",{en:{title:"How Creators Can Monetize Their Face, Voice and Templates on HeroShots",metaTitle:"How Creators Monetize Face, Voice and Templates",description:"Top HeroShots creators earn recurring royalties on face, voice and reusable templates. The 3 income streams and how to build each.",body:`Top HeroShots creators build **recurring monthly income** from 3 royalty streams: **face usage** (per-image and per-video), **voice clone usage**, and **template sales** (reusable prompts and scene blueprints). All three are paid monthly via Tik Joy. 4177 4178## The 3 streams 4179 4180- **Face royalties**: every brand generation triggers a per-asset payout. 4181- **Voice royalties**: per-second TTS use on licensed voice clones. 4182- **Template marketplace**: creators sell prompt/scene blueprints and earn a revenue share on every sale.`,faqs:[{q:"Do I need exclusivity?",a:"No. HeroShots doesn't require exclusivity. Creators keep working with other agencies and on direct brand campaigns."}]},it:{title:"Come i creator possono monetizzare volto, voce e template",description:"I top creator HeroShots guadagnano royalty ricorrenti su volto, voce e template riutilizzabili. Le 3 fonti di reddito e come costruirle.",body:`I top creator HeroShots costruiscono **un reddito mensile ricorrente** da 3 stream di royalty: **uso del volto** (per immagine e per video), **uso del voice clone**, e **vendita di template** (prompt e scene blueprint riutilizzabili). Tutti pagati mensilmente via Tik Joy. 4183 4184## I 3 stream 4185 4186- **Royalty volto**: ogni generazione brand attiva payout per asset. 4187- **Royalty voce**: TTS al secondo su voice clone licenziato. 4188- **Marketplace template**: il creator vende blueprint e guadagna una quota su ogni vendita.`,faqs:[{q:"Serve esclusiva?",a:"No. HeroShots non richiede esclusiva. I creator continuano a lavorare con altre agenzie e in campagne brand dirette."}]},es:{title:"Cómo los creators pueden monetizar cara, voz y plantillas en HeroShots",description:"Los top creators de HeroShots ganan royalties recurrentes por cara, voz y plantillas reusables. Las 3 fuentes de ingreso y cómo construirlas.",body:`Los top creators de HeroShots construyen **ingresos mensuales recurrentes** con 3 streams de royalty: **uso de cara** (por imagen y vÃdeo), **uso de voice clone**, y **venta de plantillas** (prompts y scene blueprints reusables). Todos pagados mensualmente vÃa Tik Joy. 4189 4190## Los 3 streams 4191 4192- **Royalty cara**: cada generación brand dispara payout por asset. 4193- **Royalty voz**: TTS por segundo sobre voice clone licenciado. 4194- **Marketplace plantillas**: el creator vende blueprints y gana una parte de cada venta.`,faqs:[{q:"¿Necesito exclusividad?",a:"No. HeroShots no exige exclusividad. Los creators siguen trabajando con otras agencias y campañas brand directas."}]},de:{title:"Wie Creators Gesicht, Stimme und Templates auf HeroShots monetarisieren",description:"Top-HeroShots-Creators verdienen wiederkehrende Royalties auf Gesicht, Stimme und wiederverwendbare Templates. 3 Einkommens-Streams.",body:`Top-HeroShots-Creators bauen sich **wiederkehrendes monatliches Einkommen** aus 3 Royalty-Streams auf: **Gesichtsnutzung** (pro Bild und Video), **Voice-Clone-Nutzung** und **Template-Verkauf** (wiederverwendbare Prompts und Scene-Blueprints). Alle monatlich über Tik Joy ausgezahlt. 4195 4196## Die 3 Streams 4197 4198- **Gesichts-Royalty**: jede Marken-Generierung löst Per-Asset-Auszahlung aus. 4199- **Voice-Royalty**: TTS pro Sekunde auf lizenziertem Voice-Clone. 4200- **Template-Marketplace**: Creator verkauft Blueprints und erhält einen Umsatzanteil.`,faqs:[{q:"Brauche ich Exklusivität?",a:"Nein. HeroShots verlangt keine Exklusivität. Creators arbeiten weiter mit anderen Agenturen und in direkten Marken-Kampagnen."}]},fr:{title:"Comment les créateurs peuvent monétiser visage, voix et templates sur HeroShots",description:"Les top créateurs HeroShots gagnent des royalties récurrentes sur visage, voix et templates réutilisables. 3 streams de revenus et comment les construire.",body:`Les top créateurs HeroShots construisent **un revenu mensuel récurrent** à partir de 3 streams de royalty : **usage du visage** (par image et vidéo), **usage du voice clone**, et **vente de templates** (prompts et scene blueprints réutilisables). Tous payés mensuellement via Tik Joy. 4201 4202## Les 3 streams 4203 4204- **Royalty visage** : chaque génération marque déclenche un payout par asset. 4205- **Royalty voix** : TTS à la seconde sur voice clone licencié. 4206- **Marketplace templates** : le créateur vend des blueprints et touche une part sur chaque vente.`,faqs:[{q:"L'exclusivité est-elle nécessaire ?",a:"Non. HeroShots n'exige pas d'exclusivité. Les créateurs continuent avec d'autres agences et en campagnes marques directes."}]}}
4206),ja("merchants-create-content-users-want-to-post",["audience","merchants","ugc"],"2026-07-05",{en:{title:"For Merchants: How to Create Content Customers Actually Want to Repost",metaTitle:"How to Create Content Customers Will Repost",description:"Reposted content is free marketing. The 4 content types that customers organically share â and how merchants can seed them with AI.",body:`Customer-reposted content is **the cheapest paid social you'll ever get** â but it only happens when the brand gives customers something genuinely worth sharing. The 4 reliably-shareable types in 2026: **identity badge**, **how-it-was-made**, **insider tip**, **packaging moment**. 4207 4208## How merchants seed them 4209 4210- Identity badges: limited drops with a visual ID. 4211- How-it-was-made: behind-the-scenes AI clips of sourcing/production. 4212- Insider tips: short UGC creators explaining a use-case people didn't know. 4213- Packaging moments: unboxing experiences worth filming.`,faqs:[{q:"Should I incentivize reposts?",a:"Yes, but with status (feature on grid, early access) more than discount. Discount-bait reposts have low engagement and look transactional."}]},it:{title:"Per i merchant: come creare contenuti che gli utenti vogliono pubblicare",description:"Il repost è marketing gratis. I 4 tipi di contenuto che i clienti condividono organicamente â e come i merchant possono innescarli con l'AI.",body:`Il contenuto repostato dai clienti è **il paid social più economico che avrai mai** â ma succede solo quando il brand dà ai clienti qualcosa di davvero condivisibile. I 4 tipi affidabili nel 2026: **identity badge**, **how-it-was-made**, **insider tip**, **packaging moment**. 4214 4215## Come i merchant li innescano 4216 4217- Identity badge: drop limitati con ID visivo. 4218- How-it-was-made: clip AI behind-the-scenes su sourcing/produzione. 4219- Insider tip: micro-UGC con use-case che la gente non conosce. 4220- Packaging moment: esperienze di unboxing degne di essere filmate.`,faqs:[{q:"Devo incentivare i repost?",a:"Sì, ma con status (feature in griglia, early access) più che con sconto. I repost da sconto hanno engagement basso e sembrano transazionali."}]},es:{title:"Para merchants: cómo crear contenido que los usuarios quieran republicar",description:"El repost es marketing gratis. Los 4 tipos de contenido que los clientes comparten orgánicamente â y cómo los merchants pueden sembrarlos con AI.",body:`El contenido reposteado por clientes es **el paid social más barato que tendrás** â pero solo pasa si la marca da algo realmente compartible. Los 4 tipos fiables en 2026: **identity badge**, **how-it-was-made**, **insider tip**, **packaging moment**. 4221 4222## Cómo los merchants los siembran 4223 4224- Identity badge: drops limitados con ID visual. 4225- How-it-was-made: clips AI behind-the-scenes de sourcing/producción. 4226- Insider tip: micro-UGC con use-case que la gente no conoce. 4227- Packaging moment: experiencias de unboxing dignas de filmar.`,faqs:[{q:"¿Debo incentivar reposts?",a:"SÃ, pero con status (feature en grid, early access) más que descuento. Los reposts por descuento tienen engagement bajo y parecen transaccionales."}]},de:{title:"Für Merchants: Wie du Content schaffst, den Kunden wirklich teilen wollen",description:"Reposteter Content ist gratis Marketing. Die 4 Content-Typen, die Kunden organisch teilen â und wie Merchants sie mit AI anstoÃen.",body:`Von Kunden reposteter Content ist **das günstigste Paid Social, das es gibt** â passiert aber nur, wenn die Marke etwas wirklich Teilbares liefert. 4 verlässliche Typen 2026: **Identity-Badge**, **How-it-was-made**, **Insider-Tip**, **Packaging-Moment**. 4228 4229## Wie Merchants sie anstoÃen 4230 4231- Identity-Badges: limitierte Drops mit visueller ID. 4232- How-it-was-made: Behind-the-Scenes-AI-Clips zu Sourcing/Produktion. 4233- Insider-Tips: Mikro-UGC mit unbekannten Use-Cases. 4234- Packaging-Momente: filmwürdige Unboxing-Erlebnisse.`,faqs:[{q:"Reposts incentivieren?",a:"Ja, aber mit Status (Feature im Grid, Early-Access) statt Rabatt. Rabatt-Reposts haben geringes Engagement und wirken transaktional."}]},fr:{title:"Pour les merchants : comment créer du contenu que les utilisateurs veulent republier",description:"Le repost est du marketing gratuit. Les 4 types de contenu que les clients partagent organiquement â et comment les merchants peuvent les semer avec l'AI.",body:`Le
4234contenu reposté par les clients est **le paid social le moins cher qui soit** â mais ça n'arrive que si la marque donne quelque chose de vraiment partageable. 4 types fiables en 2026 : **identity badge**, **how-it-was-made**, **insider tip**, **packaging moment**. 4235 4236## Comment les merchants les sèment 4237 4238- Identity badges : drops limités avec ID visuel. 4239- How-it-was-made : clips AI behind-the-scenes sourcing/production. 4240- Insider tips : micro-UGC avec use-case méconnus. 4241- Packaging moments : expériences d'unboxing à filmer.`,faqs:[{q:"Faut-il inciter les reposts ?",a:"Oui, mais par le statut (feature en grid, early access) plutôt que la remise. Les reposts par remise ont peu d'engagement et semblent transactionnels."}]}}),ja("local-business-social-without-internal-team",["audience","local","smb"],"2026-07-06",{en:{title:"How a Local Business Can Do Social Without an Internal Team",metaTitle:"Local Business Social Without an Internal Team",description:"A 30-min-per-week routine that produces 5 posts and 3 videos using AI. The realistic plan for cafés, gyms, salons and shops.",body:`A local business can produce **5 social posts + 3 short videos per week in 30 minutes** using AI UGC â no team, no shoots, no editor. The unlock is a repeatable monthly template plus AI generation for everything that isn't your unique reality. 4242 4243## The 30-min weekly routine 4244 4245- 10 min â pick from the AI-generated batch. 4246- 10 min â write captions and CTAs. 4247- 10 min â schedule across Instagram and TikTok. 4248 4249Ground all AI assets in 1â2 real reference photos of your space.`,faqs:[{q:"Should I still take real photos?",a:"Yes â keep weekly real photos of food, customers (with consent) and your space. Use AI to multiply variety, not replace authenticity."}]},it:{title:"Come un'attività locale può fare social senza un team interno",description:"Una routine da 30 minuti a settimana che produce 5 post e 3 video con l'AI. Il piano realistico per caffè, palestre, saloni e shop.",body:`Un'attività locale può produrre **5 post social + 3 video brevi a settimana in 30 minuti** con l'AI UGC â senza team, shooting, editor. Lo sblocco: un template mensile ripetibile più la generazione AI per tutto ciò che non è la tua realtà unica. 4250 4251## La routine settimanale da 30 min 4252 4253- 10 min â scegli dal batch AI generato. 4254- 10 min â scrivi caption e CTA. 4255- 10 min â schedula su Instagram e TikTok. 4256 4257Ancora gli asset AI a 1â2 foto reali dello spazio.`,faqs:[{q:"Devo continuare a scattare foto reali?",a:"Sì â tieni foto reali settimanali di cibo, clienti (con consenso) e spazio. Usa l'AI per moltiplicare varietà , non per sostituire l'autenticità ."}]},es:{title:"Cómo un negocio local puede hacer social sin equipo interno",description:"Rutina de 30 minutos por semana que produce 5 posts y 3 vÃdeos con AI. El plan realista para cafés, gimnasios, salones y tiendas.",body:`Un negocio local puede producir **5 posts social + 3 vÃdeos cortos por semana en 30 minutos** con AI UGC â sin equipo, shootings ni editor. La clave: un template mensual repetible más generación AI para todo lo que no es tu realidad única. 4258 4259## Rutina semanal de 30 min 4260 4261- 10 min â elige del batch AI generado. 4262- 10 min â escribe captions y CTAs. 4263- 10 min â programa en Instagram y TikTok. 4264 4265Ancla los assets AI en 1â2 fotos reales del local.`,faqs:[{q:"¿Sigo tomando fotos reales?",a:"Sà â mantén fotos reales semanales de comida, clientes (con consentimiento) y espacio. Usa AI para multiplicar variedad, no para sustituir autenticidad."}]},de:{title:"Wie ein lokales Business Social ohne internes Team macht",description:"30-Minuten-pro-Woche-Routine, die 5 Posts und 3 Videos mit AI produziert. Der realistische Plan für Cafés, Gyms, Salons, Shops.",body:`Ein lokales Business kann **5 Social-Posts + 3 Kurz-Videos pro Woche in 30 Minuten** mit AI-UGC produzieren â kein Team, keine Drehs, kein Editor. Der Hebel: wiederholbares Monatstemplate plus AI-Generierung für alles, was nicht deine einzigartige Realität ist. 4266 4267## Die 30-Min-Wochenroutine 4268 4269- 10 min â aus dem AI-Batch wählen. 4270- 10 min â Captions und CTAs schreiben. 4271- 10 min â auf Instagram und TikTok planen. 4272 4273Verankere alle AI-Assets in 1â2 echten Fotos deines Ladens.`,faqs:[{q:"Soll ich noch echte Fotos machen?",a:"Ja â wöchentlich echte Fotos von Essen, Gästen (mit Einwilligung) und Raum. AI multipliziert Vielfalt, ersetzt nicht Authentizität."}]},fr:{title:"Comment une activité locale peut faire du social sans équipe interne",description:"Une routine de 30 min par semaine qui produit 5 posts et 3 vidéos avec l'AI. Le plan réaliste pour cafés, gyms, salons et boutiques.",body:`Une activité locale peut produire **5 posts social + 3 vidéos courtes par semaine en 30 minutes** avec l'AI UGC â pas d'équipe, pas de tournage, pas d'éditeur. Le déblocage : template mensuel reproductible + génération AI pour tout ce qui n'est pas ta réalité unique. 4274 4275## La routine hebdo de 30 min 4276 4277- 10 min â sélectionne dans le batch AI. 4278- 10 min â écris captions et CTA. 4279- 10 min â planifie sur Instagram et TikTok. 4280 4281Ancre tous les assets AI sur 1â2 photos réelles de ton lieu.`,faqs:[{q:"Faut-il continuer à prendre des photos réelles ?",a:"Oui â garde des photos réelles hebdomadaires de plats, clients (ave
4281c consentement) et lieu. Utilise l'AI pour multiplier la variété, pas remplacer l'authenticité."}]}})],CL=e=>[`| ${e.header.join(" | ")} |`,`| ${e.header.map(()=>"---").join(" | ")} |`,...e.rows.map(t=>`| ${t.join(" | ")} |`)].join(` 4282`),SL=e=>{var a,n;const t=[];return e.h2&&t.push(`## ${e.h2}`),e.h3&&t.push(`### ${e.h3}`),e.body&&t.push(e.body),(a=e.bullets)!=null&&a.length&&t.push(e.bullets.map(r=>`- ${r}`).join(` 4283`)),(n=e.steps)!=null&&n.length&&t.push(e.steps.map((r,o)=>`${o+1}. ${r}`).join(` 4284`)),e.table&&t.push(CL(e.table)),t.join(` 4285 4286`)},nP=e=>({title:e.title,...e.metaTitle?{metaTitle:e.metaTitle}:{},description:e.description,body:[e.lead,...(e.sections??[]).map(SL)].filter(Boolean).join(` 4287 4288`),faqs:e.faqs??[]}),_=(e,t,a,n,r,o,s)=>nP({title:e,description:t,lead:a,sections:[{h2:n,bullets:r}],faqs:[{q:o,a:s}]}),ct=(e,t,a,n,r)=>({slug:e,date:a,author:"HeroShots",tags:t,translations:n}),rP=[ct("ai-content-usage-rights-before-campaign",["compliance","rights"],"2026-07-07",{en:_("AI Content Usage Rights Before a Campaign","Before launching paid social with AI UGC, confirm: model consent, voice consent, territory, term, and commercial use. The 5-point checklist.","Before launching a paid campaign with AI UGC you need **5 confirmed rights**: model image consent, voice consent, territory, term length and commercial-use scope. Missing any one of these is the difference between a clean license and a lawsuit.","The 5-point pre-launch checklist",["Model image: signed granular consent on file.","Voice: separate explicit consent if voice is used.","Territory: list of allowed countries/regions.","Term: start and end dates of usage rights.","Commercial scope: paid ads vs organic vs both."],"Does HeroShots provide an audit trail?","Yes â every generated asset carries a consent ID, model ID and license terms in metadata. Exportable on request."),it:_("Diritti d'uso dei contenuti AI: cosa devi sapere prima di lanciare una campagna","Prima di lanciare paid social con AI UGC, conferma: consenso model, consenso voce, territorio, durata, uso commerciale. La checklist a 5 punti.","Prima di lanciare una campagna paid con AI UGC servono **5 diritti confermati**: consenso immagine model, consenso voce, territorio, durata, scope d'uso commerciale. Mancarne uno è la differenza tra una licenza pulita e una causa.","La checklist a 5 punti",["Immagine model: consenso granulare firmato.","Voce: consenso separato esplicito se si usa la voce.","Territorio: lista di paesi/regioni ammessi.","Durata: date di inizio e fine diritti.","Scope commerciale: ad paid vs organic vs entrambi."],"HeroShots fornisce un audit trail?","Sì â ogni asset generato porta ID consenso, ID model e termini di licenza nei metadata. Esportabile su richiesta."),es:_("Derechos de uso de contenido AI: lo que debes saber antes de lanzar una campaña","Antes de lanzar paid social con AI UGC, confirma: consentimiento model, voz, territorio, plazo y uso comercial. Checklist de 5 puntos.","Antes de lanzar una campaña paid con AI UGC necesitas **5 derechos confirmados**: consentimiento de imagen del model, voz, territorio, plazo y scope de uso comercial. Falta cualquiera y se vuelve demanda en vez de licencia.","Checklist de 5 puntos",["Imagen del model: consentimiento granular firmado.","Voz: consentimiento separado explÃcito si se usa.","Territorio: lista de paÃses/regiones permitidos.","Plazo: fechas de inicio y fin.","Scope comercial: ads paid vs organic vs ambos."],"¿HeroShots da audit trail?","Sà â cada asset generado lleva ID de consentimiento, ID de model y términos de licencia en metadata. Exportable bajo demanda."),de:_("AI-Content-Nutzungsrechte: Was du vor dem Kampagnenstart wissen musst","Vor dem Start einer Paid-Social-Kampagne mit AI-UGC: Modell-Consent, Voice-Consent, Territorium, Laufzeit, kommerzielle Nutzung. 5-Punkte-Checkliste.","Vor dem Start einer Paid-Kampagne mit AI-UGC brauchst du **5 bestätigte Rechte**: Bild-Consent, Voice-Consent, Territorium, Laufzeit und kommerziellen Nutzungs-Scope. Fehlt eines, wird aus einer Lizenz eine Klage.","5-Punkte-Checkliste",["Modellbild: signierte granulare Einwilligung.","Stimme: separate explizite Einwilligung wenn genutzt.","Territorium: erlaubte Länder/Regionen.","Laufzeit: Start- und Enddatum.","Kommerzieller Scope: Paid Ads vs Organic vs beide."],"Liefert HeroShots einen Audit-Trail?","Ja â jedes generierte Asset trägt Consent-ID, Modell-ID und Lizenzbedingungen in den Metadata. Auf Anfrage exportierbar."),fr:_("Droits d'usage du contenu AI : ce que tu dois savoir avant de lancer une campagne","Avant de lancer du paid social avec l'AI UGC, confirme : consentement model, voix, territoire, durée, usage commercial. Checklist en 5 points.","Avant de lancer une campagne paid avec l'AI UGC, il te faut **5 droits confirmés** : consentement image, voix, territoire, durée et scope commercial. En manquer un transforme une licence en procès.","Checklist 5 points",["Image model : consentement granulaire signé.","Voix : consentement séparé explicite si utilisée.","Territoire : liste pays/régions autorisés.","Durée : dates de début et fin.","Scope commercial : ads paid vs organic vs les deux."],"HeroShots fournit-il un audit trail ?","Oui â chaque asset généré porte ID consentement, ID model et termes de licence dans les metadata. Exportable sur demande.")}
4288),ct("ugc-licenses-organic-paid-worldwide-explained",["compliance","licensing"],"2026-07-08",{en:_("UGC Licenses: Organic, Paid 30 Days, Worldwide","The 6 standard UGC license tiers â from organic-only to perpetual worldwide â and when to use each.","UGC licensing splits into **6 standard tiers**, each with different territory, term and channel scope. Picking the right tier means you stop paying for rights you never use.","The 6 tiers",["Organic only â own channels, no paid.","Paid 30 days â single market, single channel.","Paid 90 days â multi-channel single market.","Paid 6 months â single region (e.g. EU).","Worldwide 12 months â global, all paid channels.","Perpetual worldwide â buyout, highest fee."],"Which tier is the most common?","Paid 90 days, multi-channel, single market â covers most performance campaigns without overspending on rights."),it:_("Licenze UGC spiegate: organic only, paid 30 giorni, worldwide e altro","I 6 tier di licenza UGC standard â da organic only a worldwide perpetuo â e quando usare ciascuno.","Le licenze UGC si dividono in **6 tier standard**, ognuno con scope diverso di territorio, durata e canale. Scegliere il tier giusto significa smettere di pagare diritti che non userai mai.","I 6 tier",["Organic only â canali propri, no paid.","Paid 30 giorni â mercato singolo, canale singolo.","Paid 90 giorni â multi-canale mercato singolo.","Paid 6 mesi â regione singola (es. EU).","Worldwide 12 mesi â globale, tutti canali paid.","Perpetuo worldwide â buyout, fee massima."],"Qual è il tier più comune?","Paid 90 giorni, multi-canale, mercato singolo â copre la maggior parte delle campagne performance senza spendere troppo in diritti."),es:_("Licencias UGC explicadas: organic only, paid 30 dÃas, worldwide y más","Los 6 tiers estándar de licencia UGC â de organic only a worldwide perpetuo â y cuándo usar cada uno.","Las licencias UGC se dividen en **6 tiers estándar**, cada uno con distinto scope de territorio, plazo y canal. Elegir el tier correcto significa dejar de pagar derechos que nunca vas a usar.","Los 6 tiers",["Organic only â canales propios, sin paid.","Paid 30 dÃas â mercado único, canal único.","Paid 90 dÃas â multi-canal mercado único.","Paid 6 meses â región única (p.ej. EU).","Worldwide 12 meses â global, todos canales paid.","Perpetuo worldwide â buyout, fee máximo."],"¿Cuál es el tier más común?","Paid 90 dÃas, multi-canal, mercado único â cubre la mayorÃa de campañas performance sin sobre-gastar en derechos."),de:_("UGC-Lizenzen erklärt: Organic Only, Paid 30 Tage, Worldwide und mehr","Die 6 Standard-UGC-Lizenztiers â von Organic Only bis Perpetual Worldwide â und wann du welches einsetzt.","UGC-Lizenzen teilen sich in **6 Standard-Tiers** mit unterschiedlichem Territorium, Laufzeit und Kanal-Scope. Mit dem richtigen Tier zahlst du nicht länger für Rechte, die du nie nutzt.","Die 6 Tiers",["Organic Only â eigene Kanäle, kein Paid.","Paid 30 Tage â ein Markt, ein Kanal.","Paid 90 Tage â Multi-Kanal, ein Markt.","Paid 6 Monate â eine Region (z. B. EU).","Worldwide 12 Monate â global, alle Paid-Kanäle.","Perpetual Worldwide â Buyout, höchste Gebühr."],"Welches Tier ist am häufigsten?","Paid 90 Tage, Multi-Kanal, ein Markt â deckt die meisten Performance-Kampagnen ohne Overspend bei Rechten."),fr:_("Licences UGC expliquées : organic only, paid 30 jours, worldwide et plus","Les 6 tiers standards de licence UGC â d'organic only à worldwide perpétuel â et les cas d'usage de chacun.","Les licences UGC se divisent en **6 tiers standards**, chacun avec scope territoire, durée et canal différents. Le bon tier, c'est arrêter de payer des droits que tu n'utiliseras jamais.","Les 6 tiers",["Organic only â canaux propres, pas de paid.","Paid 30 jours â marché unique, canal unique.","Paid 90 jours â multi-canal marché unique.","Paid 6 mois â région unique (ex. EU).","Worldwide 12 mois â global, tous canaux paid.","Perpétuel worldwide â buyout, fee maximum."],"Quel tier est le plus commun ?","Paid 90 jours, multi-canal, marché unique â couvre la plupart des campagnes performance sans surpayer les droits.")}),ct("deepfake-consent-legal-ethical-use",["compliance","deepfake","ethics"],"2026-07-09",{en:_("Deepfake and Consent: Using Faces Legally","The line between AI UGC and deepfake is consent. Here's the legal and ethical framework that keeps brands safe in 2026.","AI UGC becomes a **deepfake the moment consent is missing**. Legally, the EU AI Act and US state laws (TX, CA) now require explicit written consent for any identifiable likeness. Ethically, the bar is even higher: disclosure plus revocation rights.","The 4 non-negotiables",["Written consent specific to face, voice and use.","On-asset AI disclosure where required by platform.","Revocation right â creator can pause future use.","Audit log on every generation."],"Is a public photo enough as consent?","No. Public availability is not consent. Always require an explicit, signed agreement specific to AI generation and intended use."),it:_("Deepfake e consenso: come usare volti e voci in modo legale ed etico","Il confine tra AI UGC e deepfake è il consenso. Il framework legale ed etico che tiene al sicuro i brand nel 2026.","L'AI UGC diventa **deepfake nel momento in cui manca il consenso**. Legalmente, EU AI Act e leggi statali USA (TX, CA) richiedono consenso scritto esplicito per qualunque immagine identificabile. Eticamente, il bar è ancora più alto: disclosure più diritti di revoca.","I 4 non-negoziabili",["Consenso scritto specifico per volto, voce e uso.","Disclosure AI sull'asset quando richiesto dalla piattaforma.","Diritto di revoca â il creator può sospendere l'uso futuro.","Audit log su ogni generazione."],"Una foto pubblica vale c
4288ome consenso?","No. La disponibilità pubblica non è consenso. Serve sempre un accordo firmato esplicito specifico per generazione AI e uso previsto."),es:_("Deepfake y consentimiento: cómo usar caras y voces de forma legal y ética","La lÃnea entre AI UGC y deepfake es el consentimiento. Framework legal y ético que mantiene seguras a las marcas en 2026.","El AI UGC se vuelve **deepfake en el momento que falta el consentimiento**. Legalmente, EU AI Act y leyes estatales USA (TX, CA) exigen consentimiento escrito explÃcito para cualquier imagen identificable. Ãticamente, el listón es aún más alto: disclosure más derechos de revocación.","Los 4 no-negociables",["Consentimiento escrito especÃfico para cara, voz y uso.","Disclosure AI en asset si la plataforma lo requiere.","Derecho de revocación â el creator puede pausar uso futuro.","Audit log en cada generación."],"¿Una foto pública basta como consentimiento?","No. La disponibilidad pública no es consentimiento. Siempre requiere acuerdo firmado explÃcito especÃfico para generación AI y uso previsto."),de:_("Deepfake und Consent: Wie du Gesichter und Stimmen legal und ethisch nutzt","Die Grenze zwischen AI-UGC und Deepfake ist Consent. Das rechtliche und ethische Framework, das Marken 2026 schützt.","AI-UGC wird zum **Deepfake, sobald Consent fehlt**. Rechtlich verlangen EU-AI-Act und US-Staatsgesetze (TX, CA) explizite schriftliche Einwilligung für jede identifizierbare Person. Ethisch ist die Hürde höher: Disclosure plus Widerrufsrecht.","Die 4 Non-Negotiables",["Schriftliche Einwilligung â spezifisch für Gesicht, Stimme, Nutzung.","AI-Disclosure am Asset, wo Plattform es verlangt.","Widerrufsrecht â Creator pausiert Zukunftsnutzung.","Audit-Log bei jeder Generierung."],"Reicht ein öffentliches Foto als Einwilligung?","Nein. Ãffentliche Verfügbarkeit ist keine Einwilligung. Immer ein signiertes, AI-spezifisches Abkommen erforderlich."),fr:_("Deepfake et consentement : comment utiliser visages et voix de façon légale et éthique","La ligne entre AI UGC et deepfake est le consentement. Le framework légal et éthique qui protège les marques en 2026.","L'AI UGC devient **un deepfake dès que le consentement manque**. Légalement, l'EU AI Act et les lois d'Ãtat US (TX, CA) exigent un consentement écrit explicite pour toute image identifiable. Ãthiquement, la barre est plus haute : disclosure plus droits de révocation.","Les 4 non-négociables",["Consentement écrit spécifique visage, voix, usage.","Disclosure AI sur asset quand la plateforme l'exige.","Droit de révocation â le créateur peut suspendre l'usage futur.","Audit log à chaque génération."],"Une photo publique suffit-elle comme consentement ?","Non. La disponibilité publique n'est pas un consentement. Toujours requérir un accord signé explicite spécifique à la génération AI et à l'usage prévu.")}),ct("regulated-sectors-meta-tiktok-claims",["compliance","ads","regulated"],"2026-07-10",{en:_("Regulated Sectors: Meta and TikTok Ad Claims","Health, finance, gambling, alcohol and weight loss have strict ad rules. The 2026 reference of allowed vs forbidden claims per platform.","Regulated sectors (health, finance, gambling, alcohol, weight loss) face the **strictest ad review** on Meta and TikTok in 2026. The split: outcome claims forbidden; lifestyle and education claims allowed.","Quick reference",["Health: education yes, cure/treat/prevent no.","Finance: rate and APR yes, guaranteed-return no.","Gambling: age-gated yes, win-promise no.","Alcohol: brand and ritual yes, intoxication no.","Weight loss: routine and food yes, before/after-pounds no."],"Where do I find the exact rule?","Both Meta Ad Standards and TikTok Ads Policies publish full per-category lists. HeroShots flags risky prompts before generation."),it:_("Settori regolamentati su Meta e TikTok: claim ammessi e vietati","Health, finance, gambling, alcol e perdita peso hanno regole pubblicitarie strette. Riferimento 2026 dei claim ammessi vs vietati per piattaforma.","I settori regolamentati (health, finance, gambling, alcol, perdita peso) sono soggetti alla **review pubblicitaria più severa*
4288* su Meta e TikTok nel 2026. La regola: claim di outcome vietati; claim lifestyle ed educativi ammessi.","Quick reference",["Health: educazione sì, cura/tratta/previene no.","Finance: tasso e TAEG sì, rendimento garantito no.","Gambling: age-gated sì, promessa di vincita no.","Alcol: brand e ritualità sì, ubriachezza no.","Perdita peso: routine e cibo sì, prima/dopo kg no."],"Dove trovo la regola esatta?","Meta Ad Standards e TikTok Ads Policies pubblicano liste complete per categoria. HeroShots segnala i prompt rischiosi prima della generazione."),es:_("Sectores regulados en Meta y TikTok: claims permitidos y prohibidos","Salud, finanzas, gambling, alcohol y pérdida de peso tienen reglas estrictas. Referencia 2026 de claims permitidos vs prohibidos por plataforma.","Los sectores regulados (salud, finanzas, gambling, alcohol, pérdida de peso) están sujetos a la **revisión publicitaria más estricta** en Meta y TikTok en 2026. Regla: claims de outcome prohibidos; claims lifestyle y educativos permitidos.","Referencia rápida",["Salud: educación sÃ, cura/trata/previene no.","Finanzas: tasa y TAE sÃ, retorno garantizado no.","Gambling: age-gated sÃ, promesa de ganancia no.","Alcohol: marca y ritual sÃ, embriaguez no.","Pérdida de peso: rutina y comida sÃ, antes/después de kilos no."],"¿Dónde encuentro la regla exacta?","Meta Ad Standards y TikTok Ads Policies publican listas completas por categorÃa. HeroShots marca prompts riesgosos antes de generar."),de:_("Regulierte Sektoren auf Meta und TikTok: Erlaubte und verbotene Claims","Health, Finance, Gambling, Alkohol und Weight Loss haben strikte Werberegeln. Referenz 2026: erlaubte vs verbotene Claims pro Plattform.","Regulierte Sektoren (Health, Finance, Gambling, Alkohol, Weight Loss) unterliegen 2026 der **strengsten Ad-Prüfung** auf Meta und TikTok. Regel: Outcome-Claims verboten; Lifestyle- und Bildungs-Claims erlaubt.","Schnellreferenz",["Health: Bildung ja, Heilen/Behandeln/Verhindern nein.","Finance: Zinssatz und APR ja, Garantierte Rendite nein.","Gambling: Age-Gated ja, Gewinn-Versprechen nein.","Alkohol: Marke und Ritual ja, Betrunkenheit nein.","Weight Loss: Routine und Essen ja, Before/After-Kilos nein."],"Wo finde ich die exakte Regel?","Meta Ad Standards und TikTok Ads Policies veröffentlichen vollständige Kategorie-Listen. HeroShots flaggt riskante Prompts vor der Generierung."),fr:_("Secteurs régulés sur Meta et TikTok : claims autorisés et interdits","Santé, finance, gambling, alcool et perte de poids ont des règles strictes. Référence 2026 des claims autorisés vs interdits par plateforme.","Les secteurs régulés (santé, finance, gambling, alcool, perte de poids) sont soumis à la **review publicitaire la plus stricte** sur Meta et TikTok en 2026. Règle : claims d'outcome interdits ; claims lifestyle et éducatifs autorisés.","Référence rapide",["Santé : éducation oui, guérit/traite/prévient non.","Finance : taux et TAEG oui, rendement garanti non.","Gambling : age-gated oui, promesse de gain non.","Alcool : marque et rituel oui, ivresse non.","Perte de poids : routine et alimentation oui, avant/après-kg non."],"Où trouver la règle exacte ?","Meta Ad Standards et TikTok Ads Policies publient des listes complètes par catégorie. HeroShots flagge les prompts risqués avant génération.")}),ct("who-owns-ai-generated-content-ownership",["compliance","ownership"],"2026-07-11",{en:_("Who Owns AI-Generated Content","Ownership splits between brand (commercial license), creator (likeness royalty) and platform (model rights). Here's how HeroShots structures it.","AI-generated content has **three rights holders**: the brand (commercial license to use the asset), the creator (royalty on every use of their likeness/voice) and the platform (model and tool license). On HeroShots all three are contractually defined and visible in the asset metadata.","The 3-layer ownership",["Brand: full commercial use within the agreed license tier.","Creator: royalty per generation, no transfer of likeness ownership.","Platform: tool license, no claim on the brand's commercial output."],"Can I sell the asset?","You can sell the *product* the asset advertises. You cannot transfer the underlying license to a third party without re-negotiating creator royalty terms."),it:_("Chi possiede i contenuti generati con l'AI? La questione della proprietà ","La proprietà si divide tra brand (licenza commerciale), creator (royalty sull'immagine) e piattaforma (diritti sul modello). Come la struttura HeroShots.","I contenuti generati con l'AI hanno **tre titolari di diritti**: il brand (licenza commerciale sull'asset), il creator (royalty su ogni uso di volto/voce) e la piattaforma (licenza sul modello e tool). Su HeroShots i tre layer sono contrattualmente definiti e visibili nei metadata dell'asset.","I 3 layer di proprietà ",["Brand: uso commerciale pieno entro il tier licenziato.","Creator: royalty per generazione, no trasferimento di proprietà dell'immagine.","Piattaforma: licenza tool, no claim sull'output commerciale del brand."],"Posso vendere l'asset?","Puoi vendere il *prodotto* che l'asset pubblicizza. Non puoi trasferire la licenza sottostante a terzi senza rinegoziare le royalty del creator."),es:_("¿Quién posee el contenido generado con AI? La pregunta de propiedad respondida","La propiedad se divide entre mar
4288ca (licencia comercial), creator (royalty sobre imagen) y plataforma (derechos del modelo). Cómo lo estructura HeroShots.","El contenido generado con AI tiene **tres titulares de derechos**: la marca (licencia comercial), el creator (royalty por cada uso de cara/voz) y la plataforma (licencia de modelo y tool). En HeroShots los tres están definidos contractualmente y visibles en los metadata.","Los 3 layers de propiedad",["Marca: uso comercial pleno dentro del tier licenciado.","Creator: royalty por generación, no transferencia de propiedad de imagen.","Plataforma: licencia tool, sin claim sobre output comercial de la marca."],"¿Puedo vender el asset?","Puedes vender el *producto* que el asset publicita. No puedes transferir la licencia subyacente a terceros sin renegociar las royalties del creator."),de:_("Wem gehört AI-generierter Content? Die Frage der Ownership beantwortet","Ownership teilt sich auf Marke (kommerzielle Lizenz), Creator (Likeness-Royalty) und Plattform (Modell-Rechte). So strukturiert HeroShots es.","AI-generierter Content hat **drei Rechteinhaber**: die Marke (kommerzielle Asset-Lizenz), der Creator (Royalty pro Nutzung von Gesicht/Stimme) und die Plattform (Modell- und Tool-Lizenz). Auf HeroShots sind alle drei vertraglich definiert und im Asset-Metadata sichtbar.","Die 3-Schicht-Ownership",["Marke: volle kommerzielle Nutzung im lizenzierten Tier.","Creator: Royalty pro Generierung, kein Eigentumsübergang am Bild.","Plattform: Tool-Lizenz, kein Anspruch auf kommerziellen Output der Marke."],"Kann ich das Asset verkaufen?","Du kannst das *Produkt*, das das Asset bewirbt, verkaufen. Die zugrunde liegende Lizenz darfst du nicht ohne Neuverhandlung der Creator-Royalties an Dritte übertragen."),fr:_("à qui appartient le contenu généré avec l'AI ? La question de propriété répondue","La propriété se partage entre marque (licence commerciale), créateur (royalty sur image) et plateforme (droits du modèle). Comment HeroShots le structure.","Le contenu généré avec l'AI a **trois titulaires de droits** : la marque (licence commerciale), le créateur (royalty sur chaque usage de visage/voix) et la plateforme (licence modèle et outil). Sur HeroShots les trois sont contractuellement définis et visibles dans les metadata de l'asset.","Les 3 couches de propriété",["Marque : usage commercial plein dans le tier licencié.","Créateur : royalty par génération, pas de transfert de propriété de l'image.","Plateforme : licence outil, pas de claim sur l'output commercial de la marque."],"Puis-je vendre l'asset ?","Tu peux vendre le *produit* que l'asset publicise. Tu ne peux pas transférer la licence sous-jacente à des tiers sans renégocier les royalties du créateur.")}),{...ct("pricing-models-wallet-subscription-pay-per-asset",["operations","pricing"],"2026-07-12",{en:nP({title:"Pricing Models for AI Content: Wallet, Subscription or Pay-per-Asset",metaTitle:"AI Content Pricing: Wallet vs Subscription",description:"The three pricing models for AI UGC â wallet, subscription and pay-per-asset. What each costs on HeroShots and when to pick each one.",lead:"AI content pricing splits into **3 standard models**: wallet (prepaid credits, flexible), subscription (flat monthly, predictable) and pay-per-asset (transactional). HeroShots offers all three, and you can combine them â the wallet covers what you generate, the subscription changes the rate you pay for it.",sections:[{h2:"What generation actually costs",body:"These are the current HeroShots rates, VAT excluded. Images are billed per batch of 4 variants, not per single file, because you almost always want options to choose from.",table:{header:["What you generate","Price","Notes"],rows:[["First batch of a project (4 variants)","â¬4.90","one per project"],["Each further batch (4 variants)","â¬1.90","same project"],["Edit on a chosen image","â¬0.39","â¬0.23 with Pro"],["Video up to 15s","â¬15","â"],["Video up to 30s","â¬35","â"],["Extra retries","â¬5","per 15s block"],["HeroShots Pro","â¬99/month","â15% on videos, no watermark"]]}},{h2:"The three models, and who each one suits",h3:"Wallet â prepaid credits",body:"You top up and draw down as you generate. Best when volume is bursty: a launch, a seasonal campaign, a catalogue refresh. Nothing expires monthly, so an idle month costs nothing."},{h3:"Subscription â HeroShots Pro",body:"A flat â¬99/month that does not buy credits: it changes your rates. Videos cost 15% less, image edits drop from â¬0.39 to â¬0.23, watermarks come off and downloads are direct. It pays for itself once your monthly video spend is high enough that the discount exceeds the fee."},{h3:"Pay-per-asset â packages",body:"Pre-paid volume packages fix a per-video rate up front: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). Useful when you need a predictable number on a budget line rather than a variable wallet."},{h2:"How to choose in practice",steps:["Estimate your monthly video count â this is the variable that moves the most money.","If it is occasional and unpredictable, stay on the wallet and pay per asset.","If you generate videos every week, compare the Pro discount against the â¬99 fee.","If you need a fixed budget line and a known per-video rate, take a package.","Re-c
4288heck after one full month with real usage rather than an estimate."]}],faqs:[{q:"Can I switch between models?",a:"Yes â you can upgrade or downgrade any month, and the wallet keeps working underneath either way."},{q:"Do I pay per image or per batch?",a:"Per batch. The first batch in a project costs â¬4.90 and returns 4 variants; each further batch in the same project is â¬1.90."},{q:"What does HeroShots Pro actually change?",a:"It is not a credit bundle. For â¬99/month it removes watermarks, enables direct downloads, takes 15% off every video and drops image edits from â¬0.39 to â¬0.23."},{q:"Is there a free way to try it?",a:"Yes â the free plan includes 10 watermarked images per month and one video preview, with no credit card required."},{q:"Do creator fees change the price?",a:"Only if you use a real catalog model. That adds 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee."}]}),it:_("Modelli di pricing per contenuti AI: wallet, subscription o pay-per-asset","I 3 modelli standard di pricing per AI UGC: wallet (crediti prepagati), subscription (canone mensile) e pay-per-asset. Quando scegliere ciascuno.","Il pricing dei contenuti AI si divide in **3 modelli standard**: wallet (crediti prepagati, flessibile), subscription (canone mensile, prevedibile) e pay-per-asset (transazionale). HeroShots li offre tutti e tre; scegli per volume mensile.","Scegli per volume",["Wallet: volumi a picchi (campagne, lanci).","Subscription: costante 50â500 asset/mese â Pro (â¬99/mese) abbassa il prezzo per asset.","Pay-per-asset: uso occasionale, <30 asset/mese."],"Posso cambiare?","Sì â upgrade/downgrade ogni mese. I crediti wallet inutilizzati restano validi 90 giorni."),es:_("Modelos de pricing para contenido AI: wallet, suscripción o pay-per-asset","Los 3 modelos estándar de pricing para AI UGC: wallet (créditos prepagos), suscripción (cuota mensual) y pay-per-asset. Cuándo elegir cada uno.","El pricing de contenido AI se divide en **3 modelos estándar**: wallet (créditos prepagos, flexible), suscripción (cuota mensual, predecible) y pay-per-asset (transaccional). HeroShots los ofrece los tres; elige por volumen mensual.","Elige por volumen",["Wallet: volúmenes en picos (campañas, lanzamientos).","Suscripción: constante 50â500 assets/mes â Pro (â¬99/mes) baja el precio por asset.","Pay-per-asset: uso ocasional, <30 assets/mes."],"¿Puedo cambiar?","Sà â upgrade/downgrade cada mes. Los créditos wallet no usados se mantienen 90 dÃas."),de:_("Pricing-Modelle für AI-Content: Wallet, Subscription oder Pay-per-Asset","Die 3 Standard-Pricing-Modelle für AI-UGC: Wallet (Prepaid-Credits), Subscription (Flat-Monatlich) und Pay-per-Asset. Wann was wählen.","AI-Content-Pricing teilt sich in **3 Standard-Modelle**: Wallet (Prepaid-Credits, flexibel), Subscription (Flat monatlich, planbar) und Pay-per-Asset (transaktional). HeroShots bietet alle drei â wähle nach Monatsvolumen.","Nach Volumen wählen",["Wallet: stoÃweise Volumen (Kampagnen, Launches).","Subscription: konstant 50â500 Assets/Monat â Pro (â¬99/Monat) senkt den Preis pro Asset.","Pay-per-Asset: gelegentlich, <30 Assets/Monat."],"Kann ich wechseln?","Ja â monatlich Upgrade/Downgrade. Unbenutzte Wallet-Credits gelten 90 Tage."),fr:_("Modèles de pricing pour le contenu AI : wallet, abonnement ou pay-per-asset","Les 3 modèles standards de pricing pour l'AI UGC : wallet (crédits prépayés), abonnement (forfait mensuel) et pay-per-asset. Quand choisir chacun.","Le pricing du contenu AI se divise en **3 modèles standards** : wallet (crédits prépayés, flexible), abonnement (forfait mensuel, prévisible) et pay-per-asset (transactionnel). HeroShots propose les trois â choisis selon le volume mensuel.","Choisir selon le volume",["Wallet : volumes en pic (campagnes, lancements).","Abonnement : constant 50â500 assets/mois â Pro (â¬99/mois) baisse le prix par asset.","Pay-per-asset : usage occasionnel, <30 assets/mois."],"Puis-je changer ?","Oui â upgrade/downgrade chaque mois. Les crédits wallet inutilisés restent valides 90 jours.")}),updated:"2026-07-26"},ct("manage-retries-without-eroding-margin-ai-content",["operations","retries","pricing"],"2026-07-13",{en:_("How to Manage Retries Without Losing Margin","Retries are the silent killer of AI content margins. The HeroShots retry policy and how to keep the cost per accepted asset under control.","Retries can quietly **inflate the true cost per accepted asset** if uncapped. HeroShots applies a per-prompt retry budget and surfaces it in the dashboard so you optimize prompts, not pay for failures.","Margin-protection rules",["Hard cap: a retry budget set per prompt, before generation.","Soft warning when retry-rate per workspace >25%.","Prompt-quality score visible before generation.","Failed generations don't bill royalties."],"Why do retries happen?","Usually unclear prompts, conflicting style instructions or out-of-policy content. Improving prompt clarity is the fastest way to bring the retry rate down."),it:_("Come gestire i retry senza erodere il margine sui contenuti AI","I retry sono il silent killer dei margini AI. La policy HeroShots e come tenere sotto controllo il costo per asset accettato.","I retry possono **far lievitare silenziosamente il costo reale per asset accettato** se non cappati. HeroShots applica un budget retry per prompt e lo mostra nella dashboard, così ottimizzi i prompt invece di pagare i fallimenti.","Regole di protezione margine",["Cap rigido: un budget retry definito per prompt, prima della generazione.","Warning soft se il retry-rate per workspace > 25%.","Score di qualità del prompt visibile prima della generazione.","Le generazioni fallite non fatturano royalty."],"Perché succedono i retry?","Di solito prompt poco chiari, istruzioni di stile in conflitto o contenuto fuori policy. Migliorare la chiarezza del prompt è il modo più rapido per far scendere il retry rate."),es:_("Cómo gestionar los retries sin erosionar el margen del contenido AI","Los retries son el asesino silencioso de los márgenes AI. Policy HeroShots y cómo mantener bajo control el coste por asset aceptado.","Los retries pueden **disparar silenciosamente el coste real por asset aceptado** si no se capean. HeroShots aplica un budget retry por prompt y lo muestra en el dashboard, asà optimizas prompts en vez de pagar fallos.","Reglas de protección de margen",["Cap duro: un budget de retries definido por prompt, antes de generar.","Warning suave si retry-rate por workspace >
428825%.","Score de calidad del prompt visible antes de generar.","Generaciones fallidas no facturan royalties."],"¿Por qué pasan retries?","Normalmente prompts poco claros, instrucciones de estilo en conflicto o contenido fuera de policy. Mejorar la claridad del prompt es la vÃa más rápida para bajar el retry rate."),de:_("Wie du Retries managst, ohne die Marge auf AI-Content zu zerstören","Retries sind der stille Killer von AI-Content-Margen. HeroShots-Retry-Policy und wie du die Kosten pro akzeptiertem Asset unter Kontrolle hältst.","Retries können die **wirklichen Kosten pro akzeptiertem Asset still in die Höhe treiben**, wenn sie ungecappt sind. HeroShots setzt ein Retry-Budget pro Prompt und zeigt es im Dashboard â so optimierst du Prompts, statt für Fehler zu zahlen.","Margenschutz-Regeln",["Hartes Cap: ein Retry-Budget pro Prompt, vor der Generierung festgelegt.","Soft-Warning bei Retry-Rate >25% pro Workspace.","Prompt-Qualitätsscore sichtbar vor Generierung.","Fehlgeschlagene Generierungen lösen keine Royalty aus."],"Warum passieren Retries?","Meist unklare Prompts, widersprüchliche Stilanweisungen oder Out-of-Policy-Inhalt. Bessere Prompt-Klarheit ist der schnellste Hebel, um die Retry-Rate zu senken."),fr:_("Comment gérer les retries sans éroder la marge sur le contenu AI","Les retries sont le tueur silencieux des marges AI. Policy HeroShots et comment garder le coût par asset accepté sous contrôle.","Les retries peuvent **faire grimper silencieusement le coût réel par asset accepté** s'ils ne sont pas cappés. HeroShots applique un budget retry par prompt visible dans le dashboard â tu optimises les prompts au lieu de payer les échecs.","Règles de protection de marge",["Cap dur : un budget de retries défini par prompt, avant génération.","Warning soft si retry-rate par workspace >25%.","Score qualité du prompt visible avant génération.","Les générations échouées ne facturent pas de royalty."],"Pourquoi des retries ?","Habituellement prompts peu clairs, instructions de style en conflit ou contenu hors policy. Améliorer la clarté du prompt est le levier le plus rapide pour faire baisser le retry rate.")}),ct("metadata-asset-library-organize-audit-reuse",["operations","asset-library"],"2026-07-14",{en:_("Metadata and Asset Library: Audit and Reuse","Without metadata, AI assets become a junk drawer. The 6 metadata fields every AI UGC asset should carry, and why.","Without proper metadata, an AI asset library becomes a **searchable junk drawer**. The 6 fields that turn it into a reusable engine: creator ID, consent ID, prompt, model version, brand prompt template, license tier.","The 6 mandatory metadata fields",["Creator ID â likeness used.","Consent ID â signed agreement reference.","Prompt â exact text used.","Model version â tool revision.","Brand prompt template â for reuse and consistency.","License tier â territory, term, channels."],"Can I export metadata?","Yes â HeroShots exports JSON or CSV per workspace, monthly or on demand, for legal audit and BI dashboards."),it:_("Metadata e libreria asset: come organizzare i contenuti per audit e riutilizzo","Senza metadata, gli asset AI diventano un cassetto del disordine. I 6 campi metadata che ogni asset UGC AI dovrebbe avere, e perché.","Senza metadata adeguati, la libreria di asset AI diventa un **cassetto del disordine ricercabile**. I 6 campi che la trasformano in motore riutilizzabile: ID creator, ID consenso, prompt, versione modello, template prompt brand, tier licenza.","I 6 campi obbligatori",["ID creator â immagine usata.","ID consenso â riferimento accordo firmato.","Prompt â testo esatto usato.","Versione modello â revisione tool.","Template prompt brand â per riuso e consistenza.","Tier licenza â territorio, durata, canali."],"Posso esportare i metadata?","Sì â HeroShots esporta JSON o CSV per workspace, mensilmente o on-demand, per audit legale e dashboard BI."),es:_("Metadata y librerÃa de assets: cómo organizar contenido para audit y reuso","Sin metadata, los assets AI se vuelven un cajón desastre. Los 6 campos metadata que todo asset AI UGC deberÃa llevar, y por qué.","Sin metadata adecuados, la librerÃa de assets AI se vuelve un **cajón desastre buscable**. Los 6 campos que la convierten en motor reusable: ID creator, ID consentimiento, prompt, versión de modelo, template prompt brand, tier licencia.","Los 6 campos obligatorios",["ID creator â imagen usada.","ID consentimiento â referencia acuerdo firmado.","Prompt â texto exacto usado.","Versión de modelo â revisión tool.","Template prompt brand â para reuso y consistencia.","Tier licencia â territorio, plazo, canales."],"¿Puedo exportar la metadata?","Sà â HeroShots exporta JSON o CSV por workspace, mensual o on-demand, para audit legal y dashboards BI."),de:_("Metadata und Asset-Library: Wie du Content für Audit und Reuse organisierst","Ohne Metadata wird die AI-Asset-Library zur durchsuchbaren Krimskramskiste. 6 Metadata-Felder, die jedes AI-UGC-Asset führen sollte â und warum.","Ohne ordentliche Metadata wird eine AI-Asset-Library zur **durchsuchbaren Krimskramskiste**. 6 Felder, die sie zur wiederverwendbaren Engine machen: Creator-ID, Consent-ID, Prompt, Modell-Version, Brand-Prompt-Template, Lizenz-Tier.","Die 6 Pflichtfelder",["Creator-ID â verwendete Likeness.","Consent-ID â Referenz auf signiertes Abkommen.","Prompt â exakter Text.","Modell-Version â Tool-Revision.","Brand-Prompt-Template â für Reuse und Konsistenz.","Lizenz-Tier â Territorium, Laufzeit, Kanäle."],"Kann ich Metadata exportieren?","Ja â HeroShots exportiert JSON oder CSV pro Workspace, monatlich oder on demand, für Legal-Audit und BI-Dashboards."),fr:_("Metadata et bibliothèque d'assets : comment organiser le contenu pour audit et reuse","Sans metadata, les assets AI deviennent un tiroir bordélique. Les 6 champs metadata que chaque asset UGC AI devrait porter, et pourquoi.","Sans metadata appropriée, la bibliothèque d'assets AI devient un **tiroir bordélique cherchable**. Les 6 champs qui la transforment en moteur réutilisable : ID créateur, ID consentement, prompt, version modèle, template prompt marque, tier licence.","Les 6 champs obligatoires",["ID créateur â likeness utilisée.","ID consentement â référence accord signé.","Prompt â texte exact utilisé.","Version modèle â révision outil.","Template prompt marque â pour reuse et cohérence.","Tier licence â territoire, durée, canaux."],"Puis-je exporter la metadata ?","Oui â HeroShots exporte JSON ou CSV par workspace, mensuel ou à la demande, pour audit légal et dashboards BI.")}),ct("connect-ugc-campaigns-measure-performance",["operations","measurement","performance"],"2026-07-15",{en:_("Connect UGC to Campaigns and Measure Performance","Tagging every AI asset with campaign ID, hook family and creator ID turns content into a measurable performance engine. The 4-field schema that works.","Untagged AI content can't tell you what's winning. The fix is a **4-field tagging schema** applied at generation time: campaign ID, hook family, creator ID, format. Plug into Meta and TikTok ad reporting via UTMs that mirror the same schema.","The 4-field measurement schema",["Campaign ID â links asset to brief.","Hook family â POV, contrarian, listicle, etc.","Creator ID â for royalty + performance attribution.","Format â 9:16 video, 4:5 static, etc."],"Can HeroShots auto-push UTMs?","Yes â when you connect a Meta or TikTok ad account, HeroShots injects UTMs matching the schema so reporting joins automatically."),it:_("Come collegare i contenuti UGC alle campagne e misurarne le performance","Tagging di ogni asset AI con campaign ID, famiglia hook e ID creator trasforma il contenuto in un motore di performance misurabile. Lo schema a 4 campi.","Il contenuto AI senza tag non ti dice cosa sta vincendo. La soluzione: uno **schema di tag a 4 campi** applicato in fase di generazione: campaign ID, famiglia hook, ID creator, formato. Si collega al reporting ad Meta e TikTok via UTM che rispecchiano lo stesso schema.","Lo schema di misurazione a 4 campi",["Campaign ID â collega l'asset al brief.","Famiglia hook â POV, contrarian, listicle, etc.","ID creator â per royalty + attribuzione performance.","Formato â video 9:16, statica 4:5, etc."],"HeroShots può auto-pushare UTM?","Sì â collegando un account ad Meta o TikTok, HeroShots inietta UTM coerenti con lo schema così il reporting si unisce in automatico."),es:_("Cómo conectar el contenido UGC a las campañas y medir su performance","Etiquetar cada asset AI con campaign ID, familia de hook e ID creator convierte el contenido en motor de performance medible. Schema de 4 campos.","El contenido AI sin tags no te dice qué está ganando. La solución: un **schema de tagging de 4 campos** aplicad
4288o en la generación: campaign ID, familia de hook, ID creator, formato. Se conecta al reporting de ads Meta y TikTok vÃa UTMs que reflejan el mismo schema.","El schema de medición de 4 campos",["Campaign ID â vincula asset al brief.","Familia de hook â POV, contrarian, listicle, etc.","ID creator â para royalty + atribución performance.","Formato â vÃdeo 9:16, estático 4:5, etc."],"¿HeroShots puede auto-pushar UTMs?","Sà â al conectar una cuenta de ads Meta o TikTok, HeroShots inyecta UTMs coherentes con el schema asà el reporting se une automáticamente."),de:_("Wie du UGC-Content mit Kampagnen verknüpfst und Performance misst","Jedes AI-Asset mit Campaign-ID, Hook-Familie und Creator-ID taggen macht Content zur messbaren Performance-Engine. Das 4-Felder-Schema.","Untaggter AI-Content sagt dir nicht, was gewinnt. Lösung: ein **4-Felder-Tagging-Schema** zur Generierungszeit: Campaign-ID, Hook-Familie, Creator-ID, Format. Ãber UTMs an Meta- und TikTok-Ad-Reporting koppeln, die das gleiche Schema spiegeln.","4-Felder-Messschema",["Campaign-ID â verknüpft Asset mit Brief.","Hook-Familie â POV, Contrarian, Listicle etc.","Creator-ID â für Royalty + Performance-Attribution.","Format â 9:16-Video, 4:5-Static etc."],"Pusht HeroShots UTMs automatisch?","Ja â beim Connect eines Meta- oder TikTok-Ad-Accounts injiziert HeroShots UTMs gemäà Schema, sodass das Reporting automatisch joint."),fr:_("Comment connecter le contenu UGC aux campagnes et mesurer la performance","Tagger chaque asset AI avec campaign ID, famille de hook et ID créateur transforme le contenu en moteur de performance mesurable. Le schéma 4 champs.","Le contenu AI sans tags ne te dit pas ce qui gagne. Solution : un **schéma de tagging à 4 champs** appliqué à la génération : campaign ID, famille de hook, ID créateur, format. Branché au reporting ads Meta et TikTok via UTMs qui miroitent le même schéma.","Le schéma de mesure à 4 champs",["Campaign ID â lie l'asset au brief.","Famille de hook â POV, contrarian, listicle, etc.","ID créateur â pour royalty + attribution performance.","Format â vidéo 9:16, statique 4:5, etc."],"HeroShots peut-il auto-pousser des UTMs ?","Oui â en connectant un compte ads Meta ou TikTok, HeroShots injecte des UTMs cohérents avec le schéma pour que le reporting se joigne automatiquement.")})],oP=[ct("generate-product-ugc-inside-claude-pro",["integrations","claude","ai-ugc"],"2026-07-08",{en:_("How to Generate Product UGC Inside Claude Pro","The HeroShots Skill for Claude Pro lets you brief, generate, and iterate AI UGC without leaving the chat. Setup takes 60 seconds.","The **HeroShots Skill for Claude Pro** turns any chat into a mini AI-UGC studio: you attach a product image, describe the scene and pose, mention @heroshots, and the generated visual comes back inline. Setup takes 60 seconds and generations consume your normal HeroShots wallet â no separate billing, no new seats.","Setup in 60 seconds",["Open Claude Pro â Settings â Skills â Add Skill and search HeroShots.","Install and sign in with your HeroShots workspace to pick the billing project.","In any chat, type @heroshots, attach a product image and describe the model, location and pose.","The Skill returns the generated image inline â same consent, watermark and creator-royalty rules as the app."],"Does the Skill work on the free Claude plan?","No â Skills require Claude Pro, Teams or Enterprise. On the HeroShots side any plan works, including Free."),it:_("Come generare product UGC direttamente dentro Claude Pro","La Skill HeroShots per Claude Pro ti permette di briefare, generare e iterare AI UGC senza uscire dalla chat. Setup in 60 secondi.","La **Skill HeroShots per Claude Pro** trasforma qualsiasi chat in un mini studio AI UGC: alleghi un'immagine prodotto, descrivi scena e posa, menzioni @heroshots e ricevi il visual generato inline. Setup in 60 secondi e le generazioni consumano il tuo wallet HeroShots â nessuna fatturazione separata, nessun seat aggiuntivo.","Setup in 60 secondi",["Apri Claude Pro â Settings â Skills â Add Skill e cerca HeroShots.","Installa e accedi con il workspace HeroShots per scegliere il progetto su cui addebitare.","In qualsiasi chat digita @heroshots, alleghi l'immagine prodotto e descrivi model, location e posa.","La Skill restituisce l'immagine generata nel thread â stesse regole di consenso, watermark e royalty della piattaforma."],"La Skill funziona sul piano Claude free?","No â le Skills richiedono Claude Pro, Teams o Enterprise. Lato HeroShots funziona qualsiasi piano, Free incluso."),es:_("Cómo generar product UGC directamente dentro de Claude Pro","La Skill de HeroShots para Claude Pro te permite briefear, generar e iterar AI UGC sin salir del chat. Setup en 60 segundos.","La **Skill de HeroShots para Claude Pro** convierte cualquier chat en un mini estudio de AI UGC: adjuntas una imagen de producto, describes escena y pose, mencionas @heroshots y recibes el visual generado inline. Setup en 60 segundos y las generaciones consumen tu wallet de HeroShots â sin facturación aparte ni seats nuevos.","Setup en 60 segundos",["Abre Claude Pro â Settings â Skills â Add Skill y busca HeroShots.","Instala y entra con tu workspace de HeroShots para elegir el proyecto a facturar.","En cualquier chat escribe @heroshots, adjuntas la imagen de producto y describes model, location y pose.","La Skill devuelve la imagen generada en el hilo â mismas reglas de consentimiento, watermark y royalties que la app."],"¿La Skill funciona con el plan Claude gratis?","No â las Skills necesitan Claude Pro, Teams o Enterprise. En HeroShots funciona cualquier plan, incluido Free."),de:_("So generierst du Produkt-UGC direkt in Claude Pro","Die HeroShots Skill für Claude Pro lässt dich AI UGC briefen, generieren und iterieren, ohne den Chat zu verlassen. Setup in 60 Sekunden.","Die **HeroShots Skill für Claude Pro** macht aus jedem Chat ein kleines AI-UGC-Studio: du hängst ein Produktbild an, beschreibst Szene und Pose, erwähnst @heroshots und bekommst das generierte Visual inline zurück. Setup in 60 Sekunden â Generierungen laufen auf dein normales HeroShots-Wallet, ohne separate Abrechnung oder Extra-Seats.","Setup in 60 Sekunden",["Ãffne Claude Pro â Settings â Skills â Add Skill und suche HeroShots.","Installiere und logge dich mit deinem HeroShots-Workspace ein, um das abrechnende Projekt zu wählen.","In jedem Chat @heroshots tippen, Produktbild anhängen und Model, Location und Pose beschreiben.","Die Skill liefert das generierte Bild im Thread â gleiche Consent-, Wasserzeichen- und Royalty-Regeln wie in der App."],"Funktioniert die Skill mit dem kostenlosen Claude-Plan?","Nein â Skills brauchen Claude Pro, Teams oder Enterprise. HeroShots-seitig funktioniert jeder Plan, auch Free."),fr:_("Comment générer du product UGC directement dans Claude Pro","La Skill HeroShots pour Claude Pro te permet de briefer, générer et itérer de l'AI UGC sans quitter le chat. Setup en 60 secondes.","La **Skill HeroShots pour Claude Pro** transforme n'importe quel chat en mini studio AI UGC : tu joins une image produit, tu décris la scène et la pose, tu mentionnes @heroshots et tu reçois le visuel généré inline. Setup en 60 secondes et les générations consomment ton wallet HeroShots â pas de facturation à part, pas de nouveau seat.","Setup en 60 secondes",["Ouvre Claude Pro â Settings â Skills â Add Skill et cherche HeroShots.","Installe puis connecte-toi avec ton workspace HeroShots pour choisir le projet à facturer.","Dans n'importe quel chat, tape @heroshots, joins l'image produit et décris model, location et pose.","La Skill renvoie l'image générée dans le thread â mêmes règles de consentement, watermark et royalties que l'app."],"L
4288a Skill marche avec le plan Claude gratuit ?","Non â les Skills nécessitent Claude Pro, Teams ou Enterprise. Côté HeroShots n'importe quel plan fonctionne, y compris Free.")}),ct("amazon-url-to-ai-ugc-in-60-seconds",["integrations","amazon","ecommerce","ai-ugc"],"2026-07-08",{en:_("From Amazon URL to Product Shot in 60 Seconds","Paste an Amazon product URL, and HeroShots imports images, title and specs â ready to combine with your model, location and pose. Here's the workflow.","You paste an Amazon product URL, HeroShots pulls **images, title, brand, bullet points and technical specs**, and you get a ready-to-shoot product asset in your workspace. Combine it with a real model or AI avatar, a location and a pose, and you generate on-brand product UGC in about 60 seconds â no manual upload, no rename dance.","The 3-step workflow",["Products â Import from Amazon and paste the URL (US, IT, DE, ES, FR, UK).","Review the extracted asset: images in the highest resolution available, title, brand, bullets, specs â edit anything.","Pick model, location and pose, write a prompt, generate. Same watermark and royalty rules as any HeroShots product."],"Can I import a whole Amazon catalog at once?","Yes â paste up to 50 URLs at a time, or up to 500 on Pro workspaces. Each URL becomes its own product in your project."),it:_("Da URL Amazon a product shot on-brand in 60 secondi","Incolli un URL prodotto Amazon e HeroShots importa immagini, titolo e specifiche â pronte per essere combinate con model, location e posa.","Incolli un URL prodotto Amazon, HeroShots prende **immagini, titolo, brand, bullet e specifiche tecniche**, e ottieni un asset prodotto pronto nel workspace. Lo abbini a un model reale o AI avatar, a una location e a una posa, e generi product UGC on-brand in circa 60 secondi â nessun upload manuale, nessun rename.","Il workflow in 3 step",["Products â Import da Amazon e incolli l'URL (US, IT, DE, ES, FR, UK).","Rivedi l'asset estratto: immagini nella risoluzione più alta disponibile, titolo, brand, bullet, specifiche â puoi modificare tutto.","Scegli model, location e posa, scrivi il prompt e generi. Stesse regole di watermark e royalty degli altri prodotti HeroShots."],"Posso importare un intero catalogo Amazon in una volta?","Sì â fino a 50 URL alla volta, o fino a 500 sui workspace Pro. Ogni URL diventa un prodotto nel tuo progetto."),es:_("De URL de Amazon a product shot on-brand en 60 segundos","Pega un URL de producto de Amazon y HeroShots importa imágenes, tÃtulo y specs â listos para combinar con model, location y pose.","Pegas un URL de producto de Amazon, HeroShots trae **imágenes, tÃtulo, brand, bullet points y specs técnicas** y consigues un asset listo para shootear en tu workspace. Lo combinas con un model real o AI avatar, una location y una pose, y generas product UGC on-brand en unos 60 segundos â sin upload manual, sin renombrar nada.","El workflow en 3 pasos",["Products â Import desde Amazon y pegas el URL (US, IT, DE, ES, FR, UK).","Revisa el asset extraÃdo: imágenes en la mejor resolución, tÃtulo, brand, bullets, specs â puedes editarlo todo.","Eliges model, location y pose, escribes el prompt y generas. Mismas reglas de watermark y royalties que el resto de productos HeroShots."],"¿Puedo importar un catálogo Amazon entero de una vez?","Sà â hasta 50 URLs a la vez, o hasta 500 en workspaces Pro. Cada URL se convierte en un producto de tu proyecto."),de:_("Von der Amazon-URL zum on-brand Produktshot in 60 Sekunden","Amazon-Produkt-URL einfügen â HeroShots importiert Bilder, Titel und Specs, bereit zum Kombinieren mit Model, Location und Pose.","Du fügst eine Amazon-Produkt-URL ein, HeroShots holt **Bilder, Titel, Brand, Bullet Points und technische Specs**, und du bekommst ein einsatzbereites Produkt-Asset in deinem Workspace. Kombinier es mit einem realen Model oder AI Avatar, einer Location und einer Pose, und du generierst in etwa 60 Sekunden on-brand Produkt-UGC â kein manueller Upload, kein Rename-Chaos.","Der 3-Schritte-Workflow",["Products â Import from Amazon und URL einfügen (US, IT, DE, ES, FR, UK).","Extrahiertes Asset prüfen: Bilder in höchster Auflösung, Titel, Brand, Bullets, Specs â alles editierbar.","Model, Location und Pose wählen, Prompt schreiben, generieren. Gleiche Wasserzeichen- und Royalty-Regeln wie bei jedem HeroShots-Produkt."],"Kann ich einen ganzen Amazon-Katalog auf einmal importieren?","Ja â bis zu 50 URLs auf einmal, oder bis zu 500 in Pro-Workspaces. Jede URL wird ein eigenes Produkt im Projekt."),fr:_("D'une URL Amazon à un product shot on-brand en 60 secondes","Colle une URL produit Amazon et HeroShots importe images, titre et specs â prêts à combiner avec model, location et pose.","Tu colles une URL produit Amazon, HeroShots récupère **images, titre, brand, bullet points et specs techniques**, et tu obtiens un asset prêt à shooter dans ton workspace. Combine-le avec un model réel ou un AI avatar, une location et une pose, et tu génères du product UGC on-brand en environ 60 secondes â pas d'upload manuel, pas de rename.","Le workflow en 3 étapes",["Products â Import depuis Amazon et colle l'URL (US, IT, DE, ES, FR, UK).","Vérifie l'asset extrait : images dans la meilleure résolution, titre, brand, bullets, specs â tout est éditable.","Choisis model, location et pose, écris le prompt, génère. Mêmes règles de watermark et royalties que les autres produits HeroShots."],"Je peux importer un catalogue Amazon entier d'un coup ?","Oui â jusqu'à 50 URL à la fois, ou jusqu'à 500 sur les workspaces Pro. Chaque URL devient un produit de ton projet.")}),ct("ai-ugc-workflows-for-amazon-sellers",["integrations","amazon","sellers","ecommerce"],"2026-07-09",{en:_("AI UGC Workflows for Amazon Sellers","How Amazon sellers use HeroShots' URL import to turn any product listing into paid social creative â without a photoshoot.","Amazon sellers live inside their listings. HeroShots' **Amazon URL Import** is built for them: bulk-paste ASIN URLs, get a full HeroShots project mirroring the store, and generate paid social creative variants per SKU without ever downloading a single image.","The end-to-e
4288nd workflow",["Export your ASIN list to a plain text file (one URL per line).","In HeroShots, create a project per Amazon marketplace (US, IT, DE, ES, FR, UK) and bulk import.","Assign a model or AI avatar per category (e.g., beauty vs. home vs. sports).","Generate 3â5 variants per SKU for A/B testing paid social; watermarks removed on Pro.","Route winning creatives to Meta/TikTok/Google via CSV export or the HeroShots API."],"Is this different from just scraping Amazon?","Yes. HeroShots pulls structured product data â title, bullets, dimensions â so prompts stay accurate. And we don't store the Amazon page: only the extracted asset lives in your workspace."),it:_("Workflow AI UGC per seller Amazon: dal catalogo alla campagna","Come i seller Amazon usano l'import URL di HeroShots per trasformare qualsiasi listing in creative paid social â senza photoshoot.","I seller Amazon vivono dentro i loro listing. L'**Import URL Amazon** di HeroShots è pensato per loro: incolli in bulk gli URL ASIN, ottieni un progetto HeroShots che riflette lo store e generi varianti di creative paid social per SKU, senza scaricare mai un'immagine.","Il workflow end-to-e
4288nd",["Esporta la lista ASIN in un file di testo (un URL per riga).","In HeroShots crea un progetto per marketplace Amazon (US, IT, DE, ES, FR, UK) e fai il bulk import.","Assegna un model o AI avatar per categoria (es. beauty vs casa vs sport).","Genera 3â5 varianti per SKU per A/B test paid social; watermark rimossi su Pro.","Manda i creative vincenti su Meta/TikTok/Google via export CSV o API HeroShots."],"à diverso dal fare scraping di Amazon?","Sì. HeroShots prende dati prodotto strutturati â titolo, bullet, dimensioni â così i prompt restano precisi. E non salviamo la pagina Amazon: solo l'asset estratto vive nel tuo workspace."),es:_("Workflows de AI UGC para sellers de Amazon: del catálogo a la campaña","Cómo los sellers de Amazon usan el import por URL de HeroShots para convertir cualquier listing en creative paid social â sin photoshoot.","Los sellers de Amazon viven dentro de sus listings. El **Import URL de Amazon** de HeroShots está pensado para ellos: pegas en bulk los URLs ASIN, obtienes un proyecto HeroShots que refleja la tienda y generas variantes de creative paid social por SKU, sin descargar ni una imagen.","El workflow end-to-e
4288nd",["Exporta tu lista de ASIN a un archivo de texto (un URL por lÃnea).","En HeroShots crea un proyecto por marketplace Amazon (US, IT, DE, ES, FR, UK) y haces bulk import.","Asigna un model o AI avatar por categorÃa (por ej. beauty vs home vs deporte).","Genera 3â5 variantes por SKU para A/B test paid social; watermarks retirados en Pro.","Manda los creatives ganadores a Meta/TikTok/Google vÃa export CSV o API de HeroShots."],"¿Es distinto de scrapear Amazon?","SÃ. HeroShots trae datos de producto estructurados â tÃtulo, bullets, dimensiones â asà los prompts quedan precisos. Y no guardamos la página de Amazon: sólo el asset extraÃdo vive en tu workspace."),de:_("AI-UGC-Workflows für Amazon-Seller: Vom Katalog zur Kampagne","Wie Amazon-Seller den URL-Import von HeroShots nutzen, um jedes Listing in Paid-Social-Creative zu verwandeln â ohne Photoshoot.","Amazon-Seller leben in ihren Listings. Der **Amazon-URL-Import von HeroShots** ist für sie gebaut: ASIN-URLs im Bulk einfügen, ein HeroShots-Projekt bekommen, das den Store spiegelt, und Paid-Social-Creative-Varianten pro SKU generieren â ohne je ein Bild herunterzuladen.","Der End-to-End-Workflow",["ASIN-Liste in eine Textdatei exportieren (eine URL pro Zeile).","In HeroShots pro Amazon-Marketplace (US, IT, DE, ES, FR, UK) ein Projekt anlegen und Bulk-Import fahren.","Ein Model oder AI Avatar pro Kategorie zuweisen (z. B. Beauty vs. Home vs. Sport).","3â5 Varianten pro SKU für Paid-Social-A/B-Tests generieren; Wasserzeichen entfernt auf Pro.","Gewinner via CSV-Export oder HeroShots-API an Meta/TikTok/Google routen."],"Ist das anders als Amazon zu scrapen?","Ja. HeroShots holt strukturierte Produktdaten â Titel, Bullets, MaÃe â damit Prompts präzise bleiben. Und wir speichern die Amazon-Seite nicht: nur das extrahierte Asset liegt in deinem Workspace."),fr:_("Workflows AI UGC pour les sellers Amazon : du catalogue à la campagne","Comment les sellers Amazon utilisent l'import URL de HeroShots pour transformer n'importe quel listing en creative paid social â sans photoshoot.","Les sellers Amazon vivent dans leurs listings. L'**Import URL Amazon** de HeroShots est fait pour eux : tu colles en bulk des URL ASIN, tu obtiens un projet HeroShots qui reflète la boutique et tu génères des variantes de creative paid social par SKU, sans télécharger la moindre image.","Le workflow end-to-e
4288nd",["Exporte ta liste d'ASIN dans un fichier texte (une URL par ligne).","Dans HeroShots crée un projet par marketplace Amazon (US, IT, DE, ES, FR, UK) et fais le bulk import.","Assigne un model ou AI avatar par catégorie (ex. beauty vs maison vs sport).","Génère 3â5 variantes par SKU pour A/B test paid social ; watermarks retirés sur Pro.","Envoie les creatives gagnants sur Meta/TikTok/Google via export CSV ou l'API HeroShots."],"C'est différent de scraper Amazon ?","Oui. HeroShots récupère des données produit structurées â titre, bullets, dimensions â pour que les prompts restent précis. Et on ne stocke pas la page Amazon : seul l'asset extrait vit dans ton workspace.")}),ct("claude-heroshots-prompt-templates",["integrations","claude","prompts"],"2026-07-10",{en:_("7 Claude Prompt Templates for Product Photos","Seven copy-paste prompt templates for the HeroShots Skill inside Claude â lifestyle, PDP hero, seasonal, unboxing and more.","The best way to shortcut HeroShots inside Claude is a **library of copy-paste prompt templates**. Below are 7 ready-to-use structures for common product photography needs. Attach the product image, paste the template, tweak the placeholders, and mention @heroshots.","The 7 templates",["PDP hero: on white background, front angle, soft studio light, no props.","Lifestyle in-context: real home setting matching the target market's demographic.","Social ad hook: dynamic three-quarter angle, one clear focal point, 4:5 crop.","Seasonal campaign: swap the location and lighting to match the current season.","Unboxing frame: hands holding the product, natural indoor light.","Comparison shot: side-by-side with a reference object for scale.","Localised variant: same product, different model + location for a specific market."],"Do templates work across languages?","Yes. Write the template in the language you're most comfortable with â Claude and HeroShots both handle EN/IT/ES/DE/FR prompts."),it:_("Claude + HeroShots: 7 template di prompt per product photography","Sette template pronti da copiare per la Skill HeroShots dentro Claude â lifestyle, PDP hero, stagionali, unboxing e altro.","Il modo migliore per velocizzare HeroShots dentro Claude è una **libreria di prompt template da copiare e incollare**. Sotto trovi 7 strutture pronte per le esigenze di product photography più comuni. Alleghi l'immagine prodotto, incolli il template, aggiusti i placeholder e menzioni @heroshots.","I 7 template",["PDP hero: sfondo bianco, angolo frontale, luce soft da studio, senza prop.","Lifestyle in contesto: casa reale coerente con la demografia del mercato target.","Hook social ad: angolo dinamico three-quarter, un solo focal point, crop 4:5.","Campagna stagionale: cambia location e luce per matchare la stagione corrente.","Frame unboxing: mani che tengono il prodotto, luce indoor naturale.","Comparison shot: side-by-side con un oggetto di riferimento per la scala.","Variante localizzata: stesso prodotto, model e location diversi per un mercato specifico."],"I template funzionano in più lingue?","Sì. Scrivi il template nella lingua in cui sei più a tuo agio â sia Claude che HeroShots gestiscono prompt EN/IT/ES/DE/FR."),es:_("Claude + HeroShots: 7 plantillas de prompt para product photography","Siete plantillas listas para copiar para la Skill HeroShots dentro de Claude â lifestyle, PDP hero, estacionales, unboxing y más.","La mejor manera de acelerar HeroShots dentro de Claude es una **librerÃa de prompt templates para copiar y pegar**. Debajo tienes 7 estructuras listas para las necesidades más comunes de product photography. Adjuntas la imagen del producto, pegas la plantilla, ajustas los placeholders y mencionas @heroshots.","Las 7 plantillas",["PDP hero: fondo blanco, ángulo frontal, luz soft de estudio, sin props.","Lifestyle en contexto: casa real acorde con la demografÃa del mercado target.","Hook social ad: ángulo dinámico three-quarter, un solo focal point, crop 4:5.","Campaña estacional: cambia location y luz para casar con la estación actual.","Frame unboxing: manos sujetando el producto, luz indoor natural.","Comparison shot: side-by-side con un objeto de referencia para la escala.","Variante localizada: mismo producto, model y location distintos para un mercado concreto."],"¿Las plantillas funcionan en varios idiomas?","SÃ. Escribe la plantilla en el idioma con el que estés más cómodo â Claude y HeroShots manejan prompts en EN/IT/ES/DE/FR."),de:_("Claude + HeroShots: 7 Prompt-Templates für Produktfotografie","Sieben Copy-Paste-Prompt-Templates für die HeroShots Skill in Claude â Lifestyle, PDP-Hero, Seasonal, Unboxing und mehr.","Der schnellste Weg zu HeroShots in Claude ist eine **Bibliothek von Copy-Paste-Prompt-Templates**. Unten stehen 7 einsatzfertige Strukturen für die häufigsten Produktfotografie-Anforderungen. Produktbild anhängen, Template einfügen, Platzhalter tauschen, @heroshots erwÃ
4288¤hnen.","Die 7 Templates",["PDP-Hero: weiÃer Hintergrund, Frontwinkel, weiches Studiolicht, keine Props.","Lifestyle in Context: reales Zuhause passend zur Zielmarkt-Demografie.","Social-Ad-Hook: dynamischer Three-Quarter-Winkel, ein Fokuspunkt, 4:5-Crop.","Seasonal Campaign: Location und Licht an die aktuelle Jahreszeit anpassen.","Unboxing-Frame: Hände halten das Produkt, natürliches Indoor-Licht.","Comparison Shot: Side-by-Side mit Referenzobjekt für die Skalierung.","Lokalisierte Variante: gleiches Produkt, anderes Model + Location für einen spezifischen Markt."],"Funktionieren die Templates in mehreren Sprachen?","Ja. Schreib das Template in der Sprache, in der du dich am wohlsten fühlst â Claude und HeroShots verstehen EN/IT/ES/DE/FR-Prompts."),fr:_("Claude + HeroShots : 7 templates de prompt pour la product photography","Sept templates prêts à coller pour la Skill HeroShots dans Claude â lifestyle, PDP hero, saisonnier, unboxing, et plus.","Le meilleur raccourci pour HeroShots dans Claude, c'est une **bibliothèque de prompt templates à copier-coller**. Ci-dessous 7 structures prêtes à l'emploi pour les besoins courants en product photography. Joins l'image produit, colle le template, ajuste les placeholders et mentionne @heroshots.","Les 7 templates",["PDP hero : fond blanc, angle frontal, lumière soft studio, pas de props.","Lifestyle en contexte : intérieur réel cohérent avec la démographie du marché cible.","Hook social ad : angle dynamique three-quarter, un seul focal point, crop 4:5.","Campagne saisonnière : change location et lumière pour matcher la saison actuelle.","Frame unboxing : mains tenant le produit, lumière indoor naturelle.","Comparison shot : side-by-side avec un objet de référence pour l'échelle.","Variante localisée : même produit, model et location différents pour un marché précis."],"Les templates fonctionnent-ils en plusieurs langues ?","Oui. Ãcris le template dans la langue où tu es le plus à l'aise â Claude et HeroShots gèrent les prompts EN/IT/ES/DE/FR.")}),ct("amazon-product-data-extraction-what-heroshots-reads",["integrations","amazon","compliance"],"2026-07-10",{en:_("Amazon Product Data Extraction Explained","A transparent look at exactly what HeroShots pulls from an Amazon URL, what it doesn't touch, and the compliance rules that apply.","When you paste an Amazon URL into HeroShots, we import **only the structured product data** â images, title, brand, bullet points, dimensions, and specs. We don't scrape reviews, seller data, or the Amazon page itself. Everything you import must be a product you own, sell, or are an authorised reseller for.","What we extract vs what we don't",["Extract: main image + gallery in the highest resolution available.","Extract: title, brand and category.","Extract: bullet points and long description as reference for prompt accuracy.","Extract: dimensions, weight and technical specs.","Never extracted: customer reviews, ratings, seller name, or Amazon-specific metadata.","Never stored: the Amazon page. Only the extracted asset lives in your workspace."],"Is HeroShots affiliated with Amazon?",'No. HeroShots is not affiliated with Amazon. "Amazon" is a trademark of Amazon.com, Inc. You are responsible for the rights and trademark permissions of the products you import.'),it:_("Estrazione dati prodotto da Amazon: cosa legge HeroShots e come li usa","Uno sguardo trasparente su cosa HeroShots prende esattamente da un URL Amazon, cosa non tocca e le regole di compliance che si applicano.","Quando incolli un URL Amazon in HeroShots, importiamo **solo i dati prodotto strutturati** â immagini, titolo, brand, bullet, dimensioni e specifiche. Non facciamo scraping di recensioni, dati seller o della pagina Amazon in sé. Ogni prodotto che importi deve essere tuo, venduto da te o gestito come reseller autorizzato.","Cosa estraiamo vs cosa no",["Estratto: immagine principale + gallery nella risoluzione più alta disponibile.","Estratto: titolo, brand e categoria.","Estratto: bullet e descrizione lunga come riferimento per la precisione del prompt.","Estratto: dimensioni, peso e specifiche tecniche.","Mai estratto: recensioni clienti, rating, nome seller o metadata specifici di Amazon.","Mai salvato: la pagina Amazon. Solo l'asset estratto vive nel tuo workspace."],"HeroShots è affiliata ad Amazon?",'No. HeroShots non è affiliata ad Amazon. "Amazon" è un marchio di Amazon.com, Inc. Sei responsabile dei diritti e delle autorizzazioni sui marchi dei prodotti che importi.'),es:_("Extracción de datos de producto de Amazon: qué lee HeroShots y cómo lo usa","Un vistazo transparente a lo que HeroShots trae exactamente de un URL de Amazon, lo que no toca y las reglas de compliance que aplican.","Cuando pegas un URL de Amazon en HeroShots, importamos **sólo los datos de producto estructurados** â imágenes, tÃtulo, brand, bullet points, dimensiones y specs. No scrapeamos reseñas, datos del seller ni la página de Amazon en sÃ. Todo lo que importes tiene que ser producto tuyo, del que eres seller, o del que eres reseller autorizado.","Qué extraemos vs qué no",["ExtraÃdo: imagen principal + galerÃa en la mejor resolución disponible.","ExtraÃdo: tÃtulo, brand y categorÃa.","ExtraÃdo: bullet points y descripción larga como referencia para la precisión del prompt.","ExtraÃdo: dimensiones, peso y specs técnicas.","Nunca extraÃdo: reseñas de clientes, rating, nombre del seller ni metadata especÃfica de Amazon.","Nunca guardado: la página de Amazon. Sólo el asset extraÃdo vive en tu workspace."],"¿HeroShots está afiliada a Amazon?",'No. HeroShots no está afiliada a Amazon. "Amazon" es una marca de Amazon.com, Inc. Tú te haces cargo de los derechos y permisos de marca de los productos que importas.'),de:_("Amazon-Produktdaten-Extraktion: Was HeroShots liest und wie es damit umgeht","Ein transparenter Blick darauf, was HeroShots aus einer Amazon-URL genau zieht, was es nicht anfasst und welche Compliance-Regeln gelten.","Wenn du eine Amazon-URL in HeroShots einfügst, importieren wir **nur strukturierte Produktdaten** â Bilder, Titel, Brand, Bullet Points, MaÃe und Specs. Wir scrapen keine Be
4288wertungen, keine Seller-Daten und nicht die Amazon-Seite selbst. Alles, was du importierst, muss ein Produkt sein, das du besitzt, verkaufst oder als autorisierter Reseller vertreibst.","Was wir extrahieren vs. was nicht",["Extrahiert: Hauptbild + Galerie in der höchsten verfügbaren Auflösung.","Extrahiert: Titel, Brand und Kategorie.","Extrahiert: Bullet Points und lange Beschreibung als Referenz für Prompt-Präzision.","Extrahiert: MaÃe, Gewicht und technische Specs.","Nie extrahiert: Kundenbewertungen, Ratings, Seller-Namen oder Amazon-spezifische Metadata.","Nie gespeichert: die Amazon-Seite. Nur das extrahierte Asset liegt in deinem Workspace."],"Ist HeroShots mit Amazon verbunden?",'Nein. HeroShots ist nicht mit Amazon verbunden. "Amazon" ist eine Marke von Amazon.com, Inc. Für Rechte und Markenfreigaben der importierten Produkte bist du selbst verantwortlich.'),fr:_("Extraction des données produit Amazon : ce que HeroShots lit et comment il l'utilise","Un regard transparent sur ce que HeroShots récupère exactement d'une URL Amazon, ce qu'il ne touche pas et les règles de compliance qui s'appliquent.","Quand tu colles une URL Amazon dans HeroShots, on importe **uniquement les données produit structurées** â images, titre, brand, bullet points, dimensions et specs. On ne scrape pas les avis, les données seller ni la page Amazon elle-même. Tout ce que tu importes doit être un produit que tu possèdes, dont tu es le seller ou revendeur autorisé.","Ce qu'on extrait vs ce qu'on n'extrait pas",["Extrait : image principale + galerie dans la meilleure résolution disponible.","Extrait : titre, brand et catégorie.","Extrait : bullet points et description longue comme référence pour la précision du prompt.","Extrait : dimensions, poids et specs techniques.","Jamais extrait : avis clients, ratings, nom du seller ou metadata spécifiques d'Amazon.","Jamais stocké : la page Amazon. Seul l'asset extrait vit dans ton workspace."],"HeroShots est-il affilié à Amazon ?",`Non. HeroShots n'est pas affilié à Amazon. "Amazon" est une marque d'Amazon.com, Inc. Tu es responsable des droits et autorisations de marque des produits que tu importes.`)})],iP=[ct("heroshots-sdks-npm-pypi-packagist-launch",["sdks","api","developers"],"2026-07-10",{en:_("Introducing the HeroShots SDKs: npm, PyPI, Packagist","Official HeroShots SDKs are live for JavaScript, Python and PHP. Install with npm, pip or composer and generate product UGC from your codebase.","Today we're shipping **official HeroShots SDKs** for the three ecosystems most product teams already live in: **JavaScript** (`npm install heroshots`), **Python** (`pip install heroshots`) and **PHP** (`composer require heroshots/sdk`). All three are maintained by the HeroShots team, designed for maximum compatibility with modern frameworks, and expose the exact same generation API.","What's inside each SDK",["One-line install: `npm install heroshots`, `pip install heroshots`, `composer require heroshots/sdk`.","Same generation API across all three: pass a product URL (or upload), avatar, location, pose and duration (multiples of 15s).","Auth via HEROSHOTS_API_KEY env var, typed error classes and automatic retries with exponential backoff.","Framework compatibility: Node 18+/Next.js/Remix, Python 3.9+/FastAPI/Jupyter, PHP 8.1+/Laravel/Symfony.","API and SDKs available on Pay-per-use and Subscription plans (not on Free)."],"Are the SDKs official?","Yes â all three are maintained by the HeroShots team and published under the official namespaces on npm, PyPI and Packagist."),it:_("Presentiamo gli SDK HeroShots: npm, PyPI, Packagist","Gli SDK ufficiali HeroShots sono live per JavaScript, Python e PHP. Installali con npm, pip o composer e genera product UGC dal tuo codice.","Oggi rilasciamo gli **SDK ufficiali HeroShots** per i tre ecosistemi in cui vive la maggior parte dei team prodotto: **JavaScript** (`npm install heroshots`), **Python** (`pip install heroshots`) e **PHP** (`composer require heroshots/sdk`). Tutti mantenuti dal team HeroShots, pensati per la massima compatibilità con i framework moderni ed espongono la stessa identica API di generazione.","Cosa c'è in ogni SDK",["Installazione in una riga: `npm install heroshots`, `pip install heroshots`, `composer require heroshots/sdk`.","Stessa API di generazione su tutti e tre: passa un URL prodotto (o upload), avatar, location, posa e durata (multipli di 15s).","Auth via env var HEROSHOTS_API_KEY, classi di errore tipizzate e retry automatici con backoff esponenziale.","Compatibilità framework: Node 18+/Next.js/Remix, Python 3.9+/FastAPI/Jupyter, PHP 8.1+/Laravel/Symfony.","API e SDK disponibili sui piani Pay-per-use e Subscription (non su Free)."],"Gli SDK sono ufficiali?","Sì â tutti e tre sono mantenuti dal team HeroShots e pubblicati sotto i namespace ufficiali su npm, PyPI e Packagist."),es:_("Presentamos los SDKs de HeroShots: npm, PyPI, Packagist","Los SDKs oficiales de HeroShots están live para JavaScript, Python y PHP. Instala con npm, pip o composer y genera product UGC desde tu código.","Hoy lanzamos los **SDKs oficiales de HeroShots** para los tres ecosistemas en los que viven la mayorÃa de los equipos de producto: **JavaScript** (`npm install heroshots`), **Python** (`pip install heroshots`) y **PHP** (`composer require heroshots/sdk`). Los tres mantenidos por el equipo HeroShots, pensados para máxima compatibilidad con frameworks modernos y exp
4288oniendo la misma API de generación.","Qué incluye cada SDK",["Instalación en una lÃnea: `npm install heroshots`, `pip install heroshots`, `composer require heroshots/sdk`.","Misma API de generación en los tres: URL de producto (o upload), avatar, location, pose y duración (múltiplos de 15s).","Auth vÃa env var HEROSHOTS_API_KEY, clases de error tipadas y reintentos automáticos con backoff exponencial.","Compatibilidad de frameworks: Node 18+/Next.js/Remix, Python 3.9+/FastAPI/Jupyter, PHP 8.1+/Laravel/Symfony.","API y SDKs disponibles en planes Pay-per-use y Subscription (no en Free)."],"¿Los SDKs son oficiales?","Sà â los tres los mantiene el equipo HeroShots y se publican bajo los namespaces oficiales en npm, PyPI y Packagist."),de:_("Vorstellung der HeroShots SDKs: npm, PyPI, Packagist","Die offiziellen HeroShots SDKs sind live für JavaScript, Python und PHP. Installiere mit npm, pip oder composer und generiere Product UGC aus deinem Codebase.","Heute veröffentlichen wir die **offiziellen HeroShots SDKs** für die drei Ãkosysteme, in denen die meisten Produkt-Teams schon leben: **JavaScript** (`npm install heroshots`), **Python** (`pip install heroshots`) und **PHP** (`composer require heroshots/sdk`). Alle drei vom HeroShots-Team gepflegt, auf maximale Kompatibilität mit modernen Frameworks ausgelegt und über dieselbe Generations-API bedienbar.","Was jedes SDK enthält",["Ein-Zeilen-Installation: `npm install heroshots`, `pip install heroshots`, `composer require heroshots/sdk`.","Gleiche Generations-API in allen drei: Produkt-URL (oder Upload), Avatar, Location, Pose und Dauer (Vielfache von 15s).","Auth über HEROSHOTS_API_KEY Env-Variable, typisierte Fehlerklassen und automatische Retries mit exponentiellem Backoff.","Framework-Kompatibilität: Node 18+/Next.js/Remix, Python 3.9+/FastAPI/Jupyter, PHP 8.1+/Laravel/Symfony.","API und SDKs verfügbar in Pay-per-use- und Subscription-Plänen (nicht im Free-Plan)."],"Sind die SDKs offiziell?","Ja â alle drei werden vom HeroShots-Team gepflegt und unter den offiziellen Namespaces auf npm, PyPI und Packagist veröffentlicht."),fr:_("Nous présentons les SDKs HeroShots : npm, PyPI, Packagist","Les SDKs officiels HeroShots sont live pour JavaScript, Python et PHP. Installe avec npm, pip ou composer et génère du product UGC depuis ton code.","Aujourd'hui nous lançons les **SDKs officiels HeroShots** pour les trois écosystèmes dans lesquels vivent la plupart des équipes produit : **JavaScript** (`npm install heroshots`), **Python** (`pip install heroshots`) et **PHP** (`composer require heroshots/sdk`). Les trois sont maintenus par l'équipe HeroShots, pensés pour une compatibilité maximale avec les frameworks modernes et exposent la même API de génération.","Ce que contient chaque SDK",["Installation en une ligne : `npm install heroshots`, `pip install heroshots`, `composer require heroshots/sdk`.","Même API de génération pour les trois : URL produit (ou upload), avatar, location, pose et durée (multiples de 15s).","Auth via variable d'env HEROSHOTS_API_KEY, classes d'erreur typées et retries automatiques avec backoff exponentiel.","Compatibilité frameworks : Node 18+/Next.js/Remix, Python 3.9+/FastAPI/Jupyter, PHP 8.1+/Laravel/Symfony.","API et SDKs disponibles sur les plans Pay-per-use et Subscription (pas sur le Free)."],"Les SDKs sont-ils officiels ?","Oui â les trois sont maintenus par l'équipe HeroShots et publiés sous les namespaces officiels sur npm, PyPI et Packagist.")}),ct("generate-product-ugc-from-nodejs-in-10-lines",["sdks","javascript","tutorial"],"2026-07-10",{en:_("Generate product UGC from Node.js in 10 lines","A minimal Node.js example that installs the HeroShots npm SDK, generates a product visual and saves the URL â end to end in ten lines.","The HeroShots **JavaScript SDK** makes it trivial to plug AI product UGC into any Node.js backend. Below is the shortest useful example: install, authenticate, generate, log the URL.","The 10-line quickstart",["Install the SDK: `npm install heroshots`.","Export your key: `export HEROSHOTS_API_KEY=hs_live_...` (issue one in your workspace).","`import { HeroShots } from 'heroshots'` and `new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY })`.","Call `client.generations.create({ productUrl, model, location, pose, duration: 15 }
4288)`.","Log `image.url` â that's the CDN URL to embed anywhere.","Works in Next.js route handlers, Remix loaders, Cloudflare Workers, Vercel Edge and Bun."],"Can I run this in the browser?","Only with a short-lived key issued from your backend. Never ship a long-lived API key in a client bundle."),it:_("Generare product UGC da Node.js in 10 righe","Esempio minimale Node.js che installa l'SDK npm HeroShots, genera un visual di prodotto e salva l'URL â end to end in dieci righe.","L'**SDK JavaScript** di HeroShots rende banale integrare AI product UGC in qualsiasi backend Node.js. Sotto l'esempio più corto utile: installa, autentica, genera, logga l'URL.","Quickstart in 10 righe",["Installa l'SDK: `npm install heroshots`.","Esporta la chiave: `export HEROSHOTS_API_KEY=hs_live_...` (generala nel workspace).","`import { HeroShots } from 'heroshots'` e `new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY })`.","Chiama `client.generations.create({ productUrl, model, location, pose, duration: 15 })`.","Logga `image.url` â è l'URL CDN da embeddare ovunque.","Funziona in Next.js route handler, Remix loader, Cloudflare Workers, Vercel Edge e Bun."],"Posso eseguirlo nel browser?","Solo con una chiave short-lived emessa dal tuo backend. Non spedire mai una API key long-lived in un bundle client."),es:_("Generar product UGC desde Node.js en 10 lÃneas","Ejemplo mÃnimo en Node.js que instala el SDK npm de HeroShots, genera un visual de producto y guarda la URL â end to end en diez lÃneas.","El **SDK JavaScript** de HeroShots hace trivial enchufar AI product UGC en cualquier backend Node.js. Debajo, el ejemplo más corto útil: instala, autentica, genera, loguea la URL.","Quickstart en 10 lÃneas",["Instala el SDK: `npm install heroshots`.","Exporta la key: `export HEROSHOTS_API_KEY=hs_live_...` (genera una en tu workspace).","`import { HeroShots } from 'heroshots'` y `new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY })`.","Llama a `client.generations.create({ productUrl, model, location, pose, duration: 15 })`.","Loguea `image.url` â es la URL de CDN para embeber donde quieras.","Funciona en Next.js route handlers, Remix loaders, Cloudflare Workers, Vercel Edge y Bun."],"¿Puedo ejecutarlo en el navegador?","Solo con una key short-lived emitida por tu backend. Nunca envÃes una API key long-lived en un bundle cliente."),de:_("Product UGC aus Node.js in 10 Zeilen generieren","Ein minimales Node.js-Beispiel, das das HeroShots npm SDK installiert, ein Produktvisual generiert und die URL speichert â end to end in zehn Zeilen.","Das **JavaScript SDK** von HeroShots macht es trivial, AI Product UGC in jedes Node.js-Backend zu integrieren. Unten das kürzeste sinnvolle Beispiel: installieren, authentifizieren, generieren, URL loggen.","Quickstart in 10 Zeilen",["Installiere das SDK: `npm install heroshots`.","Exportiere den Key: `export HEROSHOTS_API_KEY=hs_live_...` (im Workspace erzeugen).","`import { HeroShots } from 'heroshots'` und `new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY })`.","Rufe `client.generations.create({ productUrl, model, location, pose, duration: 15 })` auf.","Logge `image.url` â das ist die CDN-URL zum Einbetten.","Funktioniert in Next.js Route Handlern, Remix Loadern, Cloudflare Workers, Vercel Edge und Bun."],"Kann ich das im Browser ausführen?","Nur mit einem kurzlebigen Key vom Backend. Verschicke nie einen langlebigen API-Key im Client-Bundle."),fr:_("Générer du product UGC depuis Node.js en 10 lignes","Exemple minimal Node.js qui installe le SDK npm HeroShots, génère un visuel produit et sauvegarde l'URL â end to end en dix lignes.","Le **SDK JavaScript** HeroShots rend trivial le fait de brancher de l'AI product UGC dans n'importe quel backend Node.js. Ci-dessous, l'exemple le plus court utile : installe, authentifie, génère, logge l'URL.","Quickstart en 10 lignes",["Installe le SDK : `npm install heroshots`.","Exporte la clé : `export HEROSHOTS_API_KEY=hs_live_...` (génère-la dans ton workspace).","`import { HeroShots } from 'heroshots'` et `new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY })`.","Appelle `client.generations.create({ productUrl, model, location, pose, duration: 15 })`.","Logge `image.url` â c'est l'URL CDN à embarquer partout.","Fonctionne dans les route handlers Next.js, loaders Remix, Cloudflare Workers, Vercel Edge et Bun."],"Je peux l'exécuter dans le navigateur ?","Seulement avec une clé short-lived émise par ton backend. N'expédie jamais une clé API long-lived dans un bundle client.")}
4288),ct("python-sdk-batch-generate-product-shots",["sdks","python","tutorial"],"2026-07-10",{en:_("Python SDK: Batch-Generate Product Shots","Use the HeroShots Python SDK (PyPI) with pandas and asyncio to batch-generate product visuals for an entire catalog in a single run.","The HeroShots **Python SDK** ships both sync and async clients, which makes it ideal for batch jobs, notebooks and ETL pipelines. Read a CSV of product URLs, generate a visual per row, write the CDN URLs back out.","The batch pattern",["`pip install heroshots pandas` and load your catalog with `pd.read_csv('products.csv')`.","Instantiate `AsyncHeroShots(api_key=os.environ['HEROSHOTS_API_KEY'])`.","Use `asyncio.gather` with a semaphore to fan out generations while respecting rate limits.","Persist each generation URL back into the DataFrame and export `products_with_visuals.csv`.","Runs happily inside Jupyter, Airflow DAGs, Dagster assets or a plain cron job."],"Does it handle rate limits?","Yes. The SDK raises typed RateLimitError and retries automatically with exponential backoff â combine with an asyncio.Semaphore to cap concurrency."),it:_("Quickstart Python: generazione batch di product shot con l'SDK HeroShots","Usa l'SDK Python HeroShots (PyPI) con pandas e asyncio per generare in batch visual di prodotto per un intero catalogo in un'unica esecuzione.","L'**SDK Python** HeroShots include sia il client sync sia quello async, perfetto per job batch, notebook e pipeline ETL. Leggi un CSV di URL prodotto, genera un visual per riga, riscrivi gli URL CDN in output.","Il pattern batch",["`pip install heroshots pandas` e carica il catalogo con `pd.read_csv('products.csv')`.","Istanzia `AsyncHeroShots(api_key=os.environ['HEROSHOTS_API_KEY'])`.","Usa `asyncio.gather` con un semaforo per parallelizzare le generazioni rispettando i rate limit.","Salva ogni URL di generazione nel DataFrame ed esporta `products_with_visuals.csv`.","Gira bene in Jupyter, DAG Airflow, asset Dagster o un semplice cron."],"Gestisce i rate limit?","Sì. L'SDK solleva RateLimitError tipizzato e retenta automaticamente con backoff esponenziale â combinalo con asyncio.Semaphore per limitare la concorrenza."),es:_("Quickstart Python: batch-generar product shots con el SDK HeroShots","Usa el SDK Python de HeroShots (PyPI) con pandas y asyncio para batch-generar visuales de producto de todo un catálogo en una sola ejecución.","El **SDK Python** de HeroShots incluye clientes sync y async, ideal para jobs batch, notebooks y pipelines ETL. Lee un CSV de URLs de producto, genera un visual por fila, escribe las URLs CDN de vuelta.","El patrón batch",["`pip install heroshots pandas` y carga el catálogo con `pd.read_csv('products.csv')`.","Instancia `AsyncHeroShots(api_key=os.environ['HEROSHOTS_API_KEY'])`.","Usa `asyncio.gather` con un semáforo para paralelizar respetando rate limits.","Guarda cada URL en el DataFrame y exporta `products_with_visuals.csv`.","Va bien en Jupyter, DAGs de Airflow, assets de Dagster o un cron."],"¿Gestiona los rate limits?","SÃ. El SDK lanza RateLimitError tipado y reintenta automáticamente con backoff exponencial â combÃnalo con asyncio.Semaphore para acotar concurrencia."),de:_("Python Quickstart: Produkt-Shots im Batch mit dem HeroShots SDK generieren","Nutze das HeroShots Python SDK (PyPI) mit pandas und asyncio, um Produktvisuals für einen ganzen Katalog in einem einzigen Lauf zu batchen.","Das **Python SDK** von HeroShots liefert Sync- und Async-Clients â perfekt für Batch-Jobs, Notebooks und ETL-Pipelines. CSV mit Produkt-URLs lesen, ein Visual pro Zeile generieren, CDN-URLs zurückschreiben.","Das Batch-Pattern",["`pip install heroshots pandas` und Katalog mit `pd.read_csv('products.csv')` laden.","`AsyncHeroShots(api_key=os.environ['HEROSHOTS_API_KEY'])` instanziieren.","`asyncio.gather` mit Semaphore für parallele Generierungen unter Rate-Limits.","Jede URL zurück in den DataFrame speichern und `products_with_visuals.csv` exportieren.","Läuft in Jupyter, Airflow-DAGs, Dagster-Assets oder einem einfachen Cron."],"Behandelt es Rate Limits?","Ja. Das SDK wirft typisiertes RateLimitError und retryt automatisch mit exponentiellem Backoff â mit asyncio.Semaphore die Nebenläufigkeit begrenzen."),fr:_("Quickstart Python : batch-générer des product shots avec le SDK HeroShots","Utilise le SDK Python HeroShots (PyPI) avec pandas et asyncio pour batch-générer les visuels produit d'un catalogue entier en une seule exécution.","Le **SDK Python** HeroShots livre client sync et async â parfait pour les jobs batch, notebooks et pipelines ETL. Lis un CSV d'URLs produit, génère un visuel par ligne, ré-écris les URLs CDN.","Le pattern batch",["`pip install heroshots pandas` et charge le catalogue avec `pd.read_csv('products.csv')`.","Instancie `AsyncHeroShots(api_key=os.environ['HEROSHOTS_API_KEY'])`.","Utilise `asyncio.gather` avec un sémaphore pour paralléliser en respectant les rate limits.","Sauvegarde chaque URL dans le DataFrame et exporte `products_with_visuals.csv`.","Tourne dans Jupyter, DAGs Airflow, assets Dagster ou un cron."],"Gère-t-il les rate limits ?","Oui. Le SDK lève RateLimitError typé et retente automatiquement avec backoff exponentiel â combine avec asyncio.Semaphore pour borner la concurrence.")}),ct("php-laravel-automate-product-photos",["sdks","php","laravel","tutorial"],"2026-07-10",{en:_("PHP + Laravel: Automate Product Photos","Install the HeroShots PHP SDK (Packagist) in Laravel, dispatch generations to a queue, and publish AI product visuals straight to your storefront.","The HeroShots **PHP SDK** ships as a PSR-4 Composer package with Laravel and Symfony supp
4288ort. In a Laravel app you can dispatch a HeroShots generation to a queue, poll for completion in a job, and update your `products` table with the resulting CDN URL â no third-party glue needed.","The Laravel pattern",["`composer require heroshots/sdk` â the package auto-discovers a service provider and facade.","Set `HEROSHOTS_API_KEY` in your `.env` and inject the client where needed.","Dispatch a `GenerateProductVisual` job that calls `HeroShots::generations()->create([...])`.","On success, save `$image->url` on the product model and invalidate storefront cache.","Same pattern in Symfony via Messenger, or in vanilla PHP with any queue."],"Does it support Symfony?","Yes â the package is PSR-compliant and integrates with Symfony bundles and Messenger out of the box."),it:_("PHP + Laravel: automatizza le foto prodotto dal tuo storefront","Installa l'SDK PHP HeroShots (Packagist) in Laravel, dispatchia le generazioni su una queue e pubblica AI product visual direttamente sullo storefront.","L'**SDK PHP** HeroShots è un package Composer PSR-4 con supporto Laravel e Symfony. In un'app Laravel puoi dispatchare una generazione HeroShots su una queue, aspettare il completamento in un job e aggiornare la tabella `products` con l'URL CDN â senza colla di terze parti.","Il pattern Laravel",["`composer require heroshots/sdk` â il package auto-discover un service provider e una facade.","Imposta `HEROSHOTS_API_KEY` in `.env` e inietta il client dove serve.","Dispatch di un job `GenerateProductVisual` che chiama `HeroShots::generations()->create([...])`.","Al success salva `$image->url` sul model prodotto e invalida la cache dello storefront.","Stesso pattern in Symfony via Messenger, o in PHP vanilla con qualsiasi queue."],"Supporta Symfony?","Sì â il package è PSR-compliant e si integra con bundle Symfony e Messenger out of the box."),es:_("PHP + Laravel: automatiza fotos de producto desde tu storefront","Instala el SDK PHP de HeroShots (Packagist) en Laravel, dispatch las generaciones a una queue y publica AI product visuals directamente en el storefront.","El **SDK PHP** de HeroShots es un paquete Composer PSR-4 con soporte Laravel y Symfony. En una app Laravel puedes dispatch una generación HeroShots a una queue, poll de completitud en un job y actualizar tu tabla `products` con la URL CDN â sin pegamento de terceros.","El patrón Laravel",["`composer require heroshots/sdk` â el paquete auto-discover un service provider y facade.","Define `HEROSHOTS_API_KEY` en `.env` e inyecta el cliente donde haga falta.","Dispatch de un job `GenerateProductVisual` que llama a `HeroShots::generations()->create([...])`.","Al éxito guarda `$image->url` en el modelo de producto e invalida la caché del storefront.","Mismo patrón en Symfony vÃa Messenger, o en PHP vanilla con cualquier queue."],"¿Soporta Symfony?","Sà â el paquete es PSR-compliant e integra con bundles de Symfony y Messenger out of the box."),de:_("PHP + Laravel: Produktfotos aus deinem Storefront automatisieren","Installiere das HeroShots PHP SDK (Packagist) in Laravel, dispatch Generierungen in eine Queue und veröffentliche AI Product Visuals direkt im Storefront.","Das **PHP SDK** von HeroShots ist ein PSR-4 Composer-Paket mit Laravel- und Symfony-Support. In einer Laravel-App dispatched du eine HeroShots-Generierung in eine Queue, wartest im Job auf Completion und aktualisierst deine `products`-Tabelle mit der CDN-URL â ohne Drittkleber.","Das Laravel-Pattern",["`composer require heroshots/sdk` â Paket auto-discovered Service Provider und Facade.","`HEROSHOTS_API_KEY` in `.env` setzen und den Client dort injecten, wo nötig.","Dispatch eines `GenerateProductVisual`-Jobs, der `HeroShots::generations()->create([...])` aufruft.","Bei Erfolg `$image->url` am Produkt-Model speichern und Storefront-Cache invalidieren.","Gleiches Pattern in Symfony via Messenger oder in Vanilla-PHP mit beliebiger Queue."],"Unterstützt es Symfony?","Ja â das Paket ist PSR-konform und integriert sich mit Symfony-Bundles und Messenger out of the box."),fr:_("PHP + Laravel : automatise les photos produit depuis ton storefront","Installe le SDK PHP HeroShots (Packagist) dans Laravel, dispatch les générations sur une queue et publie de l'AI product UGC directement sur le storefront.","Le **SDK PHP** HeroShots est un paquet Composer PSR-4 avec support Laravel et Symfony. Dans une app Laravel, dispatche une génération HeroShots sur une queue, poll la complétion dans un job et met à jour la table `products` avec l'URL CDN â sans colle tierce.","Le pattern Laravel",["`composer require heroshots/sdk` â le paquet auto-discover un service provider et une facade.","Définis `HEROSHOTS_API_KEY` dans `.env` et injecte le client où besoin.","Dispatch d'un job `GenerateProductVisual` qui appelle `HeroShots::generations()->create([...])`.","Au succès, sauvegarde `$image->url` sur le model produit et invalide le cache storefront.","Même pattern dans Symfony via Messenger, ou en PHP vanilla avec n'importe quelle queue."],"Supporte-t-il Symfony ?","Oui â le paquet est PSR-compliant et s'intègre aux bundles Symfony et à Messenger out of the box.")}),ct("choosing-a-heroshots-sdk-dx-and-compatibility",["sdks","comparison"],"2026-07-11",{en:_("Choosing a HeroShots SDK: performance, DX and compatibility","JavaScript, Python or PHP? A pragmatic comparison of the three official HeroShots SDKs â install, DX, framework fit and where each one shines.","The three official HeroShots SDKs expose the same generation API, so choose the one that matches your stack rather than the one you 'should' learn. Here's the short version.","How to pick",["**JavaScript / TypeScript** (`npm install heroshots`): best DX for full-stack teams. Isomorphic, typed, works in Node 18+, Next.js, Remix, SvelteKit, Cloudflare Workers, Vercel Edge and Bun.","**Python** (`pip install heroshots`): best for data-heavy workflows. Sync + async clients, plays well with pandas, Jupyter, FastAPI, Airflow and Dagster.","**PHP** (`composer require heroshots/sdk`): best for existing storefronts. First-class Laravel and Symfony supp
4288ort, PSR-4/PSR-18/PSR-3, drop-in for WordPress plugins.","All three: same generation API, same webhook payloads, same rate limits â you can migrate between them without changing behaviour.","API and SDKs are on Pay-per-use and Subscription plans. Free plan uses the web app only."],"Can I mix SDKs in the same product?","Yes. The API is the source of truth â teams often use the Python SDK for batch jobs and the JavaScript SDK for on-demand generations from the app UI."),it:_("Scegliere un SDK HeroShots: performance, DX e compatibilità ","JavaScript, Python o PHP? Una comparazione pragmatica dei tre SDK ufficiali HeroShots â installazione, DX, fit con i framework e dove ognuno brilla.","I tre SDK ufficiali HeroShots espongono la stessa API di generazione, quindi scegli quello che matcha il tuo stack, non quello che 'dovresti' imparare. Ecco la versione breve.","Come scegliere",["**JavaScript / TypeScript** (`npm install heroshots`): miglior DX per team full-stack. Isomorfo, tipizzato, funziona su Node 18+, Next.js, Remix, SvelteKit, Cloudflare Workers, Vercel Edge e Bun.","**Python** (`pip install heroshots`): il migliore per workflow data-heavy. Client sync + async, si integra con pandas, Jupyter, FastAPI, Airflow e Dagster.","**PHP** (`composer require heroshots/sdk`): il migliore per storefront esistenti. Supporto Laravel e Symfony first-class, PSR-4/PSR-18/PSR-3, drop-in per plugin WordPress.","Tutti e tre: stessa API di generazione, stessi payload webhook, stessi rate limit â migri tra loro senza cambiare comportamento.","API e SDK sono sui piani Pay-per-use e Subscription. Il piano Free usa solo la web app."],"Posso mixare SDK nello stesso prodotto?","Sì. L'API è la source of truth â i team spesso usano l'SDK Python per job batch e l'SDK JavaScript per generazioni on-demand dalla UI."),es:_("Elegir un SDK de HeroShots: rendimiento, DX y compatibilidad","¿JavaScript, Python o PHP? Una comparativa pragmática de los tres SDKs oficiales de HeroShots â instalación, DX, fit con frameworks y dónde brilla cada uno.","Los tres SDKs oficiales exponen la misma API de generación, asà que elige el que encaje con tu stack, no el que 'deberÃas' aprender. Aquà la versión corta.","Cómo elegir",["**JavaScript / TypeScript** (`npm install heroshots`): mejor DX para equipos full-stack. Isomorfo, tipado, Node 18+, Next.js, Remix, SvelteKit, Cloudflare Workers, Vercel Edge y Bun.","**Python** (`pip install heroshots`): el mejor para workflows data-heavy. Sync + async, se integra con pandas, Jupyter, FastAPI, Airflow y Dagster.","**PHP** (`composer require heroshots/sdk`): el mejor para storefronts existentes. Soporte first-class de Laravel y Symfony, PSR-4/PSR-18/PSR-3, drop-in para plugins de WordPress.","Los tres: misma API, mismos payloads de webhook, mismos rate limits â migras entre ellos sin cambiar comportamiento.","API y SDKs en planes Pay-per-use y Subscription. El plan Free usa solo la web app."],"¿Puedo mezclar SDKs en el mismo producto?","SÃ. La API es la fuente de verdad â muchos equipos usan Python para batch y JavaScript para generaciones on-demand desde la UI."),de:_("Das richtige HeroShots SDK wählen: Performance, DX und Kompatibilität","JavaScript, Python oder PHP? Ein pragmatischer Vergleich der drei offiziellen HeroShots SDKs â Installation, DX, Framework-Fit und wo jedes glänzt.","Die drei offiziellen HeroShots SDKs bieten dieselbe Generations-API â wähle das zu deinem Stack passende, nicht das, was du 'lernen solltest'. Hier die Kurzversion.","So wählst du",["**JavaScript / TypeScript** (`npm install heroshots`): beste DX für Full-Stack-Teams. Isomorph, typisiert, Node 18+, Next.js, Remix, SvelteKit, Cloudflare Workers, Vercel Edge und Bun.","**Python** (`pip install heroshots`): am besten für datenlastige Workflows. Sync + Async, passt zu pandas, Jupyter, FastAPI, Airflow und Dagster.","**PHP** (`composer require heroshots/sdk`): am besten für bestehende Storefronts. First-class Laravel- und Symfony-Support, PSR-4/PSR-18/PSR-3, Drop-in für WordPress-Plugins.","Alle drei: gleiche API, gleiche Webhook-Payloads, gleiche Rate-Limits â Wechsel ohne Verhaltensänderung.","API und SDKs sind in Pay-per-use- und Subscription-Plänen. Free-Plan nutzt nur die Web-App."],"Kann ich SDKs im selben Produkt mischen?","Ja. Die API ist die Source of Truth â Teams nutzen oft das Python SDK für Batch-Jobs und das JavaScript SDK für On-Demand-Generierungen aus der UI."),fr:_("Choisir un SDK HeroShots : performance, DX et compatibilité","JavaScript, Python ou PHP ? Une comparaison pragmatique des trois SDKs officiels HeroShots â installation, DX, fit avec les frameworks et où chacun brille.","Les trois SDKs officiels exposent la même API de génération : choisis celui qui correspond à ton stack, pas celui que tu 'devrais' apprendre. Voici la version courte.","Comment choisir",["**JavaScript / TypeScript** (`npm install heroshots`) : meilleure DX pour les équipes full-stack. Isomorphe, typé, Node 18+, Next.js, Remix, SvelteKit, Cloudflare Workers, Vercel Edge et Bun.","**Python** (`pip install heroshots`) : le meilleur pour les workflows data. Sync + async, s'intègre à pandas, Jupyter, FastAPI, Airflow et Dagster.","**PHP** (`composer require heroshots/sdk`)
4288: le meilleur pour les storefronts existants. Support first-class de Laravel et Symfony, PSR-4/PSR-18/PSR-3, drop-in pour plugins WordPress.","Les trois : même API, mêmes payloads webhook, mêmes rate limits â migration sans changement de comportement.","API et SDKs sur les plans Pay-per-use et Subscription. Le plan Free n'utilise que la web app."],"Je peux mixer les SDKs dans le même produit ?","Oui. L'API est la source de vérité â les équipes utilisent souvent le SDK Python pour le batch et le SDK JavaScript pour les générations à la demande depuis l'UI.")})],va=[{slug:"ai-ugc-vs-traditional-ugc",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["ai-ugc","creator-economy","marketing"],translations:{en:{title:"AI UGC vs Traditional UGC: What Actually Changes for a Brand (and What Doesn't)",description:"Moving from creator-sourced UGC to AI UGC changes sourcing, briefing, turnaround, licensing and consistency â and leaves the creative idea untouched.",body:`Moving from traditional creator-sourced UGC to AI UGC changes six things: how you source faces, how you brief, how fast you get assets back, how licensing works, how consistent the output is, and how cheaply you can test. It does not change the need for a real creative idea, an honest product claim, or clean rights paperwork. 4289 4290## What AI UGC actually is, and what it is not 4291 4292[AI UGC](/glossary/ai-ugc) is not a synthetic presenter reading your script over a stock background. In the form that matters commercially, it is [user-generated content](/glossary/user-generated-content)-style creative â casual framing, handheld energy, real-looking rooms â generated from three inputs: a product, a face, and a [prompt](/glossary/prompt). 4293 4294The face is the part people get wrong. It is either a [creator avatar](/glossary/creator-avatar), built from a real and consenting person whose likeness is licensed for exactly this use, or a fully synthetic [AI avatar](/glossary/ai-avatar) that depicts nobody in particular. Two different products, two different risk profiles â and conflating them is why the category still gets called "fake creators". 4295 4296Everything below assumes the first kind: licensed likenesses, documented consent, royalties flowing back to the person. That is how HeroShots is built, and it is the only version of the comparison worth making â an unlicensed pipeline is not a cheaper form of traditional UGC, it is a legal exposure wearing the same clothes. 4297 4298## What changes in sourcing: casting becomes selecting 4299 4300Traditional UGC sourcing is a recruitment problem. You post a brief, filter applicants, negotiate a rate and a usage window, ship the product, then wait for delivery. Every one of those steps has a failure mode, and every failure mode is a person: someone ghosts, someone's kitchen light is orange, someone films vertically when you needed square. 4301 4302AI UGC replaces recruitment with selection. You pick from a catalogue of creators who have already licensed their likeness for AI generation, or you commission a face of your own. On HeroShots, a custom AI avatar is a â¬100 one-time setup, and bringing your own model â a founder, a long-term ambassador, a creator you already have a deal with â is â¬300 one-time. After that, the face stops being a booking you renegotiate and becomes an asset you can call. 4303 4304What you give up is discovery: a catalogue optimises for fit, while a casting call occasionally produces luck. 4305 4306## What changes in briefing: the brief becomes an executable prompt 4307 4308A traditional brief has to survive being read by someone else. Its ambiguities get resolved by a human with taste and product intuition, and sometimes their resolution beats yours. 4309 4310A prompt has no such backstop. Its ambiguities get resolved by a model with no taste and no product knowledge, so the prompt has to be explicit about everything a brief left implicit: framing, light direction, what the hands are doing, whether the label is legible. Teams who move over and keep writing briefs get mush; teams who learn to write prompts get what they asked for, including the parts they asked for by accident. 4311 4312The compensation is that revisions stop being negotiations. Instead of asking for a reshoot with the label facing camera and waiting on somebody else's schedule, you regenerate. On HeroShots, images arr
4312ive as [batches](/glossary/batch-generation) of four variants: the first batch in a project is â¬4.90 and every further batch in the same project is â¬1.90, while a targeted edit on one chosen image is â¬0.39 (â¬0.23 with HeroShots Pro). 4313 4314The shape of that pricing matters more than the numbers: iteration is cheap relative to the first asset. That is the inverse of a shoot, where every extra variation has to be bought out of the same finite day. 4315 4316## What changes in turnaround, and what the cost is actually made of 4317 4318| Dimension | Traditional creator-sourced UGC | AI UGC | 4319| --- | --- | --- | 4320| Sourcing | Recruit, vet and negotiate per campaign | Select a licensed creator, or reuse an avatar you own | 4321| Lead-time drivers | Product shipping, creator availability, edit rounds | Queue time, and how fast you converge on a prompt | 4322| Revision cost | Another round with a person, often another fee | Another batch, or an edit on one chosen image | 4323| Rights | Negotiated per creator, per channel, per term | Consent and [usage rights](/glossary/usage-rights) applied at generation | 4324| Consistency | Varies by creator, home, camera and day | One avatar held stable across every shot | 4325| Price visibility | Typically quoted per project | Published per batch, per edit, per video | 4326| Strongest at | Voice, lived proof, long-term relationship | Volume, variants, catalogue coverage | 4327 4328Video is where the cost question stops being abstract. On HeroShots a video up to 15 seconds is â¬15 and up to 30 seconds is â¬35, with extra retries at â¬5 per 15-second block. Generating with a real catalogue model rather than an AI avatar adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars carry no such fee. Teams producing continuously can pre-pay: Starter â¬350 at â¬70 per video, Growth â¬650 at â¬65, Scale â¬1,500 at â¬60. HeroShots Pro is â¬99/month and removes watermarks, enables direct downloads, applies â15% on videos, lowers edit prices and puts you in a priority queue. The Free plan gives 10 watermarked images a month and one video preview, no card required. All prices exclude VAT; full detail is on the [pricing page](/pricing). 4329 4330There is no honest single number for what a traditional shoot costs: it is driven by day rates, product samples, shipping, the length of the usage term, exclusivity, and how many revision rounds the contract allows. The like-for-like head-to-head lives in [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators) and [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot) rather than being guessed at here. 4331 4332## What changes in licensing, consent and royalties 4333 4334In traditional UGC, rights are negotiated per creator and per campaign, and they are the thing teams most often get wrong: running an organic-only asset in paid, letting a term lapse while the ad is still live, or filing the paper trail in an email thread nobody can find. A [model release](/glossary/model-release) covers the shoot it was signed for; it does not automatically cover generating new images of that person later. 4335 4336AI UGC moves the rights question upstream: it becomes a property of the avatar rather than of each asset. Either the platform holds documented [AI likeness consent](/glossary/ai-likeness-consent) and a real [likeness licence](/glossary/likeness-licensing) for generation, or it does not â and no amount of output quality fixes that. On HeroShots, consent, likeness licensing and [creator royalties](/glossary/creator-royalties) are part of the product rather than a policy page: the creator likeness fee is the mechanism that pays the person whose face you are using, every time you use it. 4337 4338What does not move upstream is disclosure. Platform policies on synthetic media, and in the EU the AI Act's transparency obligations for AI-generated content, apply to your ad whoever produced it. The [watermark](/glossary/watermark) on the Free plan is a provenance signal for your own team, not a compliance strategy for a regulator. 4339 4340## What changes in consistency, and where AI still drifts 4341 4342Consistency flips from a problem into a default. In traditional UGC, matching two clips shot in different homes on different phones is continuity work. With [avatar consistency](/glossary/avatar-consistency), the same face, hair and build hold across an entire campaign by construction. 4343 4344The risk inverts with it: a library can become too consistent â same pose energy, same lighting mood, same uncanny stillness â which is its own kind of scroll-past. And generation still drifts on the details that matter commercially: hands, small text, closures, logo geometry, the exact colourway of a variant. Product truth is the one thing a model cannot verify for you. Somebody on your side has to look at the label before the asset goes live, exactly as somebody always had to approve a packshot â the same discipline [AI product photography](/solutions/ai-product-photography) demands. 4345 4346## What traditional UGC still does better 4347 4348Be honest about this â pretending otherwise is how brands end up disappointed. 4349 4350- **Voice and testimony.** A real person saying what a product did for them, in their own cadence and with their own hesitations, is still hard to beat in trust-heavy categories like health and finance.
4351- **Proof over time.** A result built up over months, a worn-in pair of shoes, a nursery that actually got built. Generated content can depict duration; it cannot testify to it. 4352- **Discovery and relationship.** A creator who genuinely uses your product becomes an advocate with their own audience. That is a relationship, not an asset, and it has no per-batch price. 4353- **Human instinct.** Occasionally a creator does something you never briefed and it becomes the hook. Models do not surprise you in that direction. 4354 4355The practical answer is not one or the other: use AI UGC for the volume layer of [performance creative](/glossary/performance-creative) â variant testing, catalogue coverage, market-by-market versions, product-page imagery â and keep real creators for the assets where a human being is the message. 4356 4357## What does not change at all 4358 4359Three things survive the transition untouched. First, you still need an idea: a reason for somebody to stop scrolling, expressed in the first second. Prompt craft and concept craft are not the same skill, and the second is still scarce. Second, product truth â if the generated scene shows a feature your product does not have, you have shipped a false claim, and the fact that a model drew it is not a defence. Third, rights hygiene: the paperwork is different, not absent, and the person accountable for checking it is still you. 4360 4361## How to move across without breaking what works 4362 43631. **Pick one surface, not the whole pipeline.** Product-page imagery or paid-social variants are the natural first move; testimonial video is the worst one. 43642. **Rebuild your best existing asset as a prompt.** You already know it performs, so you are testing the pipeline, not the concept. 43653. **Run one batch, then edit rather than re-brief.** The first batch of a project is â¬4.90 and each further batch in the same project is â¬1.90, so exploring stays cheap â and correcting one chosen image at the per-edit price is cheaper still. 43664. **Judge it on your existing metric.** Same audience, same placement, same window. If it does not beat the incumbent asset, the pipeline usually is not the problem â the prompt is. 43675. **Decide explicitly what stays human.** Write down which formats real creators own, or the cheap option quietly eats the formats it is worst at. 43686. **Then automate.** Amazon URL import, a Claude Pro skill, official npm, PyPI and Packagist SDKs, and a [content generation API](/glossary/content-generation-api) on paid plans turn a manual workflow into part of your catalogue pipeline. The product is available in five public languages. 4369 4370AI UGC does not replace creators; it changes what a creator's participation looks like. The same real face that shot one video for you can appear across a whole catalogue, with a royalty paid through the creator likeness fee every time it is used â while the parts that were always hard, the idea and the truth and the rights, stay exactly as hard as they were.`,metaTitle:"AI UGC vs Traditional UGC: What Changes",faqs:[{q:"What is the difference between AI UGC and traditional UGC?",a:"Traditional UGC is filmed or photographed by a real person who receives the product and creates content on their own time. AI UGC generates the same casual, native-to-feed style from a product image, a licensed creator or AI avatar, and a written prompt. The visual result can be comparable; what differs is sourcing, turnaround, revision cost, and how licensing is handled â upstream on the avatar rather than negotiated per campaign."},{q:"Does AI UGC replace UGC creators?",a:"No. It changes what participation looks like. A creator who licenses their likeness can appear in generated content without filming each variant, and the creator likeness fee is the mechanism that routes a royalty to them every time their likeness is used. But AI UGC does not produce spoken testimony, long-term proof of use, or the audience relationship a real advocate brings. The practical pattern is to run both: generated content for volume and variants, real creators for the assets where a person is the message."},{q:"How much does AI UGC cost compared with hiring a creator?",a:"HeroShots publishes its rates: images are billed per batch of four variants, at â¬4.90 for a project's first batch and â¬1.90 for each further batch in that project, an edit on a chosen image is â¬0.39, and a video up to 15 seconds
4370is â¬15 (up to 30 seconds, â¬35). Prices exclude VAT. Creator fees have no public rate card â they depend on day rate, usage term, exclusivity and revision rounds, so the two are not comparable as single numbers."},{q:"Do you need consent to generate AI UGC of a real person?",a:"Yes. Generating new images or video of an identifiable person requires that person's documented permission for AI generation specifically. A standard model release covering a past shoot does not automatically extend to it. On HeroShots every real catalogue model has granted AI likeness consent and a likeness licence, and the creator likeness fee applies when one is used, so brands generate inside the rights the creator actually granted."},{q:"Can AI UGC be used for testimonials?",a:"It can produce testimonial-style content, but treat that carefully. If the claim is a genuine customer experience, it should come from that customer. Generated video works well for demonstration, product-in-use scenes and hooks, and far less well as a substitute for someone's own account of a result. In regulated categories â health, finance, anything with an outcome claim â keep real creators and real substantiation behind the message."},{q:"What does the creator likeness fee cover?",a:"It is the +25% applied on the base price when you generate with a real catalogue model instead of an AI avatar, with a floor of â¬0.90 on images and â¬5 on videos. It is the mechanism behind the creator royalty: the person whose licensed likeness appears is paid each time it is used. AI avatars depict nobody in particular, so they carry no likeness fee at all."},{q:"Will AI UGC look consistent across a whole campaign?",a:"Yes â consistency becomes the default rather than the challenge. One avatar holds the same face, hair and build across every image and video, which is hard to achieve when different creators shoot in different homes on different phones. The risk inverts, though: a set can become too uniform to stop the scroll, and generation still drifts on hands, small text and packaging details. Review those before publishing."},{q:"Do I have to disclose that content is AI-generated?",a:"Assume yes. Platform policies on synthetic media apply to your ad regardless of which tool produced it, and in the EU the AI Act sets transparency obligations for AI-generated content. Check the rules of the specific channel you are running on. HeroShots watermarks output on the Free plan and HeroShots Pro removes watermarks, but a watermark is a provenance signal for your own team â it is not a substitute for the disclosure your channel requires."},{q:"What is the fastest way to test AI UGC against my current creator content?",a:"Take your best-performing existing creator asset and rebuild it as a prompt, so you are testing the pipeline rather than a new concept. Generate one batch of four variants, edit the closest one instead of re-briefing, then run it against the incumbent with the same audience, placement and time window. The Free plan gives 10 watermarked images a month with no card, which is enough to judge output quality first."},{q:"Can AI UGC handle a large product catalogue?",a:"Yes â catalogue coverage is where generated content is strongest, because further batches in an existing project are billed at the lower per-batch rate rather than the first-batch rate. Amazon URL import pulls product data in, and official npm, PyPI and Packagist SDKs plus the API on paid plans let you drive generation from your own systems rather than clicking through a dashboard."}]},it:{title:"AI UGC vs UGC tradizionale: cosa cambia davvero per i brand nel 2026",description:"L'UGC tradizionale richiedeva settimane e un vero budget di produzione. L'AI UGC offre la stessa autenticità in 60 secondi. Ecco cosa cambia â e cosa no â per brand e agenzie.",body:`L'UGC tradizionale è da sempre il gold standard del creative performance. Volti veri, case vere, uso reale del prodotto â converte perché sembra un consiglio, non una pubblicità . Il problema è il costo di produzione: trovare creator, spedire prodotti, aspettare la consegna, pagare la licenza, montare. Un singolo video da 30 secondi impegna un budget vero e richiede settimane. 4371 4372## Cos'è davvero l'AI UGC 4373 4374L'AI UGC non è un volto sintetico che recita uno script. Su piattaforme come HeroShots il workflow è costruito su **creator reali che hanno concesso in licenza la propria immagine**. Carichi il prodotto, scegli un model reale dal catalogo (o il tuo), scrivi un prompt e il sistema genera foto e video in meno di 60 secondi. Il creator riceve una royalty su ogni generazione tramite Tik Joy â quindi è licenziato, consensuale e tracciabile. 4375 4376## Dove vince l'AI UGC 4377 4378- **Velocità **: 60 secondi invece di settimane di produzione. Puoi pubblicare 20 varianti per un A/B test in un pomeriggio. 4379- **Costo**: â¬4,90 per il primo batch di 4 varianti immagine in un progetto, â¬1,90 per ogni batch successivo, â¬15 per un video fino a 15 secondi (prezzi IVA esclusa). Un intero set di test creativo costa una frazione di uno shooting tradizionale. 4380- **Scala**: 5.000 SKU? Generali tutti in una notte, nello stesso stile di brand. 4381- **Iterazione**: cambia sfondo, angolo, outfit, lingua â senza rifare lo shooting. 4382 4383## Dove l'UGC tradizionale vince ancora 4384
4385- **Voce e movimento autentici**: una testimonianza reale con la voce del creator, il linguaggio del corpo e l'ambiente domestico batte ancora qualsiasi AI nelle categorie ad alta fiducia (finance, health, B2B). 4386- **Contenuto behind-the-scenes**: unboxing, day-in-the-life, hands-on. 4387- **Community building**: un creator che ama davvero il tuo prodotto diventa un ambassador di lungo periodo. L'AI non sostituisce quella relazione. 4388 4389## Come combinarli 4390 4391I brand smart usano l'AI UGC per il **top of the funnel** â testing creative su paid social, hero di product page, listing marketplace, localizzazione â e riservano l'UGC tradizionale al **bottom of the funnel**: testimonial, case study, campagne hero. Nella pratica gran parte dei volumi arriva dall'AI UGC, mentre l'UGC tradizionale si tiene una quota rilevante del budget. 4392 4393## E i consensi? 4394 4395à la parte che la maggior parte dei "tool AI UGC" sbaglia. Su HeroShots ogni Real Model firma un consenso granulare che copre diritti d'immagine, categorie di brand consentite e termini di royalty. I brand ottengono una licenza pulita e un audit trail. Il contenuto generato è con watermark sul piano Free e pulito sui piani a pagamento, così sai sempre da dove arriva un asset. 4396 4397## La sintesi 4398 4399L'AI UGC non sostituisce i creator â li **scala**. Lo stesso volto che ha girato un video per te nel 2024 può apparire in 200 varianti localizzate nel 2026, ed essere pagato ogni volta. Questo è il salto.`},es:{title:"AI UGC vs UGC tradicional: lo que realmente cambia para las marcas en 2026",description:"El UGC tradicional llevaba semanas y un presupuesto de producción completo. El AI UGC ofrece la misma autenticidad en 60 segundos. Esto es lo que cambia â y lo que no â para marcas y agencias.",body:`El UGC tradicional siempre ha sido el estándar de oro del creative performance. Caras reales, casas reales, uso real del producto â convierte porque parece una recomendación, no un anuncio. El problema es el coste de producción: buscar creators, enviar productos, esperar la entrega, pagar licencias, editar. Un solo vÃdeo de 30 segundos compromete un presupuesto real y lleva semanas. 4400 4401## Qué es realmente el AI UGC 4402 4403El AI UGC no es una cara sintética leyendo un guion. En plataformas como HeroShots el workflow se basa en **creators reales que han licenciado su imagen**. Subes tu producto, eliges un model real del catálogo (o el tuyo), escribes un prompt y el sistema genera foto y vÃdeo en menos de 60 segundos. El creator recibe una royalty en cada generación vÃa Tik Joy â está licenciado, con consentimiento y trazable. 4404 4405## Dónde gana el AI UGC 4406 4407- **Velocidad**: 60 segundos en lugar de semanas de producción. Puedes lanzar 20 variantes para un A/B test en una tarde. 4408- **Coste**: â¬4,90 por el primer lote de 4 variantes de imagen en un proyecto, â¬1,90 por cada lote adicional, â¬15 por un vÃdeo de hasta 15 segundos (precios sin IVA). Un set completo de test creativo cuesta una fracción de un shooting tradicional. 4409- **Escala**: ¿5.000 SKUs? Genéralos todos en una noche, en el mismo estilo de marca. 4410- **Iteración**: cambia fondo, ángulo, outfit, idioma â sin volver a grabar. 4411 4412## Dónde sigue ganando el UGC tradicional 4413 4414- **Voz y movimiento auténticos**: un testimonio real con la voz del creator, su lenguaje corporal y su entorno sigue ganando a cualquier AI en categorÃas de alta confianza (finance, health, B2B). 4415- **Contenido behind-the-scenes**: unboxings, day-in-the-life, hands-on. 4416- **Community building**: un creator que ama de verdad tu producto se convierte en embajador a largo plazo. La AI no sustituye esa relación. 4417 4418## Cómo combinarlos 4419 4420Las marcas smart usan AI UGC para el **top of the funnel** â testing creativo en paid social, hero de product pages, listings de marketplace, localización â y reservan el UGC tradicional para el **bottom of the funnel**: testimonios, case studies, campañas hero. En la práctica la mayor parte del volumen viene del AI UGC, mientras el UGC tradicional mantiene una parte relevante del presupuesto. 4421 4422## ¿Y los consentimientos? 4423 4424Es la parte que la mayorÃa de "herramientas AI UGC" hacen mal. En HeroShots cada Real Model firma un consentimiento granular que cubre derechos de imagen, categorÃas de marca permitidas y términos de royalty. Las marcas obtienen una licencia limpia y un audit trail. El contenido generado lleva watermark en el plan Free y limpio en los planes de pago, asà siempre sabes de dónde viene un asset. 4425 4426## El resumen 4427 4428El AI UGC no sustituye a los creators â los **escala**. La misma cara real que grabó un vÃdeo para ti en 2024 puede aparecer en 200 variantes localizadas en 2026, y cobrar cada vez. Ese es el cambio.`},de:{title:"AI UGC vs. klassisches UGC: Was sich für Marken 2026 wirklich ändert",description:"Klassisches UGC dauerte Wochen und band ein komplettes Produktionsbudget. AI UGC liefert dieselbe Authentizität in 60 Sekunden. Was sich ändert â und was nicht â für Marken und Agenturen.",body:`Klassisches User-Generated Content war schon immer der Goldstandard für Performance-Kreation. Echte Gesichter, echte Wohnungen, echte Produktnutzung â es konvert
4428iert, weil es wie eine Empfehlung wirkt, nicht wie Werbung. Das Problem sind die Produktionskosten: Creator finden, Produkte versenden, auf die Lieferung warten, Lizenzen zahlen, schneiden. Ein einzelnes 30-Sekunden-Video bindet ein echtes Budget und dauert Wochen. 4429 4430## Was AI UGC wirklich ist 4431 4432AI UGC ist kein synthetisches Gesicht, das ein Skript abliest. Auf Plattformen wie HeroShots basiert der Workflow auf **echten Creators, die ihr Ebenbild lizenziert haben**. Du lädst dein Produkt hoch, wählst ein echtes Model aus dem Katalog (oder dein eigenes), schreibst einen Prompt und das System generiert Foto- und Video-Content in unter 60 Sekunden. Der Creator erhält über Tik Joy bei jeder Generierung eine Royalty â alles lizenziert, mit Einwilligung, nachvollziehbar. 4433 4434## Wo AI UGC gewinnt 4435 4436- **Geschwindigkeit**: 60 Sekunden statt Wochen an Produktion. Du kannst 20 Varianten für einen A/B-Test an einem Nachmittag liefern. 4437- **Kosten**: â¬4,90 für den ersten Batch mit 4 Bildvarianten in einem Projekt, â¬1,90 für jeden weiteren Batch, â¬15 für ein Video bis 15 Sekunden (Preise zzgl. MwSt.). Ein komplettes Creative-Test-Set kostet einen Bruchteil eines klassischen Shoots. 4438- **Skalierung**: 5.000 SKUs? Generiere sie alle über Nacht im selben Markenstil. 4439- **Iteration**: ändere Hintergrund, Winkel, Outfit, Sprache â ohne neuen Shoot. 4440 4441## Wo klassisches UGC weiter gewinnt 4442 4443- **Echte Stimme und Bewegung**: ein echtes Testimonial mit der Stimme, Körpersprache und Wohnumgebung des Creators sc
4443hlägt jede AI in vertrauenslastigen Kategorien (Finance, Health, B2B). 4444- **Behind-the-Scenes-Content**: Unboxings, Day-in-the-Life, Hands-on. 4445- **Community-Aufbau**: ein Creator, der dein Produkt wirklich liebt, wird zum langfristigen Botschafter. AI ersetzt diese Beziehung nicht. 4446 4447## Wie man beides kombiniert 4448 4449Smarte Marken nutzen AI UGC für den **Top of Funnel** â Creative-Testing auf Paid Social, Hero-Bilder auf Produktseiten, Marketplace-Listings, Lokalisierung â und reservieren klassisches UGC für den **Bottom of Funnel**: Testimonials, Case Studies, Hero-Kampagnen. In der Praxis kommt der GroÃteil des Volumens aus AI UGC, während klassisches UGC weiter einen relevanten Teil des Budgets hält. 4450 4451## Was ist mit Einwilligung und Rechten? 4452 4453Genau das machen die meisten "AI UGC-Tools" falsch. Auf HeroShots unterzeichnet jedes Real Model eine granulare Einwilligung zu Bildrechten, erlaubten Markenkategorien und Royalty-Bedingungen. Marken erhalten eine saubere Lizenz und einen Audit-Trail. Generierter Content trägt im Free-Plan ein Wasserzeichen und ist in bezahlten Plänen sauber â du weiÃt immer, woher ein Asset stammt. 4454 4455## Das Fazit 4456 4457AI UGC ersetzt Creators nicht â es **skaliert** sie. Dasselbe echte Gesicht, das 2024 ein Video für dich gedreht hat, kann 2026 in 200 lokalisierten Varianten erscheinen und jedes Mal bezahlt werden. Das ist der Wandel.`},fr:{title:"AI UGC vs UGC traditionnel : ce qui change vraiment pour les marques en 2026",description:"L'UGC traditionnel demandait des semaines et un vrai budget de production. L'AI UGC offre la même authenticité en 60 secondes. Voici ce qui change â et ce qui ne change pas â pour les marques et agences.",body:`L'UGC traditionnel a toujours été le gold standard du creative performance. Vrais visages, vraies maisons, vrai usage produit â ça convertit parce que ça ressemble à une recommandation, pas à une pub. Le problème, c'est le coût de production : sourcer les créateurs, expédier les produits, attendre la livraison, payer la licence, monter. Une seule vidéo de 30 secondes mobilise un vrai budget et prend des semaines. 4458 4459## Ce qu'est vraiment l'AI UGC 4460 4461L'AI UGC, ce n'est pas un visage synthétique qui lit un script. Sur des plateformes comme HeroShots, le workflow repose sur **de vrais créateurs qui ont licencié leur image**. Tu uploades ton produit, choisis un model réel dans le catalogue (ou le tien), écris un prompt, et le système génère photo et vidéo en moins de 60 secondes. Le créateur reçoit une royalty à chaque génération via Tik Joy â licencié, consenti, traçable. 4462 4463## Là où l'AI UGC gagne 4464 4465- **Vitesse** : 60 secondes au lieu de semaines de production. Tu peux livrer 20 variantes pour un A/B test en une après-midi. 4466- **Coût** : â¬4,90 pour le premier lot de 4 variantes d'image dans un projet, â¬1,90 pour chaque lot suivant, â¬15 pour une vidéo jusqu'à 15 secondes (prix hors TVA). Un set complet de test créatif coûte une fraction d'un shooting traditionnel. 4467- **Ãchelle** : 5 000 SKU ? Génère-les tous en une nuit, dans le même style de marque. 4468- **Itération** : change le fond, l'angle, la tenue, la langue â sans re-tourner. 4469 4470## Là où l'UGC traditionnel gagne encore 4471 4472- **Voix et mouvement authentiques** : un témoignage réel avec la voix, le langage corporel et l'environnement du créateur bat encore n'importe quelle AI sur les catégories à forte confiance (finance, health, B2B). 4473- **Contenu behind-the-scenes** : unboxings, day-in-the-life, hands-on. 4474- **Community building** : un créateur qui aime vraiment ton produit devient un ambassadeur long terme. L'AI ne remplace pas cette relation. 4475 4476## Comment les combiner 4477 4478Les marques smart utilisent l'AI UGC en **haut de funnel** â testing créatif paid social, hero de pages produit, listings marketplace, localisation â et réservent l'UGC traditionnel pour le **bas de funnel** : témoignages, case studies, campagnes hero. En pratique, l'essentiel du volume vient de l'AI UGC, tandis que l'UGC traditionnel garde une part significative du budget. 4479 4480## Et les consentements ? 4481 4482C'est ce que la plupart des "outils AI UGC" ratent. Sur HeroShots chaque Real Model signe un consentement granulaire couvrant droits à l'image, catégories de marque autorisées et termes de royalty. Les marques obtiennent une licence propre et un audit trail. Le contenu généré porte un watermark en plan Free et est propre en plans payants â tu sais toujours d'où vient un asset. 4483 4484## La synthèse 4485 4486L'AI UGC ne remplace pas les créateurs â il les **scale**. Le même vrai visage qui a tourné une vidéo pour toi en 2024 peut apparaître dans 200 variantes localisées en 2026, et être payé à chaque fois. C'est ça, le shift.`}}},{slug:"how-creator-royalties-work",date:"2026-06-03",updated:"2026-07-27",author:"HeroShots",tags:["creators","royalties","ztlment"],translations:{en:{title:"How Creator Royalties Work on HeroShots: Consent, Likeness Licensing and the Creator Fee",description:"How HeroShots creator royalties work: consent, likeness licensing, what triggers a royalty, and the +25% creator fee with â¬0.90 and â¬5 floors.",body:`Creator royalties on HeroShots are the compensation a real catalog model receives when a brand generates paid content with their licensed likeness. Using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no such fee, because no real person's rights are involved. Every price on this page excludes VAT. 4487 4488## What creator royalties mean on HeroShots 4489 4490Traditional UGC pays once. A creator films, invoices, and the brand keeps the files. HeroShots is built the other way around: a real person in the catalog licenses their likeness, and that licence stays live every time a brand turns it into new content. That is
4490what [creator royalties](/glossary/creator-royalties) are â compensation tied to *use*, not to a single delivery date. 4491 4492The mechanism is deliberately boring. A brand uploads a product, picks a person, writes a [prompt](/glossary/prompt) and generates. Every paid generation that uses a real catalog model is logged against that creator's ID, and the likeness fee is recorded against it. The creator films nothing, posts nothing and never touches the brief. 4493 4494## Why the royalty model exists instead of a buyout 4495 4496One signed consent can power an open-ended number of generations. That is the central problem with AI likeness work: the person's contribution is captured once, and the output scales without them. A flat buyout would let all the compounding value sit on the brand's side while the creator's identity does the work. 4497 4498[Likeness licensing](/glossary/likeness-licensing) closes that gap by tying compensation to usage rather than to a session. It is also the safer legal structure. A person's [right of publicity](/glossary/right-of-publicity) â their control over the commercial use of their name, image and voice â does not evaporate because the output is synthetic. Documented, compensated, scoped permission is what makes the content publishable at scale rather than merely technically possible. 4499 4500There is a reputational argument too. Public unease about [synthetic media](/glossary/synthetic-media) tends to come back to one question: did the person in the frame agree to this, and did they get anything for it? A usage-linked licence answers both at once. It turns consent from a one-off signature into an ongoing relationship the creator can inspect, scope and end â a materially different thing from a face scraped off the internet and reused indefinitely. 4501 4502## How a creator gets into the catalog 4503 4504The royalty is the last step of the pipeline, not the first. Nothing generates until consent exists. 4505 45061. **Identity verification.** A creator's identity is verified before anything is captured, so every likeness in the catalog traces back to a real, identifiable person. 45072. **Reference capture.** Photos, video, voice samples and body measurements are uploaded to build a usable reference set. 45083. **Consent with a defined scope.** The creator accepts a versioned consent document and attaches a signed release, with the acceptance timestamped and written to an append-only consent registry. That is
4508what turns [AI likeness consent](/glossary/ai-likeness-consent) from a checkbox into evidence you can produce later. 45094. **Avatar build.** The reference set becomes a [creator avatar](/glossary/creator-avatar) â a reusable [digital twin](/glossary/digital-twin) that holds the same face across shots. 45105. **Marketplace listing.** The avatar appears in the catalog, and a brand can price a generation with that person before committing to it. 4511 4512## What triggers a royalty â and what doesn't 4513 4514A royalty is triggered by a *paid generation that uses a real catalog model*. Nothing else pays a creator, because nothing else uses a real person's identity. 4515 4516| Scenario | Creator likeness fee | Who is compensated | 4517| --- | --- | --- | 4518| Paid image batch using a real catalog model | +25% of the base price, floor â¬0.90 | The catalog creator | 4519| Paid video using a real catalog model | +25% of the base price, floor â¬5 | The catalog creator | 4520| Any generation using a library [AI avatar](/glossary/ai-avatar) | None | Nobody â no real person is involved | 4521| Your own model, onboarded for a one-time â¬300 | None on generations | You hold that person's release | 4522| Photos you upload yourself | None | You assume the rights responsibility | 4523| Free-plan watermarked previews | Not a paid generation | Demo output, not licensed usage | 4524 4525The free tier â 10 watermarked images a month and one video preview, no card required â lets brands evaluate output quality; a [watermark](/glossary/watermark) marks the result as a demo rather than a licensed asset. 4526 4527## How the creator fee is structured 4528 4529The fee is a percentage of the base price with a floor underneath it, so that cheap generations still carry a meaningful licence payment. Base prices do not change when you pick a real model; the creator fee sits on top of them. 4530 4531Images are billed per batch of four variants rather than per image, which is the detail most estimates get wrong. 4532 4533| Output | Base price (excl. VAT) | Creator likeness fee with a real catalog model | 4534| --- | --- | --- | 4535| First batch of 4 image variants in a project | â¬4.90 | 25% of the base, never below the â¬0.90 image floor | 4536| Each further batch of 4 in the same project | â¬1.90 | 25% of the base, never below the â¬0.90 image floor | 4537| Video up to 15 seconds | â¬15 | 25% of the base, never below the â¬5 video floor | 4538| Video up to 30 seconds | â¬35 | 25% of the base, never below the â¬5 video floor | 4539 4540Two things follow from that floor. On low-priced outputs â a further [batch](/glossary/batch-generation) of variants, for instance â the floor is what actually applies, so heavy iteration cannot quietly dilute what the creator is owed. On video, where the base is higher, the percentage does the work instead. 4541 4542It is worth being explicit that â¬0.90 and â¬5 are floors on a fee, not prices for anything. And a project's image spend is a formula, not a fixed number: the first batch at â¬4.90 plus each further batch at â¬1.90, with the creator fee calculated against each of those base amounts separately. The full base-price list, including pre-paid video packages â Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video) â lives on [pricing](/pricing). 4543 4544Setup fees are separate and one-time: â¬100 to build a custom AI avatar, â¬300 to bring your own model onto the platform. Neither is a royalty. HeroShots Pro at â¬99/month changes what a brand pays â watermark-free direct downloads, edits at â¬0.23 instead of â¬0.39, â15% on videos, priority queue â not the consent terms behind anyone's likeness. 4545 4546## What the creator fee is, and what it isn't 4547 4548Most platforms stay vague here, so it is worth being precise. The +25% is what a brand pays on top of the base price for the right to use a real, identifiable person. It is a line on the brand's invoice, not a published payout percentage. HeroShots does not publish a fixed split between creator compensation, agency commission and the administration of the licence â sourcing, verification, consent records, licence terms, dispute handling and settlement all sit behind that line. Where a [talent agency](/glossary/talent-agency) represents the creator, the agency is compensated under its agreement with that creator rather than through a separate charge to the brand. 4549 4550Usage is recorded per generation and itemised, so a creator can see what was generated
4550with their likeness rather than receiving an unexplained monthly figure. 4551 4552There is no published earnings figure here, and there should not be. What a creator is paid depends entirely on how often brands pick them from the catalog and what those brands then generate. Anyone quoting a monthly range for AI likeness licensing is estimating, not reporting. 4553 4554## What a creator keeps control of 4555 4556- **Scope.** The consent record defines the media covered and any usage restrictions the creator sets. Generations have to sit inside it. 4557- **Revocation.** A creator can withdraw consent; new generations with that likeness stop. 4558- **Non-exclusivity.** Listing a likeness in the catalog is not an exclusivity agreement. The consent record governs use inside HeroShots, not the rest of a creator's work. 4559- **Data rights.** GDPR access and erasure rights apply to the underlying reference material like any other personal data. 4560 4561### What happens when a creator revokes 4562 4563Revocation is the stress test of any consent system. Because the licence is tied to generations rather than to a delivered file, withdrawing consent has a clean effect: new generations with that likeness stop. On the brand side, the concept survives the person â the same product, the same prompt and the same output formats can be regenerated with a different catalog model or with a library AI avatar. 4564 4565## What the brand gets in exchange: clean rights 4566 4567Royalties are not charity â they are what a brand buys defensibility with. In exchange for the creator fee, a brand gets [usage rights](/glossary/usage-rights) it can actually point to: a verified person, a signed [model release](/glossary/model-release), a versioned consent record and a per-generation log. 4568 4569Usage rights are chosen per asset and carry a defined term rather than being assumed. Broadcast usage is a separate selection rather than something bundled in by default, and rights can be upgraded on an existing asset later instead of having to be locked in at the moment of generation. 4570 4571For [AI product photography](/solutions/ai-product-photography) and performance creative, that paper trail is the difference between an asset you can run in paid media and one your legal team quietly kills. It is also the practical distinction from booking a creator ad hoc: see [AI UGC vs hiring UGC creators](/compare/ai-ugc-vs-hiring-ugc-creators) for how the two production models compare on rights, turnaround and iteration. 4572 4573The other thing a brand buys is predictability. A creator fee expressed as a formula â a percentage of a published base price, with a stated floor â behaves differently from a negotiated rate. It does not vary by who is negotiating, does not need re-agreeing for the eleventh variant of the same concept, and can be forecast straight off the price list. Compare that with the cost drivers of a conventional shoot, where the number of people on set, the location, the usage window and the reshoot risk all move independently: see [AI UGC vs a product photoshoot](/compare/ai-ugc-vs-product-photoshoot). 4574 4575### Real creator or AI avatar? 4576 4577Use a real catalog model when the face carries the persuasion â testimonials, unboxings, anything where the viewer is reading a person as much as a product. Use a library AI avatar when you need volume, consistency across a large catalog, or a face with no likeness obligations attached. Plenty of brands do both: real creators for hero assets, AI avatars for the long tail of variants. The mechanics of generation are identical either way â same product upload, same prompt, same output formats. The only thing that changes is whether a real person's rights are in play, and therefore whether a likeness fee is owed. 4578 4579## How creators and agencies join 4580 4581Creators apply through the [creators page](/for-creators). Talent agencies onboarding a roster of represented models should start at [For Agencies â Talent](/for-agencies/talent). Brands can compare model types and base prices on [pricing](/pricing) before committing to a catalog creator.`,metaTitle:"How Creator Royalties Work on HeroShots",faqs:[{q:"How much do creators earn on HeroShots?",a:"There is no guaranteed amount and no published range. What a creator is paid depends entirely on how often brands select them from the catalog and what those brands generate with that likeness. What is published is the fee structure: using a real catalog model adds a creator likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos, applied per paid generation. Anyone quoting a monthly figure for AI likeness licensing is estimating, not reporting."},{q:"What does the 25% creator fee actually cover?",a:"It is what a brand pays on top of the base price for the right to use a real, identifiable person, and it applies only when a real catalog model is used. It is a line on the brand's invoice rather than a published payout percentage: HeroShots does not publish a fixed split between creator compensation, agency commission and the administration of the licence â sourcing, identity verification, consent records, licence terms, dispute handling and settlement. Where a talent agency represents the creator, that agency is compensated under its agreement with the creator rather than through a separate charge to the brand."},{q:"Do AI avatars pay royalties?",a:"No. A library AI avatar is not a real, identifiable person, so no likeness rights are engaged and no creator fee is added â those generations cost the base price only. The same applies to a model you bring yourself after the one-time â¬300 onboarding, where you hold that person's signed release, and to photos you upload, where your brand assumes the rights responsibility."},{q:"Does the free plan generate royalties for creators?",a:"No. The free tier gives 10 watermarked images a month and one video preview with no credit card, and it exists so brands can evaluate output quality before paying. Watermarked previews are demos rather than licensed assets, so they are not paid generations and do not trigger a creator fee. Royalties are tied specifically to paid generations that use a real catalog model."},{q:"Can a creator withdraw consent after their avatar is live?",a:"Yes. Consent is revocable, and new generations with that likeness stop. Because the licence is attached to generations rather than to a delivered file, a brand is not stuck: the same product, the same prompt and the same output formats can be regenerated
4581with a different catalog model or with a library AI avatar. GDPR access and erasure rights apply to the creator's underlying reference material as well."},{q:"How long can a brand use content made with a real creator?",a:"Usage rights are chosen per asset and carry a defined term set out at the point of purchase, rather than being assumed to be unlimited. Broadcast usage is a separate selection rather than something bundled in by default. Rights can also be upgraded on an existing asset later, so a piece of content that started as an organic post does not have to be regenerated to run in a wider channel. The consent agreement behind a real creator's likeness governs what that likeness may be used for."},{q:"Is licensing a likeness to HeroShots exclusive?",a:"No. A creator with an avatar in the catalog can keep working with agencies, brands and other platforms directly. The consent record governs how the licensed likeness may be used inside HeroShots â the media covered and any restrictions the creator sets â not what the creator does with the rest of their career or their own audience."},{q:"How is the creator fee calculated, and how do royalties accrue?",a:"It is calculated as a formula on each paid generation, never as a single flat total: +25% of that generation's base price, with a floor of â¬0.90 on images and â¬5 on videos. Because images are billed per batch of four variants â the first batch of a project at â¬4.90 and each further batch in the same project at â¬1.90 â the fee is worked out against each batch's base price separately. Every paid generation using a real catalog model is logged against that creator's ID and recorded as an itemised line rather than an unexplained monthly figure."},{q:"Can a talent agency represent creators on HeroShots?",a:"Yes. Talent agencies can onboard and represent creators, and manage the consent forms, licence scope and usage restrictions attached to their roster. Commercial terms between an agency and the creators it represents are set in their own agreement rather than published as a fixed percentage, and the brand's cost remains the published base price plus the creator likeness fee. Agencies can start on the For Agencies â Talent page."},{q:"What if I want to use my own model instead of a catalog creator?",a:"You can bring your own person onto the platform for a one-time â¬300 setup fee, which covers capture and integration. You are responsible for obtaining their signed release. From then on, generations using that model carry no creator fee â you pay the base price only. A custom AI avatar built to your own specification is a separate one-time â¬100 setup, and it also carries no creator fee on generations."}]},it:{title:"Come funzionano le royalty per i creator su HeroShots",description:"Ogni volta che un brand genera un'immagine o un video con il tuo volto, vieni pagato. Ecco come funzionano royalty, consensi e payout su HeroShots â powered by Tik Joy.",body:`La maggior parte delle piattaforme "AI model" scrape volti, ci allena modelli, e non paga nessuno. HeroShots è costruito al contrario: ogni Real Model nel catalogo è una persona reale che ha concesso in licenza la propria immagine e viene pagata ogni volta che un brand la usa. Ecco come. 4582 4583## Step 1 â Onboarding e consensi 4584 4585Quando entri in HeroShots come creator, carichi un reference shoot breve (foto + video da 30 secondi) e firmi un **consenso granulare**. Scegli esplicitamente: 4586 4587- Quali **categorie di brand** sono ammesse (fashion, beauty, food, alcol, gambling, adult â ognuna in opt-in). 4588- In quali **aree geografiche** la tua immagine può apparire. 4589- Se la tua immagine può essere usata in **video**, **foto** o entrambi. 4590- Se i brand possono richiedere **outfit custom**, **sfondi custom** o styling specifico. 4591 4592Puoi revocare o aggiornare ognuna di queste opzioni in qualsiasi momento dalla tua dashboard. I nuovi consensi valgono in avanti; gli asset già generati con consensi precedenti restano sotto quelle condizioni, con audit trail. 4593 4594## Step 2 â I brand generano 4595 4596Un brand ti sceglie dal catalogo, carica il prodotto, scrive un prompt e genera contenuti. Ogni singola generazione che usa la tua immagine viene loggata sul tuo creator ID â immagine o video, piano pagato o pay-per-use. 4597 4598## Step 3 â Calcolo della royalty 4599 4600Ricevi una **percentuale su ogni generazione a pagamento** che usa il tuo volto. Lo split è trasparente e visibile nella tua dashboard in tempo reale: 4601 4602- Generazioni **pay-per-use**: royalty per immagine / per video. 4603- Generazioni **subscription** (piani â¬99/mese): quota di royalty calcolata sull'allocazione del piano. 4604- **Piano Free**: le preview con watermark non pagano royalty â sono demo. 4605 4606Quanto guadagni dipende interamente da quanto spesso i brand ti scelgono dal catalogo â non c'è un importo garantito né un tetto massimo. E nessuna esclusiva: continui a lavorare con altre agenzie. 4607 4608## Step 4 â Payout via Tik Joy 4609 4610I payout sono gestiti da **Tik Joy**, infrastruttura di pagamento europea regolata. Significa: 4611
4612- **Settlement mensile automatico** in EUR sul tuo conto (IBAN / SEPA). 4613- **Audit trail completo**: ogni generazione, ogni centesimo, ogni fattura. 4614- **Niente giochi sulle soglie minime**: vieni pagato secondo il calendario concordato. 4615- **Estratti fiscali pronti**: report mensili e annuali scaricabili. 4616 4617## Cosa controlli tu 4618 4619- Il diritto di **mettere in pausa** il tuo profilo dal catalogo in qualsiasi momento (gli asset esistenti restano licenziati, ma non avvengono nuove generazioni). 4620- Il diritto di **escludere specifici brand** anche all'interno di categorie ammesse â utile per esclusioni competitor se lavori con un'agenzia. 4621- **Download completo dei tuoi dati** secondo GDPR. 4622 4623## Cosa significa per la creator economy 4624 4625L'UGC tradizionale paga i creator una volta a shoot. HeroShots li paga **ogni volta che il loro volto genera valore** â mese dopo mese, senza lavoro aggiuntivo. à il primo modello in cui la licenza scala linearmente con il successo del brand, invece di essere un fee una tantum. 4626 4627Se sei un creator e vuoi candidarti, vai alla [pagina Creator](/for-creators). Se sei una Talent Agency e vuoi onboardare la tua roster, vedi [For Agencies â Talent](/for-agencies/talent).`},es:{title:"Cómo funcionan las royalties para creators en HeroShots",description:"Cada vez que una marca genera una imagen o vÃdeo con tu cara, cobras. Asà funcionan royalties, consentimientos y pagos en HeroShots â powered by Tik Joy.",body:`La mayorÃa de plataformas "AI model" scrapean caras, entrenan modelos y no pagan a nadie. HeroShots está construido al revés: cada Real Model del catálogo es una persona real que ha licenciado su imagen y cobra cada vez que una marca la usa. Asà funciona. 4628 4629## Paso 1 â Onboarding y consentimientos 4630 4631Cuando entras en HeroShots como creator, subes un reference shoot corto (fotos + vÃdeo de 30 segundos) y firmas un **consentimiento granular**. Eliges explÃcitamente: 4632 4633- Qué **categorÃas de marca** se permiten (fashion, beauty, food, alcohol, gambling, adult â cada una en opt-in). 4634- En qué **geografÃas** puede aparecer tu imagen. 4635- Si tu imagen puede usarse en **vÃdeo**, **foto** o ambos. 4636- Si las marcas pueden pedir **outfits custom**, **fondos custom** o styling especÃfico. 4637 4638Puedes revocar o actualizar cualquiera en cualquier momento desde tu dashboard. Los nuevos consentimientos aplican hacia adelante; los assets ya generados bajo consentimientos previos siguen bajo esos términos, con audit trail. 4639 4640## Paso 2 â Las marcas generan 4641 4642Una marca te elige del catálogo, sube su producto, escribe un prompt y genera contenido. Cada generación que usa tu imagen se registra contra tu creator ID â imagen o vÃdeo, plan de pago o pay-per-use. 4643 4644## Paso 3 â Cálculo de royalty 4645 4646Recibes un **porcentaje de cada generación de pago** que usa tu cara. El split es transparente y visible en tu dashboard en tiempo real: 4647 4648- Generaciones **pay-per-use**: royalty por imagen / por vÃdeo. 4649- Generaciones **subscription** (planes â¬99/mes): cuota de royalty sobre la asignación del plan. 4650- **Plan Free**: las previews con watermark no pagan royalty â son demos. 4651 4652Lo que ganas depende por completo de cuánto te elijan las marcas del catálogo â no hay importe garantizado ni tope. Tampoco hay exclusividad: sigues trabajando con otras agencias. 4653 4654## Paso 4 â Pagos vÃa Tik Joy 4655 4656Los pagos los gestiona **Tik Joy**, infraestructura de pago europea regulada. Significa: 4657 4658- **Liquidación mensual automática** en EUR a tu cuenta (IBAN / SEPA). 4659- **Audit trail completo**: cada generación, cada céntimo, cada factura. 4660- **Sin trucos de umbral mÃnimo**: cobras según el calendario acordado. 4661- **Reportes fiscales listos**: informes mensuales y anuales descargables. 4662 4663## Lo que tú controlas 4664 4665- El derecho de **pausar** tu perfil del catálogo en cualquier momento (los assets existentes siguen licenciados, pero no se generan nuevos). 4666- El derecho de **rechazar marcas especÃficas** incluso dentro de categorÃas permitidas â útil para exclusiones de competidores si trabajas con una agencia. 4667- **Descarga completa de tus datos** según GDPR. 4668 4669## Qué significa para la creator economy 4670 4671El UGC tradicional paga a los creators una vez por shoot. HeroShots les paga **cada vez que su cara genera valor** â mes a mes, sin trabajo extra. Es el primer modelo donde la licencia escala linealmente con el éxito de la marca, en lugar de ser un fee único. 4672 4673Si eres creator y quieres aplicar, ve a [Creators](/for-creators). Si eres una Talent Agency y quieres onboardar tu roster, mira [For Agencies â Talent](/for-agencies/talent).`},de:{title:"Wie Creator-Royalties bei HeroShots funktionieren",description:"Jedes Mal, wenn eine Marke ein Bild oder Video mit deinem Gesicht generiert, wirst du bezahlt. So funktionieren Royalties, Einwilligungen und Auszahlungen bei HeroShots â powered by Tik Joy.",body:`Die meisten "AI Model"-Plattformen scrapen Gesichter, trainieren Modelle darauf und zahlen niemandem etwas. HeroShots ist andersherum gebaut: Jedes Real Model im Katalog ist eine echte Person, die ihr Ebenbild lizenziert hat und jedes Mal bezahlt wird, wenn eine Marke es nutzt. So läuft das. 4674 4675## Schritt 1 â Onboarding und Einwilligung 4676 4677Wenn du als Creator zu HeroShots kommst, lädst du einen kurzen Reference-Shoot hoch (Fotos + 30-Sekunden-Video) und unterzeichnest eine **granulare Einwilligung**. Du wählst explizit: 4678 4679- Welche **Markenkategorien** erlaubt sind (Fashion, Beauty, Food, Alkohol, Gambling, Adult â jede per Opt-in). 4680- In welchen **Regionen** dein Bild erscheinen darf. 4681- Ob dein Ebenbild in **Video**, **Foto** oder beidem verwendet werden darf. 4682- Ob Marken **Custom-Outfits**, **Custom-Hintergründe** oder spezifisches Styling anfragen dürfen. 4683 4684Du kannst alles jederzeit aus deinem Dashboard widerrufen oder ändern. Neue Einwilligungen gelten ab sofort; bereits generierte Assets bleiben unter den vorherigen Bedingungen mit Audit-Trail. 4685 4686## Schritt 2 â Marken generieren 4687 4688Eine Marke wählt dich aus dem Katalog, lädt ihr Produkt hoch, schreibt einen Prompt und generiert Content. Jede einzelne Generierung, die dein Ebenbild nutzt, wird auf deiner Creator-ID erfasst â Bild oder Video, bezahlter Plan oder Pay-per-Use. 4689 4690## Schritt 3 â Royalty-Berechnung 4691 4692Du erhältst einen **Prozentsatz jeder bezahlten Generierung**, die dein Gesicht nutzt. Der Split ist transparent und in deinem Dashboard in Echtzeit sichtbar: 4693 4694- **Pay-per-Use**-Generierungen: Royalty pro Bild / pro Video. 4695- **Subscription**-Generierungen (â¬99/Monat-Pläne): Royalty-Anteil auf das Plan-Kontingent. 4696- **Free-Plan**: Previews mit Wasserzeichen zahlen keine Royalty â sie sind Demos. 4697 4698Was du verdienst, hängt vollständig davon ab, wie oft Marken dich aus dem Katalog wählen â es gibt keinen garantierten Betrag und keine Obergrenze. Und keine Exklusivität: du arbeitest weiter mit anderen Agenturen. 4699 4700## Schritt 4 â Auszahlung via Tik Joy 4701
4702Auszahlungen laufen über **Tik Joy**, eine regulierte europäische Zahlungsinfrastruktur. Das heiÃt: 4703 4704- **Automatische monatliche Abrechnung** in EUR auf dein Konto (IBAN / SEPA). 4705- **Vollständiger Audit-Trail**: jede Generierung, jeder Cent, jede Rechnung. 4706- **Keine Spielchen mit Mindestschwellen**: du wirst nach vereinbartem Plan bezahlt. 4707- **Steuerfertige Auszüge**: monatliche und jährliche Reports zum Download. 4708 4709## Was unter deiner Kontrolle bleibt 4710 4711- Das Recht, dein Profil jederzeit aus dem Katalog zu **pausieren** (bestehende Assets bleiben lizenziert, aber keine neuen Generierungen). 4712- Das Recht, **bestimmte Marken abzulehnen**, auch innerhalb erlaubter Kategorien â nützlich für Wettbewerbsausschlüsse, wenn du mit einer Agentur arbeitest. 4713- **Vollständiger Download deiner Daten** nach DSGVO. 4714 4715## Was das für die Creator Economy bedeutet 4716 4717Klassisches UGC zahlt Creators einmal pro Shoot. HeroShots zahlt sie **jedes Mal, wenn ihr Gesicht Wert schafft** â Monat für Monat, ohne Mehrarbeit. Es ist das erste Modell, in dem Lizenzierung linear mit dem Erfolg der Marke skaliert, statt eine Einmalgebühr zu sein. 4718 4719Wenn du Creator bist und dich bewerben willst, gehe zu [Creators](/for-creators). Wenn du eine Talent Agency bist und dein Roster onboarden willst, siehe [For Agencies â Talent](/for-agencies/talent).`},fr:{title:"Comment fonctionnent les royalties créateurs sur HeroShots",description:"Chaque fois qu'une marque génère une image ou vidéo avec ton visage, tu es payé. Voici exactement comment fonctionnent royalties, consentements et paiements sur HeroShots â powered by Tik Joy.",body:`La plupart des plateformes "AI model" scrapent des visages, entraînent des modèles dessus, et ne paient personne. HeroShots est construit à l'inverse : chaque Real Model du catalogue est une vraie personne qui a licencié son image et qui est payée à chaque fois qu'une marque l'utilise. Voici comment. 4720 4721## Ãtape 1 â Onboarding et consentements 4722 4723Quand tu rejoins HeroShots comme créateur, tu uploades un reference shoot court (photos + vidéo de 30 secondes) et tu signes un **consentement granulaire**. Tu choisis explicitement : 4724 4725- Quelles **catégories de marque** sont autorisées (fashion, beauty, food, alcool, gambling, adult â chacune en opt-in). 4726- Dans quelles **géographies** ton image peut apparaître. 4727- Si ton image peut être utilisée en **vidéo**, en **photo** ou les deux. 4728- Si les marques peuvent demander des **tenues custom**, des **fonds custom** ou un styling spécifique. 4729 4730Tu peux révoquer ou mettre à jour chacune à tout moment depuis ton dashboard. Les nouveaux consentements s'appliquent à l'avenir ; les assets déjà générés sous consentements précédents restent sous ces termes, avec audit trail. 4731 4732## Ãtape 2 â Les marques génèrent 4733 4734Une marque te choisit dans le catalogue, uploade son produit, écrit un prompt et génère du contenu. Chaque génération qui utilise ton image est loggée sur ton creator ID â image ou vidéo, plan payant ou pay-per-use. 4735 4736## Ãtape 3 â Calcul de la royalty 4737 4738Tu reçois un **pourcentage de chaque génération payante** qui utilise ton visage. Le split est transparent et visible dans ton dashboard en temps réel : 4739 4740- Générations **pay-per-use** : royalty par image / par vidéo. 4741- Générations **subscription** (plans â¬99/mois) : part de royalty calculée sur l'allocation du plan. 4742- **Plan Free** : les previews avec watermark ne paient pas de royalty â ce sont des démos. 4743 4744Ce que tu gagnes dépend entièrement du nombre de fois où les marques te choisissent dans le catalogue â pas de montant garanti, pas de plafond. Et pas d'exclusivité : tu continues à travailler avec d'autres agences. 4745 4746## Ãtape 4 â Paiements via Tik Joy 4747 4748Les paiements sont gérés par **Tik Joy**, infrastructure de paiement européenne régulée. Ãa veut dire : 4749 4750- **Settlement mensuel automatique** en EUR sur ton compte (IBAN / SEPA). 4751- **Audit trail complet** : chaque génération, chaque centime, chaque facture. 4752- **Pas de jeux sur les seuils minimums** : tu es payé selon le calendrier convenu. 4753- **Relevés fiscaux prêts** : rapports mensuels et annuels téléchargeables. 4754 4755## Ce que tu contrôles 4756 4757- Le droit de **mettre en pause** ton profil du catalogue à tout moment (les assets existants restent licenciés, mais pas de nouvelles générations). 4758- Le droit de **rejeter des marques spécifiques** même dans de
4758s catégories autorisées â utile pour exclusions concurrents si tu travailles avec une agence. 4759- **Téléchargement complet de tes données** selon RGPD. 4760 4761## Ce que ça signifie pour la creator economy 4762 4763L'UGC traditionnel paie les créateurs une fois par shoot. HeroShots les paie **chaque fois que leur visage crée de la valeur** â mois après mois, sans travail supplémentaire. C'est le premier modèle où la licence scale linéairement avec le succès de la marque, au lieu d'être un fee unique. 4764 4765Si tu es créateur et veux postuler, va sur [Créateurs](/for-creators). Si tu es une Talent Agency et veux onboarder ton roster, vois [For Agencies â Talent](/for-agencies/talent).`}}}];va.push(...XA,...eP,...tP,...aP,...rP,...oP,...iP);const AL=e=>va.find(t=>t.slug===e),sn=(e,t)=>e.translations[t]??e.translations.en,PL=[{code:"en",label:"English"},{code:"it",label:"Italiano"},{code:"es",label:"Español"},{code:"de",label:"Deutsch"},{code:"fr",label:"Français"}],ze=()=>{var c;const{t:e,i18n:t}=we(),a=((c=t.language)==null?void 0:c.split("-")[0])||"en",n=typeof window<"u"?window.location.pathname:"/",r=ss(n),o=Mu(n),s=[...va].sort((d,u)=>d.date<u.date?1:-1).slice(0,5),l=[{title:e("footer.product"),links:[{name:e("footer.features"),href:"/product"},{name:e("integrations.cardAmazonTitle"),href:"/product/amazon-import"},{name:e("footer.pricing"),href:"/pricing"},{name:e("footer.integrations"),href:"/integrations"}]},{title:e("footer.solutions"),links:[{name:e("footer.ecommerce"),href:"/solutions/ecommerce"},{name:e("footer.agencies"),href:"/solutions/agencies"},{name:e("footer.models"),href:"/talent"},{name:e("home.heroCardBrandTitle"),href:"/for-brands"},{name:e("home.heroCardAgencyTitle"),href:"/for-agencies"},{name:e("home.heroCardModelTitle"),href:"/for-creators"}]},{title:e("footer.resources"),links:[{name:e("footer.documentation"),href:"/docs"},{name:e("footer.apiReference"),href:"/docs"},{name:e("sdks.footerLabel"),href:"/sdks"},{name:e("integrations.cardClaudeTitle"),href:"/integrations/claude"},{name:e("footer.blog"),href:"/blog"},{name:e("footer.compare","Compare"),href:"/compare"},{name:e("footer.glossary","Glossary"),href:"/glossary"},{name:e("footer.about","About"),href:"/about"},{name:e("footer.faq"),href:"/faq"}]},{title:e("footer.legal"),links:[{name:e("footer.terms"),href:"/legal/terms"},{name:e("footer.privacy"),href:"/legal/privacy"},{name:e("footer.cookies"),href:"/legal/cookies"},{name:e("company.aup"),href:"/legal/aup"}]}];return i.jsxs(i.Fragment,{children:[i.jsx("section",{className:"border-t border-border/30 bg-muted/10","aria-label":e("footer.fromTheBlog","From the blog"),children:i.jsxs("div",{className:"container py-8 sm:py-10 px-4 sm:px-6",children:[i.jsxs("div",{className:"flex items-baseline justify-between mb-3 sm:mb-4",children:[i.jsx("h2",{className:"font-semibold text-sm uppercase tracking-wider font-mono",children:e("footer.fromTheBlog","From the blog")}),i.jsxs(M,{to:"/blog",className:"text-xs sm:text-sm text-primary hover:underline",children:[e("footer.viewAllArticles","View all articles")," â"]})]}),i.jsx("ul",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-3 sm:gap-4",children:s.map(d=>{const u=sn(d,a);return i.jsx("li",{children:i.jsx(M,{to:`/blog/${d.slug}`,className:"block text-xs sm:text-sm text-muted-foreground hover:text-foreground transition-colors leading-snug line-clamp-3",title:u.title,children:u.title})},d.slug)})})]})}),i.jsx("footer",{className:"border-t border-border/30 bg-muted/20",children:i.jsxs("div",{className:"container py-8 sm:py-10 md:py-12 px-4 sm:px-6",children:[i.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-6 sm:gap-8",children:[i.jsxs("div",{className:"col-span-2 sm:col-span-3 md:col-span-1 mb-4 md:mb-0",children:[i.jsx(M,{to:"/",className:"flex items-center space-x-2 mb-3 sm:mb-4",children:i.jsx("span",{className:"text-lg sm:text-xl font-display font-bold logo-gradient",children:"HeroShots"})}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground mb-3 sm:mb-4 max-w-xs",children:e("footer.tagline")}),i.jsxs("div",{className:"flex gap-4",children:[i.jsx("a",{href:"https://www.linkedin.com/company/heroshots-ai/",target:"_blank",rel:"noopener noreferrer","aria-label":"HeroShots on LinkedIn",className:"text-muted-foreground hover:text-primary transition-colors",children:i.jsx(MN,{className:"h-4 w-4 sm:h-5 sm:w-5"})}),i.jsx("a",{href:"#",target:"_blank",rel:"noopener noreferrer","aria-label":"HeroShots on TikTok",className:"text-muted-foreground hover:text-primary transition-colors",children:i.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"
4765currentColor",className:"h-4 w-4 sm:h-5 sm:w-5",children:i.jsx("path",{d:"M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 0 1-5.2 1.74 2.89 2.89 0 0 1 2.31-4.64 2.93 2.93 0 0 1 .88.13V9.4a6.84 6.84 0 0 0-1-.05A6.33 6.33 0 0 0 5.8 20.1a6.34 6.34 0 0 0 10.86-4.43V8.84a8.16 8.16 0 0 0 4.77 1.52V6.93a4.85 4.85 0 0 1-1.84-.24z"})})})]})]}),l.map(d=>i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-3 sm:mb-4 text-sm",children:d.title}),i.jsx("ul",{className:"space-y-2 sm:space-y-3",children:d.links.map(u=>i.jsx("li",{children:i.jsx(M,{to:u.href,className:"text-xs sm:text-sm text-muted-foreground hover:text-foreground transition-colors",children:u.name})},u.name))})]},d.title))]}),i.jsxs("div",{className:"border-t border-border/40 mt-6 sm:mt-8 pt-5 sm:pt-6 grid grid-cols-1 md:grid-cols-[auto_auto] md:justify-between gap-x-12 gap-y-6 text-xs sm:text-sm",children:[i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold text-foreground mb-2 uppercase tracking-wider text-[10px] sm:text-xs font-mono",children:e("company.heading")}),i.jsxs("address",{className:"not-italic text-muted-foreground space-y-1 leading-relaxed",children:[i.jsx("div",{className:"text-foreground/90 font-medium",children:e("company.legalName")}),i.jsx("div",{children:e("company.address")}),i.jsxs("div",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.vatId"),": "]}),e("company.vatValue")]})]})]}),i.jsxs("div",{className:"text-right",children:[i.jsx("h4",{className:"font-semibold text-foreground mb-2 uppercase tracking-wider text-[10px] sm:text-xs font-mono",children:e("company.contacts")}),i.jsxs("ul",{className:"text-muted-foreground space-y-1 leading-relaxed",children:[i.jsxs("li",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.email"),": "]}),i.jsx("a",{className:"hover:text-foreground transition-colors",href:"mailto:[email protected]",children:"[email protected]"})]}),i.jsxs("li",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.privacyEmail"),": "]}),i.jsx("a",{className:"hover:text-foreground transition-colors",href:"mailto:[email protected]",children:"[email protected]"})]}),i.jsxs("li",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.abuseEmail"),": "]}),i.jsx("a",{className:"hover:text-foreground transition-colors",href:"mailto:[email protected]",children:"[email protected]"})]}),i.jsxs("li",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.appealsEmail"),": "]}),i.jsx("a",{className:"hover:text-foreground transition-colors",href:"mailto:[email protected]",children:"[email protected]"})]}),i.jsxs("li",{children:[i.jsxs("span",{className:"text-foreground/70",children:[e("company.pec"),": "]}),i.jsx("a",{className:"hover:text-foreground transition-colors",href:"mailto:[email protected]",children:"[email protected]"})]})]})]})]}),i.jsxs("nav",{"aria-label":e("footer.languages","Languages"),className:"mt-6 sm:mt-8 pt-5 sm:pt-6 border-t border-border/40 flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-xs sm:text-sm",children:[i.jsx("span",{className:"text-muted-foreground uppercase tracking-wider text-[10px] sm:text-xs",children:e("footer.languages","Languages")}),PL.map(d=>i.jsx("a",{href:Zg(d.code,o),hrefLang:d.code,lang:d.code,className:d.code===r?"text-foreground font-medium":"text-muted-foreground hover:text-foreground transition-colors",children:d.label},d.code))]}),i.jsxs("div",{className:"mt-6 sm:mt-8 pt-5 sm:pt-6 border-t border-border/40 flex flex-col items-center gap-3 sm:gap-4 sm:flex-row sm:justify-between",children:[i.jsxs("p",{className:"text-xs sm:text-sm text-muted-foreground text-center sm:text-left",children:["© ",new Date().getFullYear()," HeroShots. ",e("footer.allRights")]}),i.jsxs("div",{className:"flex items-center gap-2 text-xs sm:text-sm text-muted-foreground",children:[i.jsx("span",{className:"uppercase tracking-wider text-[10px] sm:text-xs",children:"part of"}),i.jsx("a",{href:"https://fancycapital.it",target:"_blank",rel:"noopener noreferrer","aria-label":"Fancy Capital",children:i.jsx("img",{src:"/fancy-capital-logo-light.svg",alt:"Fancy Capital",className:"h-6 sm:h-7 w-auto opacity-80 hover:opacity-100 transition-opacity"})})]})]})]})})]})},TL=()=>{const{t:e}=we();return i.jsx("div",{className:"w-full gradient-hero py-2 sm:py-2.5 px-3 sm:px-4 text-center",children:i.jsxs("div",{className:"container flex items-center justify-center gap-1.5 sm:gap-2 text-[10px] sm:text-xs font-medium tracking-wide text-primary-foreground uppercase",children:[i.jsx(Sn,{className:"h-3 w-3 sm:h-3.5 sm:w-3.5 shrink-0"}),i.jsx("span",{className:"line-clamp-1",children:e("promo.text")})]})})},IL=({count:e="500+"})=>{const{t}=we();return i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-muted/50 border border-border/50",children:[i.jsxs("div",{className:"flex -sp
4765ace-x-2",children:[i.jsx("div",{className:"w-8 h-8 rounded-full bg-gradient-to-br from-primary to-accent flex items-center justify-center text-primary-foreground text-xs font-bold",children:"U"}),i.jsx("div",{className:"w-8 h-8 rounded-full bg-gradient-to-br from-accent to-primary flex items-center justify-center text-primary-foreground text-xs font-bold",children:"G"}),i.jsx("div",{className:"w-8 h-8 rounded-full bg-gradient-to-br from-primary/80 to-accent/80 flex items-center justify-center text-primary-foreground text-xs font-bold",children:"C"})]}),i.jsxs("div",{className:"flex items-center gap-1.5 text-sm",children:[i.jsx(Ha,{className:"h-4 w-4 text-primary"}),i.jsx("span",{className:"font-semibold text-foreground",children:e}),i.jsx("span",{className:"text-muted-foreground",children:t("home.earlyUsers").toLowerCase()})]})]})},jL=`${ht}/og-image.png`,Lw="data-seo-managed",Se=({title:e,description:t,canonical:a,ogType:n="website",ogImage:r=jL,noindex:o=!1,enOnly:s=!1,jsonLd:l})=>{var v;const{i18n:c}=we(),{pathname:d}=Wa(),u=(v=c.language)==null?void 0:v.split("-")[0],h=CS(u)?u:aa,m=a?q_(a):Mu(d),p=s?aa:h,b=uo(p,m),g=e.includes("HeroShots")?e:`${e} | HeroShots`;return f.useEffect(()=>{const w=document.head,y=(C,S,A)=>{let P=w.querySelector(`meta[${C}="${S}"]`);P||(P=document.createElement("meta"),P.setAttribute(C,S),w.appendChild(P)),P.setAttribute("content",A)},x=(C,S)=>{let A=w.querySelector(`link[rel="${C}"]:not([hreflang])`);A||(A=document.createElement("link"),A.setAttribute("rel",C),w.appendChild(A)),A.setAttribute("href",S)};document.documentElement.lang=p,document.title=g,y("name","description",t),y("name","robots",o?"noindex, nofollow":"index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"),y("name","theme-color","#0f0717"),x("canonical",b),y("property","og:title",g),y("property","og:description",t),y("property","og:type",n),y("property","og:url",b),y("property","og:image",r),y("property","og:site_name","HeroShots"),y("property","og:locale",Lb[p]),y("name","twitter:card","summary_large_image"),y("name","twitter:title",g),y("name","twitter:description",t),y("name","twitter:image",r),w.querySelectorAll(`[${Lw}]`).forEach(C=>C.remove());const k=C=>{C.setAttribute(Lw,""),w.appendChild(C)};if(!o&&!s){for(const S of Fd){const A=document.createElement("link");A.setAttribute("rel","alternate"),A.setAttribute("hreflang",S),A.setAttribute("href",uo(S,m)),k(A)}const C=document.createElement("link");C.setAttribute("rel","alternate"),C.setAttribute("hreflang","x-default"),C.setAttribute("href",uo(aa,m)),k(C)}for(const C of Fd){if(s||C===p)continue;const S=document.createElement("meta");S.setAttribute("property","og:locale:alternate"),S.setAttribute("content",Lb[C]),k(S)}if(l){const C=Array.isArray(l)?l:[l];for(const S of C){const A=document.createElement("script");A.type="application/ld+json",A.textContent=JSON.stringify(S),k(A)}}},[g,t,b,n,r,o,s,p,m,JSON.stringify(l)]),null},ua={firstBatch:4.9,newBatch:1.9,imageEdit:.39,imageEditPro:.23,video15s:15,video30s:35,extraRetryPer15s:5,proMonthly:99},Lc={catalogModelPercent:25,minPerImage:.9,minPerVideo:5,customAvatarSetup:100,bringYourOwnModelSetup:300},df=[{name:"Starter",total:350,perVideo:70},{name:"Growth",total:650,perVideo:65},{name:"Scale",total:1500,perVideo:60}],NL={imagesPerMonth:10,videoPreviews:1},EL=e=>Number.isInteger(e)?`â¬${e}`:`â¬${e.toFixed(2)}`;[...Object.values(ua),Lc.minPerImage,Lc.minPerVideo,Lc.customAvatarSetup,Lc.bringYourOwnModelSetup,...df.flatMap(e=>[e.total,e.perVideo])].map(e=>EL(e));const zL="/assets/hero-demo-CdIpCzR3.png",sP=({asset:e,reverse:t=!1,className:a})=>{const{t:n}=we();return i.jsxs("figure",{className:J("group relative pb-16",a),children:[i.jsxs("div",{className:J("relative aspect-[4/3] overflow-hidden rounded-2xl border border-border/40 shadow-elegant","transition-transform duration-500 will-change-transform",t?"rotate-[1.5deg] group-hover:rotate-0":"-rotate-[1.5deg] group-hover:rotate-0"),children:[i.jsx("img",{src:e.scene,alt:`${e.product} â ${n("showcase.afterAlt")}`,loading:"lazy",decoding:"async",className:"h-full w-full object-cover"}),i.jsxs("span",{className:"absolute right-3 top-3 inline-flex items-center gap-1.5 rounded-full border border-white/25 bg-black/55 px-3 py-1 text-[11px] font-medium text-white backdrop-blur-sm",children:[i.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-primary","aria-hidden":"true"}),n("showcase.aiGenerated")]})]}),i.jsxs("div",{className:J("absolute -bottom-3 left-1 sm:-left-6 z-10 w-[34%] max-w-[170px]"),children:[i.jsx("img",{src:e.cutout,alt:`${e.product} â ${n("showcase.before")}`,loading:"lazy",decoding:"async",className:J("w-full h-auto drop-shadow-2xl transition-transform duration-500",t?"-rotate-[9deg] group-hover:-rotate-[3deg]":"rotate-[9deg] group-hover:rotate-[3deg]")}),i.jsx("span",{className:"mt-2 block text-center text-[10px] font-mono uppercase tracking-wider text-muted-foreground
4765/70",children:n("showcase.before")})]}),i.jsx("figcaption",{className:"sr-only",children:n("showcase.disclaimer")})]})},ot="/assets/showcase",Xd=[{slug:"adidas-grand-court",product:"adidas Grand Court",category:"footwear",categoryLabel:"Footwear",packshot:`${ot}/adidas-grand-court-packshot-600.jpg`,cutout:`${ot}/adidas-grand-court-cutout-600.png`,scene:`${ot}/adidas-grand-court-scene-1200.jpg`,sceneSmall:`${ot}/adidas-grand-court-scene-600.jpg`,aspect:"4:3",aiGenerated:!0},{slug:"yankee-candle-home-sweet-home",product:"Yankee Candle Home Sweet Home",category:"home",categoryLabel:"Home fragrance",packshot:`${ot}/yankee-candle-home-sweet-home-packshot-600.jpg`,cutout:`${ot}/yankee-candle-home-sweet-home-cutout-600.png`,scene:`${ot}/yankee-candle-home-sweet-home-scene-1200.jpg`,sceneSmall:`${ot}/yankee-candle-home-sweet-home-scene-600.jpg`,aspect:"4:3",aiGenerated:!0},{slug:"jbl-headphones",product:"JBL over-ear headphones",category:"audio",categoryLabel:"Audio",packshot:`${ot}/jbl-headphones-packshot-600.jpg`,cutout:`${ot}/jbl-headphones-cutout-600.png`,scene:`${ot}/jbl-headphones-scene-1200.jpg`,sceneSmall:`${ot}/jbl-headphones-scene-600.jpg`,aspect:"1:1",aiGenerated:!0},{slug:"loreal-revitalift-filler",product:"L'Oréal Revitalift Filler",category:"skincare",categoryLabel:"Skincare",packshot:`${ot}/loreal-revitalift-filler-packshot-600.jpg`,cutout:`${ot}/loreal-revitalift-filler-cutout-600.png`,scene:`${ot}/loreal-revitalift-filler-scene-1200.jpg`,sceneSmall:`${ot}/loreal-revitalift-filler-scene-600.jpg`,aspect:"1:1",aiGenerated:!0},{slug:"supradyn-magnesio-potassio",product:"Supradyn Magnesio e Potassio",category:"supplements",categoryLabel:"Supplements",packshot:`${ot}/supradyn-magnesio-potassio-packshot-600.jpg`,cutout:`${ot}/supradyn-magnesio-potassio-cutout-600.png`,scene:`${ot}/supradyn-magnesio-potassio-scene-1200.jpg`,sceneSmall:`${ot}/supradyn-magnesio-potassio-scene-600.jpg`,aspect:"4:3",aiGenerated:!0}];Object.fromEntries(Xd.map(e=>[e.slug,e]));const wy=({slugs:e,title:t,subtitle:a,className:n})=>{const{t:r}=we(),o=e!=null&&e.length?e.map(s=>Xd.find(l=>l.slug===s)).filter(Boolean):Xd.slice(0,3);return o.length?i.jsx("section",{className:J("py-10 sm:py-14 md:py-20",n),children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-3xl mx-auto mb-10 sm:mb-14",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:t??r("showcase.bandTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground leading-relaxed",children:a??r("showcase.bandSubtitle")})]}),i.jsx("div",{className:"grid gap-12 sm:gap-8 md:grid-cols-3 max-w-6xl mx-auto",children:o.map((s,l)=>i.jsx(sP,{asset:s,reverse:l%2===1},s.slug))})]})}):null},RL=()=>{const{t:e}=we(),[t,a]=f.useState("brand"),[n,r]=f.useState("brand"),[o,s]=f.useState("brand"),[l,c]=f.useState("brand");e("home.vp1Title"),e("home.vp1Desc"),e("home.vp2Title"),e("home.vp2Desc"),e("home.vp3Title"),e("home.vp3Desc");const d={brand:[{number:"01",title:e("home.howBrandStep1Title"),description:e("home.howBrandStep1Desc")},{number:"02",title:e("home.howBrandStep2Title"),description:e("home.howBrandStep2Desc")},{number:"03",title:e("home.howBrandStep3Title"),description:e("home.howBrandStep3Desc")}],agency:[{number:"01",title:e("home.howAgencyStep1Title"),description:e("home.howAgencyStep1Desc")},{number:"02",title:e("home.howAgencyStep2Title"),description:e("home.howAgencyStep2Desc")},{number:"03",title:e("home.howAgencyStep3Title"),description:e("home.howAgencyStep3Desc")}],model:[{number:"01",title:e("home.howModelStep1Title"),description:e("home.howModelStep1Desc")},{number:"02",title:e("home.howModelStep2Title"),description:e("home.howModelStep2Desc")},{number:"03",title:e("home.howModelStep3Title"),description:e("home.howModelStep3Desc")}]},u={brand:[{title:e("home.personTitle"),desc:e("home.personDesc")},{title:e("home.productTitle"),desc:e("home.productDesc")},{title:e("home.promptTitle"),desc:e("home.promptDesc")},{title:e("home.publishRewardTitle"),desc:e("home.publishRewardDesc")}],agency:[{title:e("home.controlAgencyFeat1Title"),desc:e("home.controlAgencyFeat1Desc")},{title:e("home.controlAgencyFeat2Title"),desc:e("home.controlAgencyFeat2Desc")},{title:e("home.controlAgencyFeat3Title"),desc:e("home.controlAgencyFeat3Desc")},{title:e("home.controlAgencyFeat4Title"),desc:e("home.controlAgencyFeat4Desc")}],model:[{title:e("home.controlModelFeat1Title"),desc:e("home.controlModelFeat1Desc")},{title:e("home.controlModelFeat2Title"),desc:e("home.controlModelFeat2Desc")},{title:e("home.controlModelFeat3Title"),desc:e("home.controlModelFeat3Desc")},{title:e("home.controlModelFeat4Title"),desc:e("home.controlModelFeat4Desc")}]},h=[{key:"brand",icon:Zr,label:e("home.heroCardBrandTitle")},{key:"agency",icon:td,label:e("home.heroCardAgencyTitle")},{key:"model",icon:$s,label:e("home.heroCardModelTitle")}],m=[{value:"500+",label:e("home.earlyUsers")},{value:String(NL.imagesPerMonth),label:e("home.avgConversion")},{value:"<60s",label:e("home.genTime")}],p={brand:{icon:Zr,label:e("authRoles.brand"),features:[{icon:xi,title:e("authRoles.brandFeat1Title"),desc:e("authRoles.brandFeat1Desc")},{icon:pi,title:e("authRoles.brandFeat2Title"),desc:e("authRoles.brandFeat2Desc")},{icon:Sn,title:e("authRoles.brandFeat3Title"),desc:e("authRoles.brandFeat3Desc")}]},agency:{icon:td,label:e("authRoles.agency"),features:[{icon:Tu,title:e("authRoles.agencyFeat1Title"),desc:e("authRoles.agencyFeat1Desc")},{icon:pi,title:e("authRoles.agencyFeat2Title"),desc:e("authRoles.agencyFeat2Desc")},{icon:Zr,title:e("authRoles.agencyFeat3Title"),desc:e("authRoles.agencyFeat3Desc")}]},model:{icon:$s,label:e("authRoles.model"),features:[{icon:xi,title:e("authRoles.modelFeat1Title"),desc:e("authRoles.modelFeat1Desc")},{icon:wt,title:e("authRoles.modelFeat2Title"),desc:e("authRoles.modelFeat2Desc")},{icon:es,title:e("authRoles.modelFeat3Title"),desc:e("authRoles.modelFeat3Desc")}]}},b=p[t],g=[{"@context":"https://schema.org","@type":"WebPage","@id":"https://heroshots.ai/#webpage",url:"https://heroshots.ai/",name:"HeroShots â Real Creators, AI-Powered Content",isPartOf:{"@id":"https://heroshots.ai/#website"},about:{"@id":"https://heroshots.ai/#organization"},primaryImageOfPage:"https://heroshots.ai/og-image.png"}];return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("home.seoTitle","HeroShots â Real Creators, AI-Powered Content"),description:e("home.seoDesc","Creators license their likeness as AI avatars. Brands generate authentic UGC at scale â no photoshoot needed. Photo & video in under 60 seconds."),canonical:"https://heroshots.ai",jsonLd:g}),i.jsx(TL,{}),i.jsx(Ee,{}),i.jsxs("section",{className:"relative py-10 sm:py-14 md:py-20 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4765parent to-transparent"}),i.jsxs("div",{className:"container relative px-4 sm:px-6",children:[i.jsx("div",{className:"flex flex-col items-center text-center mb-6 sm:mb-8 animate-fade-in",children:i.jsx(IL,{})}),i.jsxs("div",{className:"grid lg:grid-cols-2 gap-10 sm:gap-16 items-center",children:[i.jsxs("div",{className:"animate-slide-up space-y-6 sm:space-y-10",children:[i.jsxs("h1",{className:"text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-display font-bold leading-[1.1]",children:[e("home.heroTitle")," ",i.jsx("span",{className:"block mt-2 sm:mt-3 text-gradient italic",children:e("home.heroHighlight")})]}),i.jsx("p",{className:"text-base sm:text-lg md:text-xl text-muted-foreground max-w-xl leading-relaxed",children:e("home.heroSubtitle")}),i.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3 items-stretch",children:[{key:"brand",icon:Zr,title:e("home.heroCardBrandTitle"),desc:e("home.heroCardBrandDesc"),to:"/for-brands"},{key:"agency",icon:td,title:e("home.heroCardAgencyTitle"),desc:e("home.heroCardAgencyDesc"),to:"/for-agencies"},{key:"model",icon:$s,title:e("home.heroCardModelTitle"),desc:e("home.heroCardModelDesc"),to:"/for-creators"}].map(v=>i.jsxs("div",{role:"button",tabIndex:0,onClick:()=>r(v.key),onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),r(v.key))},className:J("h-full flex flex-col text-left p-3 sm:p-4 rounded-xl border transition-all duration-300 group cursor-pointer",n===v.ke
4765y?"border-primary/50 bg-primary/5 shadow-elegant":"border-border/30 bg-card/40 hover:border-primary/30 hover:bg-primary/3"),children:[i.jsxs("div",{className:"flex items-center gap-2 mb-2 min-h-[2rem] sm:min-h-[2.25rem]",children:[i.jsx("div",{className:J("w-7 h-7 sm:w-8 sm:h-8 rounded-lg flex items-center justify-center transition-colors",n===v.key?"bg-primary/15":"bg-muted/50"),children:i.jsx(v.icon,{className:J("h-3.5 w-3.5 sm:h-4 sm:w-4 transition-colors",n===v.key?"text-primary":"text-muted-foreground")})}),i.jsx("span",{className:J("text-xs sm:text-sm font-semibold transition-colors",n===v.key?"text-foreground":"text-muted-foreground"),children:v.title})]}),i.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed flex-1",children:v.desc}),i.jsxs(M,{to:v.to,onClick:w=>w.stopPropagation(),className:"mt-2 text-xs font-medium text-primary hover:underline self-start",children:[e("common.learnMore")," â"]})]},v.key))}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 sm:gap-4 items-stretch sm:items-center justify-center lg:justify-start",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("common.tryItNow")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx(M,{to:"/pre-sales",children:e("common.bookDemo")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground/70 text-center lg:text-left tracking-wide uppercase",children:e("common.noCreditCard")}),i.jsxs("div",{className:"flex items-center gap-2 justify-center lg:justify-start flex-wrap",children:[i.jsx("div",{className:"flex items-center gap-0.5",children:[...Array(5)].map((v,w)=>i.jsx(cb,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4 fill-primary text-primary"},w))}),i.jsx("span",{className:"text-xs sm:text-sm text-muted-foreground",children:e("home.rated")})]})]}),i.jsxs("div",{className:"animate-slide-up relative mt-4 lg:mt-0",children:[i.jsx("div",{className:"absolute -inset-4 sm:-inset-8 bg-gradient-to-r from-primary/10 to-accent/10 rounded-3xl blur-3xl"}),i.jsx("img",{src:zL,alt:"HeroShots demo interface showing person, product, and prompt inputs",width:1920,height:1080,fetchPriority:"high",decoding:"async",className:"relative rounded-xl sm:rounded-2xl shadow-soft w-full"})]})]}),i.jsx("div",{className:"grid grid-cols-3 gap-3 sm:gap-6 mt-10 sm:mt-14 max-w-4xl mx-auto",children:m.map((v,w)=>i.jsxs("div",{className:"text-center p-4 sm:p-8 rounded-xl sm:rounded-2xl glass-card",children:[i.jsx("div",{className:"text-2xl sm:text-4xl font-display font-bold mb-1 sm:mb-2 text-gradient",children:v.value}),i.jsx("div",{className:"text-[10px] sm:text-sm text-muted-foreground tracking-wide",children:v.label})]},w))})]})]}),i.jsx(wy,{slugs:["adidas-grand-court","loreal-revitalift-filler","yankee-candle-home-sweet-home"],className:"bg-muted/20"}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-6 sm:mb-8",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:e("home.rolesTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-2xl mx-auto leading-relaxed",children:e("home.rolesSubtitle")})]}),i.jsxs("div",{className:"max-w-4xl mx-auto",children:[i.jsx("div",{className:"flex gap-1 sm:gap-2 p-1 sm:p-1.5 bg-muted/50 rounded-lg sm:rounded-xl w-full sm:w-fit mx-auto mb-8 sm:mb-12",children:["brand","agency","model"].map(v=>{const w=p[v].icon;return i.jsxs("button",{onClick:()=>a(v),className:J("flex-1 sm:flex-none flex items-center justify-center sm:justify-start gap-1.5 sm:gap-2 px-3 sm:px-5 py-2 sm:py-2.5 rounded-md sm:rounded-lg text-xs sm:text-sm font-medium transition-all duration-300",t===v?"bg-primary text-primary-foreground shadow-elegant":"text-muted-foreground hover:text-foreground hover:bg-muted"),children:[i.jsx(w,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"}),i.jsx("span",{className:"truncate",children:p[v].label})]},v)})}),i.jsx("div",{className:"grid sm:grid-cols-2 md:grid-cols-3 gap-4 sm:gap-6 md:gap-8",children:b.features.map(({icon:v,title:w,desc:y})=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-6 sm:pt-8 pb-6 sm:pb-8 space-y-3 sm:space-y-5",children:[i.jsx("div",{className:"w-10 h-10 sm:w-12 sm:h-12 rounded-xl sm:rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(v,{className:"h-4 w-4 sm:h-5 sm:w-5 text-primary"})}),i.jsx("h3",{className:"text-lg sm:text-xl font-display font-semibold",children:w}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:y})]})},w))}),i.jsx("div",{className:"text-center mt-6 sm:mt-8",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("common.getStarted")})})})]})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-10",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:e("home.howTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-2xl mx-auto leading-relaxed",children:e("home.howSubtitle")})]}),i.jsx("div",{className:"flex gap-1 sm:gap-2 p-1 sm:p-1.5 bg-muted/50 rounded-lg sm:rounded-xl w-full sm:w-fit mx-auto mb-8 sm:mb-12",children:h.map(v=>i.jsxs("button",{onClick:()=>s(v.key),className:J("flex-1 sm:flex-none flex items-center justify-center sm:justify-start gap-1.5 sm:gap-2 px-3 sm:px-5 py-2 sm:py-2.5 rounded-md sm:rounded-lg text-xs sm:text-sm font-medium transition-all duration-300",o===v.key?"bg-primary text-primary-foreground shadow-elegant":"text-muted-foreground hover:text-foreground hover:bg-muted"),children:[i.jsx(v.icon,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"}),i.jsx("span",{className:"truncate",children:v.label})]},v.key))}),i.jsx("div",{className:"grid sm:grid-cols-3 gap-8 sm:gap-12 max-w-5xl mx-auto",children:d[o].map((v,w)=>i.jsxs("div",{className:"text-center group animate-fade-in",children:[i.jsx("div",{className:"relative mb-6 sm:mb-8",children:i.jsx("div",{className:"inline-flex items-center justify-center w-16 h-16 sm:w-20 sm:h-20 rounded-xl sm:rounded-2xl gradient-hero text-primary-foreground text-xl sm:text-2xl font-display font-bold shadow-elegant transition-all duration-500 group-hover:shadow-glow group-hover:scale-105",children:v.number})}),i.jsx("h3",{className:"text-lg sm:text-xl font-display font-semibold mb-2 sm:mb-3",children:v.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:v.description})]},`${o}-${w}`))}),i.jsx("div",{className:"text-center mt-8 sm:mt-10",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsxs("a",{href:"https://app.heroshots.ai/login",children:[i.jsx(pi,{className:"mr-2 h-5 w-5"}),e("home.startCreating")]})})})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-10",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:e("home.controlTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-3xl mx-auto leading-relaxed",children:e("home.controlSubtitle")})]}),i.jsx("div",{className:"flex gap-1 sm:gap-2 p-1 sm:p-1.5 bg-muted/50 rounded-lg sm:rounded-xl w-full sm:w-fit mx-auto mb-8 sm:mb-12",children:h.map(v=>i.jsxs("button",{onClick:()=>c(v.key),className:J("flex-1 sm:flex-none flex items-center justify-center sm:justify-start gap-1.5 sm:gap-2 px-3 sm:px-5 py-2 sm:py-2.5 rounded-md sm:rounded-lg text-xs sm:text-sm font-medium transition-all duration-300",l===v.key?"bg-primary text-primary-foreground shadow-elegant":"text-muted-foreground hover:text-foreground hover:bg-muted"),children:[i.jsx(v.icon,{className:"h-3.5 w-3.5 sm:h-4 sm:w-4"}),i.jsx("span",{className:"truncate",children:v.label})]},v.key))}),i.jsx("div",{className:"grid sm:grid-cols-2 gap-4 sm:gap-8 max-w-6xl mx-auto",children:u[l].map((v,w)=>i.jsxs("div",{className:"p-5 sm:p-8 rounded-xl sm:rounded-2xl glass-card hover:shadow-elegant transition-all duration-500 animate-fade-in",children:[i.jsx("h3",{className:"text-lg sm:text-xl font-display font-semibold mb-3 sm:mb-4",children:v.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:v.desc})]},`${l}-${w}`))})]})}),i.jsxs("section",{className:"py-10 sm:py-14 md:py-20 relative overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4765parent to-transparent"}),i.jsxs("div",{className:"container relative px-4 sm:px-6",children:[i.jsxs("div",{className:"max-w-3xl mx-auto text-center mb-8 sm:mb-10",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:e("home.aboutTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground leading-relaxed",children:e("home.aboutDesc")})]}),i.jsx("div",{className:"grid grid-cols-3 gap-3 sm:gap-8 max-w-4xl mx-auto mb-8 sm:mb-10",children:[{value:"4",label:e("home.stat1Label")},{value:`â¬${ua.firstBatch.toFixed(2)}`,label:e("home.stat2Label")},{value:"5",label:e("home.stat3Label")}].map((v,w)=>i.jsxs("div",{className:"text-center p-4 sm:p-10 rounded-xl sm:rounded-2xl glass-card",children:[i.jsx("div",{className:"text-2xl sm:text-5xl font-display font-bold mb-1 sm:mb-3 text-gradient",children:v.value}),i.jsx("p",{className:"text-muted-foreground text-[10px] sm:text-sm",children:v.label})]},w))}),i.jsx("div",{className:"text-center",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("common.tryItNow")})})})]})]}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-10",children:[i.jsx("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-display font-bold mb-4 sm:mb-5",children:e("home.useCasesTitle")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-3xl mx-auto leading-relaxed",children:e("home.useCasesSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-8 max-w-6xl mx-auto",children:[{icon:gl,title:e("home.ecommTitle"),desc:e("home.ecommDesc")},{icon:Sn,title:e("home.dropTitle"),desc:e("home.dropDesc")},{icon:pi,title:e("home.dtcTitle"),desc:e("home.dtcDesc")},{icon:Ha,title:e("home.agenciesTitle"),desc:e("home.agenciesDesc")},{icon:cb,title:e("home.marketTitle"),desc:e("home.marketDesc")},{icon:wt,title:e("home.creatorsTitle"),desc:e("home.creatorsDesc")}].map((v,w)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-6 sm:pt-8 pb-6 sm:pb-8 space-y-3 sm:space-y-5",children:[i.jsx("div",{className:"w-10 h-10 sm:w-12 sm:h-12 rounded-xl sm:rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(v.icon,{className:"h-4 w-4 sm:h-5 sm:w-5 text-primary"})}),i.jsx("h3",{className:"text-lg sm:text-xl font-display font-semibold",children:v.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:v.desc})]})},w))}),i.jsx("div",{className:"text-center mt-8 sm:mt-10",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx(M,{to:"/solutions",children:e("common.learnMore")})})})]})}),i.jsx("section",{className:"py-14 sm:py-20 border-t border-border/30",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10",children:[i.jsx("p",{className:"text-xs uppercase tracking-wider font-mono text-primary mb-3",children:e("whatsNew.eyebrow")}),i.jsx("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-display font-bold mb-3",children:e("whatsNew.title")}),i.jsx("p",{className:"text-muted-foreground max-w-2xl mx-auto",children:e("whatsNew.subtitle")})]}),i.jsxs("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-4 max-w-5xl mx-auto",children:[i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"p-6 sm:p-8",children:[i.jsxs("div",{className:"flex items-center justify-between mb-4",children:[i.jsx("div",{className:"w-10 h-10 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(wt,{className:"h-5 w-5 text-primary"})}),i.jsx("span",{className:"text-[10px] uppercase tracking-wider font-mono px-2 py-0.5 rounded bg-primary/10 text-primary",children:e("whatsNew.newBadge")})]}),i.jsx("h3",{className:"text-xl font-display font-semibold mb-2",children:e("whatsNew.claudeTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:e("whatsNew.claudeDesc")}),i.jsx(H,{variant:"outline",size:"sm",asChild:!0,children:i.jsx(M,{to:"/integrations/claude",children:e("whatsNew.claudeCta")})})]})}),i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"p-6 sm:p-8",children:[i.jsxs("div",{className:"flex items-center justify-between mb-4",children:[i.jsx("div",{className:"w-10 h-10 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(xi,{className:"h-5 w-5 text-primary"})}),i.jsx("span",{className:"text-[10px] uppercase tracking-wider font-mono px-2 py-0.5 rounded bg-primary/10 text-primary",children:e("whatsNew.newBadge")})]}),i.jsx("h3",{className:"text-xl font-display font-semibold mb-2",children:e("whatsNew.amazonTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:e("whatsNew.amazonDesc")}),i.jsx(H,{variant:"outline",size:"sm",asChild:!0,children:i.jsx(M,{to:"/product/amazon-import",children:e("whatsNew.amazonCta")})})]})}),i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"p-6 sm:p-8",children:[i.jsxs("div",{className:"flex items-center justify-between mb-4",children:[i.jsx("div",{className:"w-10 h-10 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(wt,{className:"h-5 w-5 text-primary"})}),i.jsx("span",{className:"text-[10px] uppercase tracking-wider font-mono px-2 py-0.5 rounded bg-primary/10 text-primary",children:e("whatsNew.newBadge")})]}),i.jsx("h3",{className:"text-xl font-display font-semibold mb-2",children:e("whatsNew.sdksTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:e("whatsNew.sdksDesc")}),i.jsx(H,{variant:"outline",size:"sm",asChild:!0,children:i.jsx(M,{to:"/sdks",children:e("whatsNew.sdksCta")})})]})})]})]})}),i.jsx(ze,{})]})};var Qu="Tabs",[DL,vF]=Wt(Qu,[$u]),lP=$u(),[_L,xy]=DL(Qu),cP=f.forwardRef((e,t)=>
4765{const{__scopeTabs:a,value:n,onValueChange:r,defaultValue:o,orientation:s="horizontal",dir:l,activationMode:c="automatic",...d}=e,u=ds(l),[h,m]=Vt({prop:n,onChange:r,defaultProp:o??"",caller:Qu});return i.jsx(_L,{scope:a,baseId:_t(),value:h,onValueChange:m,orientation:s,dir:u,activationMode:c,children:i.jsx(ee.div,{dir:u,"data-orientation":s,...d,ref:t})})});cP.displayName=Qu;var dP="TabsList",uP=f.forwardRef((e,t)=>{const{__scopeTabs:a,loop:n=!0,...r}=e,o=xy(dP,a),s=lP(a);return i.jsx(aA,{asChild:!0,...s,orientation:o.orientation,dir:o.dir,loop:n,children:i.jsx(ee.div,{role:"tablist","aria-orientation":o.orientation,...r,ref:t})})});uP.displayName=dP;var hP="TabsTrigger",pP=f.forwardRef((e,t)=>{const{__scopeTabs:a,value:n,disabled:r=!1,...o}=e,s=xy(hP,a),l=lP(a),c=gP(s.baseId,n),d=yP(s.baseId,n),u=n===s.value;return i.jsx(nA,{asChild:!0,...l,focusable:!r,active:u,children:i.jsx(ee.button,{type:"button",role:"tab","aria-selected":u,"aria-controls":d,"data-state":u?"active":"inactive","data-disabled":r?"":void 0,disabled:r,id:c,...o,ref:t,onMouseDown:q(e.onMouseDown,h=>{!r&&h.button===0&&h.ctrlKey===!1?s.onValueChange(n):h.preventDefault()}),onKeyDown:q(e.onKeyDown,h=>{[" ","Enter"].includes(h.key)&&s.onValueChange(n)}),onFocus:q(e.onFocus,()=>{const h=s.activationMode!=="manual";!u&&!r&&h&&s.onValueChange(n)})})})});pP.displayName=hP;var mP="TabsContent",fP=f.forwardRef((e,t)=>{const{__scopeTabs:a,value:n,forceMount:r,children:o,...s}=e,l=xy(mP,a),c=gP(l.baseId,n),d=yP(l.baseId,n),u=n===l.value,h=f.useRef(u);return f.useEffect(()=>{const m=requestAnimationFrame(()=>h.current=!1);return()=>cancelAnimationFrame(m)},[]),i.jsx(ft,{present:r||u,children:({present:m})=>i.jsx(ee.div,{"data-state":u?"active":"inactive","data-orientation":l.orientation,role:"tabpanel","aria-labelledby":c,hidden:!m,id:d,tabIndex:0,...s,ref:t,style:{...e.style,animationDuration:h.current?"0s":void 0},children:m&&o})})});fP.displayName=mP;function gP(e,t){return`${e}-trigger-${t}`}function yP(e,t){return`${e}-content-${t}`}var qL=cP,vP=uP,bP=pP,wP=fP;const UL=qL,xP=f.forwardRef(({className:e,...t},a)=>i.jsx(vP,{ref:a,className:J("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",e),...t}));xP.displayName=vP.displayName;const sd=f.forwardRef(({className:e,...t},a)=>i.jsx(bP,{ref:a,className:J("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",e),...t}));sd.displayName=bP.displayName;const ld=f.forwardRef(({className:e,...t},a)=>i.jsx(wP,{ref:a,className:J("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",e),...t}));ld.displayName=wP.displayName;function Le(e,t){const a=t!=null&&t.enOnly?aa:(t==null?void 0:t.locale)??(typeof window<"u"?ss(window.location.pathname):aa);return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{name:"Home",path:"/"},...e].map((r,o)=>({"@type":"ListItem",position:o+1,name:r.name,item:uo(a,r.path)}))}}const ML=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"SoftwareApplication",name:"HeroShots AI UGC Generation Platform",applicationCategory:"BusinessApplication",operatingSystem:"Web",url:"https://heroshots.ai/product",description:"HeroShots turns creator avatars, product assets, and prompts into AI-generated UGC photos and videos for e-commerce, social, ads, and creator-led campaigns.",featureList:["AI UGC photo generation","AI UGC video generation","Creator avatar licensing","Product-to-content workflows","Batch generation","Publishing and creator reward workflows","API and SDK access"],provider:{"@type":"Organization",name:"HeroShots",url:"https://heroshots.ai"},offers:{"@type":"Offer",price:"0",priceCurrency:"EUR",availability:"https://schema.org/InStock",description:"Free plan and pay-per-use generation available."}};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("productPage.seoTitle","AI UGC Generation Features"),description:e("productPage.seoDesc","From creator AI avatars to product shots, multi-channel publishing, and automated rewards â HeroShots is the all-in-one platform for AI-generated UGC."),canonical:"https://heroshots.ai/product",jsonLd:[t,Le([{name:"Product",path:"/product"}])]}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-8 sm:py-10 md:py-14",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1.5 rounded-full border border-primary/30 bg-primary/10 text-xs font-mono uppercase tracking-wider text-primary mb-4 sm:mb-6",children:[i.jsx(wt,{className:"h-3.5 w-3.5"}),e("productPage.workflow.eyebrow")]}),i.jsxs("h1",{className:"text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-4 sm:mb-6",children:[e("productPage.heroTitle")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.heroHighlight")})]}),i.jsx("p",{className:"text-base sm:text-lg md:text-xl text-muted-foreground mb-6 sm:mb-8 max-w-3xl mx-auto",children:e("productPage.heroDesc")}),i.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-3 mb-6 sm:mb-8",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsxs(M,{to:"/pre-sales",children:[i.jsx(wt,{className:"mr-2 h-5 w-5"}),e("productPage.finalCta.primary")]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsxs(M,{to:"/pricing",children:[i.jsx(TN,{className:"mr-2 h-5 w-5"}),e("productPage.finalCta.secondary")]})})]}),i.jsx("p",{className:"text-xs text-muted-foreground mb-6 sm:mb-8",children:e("productPage.finalCta.disclaimer")})]})}),i.jsx("section",{className:"py-6 sm:py-8 md:py-10 border-y border-border/40 bg-muted/10",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-6 sm:gap-8 max-w-5xl mx-auto text-center",children:[1,2,3,4].map(a=>i.jsxs("div",{children:[i.jsx("div",{className:"text-3xl sm:text-4xl md:text-5xl font-bold text-gradient mb-1 sm:mb-2",children:e(`productPage.stats.stat${a}Value`)}),i.jsx("div",{className:"text-xs sm:text-sm text-muted-foreground",children:e(`productPage.stats.stat${a}Label`)})]},a))})})}),i.jsx(wy,{slugs:["jbl-headphones","supradyn-magnesio-potassio","adidas-grand-court"]}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-14 max-w-3xl mx-auto",children:[i.jsx("div",{className:"text-xs font-mono uppercase tracking-wider text-primary mb-3",children:e("productPage.workflow.eyebrow")}),i.jsxs("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-bold mb-3 sm:mb-4",children:[e("productPage.workflow.title")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.workflow.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground",children:e("productPage.workflow.subtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6 max-w-6xl mx-auto",children:[{icon:xi,key:"step1"},{icon:wt,key:"step2"},{icon:sb,key:"step3"},{icon:Dd,key:"step4"}].map((a,n,r)=>i.jsxs("div",{className:"relative",children:[i.jsx(re,{className:"border-border/50 h-full hover:border-primary/40 transition-colors",children:i.jsxs(Ze,{children:[i.jsx("div",{className:"h-10 w-10 rounded-lg bg-primary/10 border border-primary/20 flex items-center justify-center mb-3",children:i.jsx(a.icon,{className:"h-5 w-5 text-primary"})}),i.jsx(Xe,{className:"text-base sm:text-lg",children:e(`productPage.workflow.${a.key}Title`)}),i.jsx(ma,{className:"text-sm",children:e(`productPage.workflow.${a.key}Desc`)})]})}),n<r.length-1&&i.jsx(at,{className:"hidden lg:block absolute top-1/2 -right-3 -translate-y-1/2 h-5 w-5 text-primary/40"})]},a.key))})]})}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs(UL,{defaultValue:"create",className:"w-full",children:[i.jsxs(xP,{className:"grid w-full grid-cols-3 max-w-2xl mx-auto mb-8 sm:mb-12",children:[i.jsx(sd,{value:"create",className:"text-xs sm:text-sm",children:e("productPage.createEngine")}),i.jsx(sd,{value:"publish",className:"text-xs sm:text-sm",children:e("productPage.publishLayer")}),i.jsx(sd,{value:"reward",className:"text-xs sm:text-sm",children:e("productPage.rewardLayer")})]}),i.jsxs(ld,{value:"create",className:"space-y-6 sm:space-y-8",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-12",children:[i.jsx(xi,{className:"h-12 w-12 sm:h-16 sm:w-16 text-primary mx-auto mb-3 sm:mb-4"}),i.jsx("h2",{className:"text-2xl sm:text-3xl font-bold mb-3 sm:mb-4",children:e("productPage.createEngine")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-2xl mx-auto",children:e("productPage.createDesc")})]}),i.jsxs("div",{className:"grid sm:grid-cols-2 gap-4 sm:gap-8 max-w-5xl mx-auto",children:[i.jsxs(re,{children:[i.jsxs(Ze,{children:[i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.inputs")}),i.jsx(ma,{children:e("productPage.inputsDesc")})]}),i.jsxs(ie,{className:"space-y-4",children:[i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.person")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.personDesc")})]}),i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.product")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.productDesc")})]}),i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.prompt")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.promptDesc")})]})]})]}),i.jsxs(re,{children:[i.jsxs(Ze,{children:[i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.outputsTitle")}),i.jsx(ma,{children:e("productPage.outputsDesc")})]}),i.jsxs(ie,{className:"space-y-4",children:[i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.photoVideo")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.photoVideoDesc")})]}),i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.batchGen")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.batchGenDesc")})]}),i.jsxs("div",{children:[i.jsx("h4",{className:"font-semibold mb-2 text-sm sm:text-base",children:e("productPage.qualityControl
4765s")}),i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.qualityControlsDesc")})]})]})]})]})]}),i.jsxs(ld,{value:"publish",className:"space-y-6 sm:space-y-8",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-12",children:[i.jsx(dC,{className:"h-12 w-12 sm:h-16 sm:w-16 text-primary mx-auto mb-3 sm:mb-4"}),i.jsx("h2",{className:"text-2xl sm:text-3xl font-bold mb-3 sm:mb-4",children:e("productPage.publishLayer")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-2xl mx-auto",children:e("productPage.publishDesc")})]}),i.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-3 gap-4 sm:gap-8 max-w-5xl mx-auto",children:[i.jsxs(re,{children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.ecommerce")})}),i.jsx(ie,{children:i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.ecommDesc")})})]}),i.jsxs(re,{children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.brandSocial")})}),i.jsx(ie,{children:i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.brandSocialDesc")})})]}),i.jsxs(re,{children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.userSocial")})}),i.jsx(ie,{children:i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.userSocialDesc")})})]})]})]}),i.jsxs(ld,{value:"reward",className:"space-y-6 sm:space-y-8",children:[i.jsxs("div",{className:"text-center mb-8 sm:mb-12",children:[i.jsx(Dd,{className:"h-12 w-12 sm:h-16 sm:w-16 text-primary mx-auto mb-3 sm:mb-4"}),i.jsx("h2",{className:"text-2xl sm:text-3xl font-bold mb-3 sm:mb-4",children:e("productPage.rewardLayer")}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground max-w-2xl mx-auto",children:e("productPage.rewardDesc")})]}),i.jsxs("div",{className:"grid sm:grid-cols-2 gap-4 sm:gap-8 max-w-5xl mx-auto",children:[i.jsxs(re,{children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.briefsCampaigns")})}),i.jsx(ie,{children:i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.briefsDesc")})})]}),i.jsxs(re,{children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-lg sm:text-xl",children:e("productPage.autoPayout")})}),i.jsx(ie,{children:i.jsx("p",{className:"text-xs sm:text-sm text-muted-foreground",children:e("productPage.autoPayoutDesc")})})]})]})]})]}),i.jsx("div",{className:"text-center mt-10 sm:mt-16",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsxs(M,{to:"/docs",children:[i.jsx(lC,{className:"mr-2 h-5 w-5"}),e("productPage.viewApiDocs")]})})})]})}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-14 max-w-3xl mx-auto",children:[i.jsx("div",{className:"text-xs font-mono uppercase tracking-wider text-primary mb-3",children:e("productPage.features.eyebrow")}),i.jsxs("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-bold mb-3 sm:mb-4",children:[e("productPage.features.title")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.features.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground",children:e("productPage.features.subtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6 max-w-6xl mx-auto",children:[{icon:rb,key:"f1"},{icon:xa,key:"f2"},{icon:Kl,key:"f3"},{icon:Iu,key:"f4"},{icon:sb,key:"f5"},{icon:zN,key:"f6"},{icon:RN,key:"f7"},{icon:iC,key:"f8"}].map(a=>i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all",children:i.jsxs(Ze,{className:"pb-4",children:[i.jsx("div",{className:"h-10 w-10 rounded-lg bg-primary/10 border border-primary/20 flex items-center justify-center mb-3",children:i.jsx(a.icon,{className:"h-5 w-5 text-primary"})}),i.jsx(Xe,{className:"text-base sm:text-lg",children:e(`productPage.features.${a.key}Title`)}),i.jsx(ma,{className:"text-sm",children:e(`productPage.features.${a.key}Desc`)})]})},a.key))})]})}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-14 max-w-3xl mx-auto",children:[i.jsx("div",{className:"text-xs font-mono uppercase tracking-wider text-primary mb-3",children:e("productPage.integrations.eyebrow")}),i.jsxs("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-bold mb-3 sm:mb-4",children:[e("productPage.integrations.title")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.integrations.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground",children:e("productPage.integrations.subtitle")})]}),i.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3 sm:gap-4 max-w-5xl mx-auto",children:[{icon:bo,label:"Claude"},{icon:xa,label:"Amazon"},{icon:HN,label:"REST API"},{icon:zr,label:"SDK"}].map(a=>i.jsxs("div",{className:"flex flex-col items-center justify-center gap-2 p-4 sm:p-5 rounded-xl border border-border/50 bg-background/40 hover:border-primary/40 hover:bg-primary/5 transition-colors",children:[i.jsx(a.icon,{className:"h-6 w-6 text-primary"}),i.jsx("span",{className:"text-xs sm:text-sm font-medium",children:a.label})]},a.label))})]})}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-14 max-w-3xl mx-auto",children:[i.jsx("div",{className:"text-xs font-mono uppercase tracking-wider text-primary mb-3",children:e("productPage.useCases.eyebrow")}),i.jsxs("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-bold mb-3 sm:mb-4",children:[e("productPage.useCases.title")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.useCases.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground",children:e("productPage.useCases.subtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4 sm:gap-6 max-w-6xl mx-auto",children:[{icon:Zr,key:"brand",href:"/for-brands"},{icon:vo,key:"agency",href:"/for-agencies"},{icon:rb,key:"creator",href:"/for-creators"}].map(a=>i.jsxs(re,{className:"border-border/50 hover:shadow-elegant transition-all flex flex-col",children:[i.jsxs(Ze,{className:"flex-1",children:[i.jsx(a.icon,{className:"h-10 w-10 text-primary mb-3"}),i.jsx(Xe,{className:"text-xl",children:e(`productPage.useCases.${a.key}Title`)}),i.jsx(ma,{className:"text-base",children:e(`productPage.useCases.${a.key}Desc`)})]}),i.jsx(ie,{children:i.jsx(H,{variant:"outline",className:"w-full",asChild:!0,children:i.jsxs(M,{to:a.href,children:[e(`productPage.useCases.${a.key}Cta`),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})})]},a.key))})]})}),i.jsx("section",{className:"py-8 sm:py-10 md:py-14 bg-muted/20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs(re,{className:"max-w-4xl mx-auto border-primary/30 shadow-elegant overflow-hidden relative",children:[i.jsx("div",{className:"absolute inset-0 gradient-subtle opacity-50 pointer-events-none"}),i.jsxs(ie,{className:"relative p-8 sm:p-12 text-center",children:[i.jsx("div",{className:"text-xs font-mono uppercase tracking-wider text-primary mb-3",children:e("productPage.finalCta.eyebrow")}),i.jsxs("h2",{className:"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4",children:[e("productPage.finalCta.title")," ",i.jsx("span",{className:"text-gradient",children:e("productPage.finalCta.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground mb-6 sm:mb-8 max-w-2xl mx-auto",children:e("productPage.finalCta.subtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-3",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsxs(M,{to:"/pre-sales",children:[i.jsx(wt,{className:"mr-2 h-5 w-5"}),e("productPage.finalCta.primary")]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx(M,{to:"/pricing",children:e("productPage.finalCta.secondary")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground mt-4",children:e("productPage.finalCta.disclaimer")})]})]})})}),i.jsx(ze,{})]})},LL=Xi("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function OL({className:e,variant:t,...a}){return i.jsx("div",{className:J(LL({variant:t}),e),...a})}var Zu="Collapsible",[GL,kP]=Wt(Zu),[FL,ky]=GL(Zu),CP=f.forwardRef((e,t)=>
vendor: 4,158 bytes, line 4765
4765{const{__scopeCollapsible:a,open:n,defaultOpen:r,disabled:o,onOpenChange:s,...l}=e,[c,d]=Vt({prop:n,defaultProp:r??!1,onChange:s,caller:Zu});return i.jsx(FL,{scope:a,disabled:o,contentId:_t(),open:c,onOpenToggle:f.useCallback(()=>d(u=>!u),[d]),children:i.jsx(ee.div,{"data-state":Sy(c),"data-disabled":o?"":void 0,...l,ref:t})})});CP.displayName=Zu;var SP="CollapsibleTrigger",AP=f.forwardRef((e,t)=>{const{__scopeCollapsible:a,...n}=e,r=ky(SP,a);return i.jsx(ee.button,{type:"button","aria-controls":r.contentId,"aria-expanded":r.open||!1,"data-state":Sy(r.open),"data-disabled":r.disabled?"":void 0,disabled:r.disabled,...n,ref:t,onClick:q(e.onClick,r.onOpenToggle)})});AP.displayName=SP;var Cy="CollapsibleContent",PP=f.forwardRef((e,t)=>{const{forceMount:a,...n}=e,r=ky(Cy,e.__scopeCollapsible);return i.jsx(ft,{present:a||r.open,children:({present:o})=>i.jsx(HL,{...n,ref:t,present:o})})});PP.displayName=Cy;var HL=f.forwardRef((e,t)=>{const{__scopeCollapsible:a,present:n,children:r,...o}=e,s=ky(Cy,a),[l,c]=f.useState(n),d=f.useRef(null),u=ye(t,d),h=f.useRef(0),m=h.current,p=f.useRef(0),b=p.current,g=s.open||l,v=f.useRef(g),w=f.useRef(void 0);return f.useEffect(()=>{const y=requestAnimationFrame(()=>v.current=!1);return()=>cancelAnimationFrame(y)},[]),rt(()=>{const y=d.current;if(y){w.current=w.current||{transitionDuration:y.style.transitionDuration,animationName:y.style.animationName},y.style.transitionDuration="0s",y.style.animationName="none";const x=y.getBoundingClientRect();h.current=x.height,p.current=x.width,v.current||(y.style.transitionDuration=w.current.transitionDuration,y.style.animationName=w.current.animationName),c(n)}},[s.open,n]),i.jsx(ee.div,{"data-state":Sy(s.open),"data-disabled":s.disabled?"":void 0,id:s.contentId,hidden:!g,...o,ref:u,style:{"--radix-collapsible-content-height":m?`${m}px`:void 0,"--radix-collapsible-content-width":b?`${b}px`:void 0,...e.style},children:g&&r})});function Sy(e){return e?"open":"closed"}var BL=CP,VL=AP,WL=PP,Ka="Accordion",$L=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[Ay,KL,YL]=Eo(Ka),[Xu,bF]=Wt(Ka,[YL,kP]),Py=kP(),TP=D.forwardRef((e,t)=>{const{type:a,...n}=e,r=n,o=n;return i.jsx(Ay.Provider,{scope:e.__scopeAccordion,children:a==="multiple"?i.jsx(XL,{...o,ref:t}):i.jsx(ZL,{...r,ref:t})})});TP.displayName=Ka;var[IP,JL]=Xu(Ka),[jP,QL]=Xu(Ka,{collapsible:!1}),ZL=D.forwardRef((e,t)=>{const{value:a,defaultValue:n,onValueChange:r=()=>{},collapsible:o=!1,...s}=e,[l,c]=Vt({prop:a,defaultProp:n??"",onChange:r,caller:Ka});return i.jsx(IP,{scope:e.__scopeAccordion,value:D.useMemo(()=>l?[l]:[],[l]),onItemOpen:c,onItemClose:D.useCallback(()=>o&&c(""),[o,c]),children:i.jsx(jP,{scope:e.__scopeAccordion,collapsible:o,children:i.jsx(NP,{...s,ref:t})})})}),XL=D.forwardRef((e,t)=>{const{value:a,defaultValue:n,onValueChange:r=()=>{},...o}=e,[s,l]=Vt({prop:a,defaultProp:n??[],onChange:r,caller:Ka}),c=D.useCallback(u=>l((h=[])=>[...h,u]),[l]),d=D.useCallback(u=>l((h=[])=>h.filter(m=>m!==u)),[l]);return i.jsx(IP,{scope:e.__scopeAccordion,value:s,onItemOpen:c,onItemClose:d,children:i.jsx(jP,{scope:e.__scopeAccordion,collapsible:!0,children:i.jsx(NP,{...o,ref:t})})})}),[eO,eh]=Xu(Ka),NP=D.forwardRef((e,t)=>{const{__scopeAccordion:a,disabled:n,dir:r,orientation:o="vertical",...s}=e,l=D.useRef(null),c=ye(l,t),d=KL(a),h=ds(r)==="ltr",m=q(e.onKeyDown,p=>{var P;if(!$L.includes(p.key))return;const b=p.target,g=d().filter(I=>{var N;return!((N=I.ref.current)!=null&&N.disabled)}),v=g.findIndex(I=>I.ref.current===b),w=g.length;if(v===-1)return;p.preventDefault();let y=v;const x=0,k=w-1,C=()=>{y=v+1,y>k&&(y=x)},S=()=>{y=v-1,y<x&&(y=k)};switch(p.key){case"Home":y=x;break;case"End":y=k;break;case"ArrowRight":o==="horizontal"&&(h?C():S());break;case"ArrowDown":o==="vertical"&&C();break;case"ArrowLeft":o==="horizontal"&&(h?S():C());break;case"ArrowUp":o==="vertical"&&S();break}const A=y%w;(P=g[A].ref.current)==null||P.focus()});return i.jsx(eO,{scope:a,disabled:n,direction:r,orientation:o,children:i.jsx(Ay.Slot,{scope:a,children:i.jsx(ee.div,{...s,"data-orientation":o,ref:c,onKeyDown:n?void 0:m})})})}),eu="AccordionItem",[tO,Ty]=Xu(eu),EP=D.forwardRef((e,t)=>
4765{const{__scopeAccordion:a,value:n,...r}=e,o=eh(eu,a),s=JL(eu,a),l=Py(a),c=_t(),d=n&&s.value.includes(n)||!1,u=o.disabled||e.disabled;return i.jsx(tO,{scope:a,open:d,disabled:u,triggerId:c,children:i.jsx(BL,{"data-orientation":o.orientation,"data-state":UP(d),...l,...r,ref:t,disabled:u,open:d,onOpenChange:h=>{h?s.onItemOpen(n):s.onItemClose(n)}})})});EP.displayName=eu;var zP="AccordionHeader",RP=D.forwardRef((e,t)=>{const{__scopeAccordion:a,...n}=e,r=eh(Ka,a),o=Ty(zP,a);return i.jsx(ee.h3,{"data-orientation":r.orientation,"data-state":UP(o.open),"data-disabled":o.disabled?"":void 0,...n,ref:t})});RP.displayName=zP;var uf="AccordionTrigger",DP=D.forwardRef((e,t)=>{const{__scopeAccordion:a,...n}=e,r=eh(Ka,a),o=Ty(uf,a),s=QL(uf,a),l=Py(a);return i.jsx(Ay.ItemSlot,{scope:a,children:i.jsx(VL,{"aria-disabled":o.open&&!s.collapsible||void 0,"data-orientation":r.orientation,id:o.triggerId,...l,...n,ref:t})})});DP.displayName=uf;var _P="AccordionContent",qP=D.forwardRef((e,t)=>{const{__scopeAccordion:a,...n}=e,r=eh(Ka,a),o=Ty(_P,a),s=Py(a);return i.jsx(WL,{role:"region","aria-labelledby":o.triggerId,"data-orientation":r.orientation,...s,...n,ref:t,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});qP.displayName=_P;function UP(e){return e?"open":"closed"}var aO=TP,nO=EP,rO=RP,MP=DP,LP=qP;const Co=aO,Sr=f.forwardRef(({className:e,...t},a)=>i.jsx(nO,{ref:a,className:J("border-b",e),...t}));Sr.displayName="AccordionItem";const Ar=f.forwardRef(({className:e,children:t,...a},n)=>i.jsx(rO,{className:"flex",children:i.jsxs(MP,{ref:n,className:J("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",e),...a,children:[t,i.jsx(Pu,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));Ar.displayName=MP.displayName;const Pr=f.forwardRef(({className:e,children:t,...a},n)=>i.jsx(LP,{ref:n,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...a,children:i.jsx("div",{className:J("pb-4 pt-0",e),children:t})}));Pr.displayName=LP.displayName;const mp=[{id:"img",base:4.9},{id:"v15",base:15,recommended:!0},{id:"v30",base:35}],fp=[{id:"ai",feePct:0},{id:"catalog",feePct:.25,recommended:!0},{id:"own",feePct:0}],gp=[{id:"ppu",proDiscount:0},{id:"pro",proDiscount:.15,recommended:!0}],Ps=e=>"â¬"+e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}),oO=()=>{const{t:e}=we(),[t,a]=f.useState("v15"),[n,r]=f.useState("catalog"),[o,s]=f.useState("pro"),[l,c]=f.useState(0),d=[f.useRef(null),f.useRef(null),f.useRef(null)];f.useEffect(()=>{const p=new IntersectionObserver(b=>{b.forEach(g=>{if(g.isIntersecting&&g.intersectionRatio>.4){const v=Number(g.target.dataset.step);c(v)}})},{threshold:[.4,.6,.8],rootMargin:"-20% 0px -20% 0px"});return d.forEach(b=>b.current&&p.observe(b.current)),()=>p.disconnect()},[]);const u=f.useMemo(()=>{const p=mp.find(C=>C.id===t),b=fp.find(C=>C.id===n),g=gp.find(C=>C.id===o),v=p.id!=="img",w=v?p.base*g.proDiscount:0,y=p.base-w,x=y*b.feePct,k=y+x;return{b:p,c:b,p:g,isVideo:v,discount:w,effectiveBase:y,platformFee:x,total:k}},[t,n,o]),h=(p,b,g,v,w)=>i.jsx("div",{className:"space-y-2.5",children:p.map(y=>i.jsxs("button",{type:"button",onClick:()=>g(y.id),className:J("w-full text-left flex items-center justify-between gap-4 px-5 py-4 rounded-2xl border transition-all relative",b===y.id?"border-primary/60 bg-primary/5 shadow-glow":"border-border/40 bg-card/40 hover:border-border/70 hover:bg-card/60"),children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"font-medium text-foreground",children:e(`pricing.explainer.${v}.${y.id}.label`)}),i.jsx("div",{className:"text-sm text-muted-foreground mt-0.5",children:e(`pricing.explainer.${v}.${y.id}.sub`)})]}),i.jsx("div",{className:"text-sm font-medium text-muted-foreground whitespace-nowrap",children:w(y.id)}),y.recommended&&i.jsx("span",{className:"absolute -top-2 right-4 text-[10px] uppercase tracking-wider px-2 py-0.5 rounded-full bg-gradient-to-r from-primary to-accent text-primary-foreground",children:e("pricing.explainer.tryThis")})]},y.id))}),m=[e("pricing.explainer.foot.0"),u.c.feePct>0?e("pricing.explainer.foot.1catalog"):e("pricing.explainer.foot.1ai"),e(o==="pro"?"pricing.explainer.foot.2pro":"pricing.explainer.foot.2ppu")];return i.jsx("section",{id:"how-it-works",className:"py-10 sm:py-14 md:py-20 scroll-mt-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"max-w-3xl mb-16",children:[i.jsx("div",{className:"text-xs uppercase tracking-[0.2em] text-primary/80 mb-3",children:e("pricing.explainer.eyebrow")}),i.jsxs("h2",{className:"text-3xl md:text-5xl font-display font-bold leading-[1.1] mb-5",children:[e("pricing.explainer.title")," ",i.jsx("span",{className:"text-gradient italic",children:e("pricing.explainer.titleAccent")})]}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed max-w-2xl",children:e("pricing.explainer.lead")})]}),i.jsxs("div",{className:"grid lg:grid-cols-[minmax(0,1fr)_minmax(0,1.1fr)] gap-10 lg:gap-16",children:[i.jsx("div",{className:"lg:sticky lg:top-24 lg:self-start",children:i.jsxs("div",{className:"rounded-3xl border border-border/40 bg-card/60 backdrop-blur-md p-7 shadow-elegant",children:[i.jsxs("div",{className:"flex items-center justify-between mb-6",children:[i.jsx("div",{className:"text-xs uppercase tracking-[0.2em] text-muted-foreground",children:e("pricing.explainer.receipt.eyebrow")}),i.jsxs("div",{className:"text-xs font-mono text-muted-foreground",children:[i.jsx("span",{className:"text-foreground font-medium",children:String(l+1).padStart(2,"0")})," ","/ 03"]})]}),i.jsx(yp,{label:e("pricing.explainer.receipt.whatLabel"),line:e(`pricing.explainer.base.${t}.label`),sub:e(`pricing.explainer.base.${t}.sub`),amount:Ps(u.b.base),on:!0}),i.jsx(yp,{label:e("pricing.explainer.receipt.whoLabel"),line:e(`pricing.explainer.creator.${n}.label`),sub:u.c.feePct>0?e("pricing.explainer.receipt.feeSub"):e("pricing.explainer.receipt.noFeeSub"),amount:u.platformFee===0?e("pricing.explainer.receipt.included"):"+"+Ps(u.platformFee),amountMuted:u.platformFee===0,on:l>=1}),i.jsx(yp,{label:e("pricing.explainer.receipt.planLabel"),line:e(o==="pro"?"pricing.explainer.plan.pro.label":"pricing.explainer.plan.ppu.label"),sub:u.isVideo&&o==="pro"?e("pricing.explainer.receipt.proSub"):u.isVideo?e("pricing.explainer.receipt.noDiscountSub"):e("pricing.explainer.receipt.imgProSub"),amount:u.discount>0?"â"+Ps(u.discount):"â",amountMuted:u.discount===0,on:l>=2}),i.jsxs("div",{className:"mt-6 pt-5 border-t border-border/40 flex items-end justify-between",children:[i.jsx("div",{className:"text-sm text-muted-foreground",children:e("pricing.explainer.receipt.total")}),i.jsx("div",{className:"text-3xl font-display font-bold text-gradient",children:Ps(u.total)})]}),i.jsx("p",{className:"mt-5 text-xs leading-relaxed text-muted-foreground min-h-[3rem]",children:m[l]})]})}),i.jsxs("div",{className:"space-y-20 lg:space-y-32",children:[i.jsx(cd,{ref:d[0],stepIndex:0,active:l===0,num:"01",title:e("pricing.explainer.steps.0.title"),desc:e("pricing.explainer.steps.0.desc"),children:h(mp,t,p=>a(p),"base",p=>{const b=mp.find(g=>g.id===p);return Ps(b.base)})}),i.jsxs(cd,{ref:d[1],stepIndex:1,active:l===1,num:"02",title:e("pricing.explainer.steps.1.title"),desc:e("pricing.explainer.steps.1.desc"),children:[h(fp,n,p=>r(p),"creator",p=>{const b=fp.find(g=>g.id===p);return b.feePct>0?"+"+Math.round(b.feePct*100)+"%":e("pricing.explainer.creator.noFee")}),n==="catalog"&&i.jsx("div",{className:"mt-5 p-4 rounded-xl bg-primary/5 border border-primary/20 text-sm leading-relaxed",children:e("pricing.explainer.steps.1.callout")})]}),i.jsxs(cd,{ref:d[2],stepIndex:2,active:l===2,num:"03",title:e("pricing.explainer.steps.2.title"),desc:e("pricing.explainer.steps.2.desc"),children:[h(gp,o,p=>s(p),"plan",p=>gp.find(g=>g.id===p).proDiscount>0?"â15%":e("pricing.explainer.plan.noDiscount")),i.jsx("div",{className:"mt-5 p-4 rounded-xl bg-primary/5 border border-primary/20 text-sm leading-relaxed",children:e("pricing.explainer.steps.2.callout")})]})]})]})]})})},yp=({label:e,line:t,sub:a,amount:n,amountMuted:r,on:o})=>i.jsxs("div",{className:J("mt-5 first:mt-0 transition-all duration-500",o?"opacity-100 translate-y-0":"opacity-40 translate-y-1"),children:[i.jsx("div",{className:"text-[11px] uppercase tracking-wider text-muted-foreground mb-2",children:e}),i.jsxs("div",{className:"flex items-start justify-between gap-4",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"font-medium text-foreground",children:t}),i.jsx("div",{className:"text-xs text-muted-foreground mt-0.5",children:a})]}),i.jsx("div",{className:J("font-mono text-sm whitespace-nowrap",r?"text-muted-foreground":"text-foreground"),children:n})]})]}),cd=f.forwardRef(({stepIndex:e,active:t,num:a,title:n,desc:r,children:o},s)=>i.jsxs("article",{ref:s,"data-step":e,className:J("rounded-3xl border p-7 md:p-9 transition-all duration-500",t?"border-primary/40 bg-card/70 shadow-elegant":"border-border/30 bg-card/30"),children:[i.jsx("div",{className:"text-xs font-mono text-primary/80 mb-3",children:a}),i.jsx("h3",{className:"text-2xl md:text-3xl font-display font-bold mb-3",children:n}),i.jsx("p",{className:"text-muted-foreground leading-relaxed mb-6",children:r}),o]}));cd.displayName="StepCard";const iO=()=>{const{t:e}=we(),t=e("pricing.faq.items",{returnObjects:!0}),a=[{"@context":"https://schema.org","@type":"Product",name:"HeroShots AI UGC Platform",description:e("pricing.seoDesc"),brand:{"@type":"Brand",name:"HeroShots"},offers:{"@type":"AggregateOffer",priceCurrency:"EUR",lowPrice:ua.newBatch.toFixed(2),highPrice:String(df[df.length-1].total),offerCount:"6",availability:"https://schema.org/InStock",url:"https://heroshots.ai/pricing",offers:[{"@type":"Offer",name:"Image batch (4 variants)",price:ua.firstBatch.toFixed(2),priceCurrency:"EUR",description:`â¬${ua.firstBatch.toFixed(2)} for the first batch of 4 variants in a project, â¬${ua.newBatch.toFixed(2)} per further batch.`},{"@type":"Offer",name:"Video up to 15s",price:String(ua.video15s),priceCurrency:"EUR"},{"@type":"Offer",name:"Video up to 30s",price:String(ua.video30s),priceCurrency:"EUR"},{"@type":"Offer",name:"HeroShots Pro (monthly)",price:String(ua.proMonthly),priceCurrency:"EUR"}]}},{"@context":"https://schema.org","@type":"FAQPage",mainEntity:t.map(u=>
4765({"@type":"Question",name:u.q,acceptedAnswer:{"@type":"Answer",text:u.a}}))}],n=[{icon:wm,key:"aiLibrary"},{icon:wt,key:"aiCustom"},{icon:oC,key:"catalog"},{icon:Ha,key:"own"}],r=[{key:"starter",featured:!1,chip:null},{key:"growth",featured:!0,chip:null},{key:"scale",featured:!1,chip:e("pricing.packages.savingChip")},{key:"volume",featured:!1,chip:null,custom:!0}],o=[vo,Gh,wm],s=u=>Array.isArray(u)?u:[],l=s(e("pricing.packages.terms",{returnObjects:!0})),c=s(e("pricing.packages.included",{returnObjects:!0})),d=s(e("pricing.packages.notIncluded",{returnObjects:!0}));return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("pricing.seoTitle"),description:e("pricing.seoDesc"),canonical:"https://heroshots.ai/pricing",jsonLd:[...a,Le([{name:"Pricing",path:"/pricing"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-10 sm:py-14 md:py-20 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-primary/5 via-transparent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-3xl mx-auto text-center",children:[i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("pricing.hero.title")," ",i.jsx("span",{className:"text-gradient italic",children:e("pricing.hero.highlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground leading-relaxed mb-10",children:e("pricing.hero.subtitle")}),i.jsxs("div",{className:"flex flex-wrap justify-center gap-3",children:[i.jsx("a",{href:"#how-it-works",className:"px-5 py-2.5 rounded-full glass-card text-sm font-medium hover:shadow-glow transition-all",children:e("pricing.hero.jumpHow")}),i.jsx("a",{href:"#payg",className:"px-5 py-2.5 rounded-full glass-card text-sm font-medium hover:shadow-glow transition-all",children:e("pricing.hero.jumpPayg")}),i.jsx("a",{href:"#packages",className:"px-5 py-2.5 rounded-full glass-card text-sm font-medium hover:shadow-glow transition-all",children:e("pricing.hero.jumpPackages")}),i.jsx("a",{href:"#managed",className:"px-5 py-2.5 rounded-full glass-card text-sm font-medium hover:shadow-glow transition-all",children:e("pricing.hero.jumpManaged")})]})]})})]}),i.jsx(wy,{slugs:["supradyn-magnesio-potassio","yankee-candle-home-sweet-home","jbl-headphones"],className:"bg-muted/20"}),i.jsx(oO,{}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"max-w-3xl mx-auto text-center mb-12",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.model.title")}),i.jsx("p",{className:"text-lg text-muted-foreground",children:e("pricing.model.intro")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-6 max-w-5xl mx-auto",children:["what","who","where"].map((u,h)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-3",children:[i.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center text-primary font-display font-bold text-lg",children:h+1}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:e(`pricing.model.${u}Title`)}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:e(`pricing.model.${u}Desc`)})]})},u))}),i.jsx("p",{className:"text-center text-sm text-muted-foreground mt-10 max-w-2xl mx-auto",children:e("pricing.model.footnote")})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-14",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.creators.title")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("pricing.creators.subtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-
47655 max-w-6xl mx-auto",children:n.map(({icon:u,key:h})=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500",children:i.jsxs(ie,{className:"pt-7 pb-7 space-y-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(u,{className:"h-5 w-5 text-primary"})}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:e(`pricing.creators.${h}.title`)}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:e(`pricing.creators.${h}.desc`)}),i.jsxs("div",{className:"pt-3 border-t border-border/30 space-y-2 text-sm",children:[i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsxs("span",{className:"text-muted-foreground flex items-center gap-1",children:[e("pricing.creators.setup"),i.jsxs(eS,{delayDuration:0,children:[i.jsx(tS,{asChild:!0,children:i.jsx("button",{type:"button",children:i.jsx(ib,{className:"h-3 w-3"})})}),i.jsx(Bg,{className:"max-w-[220px] text-xs",children:e(`pricing.creators.${h}.setupTooltip`)})]})]}),i.jsx("span",{className:"font-semibold text-right",children:e(`pricing.creators.${h}.setup`)})]}),i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsx("span",{className:"text-muted-foreground",children:e("pricing.creators.perGen")}),i.jsx("span",{className:"font-semibold text-right",children:e(`pricing.creators.${h}.perGen`)})]}),i.jsxs("p",{className:"text-xs text-muted-foreground pt-1",children:[i.jsxs("span",{className:"font-medium text-foreground",children:[e("pricing.creators.bestFor"),":"]})," ",e(`pricing.creators.${h}.bestFor`)]})]})]})},h))})]})}),i.jsx("section",{id:"payg",className:"py-10 sm:py-14 md:py-20 bg-muted/20 scroll-mt-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-12",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(Pg,{className:"h-4 w-4"}),e("pricing.payg.badge")]}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.payg.title")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("pricing.payg.subtitle")})]}),i.jsx(re,{className:"max-w-5xl mx-auto mb-8 border-primary/40 bg-gradient-to-br from-primary/10 via-card/60 to-card/40 backdrop-blur-sm shadow-glow",children:i.jsx(ie,{className:"pt-7 pb-7",children:i.jsxs("div",{className:"grid md:grid-cols-[1fr_auto] gap-6 items-center",children:[i.jsxs("div",{children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/15 text-primary text-xs font-medium mb-3",children:[i.jsx(wt,{className:"h-3.5 w-3.5"}),e("pricing.free.badge")]}),i.jsx("h3",{className:"text-2xl md:text-3xl font-display font-bold mb-2",children:e("pricing.free.title")}),i.jsx("p",{className:"text-muted-foreground mb-4 max-w-2xl",children:e("pricing.free.subtitle")}),i.jsx("ul",{className:"grid sm:grid-cols-2 gap-x-6 gap-y-2 text-sm",children:e("pricing.free.features",{returnObjects:!0}).map((u,h)=>i.jsxs("li",{className:"flex items-start gap-2",children:[i.jsx(Cn,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),i.jsx("span",{children:u})]},h))})]}),i.jsxs("div",{className:"flex flex-col items-stretch md:items-end gap-2 md:min-w-[200px]",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("pricing.free.cta")})}),i.jsx("p",{className:"text-xs text-muted-foreground text-center md:text-right",children:e("pricing.free.note")})]})]})})}),i.jsxs("div",{className:"grid md:grid-cols-2 gap-6 max-w-5xl mx-auto",children:[i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"pt-8 pb-8",children:[i.jsxs("div",{className:"flex items-center gap-2 mb-5",children:[i.jsx(Ag,{className:"h-5 w-5 text-primary"}),i.jsx("h3",{className:"text-xl font-display font-semibold",children:e("pricing.payg.imagesTitle")})]}),i.jsx("ul",{className:"space-y-3 text-sm",children:e("pricing.payg.imagesRows",{returnObjects:!0}).map((u,h)=>i.jsxs("li",{className:"flex justify-between items-start gap-3 pb-3 border-b border-border/30 last:border-0",children:[i.jsx("span",{className:"text-muted-foreground",children:u.label}),i.jsx("span",{className:"font-semibold text-right whitespace-nowrap",children:u.value})]},h))})]})}),i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"pt-8 pb-8",children:[i.jsxs("div",{className:"flex items-center gap-2 mb-5",children:[i.jsx(YN,{className:"h-5 w-5 text-primary"}),i.jsx("h3",{className:"text-xl font-display font-semibold",children:e("pricing.payg.videosTitle")})]}),i.jsx("ul",{className:"space-y-3 text-sm",children:e("pricing.payg.videosRows",{returnObjects:!0}).map((u,h)=>i.jsxs("li",{className:"flex justify-between items-start gap-3 pb-3 border-b border-border/30 last:border-0",children:[i.jsx("span",{className:"text-muted-foreground",children:u.label}),i.jsx("span",{className:"font-semibold text-right whitespace-nowrap",children:u.value})]},h))})]})})]}),i.jsxs("div",{className:"max-w-3xl mx-auto mt-8 p-5 rounded-xl glass-card text-sm text-muted-foreground",children:[i.jsxs("p",{className:"mb-2",children:[i.jsxs("span",{className:"font-semibold text-foreground",children:[e("pricing.payg.reworkTitle"),":"]})," ",e("pricing.payg.reworkDesc")]}),i.jsxs("p",{className:"mb-2",children:[i.jsxs("span",{className:"font-semibold text-foreground",children:[e("pricing.payg.catalogEditTitle"),":"]})," ",e("pricing.payg.catalogEditDesc")]}),i.jsxs("p",{children:[i.jsxs("span",{className:"font-semibold text-foreground",children:[e("pricing.payg.apiTitle"),":"]})," ",e("pricing.payg.apiDesc")]})]})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"max-w-3xl mx-auto text-center mb-10",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(xm,{className:"h-4 w-4"}),e("pricing.plans.badge")]}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.plans.title")}),i.jsx("p",{className:"text-lg text-muted-foreground",children:e("pricing.plans.subtitle")})]}),i.jsx("div",{className:"max-w-5xl mx-auto rounded-2xl glass-card overflow-hidden",children:i.jsx("div",{className:"overflow-x-auto",children:i.jsxs("table",{className:"w-full text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"border-b border-border/30 bg-muted/30",children:[i.jsx("th",{className:"text-left p-4 font-display font-semibold",children:e("pricing.plans.colPlan")}),i.jsx("th",{className:"text-left p-4 font-display font-semibold",children:e("pricing.plans.colPrice")}),i.jsx("th",{className:"text-left p-4 font-display font-semibold",children:e("pricing.plans.colQuality")}),i.jsx("th",{className:"text-left p-4 font-display font-semibold",children:e("pricing.plans.colSummary")}
4765)]})}),i.jsx("tbody",{children:["free","flex","pro"].map(u=>i.jsxs("tr",{className:"border-b border-border/20 last:border-0",children:[i.jsx("td",{className:"p-4 font-display font-bold",children:e(`pricing.plans.${u}.name`)}),i.jsx("td",{className:"p-4 text-muted-foreground whitespace-nowrap",children:e(`pricing.plans.${u}.price`)}),i.jsx("td",{className:"p-4 text-muted-foreground whitespace-nowrap",children:e(`pricing.plans.${u}.quality`)}),i.jsx("td",{className:"p-4 text-muted-foreground",children:e(`pricing.plans.${u}.summary`)})]},u))})]})})})]})}),i.jsx("section",{id:"packages",className:"py-10 sm:py-14 md:py-20 scroll-mt-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(zr,{className:"h-4 w-4"}),e("pricing.packages.badge")]}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.packages.title")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("pricing.packages.subtitle")})]}),i.jsxs("div",{className:"max-w-5xl mx-auto mb-10",children:[i.jsx("h3",{className:"text-sm font-display font-semibold text-center mb-4",children:e("pricing.packages.termsTitle")}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4",children:l.map((u,h)=>{const m=o[h]??ib;return i.jsxs("div",{className:"p-5 rounded-xl glass-card",children:[i.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[i.jsx(m,{className:"h-4 w-4 text-primary shrink-0"}),i.jsx("h4",{className:"font-display font-semibold text-sm",children:u.term})]}),i.jsx("p",{className:"text-sm text-muted-foreground",children:u.def})]},h)})})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-
47655 max-w-6xl mx-auto",children:r.map(({key:u,featured:h,chip:m,custom:p})=>i.jsxs(re,{className:`group relative border-border/30 bg-card/60 backdrop-blur-sm transition-all duration-500 hover:-translate-y-1 hover:border-primary/60 hover:shadow-glow hover:bg-card/80 ${h?"border-primary/60 shadow-glow lg:scale-105 lg:hover:scale-[1.07]":""}`,children:[i.jsx("div",{className:"pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 group-hover:opacity-100 transition-opacity duration-500 bg-[radial-gradient(circle_at_50%_0%,hsl(291_85%_68%/0.18),transparent_70%)]"}),h&&i.jsx("div",{className:"absolute -top-3 left-1/2 -translate-x-1/2",children:i.jsx("span",{className:"gradient-hero text-primary-foreground px-3 py-1 rounded-full text-xs font-semibold",children:e("pricing.packages.featured")})}),i.jsxs(ie,{className:"relative pt-8 pb-8 space-y-4",children:[i.jsx("h3",{className:"text-xl font-display font-bold",children:e(`pricing.packages.${u}.name`)}),i.jsxs("div",{className:"space-y-2",children:[i.jsx("p",{className:"text-sm text-muted-foreground",children:e(`pricing.packages.${u}.volume`)}),i.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-primary/10 text-primary text-xs font-medium",children:[i.jsx(Gh,{className:"h-3 w-3 shrink-0"}),e(`pricing.packages.${u}.pool`)]})]}),i.jsxs("div",{children:[i.jsx("div",{className:"text-3xl font-display font-bold",children:e(`pricing.packages.${u}.total`)}),i.jsx("div",{className:"text-sm text-muted-foreground mt-1",children:e(`pricing.packages.${u}.perVideo`)}),m&&i.jsx(OL,{variant:"secondary",className:"mt-2 bg-primary/15 text-primary border-0",children:m})]}),i.jsx(H,{variant:h?"hero":"outline",className:"w-full transition-all duration-300 hover:-translate-y-0.5 hover:shadow-glow hover:border-primary group-hover:border-primary",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e(p?"pricing.packages.talk":"pricing.packages.choose")})})]})]},u))}),i.jsxs("div",{className:"max-w-4xl mx-auto mt-6 p-4 rounded-xl border border-primary/30 bg-primary/5 flex items-start gap-3",children:[i.jsx(Gh,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),i.jsxs("p",{className:"text-sm text-muted-foreground",children:[i.jsxs("span",{className:"font-medium text-foreground",children:[e("pricing.packages.unitExampleLabel"),": "]}),e("pricing.packages.unitExample")]})]}),i.jsxs("div",{className:"max-w-4xl mx-auto mt-6 grid sm:grid-cols-2 gap-6",children:[i.jsxs("div",{className:"p-5 rounded-xl glass-card",children:[i.jsx("h4",{className:"font-display font-semibold mb-3 text-sm",children:e("pricing.packages.includedTitle")}),i.jsx("ul",{className:"space-y-2",children:c.map((u,h)=>i.jsxs("li",{className:"flex items-start gap-2 text-sm text-muted-foreground",children:[i.jsx(Cn,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),u]},h))})]}),i.jsxs("div",{className:"p-5 rounded-xl glass-card",children:[i.jsx("h4",{className:"font-display font-semibold mb-3 text-sm",children:e("pricing.packages.notIncludedTitle")}),i.jsx("ul",{className:"space-y-2.5",children:d.map((u,h)=>i.jsxs("li",{className:"flex items-start gap-2 text-sm text-foreground/90",children:[i.jsx(Tg,{className:"h-4 w-4 text-muted-foreground/70 mt-0.5 shrink-0"}),u]},h))}),i.jsx("p",{className:"mt-3 text-xs text-muted-foreground/80",children:e("pricing.packages.exclusionsNote")})]})]}),i.jsx("p",{className:"max-w-4xl mx-auto mt-6 text-xs text-muted-foreground text-center",children:e("pricing.packages.footnote")})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-12 max-w-3xl mx-auto",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(es,{className:"h-4 w-4"}),e("pricing.rights.badge")]}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.rights.title")}),i.jsx("p",{className:"text-lg text-muted-foreground",children:e("pricing.rights.subtitle")})]}),i.jsx("div",{className:"max-w-5xl mx-auto rounded-2xl glass-card overflow-hidden",children:i.jsx("div",{className:"overflow-x-auto",children:i.jsxs("table",{className:"w-full text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"border-b border-border/30 bg-muted/30",children:[i.jsx("th",{className:"text-left p-4 font-display font-semibold",children:e("pricing.rights.colUsage")}),i.jsx("th",{className:"text-center p-4 font-display font-semibold",children:e("pricing.rights.col4w")}),i.jsx("th",{className:"text-center p-4 font-display font-semibold",children:e("pricing.rights.col6m")}),i.jsx("th",{className:"text-center p-4 font-display font-semibold",children:e("pricing.rights.col2y")}),i.jsx("th",{className:"text-center p-4 font-display font-semibold",children:e("pricing.rights.colPerp")})]})}),i.jsx("tbody",{children:e("pricing.rights.rows",{returnObjects:!0}).map((u,h)=>i.jsxs("tr",{className:"border-b border-border/20 last:border-0",children:[i.jsxs("td",{className:"p-4",children:[i.jsx("div",{className:"font-medium",children:u.label}),u.sub&&i.jsx("div",{className:"text-xs text-muted-foreground mt-0.5",children:u.sub})]}),u.values.map((m,p)=>i.jsx("td",{className:"p-4 text-center text-muted-foreground",children:m},p))]},h))})]})})}),i.jsxs("div",{className:"max-w-3xl mx-auto mt-8 space-y-3",children:[i.jsxs("details",{className:"rounded-xl glass-card p-5 cursor-pointer group",children:[i.jsxs("summary",{className:"font-display font-semibold text-sm list-none flex items-center justify-between",children:[e("pricing.rights.example1Title"),i.jsx(at,{className:"h-4 w-4 transition-transform group-open:rotate-90"})]}),i.jsx("pre",{className:"mt-4 text-xs text-muted-foreground whitespace-pre-wrap font-mono",children:e("pricing.rights.example1")})]}),i.jsxs("details",{className:"rounded-xl glass-card p-5 cursor-pointer group",children:[i.jsxs("summary",{className:"font-display font-semibold text-sm list-none flex items-center justify-between",children:[e("pricing.rights.example2Title"),i.jsx(at,{className:"h-4 w-4 transition-transform group-open:rotate-90"})]}),i.jsx("pre",{className:"mt-4 text-xs text-muted-foreground whitespace-pre-wrap font-mono",children:e("pricing.rights.example2")})]}),i.jsx("p",{className:"text-sm text-muted-foreground text-center pt-4",children:e("pricing.rights.footnote")})]})]})}),i.jsx("section",{id:"managed",className:"py-10 sm:py-14 md:py-20 scroll-mt-20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto",children:[i.jsxs("div",{className:"text-center mb-10",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(vo,{className:"h-4 w-4"}),e("pricing.managed.badge")]}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:e("pricing.managed.title")}),i.jsx("p",{className:"text-lg text-muted-foreground",children:e("pricing.managed.subtitle")})]}),i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm",children:i.jsxs(ie,{className:"pt-8 pb-8",children:[i.jsx("ul",{className:"grid sm:grid-cols-2 gap-3 mb-8",children:e("pricing.managed.bullets",{returnObjects:!0}).map((u,h)=>i.jsxs("li",{className:"flex items-start gap-2 text-sm",children:[i.jsx(Cn,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),u]},h))}),i.jsx("p",{className:"text-sm text-muted-foreground mb-6",children:e("pricing.managed.range")}),i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/pre-sales",children:[e("pricing.managed.cta"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})})]})})}),i.jsx("section",{className:"py-12 md:py-16 bg-muted/20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-5xl mx-auto rounded-2xl glass-card p-8 md:p-10 flex flex-col md:flex-row items-start md:items-center gap-6 justify-between",children:[i.jsxs("div",{className:"flex items-start gap-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center shrink-0",children:i.jsx(Zr,{className:"h-5 w-5 text-primary"})}),i.jsxs("div",{children:[i.jsx("h3",{className:"text-xl font-display font-bold mb-1",children:e("pricing.reseller.title")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("pricing.reseller.desc")})]})]}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/for-agencies#reseller",children:[e("pricing.reseller.cta"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 max-w-2xl mx-auto",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4",children:[i.jsx(xm,{className:"h-4 w-4"}),e("pricing.subscription.badge")]}),i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-3",children:e("pricing.subscription.title")}),i.jsx("p",{className:"text-base text-muted-foreground",children:e("pricing.subscription.subtitle")})]}),i.jsx("div",{className:"max-w-xl mx-auto",children:i.jsx(re,{className:"border-primary/40 bg-card/60 backdrop-blur-sm shadow-glow",children:i.jsxs(ie,{className:"pt-7 pb-7 space-y-3",children:[i.jsx("h3",{className:"text-lg font-display font-bold",children:e("pricing.subscription.pro.name")}
4765),i.jsxs("div",{children:[i.jsx("span",{className:"text-3xl font-display font-bold",children:e("pricing.subscription.pro.price")}),i.jsx("span",{className:"text-muted-foreground text-sm ml-1",children:e("pricing.subscription.month")})]}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("pricing.subscription.pro.includes")})]})})})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-3xl mx-auto",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("pricing.faq.title")}),i.jsx(Co,{type:"single",collapsible:!0,className:"space-y-3",children:t.map((u,h)=>i.jsxs(Sr,{value:`item-${h}`,className:"glass-card rounded-xl border-0 px-5",children:[i.jsx(Ar,{className:"text-left font-display font-semibold hover:no-underline",children:u.q}),i.jsx(Pr,{className:"text-muted-foreground leading-relaxed",children:u.a})]},h))})]})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsxs("h2",{className:"text-3xl md:text-5xl font-display font-bold mb-5",children:[e("pricing.finalCta.title")," ",i.jsx("span",{className:"text-gradient italic",children:e("pricing.finalCta.highlight")})]}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("pricing.finalCta.subtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs("a",{href:"https://app.heroshots.ai/login",children:[e("pricing.finalCta.primary"),i.jsx(at,{className:"ml-2 h-5 w-5"})]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("pricing.finalCta.secondary")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground mt-5",children:e("common.noCreditCard")}),i.jsx("p",{className:"text-xs text-muted-foreground max-w-2xl mx-auto mt-12 pt-8 border-t border-border/30",children:e("pricing.footnote")})]})})]}),i.jsx(ze,{})]})},nn=f.forwardRef(({className:e,type:t,...a},n)=>i.jsx("input",{type:t,className:J("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),ref:n,...a}));nn.displayName="Input";var sO="Label",OP=f.forwardRef((e,t)=>i.jsx(ee.label,{...e,ref:t,onMouseDown:a=>{var r;a.target.closest("button, input, select, textarea")||((r=e.onMouseDown)==null||r.call(e,a),!a.defaultPrevented&&a.detail>1&&a.preventDefault())}}));OP.displayName=sO;var GP=OP;const lO=Xi("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),Jt=f.forwardRef(({className:e,...t},a)=>i.jsx(GP,{ref:a,className:J(lO(),e),...t}));Jt.displayName=GP.displayName;var th="Checkbox",[cO,wF]=Wt(th),[dO,Iy]=cO(th);function uO(e){const{__scopeCheckbox:t,checked:a,children:n,defaultChecked:r,disabled:o,form:s,name:l,onCheckedChange:c,required:d,value:u="on",internal_do_not_use_render:h}=e,[m,p]=Vt({prop:a,defaultProp:r??!1,onChange:c,caller:th}),[b,g]=f.useState(null),[v,w]=f.useState(null),y=f.useRef(!1),x=b?!!s||!!b.closest("form"):!0,k={checked:m,disabled:o,setChecked:p,control:b,setControl:g,name:l,form:s,value:u,hasConsumerStoppedPropagationRef:y,required:d,defaultChecked:vr(r)?!1:r,isFormControl:x,bubbleInput:v,setBubbleInput:w};return i.jsx(dO,{scope:t,...k,children:hO(h)?h(k):n})}var FP="CheckboxTrigger",HP=f.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:a,...n},r)=>{const{control:o,value:s,disabled:l,checked:c,required:d,setControl:u,setChecked:h,hasConsumerStoppedPropagationRef:m,isFormControl:p,bubbleInput:b}=Iy(FP,e),g=ye(r,u),v=f.useRef(c);return f.useEffect(()=>{const w=o==null?void 0:o.form;if(w){const y=()=>h(v.current);return w.addEventListener("reset",y),()=>w.removeEventListener("reset",y)}},[o,h]),i.jsx(ee.button,{type:"button",role:"checkbox","aria-checked":vr(c)?"mixed":c,"aria-required":d,"data-state":KP(c),"data-disabled":l?"":void 0,disabled:l,value:s,...n,ref:g,onKeyDown:q(t,w=>{w.key==="Enter"&&w.preventDefault()}),onClick:q(a,w=>{h(y=>vr(y)?!0:!y),b&&p&&(m.current=w.isPropagationStopped(),m.current||w.stopPropagation())})})});HP.displayName=FP;var jy=f.forwardRef((e,t)=>
4765{const{__scopeCheckbox:a,name:n,checked:r,defaultChecked:o,required:s,disabled:l,value:c,onCheckedChange:d,form:u,...h}=e;return i.jsx(uO,{__scopeCheckbox:a,checked:r,defaultChecked:o,disabled:l,required:s,onCheckedChange:d,name:n,form:u,value:c,internal_do_not_use_render:({isFormControl:m})=>i.jsxs(i.Fragment,{children:[i.jsx(HP,{...h,ref:t,__scopeCheckbox:a}),m&&i.jsx($P,{__scopeCheckbox:a})]})})});jy.displayName=th;var BP="CheckboxIndicator",VP=f.forwardRef((e,t)=>{const{__scopeCheckbox:a,forceMount:n,...r}=e,o=Iy(BP,a);return i.jsx(ft,{present:n||vr(o.checked)||o.checked===!0,children:i.jsx(ee.span,{"data-state":KP(o.checked),"data-disabled":o.disabled?"":void 0,...r,ref:t,style:{pointerEvents:"none",...e.style}})})});VP.displayName=BP;var WP="CheckboxBubbleInput",$P=f.forwardRef(({__scopeCheckbox:e,...t},a)=>{const{control:n,hasConsumerStoppedPropagationRef:r,checked:o,defaultChecked:s,required:l,disabled:c,name:d,value:u,form:h,bubbleInput:m,setBubbleInput:p}=Iy(WP,e),b=ye(a,p),g=iy(o),v=DC(n);f.useEffect(()=>{const y=m;if(!y)return;const x=window.HTMLInputElement.prototype,C=Object.getOwnPropertyDescriptor(x,"checked").set,S=!r.current;if(g!==o&&C){const A=new Event("click",{bubbles:S});y.indeterminate=vr(o),C.call(y,vr(o)?!1:o),y.dispatchEvent(A)}},[m,g,o,r]);const w=f.useRef(vr(o)?!1:o);return i.jsx(ee.input,{type:"checkbox","aria-hidden":!0,defaultChecked:s??w.current,required:l,disabled:c,name:d,value:u,form:h,...t,tabIndex:-1,ref:b,style:{...t.style,...v,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});$P.displayName=WP;function hO(e){return typeof e=="function"}function vr(e){return e==="indeterminate"}function KP(e){return vr(e)?"indeterminate":e?"checked":"unchecked"}const hf=f.forwardRef(({className:e,...t},a)=>i.jsx(jy,{ref:a,className:J("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:i.jsx(VP,{className:J("flex items-center justify-center text-current"),children:i.jsx(Cn,{className:"h-4 w-4"})})}));hf.displayName=jy.displayName;const pO=()=>{const{t:e,i18n:t}=we(),[a,n]=f.useState({fullName:"",companyName:"",email:"",message:"",emailConsent:!1,privacyConsent:!1}),[r,o]=f.useState(!1),[s,l]=f.useState(!1),{toast:c}=N0(),d=async h=>{if(h.preventDefault(),!a.emailConsent||!a.privacyConsent){c({title:e("presales.consentRequired"),description:e("presales.consentRequiredDesc"),variant:"destructive"});return}if(!a.message.trim()){c({title:e("presales.messageRequiredTitle",{defaultValue:"Message required"}),description:e("presales.messageRequiredDesc",{defaultValue:"Please tell us briefly why you're interested in HeroShots."}),variant:"destructive"});return}l(!0);try{const m=(t.language||"en").slice(0,2).toLowerCase(),{data:p,error:b}=await Qa.functions.invoke("submit-waitlist",{body:{fullName:a.fullName,companyName:a.companyName,email:a.email,message:a.message,emailConsent:a.emailConsent,privacyConsent:a.privacyConsent,language:["en","it","es","de","fr"].includes(m)?m:"en"}});if(b||!(p!=null&&p.ok)){const g=(p==null?void 0:p.reason)??"server_error";c({title:e("presales.emailInvalidTitle"),description:e(`presales.emailErr.${g}`,{defaultValue:e("presales.emailErr.server_error")}),variant:"destructive"});return}o(!0),c({title:e("presales.welcomeWaitlist"),description:e("presales.welcomeDesc")})}finally{l(!1)}},u=[{icon:wt,title:e("presales.earlyCredits"),description:e("presales.earlyCreditsDesc")},{icon:BN,title:e("presales.betaAccess"),description:e("presales.betaAccessDesc")},{icon:xm,title:e("presales.partnerPriority"),description:e("presales.partnerPriorityDesc")}];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("presales.seoTitle","Join the Waitlist â Early Access"),description:e("presales.seoDesc","Get early access to HeroShots AI UGC platform. Join the waitlist for exclusive credits, beta access, and partner priority."),canonical:"https://heroshots.ai/pre-sales",jsonLd:Le([{name:"Early Access",path:"/pre-sales"}])}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-10 sm:py-14 md:py-20 flex-grow",children:i.jsxs("div",{className:"container max-w-4xl",children:[i.jsxs("div",{className:"text-center mb-12",children:[i.jsxs("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-bold mb-6",children:[e("presales.title")," ",i.jsx("span",{className:"text-gradient",children:e("presales.highlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto",children:e("presales.subtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-6 mb-16",children:u.map((h,m)=>i.jsx(re,{className:"text-center border-border/50",children:i.jsxs(ie,{className:"pt-6",children:[i.jsx(h.icon,{className:"h-12 w-12 text-primary mx-auto mb-4"}),i.jsx("h3",{className:"font-semibold mb-2",children:h.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:h.description})]})},m))}
4765),i.jsxs(re,{className:"max-w-2xl mx-auto shadow-elegant",children:[i.jsxs(Ze,{children:[i.jsx(Xe,{className:"text-2xl",children:e("presales.joinWaitlist")}),i.jsx(ma,{children:e(r?"presales.onList":"presales.beFirst")})]}),i.jsx(ie,{children:r?i.jsxs("div",{className:"text-center py-8",children:[i.jsx("div",{className:"mb-4 text-6xl",children:"ð"}),i.jsx("h3",{className:"text-xl font-semibold mb-2",children:e("presales.thanksTitle")}),i.jsx("p",{className:"text-muted-foreground mb-6",children:e("presales.thanksSubtitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("presales.shareInvite")})]}):i.jsxs("form",{onSubmit:d,className:"space-y-6",children:[i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"fullName",children:e("presales.fullName")}),i.jsx(nn,{id:"fullName",required:!0,value:a.fullName,onChange:h=>n({...a,fullName:h.target.value}),placeholder:"John Doe"})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"companyName",children:e("presales.companyName")}),i.jsx(nn,{id:"companyName",value:a.companyName,onChange:h=>n({...a,companyName:h.target.value}),placeholder:"Your Company Inc."})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"email",children:e("presales.emailRequired")}),i.jsx(nn,{id:"email",type:"email",required:!0,value:a.email,onChange:h=>n({...a,email:h.target.value}),placeholder:"[email protected]"})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsxs(Jt,{htmlFor:"message",children:[e("presales.messageLabel",{defaultValue:"Your message"})," *"]}),i.jsx("textarea",{id:"message",required:!0,maxLength:2e3,rows:4,value:a.message,onChange:h=>n({...a,message:h.target.value}),placeholder:e("presales.messagePlaceholder",{defaultValue:"Tell us briefly who you are, what you'd use HeroShots for, and what matters most to you."}),className:"flex min-h-[100px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm r
4765ing-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"})]}),i.jsxs("div",{className:"space-y-4 pt-4",children:[i.jsxs("div",{className:"flex items-start gap-2",children:[i.jsx(hf,{id:"emailConsent",checked:a.emailConsent,onCheckedChange:h=>n({...a,emailConsent:h})}),i.jsx("label",{htmlFor:"emailConsent",className:"text-sm leading-tight cursor-pointer",children:e("presales.consentEmail")})]}),i.jsxs("div",{className:"flex items-start gap-2",children:[i.jsx(hf,{id:"privacyConsent",checked:a.privacyConsent,onCheckedChange:h=>n({...a,privacyConsent:h})}),i.jsxs("label",{htmlFor:"privacyConsent",className:"text-sm leading-tight cursor-pointer",children:[e("presales.consentPrivacy")," ",i.jsx("a",{href:"/legal/privacy",className:"text-brand-secondary hover:underline",children:e("presales.privacyPolicy")}),". *"]})]})]}),i.jsx(H,{variant:"hero",size:"lg",type:"submit",className:"w-full",disabled:s,children:e(s?"presales.validating":"presales.joinWaitlist")})]})})]}),!r&&i.jsxs("div",{className:"mt-16 max-w-2xl mx-auto",children:[i.jsx("h2",{className:"text-2xl font-bold mb-6 text-center",children:e("presales.quickQuestions")}),i.jsx("div",{className:"space-y-4",children:[{q:e("presales.qq1"),a:e("presales.qq1a")},{q:e("presales.qq2"),a:e("presales.qq2a")},{q:e("presales.qq3"),a:e("presales.qq3a")}].map((h,m)=>i.jsx(re,{children:i.jsxs(ie,{className:"pt-6",children:[i.jsx("h3",{className:"font-semibold mb-2",children:h.q}),i.jsx("p",{className:"text-sm text-muted-foreground",children:h.a})]})},m))})]})]})}),i.jsx(ze,{})]})},vp="https://heroshots.ai",mO=()=>{const e={"@context":"https://schema.org","@type":"AboutPage","@id":`${vp}/about`,url:`${vp}/about`,name:"About HeroShots",inLanguage:"en",mainEntity:{"@id":`${vp}/#organization`}};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:"About HeroShots â the company behind the AI UGC platform",description:"HeroShots is an AI UGC platform operated by Fancy Capital S.r.l. (Albino, Bergamo, Italy). Learn who we are, what we build, and our consent-first approach to creator likeness.",enOnly:!0,jsonLd:[e,Le([{name:"About",path:"/about"}],{enOnly:!0})]}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("article",{className:"container max-w-3xl",children:[i.jsxs("header",{className:"mb-10",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-3",children:"About HeroShots"}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-5",children:"Real creators. AI-powered content."}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed",children:"HeroShots is an AI UGC platform that turns a real creator (or a licensed AI avatar), your product, and a prompt into authentic photo and video content in under 60 seconds â with consent, licensing, and creator royalties built in."})]}),i.jsxs("div",{className:"space-y-10",children:[i.jsxs("section",{children:[i.jsx("h2",{className:"text-2xl font-display font-semibold mb-3",children:"What we build"}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:"Brands, e-commerce teams, and agencies use HeroShots to produce creator-style product content at scale â without booking a new photoshoot for every variation. You connect a product, choose a verified creator avatar or a real model, write a prompt, and generate UGC-style images and videos ready for ads, product pages, and social. Creators and models license their likeness and earn royalties whenever their avatar is used."})]}),i.jsxs("section",{children:[i.jsx("h2",{className:"text-2xl font-display font-semibold mb-3",children:"Consent, licensing, and royalties"}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:"We built HeroShots around the people whose likeness makes UGC work. Every creator avatar is created with explicit consent and governed by a likeness license that defines where and how it may be used. Models approve usage, and creators earn royalties when their avatar appears in generated content. We treat this as a foundation, not a feature â HeroShots is a platform for authentic, rights-cleared AI content, not a generic stock-image generator."})]}),i.jsxs("section",{children:[i.jsx("h2",{className:"text-2xl font-display font-semibold mb-3",children:"The company behind HeroShots"}),i.jsxs("p",{className:"text-muted-foreground leading-relaxed mb-4",children:["HeroShots is built and operated by ",i.jsx("strong",{className:"text-foreground
4765/90",children:"Fancy Capital S.r.l."}),", a company based in Albino (Bergamo), Italy. We handle data in a GDPR-aware way and publish clear terms, privacy, cookie, and acceptable-use policies."]}),i.jsxs("dl",{className:"rounded-2xl border border-border/40 bg-card/40 p-6 grid sm:grid-cols-2 gap-x-8 gap-y-3 text-sm",children:[i.jsxs("div",{children:[i.jsx("dt",{className:"text-muted-foreground",children:"Legal entity"}),i.jsx("dd",{className:"text-foreground/90 font-medium",children:"Fancy Capital S.r.l."})]}),i.jsxs("div",{children:[i.jsx("dt",{className:"text-muted-foreground",children:"VAT ID"}),i.jsx("dd",{className:"text-foreground/90 font-medium",children:"IT04763600162"})]}),i.jsxs("div",{children:[i.jsx("dt",{className:"text-muted-foreground",children:"Registered office"}),i.jsx("dd",{className:"text-foreground/90 font-medium",children:"Via Crespi 25, 24021 Albino (BG), Italy"})]}),i.jsxs("div",{children:[i.jsx("dt",{className:"text-muted-foreground",children:"Support"}),i.jsx("dd",{children:i.jsx("a",{className:"text-primary hover:underline",href:"mailto:[email protected]",children:"[email protected]"})})]})]})]})]}),i.jsxs("div",{className:"mt-12 rounded-2xl border border-border/40 bg-card/40 p-6 sm:p-8 text-center",children:[i.jsx("h2",{className:"text-xl font-display font-semibold mb-2",children:"See HeroShots in action"}),i.jsx("p",{className:"text-muted-foreground mb-5",children:"Start free â turn a creator, your product, and a prompt into UGC in under 60 seconds."}),i.jsxs("div",{className:"flex flex-wrap justify-center gap-3",children:[i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:"Start free"})}),i.jsx(H,{variant:"ghost",asChild:!0,children:i.jsx(M,{to:"/pricing",children:"See pricing"})})]})]})]})}),i.jsx(ze,{})]})},fO=()=>{const{t:e}=we(),t=[{icon:uC,title:e("solutions.ecommTitle"),description:e("solutions.ecommDesc"),benefits:e("solutions.ecommBenefits",{returnObjects:!0}),href:"/solutions/ecommerce",external:!1},{icon:vo,title:e("solutions.agenciesTitle"),description:e("solutions.agenciesDesc"),benefits:e("solutions.agenciesBenefits",{returnObjects:!0}),href:"/solutions/agencies",external:!1},{icon:$s,title:e("solutions.creatorsTitle"),description:e("solutions.creatorsDesc"),benefits:e("solutions.creatorsBenefits",{returnObjects:!0}),href:"/talent",external:!1},{icon:Ha,title:e("solutions.talentTitle"),description:e("solutions.talentDesc"),benefits:e("solutions.talentBenefits",{returnObjects:!0}),href:"https://tik-joy.com",cta:"Visit Tik-Joy.com",external:!0}];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("solutions.seoTitle","Solutions for E-commerce, Agencies & Creators"),description:e("solutions.seoDesc","Discover how HeroShots AI UGC platform serves e-commerce brands, creative agencies, and content creators with tailored solutions."),canonical:"https://heroshots.ai/solutions",jsonLd:Le([{name:"Solutions",path:"/solutions"}])}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-16",children:[i.jsxs("h1",{className:"text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-4 sm:mb-6",children:[e("solutions.title")," ",i.jsx("span",{className:"text-gradient",children:e("solutions.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto",children:e("solutions.subtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6 md:gap-8 max-w-6xl mx-auto",children:t.map((a,n)=>i.jsxs(re,{className:"border-border/50 hover:shadow-elegant transition-all",children:[i.jsxs(Ze,{className:"pb-3 sm:pb-4",children:[i.jsx(a.icon,{className:"h-8 w-8 sm:h-12 sm:w-12 text-primary mb-3 sm:mb-4"}),i.jsx(Xe,{className:"text-lg sm:text-2xl",children:a.title}),i.jsx(ma,{className:"text-sm sm:text-base",children:a.description})]}),i.jsxs(ie,{children:[i.jsx("ul",{className:"space-y-1.5 sm:space-y-2 mb-4 sm:mb-6",children:a.benef
4765its.map((r,o)=>i.jsxs("li",{className:"text-xs sm:text-sm text-muted-foreground",children:["⢠",r]},o))}),a.external?i.jsx(H,{variant:"outline",className:"w-full",size:"sm",asChild:!0,children:i.jsx("a",{href:a.href,target:"_blank",rel:"noopener noreferrer",children:a.cta||e("common.learnMore")})}):i.jsx(H,{variant:"outline",className:"w-full",size:"sm",asChild:!0,children:i.jsx(M,{to:a.href,children:e("common.learnMore")})})]})]},n))}),i.jsx("div",{className:"text-center mt-10 sm:mt-16",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,className:"w-full sm:w-auto",children:i.jsx(M,{to:"/pre-sales",children:e("common.getStarted")})})})]})}),i.jsx(ze,{})]})},gO=()=>{const{t:e}=we(),t=[{icon:$N,title:e("ecommPage.abTest"),description:e("ecommPage.abTestDesc")},{icon:Tu,title:e("ecommPage.localization"),description:e("ecommPage.localizationDesc")},{icon:CN,title:e("ecommPage.seasonal"),description:e("ecommPage.seasonalDesc")},{icon:xa,title:e("ecommPage.pdpOpt"),description:e("ecommPage.pdpOptDesc")}];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("ecommPage.seoTitle","AI UGC for E-commerce"),description:e("ecommPage.seoDesc","Generate product photos, lifestyle shots, and social content for your e-commerce store using AI creator avatars. A/B test visuals and boost conversions."),canonical:"https://heroshots.ai/solutions/ecommerce",jsonLd:Le([{name:"Solutions",path:"/solutions"},{name:"E-commerce",path:"/solutions/ecommerce"}])}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsxs("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-bold mb-6",children:[e("ecommPage.title")," ",i.jsx("span",{className:"text-gradient",children:e("ecommPage.highlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto",children:e("ecommPage.subtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-2 gap-8 max-w-5xl mx-auto mb-16",children:t.map((a,n)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(Ze,{children:[i.jsx(a.icon,{className:"h-10 w-10 text-primary mb-4"}),i.jsx(Xe,{children:a.title}),i.jsx(ma,{className:"text-base",children:a.description})]})},n))}),i.jsxs(re,{className:"max-w-4xl mx-auto shadow-elegant",children:[i.jsx(Ze,{children:i.jsx(Xe,{className:"text-2xl",children:e("ecommPage.howItWorks")})}),i.jsx(ie,{className:"space-y-6",children:[{title:e("ecommPage.step1Title"),desc:e("ecommPage.step1Desc")},{title:e("ecommPage.step2Title"),desc:e("ecommPage.step2Desc")},{title:e("ecommPage.step3Title"),desc:e("ecommPage.step3Desc")},{title:e("ecommPage.step4Title"),desc:e("ecommPage.step4Desc")}].map((a,n)=>i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-2",children:a.title}),i.jsx("p",{className:"text-muted-foreground",children:a.desc})]},n))})]}),i.jsx("div",{className:"text-center mt-12",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("ecommPage.startTrial")})})})]})}),i.jsx(ze,{})]})},$t={h1:"AI Product Photography",metaTitle:"AI Product Photography for E-commerce",metaDescription:"Turn a product photo and a prompt into product images. Four variants per batch: â¬4.90 for the first, â¬1.90 after. Free plan, no credit card. Excludes VAT.",lead:"AI product photography turns a photo of your product plus a written prompt into finished catalogue, listing and ad images. HeroShots returns a batch of four variants, typically in under a minute: â¬4.90 for the first batch in a project, â¬1.90 for every batch after that. Add an AI avatar or a licensed catalogue model and the same product becomes lifestyle UGC. Prices exclude VAT.",howItWorks:[{title:"Add the product",desc:"Upload your own product photos, or paste an Amazon product URL and let HeroShots import the listing into a project. The clearer and sharper your reference photos, the more faithful the generated product will be."},{title:"Choose who is in the shot",desc:"Product only for packshots and catalogue images. Or add an AI avatar, which carries no likeness fee, or a real model from the catalogue, whose consent and licence are recorded and who earns a royalty on the base price. You reuse the same avatar across a set rather than starting from a new character each time."},{title:"Write the prompt",desc:"Describe the scene, surface, lighting, angle and mood: 'serum bottle on a marble bathroom counter, soft morning light, shallow depth of field'. The product stays anchored to your reference images while everything around it is generated."},{title:"Generate, check, refine",desc:"Each batch returns four variants, typically in under a minute. Compare them against the physical product, keep what is accurate, and either run another batch in the same project for â¬1.90 or fix a chosen image with an edit for â¬0.39 (â¬0.23 with HeroShots Pro)."}],useCases:[{title:"Clean catalogue packshots",desc:"The product on a plain or gradient background, consistent angle and lighting across a range, ready for listing slots and PDP galleries."},{title:"Lifestyle and in-context scenes",desc:"The same product placed on a kitchen counter, a bathroom shelf, a desk, a café table. One set of reference photos, many rooms, without renting or building a set."},{title:"Seasonal and market variants",desc:"Swap the backdrop, props and light for a summer, festive or regional version of a shot you already have, instead of rebooking a shoot for every campaign."},{title:"Product-in-hand creator stills",desc:"A licensed catalogue model or an AI avatar holding, applying or using the product, in the casual register of AI UGC rather than studio advertising."},{title:"Paid-social ad variants",desc:"Multiple angles, framings and settings of one product, generated in batches of four, so creative testing is paced by your review time rather than studio availability."},{title:"Programmatic catalogue work",desc:"Generation driven from your own systems through the API and the JavaScript (npm), Python (PyPI) or PHP (Packagist) SDKs on paid plans, or from a Claude Pro chat via the HeroShots skill."}],sections:[{h2:"What is AI product photography?",body:`AI product photography is the use of generative models to create product images from reference photos and a text prompt, instead of a studio, a set and a camera. You supply the product; the model supplies the scene, the surface, the light and the composition around it. 4766 4767On HeroShots it works as one workflow with three inputs: a product, an optional person (an AI avatar or a real catalogue model), and a prompt. Every run returns a batch of four variants, typically in under a minute, so you are cho
4767osing between options rather than waiting on a single render. Products can be uploaded directly or imported from an Amazon product URL. 4768 4769The important difference from generic text-to-image is the anchor. A generic prompt invents a plausible bottle. Here the generation starts from photographs of your bottle, so shape, colour and label are carried forward rather than imagined. That anchoring is what makes the output usable for commerce, and it is also where the honest limits sit, covered further down this page.`,bullets:["Four variants per batch, typically under a minute","Product only, or product plus an AI avatar or a licensed catalogue model","Photo and video from the same project and the same product","Amazon URL import for products you already sell there","API and SDKs (npm, PyPI, Packagist) on paid plans"]},{h2:"Can AI product photography replace a studio shoot?",body:`For variation-heavy work, usually yes. For the shots your business is judged on, not always, and it is worth being precise about why. 4770 4771What makes a traditional shoot expensive is not one line item but a stack of them: studio or location hire, the photographer and assistant, a stylist, props and set build, sample shipping, model booking and the usage buyout on top of the day rate, retouching, and the calendar time between brief and delivery. Then the packaging changes, or a new colourway lands, or a market needs its own backdrop, and the stack starts again. AI product photography attacks the repeat cost and the calendar, not the craft. 4772 4773So the practical split is this. Generate when you need many versions of something you have already photographed well: new backgrounds, new seasons, new formats, new ad angles. Shoot when the image has to prove something physical, when a launch hero shot sets the brand standard, when colour has to match a proof, or when the product's material or mechanism is the selling point. Plenty of teams do both: one good shoot produces the reference set, and generation produces the long tail from it.`,bullets:["Generate: seasonal variants, backdrop swaps, ad testing, listing refreshes","Shoot: launch hero images, colour-critical work, texture and mechanism close-ups","A strong reference shoot makes every later generation better"]},{h2:"How do I put a person in the shot?",body:`Pick an AI avatar or a real catalogue model, and the product photo becomes creator content. An AI avatar is a generated character with no likeness fee attached. A catalogue model is the licensed digital likeness of a real, consenting person. 4774 4775Using a real catalogue model adds a likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on video. That fee is what pays the person whose face is in your ad. Consent, licensing and royalties are handled inside the workflow rather than in a separate email thread, so the usage terms travel with the asset. If you want a dedicated character instead, custom AI avatar setup is â¬100, and bringing your own model into the platform is â¬300 for setup. 4776 4777Whichever you choose, you reuse the same avatar across a set, which is what makes a batch read as one campaign rather than a collection of strangers. Video works from the same project: up to 15 seconds for â¬15, up to 30 seconds for â¬35, with extra retries at â¬5 per 15-second block.`,bullets:["AI avatars: no likeness fee","Real catalogue model: +25% on the base price, floor â¬0.90 images / â¬5 video","Custom AI avatar setup â¬100; bring your own model â¬300","Consent, licensing and royalties handled in the workflow","Video from the same project: â¬15 up to 15s, â¬35 up to 30s"]},{h2:"What are the limits of AI product photography?",body:`Generated imagery has to be checked against the real product before it is published. That is not a disclaimer, it is a step in the process, and any page that tells you otherwise is selling you something. 4778 4779Drift concentrates in predictable places. Unusual materials are the first: brushed and mirrored metal, transparent or tinted glass, iridescent finishes and anything whose appearance depends on how light moves across it. Mechanisms are the second: hinges, clasps, threads, pumps, buttons and moving parts can be rendered plausibly but wrongly. Fine texture is the third, so knit, weave, grain and embossing may soften or repeat. Packaging text is the fourth and most consequential, because small type, ingredient lists, certification marks and legal copy can garble or invent characters. Treat every generated label as unverified until you have read it at full size. 4780 4781There are practical limits too. Output quality is capped by your reference photos: a soft, cluttered or single-angle reference gives the model less to hold on to. Colour is not guaranteed to match a physical proof or a Pantone reference, and neither are dimensions or scale relationships between objects. Prompting is a skill, and the first project in a new product category usually takes several batches before the look settles, so budget for iteration rather than assuming the first four variants ship. 4782 4783The rule that follows is simple: never let a generated image imply something the buyer will not receive. Do not generate an accessory that is not in the box, a size relationship you have not verified, or a finish you do not sell. For dimension-accurate, colour-critical and compliance-sensitive shots, photograph the real thing. When a variant is nearly right, an edit at â¬0.39 (â¬0.23 with Pro) is usually cheaper than another full batch, and discarding a batch outright costs â¬1.90 to try again, which is why review time, not generation cost, is the real budget line.`,bullets:["Always compare output against the physical product before publishing","Highest drift risk: reflective and transparent materials, mechanisms, fine texture","Packaging and label text can garble; read it at full size every time","Not suitable as the sole source for colour-matched, dimension-accurate or compliance-critical imagery","Output is only as good as your reference photos","Prompting is a skill; expect to iterate over several batches on a new project"]},{h2:"Is AI-generated product imagery safe to publish?",body:`It is, provided three things are true: the likeness is licensed, the product depiction is accurate, and the AI involvement is disclosed where your channel or market requires it. 4784 4785The likeness side is built into the platform. Real models in the catalogue have consented, their licensing terms are recorded, and they earn a royalty when their avatar is used, which is the difference between authentic AI UGC and scraping a face off the internet. On the free plan you get 10 watermarked images a month plus one video preview, with no credit card, so you can evaluate the output before paying. Paid use starts from the per-batch prices above; HeroShots Pro is â¬99 per month and brings the edit price down to â¬0.23. 4786 4787The accuracy side is yours. Brand safety in generated content is mostly a review discipline: a person who knows the product looks at every asset before it ships, checks the claims implied by the scene, and rejects anything that flatters the product into something it is not. Generating in batches of four makes that review the bottleneck, which is the correct place for it to be.`,bullets:["Consent, likeness licensing and royalties handled in the workflow","Free-plan images are watermarked and intended for evaluation","Disclose AI involvement where your platform or market requires it","Keep a human review step between generation and publication"]}],pricingNote:"Images are billed per batch of four variants: â¬4.90 for the first batch in a project, then â¬1.90 for each further batch in the same project. Twenty variants in one project is therefore the first batch plus four more at â¬1.90, and refining a chosen image costs â¬0.39 (â¬0.23 with HeroShots Pro). Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block, or pre-paid packages: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). Using a real catalogue model adds 25% on the base price, with a floor of â¬0.90 for images and â¬5 for video; AI avatars add nothing. Custom AI avatar setup is â¬100 and bringing your own model is â¬300. HeroShots Pro is â¬99 per month. The free plan gives 10 watermarked images a month plus one video preview, with no credit card. All prices exclude VAT. What a traditional shoot costs is not something we can quote for you, because it depends on studio or location hire, crew, styling, props, sample shipping, model booking and usage rights, retouching and lead time.",faqs:[{q:"How much does AI product photography cost on HeroShots?",a:"The first batch of four variants in a project costs â¬4.90, and every further batch in the same project costs â¬1.90. Editing a chosen image costs â¬0.39, or â¬0.23 with HeroShots Pro at â¬99 per month. There is a free plan with 10 watermarked images a month and one video preview, with no credit card required. Prices exclude VAT."},{q:"How many images do I get, and how fast?",a:"Every generation returns a batch of four variants, typically in under a minute. You are cho
4787osing between four options each run rather than waiting on a single result, which is why most projects are paced by how quickly you review, not by how quickly the system generates."},{q:"Do I need to ship a physical product anywhere?",a:"No. You need photographs of the product. Upload your own, or paste an Amazon product URL and let HeroShots import the listing into a project. The quality of your reference photos is the single biggest factor in how faithful the output is."},{q:"Will the generated image really look like my product?",a:"The product is anchored to your reference photos, so shape, colour and layout carry through in most cases. But it must be checked. Reflective and transparent materials, mechanisms and moving parts, fine texture, and small packaging text are the areas most likely to drift. Read labels at full size and compare against the real item before publishing."},{q:"Can I use the images in paid ads and on marketplaces?",a:"Yes, on a paid plan. Free-plan output is watermarked and intended for evaluation; HeroShots Pro is â¬99 per month. Consent and licensing for any creator you use are recorded with the generation, and you should disclose AI involvement wherever your platform or market requires it."},{q:"Does it cost more to have a real person in the shot?",a:"Using a real model from the catalogue adds a likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on video, which pays the creator whose likeness you are using. AI avatars carry no likeness fee. A custom AI avatar costs â¬100 to set up, and bringing your own model into the platform costs â¬300."},{q:"Can I generate video of the same product?",a:"Yes, from the same project. Video up to 15 seconds costs â¬15 and up to 30 seconds costs â¬35, with extra retries at â¬5 per 15-second block. If you produce regularly, pre-paid packages bring the per-video price down: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video)."},{q:"Can I automate this against my catalogue?",a:"Yes. API access is available on paid plans, with SDKs for JavaScript (npm), Python (PyPI) and PHP (Packagist), so generation can run from your own backend or content pipeline. There is also a HeroShots skill for Claude Pro if you would rather drive it from a chat. HeroShots is operated by Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy."}],glossaryLinks:["ai-product-photography","ai-ugc","creator-avatar","ai-avatar","batch-generation","text-to-image","avatar-consistency","usage-rights","brand-safety","ugc-vs-stock"]},yO=["Core concepts","Rights & consent","Production","Marketing & business","Developers"],Ny=[{slug:"ai-ugc",term:"AI UGC",category:"Core concepts",metaTitle:"AI UGC: What It Is & How It Works",metaDescription:"AI UGC is authentic-style photo and video content made with generative AI. Learn how it works, how it differs from real UGC, and why brands use it.",shortDefinition:"AI UGC (AI user-generated content) is marketing content â photos and videos in the authentic, casual style of user-generated content â produced with generative AI. It pairs a real or AI creator's licensed likeness, a product, and a text prompt to create scalable, ad-ready UGC without a traditional on-camera shoot.",body:["AI UGC is content made in the style of user-generated content (UGC) but produced with generative AI instead of, or alongside, a conventional creator shoot. It keeps the casual, native-to-social look that makes UGC feel authentic, but the imagery is generated from a real or AI creator's licensed likeness, a product, and a written prompt rather than filmed on set.","On platforms like HeroShots, AI UGC is produced by combining a creator's likeness, a product image, and a text prompt to generate on-brand photos and videos at scale. Because it relies on a person's likeness, responsible AI UGC is built on explicit consent, likeness licensing, and creator royalties, so the creator is credited and paid whenever their AI-generated content is used.","Why it matters: AI UGC lets brands and agencies produce large volumes of ad-ready, authentic-looking creative without booking a new shoot for every variation, compressing both cost and turnaround. For creators, it turns a licensed likeness into a recurring, royalty-earning asset â value from content they never had to film in person."],related:["user-generated-content","ai-avatar","generative-ai","ugc-vs-stock"],updatedAt:"2026-07-24"},{slug:"user-generated-content",term:"User-Generated Content (UGC)",category:"Core concepts",metaTitle:"User-Generated Content (UGC)",metaDescription:"User-generated content (UGC) is photos, videos, and reviews made by real users and customers, not a brand's team â prized
4787in marketing for authenticity.",shortDefinition:"User-generated content (UGC) is any content â photos, videos, reviews, social posts â created and published by everyday people or customers rather than a brand's in-house team or paid studio. Because it comes from real users, it reads as authentic and is widely used in marketing to build trust and drive conversions.",body:["The term covers a wide range of formats: product reviews and ratings, unboxing and testimonial videos, photos shared on social media, forum comments, and short-form clips on platforms like TikTok and Instagram. What unites them is authorship â the content originates with users, fans, or customers, not with the brand itself.","In advertising, UGC has become a distinct creative style prized for its authentic, unpolished feel, which often resonates in social feeds better than highly produced studio content. Brands license this content or commission creators to produce UGC-style assets, then run it across paid ads, product pages, and organic channels. AI tools now make it possible to generate UGC-style photos and videos from a real creator, a product, and a prompt â provided the underlying likeness is used with proper consent and licensing.","Why it matters: For brands and agencies, UGC delivers relatable, high-converting creative at a fraction of studio cost and can be produced at the volume modern ad testing demands. For creators, it is a growing revenue stream â supplying authentic content, licensing their likeness, and earning royalties when their work is reused across campaigns."],related:["ai-ugc","ugc-vs-stock","usage-rights","model-release"],updatedAt:"2026-07-24"},{slug:"creator-avatar",term:"Creator Avatar",category:"Core concepts",metaTitle:"What Is a Creator Avatar?",metaDescription:"A creator avatar is a licensed digital likeness of a real creator used to generate UGC photos and videos with built-in consent and creator royalties.",shortDefinition:"A creator avatar is a licensed digital likeness of a real content creator â their face and expressions â used to generate authentic UGC-style photos and videos from a prompt. The creator consents to and licenses their likeness, earning a royalty each time a brand generates content with it.",body:["On HeroShots, a creator avatar is built from a real person's captured likeness â photos of their face and expressions â which the platform turns into a reusable digital model. Brands then pair that avatar with a product and a text prompt to produce on-brand photo and video UGC on demand, without booking a new shoot each time.","Unlike a fully synthetic or stock AI avatar, a creator avatar is tied to an identifiable, consenting person. Its use is governed by a likeness license and usage rights that define where, how long, and for which products the avatar may appear, and the underlying creator is paid royalties whenever it is used.","Why it matters: creator avatars let brands and agencies scale authentic, face-led content far faster than traditional shoots, while giving creators a new revenue stream from their likeness. Because consent, licensing, and royalties are built in, everyone can generate at volume without stepping outside the rights the creator actually granted."],related:["ai-avatar","likeness-licensing","creator-royalties","ai-likeness-consent"],updatedAt:"2026-07-24"},{slug:"ai-avatar",term:"AI Avatar",category:"Core concepts",metaTitle:"What Is an AI Avatar? Definition",metaDescription:"An AI avatar is a generative-AI digital character, often a licensed creator's likeness, used to make UGC photos and videos on demand with clear consent.",shortDefinition:"An AI avatar is a computer-generated digital character, often a photorealistic human likeness, that can be animated to speak, move, and appear in photos or videos without a live shoot. In UGC platforms, AI avatars represent real or licensed creators, letting brands produce content on demand while preserving consent and likeness rights.",body:["AI avatars are built with generative AI, typically trained on images or video of a real person to reproduce their face, voice, and mannerisms, or composed entirely from synthetic features to form a wholly fictional persona. Once created, an avatar can be reused across many prompts and campaigns, holding a consistent look and identity from shot to shot.","In a UGC context, an AI avatar usually stands in for a specific, consenting creator whose likeness is licensed for defined uses, which distinguishes it from a fully invented virtual influencer. Brands pair the avatar with a product and a prompt to generate photo and video content, such as unboxings, testimonials, or demos, at a scale and speed traditional shoots cannot match.","Why it matters: for brands and agencies, AI avatars turn a single creator collaboration into an always-available content engine, cutting production time and cost while keeping messaging on-brand. For creators, licensing an avatar opens a new revenue stream and royalty model without booking every shoot in person, provided consent, usage rights, and compensation are clearly defined."],related:["creator-avatar","virtual-influencer","ai-likeness-consent","avatar-consistency"],updatedAt:"2026-07-24"},{slug:"virtual-influencer",term:"Virtual Influencer",category:"Core concepts",metaTitle:"What Is a Virtual Influencer?",metaDescription:"A virtual influencer is a fictional, computer-generated persona that promotes brands on social media. Learn how they work and differ from real creators.",shortDefinition:"A virtual influencer is a fictional, computer-generated persona â with a name, personality, and social media presence â that promotes brands and interacts with audie
4787nces like a human creator. Built with CGI or generative AI, it is fully controlled by its creators rather than depicting a real person.",body:["A virtual influencer exists entirely as digital media, with no physical person behind the face. Some are stylized CGI characters and others are photorealistic, but in every case the images, captions, and interactions are produced and scripted by a team or an AI system. They post content, grow followings, and sign brand partnerships much like human influencers do.","Because a virtual influencer is not a real individual, it raises no likeness or consent questions about a depicted person. Brands must still disclose that the persona is fictional and AI-generated to meet advertising and AI-transparency expectations. This distinguishes it from a creator avatar, which is a licensed digital double of a real, consenting person rather than an invented character.","Why it matters: for brands and agencies, virtual influencers offer always-available, fully controllable talent that never ages, travels, or goes off-message â but they lack the lived authenticity audiences increasingly expect from UGC. On HeroShots, the focus is on authentic content from real creators (or their licensed AI avatars) with built-in consent and royalties, so teams can weigh a fully synthetic persona against creator-backed content that carries genuine human credibility."],related:["ai-avatar","synthetic-media","ai-ugc","creator-avatar"],updatedAt:"2026-07-24"},{slug:"synthetic-media",term:"Synthetic Media",category:"Core concepts",metaTitle:"What Is Synthetic Media?",metaDescription:"Synthetic media is image, video, audio, or text created or altered by AI rather than captured from reality: AI photos, voice clones, avatars, deepfakes.",shortDefinition:"Synthetic media is any image, video, audio, or text that is fully or partly created, modified, or generated by artificial intelligence rather than captured directly from reality. It spans AI-generated photos and video, voice clones, digital avatars, and deepfakes, produced from data, models, and prompts.",body:["The term covers a spectrum of techniques, from fully generative outputs like text-to-image and text-to-video, to edited or blended assets such as face swaps, voice clones, and lip-synced dubs. What unites them is that a model â not a camera or microphone alone â produces the final pixels or waveform.",'"Synthetic media" is a neutral, umbrella term. It includes both harmful uses, like non-consensual deepfakes, and legitimate ones, such as licensed AI avatars, virtual influencers, and AI product photography. The dividing line is usually consent, disclosure, and clear usage rights rather than the technology itself.',"Why it matters: brands, creators, and agencies increasingly use synthetic media to produce UGC-style content at scale, but the same tools carry legal and reputational risk. Platforms like HeroShots aim to keep it accountable by tying every asset to creator consent, likeness licensing, and royalties, so an AI-generated ad can show where the likeness came from and that its use was authorized."],related:["generative-ai","ai-avatar","likeness-licensing","ai-likeness-consent"],updatedAt:"2026-07-24"},{slug:"generative-ai",term:"Generative AI",category:"Core concepts",metaTitle:"What Is Generative AI?",metaDescription:"Generative AI creates new text, images, audio, and video from prompts by learning patterns in data. Learn how it works and why it matters for UGC.",shortDefinition:"Generative AI is a class of artificial intelligence that creates new content â text, images, audio, or video â by learning patterns from large datasets and producing original outputs in response to a prompt, rather than simply classifying or predicting from existing data.",body:["Generative AI systems are trained on large datasets to model the statistical patterns of a domain, then generate novel outputs that reflect those patterns rather than retrieving or copying specific training examples. Users typically steer the result with a prompt: a text instruction, reference image, or other input that guides what the model produces.","Common approaches include large language models (LLMs) for text and diffusion or transformer-based models for images, audio, and video. The same underlying methods power text-to-image, text-to-vi
4787deo, voice synthesis, and conversational assistants. Because each output is generated rather than retrieved, results can vary widely by adjusting the prompt or settings.","Why it matters: Generative AI is the engine behind modern content workflows. For brands and agencies, it turns a product and a brief into on-demand photo and video assets in far less time and at lower cost than traditional production. For creators, it can extend reach â for example, by licensing an AI avatar of their likeness â while platforms like HeroShots add the consent, licensing, and royalty layers that keep generated content authentic and rights-cleared."],related:["ai-ugc","synthetic-media","text-to-image","text-to-video"],updatedAt:"2026-07-24"},{slug:"digital-twin",term:"Digital Twin (Creator)",category:"Core concepts",metaTitle:"What Is a Creator Digital Twin?",metaDescription:"A creator digital twin is a consent-based AI replica of a real creator's face, voice, and mannerisms â used to generate licensed UGC without a live shoot.",shortDefinition:"A creator digital twin is a consent-based, AI-generated replica of a real creator's face, voice, and mannerisms, built from their own footage and used to produce new photo or video content on demandâwithout a live shootâwhile the creator retains licensing control and earns royalties.",body:["In the creator economy, a digital twin is a persistent, high-fidelity model of a specific real person â their appearance, voice, and expressions â trained from footage they provide and authorize. Unlike a generic AI avatar or stock character, a digital twin maps to an identifiable individual, so the content it produces still reads unmistakably as that creator.","Once built, the twin can generate new photos and videos on demand: holding a product, speaking a script, or appearing in fresh settings, without scheduling a live shoot. Responsible platforms gate this behind explicit likeness consent and a licensing agreement that defines allowed uses, term, and territory, and typically route royalties back to the creator for each generation.","Why it matters: a creator digital twin lets brands and agencies scale authentic-looking UGC featuring a recognizable face while keeping that creator in control of their likeness and paid for it. For creators, it turns their identity into a licensable, royalty-earning asset; for brands, it compresses production timelines; and for agencies, it enables consistent, rights-cleared campaigns at volume."],related:["creator-avatar","likeness-licensing","ai-likeness-consent","avatar-consistency"],updatedAt:"2026-07-24"},{slug:"likeness-licensing",term:"Likeness Licensing",category:"Rights & consent",metaTitle:"What Is Likeness Licensing?",metaDescription:"Likeness licensing is a legal agreement letting a brand use a person's image, voice, or AI likeness for defined uses, terms, and pay. Learn how it works.",shortDefinition:"Likeness licensing is a legal agreement in which a person grants a brand or platform permission to use their image, voice, or AI-generated likeness for defined purposes, channels, and time periods, usually in exchange for payment. It sets the scope, duration, and compensation governing how that likeness appears in content.",body:["A likeness license specifies exactly what a brand may do with a person's identity: which media (photos, video, AI-generated content), which channels and territories, how long the rights last, and whether the use is exclusive. It typically pairs with a model release and consent record, and can cover both real footage of a creator and AI avatars trained on their appearance.","Unlike a one-time buyout, likeness licensing is often structured as ongoing usage rights, so the creator retains control over their identity and can be compensated each time their likeness generates new content. Clear scope protects both sides: the brand knows its rights are documented, and the creator knows their image won't be used beyond the agreed terms.","In AI UGC workflows, likeness licensing becomes especially important because a single consent can power many generated outputs. Robust agreements tie each generation back to an explicit grant, define approved products or categories, and support revocation if the creator withdraws consent.","Why it matters: for brands and agencies, a documented likeness license is the difference between scalable, legally defensible campaigns and reputational or right-of-publicity risk. For creators, it turns their identity into a controllable, royalty-earning asset rather than a one-off sale, aligning incentives across everyone producing the content."],related:["ai-likeness-consent","model-release","usage-rights","creator-royalties"],updatedAt:"2026-07-24"},{slug:"model-release",term:"Model Release",category:"Rights & consent",metaTitle:"What Is a Model Release?",metaDescription:"Learn what a model release is: the signed consent that lets a brand use a person's likeness in photo, video, and AI-generated UGC content.",shortDefinition:"A model release is a signed agreement in which a person grants permission to use their likenessâface, body, or voiceâin photos, video, or other content. It specifies the permitted uses, media, duration, and territory, giving brands legal clearance to publish and, increasingly, to generate AI content from that likeness.",body:["A model release is signed at or after a shoot or content session and typically specifies where the images or video may appear, for how long, in which territories, and whether uses include advertising, packaging, or resale. It protects the producer or brand from later claims that a person's image was used without permission.","Standard releases distinguish between editorial use (news and commentary, which may not require a release) and commercial use (advertising and promotion, which generally does). In AI UGC w
4787orkflows, the concept extends beyond a single shoot: when a creator's likeness trains or drives an AI avatar, the release must cover synthetic outputs generated from that likeness, not only the original captured footage.","A model release is related to but narrower than a full licensing agreement. It secures consent to use a person's likeness, while separate terms typically govern payment, royalties, exclusivity, and rights that carry over to AI-generated derivatives.","Why it matters: for brands and agencies, a signed model release is the paper trail that makes UGC and AI avatar content safe to publish and scale across paid channels. For creators, it defines exactly how their face and voice can be used and reused, and pairs with royalty and consent terms so they stay compensated and in control as content is repurposed."],related:["likeness-licensing","ai-likeness-consent","usage-rights","right-of-publicity"],updatedAt:"2026-07-24"},{slug:"usage-rights",term:"Usage Rights",category:"Rights & consent",metaTitle:"Usage Rights Explained for UGC",metaDescription:"Usage rights define where, how long, and on which channels a brand may run UGC or a creator's likeness. Learn the scopes, durations, and why they matter.",shortDefinition:"Usage rights are the permissions that define where, how long, and on which channels a brand may use a piece of content or a creator's likeness. In UGC they typically specify a usage type (organic, paid digital, or broadcast) and a duration, ranging from a few weeks to perpetual.",body:["Usage rights specify the permitted scope of use for content, separate from who owns the underlying copyright. Common dimensions include the media or channel (organic social, paid ads, broadcast), geography, duration, and whether the license is exclusive. A creator can retain ownership of their work while granting a brand a limited, defined license to run it.","In AI UGC, usage rights govern both the finished asset and the creator's licensed likeness used to produce it. They are usually captured at generation or checkout â for example, choosing organic versus paid-digital usage and a term from a few weeks to perpetual â and recorded alongside the model release and consent so the license terms travel with the content wherever it is used.","Why it matters: for brands and agencies, clear usage rights are what make content safe to run across campaigns without takedown risk or renegotiation. For creators, they set the boundary of what has been agreed to and underpin fair compensation when content is reused or extended. Well-defined rights turn UGC into a licensable, auditable asset rather than an informal favor."],related:["likeness-licensing","model-release","creator-royalties","ai-likeness-consent"],updatedAt:"2026-07-24"},{slug:"creator-royalties",term:"Creator Royalties",category:"Rights & consent",metaTitle:"Creator Royalties: Definition & Meaning",metaDescription:"Creator royalties are recurring payments creators earn when their likeness or licensed AI avatar keeps being reused across marketing campaigns.",shortDefinition:"Creator royalties are ongoing payments a creator earns each time their likeness, content, or licensed AI avatar is used to produce or run marketing, beyond any upfront fee. On HeroShots, royalties compensate creators for continued commercial use of UGC generated from their identity, tied to defined usage rights and consent.",body:["Unlike a one-time flat fee, creator royalties recur: the creator keeps earning as their content or avatar continues to power campaigns, ad variations, or new derivative assets. Royalties turn a single licensing agreement into a revenue share aligned with how much value the creator's identity generates over time.","Royalty terms are usually set out in the model release or likeness-licensing contract, specifying the rate, the covered channels and duration, and what counts as a new billable use. This matters especially for AI avatars, where one consent can power unlimited generations; royalties and clear usage rights keep that scale fair to the person whose likeness is being reused.","Why it matters: royalties are what make consent-based AI UGC sustainable. For creators, they convert likeness into recurring income rather than a one-off payout. For brands and agencies, transparent royalty and licensing terms reduce legal and reputational risk, secure durable rights to reuse content, and attract higher-quality talent willing to license their identity for AI-driven campaigns."],related:["like
4787ness-licensing","usage-rights","creator-avatar","ai-likeness-consent"],updatedAt:"2026-07-24"},{slug:"ai-likeness-consent",term:"AI Likeness Consent",category:"Rights & consent",metaTitle:"What Is AI Likeness Consent?",metaDescription:"AI likeness consent is a person's documented permission to use their face, voice, or body in AI-generated content â what it covers and why it matters.",shortDefinition:"AI likeness consent is a person's explicit, documented permission to use their likeness â face, voice, body, or mannerisms â to create AI-generated content or train the models behind it. It specifies the approved purposes, platforms, and duration, forming the ethical and legal foundation for producing synthetic media of a real, identifiable individual.",body:["Meaningful AI likeness consent is informed and specific: the person understands that their appearance or voice will be used to generate new, synthetic content they did not personally perform, and agrees to defined boundaries. It typically records the scope of use, the content types allowed, any excluded contexts (such as political or adult material), and how long the permission lasts.","Because AI can reproduce a likeness indefinitely and at scale, robust consent is granular, auditable, and revocable rather than a one-time blanket sign-off. It is often paired with a model release and a likeness license that turn the permission into enforceable terms, and it connects to compensation so creators are paid when their identity generates value.","Why it matters: For creators, likeness consent is the control that keeps their identity from being used in ways they never approved. For brands and agencies, it is the documented basis that makes AI-generated UGC safe to publish â reducing right-of-publicity and reputational risk, and proving that every avatar or video traces back to a real person's willing, recorded agreement."],related:["model-release","likeness-licensing","right-of-publicity","creator-royalties"],updatedAt:"2026-07-24"},{slug:"right-of-publicity",term:"Right of Publicity",category:"Rights & consent",metaTitle:"Right of Publicity: Definition",metaDescription:"Right of publicity is a person's right to control commercial use of their name, image, likeness, and voice. Learn how it applies to AI-generated UGC.",shortDefinition:"Right of publicity is a person's legal right to control the commercial use of their identity â name, image, likeness, voice, and other recognizable traits. It lets individuals prevent or license the use of their persona in advertising and products, and it underpins consent-based AI UGC and likeness licensing.",body:["The right of publicity protects the commercial value of a person's identity. It covers recognizable attributes such as name, photograph, likeness, voice, and sometimes signature style or catchphrases. When a brand uses someone's persona to sell or endorse a product, it generally needs that person's permission. Protection varies by jurisdiction: in the United States it is largely governed by state law, while other regions address it through personality, image, or data-protection rights.","It is closely related to, but distinct from, privacy rights and the model release. A model release is the practical document that grants usage rights, whereas the right of publicity is the underlying legal interest that makes such consent necessary. For AI-generated content, the doctrine extends to synthetic recreations: cloning a real person's face or voice for advertising can implicate their right of publicity even when no original photo or recording is used.","Because the right is tied to a living person's identity â and in many places survives after death for a set period â commercial reuse of a creator's likeness typically requires explicit, documented consent and, often, ongoing compensation.","Why it matters: for brands and agencies, respecting the right of publicity is what keeps AI UGC campaigns legally defensible and reduces the risk of costly disputes. For creators, it is the basis for licensing their likeness on clear terms and earning royalties whenever the
4787ir identity powers a campaign."],related:["ai-likeness-consent","likeness-licensing","model-release","creator-royalties"],updatedAt:"2026-07-24"},{slug:"ai-product-photography",term:"AI Product Photography",category:"Production",metaTitle:"What Is AI Product Photography?",metaDescription:"AI product photography uses generative models to create product images from a photo and a text prompt â placing items in realistic scenes and lighting.",shortDefinition:"AI product photography is the use of generative AI models to create or edit product images from a reference photo and a text prompt. It places a product into realistic scenes, backgrounds, and lighting without a physical photo shoot, studio, or props.",body:["Instead of booking a studio, set, and photographer, a brand uploads one or more images of a product and describes the desired result in a prompt â for example, a skincare bottle on a marble bathroom counter in soft morning light. Text-to-image and image-editing models then generate on-brand shots, often in batches with variations in angle, backdrop, and styling.","The technique is commonly used for e-commerce listings, ads, social posts, and catalog imagery. Careful models preserve the product's real shape, color, and label so the item stays recognizable and accurate, while generating everything around it. Well-run workflows keep the product itself faithful to the original and avoid misrepresenting features the buyer will actually receive.","In a UGC context, AI product photography overlaps with AI-generated creator content: the same product can be composited into scenes with a real or licensed AI avatar to produce authentic-looking lifestyle imagery, backed by consent and usage rights for any likeness involved.","Why it matters: for brands and agencies, AI product photography compresses the cost and turnaround of visual content, enabling many localized or seasonal variations from a single reference. For creators, it pairs with likeness licensing so their image can feature products in generated shoots, expanding the catalog they can be paid to appear in."],related:["ai-ugc","text-to-image","batch-generation","ai-avatar"],updatedAt:"2026-07-24"},{slug:"text-to-image",term:"Text-to-Image",category:"Production",metaTitle:"What Is Text-to-Image?",metaDescription:"Text-to-image is generative AI that turns a written prompt into an original image. Learn how it works and how brands use it for UGC and product visuals.",shortDefinition:"Text-to-image is a generative AI technique that turns a written prompt into an original image. A model trained on large image-text datasets interprets the description â subject, style, lighting, composition â and synthesizes matching pixels, letting users create visuals from words alone, without cameras, stock libraries, or manual design work.",body:["Modern text-to-image systems are typically diffusion models: they begin from random noise and iteratively refine it toward an image that matches the prompt. Output can be steered with detailed prompts, reference images, negative prompts, and settings such as aspect ratio or a fixed seed for reproducible results.","In a UGC workflow, text-to-image underpins tasks like AI product photography and generating on-brand scenes, backgrounds, or avatar frames from a short description. It differs from text-to-video, which produces motion clips, and from image editing, which alters an existing photo rather than creating one from scratch.","Why it matters: for brands, creators, and agencies, text-to-image compresses the cost and timeline of visual production â concepts that once required a shoot, a set, or a stock license can be drafted in seconds and iterated at scale. On a consent-first platform, it also raises the question of whose likeness a prompt evokes, making licensed avatars and clear usage rights essential."],related:["text-to-video","ai-product-photography","prompt","generative-ai"],updatedAt:"2026-07-24"},{slug:"text-to-video",term:"Text-to-Video",category:"Production",metaTitle:"What Is Text-to-Video?",metaDescription:"Text-to-video is AI that turns a written prompt into a short video clip. Learn how it works and how UGC platforms use it for creator content.",shortDefinition:"Text-to-vi
4787deo is a generative AI technique that turns a written prompt into a short video clip, synthesizing motion, scenes, and subjects across a coherent sequence of frames. It lets creators and brands produce moving footage from a text description alone, without cameras, film crews, or on-location shoots.",body:["A text-to-video model interprets a natural-language prompt describing a subject, action, setting, and style, then generates a sequence of video frames that stay visually coherent over time. Unlike text-to-image, which produces a single still, it must also model movement, camera behavior, and temporal consistency so that people and objects remain stable from one frame to the next.","In a UGC workflow, text-to-video is often paired with a specific creator or licensed AI avatar rather than an anonymous generated face. A prompt sets the scene and script, the avatar drives who appears and how they perform, and techniques like lip-sync align mouth movements to a voiceover. This keeps the output recognizable and on-brand across multiple clips.","Because clips are generated rather than filmed, the same prompt structure can be reused to produce many variations quickly, and outputs are often watermarked or otherwise labeled as AI-generated to meet disclosure expectations.","Why it matters: text-to-video lets brands, creators, and agencies produce authentic-feeling video UGC on demand, without booking shoots or reshooting for every product or market. When it runs on consented, licensed likenesses, creators keep control of their image and earn royalties, while brands get scalable, ad-ready footage."],related:["text-to-image","ai-ugc","lip-sync","creator-avatar"],updatedAt:"2026-07-24"},{slug:"prompt",term:"Prompt (AI)",category:"Production",metaTitle:"What Is a Prompt in AI?",metaDescription:"A prompt is the text or media instruction that tells a generative AI model what to create. Learn how prompts shape AI UGC photo and video output.",shortDefinition:"A prompt is the text (and sometimes image or video) instruction a user gives a generative AI model to describe the content they want it to create. In AI UGC, a prompt specifies the scene, product, action, style, and mood that guide a photo or video generation.",body:["A prompt can range from a short phrase to a detailed brief, and modern tools often accept reference inputs alongside the text, such as a product photo, a creator's likeness, or a style image, to steer the result. Writing effective prompts, sometimes called prompt engineering, means being specific about subject, setting, lighting, camera angle, and tone. Many platforms also support negative prompts that state what to exclude.",'On HeroShots, the prompt is one of three ingredients in a generation, alongside a real creator (or a licensed AI avatar) and a product. Structured prompt fields help translate a marketing idea, for example "unboxing the serum in a bright bathroom with natural morning light," into consistent, on-brand photo or video UGC.',"Why it matters: for brands, creators, and agencies, the prompt is the main lever for creative direction and output quality. Clear, reusable prompts make results predictable, speed up batch generation and iteration, and keep visuals aligned with campaign guidelines, turning a rough concept into publishable UGC without booking a full shoot."],related:["text-to-image","text-to-video","batch-generation","ai-ugc"],updatedAt:"2026-07-24"},{slug:"batch-generation",term:"Batch Generation",category:"Production",metaTitle:"Batch Generation in AI UGC",metaDescription:"Batch generation makes many AI UGC photos or videos at once from multiple prompts, products, or avatars, helping brands and creators scale content.",shortDefinition:"Batch generation is the process of producing many AI-generated UGC assetsâphotos or videosâin a single run by combining multiple prompts, products, or creator avatars. Instead of creating one output at a time, brands and creators queue variations together, generating large volumes of on-brand content efficiently for testing and distribution.",body:["In practice, batch generation works by pairing a list of inputsâprompts, product images, scene variations, or licensed avatarsâwith a generation model that renders each combination automatically. A single job might output dozens of product photos across different backgrounds, or the same script performed by several creator avatars, without manual setup for each one.","Batches are commonly used to produce ad variations for A/B testing, localize content for different markets, or fill a content calendar across channels. Because outputs share consistent settingsâavatar consistency, lighting, aspect ratioâteams get a cohesive set they can review, filter, and license in one pass rather than commissioning each asset separately.","Why it matters: batch generation is what makes AI UGC economical at scale. Brands and agencies can test many creative angles quickly, and creators can monetize a single licensed likeness across large volumes of contentâturning UGC from a per-shoot cost into a repeatable, high-throughput production workflow."],related:["ai-ugc","prompt","avatar-consistency","content-generation-api"],updatedAt:"2026-07-24"},{slug:"watermark",term:"Watermark (AI Content)",category:"Production",metaTitle:"Watermark (AI Content)",metaDescription:"A watermark in AI content is a visible or invisible marker that flags an image or video as AI-generated and supports provenance, disclosure, and trust.",shortDefinition:"A watermark (in AI content) is a visible or invisible marker embedded in an AI-generated image or video to signal its synthetic origin, identify the source or owner, and support provenance. Visible watermarks overlay logos or labels; invisible ones encode signals that detection software can read.",body:['Watermarking covers two broad approaches. Visible watermarks are overlaid logos, badges, or text such as "AI-generated" that a viewer can see directly. Invisible or forensic watermarks embed an imperceptible pattern into the pixels or audio that is designed to survive resizing and compression and can be read back by detection tools, letting platforms verify origin without changing how the content looks.',"A watermark is one piece of a wider provenance stack. Content-credential standards such as C2PA attach cryptographically signed metadata describing how an asset was made, while embedded techniques like Google's SynthID aim to persist through edits. Transparency rules, including the EU AI Act, push providers to mark synthetic media s
4787o audiences know when they are viewing AI-generated content.","Why it matters: for brands, creators, and agencies producing AI UGC, watermarking and provenance signals support honest disclosure, platform compliance, and trust. Clear marking helps buyers meet advertising and AI-transparency requirements, protects a creator's likeness and ownership claims, and reassures audiences that content is labeled truthfully rather than passed off as something it is not."],related:["synthetic-media","ai-ugc","brand-safety","generative-ai"],updatedAt:"2026-07-24"},{slug:"avatar-consistency",term:"Avatar Consistency",category:"Production",metaTitle:"Avatar Consistency: AI UGC Definition",metaDescription:"Avatar consistency is keeping an AI or creator avatar's face, body, and identity stable across every image and video generation. Learn how it works.",shortDefinition:"Avatar consistency is the ability to keep an AI or creator avatar's face, body, hair, and defining features recognizably the same across every generated image and video. It ensures one identity stays stable from shot to shot, prompt to prompt, and scene to scene, rather than drifting into a different-looking person.",body:["In AI UGC production, each generation is created independently, so without controls a model can subtly alter facial structure, skin tone, or proportions between outputs. Avatar consistency addresses this by anchoring the avatar to a fixed identity, typically through reference images, trained embeddings, or a persistent character model, so the same person appears reliably across an entire content library.","Consistency spans both single assets and full campaigns: it holds within one video as the avatar moves and speaks, and across many separate photos and clips produced over time. It is closely tied to lip-sync and pose or lighting changes, where the identity must remain intact even as expression, angle, and setting vary.","Why it matters: for brands and agencies, a consistent avatar is what makes AI UGC usable at scale, since audiences trust a recognizable face and campaigns need the same spokesperson across dozens of assets. For creators licensing their likeness, consistency protects the integrity of their identity and reputation, ensuring the avatar that carries their name genuinely looks like them in every piece of content."],related:["creator-avatar","ai-avatar","lip-sync","batch-generation"],updatedAt:"2026-07-24"},{slug:"lip-sync",term:"AI Lip Sync",category:"Production",metaTitle:"AI Lip Sync: What It Is",metaDescription:"AI lip sync automatically matches a creator or avatar's mouth movements to an audio track, so generated video speech looks natural and on-model.",shortDefinition:"AI lip sync is a technique that automatically animates a person's or avatar's mouth movements to match a spoken audio track. It aligns lip shapes, jaw motion, and timing to the phonemes in speech or voiceover, producing talking-head video where the visuals appear to genuinely say the words.",body:["AI lip sync works by mapping an audio track's phonemes (distinct speech sounds) to corresponding mouth shapes, or visemes, then generating or editing video frames so the mouth, jaw, and often surrounding facial muscles move in time with the speech. The result is a talking-head clip where a creator or AI avatar appears to actually speak the supplied words.","It is commonly used to add a new voiceover or script to existing footage, to make a text-to-video or image-to-video output speak, or to localize content into another language without reshooting. Quality depends on accurate timing, natural mouth shapes, and preserving the subject's identity across frames, so it pairs closely with avatar consistency to keep the same face on-model throughout a clip.","In UGC production, lip sync turns a static or silent avatar into a spokesperson: a brand supplies a script, the system generates aligned speech and matching mouth movement, and the creator or licensed avatar delivers the message on camera.","Why it matters: for brands, creators, and agencies, AI lip sync makes it possible to produce and re-version talking product videos and testimonials at scale without booking a new shoot for every script or market. When the speaking likeness is a real creator, it should be governed by proper consent and licensing so the person's voice and face are used only as agreed."],related:["text-to-vi
4787deo","avatar-consistency","ai-avatar","creator-avatar"],updatedAt:"2026-07-24"},{slug:"performance-creative",term:"Performance Creative",category:"Marketing & business",metaTitle:"What Is Performance Creative?",metaDescription:"Performance creative is ad content built and tested to drive measurable results â clicks, conversions, ROAS â not just awareness. Learn how it works.",shortDefinition:"Performance creative is ad content â images, video, and copy â designed and optimized to drive measurable actions like clicks, conversions, and sales rather than awareness alone. It is built for testing, with many variations produced, measured against KPIs such as ROAS, and iterated based on results.",body:["Performance creative sits at the intersection of advertising and data. Where brand creative aims to build recognition and emotion over time, performance creative is engineered to move a specific metric now â a click, a signup, an add-to-cart, or a purchase. Every element, from the opening hook to the call to action, is chosen because it is expected to lift results and can be measured against a benchmark.","In practice, teams rarely ship a single asset. They produce many variations â different hooks, formats, talent, and angles â run them side by side, and let performance data decide the winners. Short, native-feeling formats such as UGC-style video and product-in-hand imagery tend to outperform polished studio ads in social feeds, which is why creators and authentic content have become central to the discipline.","Why it matters: performance creative is often the biggest lever on ad efficiency, yet the real constraint is usually production speed, not media budget. Brands and agencies need a steady supply of fresh, testable variations, while creators want their likeness used across many concepts without reshooting each one. Platforms like HeroShots address this by generating batches of authentic, rights-cleared UGC from a single creator, product, and prompt â turning creative testing into a repeatable, consent-based workflow."],related:["ai-ugc","user-generated-content","batch-generation","ugc-vs-stock"],updatedAt:"2026-07-24"},{slug:"ugc-vs-stock",term:"UGC vs Stock Photography",category:"Marketing & business",metaTitle:"UGC vs Stock Photography Explained",metaDescription:"UGC vs stock photography compared: authenticity, cost, licensing, and performance. Learn when user-generated content beats stock imagery for marketing.",shortDefinition:"UGC vs stock photography is a comparison of two visual content sources: user-generated content, made by real people showing authentic, everyday product use, and stock photography, polished professional imagery licensed from a library. UGC reads as genuine and relatable, while stock is generic but instantly available and broadly licensed.",body:["User-generated content (UGC) is created by real customers or creators using a product in natural settings, so it carries the credibility of a first-hand recommendation. Stock photography is produced in controlled studio or staged shoots and sold through libraries, offering high production quality and immediate availability but a familiar, impersonal look that audiences increasingly recognize and scroll past.","The two differ across four practical dimensions. Authenticity: UGC feels lived-in, while stock feels staged. Sourcing: UGC requires a creator, a product, and consent, whereas stock is downloaded on demand. Rights: UGC needs a clear model release and usage license tied to a real person's likeness, while stock ships with a standard library license. Performance: native, unpolished UGC often outperforms stock in social feeds and paid ads because it blends into organic content rather than reading as an advertisement.","The choice is rarely absolute. Stock still fits backgrounds, concept illustration, and fast placeholder needs, while UGC fits product demos, testimonials, and conversion-focused creative. Newer AI UGC workflows aim to combine both advantages, generating authentic-looking, on-brand imagery at stock-like speed and scale.","Why it matters: brands and agencies weigh UGC against stock on cost, speed, licensing risk, and conversion, choosing UGC when trust and relatability drive results and stock when convenience matters more. For creators, the shift toward UGC turns authentic content and a licensed likeness into an ongoing, royalty-bearing asset rather than a one-time studio shoot."],related:["user-generated-content","ai-ugc","ai-product-photography","performance-creative"],updatedAt:"2026-07-24"},{slug:"talent-agency",term:"Talent Agency (Creators)",category:"Marketing & business",metaTitle:"Talent Agency for Creators",metaDescription:"A talent agency represents creators â negotiating brand deals, licensing their likeness, and collecting royalties. Learn how it works in AI UGC platforms.",shortDefinition:"A talent agency (creators) is an organization that represents content creators â negotiating deals, licensing their likeness, managing bookings, and collecting fees or royalties on their behalf. On HeroShots, it connects creators with brands seeking authentic UGC, handling consent, usage rights, and payments.",body:["Traditionally, a talent agency scouts, signs, and represents talent â actors, models, influencers, or content creators â acting as an intermediary between that talent and the companies that want to work with them. The agency negotiates contracts, set
4787s rates, manages bookings, protects the creator's interests, and takes a commission on the deals it secures.","In AI UGC, the agency's role extends to the creator's digital likeness. Beyond arranging live shoots, an agency can license a creator's face and voice for use in AI-generated avatars, define the usage rights and territories that apply, and ensure informed consent and model releases are in place. On HeroShots, this representation layer keeps a creator's licensing terms, royalty splits, and approvals consistent as brands generate content at scale from a single signed likeness.","Why it matters: for creators, an agency turns a one-off gig into managed, recurring revenue â negotiating fair terms and collecting royalties every time their likeness is reused. For brands and agencies buying UGC, working through a talent agency provides vetted talent, cleared usage rights, and a single accountable party for consent and payment, reducing legal risk and simplifying campaigns that span many creators."],related:["creator-royalties","likeness-licensing","model-release","merchant-agency"],updatedAt:"2026-07-24"},{slug:"merchant-agency",term:"Merchant Agency",category:"Marketing & business",metaTitle:"What Is a Merchant Agency?",metaDescription:"A merchant agency manages UGC and ad content production on behalf of the brands it represents â handling briefs, campaigns, usage rights, and billing.",shortDefinition:"A merchant agency is a marketing or creative agency that produces and manages advertising content on behalf of the brands or merchants it represents. On a UGC platform, it holds the merchant-side account, briefs creators, runs generation campaigns, and manages usage rights, approvals, and billing for its clients.",body:["A merchant agency sits on the demand side of a UGC marketplace, representing the brands and merchants that need content rather than the creators who make it. It is the counterpart to a talent agency, which manages creators and their likenesses; together the two roles let a platform serve both buyers and sellers of authentic UGC.","In practice, a merchant agency operates one account that spans several client brands. Its team writes briefs, selects creators or licensed AI avatars, launches photo and video generation, reviews outputs for brand fit, and secures the usage rights each campaign requires. Consolidating this work lets a single agency run UGC for many merchants without each brand managing the platform directly.","Why it matters: for brands, a merchant agency turns UGC into a managed service, so smaller merchants can access creator content and licensing without building the capability in-house. For creators and talent agencies, merchant agencies aggregate demand into larger, well-briefed campaigns, and clear agency accountability helps keep consent, licensing, and royalty terms properly documented across every brand they serve."],related:["talent-agency","ai-ugc","usage-rights","brand-safety"],updatedAt:"2026-07-24"},{slug:"brand-safety",term:"Brand Safety",category:"Marketing & business",metaTitle:"Brand Safety Explained for AI UGC",metaDescription:"Brand safety keeps a brand from being tied to harmful or off-brand content. In AI UGC it means consent, guardrails, and disclosure before publishing.",shortDefinition:"Brand safety is the practice of protecting a brand's reputation by controlling where its content appears and what messaging, imagery, or context surrounds it. In AI UGC, it means ensuring generated photos and videos avoid harmful, off-brand, misleading, or non-consensual material before they reach audiences.",body:["Brand safety refers to the systems, guidelines, and controls that keep a brand from being associated with content or contexts that could damage its reputation, such as violence, misinformation, hate speech, or placement next to objectionable material. It spans both where content and ads run and the substance of the creative itself.","In AI-generated UGC, brand safety extends to how synthetic content is produced. It covers verifying that a creator's likeness is used with consent, keeping avatars on-brand and on-message, avoiding fabricated claims or deceptive scenarios, and disclosing AI involvement through watermarks or labels. Guardrails, human review, and prompt controls help catch off-brand or non-compliant outputs before publication.","Why it matters: for brands, a single unsafe or misleading asset can trigger backlash, legal exposure, or lost trust, and those risks scale quickly when content is generated in volume. Agencies need brand-safety checks to protect client accounts, while creators rely on consent and licensing safeguards so their likeness is never used in ways that harm their own reputation."],related:["ai-ugc","synthetic-media","ai-likeness-consent","watermark"],updatedAt:"2026-07-24"},{slug:"content-generation-api",term:"Content Generation API",category:"Developers",metaTitle:"Content Generation API Explained",metaDescription:"A content generation API lets developers request AI UGC photos and videos programmatically, with consent and licensing applied to every call.",shortDefinition:"A content generation API is a programmatic interface that lets developers request AI-generated photos and videos directly from their own applications. Instead of using a web dashboard, they send prompts, product images, and avatar or creator selections as structured requests, then receive finished UGC assets and status updates in return.",body:["A content generation API exposes a generation pipeline through authenticated endpoints. A developer sends a request describing the desired output â a text prompt, a product image, and the creator or licensed AI avatar to feature â and the service renders the asset and returns a file or URL. Because rendering takes time, a request can run asynchronously: the API returns a status token immediately, and the application polls that token's status URL until the finished asset is ready.","This lets teams embed UGC generation into their own tools and workflows rather than working in a dashboard. Common uses include batch-generating variations for ad testing, wiring generation into a product catalog or e-commerce backend, and building custom apps on top of the platform. On HeroShots, the same consent, licensing, and creator-royalty rules that govern manual generation apply to API requests, so assets produced programmatically stay cleared for commercial use.","Why it matters: for brands and agencies, an API turns UGC from a manual, one-at-a-time task into a scalable pipeline that fits existing production systems and can run at volume. For creators, it means their licensed likeness can be reused programmatically while consent and royalty terms are enforced on every call â extending reach without giving up control."],related:["ai-ugc","batch-generation","text-to-vi
4787deo","generative-ai"],updatedAt:"2026-07-24"}],_l=Object.fromEntries(Ny.map(e=>[e.slug,e]));function vO(){return yO.map(e=>({category:e,terms:Ny.filter(t=>t.category===e).sort((t,a)=>t.term.localeCompare(a.term))}))}const bO=()=>{const e=`${ht}/solutions/ai-product-photography`,t=[{"@context":"https://schema.org","@type":"Service","@id":`${e}#service`,name:"AI product photography",serviceType:"AI product photography",alternateName:["AI product images","Generated product photography"],description:$t.metaDescription,provider:{"@id":`${ht}/#organization`},areaServed:"Worldwide",url:e,offers:{"@type":"Offer",priceCurrency:"EUR",price:ua.firstBatch.toFixed(2),description:`â¬${ua.firstBatch.toFixed(2)} for the first batch of 4 image variants in a project, â¬${ua.newBatch.toFixed(2)} for each further batch. Excludes VAT.`,availability:"https://schema.org/InStock",url:`${ht}/pricing`}},{"@context":"https://schema.org","@type":"HowTo",name:"How to create AI product photography",description:"Turn a product photo and a prompt into finished product images.",step:$t.howItWorks.map((n,r)=>({"@type":"HowToStep",position:r+1,name:n.title,text:n.desc}))},{"@context":"https://schema.org","@type":"FAQPage",mainEntity:$t.faqs.map(n=>
4787({"@type":"Question",name:n.q,acceptedAnswer:{"@type":"Answer",text:n.a}}))},Le([{name:"Solutions",path:"/solutions"},{name:"AI product photography",path:"/solutions/ai-product-photography"}],{enOnly:!0})],a=$t.glossaryLinks.map(n=>_l[n]).filter(n=>!!n);return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:$t.metaTitle,description:$t.metaDescription,enOnly:!0,jsonLd:t}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-3xl",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-3",children:"Solutions"}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-5",children:$t.h1}),i.jsx("p",{className:"text-xl leading-relaxed text-foreground/90 mb-12",children:$t.lead}),i.jsx("section",{className:"mb-14",children:i.jsx("div",{className:"grid gap-12 sm:gap-8 sm:grid-cols-2",children:Xd.slice(0,2).map((n,r)=>i.jsx(sP,{asset:n,reverse:r%2===1},n.slug))})}),i.jsxs("section",{className:"mb-14",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-6",children:"How it works"}),i.jsx("ol",{className:"space-y-5",children:$t.howItWorks.map((n,r)=>i.jsxs("li",{className:"flex gap-4",children:[i.jsx("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-primary/40 text-sm font-mono text-primary",children:r+1}),i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-1",children:n.title}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:n.desc})]})]},r))})]}),i.jsxs("section",{className:"mb-14",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-6",children:"What you can produce"}),i.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:$t.useCases.map((n,r)=>i.jsxs("div",{className:"rounded-xl border border-border/40 bg-card/40 p-5",children:[i.jsx("h3",{className:"font-semibold mb-1.5",children:n.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:n.desc})]},r))})]}),$t.sections.map((n,r)=>i.jsxs("section",{className:"mb-12",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-4",children:n.h2}),n.body.split(` 4788 4789`).map((o,s)=>i.jsx("p",{className:"my-4 leading-relaxed text-foreground/90",children:o},s)),n.bullets&&i.jsx("ul",{className:"list-disc pl-6 space-y-2 my-4 text-foreground/90",children:n.bullets.map((o,s)=>i.jsx("li",{children:o},s))})]},r)),i.jsxs("section",{className:"mb-12 rounded-2xl border border-border/40 bg-card/40 p-6 sm:p-8",children:[i.jsx("h2",{className:"text-2xl font-display font-bold mb-3",children:"What it costs"}),i.jsx("p",{className:"leading-relaxed text-foreground/90 mb-5",children:$t.pricingNote}),i.jsx(H,{variant:"ghost",asChild:!0,children:i.jsx(M,{to:"/pricing",children:"See full pricing â"})})]}),i.jsxs("section",{className:"mb-12",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-5",children:"Frequently asked questions"}),i.jsx("div",{className:"space-y-5",children:$t.faqs.map((n,r)=>i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-1.5",children:n.q}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:n.a})]},r))})]}),a.length>0&&i.jsxs("div",{className:"mb-10 pt-6 border-t border-border/40",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Terms used on this page"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:a.map(n=>i.jsx(M,{to:`/glossary/${n.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:n.term},n.slug))})]}),i.jsxs("div",{className:"rounded-2xl border border-border/40 bg-card/40 p-6 sm:p-8 text-center",children:[i.jsx("h2",{className:"text-xl font-display font-semibold mb-2",children:"Shoot your first product"}),i.jsx("p",{className:"text-muted-foreground mb-5",children:"The free plan includes 10 images a month and a video preview â no credit card."}),i.jsxs("div",{className:"flex flex-wrap justify-center gap-3",children:[i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:"Start free"})}),i.jsx(H,{variant:"ghost",asChild:!0,children:i.jsx(M,{to:"/compare/ai-ugc-vs-product-photoshoot",children:"Compare with a photoshoot"})})]})]})]})}),i.jsx(ze,{})]})},wO=()=>i.jsx(Xr,{to:"/for-agencies",replace:!0}),Fn=e=>e.map(t=>t.slug),So=[{slug:"ai-ugc-basics",name:"AI UGC basics",metaTitle:"AI UGC Basics â Guides and Definitions",metaDescription:"What UGC and AI UGC are, why they work, how they differ from studio content, and how creator royalties fit in. The foundational guides, in order.",intro:"Start here if you are new to AI UGC. These guides define user-generated content, explain why it outperforms studio creative in the feed, compare AI UGC with the traditional kind, and cover the consent and royalty model that makes licensed-creator content different from synthetic media.",pillarSlug:"what-is-ugc-and-why-it-works-2026",glossaryLinks:["ai-ugc","user-generated-content","creator-avatar","creator-royalties"],members:[...Fn(XA),...Fn(va.slice(0,0))]},{slug:"making-ugc-content",name:"Making UGC content",metaTitle:"How to Make UGC Content â Practical Guides",metaDescription:"Scripts, hooks, formats, voice-over and format adaptation. The hands-on guides for actually producing UGC that works in the feed.",intro:"The production layer: how to write a script that holds attention, which hook formulas work in the first three seconds, which aspect ratio belongs on which platform, and how to turn one asset into a set without reshooting.",pillarSlug:"how-to-write-ugc-video-script-hook-problem-solution-cta",glossaryLinks:["prompt","text-to-vi
4789deo","batch-generation","avatar-consistency"],members:Fn(eP)},{slug:"ugc-by-industry",name:"UGC by industry",metaTitle:"UGC by Industry â Vertical Playbooks",metaDescription:"Playbooks for skincare, haircare, supplements, fitness, fashion, food, hospitality, salons, clinics, SaaS and B2B â each with formats, shot lists and claim rules.",intro:"What changes from one category to the next: the formats that convert, the shot list worth building first, and â in regulated categories like supplements and aesthetics â what you can and cannot claim in an ad.",pillarSlug:"ugc-skincare-brands-guide",glossaryLinks:["ai-product-photography","brand-safety","performance-creative","ai-ugc"],members:Fn(tP)},{slug:"performance-and-testing",name:"Performance and creative testing",metaTitle:"Creative Testing and Performance Guides",metaDescription:"How to test creative at volume, reduce CAC, pick winning variants, retarget and measure UGC campaigns without guessing.",intro:"Creative is the main lever left in paid social. These guides cover testing at volume rather than polishing single assets, what to measure, when to kill a variant, and how to connect generated content back to campaign performance.",pillarSlug:"creative-testing-volume-beats-perfection",glossaryLinks:["performance-creative","batch-generation","ugc-vs-stock","ai-ugc"],members:Fn(aP)},{slug:"rights-and-compliance",name:"Rights, consent and compliance",metaTitle:"AI Content Rights, Consent and Compliance",metaDescription:"Usage rights, licences, model releases, deepfake consent, ownership of AI output and what regulated sectors may claim in ads.",intro:"The part that decides whether a campaign is an asset or a liability. What rights you actually need before launching, who owns AI-generated output, how consent and likeness licensing work, and which claims regulated categories may not make.",pillarSlug:"ai-content-usage-rights-before-campaign",glossaryLinks:["usage-rights","likeness-licensing","model-release","ai-likeness-consent"],members:Fn(rP)},{slug:"integrations-and-workflows",name:"Integrations and workflows",metaTitle:"HeroShots Integrations and Workflows",metaDescription:"Amazon URL import, the Claude Pro skill and the workflows that turn a product listing into ready-to-run content.",intro:"How HeroShots plugs into what you already use: importing a product straight from an Amazon URL, generating inside a Claude Pro chat, and the workflows Amazon sellers run end to end.",pillarSlug:"ai-ugc-workflows-for-amazon-sellers",glossaryLinks:["content-generation-api","batch-generation","ai-product-photography","ai-ugc"],members:Fn(oP)},{slug:"for-developers",name:"For developers",metaTitle:"HeroShots for Developers â SDKs and API",metaDescription:"Generate UGC programmatically with the official JavaScript, Python and PHP SDKs, and choose the right one for your stack.",intro:"Generation from your own code. Official SDKs for Node, Python and PHP, how to batch-generate product shots, and which client fits your stack.",pillarSlug:"choosing-a-heroshots-sdk-dx-and-compatibility",glossaryLinks:["content-generation-api","batch-generation","prompt","ai-product-photography"],members:Fn(iP)}],xO=new Set(So.flatMap(e=>e.members)),kO=va.map(e=>e.slug).filter(e=>!xO.has(e));So[0].members=[...So[0].members,...kO];const CO=Object.fromEntries(So.map(e=>[e.slug,e])),SO=e=>So.find(t=>t.members.includes(e)),AO=e=>{const t=new Map(va.map(a=>[a.slug,a]));return e.members.map(a=>t.get(a)).filter(a=>!!a).sort((a,n)=>a.slug===e.pillarSlug?-1:n.slug===e.pillarSlug||(a.updated??a.date)<(n.updated??n.date)?1:-1)},PO=()=>{var l;const{i18n:e,t}=we(),a=((l=e.language)==null?void 0:l.split("-")[0])||"en",[n]=k_(),r=(n.get("q")||"").trim(),o=r?va.filter(c=>{const d=sn(c,a);return`${d.title} ${d.description} ${c.tags.join(" ")}`.toLowerCase().includes(r.toLowerCase())}):va,s={"@context":"https://schema.org","@type":"Blog","@id":"https://heroshots.ai/blog",name:"HeroShots Blog",url:"https://heroshots.ai/blog",blogPost:va.map(c=>{const d=sn(c,a);
4789return{"@type":"BlogPosting",headline:d.title,description:d.description,url:`https://heroshots.ai/blog/${c.slug}`,datePublished:c.date,author:{"@type":"Organization",name:c.author}}})};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:t("blog.metaTitle","Blog â AI UGC Insights & Updates"),description:t("blog.metaDescription","Insights on AI-generated UGC, the creator economy, royalties and HeroShots product updates."),canonical:"https://heroshots.ai/blog",noindex:!!r,jsonLd:[s,Le([{name:"Blog",path:"/blog"}])]}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl",children:[i.jsxs("header",{className:"text-center mb-12",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-4",children:t("blog.eyebrow","HeroShots Journal")}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-6",children:t("blog.title","Blog")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:t("blog.intro","Insights on AI UGC, the creator economy and the future of brand content.")})]}),!r&&i.jsxs("nav",{"aria-label":"Topics",className:"mb-12",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3 text-center",children:"Browse by topic"}),i.jsx("div",{className:"flex flex-wrap justify-center gap-2",children:So.map(c=>i.jsx(M,{to:`/blog/topic/${c.slug}`,className:"text-sm px-4 py-2 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:c.name},c.slug))})]}),r&&i.jsxs("p",{className:"text-center text-sm text-muted-foreground mb-8",children:[o.length," ",o.length===1?"result":"results"," for â",r,"â"]}),i.jsx("div",{className:"grid gap-6 sm:gap-8",children:o.map(c=>{const d=sn(c,a);return i.jsxs(M,{to:`/blog/${c.slug}`,className:"group block rounded-2xl border border-border/40 bg-card/40 backdrop-blur p-6 sm:p-8 transition-all hover:border-primary/40 hover:bg-card/60",children:[i.jsxs("div",{className:"flex items-center gap-3 text-xs font-mono uppercase tracking-wider text-muted-foreground mb-3",children:[i.jsx("time",{dateTime:c.date,children:new Date(c.date).toLocaleDateString(a,{year:"numeric",month:"long",day:"numeric"})}),c.tags[0]&&i.jsxs(i.Fragment,{children:[i.jsx("span",{"aria-hidden":!0,children:"·"}),i.jsx("span",{children:c.tags[0]})]})]}),i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-3 group-hover:text-primary transition-colors",children:d.title}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:d.description}),i.jsxs("span",{className:"inline-flex items-center gap-1 mt-4 text-sm text-primary font-medium",children:[t("blog.readMore","Read article")," â"]})]},c.slug)})})]})}),i.jsx(ze,{})]})},bp=new RegExp("!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\*\\*([^*]+)\\*\\*|`([^`]+)`|(?<!\\*)\\*([^*\\n]+)\\*(?!\\*)","g"),Hn=e=>{const t=[];let a=0,n,r=0;for(bp.lastIndex=0;(n=bp.exec(e))!==null;){n.index>a&&t.push(e.slice(a,n.index));const[,o,s,l,c,d,u,h]=n;if(s!==void 0)t.push(i.jsx("img",{src:s,alt:o||"",loading:"lazy",decoding:"async",className:"inline-block max-w-full rounded"},r++));else if(l!==void 0&&c!==void 0){const m=c.startsWith("/");t.push(m?i.jsx(M,{to:c,className:"text-primary hover:underline",children:l},r++):i.jsx("a",{href:c,className:"text-primary hover:underline",target:"_blank",rel:"noreferrer",children:l},r++))}else d!==void 0?t.push(i.jsx("strong",{children:d},r++)):u!==void 0?t.push(i.jsx("code",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[0.9em] text-foreground",children:u},r++)):h!==void 0&&t.push(i.jsx("em",{children:h},r++));a=bp.lastIndex}return a<e.length&&t.push(e.slice(a)),t},Ow=e=>e.trim().replace(/^\||\|$/g,"").split("|").map(t=>t.trim()),TO=e=>/^\s*\|?[\s:-]*-[\s|:-]*\|?\s*$/.test(e)&&e.includes("-"),Gw=/^\d+\.\s+/,IO=({body:e})=>{const t=e.split(/\n\s*\n/);return i.jsx(i.Fragment,{children:t.map((a,n)=>{const r=a.trim();if(!r)return null;const o=r.split(` 4790`);if(r.startsWith("```")){const l=o.slice(1,o[o.length-1].startsWith("```")?-1:void 0).join(` 4791`);return i.jsx("pre",{className:"my-5 overflow-x-auto rounded-xl border border-border/50 bg-muted/60 p-4 text-sm",children:i.jsx("code",{className:"font-mono text-foreground
4791/90",children:l})},n)}if(r.startsWith("### "))return i.jsx("h3",{className:"text-xl md:text-2xl font-display font-semibold mt-8 mb-3",children:Hn(r.slice(4))},n);if(r.startsWith("## "))return i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mt-10 mb-4",children:Hn(r.slice(3))},n);if(o.length>=2&&o[0].includes("|")&&TO(o[1])){const l=Ow(o[0]),c=o.slice(2).filter(d=>d.includes("|")).map(Ow);return i.jsx("div",{className:"my-6 overflow-x-auto",children:i.jsxs("table",{className:"w-full border-collapse text-sm",children:[i.jsx("thead",{children:i.jsx("tr",{className:"border-b border-border",children:l.map((d,u)=>i.jsx("th",{className:"px-3 py-2 text-left font-semibold",children:Hn(d)},u))})}),i.jsx("tbody",{children:c.map((d,u)=>i.jsx("tr",{className:"border-b border-border/40",children:d.map((h,m)=>i.jsx("td",{className:"px-3 py-2 align-top text-foreground/90",children:Hn(h)},m))},u))})]})},n)}if(o.every(l=>l.startsWith(">")))return i.jsx("blockquote",{className:"my-5 border-l-2 border-primary/50 pl-4 italic text-foreground/80",children:Hn(o.map(l=>l.replace(/^>\s?/,"")).join(" "))},n);if(o.every(l=>Gw.test(l)))return i.jsx("ol",{className:"list-decimal pl-6 space-y-2 my-4 text-foreground/90",children:o.map((l,c)=>i.jsx("li",{children:Hn(l.replace(Gw,""))},c))},n);if(o.every(l=>/^[-*]\s+/.test(l)))return i.jsx("ul",{className:"list-disc pl-6 space-y-2 my-4 text-foreground/90",children:o.map((l,c)=>i.jsx("li",{children:Hn(l.replace(/^[-*]\s+/,""))},c))},n);const s=r.match(/^!\[([^\]]*)\]\(([^)]+)\)$/);return s?i.jsxs("figure",{className:"my-6",children:[i.jsx("img",{src:s[2],alt:s[1],loading:"lazy",decoding:"async",className:"w-full rounded-xl border border-border/40"}),s[1]&&i.jsx("figcaption",{className:"mt-2 text-center text-sm text-muted-foreground",children:s[1]})]},n):i.jsx("p",{className:"my-4 leading-relaxed text-foreground/90",children:Hn(r)},n)})})},jO=()=>{var g;const{slug:e}=Uu(),{i18n:t,t:a}=we(),n=e?AL(e):void 0;if(!n)return i.jsx(Xr,{to:"/blog",replace:!0});const r=((g=t.language)==null?void 0:g.split("-")[0])||"en",o=sn(n,r),s=CS(r)?r:aa,l=uo(s,`/blog/${n.slug}`),c=va.findIndex(v=>v.slug===n.slug),d=va.length,u=va.map((v,w)=>({post:v,score:v.tags.filter(y=>n.tags.includes(y)).length,ring:(w-c+d)%d})).filter(v=>v.post.slug!==n.slug).sort((v,w)=>w.score-v.score||v.ring-w.ring),h=u.find(v=>v.ring===1),m=[...h?[h]:[],...u.filter(v=>v.ring!==1)].slice(0,4).map(v=>v.post),p=SO(n.slug),b=[{"@context":"https://schema.org","@type":"Article",headline:o.title,de
4791scription:o.description,datePublished:n.date,dateModified:n.updated??n.date,author:{"@type":"Organization","@id":`${ht}/#organization`,name:n.author},publisher:{"@id":`${ht}/#organization`},mainEntityOfPage:{"@type":"WebPage","@id":l},image:n.cover?`${ht}${n.cover}`:`${ht}/og-image.png`,inLanguage:s,keywords:n.tags.join(", ")},{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:uo(s,"/")},{"@type":"ListItem",position:2,name:"Blog",item:uo(s,"/blog")},{"@type":"ListItem",position:3,name:o.title,item:l}]}];return o.faqs&&o.faqs.length>0&&b.push({"@context":"https://schema.org","@type":"FAQPage",mainEntity:o.faqs.map(v=>({"@type":"Question",name:v.q,acceptedAnswer:{"@type":"Answer",text:v.a}}))}),i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:o.metaTitle??o.title,description:o.description,canonical:l,ogType:"article",jsonLd:b}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("article",{className:"container max-w-3xl",children:[i.jsxs("div",{className:"mb-6 text-sm text-muted-foreground font-mono uppercase tracking-wider",children:[i.jsx(M,{to:"/blog",className:"hover:text-foreground",children:a("nav.blog","Blog")}),i.jsx("span",{className:"mx-2",children:"/"}),i.jsx("time",{dateTime:n.date,children:new Date(n.date).toLocaleDateString(r,{year:"numeric",month:"long",day:"numeric"})})]}),i.jsx("h1",{className:"text-3xl md:text-5xl font-display font-bold mb-6 leading-tight",children:o.title}),i.jsx("p",{className:"text-lg text-muted-foreground mb-8 leading-relaxed",children:o.description}),i.jsx("div",{className:"prose prose-invert max-w-none",children:i.jsx(IO,{body:o.body})}),o.faqs&&o.faqs.length>0&&i.jsxs("section",{className:"mt-12 pt-8 border-t border-border/40",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-6",children:a("blog.faqTitle","FAQ")}),i.jsx("div",{className:"space-y-6",children:o.faqs.map((v,w)=>i.jsxs("div",{children:[i.jsx("h3",{className:"text-lg font-semibold mb-2",children:v.q}),i.jsx("p",{className:"text-foreground/90 leading-relaxed",children:v.a})]},w))})]}),p&&i.jsx("div",{className:"mt-12 pt-8 border-t border-border/40",children:i.jsxs("p",{className:"text-sm text-muted-foreground",children:["Part of"," ",i.jsx(M,{to:`/blog/topic/${p.slug}`,className:"text-primary hover:underline font-medium",children:p.name})," ","â ",p.members.length," guides on this topic."]})}),m.length>0&&i.jsxs("section",{className:"mt-10 pt-8 border-t border-border/40",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-6",children:a("blog.relatedTitle","Continue reading")}),i.jsx("div",{className:"grid sm:grid-cols-2 gap-4",children:m.map(v=>{const w=sn(v,r);return i.jsxs(M,{to:`/blog/${v.slug}`,className:"block rounded-xl border border-border/40 bg-card/40 p-4 hover:border-primary/40 transition-colors",children:[i.jsx("h3",{className:"font-semibold text-base mb-1 line-clamp-2",children:w.title}),i.jsx("p",{className:"text-xs text-muted-foreground line-clamp-2",children:w.description})]},v.slug)})})]}),i.jsxs("div",{className:"mt-12 pt-8 border-t border-border/40 flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between",children:[i.jsx("p",{className:"text-sm text-muted-foreground",children:a("blog.ctaTeaser","Ready to generate your first AI UGC?")}),i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:a("common.getStarted","Get started")})})]})]})}),i.jsx(ze,{})]})},ah=()=>{const{t:e}=we(),t=Wa();return f.useEffect(()=>{console.error("404 Error: User attempted to access non-existent route:",t.pathname)},[t.pathname]),i.jsxs("div",{className:"flex min-h-screen items-center justify-center bg-background",children:[i.jsx(Se,{title:"Page Not Found",description:"The page you are looking for does not exist.",noindex:!0}),i.jsxs("div",{className:"text-center",children:[i.jsx("h1",{className:"mb-4 text-6xl font-display font-bold text-gradient",children:e("notFound.title")}),i.jsx("p",{className:"mb-6 text-xl text-muted-foreground",children:e("notFound.message")}),i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx(M,{to:"/",children:e("notFound.back")})})]})]})},NO=()=>{var h;const{slug:e=""}=Uu(),{i18n:t}=we(),a=CO[e];if(!a)return i.jsx(ah,{});const n=((h=t.language)==null?void 0:h.split("-")[0])||"en",r=AO(a),o=r.find(m=>m.slug===a.pillarSlug),s=r.filter(m=>m.slug!==a.pillarSlug),l=`${ht}/blog/topic/${a.slug}`,c=[{"@context":"https://schema.org","@type":"CollectionPage","@id":l,name:a.name,description:a.metaDescription,url:l,isPartOf:{"@id":`${ht}/#website`},about:{"@id":`${ht}/#organization`},hasPart:r.map(m=>{const p=sn(m,n);
4791return{"@type":"BlogPosting",headline:p.title,description:p.description,url:`${ht}/blog/${m.slug}`,datePublished:m.date,dateModified:m.updated??m.date}})},Le([{name:"Blog",path:"/blog"},{name:a.name,path:`/blog/topic/${a.slug}`}])],d=a.glossaryLinks.map(m=>_l[m]).filter(m=>!!m),u=So.filter(m=>m.slug!==a.slug);return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:a.metaTitle,description:a.metaDescription,jsonLd:c}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl",children:[i.jsx("nav",{className:"mb-6 text-sm text-muted-foreground",children:i.jsx(M,{to:"/blog",className:"hover:text-foreground transition-colors",children:"â Blog"})}),i.jsxs("header",{className:"mb-12",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-3",children:"Topic"}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-5",children:a.name}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed max-w-3xl",children:a.intro})]}),o&&i.jsxs(M,{to:`/blog/${o.slug}`,className:"group block rounded-2xl border border-primary/30 bg-card/50 p-6 sm:p-8 mb-8 transition-all hover:border-primary/60",children:[i.jsx("p",{className:"font-mono text-[11px] uppercase tracking-[0.15em] text-primary mb-2",children:"Start here"}),i.jsx("h2",{className:"text-2xl font-display font-bold mb-2 group-hover:text-primary transition-colors",children:sn(o,n).title}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:sn(o,n).description})]}),i.jsx("div",{className:"grid gap-5 sm:grid-cols-2",children:s.map(m=>{const p=sn(m,n);return i.jsxs(M,{to:`/blog/${m.slug}`,className:"group block rounded-xl border border-border/40 bg-card/40 p-5 transition-all hover:border-primary/40 hover:bg-card/60",children:[i.jsx("h3",{className:"font-display font-semibold mb-1.5 group-hover:text-primary transition-colors",children:p.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed line-clamp-3",children:p.description})]},m.slug)})}),d.length>0&&i.jsxs("div",{className:"mt-12 pt-6 border-t border-border/40",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Key terms"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:d.map(m=>i.jsx(M,{to:`/glossary/${m.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:m.term},m.slug))})]}),i.jsxs("div",{className:"mt-8",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Other topics"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:u.map(m=>i.jsx(M,{to:`/blog/topic/${m.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:m.name},m.slug))})]})]})}),i.jsx(ze,{})]})},wp="https://heroshots.ai",EO=()=>{const e={"@context":"https://schema.org","@type":"DefinedTermSet","@id":`${wp}/glossary`,name:"HeroShots AI UGC Glossary",description:"Plain-language definitions of AI UGC, creator-avatar, licensing, consent and content-generation terms.",url:`${wp}/glossary`,inLanguage:"en",hasDefinedTerm:Ny.map(a=>({"@type":"DefinedTerm",name:a.term,url:`${wp}/glossary/${a.slug}`}))},t=vO().filter(a=>a.terms.length>0);return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:"AI UGC Glossary â Terms & Definitions",description:"Clear definitions of AI UGC, creator avatars, likeness licensing, consent, content rights and generation terms â the vocabulary behind HeroShots.",enOnly:!0,jsonLd:[e,Le([{name:"Glossary",path:"/glossary"}],{enOnly:!0})]}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl",children:[i.jsxs("header",{className:"text-center mb-12",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-4",children:"HeroShots Glossary"}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-6",children:"The AI UGC glossary"}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:"The vocabulary of AI-generated UGC â from creator avatars and likeness licensing to product photography and content rights. Plain, answer-first definitions."})]}),i.jsx("div",{className:"space-y-12",children:t.map(a=>i.jsxs("section",{children:[i.jsx("h2",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-4 border-b border-border/40 pb-2",children:a.category}),i.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:a.terms.map(n=>i.jsxs(M,{to:`/glossary/${n.slug}`,className:"group block rounded-xl border border-border/40 bg-card/40 backdrop-blur p-5 transition-all hover:border-primary/40 hover:bg-card/60",children:[i.jsx("h3",{className:"text-lg font-display font-semibold mb-1.5 group-hover:text-primary transition-colors",children:n.term}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed line-clamp-3",children:n.shortDefinition})]},n.slug))})]},a.category))})]})}),i.jsx(ze,{})]})},Fw="https://heroshots.ai",zO=()=>{const{slug:e=""}=Uu(),t=_l[e];if(!t)return i.jsx(ah,{});const a=`${Fw}/glossary/${t.slug}`,n={"@context":"https://schema.org","@type":"DefinedTerm","@id":`${a}#term`,name:t.term,description:t.shortDefinition,inDefinedTermSet:`${Fw}/glossary`,url:a,inLanguage:"en"},r=t.related.map(o=>_l[o]).filter(o=>!!o);return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:t.metaTitle,de
4791scription:t.metaDescription,canonical:a,enOnly:!0,jsonLd:[n,Le([{name:"Glossary",path:"/glossary"},{name:t.term,path:`/glossary/${t.slug}`}],{enOnly:!0})]}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("article",{className:"container max-w-2xl",children:[i.jsx("nav",{className:"mb-6 text-sm text-muted-foreground",children:i.jsx(M,{to:"/glossary",className:"hover:text-foreground transition-colors",children:"â Glossary"})}),i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-3",children:t.category}),i.jsx("h1",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:t.term}),i.jsx("p",{className:"text-xl leading-relaxed text-foreground/90 mb-8",children:t.shortDefinition}),i.jsx("div",{className:"space-y-4 text-muted-foreground leading-relaxed",children:t.body.map((o,s)=>i.jsx("p",{children:o},s))}),r.length>0&&i.jsxs("div",{className:"mt-12 pt-6 border-t border-border/40",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Related terms"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:r.map(o=>i.jsx(M,{to:`/glossary/${o.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:o.term},o.slug))})]}),i.jsxs("div",{className:"mt-12 rounded-2xl border border-border/40 bg-card/40 p-6 sm:p-8 text-center",children:[i.jsxs("h2",{className:"text-xl font-display font-semibold mb-2",children:["See ",t.term.replace(/\s*\(.*\)\s*$/,"")," in action"]}),i.jsx("p",{className:"text-muted-foreground mb-5",children:"Turn a real creator or licensed AI avatar, your product and a prompt into UGC in under 60 seconds."}),i.jsxs("div",{className:"flex flex-wrap justify-center gap-3",children:[i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:"Start free"})}),i.jsx(H,{variant:"ghost",asChild:!0,children:i.jsx(M,{to:"/pricing",children:"See pricing"})})]})]})]})}),i.jsx(ze,{})]})},tu=[{slug:"ai-ugc-vs-product-photoshoot",label:"vs a product photoshoot",optionA:"AI UGC with HeroShots",optionB:"A traditional product photoshoot",h1:"AI UGC vs a Traditional Product Photoshoot",metaTitle:"AI UGC vs Product Photoshoot: Real Costs",metaDescription:"AI UGC vs a traditional product photoshoot: real HeroShots prices, turnaround, rights and iteration â plus where a real shoot is still the better choice.",lead:"AI UGC and a traditional product photoshoot solve different problems. HeroShots turns a product, a creator or AI avatar and a prompt into photo and video UGC: a batch of four image variants is â¬4.90 for a project's first batch and â¬1.90 after, excluding VAT, usually in under a minute. A shoot's cost depends on the photographer, location, model and props involved â and it still wins for hero imagery.",table:{header:["Dimension","AI UGC with HeroShots","A traditional product photoshoot"],rows:[["Image cost","â¬4.90 for a project's first batch of 4 variants, â¬1.90 for each further batch in the same project. Edit on a chosen image â¬0.39 (â¬0.23 with Pro). Excludes VAT.","No single rate exists. Cost is driven by the photographer's day rate, studio or location hire, model booking, prop and set build, styling, retouching, and travel."],["Video cost","Video up to 15s â¬15; up to 30s â¬35; extra retries â¬5 per 15s block. HeroShots Pro (â¬99/month) takes 15% off videos. Excludes VAT.","Driven by crew size, number of shoot days, direction, sound, and the editing and grading that follow."],["Turnaround","Typically under a minute for an image batch; each batch returns 4 variants you can compare side by side.","Driven by scheduling â the availability of photographer, location and talent â plus selection, retouching and approval rounds after the shoot."],["Iterating on a concept","A new angle is a new â¬1.90 batch in the same project; a targeted fix on one image is â¬0.39 (â¬0.23 with Pro).","A genuine reshoot means re-booking the same crew, location and talent. Small fixes usually go to retouching rather than back to camera."],["Likeness and rights","Consent, likeness licensing and creator royalties are built into the product. AI avatars add no fee; a real catalog model adds +25% on the base price (minimum â¬0.90 on images, â¬5 on videos).","Handled through a model release and a usage-rights agreement negotiated per shoot, per channel and per term."],["Physical realism","Depen
4791ds on how faithfully the model renders your product's real shape, colour and label. Unusual materials, mechanisms and fine texture can drift and need review against the actual item.","A camera records the object as it is, so shape, finish, colour and packaging text are captured rather than reconstructed â shaped by styling, lighting and post-production rather than invented."],["Volume and automation","Pre-paid video packages: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video). API on paid plans, plus official npm, PyPI and Packagist SDKs and a Claude Pro skill.","Volume generally means more shoot days or an ongoing retainer; cost tends to track the number of days booked."],["Getting started","Free plan: 10 watermarked images/month and 1 video preview, no credit card. Amazon URL import pulls a product in directly.","Typically requires a brief, a quote and a confirmed booking before a single frame is captured."]]},sections:[{h2:"What does each option actually involve, end to end?",body:`With HeroShots, the end-to-end flow is: get the product into a project (upload your own assets, or import an Amazon product URL), pick a creator avatar or an AI avatar, write a prompt describing the scene, and generate. A batch returns four variants, typically in under a minute. You compare them, pick one, optionally run a paid edit on it, and download or push it onward. Everything runs in the same project, so the second batch onwards costs â¬1.90. 4792 4793A traditional shoot is a coordination problem before it is a creative one. You write a brief, get quotes, book a photographer, secure a studio or location, cast and book a model, source or build props, ship product samples, run the shoot day, then select, retouch and approve. Each of those is a dependency with its own lead time and its own price, which is exactly why no honest page can quote you a single number for it.`,bullets:["HeroShots inputs: product + creator or AI avatar + prompt","HeroShots outputs: 4 image variants per batch, or video up to 15s or 30s","Photoshoot inputs: brief, crew, location, talent, props, product samples","Photoshoot outputs: a selected, retouched set from a fixed shoot window"]},{h2:"How much does AI UGC cost, and what drives photoshoot cost?",body:`Our side is easy to state because it is metered. Images are billed per batch of four variants: â¬4.90 for the first batch of a project, â¬1.90 for each further batch in that project. An edit on a chosen image is â¬0.39, or â¬0.23 on HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. HeroShots Pro is â¬99/month and removes watermarks, enables direct downloads, takes 15% off videos, cuts edit prices and gives priority queue. Pre-paid video packages are Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). All prices exclude VAT. 4794 4795For a shoot, we will not publish a figure, because the honest answer is that it varies by market, category and ambition. What is worth knowing is what moves the number: the photographer's rate and reputation, whether you rent a studio or travel to a location, whether a model is involved and on what usage terms, how much set and prop work the concept demands, and how many retouching hours the final selects need. A flat-lay of one SKU on seamless white and a lifestyle campaign in a rented apartment are the same line item on an invoice and nothing alike in practice. 4796 4797The structural difference matters more than any single figure. A shoot concentrates spend into a fixed commitment made before you know which images will perform. Metered generation spreads it across attempts, so the cost of finding out whether an angle works is small and paid after the fact.`,bullets:["Ours is per-unit and post-hoc; a shoot is committed up front","Adding a real catalog model adds +25% on the base price, with a minimum of â¬0.90 on images and â¬5 on videos","AI avatars carry no likeness fee","Custom AI avatar setup is â¬100 one-time; bring-your-own model setup is â¬300 one-time"]},{h2:"How fast can you iterate on creative?",body:`This is where the two models diverge most sharply. On HeroShots, a variation is not a project â it is another â¬1.90 batch of four in the same project, typically back in under a minute. That changes what you are willing to try. Testing six background treatments, three framings and two moods stops being a budget decision and becomes a review problem: you end up spending more time choosing between options than producing them. If one image is nearly right, a â¬0.39 edit (â¬0.23 with Pro) often closes the gap without regenerating anything. 4798 4799On a shoot, iteration is cheap while the lights are up and expensive the moment they come down. A good photographer will capture wide coverage on the day precisely because going back is costly. This puts real pressure on the brief: you have to know what you want before you shoot, and anything you did not think of is either solved
4799in retouching or waits for the next booking. That constraint has an upside â it forces creative discipline and a clear point of view â but it does not suit a performance-creative workflow that needs a steady supply of fresh variations for testing.`,bullets:["Same project, further batches: â¬1.90 each","Single-image edit: â¬0.39, or â¬0.23 on Pro","Batches return 4 variants, so each attempt is already a small comparison set","API access on paid plans and SDKs published to npm, PyPI and Packagist let you script batch generation"]},{h2:"Who holds the rights, and is the likeness cleared?",body:`Any image containing a recognisable person carries a rights question, whichever way you produce it. On HeroShots, consent, likeness licensing and creator royalties are built into the product rather than bolted on: a creator avatar is tied to a real, consenting person whose licence defines how it may be used, and the creator earns a royalty when their likeness generates content. Using a real catalog model adds +25% on the base price, with a minimum of â¬0.90 on images and â¬5 on videos. AI avatars, which do not depict a licensed real creator, add no fee. 4800 4801On a shoot, the same ground is covered by a model release and a usage-rights agreement, negotiated case by case. That approach is mature and well understood, and it has a genuine advantage: the terms are yours to shape, so you can negotiate exactly the scope, channels and exclusivity your campaign needs. It also has a genuine cost â the paperwork is per-shoot, per-channel and per-term, and extending usage later typically means going back to negotiate. 4802 4803One detail worth planning for either way: on the HeroShots Free plan, images are watermarked and you get 10 per month plus one video preview, with no credit card. Watermark removal and direct downloads come with Pro at â¬99/month.`,bullets:["Consent and licensing are recorded at the platform level, not per shoot","Creator royalties flow automatically when a licensed likeness is used","Free plan output is watermarked; Pro removes watermarks and enables direct downloads"]},{h2:"Where does AI UGC hit its physical limits?",body:`We would rather say this plainly than have you discover it in a batch. Generated imagery reconstructs a product from references and a prompt; it does not measure it. That works well for recognisable, well-photographed products in ordinary scenes. It works less well the more a product's value lives in physics: the exact way a fabric drapes, how a metallic finish shifts under raking light, how a transparent bottle refracts what is behind it, or how a mechanism sits when it is half-open. Fine surface texture, precise scale relationships between components, and hyper-legible small print on packaging all need checking rather than assuming. 4804 4805So does staging complexity. A single product in a plausible environment is comfortable territory. A composition where six specific items must be in an exact spatial relationship, or a shot that hinges on a real physical interaction happening correctly, is where a camera pointed at the actual object remains the shorter path. 4806 4807The practical answer is review. Look at all four variants against the real product, and treat anything that misrepresents what a buyer will receive as unusable. An image that oversells the product does not only risk that one order; it undermines the trust the rest of your catalogue depends on.`,bullets:["Strong fit: lifestyle context, social-native framing, seasonal and localised variants, ad testing volume","Needs scrutiny: reflective, transparent, textile and mechanical products","Needs scrutiny: small legible text on packaging and precise component scale","Non-negotiable: the product a customer receives must match what the image showed"]},{h2:"How do most brands actually combine the two?",body:`Framing this as an either-or usually produces the wrong answer. The pattern that tends to hold up is to shoot what has to be true and generate what has to be plentiful. 4808 4809Commission a real shoot for the assets that define the product: the hero image, the pack shot that anchors your PDP, the material and detail photography a buyer scrutinises before spending, the launch campaign that sets the brand's visual register for the year. Those are few, high-stakes, and worth the fixed cost and the calendar. 4810 4811Then use AI UGC for the long tail that a shoot budget was never going to cover anyway: the twelfth ad variant, the seasonal reframe, the market-specific version, the social post that has to go out this week. Because a batch of four costs â¬1.90 after the first in a project, the marginal cost of trying an idea drops far enough that the question becomes whether it is worth looking at, not whether it is worth paying for. Assets from your shoot can also serve as the product references that keep generated imagery faithful â which is a good argument for doing the shoot first.`,bullets:["Shoot: hero, pack shot, material detail, launch campaign","Generate: ad variants, seasonal and localised versions, social cadence, testing volume","Shoot assets improve generated output by giving the model accurate product references"]}],whenAWins:["You need creative volume for ad testing â a dozen angles on one concept, where each further batch of 4 variants is â¬1.90 and the point is to find out what works, not to commit up front.","You want usable options before a booking cycle can even start. An image batch typically returns in under a minute, with no casting, location or crew dependency between writing the brief and seeing the first option.","You are localising or reversioning. The same product needs a different scene, season or market, and reshooting each variant is not proportionate to the value of any one of them.","Recognisable, cleared talent matters and a full c
4811asting process does not. A licensed creator avatar carries consent, likeness licensing and royalties as part of the workflow, or an AI avatar carries no likeness fee at all.","You want generation inside a pipeline â API access on paid plans plus SDKs on npm, PyPI and Packagist, or a Claude Pro skill, rather than a human handoff for every asset."],whenBWins:["Hero and launch imagery that defines the brand. When one image will run everywhere for a year and sets your visual register, the control and craft of a directed shoot with a real photographer is worth the fixed cost and the calendar.","Tactile and material accuracy. Fabric drape, metallic finishes, transparency, and fine surface texture are physical properties best captured by a camera pointed at the real object rather than reconstructed from references.","Complex physical staging. Compositions requiring exact spatial relationships between many items, or a real interaction that must visibly happen correctly, are faster and more reliable to stage than to prompt.","Regulated or high-scrutiny categories, and packaging detail generally. If a buyer will study the image to decide what they are actually getting â small print, component scale, exact colour match â or if a gap between image and product is a compliance problem, capture it directly.","When the concept itself is undefined. A shoot day with a good director and a real set surfaces framings, gestures and details that nobody could have written into a prompt beforehand."],faqs:[{q:"How much does AI UGC cost on HeroShots?",a:"Images are billed per batch of four variants: â¬4.90 for a project's first batch and â¬1.90 for each further batch in the same project. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Generation is fast â typically under a minute for an image batch. All prices exclude VAT."},{q:"How much does a traditional product photoshoot cost?",a:"There is no reliable single figure, and we will not invent one. Cost is driven by the photographer's rate, studio or location hire, whether a model is booked and on what usage terms, prop and set construction, styling, travel, and retouching hours. A flat-lay of one SKU on seamless white and a lifestyle campaign in a rented apartment are the same line on an invoice and nothing alike in practice. Get quotes for your specific brief."},{q:"Can AI UGC fully replace a product photoshoot?",a:"For most brands, no â and we would not recommend treating it that way. Generated imagery is strong for lifestyle context, ad variants and volume, but a real shoot remains better for hero campaign imagery, tactile and material accuracy, complex physical staging and brand-defining launch assets. The common pattern is to shoot the few assets that must be exactly right and generate the long tail."},{q:"Do I need a model release for AI UGC?",a:"Consent, likeness licensing and creator royalties are built into HeroShots, so a creator avatar comes with the rights framework attached rather than requiring you to negotiate a release per shoot. Using a real catalog model adds +25% on the base price, with a minimum of â¬0.90 on images and â¬5 on videos; AI avatars add no likeness fee."},{q:"Will the generated image match my actual product?",a:"Generated imagery reconstructs a product from references and a prompt rather than measuring it, so review every batch against the real item. Reflective, transparent, textile and mechanical products, small legible packaging text, and precise component scale need the closest scrutiny. Anything that would misrepresent what a customer receives should not ship."},{q:"Can I try it before paying?",a:"Yes. The Free plan gives 10 watermarked images per month and one video preview, with no credit card. HeroShots Pro at â¬99/month removes watermarks, enables direct downloads, takes 15% off videos, lowers image edit prices and adds priority queue. Prices exclude VAT."},{q:"Who runs HeroShots?",a:"HeroShots is operated by Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy. Public pages are available in five languages: English, Ital
4811ian, Spanish, German and French."}],glossaryLinks:["ai-ugc","ai-product-photography","batch-generation","likeness-licensing","performance-creative"],updatedAt:"2026-07-26"},{slug:"ai-ugc-vs-hiring-ugc-creators",label:"vs hiring UGC creators",optionA:"AI UGC with HeroShots",optionB:"Hiring UGC creators individually",h1:"AI UGC vs Hiring UGC Creators: Which One Should You Use?",metaTitle:"AI UGC vs Hiring UGC Creators: How to Choose",metaDescription:"AI UGC vs hiring UGC creators: sourcing, speed, usage rights, revisions and scale compared, with real HeroShots prices and where real creators still win.",lead:"AI UGC and hired creators solve different problems. HeroShots turns a product, a creator avatar and a prompt into UGC-style photos and videos: a batch of four image variants costs â¬4.90 on a project's first batch and â¬1.90 on each further one, typically in under a minute, with consent and licensing built in. Hiring creators wins when you need a real person's endorsement, their audience and an unscripted voice.",table:{header:["Dimension","AI UGC with HeroShots","Hiring UGC creators individually"],rows:[["Sourcing and briefing","Pick a catalog creator or an AI avatar in the app, add a product, write a prompt. No outreach, no contracting round, no product shipping.","Driven by discovery time, outreach volume, reply and drop-off rates, rate negotiation, contracting, and shipping physical samples before anything gets filmed."],["Turnaround per iteration","Image generation is typically under a minute, and a batch returns 4 variants you can compare immediately. HeroShots Pro (â¬99/month) adds a priority queue.","Driven by creator availability, shipping time, the agreed delivery window, and how many creators you are running in parallel."],["Image cost","â¬4.90 for the first batch of 4 variants in a project, â¬1.90 for each further batch in that project. Prices exclude VAT.","Driven by creator tier, audience size, number of deliverables, exclusivity and usage terms. There is no standard rate â it is negotiated per creator."],["Video cost","â¬15 for a video up to 15s, â¬35 up to 30s. Extra retries â¬5 per 15s block. Pro takes 15% off videos. Pre-paid packages: Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video), Scale â¬1,500 (â¬60/video).","Driven by clip length, whether a script is provided, whether the creator appears on camera, editing expectations, and how many revision rounds are included."],["Revisions","Edit a chosen image for â¬0.39 (â¬0.23 with Pro). Extra video retries â¬5 per 15s block. No renegotiation needed.","Driven by the number of revision rounds written into the brief. Anything beyond that is usually a new negotiation and a new delivery window."],["Licensing and usage rights","Consent, likeness licensing and creator royalties are built into the product. Using a real catalog model adds a 25% creator likeness fee on the base price (floor â¬0.90 on images, â¬5 on videos); AI avatars add no fee.","Negotiated per creator and per campaign: organic vs paid usage, whitelisting, term and territory each need their own agreement and their own paperwork trail."],["Consistency across a campaign","The same avatar can carry an entire campaign, holding a stable face and identity from asset to asset across photos and videos.","Each creator brings their own face, home, lighting and camera. Consistency comes from casting and tight briefing, and it varies between deliveries."],["Scaling to many SKUs and markets","Import a product directly from an Amazon product URL, or drive generation through the API on paid plans with official npm, PyPI and Packagist SDKs. Re-run the same prompt per SKU or market.","Driven by how many creators you can source, brief and contract in each market and language, and by the coordination load that grows with every additional one."]]},sections:[{h2:"What is the real difference between AI UGC and hiring UGC creators?",body:`Both produce content in the same visual register: casual, native to social feeds, product-in-hand. The difference is where the content comes from, and what that implies for your workflow. 4812 4813Hiring a UGC creator means commissioning a specific human being. You source them, agree a rate, ship the product, brief the shoot, wait for delivery, and negotiate usage rights. What you get back is a real person's take on your product, filmed in their own space, in their own voice â including things you did not brief and could not have predicted. 4814 4815AI UGC on HeroShots means combining three inputs â a product, a creator avatar or AI avatar, and a prompt â into a generated photo or video. The person in the frame is either a licensed real creator from the catalog or an AI avatar. Nothing is filmed. What you get back is a controllable, repeatable output, and for images that typically takes under a minute.`,bullets:["AI UGC: you control the scene, the product placement, the wardrobe direction and the number of variants, and you get them immediately.","Hired creators: you control the brief, and the creator controls everything else â which is both the risk and the point.","AI UGC has no shipping step, because there is no physical sample to send and nothing to film.","Hired creators can post the content on their own channel; generated content has no audience of its own to borrow."]},{h2:"How much sourcing and briefing effort does each option require?",body:`Sourcing is the part of a creator programme that rarely appears on an invoice. Finding creators who match the brand, are available, respond, and accept your rate is a funnel with drop-off at every stage â and you run that funnel again for every campaign, market and product category. 4816 4817With HeroShots the sourcing step collapses into a selection: you choose a creator avatar from the catalog or an AI avatar, and you are already producing. Briefing collapses into a prompt. If the prompt is wrong, you rewrite it and regenerate rather than sending feedback and waiting for a re-shoot. 4818 4819The trade-off is real. A prompt is a narrower instrument than a human brief. A good creator will interpret your product, notice what is interesting about it, and improvise a hook you would never have written. A prompt gives you what you asked for, which is excellent when you know
4819what you want and limiting when you are hoping to be surprised.`,bullets:["HeroShots removes outreach, negotiation, contracting and product shipping from the loop.","Custom AI avatar setup is â¬100 one-time; bringing your own model is â¬300 one-time. AI avatars add no likeness fee.","Using a real catalog model adds a 25% creator likeness fee on the base price, with a floor of â¬0.90 on images and â¬5 on videos.","A human brief captures nuance a prompt cannot; a prompt captures repeatability a brief cannot."]},{h2:"How fast is each option per creative iteration?",body:`Creative testing is a loop: ship variants, read the data, ship the next round informed by it. The loop's speed is capped by whichever step is slowest, and with commissioned creators that step is usually waiting â for a reply, for shipping, for delivery, for a revision round. 4820 4821On HeroShots, image generation typically takes under a minute and a batch returns 4 variants, so a testing round is a matter of writing prompts rather than scheduling people. If a variant is nearly right, an edit on a chosen image costs â¬0.39 (â¬0.23 with HeroShots Pro) rather than a new commission. Extra video retries are â¬5 per 15s block. HeroShots Pro at â¬99/month adds a priority queue, removes watermarks and enables direct downloads. 4822 4823What you should not conclude is that faster iteration automatically means better creative. It means more shots on goal. If your hypotheses are weak, generating more of them faster mostly gets you to a weak conclusion sooner.`,bullets:["A batch returns 4 variants, which is a comparison set rather than a single option to accept or reject.","Revisions are priced per edit, so a near-miss does not restart a commercial negotiation.","The free plan gives 10 watermarked images per month and 1 video preview with no credit card, which is enough to test the workflow before committing.","With hired creators, turnaround depends on availability and shipping â factors you can plan around but cannot remove."]},{h2:"Who holds the usage rights, and how is consent handled?",body:`This is where the two models diverge most sharply, and where the cost of getting it wrong is highest. 4824 4825When you hire creators individually, usage rights are a negotiation per creator and per campaign. Organic posting, paid amplification, whitelisting on the creator's handle, term length and territory are separate levers, each with its own price and its own paperwork. Managing that across a roster is a genuine operational burden, and rights that are ambiguous or have quietly expired are a real compliance and takedown risk. 4826 4827HeroShots builds consent, likeness licensing and creator royalties into the product. When a real catalog model appears in your content, that model has consented to the use and earns royalties from it, and the licensing sits with the asset rather than in a separate contract archive. AI avatars carry no likeness fee, because there is no real person's identity to license. 4828 4829Be clear-eyed about what this does not solve: AI-generated content still needs honest disclosure. A generated testimonial is not a real customer's testimonial, and presenting it as one is a brand-safety and advertising-compliance problem regardless of how the pixels were made.`,bullets:["Per-creator rights negotiation scales badly: ten creators means ten sets of terms to track and renew.","Consent, likeness licensing and royalties are part of the HeroShots product rather than a separate contracting workflow.","A real creator's endorsement carries claims a generated asset cannot honestly make.","Disclosure obligations apply to AI-generated content in your ads â plan for them rather than discovering them late."]},{h2:"How does each option scale across many SKUs and languages?",body:`Scale is where volume-driven performance teams feel the difference. With commissioned creators, every additional SKU means another product to ship and another brief; every additional market means finding creators who speak the language and read as native to that audience. The coordination load grows roughly in step with the catalog. 4830 4831On HeroShots, adding a SKU means adding a product â including importing it directly from an Amazon product URL â and re-running your prompt structure. Paid plans include API access, with official SDKs published on
4831npm, PyPI and Packagist, so generation can be wired into a catalog pipeline instead of being done by hand. The same avatar can carry a whole campaign, which keeps a recognisable face across the assets. There is also a Claude Pro skill for generating from inside a chat, and the public site is available in five languages. 4832 4833The honest caveat: scaling generated content across markets does not automatically make it culturally native. Prompt-level localisation changes the scene, not the cultural instinct behind it. For markets where you genuinely do not know what reads as authentic, local creators are a better instrument than a translated prompt.`,bullets:["Amazon URL import turns a product page into a shootable asset without a manual upload step.","API access on paid plans, plus npm, PyPI and Packagist SDKs, makes generation programmable for large catalogs.","Avatar consistency lets one recognisable face run across a whole campaign rather than a single delivery.","Prompt-level localisation is not the same as local cultural fluency â treat them as different problems."]},{h2:"What does AI UGC actually cost on HeroShots?",body:`All prices below are HeroShots' own and exclude VAT. We publish no figure for the alternative, because we have no defensible source for one. 4834 4835Images are billed per batch of 4 variants: â¬4.90 for a project's first batch, â¬1.90 for each further batch in the same project. An edit on a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 for up to 15 seconds and â¬35 for up to 30 seconds, with extra retries at â¬5 per 15-second block. 4836 4837Using a real catalog model adds a creator likeness fee of 25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars carry no such fee. Custom AI avatar setup is â¬100 one-time; bringing your own model is â¬300 one-time. Pre-paid packages are Starter â¬350 (â¬70/video), Growth â¬650 (â¬65/video) and Scale â¬1,500 (â¬60/video). HeroShots Pro is â¬99/month and removes watermarks, enables direct downloads, takes 15% off videos, lowers the image-edit price and adds a priority queue. The free plan is 10 watermarked images per month and 1 video preview, with no credit card. 4838 4839For the creator side, build your own comparison from real quotes: rates vary by tier, market, deliverable count and usage terms, and any single published number would be misleading. When you do, include the time your team spends on sourcing, briefing and rights management â that cost is real even though it never appears on an invoice.`}],whenAWins:["You are running creative testing at volume and need many variants of the same concept quickly â â¬4.90 for a first batch of 4 variants and â¬1.90 per further batch, typically in under a minute, keeps the testing loop tight.","You have a large catalog and need the same treatment applied consistently across many SKUs, which Amazon URL import and API access on paid plans make programmable rather than manual.","You need one recognisable face across a whole campaign, where a single avatar holds identity from asset to asset better than several separate creator deliveries.","Usage rights and consent management have become an operational drag, and you want licensing, consent and creator royalties handled inside the product rather than as a per-creator negotiation.","You are iterating on near-misses rather than starting over â a â¬0.39 edit (â¬0.23 with Pro) fixes a good asset without commissioning a re-shoot."],whenBWins:["You need a genuine personal endorsement, or a long-term partnership that builds one. A real creator can say they use the product and mean it, and a recurring relationship compounds as they learn the product and become a credible advocate. A generated asset cannot make that claim honestly, and audiences and regulators both treat the difference as material.","You want the creator's own audience and distribution. Hiring a creator buys access to people who already follow and trust them; a generated asset has no channel of its own and no borrowed credibility.","You are looking for a native, spontaneous voice and unscripted reactions. Some of the best UGC hooks are things nobody briefed: an offhand comment, an unplanned reaction, a use case the brand never thought of. A prompt produces what you asked for, not what you did not know to ask for.","Your product has to be genuinely demonstrated â real texture, fit, motion, or a result that has to be shown happening to a real person on camera.","You are entering a market or subculture you do not understand well. Local creators bring instinct about what reads as authentic there; prompt-level localisation changes the scene without changing the instinct behind it."],faqs:[{q:"Is AI UGC cheaper than hiring UGC creators?",a:"We publish our own prices and not the alternative's, because creator rates vary by tier, market, deliverable count and usage terms â any single figure would mislead. On HeroShots, images cost â¬4.90 for a project's first batch of 4 variants and â¬1.90 per further batch; video is â¬15 up to 15s and â¬35 up to 30s, and all prices exclude VAT. Get real quotes for your own creator brief and compare on total cost, including the internal time spent sourcing, briefing and managing rights."},{q:"Can I use AI UGC and hired creators together?",a:"Yes, and for most performance teams that is the sensible answer. A common split is to use AI UGC for the high-volume testing layer â many variants, many SKUs, fast iteration â and to commission real creators for the concepts that win, for genuine endorsements, and for anything that needs to run on the creator's own channel. The two layers answer different questions."},{q:"Do I need to worry about consent and likeness rights with AI UGC?",a:"You should always ask, and on HeroShots it is built in. Consent, likeness licensing and creator royalties are part of the product: when a real catalog model appears in your content, they have consented and they earn royalties from that use. Using a real catalog model adds a 25% creator likeness fee on the base price, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee, because no real person's identity is involved. Separately, AI-generated content in advertising still needs honest disclosure."},{q:"How consistent is a creator avatar across a whole campaign?",a:"The same avatar can carry an entire campaign, holding a stable face and identity across many separate images and videos. That is a real advantage over commissioning several creators, where each delivery brings a different face, home setting, lighting and camera. If your campaign depends on one recognisable spokesperson across a long run of assets, this is the strongest argument for the AI UGC side."}
4839,{q:"How fast is generation, and what happens if I do not like the result?",a:"Image generation is typically under a minute, and each batch returns 4 variants, so you have something to compare rather than one output to accept or reject. If a variant is close, an edit on a chosen image costs â¬0.39 (â¬0.23 with HeroShots Pro). For video, extra retries are â¬5 per 15-second block. HeroShots Pro at â¬99/month also adds a priority queue, removes watermarks and enables direct downloads."},{q:"Can I automate generation for a large product catalog?",a:"Yes. Paid plans include API access, with official SDKs published on npm, PyPI and Packagist, so generation can be wired into a catalog or e-commerce pipeline. You can also import a product directly from an Amazon product URL, and there is a Claude Pro skill for generating from inside a chat."},{q:"Can I try it before committing?",a:"The free plan includes 10 watermarked images per month and 1 video preview, with no credit card required. That is enough to run the workflow end to end on your own product and judge whether the output holds up against the creator content you are buying today. HeroShots is operated by Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy."}],glossaryLinks:["ai-ugc","performance-creative","batch-generation","likeness-licensing","avatar-consistency"],updatedAt:"2026-07-26"},{slug:"ai-ugc-vs-stock-photography",label:"vs stock photography",optionA:"AI UGC with HeroShots",optionB:"Stock photography",h1:"AI UGC vs Stock Photography: Which Should You Use?",metaTitle:"AI UGC vs Stock Photography: How to Choose",metaDescription:"AI UGC vs stock photography: stock can't show your actual product. Compare exclusivity, licensing, turnaround and cost â and where stock still wins.",lead:"Stock photography cannot show your actual product â that is usually the deciding factor. HeroShots generates images of your specific item, paired with a real catalog creator or an AI avatar, in a scene you describe: â¬4.90 for the first batch of 4 variants in a project and â¬1.90 for each further batch, excluding VAT. Stock still wins for backgrounds, textures and editorial concepts where no product appears.",table:{header:["Dimension","AI UGC with HeroShots","Stock photography"],rows:[["What actually appears in the frame","Your product, from your own reference images or an imported Amazon URL, paired with a real creator or an AI avatar","Whatever the library shot contains. It can resemble your category, but it cannot show your product, your packaging or your label"],["Exclusivity","Made to order from your product inputs and your prompt, for your project, rather than licensed from a shared catalogue","Standard library licences are non-exclusive by design â the same shot is available to anyone who licenses it, competitors included"],["Image cost structure","â¬4.90 for the first batch of 4 variants in a project, â¬1.90 for each further batch in the same project, â¬0.39 per edit on a chosen image (â¬0.23 with HeroShots Pro). Excludes VAT","Driven by licence type (standard vs extended), resolution, whether you buy single downloads or a subscription, and how many images per month you actually use"],["Video cost structure","Video up to 15s â¬15, up to 30s â¬35, extra retries â¬5 per 15s block. Pre-paid packages from Starter â¬350 (â¬70/video) to Scale â¬1,500 (â¬60/video). Excludes VAT","Stock footage is priced separately from stills; cost is driven by clip length, resolution, and how broad a licence you need"],["Turnaround","Typically under a minute for an image batch, returning 4 variants to choose from","Instant for a shot that already exists in the library. If the shot you need does not exist, no amount of searching produces it"],["Directing the result","Re-prompt, generate another batch, or edit a chosen image for â¬0.39 (â¬0.23 with Pro) until the framing and scene match the brief","You can filter and search, but you cannot direct the shoot. If the closest result is a near-miss, the options are to accept it or keep searching"],["Rights, consent and people","Consent, likeness licensing and creator royalties are built into the product; a real catalog model adds +25% on the base price (floor â¬0.90 on images, â¬5 on videos), AI avatars add no fee","The library holds the model releases and grants you a licence to the image. Editorial
4839-only assets, sensitive uses and some commercial contexts typically require an extended or upgraded licence"],["Getting started","Free plan: 10 watermarked images/month and 1 video preview, no credit card. HeroShots Pro â¬99/month removes watermarks, enables direct downloads, â15% on videos, cheaper image edits and priority queue","Some libraries offer free tiers with attribution or usage conditions; paid tiers vary widely by licence and volume commitment"]]},sections:[{h2:"What is the real difference between AI UGC and stock photography?",body:`Stock photography is a retrieval problem: someone else already took a photograph, and your job is to find the one that comes closest to what you meant. AI UGC is a production problem: you supply the product, choose a creator or AI avatar, describe the scene, and the image is made to order. 4840 4841That distinction drives almost everything else on this page. Retrieval is instant but bounded by what exists. Production takes a little time but is bounded by what you can describe. If your brief is "a warm kitchen counter at breakfast", retrieval works fine. If your brief is "a warm kitchen counter at breakfast, with our 250ml amber bottle and our label facing camera", retrieval will never quite get there.`,bullets:["Stock = license an existing photograph of someone else's subject","AI UGC = generate a new image of your subject, in a scene you specify","Stock is bounded by the library's catalogue; AI UGC is bounded by your prompt","Both are legitimate inputs to the same content calendar â they solve different jobs"]},{h2:"Can stock photography show your actual product?",body:`No, and this is the honest structural limit. A stock library contains photographs of products that already existed when the shoot happened â generic bottles, unbranded boxes, anonymous devices, or branded goods that are not yours. The closest a library gets is a visually similar item, which means your creative is showing a prop or a stand-in to someone who is deciding whether to buy your product. 4842 4843For an e-commerce team this matters most on the assets closest to the purchase: lifestyle shots on the product detail page, ad creative for a specific SKU, and social content where the caption names the product. Showing a stand-in there creates a mismatch between what the shopper sees and what arrives in the box. 4844 4845HeroShots works the other way round. You upload product assets or import them directly from an Amazon URL, pair them with a real creator or an AI avatar, and generate photo and video UGC in which your actual product is the subject. It is a consent-based UGC workflow, not a generic image generator.`},{h2:"Who else is using the same image? Exclusivity and licensing",body:`Standard stock licences are non-exclusive. That is not a flaw â it is part of what makes stock affordable â but it means a shot you found is available to every other buyer in your category. Some libraries sell exclusive or rights-managed licences, which addresses this directly; those are typically priced higher and negotiated separately. 4846 4847The licensing models are also shaped differently. With stock, the library holds the model releases and grants you a licence with defined boundaries: standard versus extended use, editorial-only restrictions, and print-run or impression caps depending on the provider. Read those boundaries before a campaign scales, because the licence bought for a blog header is often not the licence needed for paid social at volume. 4848 4849With HeroShots, the rights layer is built into the product rather than bolted on: consent, likeness licensing and creator royalties travel with the generation. When a real catalog model is used, a likeness fee of +25% on the base price applies, with a floor of â¬0.90 on images and â¬5 on videos. AI avatars add no fee at all.`,bullets:["Stock: non-exclusive by default; exclusivity is a separate, separately priced product","Stock: check editorial-only flags and extended-licence triggers before scaling spend","HeroShots: generations are made from your inputs, for your project","HeroShots: consent, likeness licensing and creator royalties are part of the workflow"]},{h2:"What does each option cost, and what actually drives the price?",body:`HeroShots prices are fixed and published. Images are billed per batch of 4 variants: â¬4.90 for the first batch in a project, â¬1.90 for each further batch in the same project, and â¬0.39 to edit a chosen image (â¬0.23 with HeroShots Pro). Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Pre-paid packages run from Starter â¬350 (â¬70/video) through Growth â¬650 (â¬65/video) to Scale â¬1,500 (â¬60/video). Optional one-time setups: â¬100 for a custom AI avatar, â¬300 to bring your own model. HeroShots Pro is â¬99/month and removes watermarks, enables direct downloads, applies â15% on videos, reduces edit costs and gives priority queue. All prices exclude VAT. 4850 4851Stock pricing we deliberately will not put a number on, because it varies enormously and depends on choices you make: single download versus subscription, standard versus extended licence, resolution and file type, whether the asset is royalty-free or rights-managed, and how many images in a subscription bundle actually get used. A low headline per-image rate on a plan you only half-consume is not a low per-image rate. 4852 4853The fairer way to compare is per usable asset. Inside a stock subscription, one more download costs whatever the bundle allows â so the real variable is hit rate, meaning whether the library happens to contain your scene at all. AI UGC has a known cost per batch and a known cost per edit, and the second batch in a project costs less than the first, which is what makes iterating toward the right shot economical.`},{h2:"How fast can you get the shot you need?",body:`Stock is instantaneous for anything that already exists. Nothing beats a search box when the requirement is loose and the deadline is in minutes. But speed collapses when the shot does not exist â searching harder does not create it, and the only remaining options are to compromise on the brief or commission the image some other way. 4854 4855HeroShots generation is fast, typically under a minute for images, and each batch returns 4 variants rather than a single take, so review starts with options instead of a yes/no. The practical consequence is different from raw speed: because a further batch in the same project is â¬1.90 and an edit is â¬0.39, the loop from "nearly right" to "right" is short and inexpensive. 4856 4857For teams producing at volume there is a programmatic path as well. HeroShots offers an API on paid plans, official SDKs for npm, PyPI and Packagist, a Claude Pro skill for generating without leaving the chat, Amazon URL import for building the product catalogue, and public pages in five languages. Stock libraries generally expose APIs too, so this is not unique to either side â but with AI UGC the API generates new assets rather than returning existing ones.`},{h2:"Where does stock photography still genuinely win?",body:`In plenty of places, and pretending otherwise would be dishonest. Stock is the right answer whenever the product does not need to appear, whenever the image must document something real, and whenever the requirement is loose enough that "close enough" genuinely is close enough. 4858 4859The strongest case is documentary truth. A photograph of a real city, a real event, a real building or a real historical moment is evidence of something that happened. A generated image is not, and using one as though it were would be a brand-safety problem, not a shortcut. The same applies to editorial contexts where readers reasonably assume the picture depicts reality. 4860 4861The two approaches solve different jobs, so using both is usually reasonable: stock for backgrounds, textures, concept illustration and blog headers; AI UGC for anything where the product, the person or the specific sce
4861ne has to be exactly yours. Deciding per-asset rather than per-vendor is what keeps both budgets sensible.`}],whenAWins:["The product has to be recognisably yours â product detail pages, SKU-level ad creative, packaging shots, or any asset where the caption names the item the shopper will receive.","You need many variations of the same idea for creative testing: different scenes, angles and framings around one product, where each further batch in a project is â¬1.90 and each edit â¬0.39.","A real person needs to appear with the product and the rights need to be documented â consent, likeness licensing and creator royalties are built in, and AI avatars add no likeness fee at all.","You need short-form video of your product rather than a still: up to 15s at â¬15 or up to 30s at â¬35, with pre-paid packages from Starter â¬350 (â¬70/video) to Scale â¬1,500 (â¬60/video).","You are producing seasonal, localised or catalogue-wide variants and want generation wired into your own systems â the API on paid plans, official npm, PyPI and Packagist SDKs, the Claude Pro skill, and Amazon URL import for building product assets."],whenBWins:["The product does not appear at all: backgrounds, textures, abstract patterns, section dividers, slide backdrops and website furniture where a licensed library shot is simply the efficient answer.","The image must document something real â a specific city, a real event, an actual building, a historical moment. A photograph is evidence; a generated image is not, and presenting one as documentary would be misleading.","Editorial and conceptual illustration for blogs, reports and press material, where readers expect a generic photograph and no product claim is being made.","The brief is loose, the deadline is short, and you already pay for a subscription you fully consume â on low-stakes generic assets that combination is hard to beat.","You need breadth: a large volume of unrelated, one-off images across many subjects with no consistency requirement â or your legal and procurement teams have already cleared an enterprise stock agreement, and using the contract you have is faster than onboarding a new supplier."],faqs:[{q:"Can stock photography ever show my actual product?",a:"Only if you or a partner photographed it and uploaded it to a library yourself. Commercial stock libraries contain photographs taken before your brief existed, so the best available match is a visually similar item â not your product, your packaging or your label. If the shopper needs to see the thing they are buying, stock cannot do that job."},{q:"Will competitors end up using the same stock image as me?",a:"With a standard, non-exclusive licence, yes â that is how the model works, and it is part of what makes stock affordable. Exclusive or rights-managed licences exist to prevent it, typically at a higher price and negotiated separately. HeroShots generations are produced from your own product inputs and your prompt, for your project, so the exclusivity question does not arise in the same form."},{q:"How much does AI UGC cost with HeroShots?",a:"Images are billed per batch of 4 variants: â¬4.90 for the first batch in a project and â¬1.90 for each further batch in the same project. Editing a chosen image is â¬0.39, or â¬0.23 with HeroShots Pro. Video is â¬15 up to 15 seconds and â¬35 up to 30 seconds, with extra retries at â¬5 per 15-second block. Prices exclude VAT."},{q:"Do I need a model release if a person appears in AI UGC?",a:"The rights layer is part of the product rather than something you assemble separately. Consent, likeness licensing and creator royalties are built into HeroShots. Using a real catalog model adds a likeness fee of +25% on the base price, with a floor of â¬0.90 on images and â¬5 on videos; AI avatars add no fee. With stock, the library holds the releases and grants you a licence whose scope you should check before scaling a campaign."},{q:"Can I try it before paying?",a:"Yes. The free plan gives 10 watermarked images per month and 1 video preview, with no credit card required. HeroShots Pro at â¬99/month removes watermarks, enables direct downloads, applies â15% on videos, makes image edits cheaper and adds priority queue."},{q:"Should I use both stock and AI UGC?",a:"They solve different jobs, so deciding per asset rather than per vendor usually makes sense. Use stock for backgrounds, textures, editorial concepts and anything documentary. Use AI UGC wherever the product, the person or the exact scene has to be yours â product pages, SKU-level ads, testimonial-style content and creative testing at volume."},{q:"Is AI-generated content from HeroShots labelled as AI?",a:"Free-plan output carries a watermark, and HeroShots Pro removes watermarks and enables direct downloads. Treat that as a plan feature, not an AI-disclosure mechanism: disclosure expectations vary by channel and jurisdiction and remain the publisher's responsibility, so check the rules of the platform you are publishing on. In all cases, never present generated imagery as documentation of a real event, person or place."}],glossaryLinks:["ugc-vs-stock","ai-ugc","ai-product-photography","usage-rights","batch-generation"],updatedAt:"2026-07-26"}],RO=Object.fromEntries(tu.map(e=>[e.slug,e])),DO=()=>{const e=[{"@context":"https://schema.org","@type":"CollectionPage","@id":`${ht}
4861/compare`,name:"HeroShots comparisons",description:"Honest comparisons between AI UGC and the alternatives â product photoshoots, hiring UGC creators, and stock photography.",url:`${ht}/compare`,inLanguage:"en",hasPart:tu.map(t=>({"@type":"Article",headline:t.h1,url:`${ht}/compare/${t.slug}`}))},Le([{name:"Compare",path:"/compare"}],{enOnly:!0})];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:"Compare AI UGC vs the alternatives",description:"How AI UGC compares with a product photoshoot, hiring UGC creators and stock photography â with real HeroShots prices and an honest verdict for each.",enOnly:!0,jsonLd:e}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl",children:[i.jsxs("header",{className:"text-center mb-12",children:[i.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.2em] text-primary mb-4",children:"Compare"}),i.jsx("h1",{className:"text-4xl md:text-5xl font-display font-bold mb-6",children:"AI UGC vs the alternatives"}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:"Straight comparisons with real HeroShots prices â including, on every page, the cases where the alternative is the better choice."})]}),i.jsx("div",{className:"grid gap-5 sm:grid-cols-2",children:tu.map(t=>i.jsxs(M,{to:`/compare/${t.slug}`,className:"group block rounded-2xl border border-border/40 bg-card/40 backdrop-blur p-6 transition-all hover:border-primary/40 hover:bg-card/60",children:[i.jsx("h2",{className:"text-xl font-display font-semibold mb-2 group-hover:text-primary transition-colors",children:t.h1}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed line-clamp-4",children:t.lead})]},t.slug))})]})}),i.jsx(ze,{})]})},_O=/^(AI|HeroShots)\b/,Hw=e=>_O.test(e)?e:e.charAt(0).toLowerCase()+e.slice(1),qO=()=>{const{slug:e=""}=Uu(),t=RO[e];if(!t)return i.jsx(ah,{});const a=`${ht}/compare/${t.slug}`,n=[{"@context":"https://schema.org","@type":"Article","@id":`${a}#article`,headline:t.h1,description:t.metaDescription,datePublished:t.updatedAt,dateModified:t.updatedAt,author:{"@type":"Organization","@id":`${ht}/#organization`,name:"HeroShots"},publisher:{"@id":`${ht}/#organization`},mainEntityOfPage:{"@type":"WebPage","@id":a},inLanguage:"en",about:[{"@type":"Thing",name:t.optionA},{"@type":"Thing",name:t.optionB}]},{"@context":"https://schema.org","@type":"FAQPage",mainEntity:t.faqs.map(s=>
4861({"@type":"Question",name:s.q,acceptedAnswer:{"@type":"Answer",text:s.a}}))},Le([{name:"Compare",path:"/compare"},{name:t.label,path:`/compare/${t.slug}`}],{enOnly:!0})],r=t.glossaryLinks.map(s=>_l[s]).filter(s=>!!s),o=tu.filter(s=>s.slug!==t.slug);return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:t.metaTitle,description:t.metaDescription,enOnly:!0,jsonLd:n}),i.jsx(Ee,{}),i.jsx("main",{className:"flex-grow py-10 sm:py-14 md:py-20",children:i.jsxs("article",{className:"container max-w-3xl",children:[i.jsx("nav",{className:"mb-6 text-sm text-muted-foreground",children:i.jsx(M,{to:"/compare",className:"hover:text-foreground transition-colors",children:"â Compare"})}),i.jsx("h1",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:t.h1}),i.jsx("p",{className:"text-xl leading-relaxed text-foreground/90 mb-10",children:t.lead}),i.jsx("div",{className:"my-8 overflow-x-auto",children:i.jsxs("table",{className:"w-full border-collapse text-sm",children:[i.jsx("thead",{children:i.jsx("tr",{className:"border-b border-border",children:t.table.header.map((s,l)=>i.jsx("th",{className:"px-3 py-2.5 text-left font-semibold",children:s},l))})}),i.jsx("tbody",{children:t.table.rows.map((s,l)=>i.jsx("tr",{className:"border-b border-border/40",children:s.map((c,d)=>i.jsx("td",{className:`px-3 py-2.5 align-top ${d===0?"font-medium":"text-foreground/90"}`,children:c},d))},l))})]})}),t.sections.map((s,l)=>i.jsxs("section",{className:"mt-10",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-4",children:s.h2}),s.body.split(` 4862 4863`).map((c,d)=>i.jsx("p",{className:"my-4 leading-relaxed text-foreground/90",children:c},d)),s.bullets&&i.jsx("ul",{className:"list-disc pl-6 space-y-2 my-4 text-foreground/90",children:s.bullets.map((c,d)=>i.jsx("li",{children:c},d))})]},l)),i.jsxs("section",{className:"mt-12 grid gap-6 sm:grid-cols-2",children:[i.jsxs("div",{className:"rounded-2xl border border-primary/30 bg-card/40 p-6",children:[i.jsxs("h2",{className:"text-lg font-display font-semibold mb-3 flex items-center gap-2",children:[i.jsx(Cn,{className:"h-5 w-5 text-primary"})," Choose ",Hw(t.optionA)," when"]}),i.jsx("ul",{className:"space-y-2 text-sm text-foreground/90",children:t.whenAWins.map((s,l)=>i.jsxs("li",{className:"flex gap-2",children:[i.jsx("span",{className:"text-primary",children:"â¢"}),s]},l))})]}),i.jsxs("div",{className:"rounded-2xl border border-border/50 bg-card/20 p-6",children:[i.jsxs("h2",{className:"text-lg font-display font-semibold mb-3 flex items-center gap-2",children:[i.jsx(FN,{className:"h-5 w-5 text-muted-foreground"})," Choose ",Hw(t.optionB)," when"]}),i.jsx("ul",{className:"space-y-2 text-sm text-foreground/90",children:t.whenBWins.map((s,l)=>i.jsxs("li",{className:"flex gap-2",children:[i.jsx("span",{className:"text-muted-foreground",children:"â¢"}),s]},l))})]})]}),i.jsxs("section",{className:"mt-12",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-5",children:"Frequently asked questions"}),i.jsx("div",{className:"space-y-5",children:t.faqs.map((s,l)=>i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-1.5",children:s.q}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:s.a})]},l))})]}),r.length>0&&i.jsxs("div",{className:"mt-12 pt-6 border-t border-border/40",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Terms used on this page"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:r.map(s=>i.jsx(M,{to:`/glossary/${s.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:s.term},s.slug))})]}),o.length>0&&i.jsxs("div",{className:"mt-8",children:[i.jsx("p",{className:"text-sm font-mono uppercase tracking-[0.15em] text-muted-foreground mb-3",children:"Other comparisons"}),i.jsx("div",{className:"flex flex-wrap gap-2",children:o.map(s=>i.jsx(M,{to:`/compare/${s.slug}`,className:"text-sm px-3 py-1.5 rounded-full border border-border/50 hover:border-primary/50 hover:text-primary transition-colors",children:s.label},s.slug))})]}),i.jsxs("div",{className:"mt-12 rounded-2xl border border-border/40 bg-card/40 p-6 sm:p-8 text-center",children:[i.jsx("h2",{className:"text-xl font-display font-semibold mb-2",children:"Try it on your own product"}),i.jsx("p",{className:"text-muted-foreground mb-5",children:"The free plan includes 10 images a month and a video preview â no credit card."}),i.jsxs("div",{className:"flex flex-wrap justify-center gap-3",children:[i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:"Start free"})}),i.jsx(H,{variant:"ghost",asChild:!0,children:i.jsx(M,{to:"/pricing",children:"See pricing"})})]})]})]})}),i.jsx(ze,{})]})},UO=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"WebPage",name:"HeroShots for Brands",description:"Generate authentic AI UGC for your products at scale. Upload products, choose creator avatars, get scroll-stopping content in seconds.",url:"https://heroshots.ai/for-brands",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"}},a=[{icon:km,title:e("forBrands.feat1Title"),desc:e("forBrands.feat1Desc")},{icon:Ag,title:e("forBrands.feat2Title"),desc:e("forBrands.feat2Desc")},{icon:wt,title:e("forBrands.feat3Title"),desc:e("forBrands.feat3Desc")},{icon:dC,title:e("forBrands.feat4Title"),desc:e("forBrands.feat4Desc")}],n=[{icon:km,title:e("forBrands.mode1Title"),desc:e("forBrands.mode1Desc")},{icon:wt,title:e("forBrands.mode2Title"),desc:e("forBrands.mode2Desc")},{icon:gl,title:e("forBrands.mode3Title"),desc:e("forBrands.mode3Desc")}],r=[{icon:xa,title:e("forBrands.use1Title"),desc:e("forBrands.use1Desc")},{icon:Sg,title:e("forBrands.use2Title"),desc:e("forBrands.use2Desc")},{icon:Kl,title:e("forBrands.use3Title"),desc:e("forBrands.use3Desc")},{icon:Sn,title:e("forBrands.use4Title"),desc:e("forBrands.use4Desc")}],o=[{num:"01",title:e("forBrands.step1Title"),desc:e("forBrands.step1Desc")},{num:"02",title:e("forBrands.step2Title"),desc:e("forBrands.step2Desc")},{num:"03",title:e("forBrands.step3Title"),desc:e("forBrands.step3Desc")},{num:"04",title:e("forBrands.step4Title"),desc:e("forBrands.step4Desc")}];return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("forBrands.seoTitle"),description:e("forBrands.seoDesc"),canonical:"https://heroshots.ai/for-brands",jsonLd:[t,Le([{name:"For Brands",path:"/for-brands"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-12 sm:py-16 md:py-24 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4863parent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(xa,{className:"h-4 w-4"}),e("forBrands.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("forBrands.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forBrands.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("forBrands.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("common.tryItNow")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("common.bookDemo")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground/70 mt-4",children:e("common.noCreditCard")})]})})]}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forBrands.featuresTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("forBrands.featuresSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-6 max-w-6xl mx-auto",children:a.map((s,l)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(s.icon,{className:"h-5 w-5 text-primary"})}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:s.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:s.desc})]})},l))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forBrands.modesTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-3xl mx-auto",children:e("forBrands.modesSubtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-8 max-w-5xl mx-auto",children:n.map((s,l)=>i.jsxs("div",{className:"p-8 rounded-2xl glass-card hover:shadow-elegant transition-all duration-500 text-center",children:[i.jsx("div",{className:"w-16 h-16 rounded-2xl gradient-hero flex items-center justify-center mx-auto mb-6",children:i.jsx(s.icon,{className:"h-7 w-7 text-primary-foreground"})}),i.jsx("h3",{className:"text-xl font-display font-semibold mb-3",children:s.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:s.desc})]},l))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-16",children:i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forBrands.howTitle")})}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-8 max-w-6xl mx-auto",children:o.map((s,l)=>i.jsxs("div",{className:"text-center group",children:[i.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-2xl gradient-hero text-primary-foreground text-2xl font-display font-bold shadow-elegant mb-6 group-hover:scale-105 transition-transform",children:s.num}),i.jsx("h3",{className:"text-lg font-display font-semibold mb-3",children:s.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:s.desc})]},l))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forBrands.useCasesTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("forBrands.useCasesSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 gap-6 max-w-5xl mx-auto",children:r.map((s,l)=>i.jsx("div",{className:"p-8 rounded-2xl glass-card hover:shadow-elegant transition-all duration-500",children:i.jsxs("div",{className:"flex items-start gap-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center shrink-0",children:i.jsx(s.icon,{className:"h-5 w-5 text-primary"})}),i.jsxs("div",{children:[i.jsx("h3",{className:"text-lg font-display font-semibold mb-2",children:s.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:s.desc})]})]})},l))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsx("div",{className:"grid grid-cols-3 gap-8 max-w-4xl mx-auto mb-16",children:[{value:"~5X",label:e("forBrands.stat1")},{value:"<60s",label:e("forBrands.stat2")},{value:"95%",label:e("forBrands.stat3")}].map((s,l)=>i.jsxs("div",{className:"text-center p-10 rounded-2xl glass-card",children:[i.jsx("div",{className:"text-4xl md:text-5xl font-display font-bold mb-3 text-gradient",children:s.value}),i.jsx("p",{className:"text-sm text-muted-foreground",children:s.label})]},l))})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-6",children:e("forBrands.ctaTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("forBrands.ctaSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs("a",{href:"https://app.heroshots.ai/login",children:[e("common.getStarted"),i.jsx(at,{className:"ml-2 h-5 w-5"})]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pricing",children:e("forBrands.seePricing")})})]})]})})]}),i.jsx(ze,{})]})},MO=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"WebPage",name:"HeroShots for Agencies",description:e("forAgencies.seoDesc"),url:"https://heroshots.ai/for-agencies",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"},mainEntity:{"@type":"Service",name:"HeroShots Reseller Program",serviceType:"Agency reseller program",provider:{"@type":"Organization",name:"HeroShots"},description:e("forAgencies.resellerDesc"),areaServed:"Worldwide"}};return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("forAgencies.seoTitle"),description:e("forAgencies.seoDesc"),canonical:"https://heroshots.ai/for-agencies",jsonLd:[t,Le([{name:"For Agencies",path:"/for-agencies"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-12 sm:py-16 md:py-24 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4863parent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(td,{className:"h-4 w-4"}),e("forAgencies.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("forAgencies.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgencies.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("forAgencies.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("common.bookDemo")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pricing",children:e("forAgencies.seePlans")})})]})]})})]}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgencies.twoTypesTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-3xl mx-auto",children:e("forAgencies.twoTypesSubtitle")})]}),i.jsxs("div",{className:"grid md:grid-cols-2 gap-8 max-w-5xl mx-auto",children:[i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1 overflow-hidden",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-5",children:[i.jsx("div",{className:"w-14 h-14 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(Ha,{className:"h-6 w-6 text-primary"})}),i.jsx("h3",{className:"text-xl font-display font-bold",children:e("forAgencies.talentCardTitle")}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:e("forAgencies.talentCardDesc")}),i.jsx("ul",{className:"space-y-2",children:e("forAgencies.talentCardBullets",{returnObjects:!0}).map((a,n)=>i.jsxs("li",{className:"flex items-start gap-2 text-sm text-muted-foreground",children:[i.jsx(wt,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),a]},n))}),i.jsx(H,{variant:"outline",className:"w-full group",asChild:!0,children:i.jsxs(M,{to:"/for-agencies/talent",children:[e("common.learnMore"),i.jsx(at,{className:"ml-2 h-4 w-4 group-hover:translate-x-1 transition-transform"})]})})]})}),i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1 overflow-hidden",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-5",children:[i.jsx("div",{className:"w-14 h-14 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(xa,{
4863className:"h-6 w-6 text-primary"})}),i.jsx("h3",{className:"text-xl font-display font-bold",children:e("forAgencies.merchantCardTitle")}),i.jsx("p",{className:"text-muted-foreground leading-relaxed",children:e("forAgencies.merchantCardDesc")}),i.jsx("ul",{className:"space-y-2",children:e("forAgencies.merchantCardBullets",{returnObjects:!0}).map((a,n)=>i.jsxs("li",{className:"flex items-start gap-2 text-sm text-muted-foreground",children:[i.jsx(wt,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),a]},n))}),i.jsx(H,{variant:"outline",className:"w-full group",asChild:!0,children:i.jsxs(M,{to:"/for-agencies/merchant",children:[e("common.learnMore"),i.jsx(at,{className:"ml-2 h-4 w-4 group-hover:translate-x-1 transition-transform"})]})})]})})]})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-3xl mx-auto text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgencies.bothTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed mb-8",children:e("forAgencies.bothDesc")})]})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-16",children:i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgencies.whyTitle")})}),i.jsx("div",{className:"grid sm:grid-cols-2 gap-6 max-w-5xl mx-auto",children:[{title:e("forAgencies.ben1Title"),desc:e("forAgencies.ben1Desc")},{title:e("forAgencies.ben2Title"),desc:e("forAgencies.ben2Desc")},{title:e("forAgencies.ben3Title"),desc:e("forAgencies.ben3Desc")},{title:e("forAgencies.ben4Title"),desc:e("forAgencies.ben4Desc")}].map((a,n)=>i.jsxs("div",{className:"p-8 rounded-2xl glass-card hover:shadow-elegant transition-all duration-500",children:[i.jsx("h3",{className:"text-lg font-display font-semibold mb-3",children:a.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:a.desc})]},n))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-6",children:e("forAgencies.ctaTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("forAgencies.ctaSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/pre-sales",children:[i.jsx(vo,{className:"mr-2 h-5 w-5"}),e("common.bookDemo")]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/docs",children:e("forAgencies.apiDocs")})})]})]})})]}),i.jsx(ze,{})]})},LO=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"WebPage",name:"HeroShots for Talent Agencies",description:e("forAgenciesTalent.seoDesc"),url:"https://heroshots.ai/for-agencies/talent",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"}},a=[{icon:Ha,title:e("forAgenciesTalent.feat1Title"),desc:e("forAgenciesTalent.feat1Desc")},{icon:Pg,title:e("forAgenciesTalent.feat2Title"),desc:e("forAgenciesTalent.feat2Desc")},{icon:Sg,title:e("forAgenciesTalent.feat3Title"),desc:e("forAgenciesTalent.feat3Desc")},{icon:KN,title:e("forAgenciesTalent.feat4Title"),desc:e("forAgenciesTalent.feat4Desc")},{icon:DN,title:e("forAgenciesTalent.feat5Title"),desc:e("forAgenciesTalent.feat5Desc")},{icon:es,title:e("forAgenciesTalent.feat6Title"),desc:e("forAgenciesTalent.feat6Desc")}],n=[{num:"01",title:e("forAgenciesTalent.step1Title"),desc:e("forAgenciesTalent.step1Desc")},{num:"02",title:e("forAgenciesTalent.step2Title"),desc:e("forAgenciesTalent.step2Desc")},{num:"03",title:e("forAgenciesTalent.step3Title"),desc:e("forAgenciesTalent.step3Desc")},{num:"04",title:e("forAgenciesTalent.step4Title"),desc:e("forAgenciesTalent.step4Desc")}];return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("forAgenciesTalent.seoTitle"),description:e("forAgenciesTalent.seoDesc"),canonical:"https://heroshots.ai/for-agencies/talent",jsonLd:[t,Le([{name:"For Agencies",path:"/for-agencies"},{name:"Talent Agency",path:"/for-agencies/talent"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-12 sm:py-16 md:py-24 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4863parent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(Ha,{className:"h-4 w-4"}),e("forAgenciesTalent.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("forAgenciesTalent.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesTalent.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("forAgenciesTalent.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("common.bookDemo")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/for-agencies",children:e("forAgenciesTalent.backToHub")})})]})]})})]}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-3xl mx-auto text-center p-8 md:p-12 rounded-3xl glass-card",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-4",children:e("forAgenciesTalent.revenueTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed",children:e("forAgenciesTalent.revenueDesc")})]})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgenciesTalent.featuresTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-3xl mx-auto",children:e("forAgenciesTalent.featuresSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto",children:a.map((r,o)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(r.icon,{className:"h-5 w-5 text-primary"})}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:r.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:r.desc})]})},o))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-16",children:i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgenciesTalent.howTitle")})}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-8 max-w-6xl mx-auto",children:n.map((r,o)=>i.jsxs("div",{className:"text-center group",children:[i.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-2xl gradient-hero text-primary-foreground text-2xl font-display font-bold shadow-elegant mb-6 group-hover:scale-105 transition-transform",children:r.num}),i.jsx("h3",{className:"text-lg font-display font-semibold mb-3",children:r.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:r.desc})]},o))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-6",children:e("forAgenciesTalent.ctaTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("forAgenciesTalent.ctaSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/pre-sales",children:[i.jsx(vo,{className:"mr-2 h-5 w-5"}),e("common.bookDemo")]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/for-agencies/merchant",children:[e("forAgenciesTalent.seeMerchant"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})]})})]}),i.jsx(ze,{})]})};var Ne;(function(e){e.assertEqual=r=>{};function t(r){}e.assertIs=t;function a(r){throw new Error}e.assertNever=a,e.arrayToEnum=r=>{const o={};for(const s of r)o[s]=s;return o},e.getValidEnumValues=r=>{const o=e.objectKeys(r).filter(l=>typeof r[r[l]]!="number"),s={};for(const l of o)s[l]=r[l];return e.objectValues(s)},e.objectValues=r=>e.objectKeys(r).map(function(o){return r[o]}),e.objectKeys=typeof Object.keys=="function"?r=>Object.keys(r):r=>{const o=[];for(const s in r)Object.prototype.hasOwnProperty.call(r,s)&&o.push(s);return o},e.find=(r,o)=>{for(const s of r)if(o(s))return s},e.isInteger=typeof Number.isInteger=="function"?r=>Number.isInteger(r):r=>typeof r=="number"&&Number.isFinite(r)&&Math.floor(r)===r;function n(r,o=" | "){return r.map(s=>typeof s=="string"?`'${s}'`:s).join(o)}e.joinValues=n,e.jsonStringifyReplacer=(r,o)=>typeof o=="bigint"?o.toString():o})(Ne||(Ne={}));var Bw;(function(e){e.mergeShapes=(t,a)=>({...t,...a})})(Bw||(Bw={}));const te=Ne.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Jn=e=>{switch(typeof e){case"undefined":return te.undefined;case"string":return te.string;case"number":return Number.isNaN(e)?te.nan:te.number;case"boolean":return te.boolean;case"function":return te.function;case"bigint":return te.bigint;case"symbol":return te.symbol;case"object":return Array.isArray(e)?te.array:e===null?te.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?te.promise:typeof Map<"u"&&e instanceof Map?te.map:typeof Set<"u"&&e instanceof Set?te.set:typeof Date<"u"&&e instanceof Date?te.date:te.object;default:return te.unknown}}
vendor: 6,015 bytes, line 4863
4863,G=Ne.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class En extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=n=>{this.issues=[...this.issues,n]},this.addIssues=(n=[])=>{this.issues=[...this.issues,...n]};const a=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,a):this.__proto__=a,this.name="ZodError",this.issues=t}format(t){const a=t||function(o){return o.message},n={_errors:[]},r=o=>{for(const s of o.issues)if(s.code==="invalid_union")s.unionErrors.map(r);else if(s.code==="invalid_return_type")r(s.returnTypeError);else if(s.code==="invalid_arguments")r(s.argumentsError);else if(s.path.length===0)n._errors.push(a(s));else{let l=n,c=0;for(;c<s.path.length;){const d=s.path[c];c===s.path.length-1?(l[d]=l[d]||{_errors:[]},l[d]._errors.push(a(s))):l[d]=l[d]||{_errors:[]},l=l[d],c++}}};return r(this),n}static assert(t){if(!(t instanceof En))throw new Error(`Not a ZodError: ${t}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,Ne.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(t=a=>a.message){const a={},n=[];for(const r of this.issues)if(r.path.length>0){const o=r.path[0];a[o]=a[o]||[],a[o].push(t(r))}else n.push(t(r));return{formErrors:n,fieldErrors:a}}get formErrors(){return this.flatten()}}En.create=e=>new En(e);const pf=(e,t)=>{let a;switch(e.code){case G.invalid_type:e.received===te.undefined?a="Required":a=`Expected ${e.expected}, received ${e.received}`;break;case G.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(e.expected,Ne.jsonStringifyReplacer)}`;break;case G.unrecognized_keys:a=`Unrecognized key(s) in object: ${Ne.joinValues(e.keys,", ")}`;break;case G.invalid_union:a="Invalid input";break;case G.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${Ne.joinValues(e.options)}`;break;case G.invalid_enum_value:a=`Invalid enum value. Expected ${Ne.joinValues(e.options)}, received '${e.received}'`;break;case G.invalid_arguments:a="Invalid function arguments";break;case G.invalid_return_type:a="Invalid function return type";break;case G.invalid_date:a="Invalid date";break;case G.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(a=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(a=`${a} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?a=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?a=`Invalid input: must end with "${e.validation.endsWith}"`:Ne.assertNever(e.validation):e.validation!=="regex"?a=`Invalid ${e.validation}`:a="Invalid";break;case G.too_small:e.type==="array"?a=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?a=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?a=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?a=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?a=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:a="Invalid input";break;case G.too_big:e.type==="array"?a=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?a=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?a=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?a=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?a=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:a="Invalid input";break;case G.custom:a="Invalid input";break;case G.invalid_intersection_types:a="Intersection results could not be merged";break;case G.not_multiple_of:a=`Number must be a multiple of ${e.multipleOf}`;break;case G.not_finite:a="Number must be finite";break;default:a=t.defaultError,Ne.assertNever(e)}return{message:a}};let OO=pf;function GO(){return OO}const FO=e=>{const{data:t,path:a,errorMaps:n,issueData:r}=e,o=[...a,...r.path||[]],s={...r,path:o};if(r.message!==void 0)return{...r,path:o,message:r.message};let l="";const c=n.filter(d=>!!d).slice().reverse();for(const d of c)l=d(s,{data:t,defaultError:l}).message;return{...r,path:o,message:l}};function Y(e,t){const a=GO(),n=FO({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,a,a===pf?void 0:pf].filter(r=>!!r)});e.common.issues.push(n)}class ra{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,a){const n=[];for(const r of a){if(r.status==="aborted")return he;r.status==="dirty"&&t.dirty(),n.push(r.value)}return{status:t.value,value:n}}static async mergeObjectAsync(t,a){const n=[];for(const r of a){const o=await r.key,s=await r.value;n.push({key:o,value:s})}return ra.mergeObjectSync(t,n)}static mergeObjectSync(t,a){const n={};for(const r of a){const{key:o,value:s}=r;if(o.status==="aborted"||s.status==="aborted")return he;o.status==="dirty"&&t.dirty(),s.status==="dirty"&&t.dirty(),o.value!=="__proto__"&&(typeof s.value<"u"||r.alwaysSet)&&(n[o.value]=s.value)}return{status:t.value,value:n}}}const he=Object.freeze({status:"aborted"}),Ds=e=>({status:"dirty",value:e}),Ca=e=>
vendor: 5,526 bytes, line 4863
4863({status:"valid",value:e}),Vw=e=>e.status==="aborted",Ww=e=>e.status==="dirty",Vi=e=>e.status==="valid",au=e=>typeof Promise<"u"&&e instanceof Promise;var ae;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(ae||(ae={}));class Tr{constructor(t,a,n,r){this._cachedPath=[],this.parent=t,this.data=a,this._path=n,this._key=r}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const $w=(e,t)=>{if(Vi(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const a=new En(e.common.issues);return this._error=a,this._error}}};function ve(e){if(!e)return{};const{errorMap:t,invalid_type_error:a,required_error:n,description:r}=e;if(t&&(a||n))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:r}:{errorMap:(s,l)=>{const{message:c}=e;return s.code==="invalid_enum_value"?{message:c??l.defaultError}:typeof l.data>"u"?{message:c??n??l.defaultError}:s.code!=="invalid_type"?{message:l.defaultError}:{message:c??a??l.defaultError}},description:r}}class Ae{get description(){return this._def.description}_getType(t){return Jn(t.data)}_getOrReturnCtx(t,a){return a||{common:t.parent.common,data:t.data,parsedType:Jn(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new ra,ctx:{common:t.parent.common,data:t.data,parsedType:Jn(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const a=this._parse(t);if(au(a))throw new Error("Synchronous parse encountered promise.");return a}_parseAsync(t){const a=this._parse(t);return Promise.resolve(a)}parse(t,a){const n=this.safeParse(t,a);if(n.success)return n.data;throw n.error}safeParse(t,a){const n={common:{issues:[],async:(a==null?void 0:a.async)??!1,contextualErrorMap:a==null?void 0:a.errorMap},path:(a==null?void 0:a.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Jn(t)},r=this._parseSync({data:t,path:n.path,parent:n});return $w(n,r)}"~validate"(t){var n,r;const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Jn(t)};if(!this["~standard"].async)try{const o=this._parseSync({data:t,path:[],parent:a});return Vi(o)?{value:o.value}:{issues:a.common.issues}}catch(o){(r=(n=o==null?void 0:o.message)==null?void 0:n.toLowerCase())!=null&&r.includes("encountered")&&(this["~standard"].async=!0),a.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:a}).then(o=>Vi(o)?{value:o.value}:{issues:a.common.issues})}async parseAsync(t,a){const n=await this.safeParseAsync(t,a);if(n.success)return n.data;throw n.error}async safeParseAsync(t,a){const n={common:{issues:[],contextualErrorMap:a==null?void 0:a.errorMap,async:!0},path:(a==null?void 0:a.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Jn(t)},r=this._parse({data:t,path:n.path,parent:n}),o=await(au(r)?r:Promise.resolve(r));return $w(n,o)}refine(t,a){const n=r=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(r):a;return this._refinement((r,o)=>{const s=t(r),l=()=>o.addIssue({code:G.custom,...n(r)});return typeof Promise<"u"&&s instanceof Promise?s.then(c=>c?!0:(l(),!1)):s?!0:(l(),!1)})}refinement(t,a){return this._refinement((n,r)=>t(n)?!0:(r.addIssue(typeof a=="function"?a(n,r):a),!1))}_refinement(t){return new $i({schema:this,typeName:pe.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:a=>this["~validate"](a)}}optional(){return br.create(this,this._def)}nullable(){return Ki.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return un.create(this)}promise(){return iu.create(this,this._def)}or(t){return ru.create([this,t],this._def)}and(t){return ou.create(this,t,this._def)}transform(t){return new $i({...ve(this._def),schema:this,typeName:pe.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const a=typeof t=="function"?t:()=>t;return new gf({...ve(this._def),innerType:this,defaultValue:a,typeName:pe.ZodDefault})}brand(){return new uG({typeName:pe.ZodBranded,type:this,...ve(this._def)})}catch(t){const a=typeof t=="function"?t:()=>t;
vendor: 4,959 bytes, line 4863
4863return new yf({...ve(this._def),innerType:this,catchValue:a,typeName:pe.ZodCatch})}describe(t){const a=this.constructor;return new a({...this._def,description:t})}pipe(t){return Ey.create(this,t)}readonly(){return vf.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const HO=/^c[^\s-]{8,}$/i,BO=/^[0-9a-z]+$/,VO=/^[0-9A-HJKMNP-TV-Z]{26}$/i,WO=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,$O=/^[a-z0-9_-]{21}$/i,KO=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,YO=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,JO=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,QO="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let xp;const ZO=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,XO=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,eG=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,tG=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,aG=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,nG=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,YP="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",rG=new RegExp(`^${YP}$`);function JP(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);const a=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${a}`}function oG(e){return new RegExp(`^${JP(e)}$`)}function iG(e){let t=`${YP}T${JP(e)}`;const a=[];return a.push(e.local?"Z?":"Z"),e.offset&&a.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${a.join("|")})`,new RegExp(`^${t}$`)}function sG(e,t){return!!((t==="v4"||!t)&&ZO.test(e)||(t==="v6"||!t)&&eG.test(e))}function lG(e,t){if(!KO.test(e))return!1;try{const[a]=e.split(".");if(!a)return!1;const n=a.replace(/-/g,"+").replace(/_/g,"/").padEnd(a.length+(4-a.length%4)%4,"="),r=JSON.parse(atob(n));return!(typeof r!="object"||r===null||"typ"in r&&(r==null?void 0:r.typ)!=="JWT"||!r.alg||t&&r.alg!==t)}catch{return!1}}function cG(e,t){return!!((t==="v4"||!t)&&XO.test(e)||(t==="v6"||!t)&&tG.test(e))}class lr extends Ae{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==te.string){const o=this._getOrReturnCtx(t);return Y(o,{code:G.invalid_type,expected:te.string,received:o.parsedType}),he}const n=new ra;let r;for(const o of this._def.checks)if(o.kind==="min")t.data.length<o.value&&(r=this._getOrReturnCtx(t,r),Y(r,{code:G.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),n.dirty());else if(o.kind==="max")t.data.length>o.value&&(r=this._getOrReturnCtx(t,r),Y(r,{code:G.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),n.dirty());else if(o.kind==="length"){const s=t.data.length>o.value,l=t.data.length<o.value;(s||l)&&(r=this._getOrReturnCtx(t,r),s?Y(r,{code:G.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}):l&&Y(r,{code:G.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}),n.dirty())}else if(o.kind==="email")JO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"email",code:G.invali
vendor: 5,987 bytes, line 4863
4863d_string,message:o.message}),n.dirty());else if(o.kind==="emoji")xp||(xp=new RegExp(QO,"u")),xp.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"emoji",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="uuid")WO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"uuid",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="nanoid")$O.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"nanoid",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="cuid")HO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"cuid",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="cuid2")BO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"cuid2",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="ulid")VO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"ulid",code:G.invalid_string,message:o.message}),n.dirty());else if(o.kind==="url")try{new URL(t.data)}catch{r=this._getOrReturnCtx(t,r),Y(r,{validation:"url",code:G.invalid_string,message:o.message}),n.dirty()}else o.kind==="regex"?(o.regex.lastIndex=0,o.regex.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"regex",code:G.invalid_string,message:o.message}),n.dirty())):o.kind==="trim"?t.data=t.data.trim():o.kind==="includes"?t.data.includes(o.value,o.position)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:{includes:o.value,position:o.position},message:o.message}),n.dirty()):o.kind==="toLowerCase"?t.data=t.data.toLowerCase():o.kind==="toUpperCase"?t.data=t.data.toUpperCase():o.kind==="startsWith"?t.data.startsWith(o.value)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:{startsWith:o.value},message:o.message}),n.dirty()):o.kind==="endsWith"?t.data.endsWith(o.value)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:{endsWith:o.value},message:o.message}),n.dirty()):o.kind==="datetime"?iG(o).test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:"datetime",message:o.message}),n.dirty()):o.kind==="date"?rG.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:"date",message:o.message}),n.dirty()):o.kind==="time"?oG(o).test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{code:G.invalid_string,validation:"time",message:o.message}),n.dirty()):o.kind==="duration"?YO.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"duration",code:G.invalid_string,message:o.message}),n.dirty()):o.kind==="ip"?sG(t.data,o.version)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"ip",code:G.invalid_string,message:o.message}),n.dirty()):o.kind==="jwt"?lG(t.data,o.alg)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"jwt",code:G.invalid_string,message:o.message}),n.dirty()):o.kind==="cidr"?cG(t.data,o.version)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"cidr",code:G.invalid_string,message:o.message}),n.dirty()):o.kind==="base64"?aG.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"base64",code:G.invalid_string,message:o.message}),n.dirty()):o.kind==="base64url"?nG.test(t.data)||(r=this._getOrReturnCtx(t,r),Y(r,{validation:"base64url",code:G.invalid_string,message:o.message}),n.dirty()):Ne.assertNever(o);return{status:n.value,value:t.data}}_regex(t,a,n){return this.refinement(r=>t.test(r),{validation:a,code:G.invalid_string,...ae.errToObj(n)})}_addCheck(t){return new lr({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...ae.errToObj(t)})}url(t){return this._addCheck({kind:"url",...ae.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...ae.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...ae.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...ae.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...ae.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...ae.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...ae.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...ae.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...ae.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...ae.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...ae.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...ae.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,offset:(t==null?void 0:t.offset)??!1,local:(t==null?void 0:t.local)??!1,...ae.errToObj(t==null?void 0:t.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof(t==null?void 0:t.precision)>"u"?null:t==null?void 0:t.precision,...ae.errToObj(t==null?void 0:t.message)})}duration(t){return this._addCheck({kind:"duration",...ae.errToObj(t)})}regex(t,a){return this._addCheck({kind:"regex",regex:t,...ae.errToObj(a)})}includes(t,a){return this._addCheck({kind:"includes",value:t,position:a==null?void 0:a.position,...ae.errToObj(a==null?void 0:a.message)})}startsWith(t,a){return this._addCheck({kind:"startsWith",value:t,...ae.errToObj(a)})}endsWith(t,a){return this._addCheck({kind:"endsWith",value:t,...ae.errToObj(a)})}min(t,a){return this._addCheck({kind:"min",value:t,...ae.errToObj(a)})}max(t,a){return this._addCheck({kind:"max",value:t,...ae.errToObj(a)})}length(t,a){return this._addCheck({kind:"length",value:t,...ae.errToObj(a)})}nonempty(t){return this.min(1,ae.errToObj(t))}trim(){return new lr({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new lr({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new lr({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}
vendor: 4,658 bytes, line 4863
4863get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxLength(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}}lr.create=e=>new lr({checks:[],typeName:pe.ZodString,coerce:(e==null?void 0:e.coerce)??!1,...ve(e)});function dG(e,t){const a=(e.toString().split(".")[1]||"").length,n=(t.toString().split(".")[1]||"").length,r=a>n?a:n,o=Number.parseInt(e.toFixed(r).replace(".","")),s=Number.parseInt(t.toFixed(r).replace(".",""));return o%s/10**r}class ql extends Ae{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==te.number){const o=this._getOrReturnCtx(t);return Y(o,{code:G.invalid_type,expected:te.number,received:o.parsedType}),he}let n;const r=new ra;for(const o of this._def.checks)o.kind==="int"?Ne.isInteger(t.data)||(n=this._getOrReturnCtx(t,n),Y(n,{code:G.invalid_type,expected:"integer",received:"float",message:o.message}),r.dirty()):o.kind==="min"?(o.inclusive?t.data<o.value:t.data<=o.value)&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.too_small,minimum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),r.dirty()):o.kind==="max"?(o.inclusive?t.data>o.value:t.data>=o.value)&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),r.dirty()):o.kind==="multipleOf"?dG(t.data,o.value)!==0&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.not_multiple_of,multipleOf:o.value,message:o.message}),r.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(n=this._getOrReturnCtx(t,n),Y(n,{code:G.not_finite,message:o.message}),r.dirty()):Ne.assertNever(o);return{status:r.value,value:t.data}}gte(t,a){return this.setLimit("min",t,!0,ae.toString(a))}gt(t,a){return this.setLimit("min",t,!1,ae.toString(a))}lte(t,a){return this.setLimit("max",t,!0,ae.toString(a))}lt(t,a){return this.setLimit("max",t,!1,ae.toString(a))}setLimit(t,a,n,r){return new ql({...this._def,checks:[...this._def.checks,{kind:t,value:a,inclusive:n,message:ae.toString(r)}]})}_addCheck(t){return new ql({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:ae.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:ae.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:ae.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:ae.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:ae.toString(t)})}multipleOf(t,a){return this._addCheck({kind:"multipleOf",value:t,message:ae.toString(a)})}finite(t){return this._addCheck({kind:"finite",message:ae.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:ae.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:ae.toString(t)})}get minValue(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxValue(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}get isInt(){return!!this._def.checks.find(t=>t.kind==="int"||t.kind==="multipleOf"&&Ne.isInteger(t.value))}get isFinite(){let t=null,a=null;for(const n of this._def.checks){if(n.kind==="finite"||n.kind==="int"||n.kind==="multipleOf")return!0;n.kind==="min"?(a===null||n.value>a)&&(a=n.value):n.kind==="max"&&(t===null||n.value<t)&&(t=n.value)}return Number.isFinite(a)&&Number.isFinite(t)}
vendor: 4,226 bytes, line 4863
4863}ql.create=e=>new ql({checks:[],typeName:pe.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...ve(e)});class Ul extends Ae{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==te.bigint)return this._getInvalidInput(t);let n;const r=new ra;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.data<o.value:t.data<=o.value)&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.too_small,type:"bigint",minimum:o.value,inclusive:o.inclusive,message:o.message}),r.dirty()):o.kind==="max"?(o.inclusive?t.data>o.value:t.data>=o.value)&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),r.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(n=this._getOrReturnCtx(t,n),Y(n,{code:G.not_multiple_of,multipleOf:o.value,message:o.message}),r.dirty()):Ne.assertNever(o);return{status:r.value,value:t.data}}_getInvalidInput(t){const a=this._getOrReturnCtx(t);return Y(a,{code:G.invalid_type,expected:te.bigint,received:a.parsedType}),he}gte(t,a){return this.setLimit("min",t,!0,ae.toString(a))}gt(t,a){return this.setLimit("min",t,!1,ae.toString(a))}lte(t,a){return this.setLimit("max",t,!0,ae.toString(a))}lt(t,a){return this.setLimit("max",t,!1,ae.toString(a))}setLimit(t,a,n,r){return new Ul({...this._def,checks:[...this._def.checks,{kind:t,value:a,inclusive:n,message:ae.toString(r)}]})}_addCheck(t){return new Ul({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:ae.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:ae.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:ae.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:ae.toString(t)})}multipleOf(t,a){return this._addCheck({kind:"multipleOf",value:t,message:ae.toString(a)})}get minValue(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxValue(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}}Ul.create=e=>new Ul({checks:[],typeName:pe.ZodBigInt,coerce:(e==null?void 0:e.coerce)??!1,...ve(e)});class Kw extends Ae{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==te.boolean){const n=this._getOrReturnCtx(t);return Y(n,{code:G.invalid_type,expected:te.boolean,received:n.parsedType}),he}return Ca(t.data)}}Kw.create=e=>new Kw({typeName:pe.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...ve(e)});class nu extends Ae{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==te.date){const o=this._getOrReturnCtx(t);return Y(o,{code:G.invalid_type,expected:te.date,received:o.parsedType}),he}if(Number.isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return Y(o,{code:G.invalid_date}),he}const n=new ra;let r;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()<o.value&&(r=this._getOrReturnCtx(t,r),Y(r,{code:G.too_small,message:o.message,inclusive:!0,exact:!1,minimum:o.value,type:"date"}),n.dirty()):o.kind==="max"?t.data.getTime()>o.value&&(r=this._getOrReturnCtx(t,r),Y(r,{code:G.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),n.dirty()):Ne.assertNever(o);return{status:n.value,value:new Date(t.data.getTime())}}_addCheck(t){return new nu({...this._def,checks:[...this._def.checks,t]})}min(t,a){return this._addCheck({kind:"min",value:t.getTime(),message:ae.toString(a)})}max(t,a){return this._addCheck({kind:"max",value:t.getTime(),message:ae.toString(a)})}get minDate(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t!=null?new Date(t):null}}nu.create=e=>new nu({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:pe.ZodDate,...ve(e)});class Yw extends Ae{_parse(t){if(this._getType(t)!==te.symbol){const n=this._getOrReturnCtx(t);
vendor: 8,532 bytes, line 4863
4863return Y(n,{code:G.invalid_type,expected:te.symbol,received:n.parsedType}),he}return Ca(t.data)}}Yw.create=e=>new Yw({typeName:pe.ZodSymbol,...ve(e)});class Jw extends Ae{_parse(t){if(this._getType(t)!==te.undefined){const n=this._getOrReturnCtx(t);return Y(n,{code:G.invalid_type,expected:te.undefined,received:n.parsedType}),he}return Ca(t.data)}}Jw.create=e=>new Jw({typeName:pe.ZodUndefined,...ve(e)});class Qw extends Ae{_parse(t){if(this._getType(t)!==te.null){const n=this._getOrReturnCtx(t);return Y(n,{code:G.invalid_type,expected:te.null,received:n.parsedType}),he}return Ca(t.data)}}Qw.create=e=>new Qw({typeName:pe.ZodNull,...ve(e)});class Zw extends Ae{constructor(){super(...arguments),this._any=!0}_parse(t){return Ca(t.data)}}Zw.create=e=>new Zw({typeName:pe.ZodAny,...ve(e)});class Xw extends Ae{constructor(){super(...arguments),this._unknown=!0}_parse(t){return Ca(t.data)}}Xw.create=e=>new Xw({typeName:pe.ZodUnknown,...ve(e)});class Ir extends Ae{_parse(t){const a=this._getOrReturnCtx(t);return Y(a,{code:G.invalid_type,expected:te.never,received:a.parsedType}),he}}Ir.create=e=>new Ir({typeName:pe.ZodNever,...ve(e)});class ex extends Ae{_parse(t){if(this._getType(t)!==te.undefined){const n=this._getOrReturnCtx(t);return Y(n,{code:G.invalid_type,expected:te.void,received:n.parsedType}),he}return Ca(t.data)}}ex.create=e=>new ex({typeName:pe.ZodVoid,...ve(e)});class un extends Ae{_parse(t){const{ctx:a,status:n}=this._processInputParams(t),r=this._def;if(a.parsedType!==te.array)return Y(a,{code:G.invalid_type,expected:te.array,received:a.parsedType}),he;if(r.exactLength!==null){const s=a.data.length>r.exactLength.value,l=a.data.length<r.exactLength.value;(s||l)&&(Y(a,{code:s?G.too_big:G.too_small,minimum:l?r.exactLength.value:void 0,maximum:s?r.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:r.exactLength.message}),n.dirty())}if(r.minLength!==null&&a.data.length<r.minLength.value&&(Y(a,{code:G.too_small,minimum:r.minLength.value,type:"array",inclusive:!0,exact:!1,message:r.minLength.message}),n.dirty()),r.maxLength!==null&&a.data.length>r.maxLength.value&&(Y(a,{code:G.too_big,maximum:r.maxLength.value,type:"array",inclusive:!0,exact:!1,message:r.maxLength.message}),n.dirty()),a.common.async)return Promise.all([...a.data].map((s,l)=>r.type._parseAsync(new Tr(a,s,a.path,l)))).then(s=>ra.mergeArray(n,s));const o=[...a.data].map((s,l)=>r.type._parseSync(new Tr(a,s,a.path,l)));return ra.mergeArray(n,o)}get element(){return this._def.type}min(t,a){return new un({...this._def,minLength:{value:t,message:ae.toString(a)}})}max(t,a){return new un({...this._def,maxLength:{value:t,message:ae.toString(a)}})}length(t,a){return new un({...this._def,exactLength:{value:t,message:ae.toString(a)}})}nonempty(t){return this.min(1,t)}}un.create=(e,t)=>new un({type:e,minLength:null,maxLength:null,exactLength:null,typeName:pe.ZodArray,...ve(t)});function ei(e){if(e instanceof Je){const t={};for(const a in e.shape){const n=e.shape[a];t[a]=br.create(ei(n))}return new Je({...e._def,shape:()=>t})}else return e instanceof un?new un({...e._def,type:ei(e.element)}):e instanceof br?br.create(ei(e.unwrap())):e instanceof Ki?Ki.create(ei(e.unwrap())):e instanceof Ao?Ao.create(e.items.map(t=>ei(t))):e}class Je extends Ae{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),a=Ne.objectKeys(t);return this._cached={shape:t,keys:a},this._cached}_parse(t){if(this._getType(t)!==te.object){const d=this._getOrReturnCtx(t);return Y(d,{code:G.invalid_type,expected:te.object,received:d.parsedType}),he}const{status:n,ctx:r}=this._processInputParams(t),{shape:o,keys:s}=this._getCached(),l=[];if(!(this._def.catchall instanceof Ir&&this._def.unknownKeys==="strip"))for(const d in r.data)s.includes(d)||l.push(d);const c=[];for(const d of s){const u=o[d],h=r.data[d];c.push({key:{status:"valid",value:d},value:u._parse(new Tr(r,h,r.path,d)),alwaysSet:d in r.data})}if(this._def.catchall instanceof Ir){const d=this._def.unknownKeys;if(d==="passthrough")for(const u of l)c.push({key:{status:"valid",value:u},value:{status:"valid",value:r.data[u]}});else if(d==="strict")l.length>0&&(Y(r,{code:G.unrecognized_keys,keys:l}),n.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const d=this._def.catchall;for(const u of l){const h=r.data[u];c.push({key:{status:"valid",value:u},value:d._parse(new Tr(r,h,r.path,u)),alwaysSet:u in r.data})}}return r.common.async?Promise.resolve().then(async()=>{const d=[];for(const u of c){const h=await u.key,m=await u.value;d.push({key:h,value:m,alwaysSet:u.alwaysSet})}return d}).then(d=>ra.mergeObjectSync(n,d)):ra.mergeObjectSync(n,c)}get shape(){return this._def.shape()}strict(t){return ae.errToObj,new Je({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(a,n)=>{var o,s;const r=((s=(o=this._def).errorMap)==null?void 0:s.call(o,a,n).message)??n.defaultError;return a.code==="unrecognized_keys"?{message:ae.errToObj(t).message??r}:{message:r}}}:{}})}strip(){return new Je({...this._def,unknownKeys:"strip"})}passthrough(){return new Je({...this._def,unknownKeys:"passthrough"})}extend(t){return new Je({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new Je({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:pe.ZodObject})}setKey(t,a){return this.augment({[t]:a})}catchall(t){return new Je({...this._def,catchall:t})}pick(t){const a={};for(const n of Ne.objectKeys(t))t[n]&&this.shape[n]&&(a[n]=this.shape[n]);return new Je({...this._def,shape:()=>a})}omit(t){const a={};for(const n of Ne.objectKeys(this.shape))t[n]||(a[n]=this.shape[n]);return new Je({...this._def,shape:()=>a})}deepPartial(){return ei(this)}partial(t){const a={};for(const n of Ne.objectKeys(this.shape)){const r=this.shape[n];t&&!t[n]?a[n]=r:a[n]=r.optional()}return new Je({...this._def,shape:()=>a})}required(t){const a={};for(const n of Ne.objectKeys(this.shape))if(t&&!t[n])a[n]=this.shape[n];else{let o=this.shape[n];for(;o instanceof br;)o=o._def.innerType;a[n]=o}return new Je({...this._def,shape:()=>a})}keyof(){return QP(Ne.objectKeys(this.shape))}}Je.create=(e,t)=>new Je({shape:()=>e,unknownKeys:"strip",catchall:Ir.create(),typeName:pe.ZodObject,...ve(t)});Je.strictCreate=(e,t)=>new Je({shape:()=>e,unknownKeys:"strict",catchall:Ir.create(),typeName:pe.ZodObject,...ve(t)});Je.lazycreate=(e,t)=>new Je({shape:e,unknownKeys:"strip",catchall:Ir.create(),typeName:pe.ZodObject,...ve(t)});class ru extends Ae{_parse(t){const{ctx:a}=this._processInputParams(t),n=this._def.options;function r(o){for(const l of o)if(l.result.status==="valid")return l.result;for(const l of o)if(l.result.status==="dirty")return a.common.issues.push(...l.ctx.common.issues),l.result;const s=o.map(l=>new En(l.ctx.common.issues));return Y(a,{code:G.invalid_union,unionErrors:s}),he}if(a.common.async)return Promise.all(n.map(async o=>{const s={...a,common:{...a.common,issues:[]},parent:null};return{result:await o._parseAsync({data:a.data,path:a.path,parent:s}),ctx:s}})).then(r);{let o;const s=[];for(const c of n){const d={...a,common:{...a.common,issues:[]},parent:null},u=c._parseSync({data:a.data,path:a.path,parent:d});if(u.status==="valid")return u;u.status==="dirty"&&!o&&(o={result:u,ctx:d}),d.common.issues.length&&s.push(d.common.issues)}if(o)return a.common.issues.push(...o.ctx.common.issues),o.result;const l=s.map(c=>new En(c));return Y(a,{code:G.invalid_union,unionErrors:l}),he}}get options(){return this._def.options}}ru.create=(e,t)=>new ru({options:e,typeName:pe.ZodUnion,...ve(t)});function mf(e,t){const a=Jn(e),n=Jn(t);if(e===t)return{valid:!0,data:e};if(a===te.object&&n===te.object){const r=Ne.objectKeys(t),o=Ne.objectKeys(e).filter(l=>r.indexOf(l)!==-1),s={...e,...t};for(const l of o){const c=mf(e[l],t[l]);if(!c.valid)return{valid:!1};s[l]=c.data}return{valid:!0,data:s}}else if(a===te.array&&n===te.array){if(e.length!==t.length)return{valid:!1};const r=[];for(let o=0;o<e.length;o++){const s=e[o],l=t[o],c=mf(s,l);if(!c.valid)return{valid:!1};r.push(c.data)}return{valid:!0,data:r}}else return a===te.date&&n===te.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}class ou extends Ae{_parse(t){const{status:a,ctx:n}=this._processInputParams(t),r=(o,s)=>{if(Vw(o)||Vw(s))return he;const l=mf(o.value,s.value);return l.valid?((Ww(o)||Ww(s))&&a.dirty(),{status:a.value,value:l.data}
vendor: 4,126 bytes, line 4863
4863):(Y(n,{code:G.invalid_intersection_types}),he)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then(([o,s])=>r(o,s)):r(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}}ou.create=(e,t,a)=>new ou({left:e,right:t,typeName:pe.ZodIntersection,...ve(a)});class Ao extends Ae{_parse(t){const{status:a,ctx:n}=this._processInputParams(t);if(n.parsedType!==te.array)return Y(n,{code:G.invalid_type,expected:te.array,received:n.parsedType}),he;if(n.data.length<this._def.items.length)return Y(n,{code:G.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),he;!this._def.rest&&n.data.length>this._def.items.length&&(Y(n,{code:G.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const o=[...n.data].map((s,l)=>{const c=this._def.items[l]||this._def.rest;return c?c._parse(new Tr(n,s,n.path,l)):null}).filter(s=>!!s);return n.common.async?Promise.all(o).then(s=>ra.mergeArray(a,s)):ra.mergeArray(a,o)}get items(){return this._def.items}rest(t){return new Ao({...this._def,rest:t})}}Ao.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Ao({items:e,typeName:pe.ZodTuple,rest:null,...ve(t)})};class tx extends Ae{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:a,ctx:n}=this._processInputParams(t);if(n.parsedType!==te.map)return Y(n,{code:G.invalid_type,expected:te.map,received:n.parsedType}),he;const r=this._def.keyType,o=this._def.valueType,s=[...n.data.entries()].map(([l,c],d)=>({key:r._parse(new Tr(n,l,n.path,[d,"key"])),value:o._parse(new Tr(n,c,n.path,[d,"value"]))}));if(n.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const c of s){const d=await c.key,u=await c.value;if(d.status==="aborted"||u.status==="aborted")return he;(d.status==="dirty"||u.status==="dirty")&&a.dirty(),l.set(d.value,u.value)}return{status:a.value,value:l}})}else{const l=new Map;for(const c of s){const d=c.key,u=c.value;if(d.status==="aborted"||u.status==="aborted")return he;(d.status==="dirty"||u.status==="dirty")&&a.dirty(),l.set(d.value,u.value)}return{status:a.value,value:l}}}}tx.create=(e,t,a)=>new tx({valueType:t,keyType:e,typeName:pe.ZodMap,...ve(a)});class Ml extends Ae{_parse(t){const{status:a,ctx:n}=this._processInputParams(t);if(n.parsedType!==te.set)return Y(n,{code:G.invalid_type,expected:te.set,received:n.parsedType}),he;const r=this._def;r.minSize!==null&&n.data.size<r.minSize.value&&(Y(n,{code:G.too_small,minimum:r.minSize.value,type:"set",inclusive:!0,exact:!1,message:r.minSize.message}),a.dirty()),r.maxSize!==null&&n.data.size>r.maxSize.value&&(Y(n,{code:G.too_big,maximum:r.maxSize.value,type:"set",inclusive:!0,exact:!1,message:r.maxSize.message}),a.dirty());const o=this._def.valueType;function s(c){const d=new Set;for(const u of c){if(u.status==="aborted")return he;u.status==="dirty"&&a.dirty(),d.add(u.value)}return{status:a.value,value:d}}const l=[...n.data.values()].map((c,d)=>o._parse(new Tr(n,c,n.path,d)));return n.common.async?Promise.all(l).then(c=>s(c)):s(l)}min(t,a){return new Ml({...this._def,minSize:{value:t,message:ae.toString(a)}})}max(t,a){return new Ml({...this._def,maxSize:{value:t,message:ae.toString(a)}})}size(t,a){return this.min(t,a).max(t,a)}nonempty(t){return this.min(1,t)}}Ml.create=(e,t)=>new Ml({valueType:e,minSize:null,maxSize:null,typeName:pe.ZodSet,...ve(t)});class ax extends Ae{get schema(){return this._def.getter()}_parse(t){const{ctx:a}=this._processInputParams(t);return this._def.getter()._parse({data:a.data,path:a.path,parent:a})}}ax.create=(e,t)=>new ax({getter:e,typeName:pe.ZodLazy,...ve(t)});class ff extends Ae{_parse(t){if(t.data!==this._def.value){const a=this._getOrReturnCtx(t);return Y(a,{received:a.data,code:G.invalid_literal,expected:this._def.value}),he}return{status:"valid",value:t.data}}get value(){return this._def.value}}ff.create=(e,t)=>
vendor: 4,079 bytes, line 4863
4863new ff({value:e,typeName:pe.ZodLiteral,...ve(t)});function QP(e,t){return new Wi({values:e,typeName:pe.ZodEnum,...ve(t)})}class Wi extends Ae{_parse(t){if(typeof t.data!="string"){const a=this._getOrReturnCtx(t),n=this._def.values;return Y(a,{expected:Ne.joinValues(n),received:a.parsedType,code:G.invalid_type}),he}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){const a=this._getOrReturnCtx(t),n=this._def.values;return Y(a,{received:a.data,code:G.invalid_enum_value,options:n}),he}return Ca(t.data)}get options(){return this._def.values}get enum(){const t={};for(const a of this._def.values)t[a]=a;return t}get Values(){const t={};for(const a of this._def.values)t[a]=a;return t}get Enum(){const t={};for(const a of this._def.values)t[a]=a;return t}extract(t,a=this._def){return Wi.create(t,{...this._def,...a})}exclude(t,a=this._def){return Wi.create(this.options.filter(n=>!t.includes(n)),{...this._def,...a})}}Wi.create=QP;class nx extends Ae{_parse(t){const a=Ne.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(t);if(n.parsedType!==te.string&&n.parsedType!==te.number){const r=Ne.objectValues(a);return Y(n,{expected:Ne.joinValues(r),received:n.parsedType,code:G.invalid_type}),he}if(this._cache||(this._cache=new Set(Ne.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){const r=Ne.objectValues(a);return Y(n,{received:n.data,code:G.invalid_enum_value,options:r}),he}return Ca(t.data)}get enum(){return this._def.values}}nx.create=(e,t)=>new nx({values:e,typeName:pe.ZodNativeEnum,...ve(t)});class iu extends Ae{unwrap(){return this._def.type}_parse(t){const{ctx:a}=this._processInputParams(t);if(a.parsedType!==te.promise&&a.common.async===!1)return Y(a,{code:G.invalid_type,expected:te.promise,received:a.parsedType}),he;const n=a.parsedType===te.promise?a.data:Promise.resolve(a.data);return Ca(n.then(r=>this._def.type.parseAsync(r,{path:a.path,errorMap:a.common.contextualErrorMap})))}}iu.create=(e,t)=>new iu({type:e,typeName:pe.ZodPromise,...ve(t)});class $i extends Ae{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===pe.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:a,ctx:n}=this._processInputParams(t),r=this._def.effect||null,o={addIssue:s=>{Y(n,s),s.fatal?a.abort():a.dirty()},get path(){return n.path}};if(o.addIssue=o.addIssue.bind(o),r.type==="preprocess"){const s=r.transform(n.data,o);if(n.common.async)return Promise.resolve(s).then(async l=>{if(a.value==="aborted")return he;const c=await this._def.schema._parseAsync({data:l,path:n.path,parent:n});return c.status==="aborted"?he:c.status==="dirty"||a.value==="dirty"?Ds(c.value):c});{if(a.value==="aborted")return he;const l=this._def.schema._parseSync({data:s,path:n.path,parent:n});return l.status==="aborted"?he:l.status==="dirty"||a.value==="dirty"?Ds(l.value):l}}if(r.type==="refinement"){const s=l=>{const c=r.refinement(l,o);if(n.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(n.common.async===!1){const l=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return l.status==="aborted"?he:(l.status==="dirty"&&a.dirty(),s(l.value),{status:a.value,value:l.value})}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(l=>l.status==="aborted"?he:(l.status==="dirty"&&a.dirty(),s(l.value).then(()=>({status:a.value,value:l.value}))))}if(r.type==="transform")if(n.common.async===!1){const s=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!Vi(s))return he;const l=r.transform(s.value,o);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:l}}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(s=>Vi(s)?Promise.resolve(r.transform(s.value,o)).then(l=>({status:a.value,value:l})):he);Ne.assertNever(r)}}$i.create=(e,t,a)=>
vendor: 4,227 bytes, line 4863
4863new $i({schema:e,typeName:pe.ZodEffects,effect:t,...ve(a)});$i.createWithPreprocess=(e,t,a)=>new $i({schema:t,effect:{type:"preprocess",transform:e},typeName:pe.ZodEffects,...ve(a)});class br extends Ae{_parse(t){return this._getType(t)===te.undefined?Ca(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}br.create=(e,t)=>new br({innerType:e,typeName:pe.ZodOptional,...ve(t)});class Ki extends Ae{_parse(t){return this._getType(t)===te.null?Ca(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}Ki.create=(e,t)=>new Ki({innerType:e,typeName:pe.ZodNullable,...ve(t)});class gf extends Ae{_parse(t){const{ctx:a}=this._processInputParams(t);let n=a.data;return a.parsedType===te.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}gf.create=(e,t)=>new gf({innerType:e,typeName:pe.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...ve(t)});class yf extends Ae{_parse(t){const{ctx:a}=this._processInputParams(t),n={...a,common:{...a.common,issues:[]}},r=this._def.innerType._parse({data:n.data,path:n.path,parent:{...n}});return au(r)?r.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new En(n.common.issues)},input:n.data})})):{status:"valid",value:r.status==="valid"?r.value:this._def.catchValue({get error(){return new En(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}}yf.create=(e,t)=>new yf({innerType:e,typeName:pe.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...ve(t)});class rx extends Ae{_parse(t){if(this._getType(t)!==te.nan){const n=this._getOrReturnCtx(t);return Y(n,{code:G.invalid_type,expected:te.nan,received:n.parsedType}),he}return{status:"valid",value:t.data}}}rx.create=e=>new rx({typeName:pe.ZodNaN,...ve(e)});class uG extends Ae{_parse(t){const{ctx:a}=this._processInputParams(t),n=a.data;return this._def.type._parse({data:n,path:a.path,parent:a})}unwrap(){return this._def.type}}class Ey extends Ae{_parse(t){const{status:a,ctx:n}=this._processInputParams(t);if(n.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:n.data,path:n.path,parent:n});return o.status==="aborted"?he:o.status==="dirty"?(a.dirty(),Ds(o.value)):this._def.out._parseAsync({data:o.value,path:n.path,parent:n})})();{const r=this._def.in._parseSync({data:n.data,path:n.path,parent:n});return r.status==="aborted"?he:r.status==="dirty"?(a.dirty(),{status:"dirty",value:r.value}):this._def.out._parseSync({data:r.value,path:n.path,parent:n})}}static create(t,a){return new Ey({in:t,out:a,typeName:pe.ZodPipeline})}}class vf extends Ae{_parse(t){const a=this._def.innerType._parse(t),n=r=>(Vi(r)&&(r.value=Object.freeze(r.value)),r);return au(a)?a.then(r=>n(r)):n(a)}unwrap(){return this._def.innerType}}vf.create=(e,t)=>new vf({innerType:e,typeName:pe.ZodReadonly,...ve(t)});Je.lazycreate;var pe;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(pe||(pe={}));const Bn=lr.create;Ir.create;un.create;const hG=Je.create;Je.strictCreate;ru.create;ou.create;Ao.create;const Oc=ff.create;Wi.create;iu.create;br.create;Ki.create;const bf=f.forwardRef(({className:e,...t},a)=>i.jsx("textarea",{className:J("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm r
4863ing-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:a,...t}));bf.displayName="Textarea";function ox(e,[t,a]){return Math.min(a,Math.max(t,e))}var pG=[" ","Enter","ArrowUp","ArrowDown"],mG=[" ","Enter"],Po="Select",[nh,rh,fG]=Eo(Po),[us,xF]=Wt(Po,[fG,rs]),oh=rs(),[gG,Dr]=us(Po),[yG,vG]=us(Po),ZP=e=>{const{__scopeSelect:t,children:a,open:n,defaultOpen:r,onOpenChange:o,value:s,defaultValue:l,onValueChange:c,dir:d,name:u,autoComplete:h,disabled:m,required:p,form:b}=e,g=oh(t),[v,w]=f.useState(null),[y,x]=f.useState(null),[k,C]=f.useState(!1),S=ds(d),[A,P]=Vt({prop:n,defaultProp:r??!1,onChange:o,caller:Po}),[I,N]=Vt({prop:s,defaultProp:l,onChange:c,caller:Po}),V=f.useRef(null),z=v?b||!!v.closest("form"):!0,[L,E]=f.useState(new Set),K=Array.from(L).map(F=>F.props.value).join(";");return i.jsx(Mg,{...g,children:i.jsxs(gG,{required:p,scope:t,trigger:v,onTriggerChange:w,valueNode:y,onValueNodeChange:x,valueNodeHasChildren:k,onValueNodeHasChildrenChange:C,contentId:_t(),value:I,onValueChange:N,open:A,onOpenChange:P,dir:S,triggerPointerDownPosRef:V,disabled:m,children:[i.jsx(nh.Provider,{scope:t,children:i.jsx(yG,{scope:e.__scopeSelect,onNativeOptionAdd:f.useCallback(F=>{E(Z=>new Set(Z).add(F))},[]),onNativeOptionRemove:f.useCallback(F=>{E(Z=>{const j=new Set(Z);return j.delete(F),j})},[]),children:a})}),z?i.jsxs(kT,{"aria-hidden":!0,required:p,tabIndex:-1,name:u,autoComplete:h,value:I,onChange:F=>N(F.target.value),disabled:m,form:b,children:[I===void 0?i.jsx("option",{value:""}):null,Array.from(L)]},K):null]})})};ZP.displayName=Po;var XP="SelectTrigger",eT=f.forwardRef((e,t)=>{const{__scopeSelect:a,disabled:n=!1,...r}=e,o=oh(a),s=Dr(XP,a),l=s.disabled||n,c=ye(t,s.onTriggerChange),d=rh(a),u=f.useRef("touch"),[h,m,p]=ST(g=>{const v=d().filter(x=>!x.disabled),w=v.find(x=>x.value===s.value),y=AT(v,g,w);y!==void 0&&s.onValueChange(y.value)}),b=g=>{l||(s.onOpenChange(!0),p()),g&&(s.triggerPointerDownPosRef.current={x:Math.round(g.pageX),y:Math.round(g.pageY)})};return i.jsx(Lg,{asChild:!0,...o,children:i.jsx(ee.button,{type:"button",role:"combobox","aria-controls":s.contentId,"aria-expanded":s.open,"aria-required":s.required,"aria-autocomplete":"none",dir:s.dir,"data-state":s.open?"open":"closed",disabled:l,"data-disabled":l?"":void 0,"data-placeholder":CT(s.value)?"":void 0,...r,ref:c,onClick:q(r.onClick,g=>{g.currentTarget.focus(),u.current!=="mouse"&&b(g)}),onPointerDown:q(r.onPointerDown,g=>{u.current=g.pointerType;const v=g.target;v.hasPointerCapture(g.pointerId)&&v.releasePointerCapture(g.pointerId),g.button===0&&g.ctrlKey===!1&&g.pointerType==="mouse"&&(b(g),g.preventDefault())}),onKeyDown:q(r.onKeyDown,g=>{const v=h.current!=="";!(g.ctrlKey||g.altKey||g.metaKey)&&g.key.length===1&&m(g.key),!(v&&g.key===" ")&&pG.includes(g.key)&&(b(),g.preventDefault())})})})});eT.displayName=XP;var tT="SelectValue",aT=f.forwardRef((e,t)=>{const{__scopeSelect:a,className:n,style:r,children:o,placeholder:s="",...l}=e,c=Dr(tT,a),{onValueNodeHasChildrenChange:d}=c,u=o!==void 0,h=ye(t,c.onValueNodeChange);return rt(()=>{d(u)},[d,u]),i.jsx(ee.span,{...l,ref:h,style:{pointerEvents:"none"},children:CT(c.value)?i.jsx(i.Fragment,{children:s}):o})});aT.displayName=tT;var bG="SelectIcon",nT=f.forwardRef((e,t)=>{const{__scopeSelect:a,children:n,...r}=e;return i.jsx(ee.span,{"aria-hidden":!0,...r,ref:t,children:n||"â¼"})});nT.displayName=bG;var wG="SelectPortal",rT=e=>i.jsx(Zi,{asChild:!0,...e});rT.displayName=wG;var To="SelectContent",oT=f.forwardRef((e,t)=>{const a=Dr(To,e.__scopeSelect),[n,r]=f.useState();if(rt(()=>{r(new DocumentFragment)},[]),!a.open){const o=n;return o?No.createPortal(i.jsx(iT,{scope:e.__scopeSelect,children:i.jsx(nh.Slot,{scope:e.__scopeSelect,children:i.jsx("div",{children:e.children})})}),o):null}return i.jsx(sT,{...e,ref:t})});oT.displayName=To;var Ea=10,[iT,_r]=us(To),xG="SelectContentImpl",kG=yo("SelectContent.RemoveScroll"),sT=f.forwardRef((e,t)=>{const{__scopeSelect:a,position:n="item-aligned",onCloseAutoFocus:r,onEscapeKeyDown:o,onPointerDownOutside:s,side:l,sideOffset:c,align:d,alignOffset:u,arrowPadding:h,collisionBoundary:m,collisionPadding:p,sticky:b,hideWhenDetached:g,avoidCollisions:v,...w}=e,y=Dr(To,a),[x,k]=f.useState(null),[C,S]=f.useState(null),A=ye(t,B=>k(B)),[P,I]=f.useState(null),[N,V]=f.useState(null),z=rh(a),[L,E]=f.useState(!1),K=f.useRef(!1);f.useEffect(()=>{if(x)return ay(x)},[x]),ty();const F=f.useCallback(B=>{const[Pe,...Te]=z().map(Ie=>Ie.ref.current),[xe]=Te.slice(-1),ke=document.activeElement;for(const Ie of B)if(Ie===ke||(Ie==null||Ie.scrollIntoView({block:"nearest"}
vendor: 13,829 bytes, line 4863
4863),Ie===Pe&&C&&(C.scrollTop=0),Ie===xe&&C&&(C.scrollTop=C.scrollHeight),Ie==null||Ie.focus(),document.activeElement!==ke))return},[z,C]),Z=f.useCallback(()=>F([P,x]),[F,P,x]);f.useEffect(()=>{L&&Z()},[L,Z]);const{onOpenChange:j,triggerPointerDownPosRef:T}=y;f.useEffect(()=>{if(x){let B={x:0,y:0};const Pe=xe=>{var ke,Ie;B={x:Math.abs(Math.round(xe.pageX)-(((ke=T.current)==null?void 0:ke.x)??0)),y:Math.abs(Math.round(xe.pageY)-(((Ie=T.current)==null?void 0:Ie.y)??0))}},Te=xe=>{B.x<=10&&B.y<=10?xe.preventDefault():x.contains(xe.target)||j(!1),document.removeEventListener("pointermove",Pe),T.current=null};return T.current!==null&&(document.addEventListener("pointermove",Pe),document.addEventListener("pointerup",Te,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",Pe),document.removeEventListener("pointerup",Te,{capture:!0})}}},[x,j,T]),f.useEffect(()=>{const B=()=>j(!1);return window.addEventListener("blur",B),window.addEventListener("resize",B),()=>{window.removeEventListener("blur",B),window.removeEventListener("resize",B)}},[j]);const[O,$]=ST(B=>{const Pe=z().filter(ke=>!ke.disabled),Te=Pe.find(ke=>ke.ref.current===document.activeElement),xe=AT(Pe,B,Te);xe&&setTimeout(()=>xe.ref.current.focus())}),W=f.useCallback((B,Pe,Te)=>{const xe=!K.current&&!Te;(y.value!==void 0&&y.value===Pe||xe)&&(I(B),xe&&(K.current=!0))},[y.value]),se=f.useCallback(()=>x==null?void 0:x.focus(),[x]),le=f.useCallback((B,Pe,Te)=>{const xe=!K.current&&!Te;(y.value!==void 0&&y.value===Pe||xe)&&V(B)},[y.value]),Re=n==="popper"?wf:lT,_e=Re===wf?{side:l,sideOffset:c,align:d,alignOffset:u,arrowPadding:h,collisionBoundary:m,collisionPadding:p,sticky:b,hideWhenDetached:g,avoidCollisions:v}:{};return i.jsx(iT,{scope:a,content:x,viewport:C,onViewportChange:S,itemRefCallback:W,selectedItem:P,onItemLeave:se,itemTextRefCallback:le,focusSelectedItem:Z,selectedItemText:N,position:n,isPositioned:L,searchRef:O,children:i.jsx(Vu,{as:kG,allowPinchZoom:!0,children:i.jsx(Hu,{asChild:!0,trapped:y.open,onMountAutoFocus:B=>{B.preventDefault()},onUnmountAutoFocus:q(r,B=>{var Pe;(Pe=y.trigger)==null||Pe.focus({preventScroll:!0}),B.preventDefault()}),children:i.jsx(zo,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:B=>B.preventDefault(),onDismiss:()=>y.onOpenChange(!1),children:i.jsx(Re,{role:"listbox",id:y.contentId,"data-state":y.open?"open":"closed",dir:y.dir,onContextMenu:B=>B.preventDefault(),...w,..._e,onPlaced:()=>E(!0),ref:A,style:{display:"flex",flexDirection:"column",outline:"none",...w.style},onKeyDown:q(w.onKeyDown,B=>{const Pe=B.ctrlKey||B.altKey||B.metaKey;if(B.key==="Tab"&&B.preventDefault(),!Pe&&B.key.length===1&&$(B.key),["ArrowUp","ArrowDown","Home","End"].includes(B.key)){let xe=z().filter(ke=>!ke.disabled).map(ke=>ke.ref.current);if(["ArrowUp","End"].includes(B.key)&&(xe=xe.slice().reverse()),["ArrowUp","ArrowDown"].includes(B.key)){const ke=B.target,Ie=xe.indexOf(ke);xe=xe.slice(Ie+1)}setTimeout(()=>F(xe)),B.preventDefault()}})})})})})})});sT.displayName=xG;var CG="SelectItemAlignedPosition",lT=f.forwardRef((e,t)=>{const{__scopeSelect:a,onPlaced:n,...r}=e,o=Dr(To,a),s=_r(To,a),[l,c]=f.useState(null),[d,u]=f.useState(null),h=ye(t,A=>u(A)),m=rh(a),p=f.useRef(!1),b=f.useRef(!0),{viewport:g,selectedItem:v,selectedItemText:w,focusSelectedItem:y}=s,x=f.useCallback(()=>{if(o.trigger&&o.valueNode&&l&&d&&g&&v&&w){const A=o.trigger.getBoundingClientRect(),P=d.getBoundingClientRect(),I=o.valueNode.getBoundingClientRect(),N=w.getBoundingClientRect();if(o.dir!=="rtl"){const ke=N.left-P.left,Ie=I.left-ke,St=A.left-Ie,sa=A.width+St,qr=Math.max(sa,P.width),_n=window.innerWidth-Ea,Ur=ox(Ie,[Ea,Math.max(Ea,_n-qr)]);l.style.minWidth=sa+"px",l.style.left=Ur+"px"}else{const ke=P.right-N.right,Ie=window.innerWidth-I.right-ke,St=window.innerWidth-A.right-Ie,sa=A.width+St,qr=Math.max(sa,P.width),_n=window.innerWidth-Ea,Ur=ox(Ie,[Ea,Math.max(Ea,_n-qr)]);l.style.minWidth=sa+"px",l.style.right=Ur+"px"}const V=m(),z=window.innerHeight-Ea*2,L=g.scrollHeight,E=window.getComputedStyle(d),K=parseInt(E.borderTopWidth,10),F=parseInt(E.paddingTop,10),Z=parseInt(E.borderBottomWidth,10),j=parseInt(E.paddingBottom,10),T=K+F+L+j+Z,O=Math.min(v.offsetHeight*5,T),$=window.getComputedStyle(g),W=parseInt($.paddingTop,10),se=parseInt($.paddingBottom,10),le=A.top+A.height/2-Ea,Re=z-le,_e=v.offsetHeight/2,B=v.offsetTop+_e,Pe=K+F+B,Te=T-Pe;if(Pe<=le){const ke=V.length>0&&v===V[V.length-1].ref.current;l.style.bottom="0px";const Ie=d.clientHeight-g.offsetTop-g.offsetHeight,St=Math.max(Re,_e+(ke?se:0)+Ie+Z),sa=Pe+St;l.style.height=sa+"px"}else{const ke=V.length>0&&v===V[0].ref.current;l.style.top="0px";const St=Math.max(le,K+g.offsetTop+(ke?W:0)+_e)+Te;l.style.height=St+"px",g.scrollTop=Pe-le+g.offsetTop}l.style.margin=`${Ea}px 0`,l.style.minHeight=O+"px",l.style.maxHeight=z+"px",n==null||n(),requestAnimationFrame(()=>p.current=!0)}},[m,o.trigger,o.valueNode,l,d,g,v,w,o.dir,n]);rt(()=>x(),[x]);const[k,C]=f.useState();rt(()=>{d&&C(window.getComputedStyle(d).zIndex)},[d]);const S=f.useCallback(A=>{A&&b.current===!0&&(x(),y==null||y(),b.current=!1)},[x,y]);return i.jsx(AG,{scope:a,contentWrapper:l,shouldExpandOnScrollRef:p,onScrollButtonChange:S,children:i.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:k},children:i.jsx(ee.div,{...r,ref:h,style:{boxSizing:"border-box",maxHeight:"100%",...r.style}})})})});lT.displayName=CG;var SG="SelectPopperPosition",wf=f.forwardRef((e,t)=>{const{__scopeSelect:a,align:n="start",collisionPadding:r=Ea,...o}=e,s=oh(a);return i.jsx(Og,{...s,...o,ref:t,align:n,collisionPadding:r,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});wf.displayName=SG;var[AG,zy]=us(To,{}),xf="SelectViewport",cT=f.forwardRef((e,t)=>{const{__scopeSelect:a,nonce:n,...r}=e,o=_r(xf,a),s=zy(xf,a),l=ye(t,o.onViewportChange),c=f.useRef(0);return i.jsxs(i.Fragment,{children:[i.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:n}),i.jsx(nh.Slot,{scope:a,children:i.jsx(ee.div,{"data-radix-select-viewport":"",role:"presentation",...r,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...r.style},onScroll:q(r.onScroll,d=>{const u=d.currentTarget,{contentWrapper:h,shouldExpandOnScrollRef:m}=s;if(m!=null&&m.current&&h){const p=Math.abs(c.current-u.scrollTop);if(p>0){const b=window.innerHeight-Ea*2,g=parseFloat(h.style.minHeight),v=parseFloat(h.style.height),w=Math.max(g,v);if(w<b){const y=w+p,x=Math.min(b,y),k=y-x;h.style.height=x+"px",h.style.bottom==="0px"&&(u.scrollTop=k>0?k:0,h.style.justifyContent="flex-end")}}}c.current=u.scrollTop})})})]})});cT.displayName=xf;var dT="SelectGroup",[PG,TG]=us(dT),IG=f.forwardRef((e,t)=>{const{__scopeSelect:a,...n}=e,r=_t();return i.jsx(PG,{scope:a,id:r,children:i.jsx(ee.div,{role:"group","aria-labelledby":r,...n,ref:t})})});IG.displayName=dT;var uT="SelectLabel",hT=f.forwardRef((e,t)=>{const{__scopeSelect:a,...n}=e,r=TG(uT,a);return i.jsx(ee.div,{id:r.id,...n,ref:t})});hT.displayName=uT;var su="SelectItem",[jG,pT]=us(su),mT=f.forwardRef((e,t)=>{const{__scopeSelect:a,value:n,disabled:r=!1,textValue:o,...s}=e,l=Dr(su,a),c=_r(su,a),d=l.value===n,[u,h]=f.useState(o??""),[m,p]=f.useState(!1),b=ye(t,y=>{var x;return(x=c.itemRefCallback)==null?void 0:x.call(c,y,n,r)}),g=_t(),v=f.useRef("touch"),w=()=>{r||(l.onValueChange(n),l.onOpenChange(!1))};if(n==="")throw new Error("A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return i.jsx(jG,{scope:a,value:n,disabled:r,textId:g,isSelected:d,onItemTextChange:f.useCallback(y=>{h(x=>x||((y==null?void 0:y.textContent)??"").trim())},[]),children:i.jsx(nh.ItemSlot,{scope:a,value:n,disabled:r,textValue:u,children:i.jsx(ee.div,{role:"option","aria-labelledby":g,"data-highlighted":m?"":void 0,"aria-selected":d&&m,"data-state":d?"checked":"unchecked","aria-disabled":r||void 0,"data-disabled":r?"":void 0,tabIndex:r?void 0:-1,...s,ref:b,onFocus:q(s.onFocus,()=>p(!0)),onBlur:q(s.onBlur,()=>p(!1)),onClick:q(s.onClick,()=>{v.current!=="mouse"&&w()}),onPointerUp:q(s.onPointerUp,()=>{v.current==="mouse"&&w()}),onPointerDown:q(s.onPointerDown,y=>{v.current=y.pointerType}),onPointerMove:q(s.onPointerMove,y=>{var x;v.current=y.pointerType,r?(x=c.onItemLeave)==null||x.call(c):v.current==="mouse"&&y.currentTarget.focus({preventScroll:!0})}),onPointerLeave:q(s.onPointerLeave,y=>{var x;y.currentTarget===document.activeElement&&((x=c.onItemLeave)==null||x.call(c))}),onKeyDown:q(s.onKeyDown,y=>{var k;((k=c.searchRef)==null?void 0:k.current)!==""&&y.key===" "||(mG.includes(y.key)&&w(),y.key===" "&&y.preventDefault())})})})})});mT.displayName=su;var _s="SelectItemText",fT=f.forwardRef((e,t)=>{const{__scopeSelect:a,className:n,style:r,...o}=e,s=Dr(_s,a),l=_r(_s,a),c=pT(_s,a),d=vG(_s,a),[u,h]=f.useState(null),m=ye(t,w=>h(w),c.onItemTextChange,w=>{var y;return(y=l.itemTextRefCallback)==null?void 0:y.call(l,w,c.value,c.disabled)}),p=u==null?void 0:u.textContent,b=f.useMemo(()=>i.jsx("option",{value:c.value,disabled:c.disabled,children:p},c.value),[c.disabled,c.value,p]),{onNativeOptionAdd:g,onNativeOptionRemove:v}=d;return rt(()=>(g(b),()=>v(b)),[g,v,b]),i.jsxs(i.Fragment,{children:[i.jsx(ee.span,{id:c.textId,...o,ref:m}),c.isSelected&&s.valueNode&&!s.valueNodeHasChildren?No.createPortal(o.children,s.valueNode):null]})});fT.displayName=_s;var gT="SelectItemIndicator",yT=f.forwardRef((e,t)=>{const{__scopeSelect:a,...n}=e;return pT(gT,a).isSelected?i.jsx(ee.span,{"aria-hidden":!0,...n,ref:t}):null});yT.displayName=gT;var kf="SelectScrollUpButton",vT=f.forwardRef((e,t)=>{const a=_r(kf,e.__scopeSelect),n=zy(kf,e.__scopeSelect),[r,o]=f.useState(!1),s=ye(t,n.onScrollButtonChange);return rt(()=>{if(a.viewport&&a.isPositioned){let l=function(){const d=c.scrollTop>0;o(d)};const c=a.viewport;return l(),c.addEventListener("scroll",l),()=>c.removeEventListener("scroll",l)}},[a.viewport,a.isPositioned]),r?i.jsx(wT,{...e,ref:s,onAutoScroll:()=>{const{viewport:l,selectedItem:c}=a;l&&c&&(l.scrollTop=l.scrollTop-c.offsetHeight)}}):null});vT.displayName=kf;var Cf="SelectScrollDownButton",bT=f.forwardRef((e,t)=>{const a=_r(Cf,e.__scopeSelect),n=zy(Cf,e.__scopeSelect),[r,o]=f.useState(!1),s=ye(t,n.onScrollButtonChange);return rt(()=>{if(a.viewport&&a.isPositioned){let l=function(){const d=c.scrollHeight-c.clientHeight,u=Math.ceil(c.scrollTop)<d;o(u)};const c=a.viewport;return l(),c.addEventListener("scroll",l),()=>c.removeEventListener("scroll",l)}},[a.viewport,a.isPositioned]),r?i.jsx(wT,{...e,ref:s,onAutoScroll:()=>{const{viewport:l,selectedItem:c}=a;l&&c&&(l.scrollTop=l.scrollTop+c.offsetHeight)}}):null});bT.displayName=Cf;var wT=f.forwardRef((e,t)=>{const{__scopeSelect:a,onAutoScroll:n,...r}=e,o=_r("SelectScrollButton",a),s=f.useRef(null),l=rh(a),c=f.useCallback(()=>{s.current!==null&&(window.clearInterval(s.current),s.current=null)},[]);return f.useEffect(()=>()=>c(),[c]),rt(()=>{var u;const d=l().find(h=>h.ref.current===document.activeElement);(u=d==null?void 0:d.ref.current)==null||u.scrollIntoView({block:"nearest"})},[l]),i.jsx(ee.div,{"aria-hidden":!0,...r,ref:t,style:{flexShrink:0,...r.style},onPointerDown:q(r.onPointerDown,()=>{s.current===null&&(s.current=window.setInterval(n,50))}),onPointerMove:q(r.onPointerMove,()=>{var d;(d=o.onItemLeave)==null||d.call(o),s.current===null&&(s.current=window.setInterval(n,50))}),onPointerLeave:q(r.onPointerLeave,()=>{c()})})}),NG="SelectSeparator",xT=f.forwardRef((e,t)=>{const{__scopeSelect:a,...n}=e;return i.jsx(ee.div,{"aria-hidden":!0,...n,ref:t})});xT.displayName=NG;var Sf="SelectArrow",EG=f.forwardRef((e,t)=>{const{__scopeSelect:a,...n}=e,r=oh(a),o=Dr(Sf,a),s=_r(Sf,a);return o.open&&s.position==="popper"?i.jsx(Gg,{...r,...n,ref:t}):null});EG.displayName=Sf;var zG="SelectBubbleInput",kT=f.forwardRef(({__scopeSelect:e,value:t,...a},n)=>{const r=f.useRef(null),o=ye(n,r),s=iy(t);return f.useEffect(()=>{const l=r.current;if(!l)return;const c=window.HTMLSelectElement.prototype,u=Object.getOwnPropertyDescriptor(c,"value").set;if(s!==t&&u){const h=new Event("change",{bubbles:!0});u.call(l,t),l.dispatchEvent(h)}},[s,t]),i.jsx(ee.select,{...a,style:{..._0,...a.style},ref:o,defaultValue:t})});kT.displayName=zG;function CT(e){return e===""||e===void 0}function ST(e){const t=tt(e),a=f.useRef(""),n=f.useRef(0),r=f.useCallback(s=>{const l=a.current+s;t(l),function c(d){a.current=d,window.clearTimeout(n.current),d!==""&&(n.current=window.setTimeout(()=>c(""),1e3))}(l)},[t]),o=f.useCallback(()=>{a.current="",window.clearTimeout(n.current)},[]);return f.useEffect(()=>()=>window.clearTimeout(n.current),[]),[a,r,o]}function AT(e,t,a){const r=t.length>1&&Array.from(t).every(d=>d===t[0])?t[0]:t,o=a?e.indexOf(a):-1;let s=RG(e,Math.max(o,0));r.length===1&&(s=s.filter(d=>d!==a));const c=s.find(d=>d.textValue.toLowerCase().startsWith(r.toLowerCase()));return c!==a?c:void 0}function RG(e,t){return e.map((a,n)=>e[(t+n)%e.length])}var DG=ZP,PT=eT,_G=aT,qG=nT,UG=rT,TT=oT,MG=cT,IT=hT,jT=mT,LG=fT,OG=yT,NT=vT,ET=bT,zT=xT;const GG=DG,FG=_G,RT=f.forwardRef(({className:e,children:t,...a},n)=>i.jsxs(PT,{ref:n,className:J("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm r
4863ing-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",e),...a,children:[t,i.jsx(qG,{asChild:!0,children:i.jsx(Pu,{className:"h-4 w-4 opacity-50"})})]}));RT.displayName=PT.displayName;const DT=f.forwardRef(({className:e,...t},a)=>i.jsx(NT,{ref:a,className:J("flex cursor-default items-center justify-center py-1",e),...t,children:i.jsx(AN,{className:"h-4 w-4"})}));DT.displayName=NT.displayName;const _T=f.forwardRef(({className:e,...t},a)=>i.jsx(ET,{ref:a,className:J("flex cursor-default items-center justify-center py-1",e),...t,children:i.jsx(Pu,{className:"h-4 w-4"})}));_T.displayName=ET.displayName;const qT=f.forwardRef(({className:e,children:t,position:a="popper",...n},r)=>i.jsx(UG,{children:i.jsxs(TT,{ref:r,className:J("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",a==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:a,...n,children:[i.jsx(DT,{}),i.jsx(MG,{className:J("p-1",a==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t}),i.jsx(_T,{})]})}));qT.displayName=TT.displayName;const HG=f.forwardRef(({className:e,...t},a)=>i.jsx(IT,{ref:a,className:J("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));HG.displayName=IT.displayName;const UT=f.forwardRef(({className:e,children:t,...a},n)=>i.jsxs(jT,{ref:n,className:J("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",e),...a,children:[i.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:i.jsx(OG,{children:i.jsx(Cn,{className:"h-4 w-4"})})}),i.jsx(LG,{children:t})]}));UT.displayName=jT.displayName;const BG=f.forwardRef(({className:e,...t},a)=>i.jsx(zT,{ref:a,className:J("-mx-1 my-1 h-px bg-muted",e),...t}));BG.displayName=zT.displayName;const VG=hG({agency_name:Bn().trim().min(1).max(200),website:Bn().trim().max(300).optional().or(Oc("")),contact_name:Bn().trim().min(1).max(200),role:Bn().trim().max(150).optional().or(Oc("")),email:Bn().trim().email().max(320),projected_volume:Bn().min(1).max(50),brands_served:Bn().trim().max(2e3).optional().or(Oc("")),notes:Bn().trim().max(2e3).optional().or(Oc(""))}),ix={agency_name:"",website:"",contact_name:"",role:"",email:"",projected_volume:"",brands_served:"",notes:""},WG=()=>{const{t:e,i18n:t}=we(),[a,n]=f.useState(ix),[r,o]=f.useState(!1),[s,l]=f.useState(!1),c=e("forAgenciesMerchant.formVolumeOptions",{returnObjects:!0})??[],d=(h,m)=>n(p=>({...p,[h]:m})),u=async h=>{var v;h.preventDefault();const m=VG.safeParse({...a,projected_volume:a.projected_volume||c[0]||""});if(!m.success){fm({title:e("forAgenciesMerchant.formErrorTitle"),description:((v=m.error.issues[0])==null?void 0:v.message)??"Invalid form data",variant:"destructive"});return}o(!0);const p=(t.language||"en").slice(0,2).toLowerCase(),{data:b,error:g}=await Qa.functions.invoke("submit-partner",{body:{agencyName:m.data.agency_name,contactName:m.data.contact_name,email:m.data.email,website:m.data.website||"",role:m.data.role||"",projectedVolume:m.data.projected_volume||"",brandsServed:m.data.brands_served||"",notes:m.data.notes||"",language:["en","it","es","de","fr"].includes(p)?p:"en"}});if(o(!1),g||!(b!=null&&b.ok)){fm({title:e("forAgenciesMerchant.formErrorTitle"),description:e("forAgenciesMerchant.formErrorDesc"),variant:"destructive"});return}l(!0)};return s?i.jsxs("div",{className:"rounded-3xl glass-card p-10 md:p-16 text-center max-w-2xl mx-auto",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(gl,{className:"h-4 w-4"}),e("forAgenciesMerchant.formSuccessBadge")]}),i.jsxs("h3",{className:"text-3xl md:text-4xl font-display font-bold mb-4",children:[e("forAgenciesMerchant.formSuccessTitle")," ",i.jsxs("span",{className:"text-gradient italic",children:[a.agency_name||e("forAgenciesMerchant.formSuccessFallback"),"."]})]}),i.jsx("p",{className:"text-muted-foreground text-lg leading-relaxed mb-8",children:e("forAgenciesMerchant.formSuccessBody")}),i.jsx(H,{variant:"outline",onClick:()=>{l(!1),n(ix)},children:e("forAgenciesMerchant.formSubmitAnother")})]}):i.jsxs("form",{onSubmit:u,className:"rounded-3xl glass-card p-8 md:p-12 max-w-3xl mx-auto
4863space-y-6",children:[i.jsxs("div",{className:"grid sm:grid-cols-2 gap-6",children:[i.jsxs("div",{className:"space-y-2",children:[i.jsxs(Jt,{htmlFor:"agency_name",children:[e("forAgenciesMerchant.formAgency")," *"]}),i.jsx(nn,{id:"agency_name",required:!0,maxLength:200,placeholder:e("forAgenciesMerchant.formAgencyPh"),value:a.agency_name,onChange:h=>d("agency_name",h.target.value)})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"website",children:e("forAgenciesMerchant.formWebsite")}),i.jsx(nn,{id:"website",type:"url",maxLength:300,placeholder:"https://",value:a.website,onChange:h=>d("website",h.target.value)})]})]}),i.jsxs("div",{className:"grid sm:grid-cols-2 gap-6",children:[i.jsxs("div",{className:"space-y-2",children:[i.jsxs(Jt,{htmlFor:"contact_name",children:[e("forAgenciesMerchant.formContact")," *"]}),i.jsx(nn,{id:"contact_name",required:!0,maxLength:200,placeholder:e("forAgenciesMerchant.formContactPh"),value:a.contact_name,onChange:h=>d("contact_name",h.target.value)})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"role",children:e("forAgenciesMerchant.formRole")}),i.jsx(nn,{id:"role",maxLength:150,placeholder:e("forAgenciesMerchant.formRolePh"),value:a.role,onChange:h=>d("role",h.target.value)})]})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsxs(Jt,{htmlFor:"email",children:[e("forAgenciesMerchant.formEmail")," *"]}),i.jsx(nn,{id:"email",type:"email",required:!0,maxLength:320,placeholder:e("forAgenciesMerchant.formEmailPh"),value:a.email,onChange:h=>d("email",h.target.value)})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsxs(Jt,{htmlFor:"projected_volume",children:[e("forAgenciesMerchant.formVolume")," *"]}),i.jsxs(GG,{value:a.projected_volume,onValueChange:h=>d("projected_volume",h),children:[i.jsx(RT,{id:"projected_volume",children:i.jsx(FG,{placeholder:c[0]})}),i.jsx(qT,{children:c.map(h=>i.jsx(UT,{value:h,children:h},h))})]})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"brands_served",children:e("forAgenciesMerchant.formBrands")}),i.jsx(bf,{id:"brands_served",maxLength:2e3,placeholder:e("forAgenciesMerchant.formBrandsPh"),value:a.brands_served,onChange:h=>d("brands_served",h.target.value)})]}),i.jsxs("div",{className:"space-y-2",children:[i.jsx(Jt,{htmlFor:"notes",children:e("forAgenciesMerchant.formNotes")}),i.jsx(bf,{id:"notes",maxLength:2e3,placeholder:e("forAgenciesMerchant.formNotesPh"),value:a.notes,onChange:h=>d("notes",h.target.value)})]}),i.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 pt-2",children:[i.jsx("p",{className:"text-xs text-muted-foreground max-w-sm",children:e("forAgenciesMerchant.formDisclaimer")}),i.jsxs(H,{type:"submit",variant:"hero",size:"lg",disabled:r,children:[e(r?"forAgenciesMerchant.formSubmitting":"forAgenciesMerchant.formSubmit"),!r&&i.jsx(at,{className:"ml-2 h-4 w-4"})]})]})]})},$G=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"WebPage",name:"HeroShots for Merchant Agencies",description:e("forAgenciesMerchant.seoDesc"),url:"https://heroshots.ai/for-agencies/merchant",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"}},a=[{icon:Kl,title:e("forAgenciesMerchant.feat1Title"),desc:e("forAgenciesMerchant.feat1Desc")},{icon:Sn,title:e("forAgenciesMerchant.feat2Title"),desc:e("forAgenciesMerchant.feat2Desc")},{icon:Tu,title:e("forAgenciesMerchant.feat3Title"),desc:e("forAgenciesMerchant.feat3Desc")},{icon:_N,title:e("forAgenciesMerchant.feat4Title"),desc:e("forAgenciesMerchant.feat4Desc")},{icon:Sg,title:e("forAgenciesMerchant.feat5Title"),desc:e("forAgenciesMerchant.feat5Desc")},{icon:xa,title:e("forAgenciesMerchant.feat6Title"),desc:e("forAgenciesMerchant.feat6Desc")}],n=[{num:"01",title:e("forAgenciesMerchant.step1Title"),desc:e("forAgenciesMerchant.step1Desc")},{num:"02",title:e("forAgenciesMerchant.step2Title"),desc:e("forAgenciesMerchant.step2Desc")},{num:"03",title:e("forAgenciesMerchant.step3Title"),desc:e("forAgenciesMerchant.step3Desc")},{num:"04",title:e("forAgenciesMerchant.step4Title"),desc:e("forAgenciesMerchant.step4Desc")}],r=e("forAgenciesMerchant.logos",{returnObjects:!0})??[],o=e("forAgenciesMerchant.resellerFeatures",{returnObjects:!0})??[],s=e("forAgenciesMerchant.resellerSteps",{returnObjects:!0})??[],l=e("forAgenciesMerchant.resellerFaqs",{returnObjects:!0})??[],c=e("forAgenciesMerchant.modelSwitcher.selfBullets",{returnObjects:!0})??[],d=e("forAgenciesMerchant.modelSwitcher.managedBullets",{returnObjects:!0})??[];return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("forAgenciesMerchant.seoTitle"),description:e("forAgenciesMerchant.seoDesc"),canonical:"https://heroshots.ai/for-agencies/merchant",jsonLd:[t,Le([{name:"For Agencies",path:"/for-agencies"},{name:"Merchant Agency",path:"/for-agencies/merchant"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-12 sm:py-16 md:py-24 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4863parent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(xa,{className:"h-4 w-4"}),e("forAgenciesMerchant.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("forAgenciesMerchant.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("forAgenciesMerchant.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"#self-service",children:e("forAgenciesMerchant.modelSwitcher.selfCta")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx("a",{href:"#managed-program",children:e("forAgenciesMerchant.modelSwitcher.managedCta")})})]})]})})]}),i.jsx("section",{className:"py-12 md:py-16",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 max-w-3xl mx-auto",children:[i.jsx("div",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary mb-3",children:e("forAgenciesMerchant.modelSwitcher.eyebrow")}),i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold leading-[1.15] mb-4",children:e("forAgenciesMerchant.modelSwitcher.title")}),i.jsx("p",{className:"text-base md:text-lg text-muted-foreground",children:e("forAgenciesMerchant.modelSwitcher.subtitle")})]}),i.jsxs("div",{className:"grid md:grid-cols-2 gap-6 max-w-5xl mx-auto",children:[i.jsx(re,{className:"border-border/40 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-5",children:[i.jsxs("div",{className:"flex items-center gap-3",children:[i.jsx("div",{className:"w-11 h-11 rounded-2xl bg-primary/10 flex items-center justify-center",children:i.jsx(lb,{className:"h-5 w-5 text-primary"})}),i.jsx("span",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary",children:e("forAgenciesMerchant.modelSwitcher.selfBadge")})]}),i.jsx("h3",{className:"text-2xl font-display font-bold",children:e("forAgenciesMerchant.modelSwitcher.selfTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:e("forAgenciesMerchant.modelSwitcher.selfDesc")}),i.jsx("ul",{className:"space-y-2",children:c.map(u=>i.jsxs("li",{className:"flex items-start gap-2 text-sm",children:[i.jsx(Cn,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),i.jsx("span",{children:u})]},u))}),i.jsx(H,{variant:"outline",className:"w-full",asChild:!0,children:i.jsxs("a",{href:"#self-service",children:[e("forAgenciesMerchant.modelSwitcher.selfCta"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})}),i.jsxs(re,{className:"border-primary/40 bg-card/60 backdrop-blur-sm hover:shadow-glow transition-all duration-500 relative overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 gradient-hero opacity-[0.06] pointer-events-none"}),i.jsxs(ie,{className:"pt-8 pb-8 space-y-5 relative",children:[i.jsxs("div",{className:"flex items-center gap-3",children:[i.jsx("div",{className:"w-11 h-11 rounded-2xl gradient-hero flex items-center justify-center",children:i.jsx(ob,{className:"h-5 w-5 text-primary-foreground"})}),i.jsx("span",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary",children:e("forAgenciesMerchant.modelSwitcher.managedBadge")})]}),i.jsx("h3",{className:"text-2xl font-display font-bold",children:e("forAgenciesMerchant.modelSwitcher.managedTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:e("forAgenciesMerchant.modelSwitcher.managedDesc")}),i.jsx("ul",{className:"space-y-2",children:d.map(u=>i.jsxs("li",{className:"flex items-start gap-2 text-sm",children:[i.jsx(Cn,{className:"h-4 w-4 text-primary mt-0.5 shrink-0"}),i.jsx("span",{children:u})]},u))}),i.jsx(H,{variant:"hero",className:"w-full",asChild:!0,children:i.jsxs("a",{href:"#managed-program",children:[e("forAgenciesMerchant.modelSwitcher.managedCta"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})]})]})]})}),i.jsx("section",{id:"self-service",className:"py-10 sm:py-14 md:py-20 scroll-mt-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-8",children:i.jsxs("div",{className:"inline-flex items-center gap-2 font-mono text-xs uppercase tracking-[0.18em] text-primary",children:[i.jsx(lb,{className:"h-3.5 w-3.5"}),e("forAgenciesMerchant.selfServiceEyebrow")]})}),i.jsxs("div",{className:"max-w-3xl mx-auto text-center p-8 md:p-12 rounded-3xl glass-card",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold mb-4",children:e("forAgenciesMerchant.revenueTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed",children:e("forAgenciesMerchant.revenueDesc")})]})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgenciesMerchant.featuresTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-3xl mx-auto",children:e("forAgenciesMerchant.featuresSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto",children:a.map((u,h)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(u.icon,{className:"h-5 w-5 text-primary"})}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:u.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:u.desc})]})},h))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-16",children:i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forAgenciesMerchant.howTitle")})}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-8 max-w-6xl mx-auto",children:n.map((u,h)=>i.jsxs("div",{className:"text-center group",children:[i.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-2xl gradient-hero text-primary-foreground text-2xl font-display font-bold shadow-elegant mb-6 group-hover:scale-105 transition-transform",children:u.num}),i.jsx("h3",{className:"text-lg font-display font-semibold mb-3",children:u.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:u.desc})]},h))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-6",children:e("forAgenciesMerchant.ctaTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("forAgenciesMerchant.ctaSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/pre-sales",children:[i.jsx(vo,{className:"mr-2 h-5 w-5"}),e("common.bookDemo")]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsxs(M,{to:"/for-agencies/talent",children:[e("forAgenciesMerchant.seeTalent"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})})]})]})}),i.jsx("section",{id:"managed-program",className:"relative py-10 sm:py-14 md:py-20 border-t border-border/40 scroll-mt-20",children:i.jsxs("div",{className:"container relative px-4 sm:px-6 text-center max-w-3xl mx-auto",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 font-mono text-xs uppercase tracking-[0.18em] text-primary mb-4",children:[i.jsx(ob,{className:"h-3.5 w-3.5"}),e("forAgenciesMerchant.managedProgramEyebrow")]}),i.jsx("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:e("forAgenciesMerchant.resellerBadge")}),i.jsxs("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-display font-bold leading-[1.1] mb-6",children:[e("forAgenciesMerchant.resellerHeroPretitle"),i.jsx("br",{}),i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.resellerHeroHighlight")})]}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed mb-8",children:e("forAgenciesMerchant.resellerHeroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs("a",{href:"#agency-form",children:[e("forAgenciesMerchant.resellerHeroCta"),i.jsx(at,{className:"ml-2 h-4 w-4"})]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx("a",{href:"#reseller-how",children:e("forAgenciesMerchant.resellerHeroSeeHow")})})]}),i.jsx("p",{className:"mt-6 text-xs text-muted-foreground",children:e("forAgenciesMerchant.resellerHeroNote")})]})}),i.jsx("section",{className:"pb-16",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("p",{className:"text-center text-xs uppercase tracking-[0.18em] text-muted-foreground mb-8",children:e("forAgenciesMerchant.logosEyebrow")}),i.jsx("div",{className:"flex flex-wrap items-center justify-center gap-x-10 gap-y-4",children:r.map(u=>i.jsx("span",{className:"font-display text-base md:text-lg text-muted-foreground
4863/80",children:u},u))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"mb-12 max-w-3xl",children:[i.jsx("div",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary mb-3",children:e("forAgenciesMerchant.resellerFeaturesEyebrow")}),i.jsxs("h2",{className:"text-3xl md:text-4xl font-display font-bold leading-[1.15]",children:[e("forAgenciesMerchant.resellerFeaturesTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.resellerFeaturesHighlight")})]})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-6",children:o.map(u=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-3",children:[i.jsx("div",{className:"font-mono text-xs text-primary tracking-widest",children:u.n}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:u.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:u.desc})]})},u.n))})]})}),i.jsx("section",{id:"reseller-how",className:"py-10 sm:py-14 md:py-20 bg-muted/20 scroll-mt-20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"grid lg:grid-cols-2 gap-12 lg:gap-20 items-start",children:[i.jsxs("div",{children:[i.jsx("div",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary mb-3",children:e("forAgenciesMerchant.resellerHowEyebrow")}),i.jsxs("h2",{className:"text-3xl md:text-4xl font-display font-bold leading-[1.15] mb-6",children:[e("forAgenciesMerchant.resellerHowTitle"),i.jsx("br",{}),i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.resellerHowHighlight")})]}),i.jsx("p",{className:"text-lg text-muted-foreground leading-relaxed mb-6",children:e("forAgenciesMerchant.resellerHowSubtitle")}),i.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-md",children:[i.jsx("strong",{className:"text-foreground",children:e("forAgenciesMerchant.resellerHowRequiredLabel")})," ",e("forAgenciesMerchant.resellerHowRequired")]})]}),i.jsx("div",{className:"space-y-5",children:s.map((u,h)=>i.jsxs("div",{className:"flex gap-5 p-5 rounded-2xl bg-card/60 border border-border/30 backdrop-blur-sm",children:[i.jsx("div",{className:"font-mono text-sm text-primary shrink-0 mt-0.5",children:String(h+1).padStart(2,"0")}),i.jsxs("div",{children:[i.jsx("h4",{className:"font-display font-semibold mb-1",children:u.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:u.desc})]})]},h))})]})})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsx("div",{className:"container px-4 sm:px-6",children:i.jsxs("div",{className:"grid lg:grid-cols-[1fr_2fr] gap-12 lg:gap-20 items-start max-w-6xl mx-auto",children:[i.jsxs("div",{children:[i.jsx("div",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary mb-3",children:e("forAgenciesMerchant.resellerFaqEyebrow")}),i.jsxs("h2",{className:"text-3xl md:text-4xl font-display font-bold leading-[1.15]",children:[e("forAgenciesMerchant.resellerFaqTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.resellerFaqHighlight")})]})]}),i.jsx(Co,{type:"single",collapsible:!0,defaultValue:"faq-0",children:l.map((u,h)=>i.jsxs(Sr,{value:`faq-${h}`,children:[i.jsx(Ar,{className:"text-left font-display text-base",children:u.q}),i.jsx(Pr,{className:"text-muted-foreground leading-relaxed",children:u.a})]},h))})]})})}),i.jsx("section",{id:"agency-form",className:"py-10 sm:py-14 md:py-20 bg-muted/20 scroll-mt-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-12 max-w-2xl mx-auto",children:[i.jsx("div",{className:"font-mono text-xs uppercase tracking-[0.18em] text-primary mb-3",children:e("forAgenciesMerchant.formEyebrow")}),i.jsxs("h2",{className:"text-3xl md:text-4xl font-display font-bold leading-[1.15] mb-4",children:[e("forAgenciesMerchant.formTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forAgenciesMerchant.formHighlight")})]}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("forAgenciesMerchant.formSubtitle")})]}),i.jsx(WG,{})]})})]}),i.jsx(ze,{})]})},KG=()=>{const{t:e}=we(),t={"@context":"https://schema.org","@type":"WebPage",name:"HeroShots for Creators & Models",description:"Turn yourself into an AI avatar. License your digital likeness to brands. Earn royalties every time your avatar generates content.",url:"https://heroshots.ai/for-creators",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"}},a=[{icon:xi,title:e("forCreators.feat1Title"),desc:e("forCreators.feat1Desc")},{icon:EN,title:e("forCreators.feat2Title"),desc:e("forCreators.feat2Desc")},{icon:es,title:e("forCreators.feat3Title"),desc:e("forCreators.feat3Desc")},{icon:LN,title:e("forCreators.feat4Title"),desc:e("forCreators.feat4Desc")},{icon:pi,title:e("forCreators.feat5Title"),desc:e("forCreators.feat5Desc")},{icon:qN,title:e("forCreators.feat6Title"),desc:e("forCreators.feat6Desc")}],n=[{num:"01",title:e("forCreators.step1Title"),desc:e("forCreators.step1Desc")},{num:"02",title:e("forCreators.step2Title"),desc:e("forCreators.step2Desc")},{num:"03",title:e("forCreators.step3Title"),desc:e("forCreators.step3Desc")},{num:"04",title:e("forCreators.step4Title"),desc:e("forCreators.step4Desc")}],r=[{q:e("forCreators.faq1Q"),a:e("forCreators.faq1A")},{q:e("forCreators.faq2Q"),a:e("forCreators.faq2A")},{q:e("forCreators.faq3Q"),a:e("forCreators.faq3A")},{q:e("forCreators.faq4Q"),a:e("forCreators.faq4A")}];return i.jsxs("div",{className:"min-h-screen flex flex-col bg-background",children:[i.jsx(Se,{title:e("forCreators.seoTitle"),description:e("forCreators.seoDesc"),canonical:"https://heroshots.ai/for-creators",jsonLd:[t,Le([{name:"For Creators",path:"/for-creators"}])]}),i.jsx(Ee,{}),i.jsxs("main",{children:[i.jsxs("section",{className:"relative py-12 sm:py-16 md:py-24 overflow-hidden",children:[i.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-accent/3 via-trans
4863parent to-transparent"}),i.jsx("div",{className:"container relative px-4 sm:px-6",children:i.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx($s,{className:"h-4 w-4"}),e("forCreators.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("forCreators.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("forCreators.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("forCreators.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("forCreators.createAvatar")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/talent",children:e("forCreators.learnRoyalties")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground/70 mt-4",children:e("forCreators.freeToJoin")})]})})]}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forCreators.howTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("forCreators.howSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-8 max-w-6xl mx-auto",children:n.map((o,s)=>i.jsxs("div",{className:"text-center group",children:[i.jsx("div",{className:"inline-flex items-center justify-center w-20 h-20 rounded-2xl gradient-hero text-primary-foreground text-2xl font-display font-bold shadow-elegant mb-6 group-hover:scale-105 transition-transform",children:o.num}),i.jsx("h3",{className:"text-lg font-display font-semibold mb-3",children:o.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:o.desc})]},s))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forCreators.featuresTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-3xl mx-auto",children:e("forCreators.featuresSubtitle")})]}),i.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto",children:a.map((o,s)=>i.jsx(re,{className:"border-border/30 bg-card/60 backdrop-blur-sm hover:shadow-elegant transition-all duration-500 hover:-translate-y-1",children:i.jsxs(ie,{className:"pt-8 pb-8 space-y-4",children:[i.jsx("div",{className:"w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/15 to-accent/15 flex items-center justify-center",children:i.jsx(o.icon,{className:"h-5 w-5 text-primary"})}),i.jsx("h3",{className:"text-lg font-display font-semibold",children:o.title}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:o.desc})]})},s))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsxs("div",{className:"max-w-4xl mx-auto text-center mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forCreators.earningsTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto",children:e("forCreators.earningsSubtitle")})]}),i.jsx("div",{className:"grid grid-cols-3 gap-8 max-w-4xl mx-auto",children:[{value:e("forCreators.earnStat1Val"),label:e("forCreators.earnStat1Label")},{value:e("forCreators.earnStat2Val"),label:e("forCreators.earnStat2Label")},{value:e("forCreators.earnStat3Val"),label:e("forCreators.earnStat3Label")}].map((o,s)=>i.jsxs("div",{className:"text-center p-10 rounded-2xl glass-card",children:[i.jsx("div",{className:"text-4xl md:text-5xl font-display font-bold mb-3 text-gradient",children:o.value}),i.jsx("p",{className:"text-sm text-muted-foreground",children:o.label})]},s))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container px-4 sm:px-6",children:[i.jsx("div",{className:"text-center mb-16",children:i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-5",children:e("forCreators.faqTitle")})}
4863),i.jsx("div",{className:"max-w-3xl mx-auto space-y-6",children:r.map((o,s)=>i.jsxs("div",{className:"p-6 rounded-xl glass-card",children:[i.jsx("h3",{className:"text-lg font-display font-semibold mb-2",children:o.q}),i.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:o.a})]},s))})]})}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20 bg-muted/20",children:i.jsxs("div",{className:"container px-4 sm:px-6 text-center",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-6",children:e("forCreators.ctaTitle")}),i.jsx("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8",children:e("forCreators.ctaSubtitle")}),i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs("a",{href:"https://app.heroshots.ai/login",children:[i.jsx(wt,{className:"mr-2 h-5 w-5"}),e("forCreators.createAvatar")]})})]})})]}),i.jsx(ze,{})]})},YG=()=>{const{t:e}=we(),t=[{icon:bo,title:e("talentPage.createBrief"),description:e("talentPage.createBriefDesc")},{icon:bo,title:e("talentPage.notifyTalent"),description:e("talentPage.notifyDesc")},{icon:es,title:e("talentPage.generateApprove"),description:e("talentPage.generateDesc")},{icon:Dd,title:e("talentPage.autoRewards"),description:e("talentPage.autoRewardsDesc")}],a=e("talentPage.brandBenefits",{returnObjects:!0}),n=e("talentPage.creatorBenefits",{returnObjects:!0}),r=e("talentPage.transparencyItems",{returnObjects:!0});return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("talentPage.seoTitle","Models & Creator Royalties"),description:e("talentPage.seoDesc","Turn yourself into an AI avatar. License your digital likeness to brands and earn royalties every time your avatar generates content."),canonical:"https://heroshots.ai/talent",jsonLd:Le([{name:"Models",path:"/talent"}])}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsxs("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-bold mb-6",children:[e("talentPage.title")," ",i.jsx("span",{className:"text-gradient",children:e("talentPage.highlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto",children:e("talentPage.subtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-4 gap-6 mb-16",children:t.map((o,s)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(Ze,{children:[i.jsx(o.icon,{className:"h-10 w-10 text-primary mb-4"}),i.jsx(Xe,{className:"text-lg",children:o.title}),i.jsx(ma,{children:o.description})]})},s))}),i.jsxs("div",{className:"grid md:grid-cols-2 gap-8 max-w-5xl mx-auto mb-16",children:[i.jsxs(re,{className:"shadow-elegant",children:[i.jsxs(Ze,{children:[i.jsx(pi,{className:"h-10 w-10 text-primary mb-4"}),i.jsx(Xe,{children:e("talentPage.forBrands")})]}),i.jsx(ie,{children:i.jsx("ul",{className:"space-y-3 text-muted-foreground",children:a.map((o,s)=>i.jsxs("li",{children:["⢠",o]},s))})})]}),i.jsxs(re,{className:"shadow-elegant",children:[i.jsxs(Ze,{children:[i.jsx(Dd,{className:"h-10 w-10 text-primary mb-4"}),i.jsx(Xe,{children:e("talentPage.forCreators")})]}),i.jsx(ie,{children:i.jsx("ul",{className:"space-y-3 text-muted-foreground",children:n.map((o,s)=>i.jsxs("li",{children:["⢠",o]},s))})})]})]}),i.jsxs(re,{className:"max-w-4xl mx-auto bg-muted/30",children:[i.jsx(Ze,{children:i.jsx(Xe,{children:e("talentPage.transparencyTitle")})}),i.jsxs(ie,{children:[i.jsx("p",{className:"text-muted-foreground mb-4",children:e("talentPage.transparencyDesc")}),i.jsx("ul",{className:"space-y-2 text-muted-foreground",children:r.map((o,s)=>i.jsxs("li",{children:["⢠",o]},s))})]})]}),i.jsx("div",{className:"text-center mt-12",children:i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("talentPage.launchProgram")})})})]})}),i.jsx(ze,{})]})},JG=()=>{const{t:e}=we(),t=[{icon:UN,title:e("docs.auth"),description:e("docs.authDesc"),href:"#authentication"},{icon:lC,title:e("docs.endpoints"),description:e("docs.endpointsDesc"),href:"#endpoints"},{icon:bo,title:e("integrations.cardClaudeTitle"),description:e("integrations.cardClaudeDesc"),href:"/integrations/claude"},{icon:xa,title:e("integrations.cardAmazonTitle"),description:e("integrations.cardAmazonDesc"),href:"/product/amazon-import"},{icon:zr,title:e("sdks.docsCardTitle"),description:e("sdks.docsCardDesc"),href:"/sdks"}];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("docs.seoTitle","API Documentation"),description:e("docs.seoDesc","Integrate HeroShots AI UGC generation into your workflow. Authentication, endpoints, and official SDK references."),canonical:"https://heroshots.ai/docs",jsonLd:Le([{name:"Docs",path:"/docs"}
4863])}),i.jsx(Ee,{}),i.jsx("section",{className:"gradient-subtle py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container",children:[i.jsxs("div",{className:"text-center mb-16",children:[i.jsxs("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-bold mb-6",children:[e("docs.title")," ",i.jsx("span",{className:"text-gradient",children:e("docs.highlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto",children:e("docs.subtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-2 gap-8 max-w-4xl mx-auto mb-16",children:t.map((a,n)=>i.jsxs(re,{className:"border-border/50 hover:shadow-elegant transition-all",children:[i.jsxs(Ze,{children:[i.jsx(a.icon,{className:"h-10 w-10 text-primary mb-4"}),i.jsx(Xe,{children:a.title}),i.jsx(ma,{children:a.description})]}),i.jsx(ie,{children:i.jsx(H,{variant:"outline",asChild:!0,children:a.href.startsWith("#")?i.jsx("a",{href:a.href,children:e("docs.viewDocs")}):i.jsx(M,{to:a.href,children:e("docs.viewDocs")})})})]},n))}),i.jsxs(re,{className:"max-w-4xl mx-auto shadow-elegant",children:[i.jsxs(Ze,{children:[i.jsx(Xe,{className:"text-2xl",children:e("docs.quickStart")}),i.jsx(ma,{children:e("docs.quickStartDesc")})]}),i.jsxs(ie,{className:"space-y-6",children:[i.jsxs("div",{id:"authentication",className:"scroll-mt-24",children:[i.jsx("h3",{className:"font-semibold mb-2",children:e("docs.step1")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:e("docs.step1Desc")}),i.jsx("div",{className:"bg-muted p-4 rounded-lg font-mono text-sm",children:"Authorization: Bearer YOUR_API_KEY"})]}),i.jsxs("div",{id:"endpoints",className:"scroll-mt-24",children:[i.jsx("h3",{className:"font-semibold mb-2",children:e("docs.step2")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:e("docs.step2Desc")}),i.jsx("div",{className:"bg-muted p-4 rounded-lg font-mono text-sm overflow-x-auto",children:`POST https://app.heroshots.ai/api/v1/image/generate 4864{ 4865 "person": { "type": "avatar", "avatar_id": "avatar_123" }, 4866 "product": { "image_url": "https://cdn.example.com/product.jpg" }, 4867 "prompt": { "mode": "photo", "text": "Summer vibes" } 4868}`})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-2",children:e("docs.step3")}),i.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:e("docs.step3Desc")}),i.jsx("div",{className:"bg-muted p-4 rounded-lg font-mono text-sm",children:"GET https://app.heroshots.ai/api/v1/image/status/:generation_id"})]}),i.jsx("div",{className:"flex gap-4 pt-4",children:i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx(M,{to:"/sdks",children:e("docs.viewSdk")})})})]})]})]})}),i.jsx(ze,{})]})},QG=()=>{const{t:e}=we(),t=[{key:"catGeneral",icon:i.jsx(PN,{className:"h-4 w-4"}),questions:[1,2,3,4]},{key:"catPricing",icon:i.jsx(NN,{className:"h-4 w-4"}),questions:[5,6,7,8,9,10,11]},{key:"catContent",icon:i.jsx(Ag,{className:"h-4 w-4"}),questions:[12,13,14,15,16]},{key:"catCreators",icon:i.jsx(Ha,{className:"h-4 w-4"}),questions:[17,18,19,20]},{key:"catTech",icon:i.jsx(jN,{className:"h-4 w-4"}),questions:[21,22,23,24]},{key:"catPrivacy",icon:i.jsx(es,{className:"h-4 w-4"}),questions:[25,26,27,28]}],[a,n]=f.useState(null),r=a?t.filter(d=>d.key===a):t,o=t.flatMap(d=>d.questions.map(u=>({question:e(`faq.q${u}`),answer:e(`faq.a${u}`)}))),s=[1,2,3,4,5].map(d=>({question:e(`faqIntegrations.q${d}`),answer:e(`faqIntegrations.a${d}`)})),c={"@context":"https://schema.org","@type":"FAQPage",mainEntity:[...o,...s].map(d=>({"@type":"Question",name:d.question,acceptedAnswer:{"@type":"Answer",text:d.answer}}))};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("faq.seoTitle","FAQ â Frequently Asked Questions"),description:e("faq.seoDesc","Find answers to common questions about HeroShots AI UGC platform: pricing, creator royalties, content quality, integrations, and privacy."),canonical:"https://heroshots.ai/faq",jsonLd:[c,Le([{name:"FAQ",path:"/faq"}])]}),i.jsx(Ee,{}),i.jsx("section",{className:"py-10 sm:py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center mb-10 sm:mb-12",children:[i.jsxs("h1",{className:"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6",children:[e("faq.title")," ",i.jsx("span",{className:"text-gradient",children:e("faq.highlight")})]}),i.jsx("p",{className:"text-base sm:text-lg text-muted-foreground",children:e("faq.subtitle")})]}),i.jsxs("div",{className:"flex flex-wrap gap-2 justify-center mb-8 sm:mb-10",children:[i.jsx(H,{variant:a===null?"default":"outline",size:"sm",onClick:()=>n(null),className:"text-xs sm:text-sm",children:(e("faq.catGeneral").replace(/^./,""),"All")}),t.map(d=>i.jsxs(H,{variant:a===d.key?"default":"outline",size:"sm",onClick:()=>n(a===d.key?null:d.key),className:"gap-1.5 text-xs sm:text-sm",children:[d.icon,e(`faq.${d.key}`)]},d.key))]}),r.map(d=>i.jsxs("div",{className:"mb-8",children:[i.jsxs("h2",{className:"text-lg sm:text-xl font-semibold mb-4 flex items-center gap-2",children:[d.icon,e(`faq.${d.key}`)]}
4868),i.jsx(Co,{type:"single",collapsible:!0,className:"w-full space-y-3",children:d.questions.map(u=>i.jsxs(Sr,{value:`item-${u}`,className:"border border-border rounded-lg px-4 sm:px-6 bg-card",children:[i.jsx(Ar,{className:"text-left hover:no-underline py-4",children:i.jsx("span",{className:"font-semibold text-sm sm:text-base",children:e(`faq.q${u}`)})}),i.jsx(Pr,{className:"text-muted-foreground text-sm pt-1 pb-4",children:e(`faq.a${u}`)})]},u))})]},d.key)),a===null&&i.jsxs("div",{className:"mb-8",children:[i.jsxs("h2",{className:"text-lg sm:text-xl font-semibold mb-4 flex items-center gap-2",children:[i.jsx(cC,{className:"h-4 w-4"}),e("integrations.badge")]}),i.jsx(Co,{type:"single",collapsible:!0,className:"w-full space-y-3",children:s.map((d,u)=>i.jsxs(Sr,{value:`int-${u}`,className:"border border-border rounded-lg px-4 sm:px-6 bg-card",children:[i.jsx(Ar,{className:"text-left hover:no-underline py-4",children:i.jsx("span",{className:"font-semibold text-sm sm:text-base",children:d.question})}),i.jsx(Pr,{className:"text-muted-foreground text-sm pt-1 pb-4",children:d.answer})]},u))})]}),i.jsxs("div",{className:"mt-12 text-center",children:[i.jsx("p",{className:"text-muted-foreground mb-4",children:e("faq.stillQuestions")}),i.jsx("a",{href:"mailto:[email protected]",className:"text-brand-secondary hover:underline font-medium",children:e("faq.contactSupport")})]})]})}),i.jsx(ze,{})]})},kp=({block:e})=>e.kind==="p"?i.jsx("p",{className:"text-muted-foreground leading-relaxed",dangerouslySetInnerHTML:{__html:e.text}}):e.kind==="h3"?i.jsx("h3",{className:"text-xl font-semibold mt-6 mb-2",children:e.text}):e.kind==="ol"?i.jsx("ol",{className:"list-decimal list-outside space-y-2 text-muted-foreground ml-6",children:e.items.map((t,a)=>i.jsx("li",{dangerouslySetInnerHTML:{__html:t}},a))}):i.jsx("ul",{className:"list-disc list-outside space-y-2 text-muted-foreground ml-6",children:e.items.map((t,a)=>i.jsx("li",{dangerouslySetInnerHTML:{__html:t}},a))}),ih=({doc:e,showBindingNotice:t})=>{const{t:a}=we();return i.jsxs("div",{className:"container max-w-3xl px-4 sm:px-6 print:max-w-none",children:[i.jsxs("header",{className:"mb-10",children:[i.jsx("h1",{className:"text-3xl sm:text-4xl font-display font-bold mb-3",children:e.title}),e.subtitle?i.jsx("p",{className:"text-base text-muted-foreground mb-4",children:e.subt
4868itle}):null,i.jsxs("p",{className:"text-sm text-muted-foreground",children:[a("legal.lastUpdated"),": ",i.jsx("strong",{children:e.lastUpdated})," · ",a("legal.version")," ",e.version]}),t?i.jsx("p",{className:"mt-4 text-xs uppercase tracking-wider font-mono text-brand-secondary border border-brand-secondary/40 rounded-md px-3 py-2 inline-block",children:a("legal.bindingNotice")}):null]}),e.intro&&e.intro.length>0?i.jsx("section",{className:"space-y-4 mb-10",children:e.intro.map((n,r)=>i.jsx(kp,{block:n},r))}):null,e.sections.length>3?i.jsxs("nav",{"aria-label":a("legal.toc"),className:"mb-10 p-5 rounded-lg border border-border/40 bg-muted/20 print:hidden",children:[i.jsx("h2",{className:"text-sm uppercase tracking-wider font-mono text-muted-foreground mb-3",children:a("legal.toc")}),i.jsx("ol",{className:"list-decimal list-inside text-sm space-y-1.5",children:e.sections.map(n=>i.jsx("li",{children:i.jsx("a",{href:`#${n.id}`,className:"text-foreground/80 hover:text-primary transition-colors",children:n.title})},n.id))})]}):null,i.jsx("div",{className:"space-y-10",children:e.sections.map(n=>i.jsxs("section",{id:n.id,className:"scroll-mt-24",children:[i.jsx("h2",{className:"text-2xl font-semibold mb-4",children:n.title}),i.jsx("div",{className:"space-y-4",children:n.body.map((r,o)=>i.jsx(kp,{block:r},o))})]},n.id))}),e.closing&&e.closing.length>0?i.jsx("section",{className:"space-y-4 mt-12 pt-8 border-t border-border/40",children:e.closing.map((n,r)=>i.jsx(kp,{block:n},r))}):null]})},ZG={title:"Termini e Condizioni d'uso della Piattaforma",subtitle:"Fancy Capital S.r.l. â servizio di generazione contenuti audiovisivi tramite intelligenza artificiale (piattaforma HeroShots).",lastUpdated:"28 maggio 2026",version:"1.0",sections:[{id:"art-1",title:"Articolo 1 â Definizioni",body:[{kind:"p",text:"Nei presenti Termini e Condizioni («T&C»), i seguenti termini hanno il significato di seguito indicato:"},{kind:"ul",items:["<strong>Fancy Capital o la Piattaforma</strong>: Fancy Capital S.r.l., con sede legale in Albino (BG), Via Crespi 25, CAP 24021, C.F. e P.IVA 04763600162, REA BG-487411, PEC [email protected].","<strong>Cliente</strong>: qualunque persona fisica o giuridica che si registra alla Piattaforma per utilizzare i Servizi, indipendentemente dall'attivazione di un piano a pagamento.","<strong>Cliente Azienda</strong>: Cliente che si registra in qualità di persona giuridica (società , ente, professionista titolare di P.IVA).","<strong>Cliente Consumatore</strong>: Cliente persona fisica che agisce per scopi estranei all'attività imprenditoriale, commerciale, artigianale o professionale eventualmente svolta, ai sensi dell'art. 3 del D.lgs. 206/2005.","<strong>Model</strong>: persona fisica che si registra alla Piattaforma per offrire il proprio volto sul marketplace. I Model sono disciplinati dal Contratto Marketplace Model e non sono oggetto dei presenti T&C, salvo per i profili di interazione con il Cliente.","<strong>Servizi</strong>: l'insieme delle funzionalità rese disponibili tramite la Piattaforma, incluse la generazione di contenuti audiovisivi tramite AI, l'accesso al marketplace dei Model, l'importazione di Model BYO, la gestione di crediti, la fatturazione e l'assistenza.","<strong>Contenuto Generato</strong>: qualsiasi output audiovisivo (immagine, video, animazione) prodotto tramite la Piattaforma su richiesta del Cliente.","<strong>Avatar Virtuale</strong>: volto generato dall'AI o di fantasia, non riconducibile a una persona fisica reale specifica.","<strong>Model Marketplace</strong>: Model registrato come utente della Piattaforma e disponibile alle Aziende tramite il marketplace.","<strong>Model BYO (Bring Your Own)</strong>: persona fisica esterna alla Piattaforma il cui volto viene caricato dal Cliente Azienda previa fornitura di liberatoria firmata e copia del documento d'identità .","<strong>Dashboard</strong>: area riservata del Cliente all'interno della Piattaforma, accessibile previa autenticazione, che contiene la Configurazione Attiva di piano, crediti, fatturazione, percentuali e condizioni economiche
4868correnti.","<strong>Configurazione Attiva</strong>: il complesso delle condizioni economiche e funzionali sottoscritte dal Cliente attraverso la Dashboard al momento della registrazione, dell'attivazione di un abbonamento o dell'acquisto di crediti. Costituisce parte integrante del contratto tra le Parti.","<strong>AUP</strong>: Acceptable Use Policy, documento accessibile dalla Dashboard e dal sito di Fancy Capital, parte integrante dei presenti T&C.","<strong>Byteplus</strong>: fornitore terzo del modello AI generativo che alimenta le funzionalità di generazione della Piattaforma. Fancy Capital agisce come tool platform e trasmette a Byteplus le richieste di generazione del Cliente."]}]},{id:"art-2",title:"Articolo 2 â Oggetto del contratto",body:[{kind:"p",text:"2.1 â I presenti T&C disciplinano l'accesso e l'utilizzo dei Servizi della Piattaforma da parte del Cliente."},{kind:"p",text:"2.2 â Mediante la registrazione, il Cliente accetta integralmente i presenti T&C, l'AUP, la Privacy Policy e, ove applicabile, gli ulteriori documenti contrattuali specifici (Manleva Volti Reali per uso di Model BYO)."},{kind:"p",text:"2.3 â Tutte le condizioni economiche dei Servizi (prezzi, percentuali, tariffe per crediti, costi per generazione, costi per download, soglie di abbonamento, eventuali sconti) sono riportate nella Dashboard del Cliente nell'area dedicata alla Configurazione Attiva e si intendono sottoscritte dal Cliente nel momento in cui questi attiva il piano, acquista crediti o esegue qualsiasi altra azione di acquisto. Il Cliente è tenuto a verificare la Configurazione Attiva prima di confermare ogni acquisto."},{kind:"p",text:"2.4 â Fancy Capital si riserva la facoltà di modificare la Configurazione Attiva secondo i termini di cui all'art. 16."}]},{id:"art-3",title:"Articolo 3 â Registrazione e creazione dell'account",body:[{kind:"p",text:"3.1 â La registrazione alla Piattaforma è gratuita e non comporta, di per sé, alcun obbligo di pagamento."},{kind:"p",text:"3.2 â Per registrarsi, il Cliente deve fornire informazioni veritiere, accurate e aggiornate:"},{kind:"ul",items:["<strong>Cliente Azienda</strong>: denominazione sociale, C.F./P.IVA, indirizzo sede legale, dati del legale rappresentante, email di un dominio aziendale, eventuali ulteriori informazioni richieste dalla Piattaforma.","<strong>Cliente Consumatore</strong>: nome, cognome, indirizzo email, eventuali ulteriori informazioni richieste dalla Piattaforma."]},{kind:"p",text:"3.3 â La registrazione è consentita unicamente a soggetti che abbiano compiuto il diciottesimo anno di età . Fancy Capital si riserva il diritto di richiedere, in qualsiasi momento, la prova della maggiore età ."},{kind:"p",text:"3.4 â Il Cliente è responsabile della riservatezza delle proprie credenziali e di ogni attività svolta tramite il proprio account; comunica tempestivamente a Fancy Capital ogni accesso non autorizzato o sospetto."},{kind:"p",text:"3.5 â Fancy Capital si riserva il diritto di rifiutare una registrazione, sospendere l'account o richiedere ulteriori informazioni qualora: (a) le informazioni risultino incomplete, false o non verificabili; (b) il Cliente risulti localizzato in un territorio non servito (art. 12); (c) sussistano indizi di violazione dei presenti T&C o dell'AUP."}]},{id:"art-4",title:"Articolo 4 â Descrizione dei Servizi",body:[{kind:"p",text:"4.1 â La Piattaforma consente al Cliente di:"},{kind:"ul",items:["generare contenuti audiovisivi tramite intelligenza artificiale, utilizzando come base un Avatar Virtuale, un Model Marketplace o un Model BYO;","accedere a una libreria di asset preset (Avatar Virtuali e Model Marketplace);","importare Model BYO secondo la procedura di cui all'art. 6;","acquistare crediti o sottoscrivere abbonamenti secondo la Configurazione Attiva visibile in Dashboard;","scaricare i Contenuti Generati una volta approvati (ove applicabile);","accedere a un sistema di assistenza e supporto."]},{kind:"p",text:"4.2 â La Piattaforma utilizza il modello AI di Byteplus. Il Cliente accetta che la qualità , la disponibilità e le specifiche tecniche dei Servizi dipendono in parte dall'infrastruttura di Byteplus e di altri fornitori, e che Fancy Capital opera nei limiti di quanto reso disponibile da tali fornitori."},{kind:"p",text:"4.3 â La generazione di un Contenuto è subordinata a controlli di moderazione automatica (e, ove necessario, umana). La Piattaforma può rifiutare di generare, mostrare o consegnare un Contenuto qualora rilevi una violazione dell'AUP, senza che ciò dia diritto al Cliente ad alcun rimborso, indennizzo o risarcimento per quel singolo Contenuto."}]},{id:"art-5",title:"Articolo 5 â Utilizzo del marketplace Model",body:[{kind:"p",text:"5.1 â La Piattaforma mette a disposizione del Cliente un marketplace di Model registrati, persone fisiche che hanno acconsentito a offrire il proprio volto per la generazione di Contenuti."},{kind:"p",text:"5.2 â Nessun Contenuto Generato che raffiguri il volto di un Model Marketplace può essere reso disponibile al Cliente senza la preventiva approvazione esplicita del Model. Il Cliente prende atto che:"},{kind:"ul",items:["la generazione di un Contenuto non implica automaticamente la sua disponibilità per il download;","il Model può rifiutare, modificare o richiedere la rimozione del Contenuto;","il Model può, in qualsiasi momento, revocare la propria disponibilità per generazioni future, salve quelle già approvate."]},{kind:"p",text:"5.3 â Il Cliente si impegna a utilizzare i Contenuti Generati che raffigurano un Model Marketplace nel rispetto dell'approvazione concessa e dei limiti di uso indicati in fase di approvazione (territoriali, temporali, settoriali)."}]},{id:"art-6",title:"Articolo 6 â Model BYO (Bring Your Own)",body:[{kind:"p",text:"6.1 â Il Cliente Azienda può importare il volto di un soggetto terzo (Model BYO) previa fornitura di:"},{kind:"ul",items:["liberatoria firmata dal soggetto raffigurato, conforme al format messo a disposizione da Fancy Capital;","copia del documento d'identità in corso di validità del Model BYO;","validazione positiva di tale documentazione da parte del team compliance di Fancy Capital."]},{kind:"p",text:"6.2 â La funzionalità di importazione Model BYO è <strong>non disponibile ai Clienti Consumatori</strong>, in considerazione dei profili di rischio legale connessi all'uso di immagini di terzi nella generazione AI."},{kind:"p",text:"6.3 â Il Cliente Azienda dichiara e garantisce, sotto la propria esclusiva responsabilità , che la documentazione fornita ai sensi dell'art. 6.1 è autentica, completa e veritiera, e che il consenso del Model BYO è stato ottenuto liberamente, in maniera specifica, informata e revocabile, in conformità al GDPR e al diritto d'immagine."},{kind:"p",text:"6.4 â Fancy Capital si riserva il diritto di rifiutare o sospendere l'utilizzo di un Model BYO qualora la documentazione presenti anomalie, risulti incompleta o sussistano motivi di sospetto."}]},{id:"art-7",title:"Articolo 7 â Abbonamenti, crediti e pagamenti",body:[{kind:"p",text:"7.
48681 â I Servizi sono erogati secondo i piani e le modalità di pagamento descritti nella Configurazione Attiva visibile in Dashboard. I piani possono prevedere abbonamenti periodici (mensili, annuali), pacchetti di crediti prepagati, ovvero combinazioni delle due modalità ."},{kind:"p",text:"7.2 â Gli importi sono fatturati anticipatamente. I crediti acquistati hanno la durata di validità indicata nella Configurazione Attiva e non sono rimborsabili, salvi i casi imperativamente previsti dalla legge (incluso il diritto di recesso del Cliente Consumatore di cui all'art. 10, nei limiti ivi indicati)."},{kind:"p",text:"7.3 â In caso di mancato pagamento alla scadenza, Fancy Capital può sospendere l'accesso ai Servizi senza preavviso, fatto salvo il diritto al recupero degli importi dovuti e degli interessi di mora ai sensi del D.lgs. 231/2002 per i Clienti Azienda."},{kind:"p",text:"7.4 â Le modalità di pagamento sono gestite da provider terzi (es. Stripe). Fancy Capital non conserva i dati completi della carta di credito sui propri server."}]},{id:"art-8",title:"Articolo 8 â Uso consentito e Acceptable Use Policy",body:[{kind:"p",text:"8.1 â Il Cliente si impegna a utilizzare la Piattaforma nel rispetto dell'AUP, accessibile dalla Dashboard e dal sito web di Fancy Capital, che costituisce parte integrante dei presenti T&C."},{kind:"p",text:"8.2 â In particolare, il Cliente si impegna a <strong>NON</strong> utilizzare la Piattaforma per:"},{kind:"ul",items:["generare contenuti pedopornografici (CSAM), violenti, terroristici, di apologia di reato, di odio razziale, religioso o di genere;","generare contenuti sessuali o sessualmente suggestivi raffiguranti persone identificabili (Model Marketplace, Model BYO o terzi);","generare contenuti che impersonifichino persone reali al fine di ingannare il pubblico, commettere frodi, diffamare o ledere l'onore e la reputazione altrui («deepfake illegittimi»);","generare contenuti riguardanti personalità politiche, capi di Stato, magistrati, autorità religiose o altre figure pubbliche, salvo specifico ed esplicito consenso scritto;","tentare di aggirare, manomettere o disattivare le misure di sicurezza, moderazione, watermarking, geo-restrizione e tracciabilità ;","qualsiasi altro uso vietato indicato nell'AUP."]},{kind:"p",text:"8.3 â La violazione dell'AUP comporta le conseguenze ivi previste, ivi inclusa la sospensione o chiusura immediata dell'account."}]},{id:"art-9",title:"Articolo 9 â Diritti sui Contenuti Generati",body:[{kind:"p",text:"9.1 â Salvo quanto diversamente previsto in relazione ai contenuti raffiguranti Model Marketplace o Model BYO, i Contenuti Generati sono concessi in licenza al Cliente per l'uso commerciale e non commerciale, nei limiti della Configurazione Attiva e dell'AUP."},{kind:"p",text:"9.2 â I contenuti raffiguranti Model Marketplace possono essere utilizzati dal Cliente esclusivamente nei limiti dell'approvazione concessa dal Model (territoriali, temporali, settoriali) e nei limiti delle royalty pattuite."},{kind:"p",text:"9.3 â Fancy Capital non rivendica alcun diritto di proprietà intellettuale sui Contenuti Generati, salvo il diritto di utilizzo statistico aggregato e anonimo per finalità di miglioramento del Servizio."},{kind:"p",text:"9.4 â Il Cliente concede a Fancy Capital, per la sola durata del rapporto contrattuale e ai soli fini tecnici di erogazione dei Servizi, una licenza non esclusiva e gratuita ad ospitare, trasmettere ed elaborare i prompt, gli asset caricati e i Contenuti Generati nei limiti necessari all'erogazione dei Servizi."},{kind:"p",text:"9.5 â Il Cliente garantisce di disporre di tutti i diritti necessari per il caricamento sulla Piattaforma di eventuali asset propri (immagini, video, prompt, marchi) e si obbliga a tenere indenne Fancy Capital da qualsiasi pretesa di terzi al riguardo."}]},{id:"art-10",title:"Articolo 10 â Diritto di recesso del Cliente Consumatore",body:[{kind:"p",text:"10.1 â Ai sensi degli artt. 52 ss. del D.lgs. 206/2005 (Codice del Consumo), il Cliente Consumatore ha diritto di recedere dal contratto entro 14 giorni dalla conclusione, senza necessità di motivazione, scrivendo a [email protected]."},{kind:"p",text:"10.2 â Il Cliente Consumatore prende atto e accetta espressamente che, ai sensi dell'art. 59, lett. m) e o) del Codice del Consumo, il diritto di recesso <strong>
4868non si applica</strong>: (a) per la fornitura di contenuti digitali mediante supporto non materiale, qualora l'esecuzione sia iniziata con l'accordo espresso del Cliente Consumatore e con la sua accettazione del fatto che avrebbe perso il diritto di recesso (situazione tipica al primo utilizzo di un credito o alla generazione di un primo Contenuto); (b) per la fornitura di servizi pienamente eseguiti, se l'esecuzione è cominciata con l'accordo espresso del Consumatore e con l'accettazione della perdita del diritto di recesso."},{kind:"p",text:"10.3 â Al di fuori delle ipotesi di cui al precedente comma 10.2, in caso di recesso esercitato tempestivamente Fancy Capital rimborserà gli importi versati e non goduti entro 14 giorni dalla ricezione della comunicazione di recesso."}]},{id:"art-11",title:"Articolo 11 â Protezione dei dati personali",body:[{kind:"p",text:"11.1 â Il trattamento dei dati personali del Cliente è disciplinato dalla Privacy Policy, accessibile sul sito web di Fancy Capital e in Dashboard."},{kind:"p",text:"11.2 â Il Cliente prende atto che la Piattaforma può trattare categorie particolari di dati personali (in particolare dati biometrici) ai fini della verifica dell'identità e della generazione di Contenuti, esclusivamente sulla base di consenso esplicito ai sensi dell'art. 9 GDPR."},{kind:"p",text:"11.3 â Il Cliente è informato che la Piattaforma, per finalità di sicurezza e compliance dichiarate a Byteplus, attribuisce a ciascun Cliente un identificativo pseudonimo («safety_identifier») trasmesso a Byteplus al solo fine di consentire la tracciabilità di eventuali abusi e la cooperazione con autorità competenti."},{kind:"p",text:"11.4 â Fancy Capital conserva i log di utilizzo della Piattaforma per il periodo indicato nella Privacy Policy (minimo 180 giorni) per finalità di sicurezza, audit, prevenzione frodi e adempimento di obblighi legali."}]},{id:"art-12",title:"Articolo 12 â Limiti territoriali e di accesso",body:[{kind:"p",text:"12.1 â La Piattaforma non è disponibile in territori in cui la fornitura dei Servizi sia vietata da norme imperative o restrizioni regolatorie. In particolare, l'accesso <strong>non è consentito dalla Cina continentale</strong>. Fancy Capital implementa misure tecniche di geo-restrizione per far rispettare questa limitazione."},{kind:"p",text:"12.2 â Il Cliente si impegna a non utilizzare la Piattaforma da territori non consentiti né a fornire informazioni false circa la propria localizzazione."}]},{id:"art-13",title:"Articolo 13 â Disponibilità del Servizio e manutenzione",body:[{kind:"p",text:"13.1 â Fancy Capital si impegna a garantire la disponibilità del Servizio secondo standard ragionevoli del settore. Eventuali SLA specifici sono indicati nella Configurazione Attiva per i piani che li prevedono."},{kind:"p",text:"13.2 â Fancy Capital può sospendere il Servizio per attività di manutenzione programmata, dandone preavviso ove possibile, o per esigenze urgenti di sicurezza, senza che ciò dia diritto a indennizzi o risarcimenti."}]},{id:"art-14",title:"Articolo 14 â Limitazioni di responsabilità ",body:[{kind:"p",text:"14.1 â Nei limiti consentiti dalla legge applicabile, la responsabilità complessiva di Fancy Capital nei confronti del Cliente per qualsiasi titolo connesso ai presenti T&C è limitata agli importi effettivamente corrisposti dal Cliente nei 12 mesi precedenti l'evento generatore della responsabilità ."},{kind:"p",text:"14.2 â I limiti di cui sopra non si applicano nei casi di dolo o colpa grave di Fancy Capital, né nei casi inderogabilmente previsti dalla legge a tutela del Cliente Consumatore."},{kind:"p",text:"14.3 â Fancy Capital non risponde di danni indiretti, mancato guadagno, perdita di opportunità commerciali, perdita di dati o danni reputazionali del Cliente, salvi i casi inderogabilmente previsti dalla legge."},{kind:"p",text:"14.4 â Fancy Capital non risponde dell'uso che il Cliente faccia dei Contenuti Generati al di fuori della Piattaforma, né dell'uso che terzi facciano dei Contenuti pubblicati dal Cliente in propri canali."}]},{id:"art-15",title:"Articolo 15 â Sospensione e risoluzione",body:[{kind:"p",text:"15.1 â Fancy Capital si riserva il diritto di sospendere immediatamente, in tutto o in parte, l'accesso del Cliente alla Piattaforma in caso di:"},{kind:"ul",items:["violazione, anche solo sospetta o segnalata da terzi, dei presenti T&C, dell'AUP, della Privacy Policy o di altri documenti contrattuali;","mancato pagamento di importi dovuti;","chargeback ingiustificato;","attività anomale o abusive rilevate sulla Piattaforma;
4868","richiesta motivata di autorità competenti;","rischio per la sicurezza della Piattaforma o di terzi."]},{kind:"p",text:"15.2 â In caso di violazione confermata, Fancy Capital può risolvere il contratto di diritto ai sensi dell'art. 1456 c.c., trattenendo gli importi maturati e procedendo all'eventuale azione di risarcimento."},{kind:"p",text:"15.3 â Le decisioni di sospensione possono essere contestate scrivendo ad [email protected]: il team compliance riesamina il caso e fornisce risposta motivata entro 15 giorni."}]},{id:"art-16",title:"Articolo 16 â Modifiche ai T&C e alla Configurazione Attiva",body:[{kind:"p",text:"16.1 â Fancy Capital si riserva il diritto di modificare i presenti T&C e la Configurazione Attiva:"},{kind:"ul",items:["con preavviso minimo di 30 giorni per modifiche sostanziali, comunicate tramite email e/o notifica in Dashboard;","con preavviso ragionevole per modifiche non sostanziali (correzioni, aggiornamenti normativi, miglioramenti del servizio)."]},{kind:"p",text:"16.2 â Le modifiche entrano in vigore alla data indicata nella comunicazione. La prosecuzione dell'utilizzo della Piattaforma dopo l'entrata in vigore costituisce accettazione delle modifiche."},{kind:"p",text:"16.3 â In caso di disaccordo con modifiche sostanziali, il Cliente ha diritto di recedere dal contratto senza penali entro l'entrata in vigore delle stesse, scrivendo a [email protected]. Eventuali importi residui non goduti saranno rimborsati pro-rata."}]},{id:"art-17",title:"Articolo 17 â Cessione del contratto",body:[{kind:"p",text:"17.1 â Il Cliente non può cedere il presente contratto o i diritti che ne derivano a terzi senza il preventivo consenso scritto di Fancy Capital."},{kind:"p",text:"17.2 â Fancy Capital può cedere il contratto a società del proprio gruppo o nell'ambito di operazioni straordinarie (fusione, scissione, cessione d'azienda), dandone comunicazione al Cliente."}]},{id:"art-18",title:"Articolo 18 â Comunicazioni",body:[{kind:"p",text:"18.1 â Le comunicazioni a Fancy Capital sono inviate a [email protected] o, per le comunicazioni formali, alla PEC [email protected]."},{kind:"p",text:"18.2 â Le comunicazioni di Fancy Capital al Cliente sono inviate all'indirizzo email indicato in fase di registrazione o tramite notifica in Dashboard, e si intendono ricevute al momento dell'invio."}]},{id:"art-19",title:"Articolo 19 â Legge applicabile e foro competente",body:[{kind:"p",text:"19.1 â I presenti T&C sono regolati dalla legge italiana."},{kind:"p",text:"19.2 â Per qualsiasi controversia connessa ai presenti T&C è competente in via esclusiva il Foro di Bergamo, fatte salve le tutele inderogabili a favore del Cliente Consumatore, per il quale è competente il foro del luogo di residenza o di domicilio ai sensi del Codice del Consumo."},{kind:"p",text:"19.3 â Per le controversie con Clienti Consumatori è disponibile la piattaforma europea ODR all'indirizzo https://ec.europa.eu/consumers/odr/."}]},{id:"art-20",title:"Articolo 20 â Disposizioni finali",body:[{kind:"p",text:"20.1 â I presenti T&C, unitamente all'AUP, alla Privacy Policy e alla Configurazione Attiva, costituiscono l'intero accordo tra le Parti e prevalgono su ogni precedente intesa, comunicazione o accordo in materia."},{kind:"p",text:"20.2 â L'eventuale invalidità o inefficacia di una singola clausola non comporta l'invalidità delle restanti, che continueranno ad avere piena efficacia."},{kind:"p",text:"20.3 â La mancata o tardiva azione di Fancy Capital nel far valere un diritto derivante dai presenti T&C non costituisce rinuncia al diritto medesimo."}]}],closing:[{kind:"h3",text:"Accettazione dei T&C"},{kind:"p",text:"Il Cliente dichiara di aver letto e compreso i presenti T&C, l'AUP, la Privacy Policy e, ove applicabile, gli altri documenti contrattuali correlati. L'accettazione avviene digitalmente tramite spunta dell'apposita casella al momento della registrazione e/o di ogni successivo acquisto in Dashboard."},{kind:"h3",text:"Approvazione specifica ex artt. 1341 e 1342 c.c."},{kind:"p",text:"Il Cliente, ai sensi e per gli effetti degli articoli 1341 e 1342 del Codice Civile, dichiara di aver letto attentamente e di approvare specificamente le seguenti clausole: art. 4.3 (rifiuto di generazione e assenza di rimborso), art. 7 (pagamenti, non rimborsabilità dei crediti), art. 12 (limiti territoriali), art. 14 (limitazioni di responsabilità ), art. 15 (sospensione e risoluzione), art. 16 (modifiche ai T&C e alla Configurazione Attiva), art. 17 (cessione del contratto), art. 19 (foro competente)."}]}
4868,XG={title:"Terms and Conditions of the Platform",subtitle:"Fancy Capital S.r.l. â AI-powered audiovisual content generation service (HeroShots platform).",lastUpdated:"May 28, 2026",version:"1.0",sections:[{id:"art-1",title:"Article 1 â Definitions",body:[{kind:"p",text:"In these Terms and Conditions (âT&Csâ), the following terms have the meaning indicated below:"},{kind:"ul",items:["<strong>Fancy Capital or the Platform</strong>: Fancy Capital S.r.l., with registered office in Albino (BG), Via Crespi 25, 24021, Italian VAT and tax code 04763600162, REA BG-487411, certified email [email protected].","<strong>Customer</strong>: any natural or legal person who registers on the Platform to use the Services, irrespective of whether a paid plan has been activated.","<strong>Business Customer</strong>: Customer registering as a legal entity (company, organisation, professional with VAT number).","<strong>Consumer Customer</strong>: natural person acting for purposes outside their trade, business, craft or profession, as defined by Article 3 of Italian Legislative Decree 206/2005 (Consumer Code).","<strong>Model</strong>: natural person who registers on the Platform to offer their face on the marketplace. Models are governed by a separate Marketplace Model Agreement and are not the subject of these T&Cs, save for the points of interaction with the Customer.","<strong>Services</strong>: the set of features made available through the Platform, including AI-based content generation, access to the Model marketplace, BYO Model import, credit management, billing and support.","<strong>Generated Content</strong>: any audiovisual output (image, video, animation) produced through the Platform on the Customer's request.","<strong>Virtual Avatar</strong>: AI-generated or fictional face that does not correspond to a specific real person.","<strong>Marketplace Model</strong>: Model registered on the Platform and made available to Business Customers through the marketplace.","<strong>BYO (Bring Your Own) Model</strong>: a natural person external to the Platform whose face is uploaded by a Business Customer after providing a signed release and a copy of the Model's ID.","<strong>Dashboard</strong>: the Customer's authenticated area inside the Platform, which contains the Active Configuration (plan, credits, billing, percentages and current commercial terms).","<strong>Active Configuration</strong>: the commercial and functional terms accepted by the Customer through the Dashboard at registration, when activating a subscription or purchasing credits. It is an integral part of the agreement.","<strong>AUP</strong>: Acceptable Use Policy, available from the Dashboard and the Fancy Capital website, integral part of these T&Cs.","<strong>Byteplus</strong>: third-party provider of the generative AI model powering the Platform. Fancy Capital acts as a tool platform and transmits the Customer's generation requests to Byteplus."]}]},{id:"art-2",title:"Article 2 â Object of the agreement",body:[{kind:"p",text:"2.1 â These T&Cs govern access to and use of the Services."},{kind:"p",text:"2.2 â By registering, the Customer fully accepts these T&Cs, the AUP, the Privacy Policy and, where applicable, additional contractual documents (Real Face Release for BYO Models)."},{kind:"p",text:"2.3 â All commercial terms (prices, percentages, credit pricing, generation costs, download costs, subscription thresholds, discounts) are shown in the Customer's Dashboard under the Active Configuration and are deemed accepted when the Customer activates a plan, purchases credits or performs any other purchase action. The Customer must review the Active Configuration before confirming any purchase."},{kind:"p",text:"2.4 â Fancy Capital may modify the Active Configuration under the terms of Article 16."}]},{id:"art-3",title:"Article 3 â Registration and account creation",body:[{kind:"p",text:"3.1 â Registration is free of charge and does not, by itself, entail any payment obligation."},{kind:"p",text:"3.2 â To register, the Customer must provide truthful, accurate and up-to-date information:"},{kind:"ul",items:["<strong>Business Customer</strong>: company name, tax/VAT code, registered address, details of the legal representative, business email, and any further information requested by the Platform.","<strong>Consumer Customer</strong>: first name, last name, email, and any further information requested by the Platform."]},{kind:"p",text:"3.3 â Registration is reserved for persons aged 18 or older. Fancy Capital may require proof of age at any time."},{kind:"p",text:"3.4 â The Customer is responsible for keeping credentials confidential and for all activity carried out under their account, and shall promptly notify Fancy Capital of any unauthorised or suspicious access."},{kind:"p",text:"3.5 â Fancy Capital may refuse a registration, suspend an account or request further information where: (a) the information provided is incomplete, false or unverifiable; (b) the Customer is located in a territory not served by the Platform (see Article 12); (c) there are indications of breach of these T&Cs or of the AUP."}]},{id:"art-4",title:"Article 4 â Description of the Services",body:[{kind:"p",text:"4.1 â The Platform allows the Customer to:"},{kind:"ul",items:["generate AI audiovisual content based on a Virtual Avatar, a Marketplace Model or a BYO Model;","access a library of preset assets (Virtual Avatars and Marketplace Models);","import BYO Models according to the procedure in Article 6;","purchase credits or subscribe to plans per the Active Configuration shown in the Dashboard;","download approved Generated Content (where applicable);","access a support system."]},{kind:"p",text:"4.2 â The Platform uses Byteplus' AI model. The Customer acknowledges that quality, availability and technical specifications depend in part on Byteplus and other providers, and that Fancy Capital operates within the limits of what such providers make available."},{kind:"p",text:"4.3 â Content generation is subject to automated (and, where necessary, human) moderation. The Platform may refuse to generate, display or deliver Content where an AUP breach is detected, with no right to refund, indemnity or compensation for that single Content."}]},{id:"art-5",title:"Article 5 â Use of the Model marketplace",body:[{kind:"p",text:"5.1 â The Platform offers a marketplace of registered Models â natural persons who have consented to make their face available for content generation."},{kind:"p",text:"5.2 â No Generated Content depicting a Marketplace Model is made available to the Customer without the Model's prior explicit approval. The Customer acknowledges that:"},{kind:"ul",items:["generating a Content does not automatically make it available for download;","the Model may refuse, request modifications or removal of the Content;","the Model may withdraw availability for future generations at any time, save for approvals already granted."]},{kind:"p",text:"5.3 â The Customer shall use Generated Content depicting a Marketplace Model only within the approval granted (territorial, temporal, sector limits)."}]},{id:"art-6",title:"Article 6 â BYO (Bring Your Own) Models",body:[{kind:"p",text:"6.1 â The Business Customer may import the face of a third party (BYO Model) only after providing:"},{kind:"ul",items:["a release signed by the depicted person, compliant with the template provided by Fancy Capital;","a copy of the BYO Model's valid ID document;","positive validation of such documentation by Fancy Capital's compliance team."]},{kind:"p",text:"6.2 â BYO Model import is <strong>not available to Consumer Customers</strong>
4868, given the legal risks of using third-party imagery in AI generation."},{kind:"p",text:"6.3 â The Business Customer declares and warrants, on its sole responsibility, that the documentation under 6.1 is authentic, complete and truthful, and that the BYO Model's consent was obtained freely, specifically, informedly and is revocable, in compliance with the GDPR and image rights."},{kind:"p",text:"6.4 â Fancy Capital may refuse or suspend the use of a BYO Model where the documentation is anomalous, incomplete or suspicious."}]},{id:"art-7",title:"Article 7 â Subscriptions, credits and payments",body:[{kind:"p",text:"7.1 â Services are provided per the plans and payment terms in the Active Configuration in the Dashboard, including periodic subscriptions, prepaid credit packs, or combinations thereof."},{kind:"p",text:"7.2 â Fees are billed in advance. Purchased credits have the validity indicated in the Active Configuration and are non-refundable, save for mandatory consumer protection (including Consumer withdrawal under Article 10, within the limits indicated therein)."},{kind:"p",text:"7.3 â On non-payment Fancy Capital may suspend access without notice, without prejudice to recovery of sums due and default interest (Italian Legislative Decree 231/2002 for Business Customers)."},{kind:"p",text:"7.4 â Payments are handled by third-party providers (e.g. Stripe). Fancy Capital does not store full card data on its servers."}]},{id:"art-8",title:"Article 8 â Acceptable use and AUP",body:[{kind:"p",text:"8.1 â The Customer agrees to use the Platform in compliance with the AUP, integral part of these T&Cs."},{kind:"p",text:"8.2 â In particular, the Customer agrees <strong>NOT</strong> to use the Platform to:"},{kind:"ul",items:["generate child sexual abuse material (CSAM), violent, terrorist, hateful content;","generate sexual or sexually suggestive content depicting identifiable persons (Marketplace Models, BYO Models or third parties);","generate content impersonating real people to deceive the public, commit fraud, defame or harm reputation (âunlawful deepfakesâ);","generate content depicting political figures, heads of state, judges, religious authorities or other public figures, save for specific written consent;","attempt to bypass, tamper with or disable security, moderation, watermarking, geo-restriction or traceability measures;","any other use prohibited by the AUP."]},{kind:"p",text:"8.3 â Breach of the AUP entails the consequences set out therein, including immediate account suspension or closure."}]},{id:"art-9",title:"Article 9 â Rights on Generated Content",body:[{kind:"p",text:"9.1 â Save where otherwise provided for Marketplace or BYO Model content, Generated Content is licensed to the Customer for commercial and non-commercial use within the Active Configuration and the AUP."},{kind:"p",text:"9.2 â Content depicting a Marketplace Model may be used by the Customer only within the limits of the Model's approval (territorial, temporal, sectoral) and the agreed royalties."},{kind:"p",text:"9.3 â Fancy Capital claims no IP rights on Generated Content, save for aggregate, anonymous statistical use to improve the Service."},{kind:"p",text:"9.4 â The Customer grants Fancy Capital, for the duration of the contract and solely for the technical provision of the Services, a non-exclusive, royalty-free licence to host, transmit and process prompts, uploaded assets and Generated Content as needed."},{kind:"p",text:"9.5 â The Customer warrants holding all rights necessary to upload its assets (images, video, prompts, trademarks) and shall indemnify Fancy Capital against any third-party claim."}]},{id:"art-10",title:"Article 10 â Consumer right of withdrawal",body:[{kind:"p",text:"10.1 â Under Articles 52 ff. of the Italian Consumer Code (Legislative Decree 206/2005), the Consumer Customer has the right to withdraw within 14 days of contract conclusion, without giving reasons, by writing to [email protected]."},{kind:"p",text:"10.2 â The Consumer Customer expressly acknowledges that, pursuant to Article 59(m) and (o) of the Consumer Code, the right of withdrawal <strong>does not apply</strong>: (a) to the supply of digital content not on a tangible medium where performance has begun with the express consent of the Consumer and acknowledgement of the loss of the withdrawal right (typically on first use of a credit or first content generation); (b) to fully performed services where performance began with the Consumer's express consent and acknowledgement of the loss of the withdrawal right."},{kind:"p",text:"10.3 â Outside the cases in 10.2, valid withdrawal triggers a refund of amounts paid and not consumed, within 14 days of receipt of the notice."}]},{id:"art-11",title:"Article 11 â Personal data",body:[{kind:"p",text:"11.1 â Processing of the Customer's personal data is governed by the Privacy Policy, available on the website and in the Dashboard."},{kind:"p",text:"11.2 â The Customer acknowledges that the Platform may process special categories of personal data (in particular biometric data) for identity verification and content generation, solely on the basis of explicit consent under Article 9 GDPR."},{kind:"p",text:"11.3 â A pseudonymous identifier (âsafety_identifierâ) is generated and transmitted to Byteplus with each generation request, solely to enable traceability of misuse and cooperation with competent authorities."},{kind:"p",text:"11.4 â Usage logs are kept for at least 180 days for security, audit, fraud prevention and legal compliance."}]},{id:"art-12",title:"Article 12 â Territorial limits and access",body:[{kind:"p",text:"12.1 â The Platform is not available in territories where provision is prohibited by mandatory rules. In particular, access is <strong>not permitted from mainland China</strong>. Fancy Capital enforces this through geo-restriction."},{kind:"p",text:"12.2 â The Customer shall not use the Platform from prohibited territories or provide false information about their location."}]},{id:"art-13",title:"Article 13 â Service availability and maintenance",body:[{kind:"p",text:"13.1 â Fancy Capital commits to industry-reasonable availability standards. Specific SLAs, where applicable, are set out in the Active Configuration."},{kind:"p",text:"13.2 â The Service may be suspended for planned maintenance (with notice where possible) or urgent security needs, without right to indemnity or compensation."}]},{id:"art-14",title:"Article 14 â Limitations of liability",body:[{kind:"p",text:"14.1 â To the maximum extent allowed by applicable law, Fancy Capital's aggregate liability under these T&Cs is capped at the amounts paid by the Customer in the 12 months preceding the event giving rise to liability."},{kind:"p",text:"14.2 â The caps do not apply in cases of wilful misconduct or gross negligence of Fancy Capital, nor in cases mandatorily protected by law in favour of Consumer Customers."},{kind:"p",text:"14.3 â Fancy Capital shall not be liable for indirect damages, loss of profits, loss of business opportunities, loss of data or reputational damage, save where mandatorily provided by law."},{kind:"p",text:"14.4 â Fancy Capital is not liable for the use the Customer makes of Generated Content outside the Platform, nor for third-party use of Content published by the Customer on its own channels."}]},{id:"art-15",title:"Article 15 â Suspension and termination",body:[{kind:"p",text:"15.1 â Fancy Capital may immediately suspend, in whole or in part, the Customer's access in cases of:"},{kind:"ul",items:["breach (even suspected or reported) of these T&Cs, the AUP, the Privacy Policy or other contractual documents;","non-payment of amounts due;","unjustified chargeback;","abnormal or abusive activity detected on the Platform;","reasoned request by competent authorities;","risk to the security of the Platform or third parties."]},{kind:"p",text:"15.2 â On confirmed breach, Fancy Capital may terminate the contract under Article 1456 of the Italian Civil Code, retaining accrued amounts and pursuing damages."},{kind:"p",text:"15.3 â Suspension decisions may be appealed at [email protected]; the compliance team will provide a reasoned reply within 15 days."}]},{id:"art-16",title:"Article 16 â Changes to the T&Cs and Active Configuration",body:[{kind:"p",text:"16.1 â Fancy Capital may amend these T&Cs and the Active Configuration:"},{kind:"ul",items:["with at least 30 days' notice for material changes, communicated by email and/or Dashboard notification;","with reasonable notice for non-material changes (corrections, regulatory updates, improvements)."]},{kind:"p",text:"16.2 â Changes take effect on the date stated in the notice. Continued use after the effective date constitutes acceptance."},{kind:"p",text:"16.3 â In case of disagreement with material changes, the Customer may withdraw without penalty before the effective date by writing to [email protected]. Unused balances are refunded pro rata."}]},{id:"art-17",title:"Article 17 â Assignment",body:[{kind:"p",text:"17.1 â The Customer may not assign this contract or rights deriving therefrom to third parties without Fancy Capital's prior written consent."},{kind:"p",text:"17.2 â Fancy Capital may assign the contract to group companies or in the context of corporate transactions (merger, demerger, business transfer), giving notice to the Customer."}]},{id:"art-18",title:"Article 18 â Communications",body:[{kind:"p",text:"18.1 â Communications to Fancy Capital are sent to [email protected] or, for formal communications, to the certified email [email protected]."},{kind:"p",text:"18.2 â Communications by Fancy Capital to the Customer are sent to the email provided at registration or via Dashboard notification, and are deemed received at the time of sending."}]},{id:"art-19",title:"Article 19 â Governing law and jurisdiction",body:[{kind:"p",text:"19.1 â These T&Cs are governed by Italian law."},{kind:"p",text:"19.2 â Any dispute is subject to the exclusive jurisdiction of the Court of Bergamo, Italy, without prejudice to mandatory consumer protections under which Consumer Customers may seize the court of their place of residence or domicile."},{kind:"p",text:"19.3 â Consumer disputes may also use the European ODR platform at https://ec.europa.eu/consumers/odr/."}]},{id:"art-20",title:"Article 20 â Final provisions",body:[{kind:"p",text:"20.1 â These T&Cs, together with the AUP, the Privacy Policy and the Active Configuration, constitute the entire agreement and supersede prior understandings on the matter."},{kind:"p",text:"20.2 â Invalidity or unenforceability of any single clause does not affect the remaining clauses."},{kind:"p",text:"20.3 â Failure or delay by Fancy Capital in enforcing any right shall not constitute a waiver thereof."}]}],closing:[{kind:"h3",text:"Acceptance"},{kind:"p",text:"The Customer declares to have read and understood these T&Cs, the AUP, the Privacy Policy and, where applicable, related contractual documents. Acceptance occurs digitally by ticking the dedicated checkbox at registration and/or at each subsequent purchase in the Dashboard."},{kind:"h3",text:"Specific approval under Articles 1341 and 1342 of the Italian Civil Code"},{kind:"p",text:"The Customer, under Articles 1341 and 1342 of the Italian Civil Code, expressly approves the following clauses: 4.3 (generation refusal without refund), 7 (payments, non-refundability of credits), 12 (territorial limits), 14 (limitations of liability), 15 (suspension and termination), 16 (changes), 17 (assignment), 19 (jurisdiction)."}]},e6={title:"Términos y Condiciones de la Plataforma",subtitle:"Fancy Capital S.r.l. â Servicio de generación de contenido audiovisual asistido por IA (plataforma HeroShots).",lastUpdated:"Mayo 28, 2026",version:"1.0",sections:[{id:"art-1",title:"ArtÃculo 1 â Definiciones",body:[{kind:"p",text:"En los presentes Términos y Condiciones (âT&Câ), los siguientes términos tienen el significado que se indica a continuación:"},{kind:"ul",items:["<strong>Fancy Capital o la Plataforma</strong>: Fancy Capital S.r.l., con domicilio social en Albino (BG), Via Crespi 25, 24021, NIF y número de IVA italianos 04763600162, REA BG-487411, c
4868orreo electrónico certificado [email protected].","<strong>Cliente</strong>: cualquier persona fÃsica o jurÃdica que se registre en la Plataforma para utilizar los Servicios, independientemente de si ha activado un plan de pago.","<strong>Cliente Empresarial</strong>: Cliente que se registra como entidad jurÃdica (empresa, organización, profesional con número de IVA).","<strong>Cliente Consumidor</strong>: persona fÃsica que actúa con fines ajenos a su actividad comercial, empresarial, artesanal o profesional, tal como se define en el ArtÃculo 3 del Decreto Legislativo italiano 206/2005 (Código del Consumidor).","<strong>Modelo</strong>: persona fÃsica que se registra en la Plataforma para ofrecer su rostro en el marketplace. Los Modelos se rigen por un Acuerdo de Modelo de Marketplace separado y no son objeto de estos T&C, salvo en los puntos de interacción con el Cliente.","<strong>Servicios</strong>: el conjunto de funcionalidades puestas a disposición a través de la Plataforma, incluyendo la generación de contenido basado en IA, el acceso al marketplace de Modelos, la importación de Modelos Propios (BYO Model), la gestión de créditos, la facturación y el soporte.","<strong>Contenido Generado</strong>: cualquier resultado audiovisual (imagen, vÃdeo, animación) producido a través de la Plataforma a solicitud del Cliente.","<strong>Avatar Virtual</strong>: rostro generado por IA o ficticio que no corresponde a una persona real especÃfica.","<strong>Modelo de Marketplace</strong>: Modelo registrado en la Plataforma y puesto a disposición de los Clientes Empresariales a través del marketplace.","<strong>Modelo BYO (Bring Your Own)</strong>: persona fÃsica externa a la Plataforma cuyo rostro es cargado por un Cliente Empresarial tras presentar una autorización firmada y una copia del documento de identidad del Modelo.","<strong>Panel de Control (Dashboard)</strong>: el área autenticada del Cliente dentro de la Plataforma, que contiene la Configuración Activa (plan, créditos, facturación, porcentajes y condiciones comerciales actuales).","<strong>Configuración Activa</strong>: las condiciones comerciales y funcionales aceptadas por el Cliente a través del Panel de Control en el momento del registro, al activar una suscripción o al comprar créditos. Es parte integrante del acuerdo.","<strong>PAU</strong>: PolÃtica de Uso Aceptable (AUP), disponible en el Panel de Control y en el sitio web de Fancy Capital, parte integrante de estos T&C.","<strong>Byteplus</strong>: proveedor externo del modelo de IA generativa que alimenta la Plataforma. Fancy Capital actúa como plataforma de herramientas y transmite las solicitudes de generación del Cliente a Byteplus."]}]},{id:"art-2",title:"ArtÃculo 2 â Objeto del acuerdo",body:[{kind:"p",text:"2.1 â Los presentes T&C rigen el acceso y uso de los Servicios."},{kind:"p",text:"2.2 â Al registrarse, el Cliente acepta plenamente estos T&C, la PAU, la PolÃtica de Privacidad y, cuando corresponda, documentos contractuales adicionales (Autorización de Uso de Rostro Real para Modelos BYO)."},{kind:"p",text:"2.3 â Todas las condiciones comerciales (precios, porcentajes, precios de créditos, costes de generación, costes de descarga, umbrales de suscripción, descuentos) se muestran en el Panel de Control del Cliente bajo la Configuración Activa y se consideran aceptadas cuando el Cliente activa un plan, compra créditos o realiza cualquier otra acción de compra. El Cliente debe revisar la Configuración Activa antes de confirmar cualquier compra."},{kind:"p",text:"2.4 â Fancy Capital podrá modificar la Configuración Activa en los términos del ArtÃculo 16."}]},{id:"art-3",title:"ArtÃculo 3 â Registro y creación de cuenta",body:[{kind:"p",text:"3.1 â El registro es gratuito y no conlleva, por sà mismo, ninguna obligación de pago."},{kind:"p",text:"3.2 â Para registrarse, el Cliente debe proporcionar información veraz, precisa y actualizada:"},{kind:"ul",items:["<strong>Cliente Empresarial</strong>: razón social, código fiscal/IVA, domicilio social, datos del representante legal, correo electrónico empresarial y cualquier otra información solicitada por la Plataforma.","<strong>Cliente Consumidor</strong>: nombre, apellidos, correo electrónico y cualquier otra información solicitada por la Plataforma."]},{kind:"p",text:"3.3 â El registro está reservado a personas mayores de 18 años. Fancy Capital podrá solicitar prueba de edad en cualquier momento."},{kind:"p",text:"3.4 â El Cliente es responsable de mantener la confidencialidad de sus credenciales y de toda la actividad realizada bajo su cuenta, y deberá notificar de inmediato a Fancy Capital cualquier acceso no autorizado o sospechoso."},{kind:"p",text:"3.5 â Fancy Capital podrá denegar un registro, suspender una cuenta o solicitar información adicional cuando: (a) la información proporcionada sea incompleta, falsa o inverificable; (b) el Cliente se encuentre en un territorio no atendido por la Plataforma (véase ArtÃculo 12); (c) existan indicios de violación de estos T&C o de la PAU."}]},{id:"art-4",title:"ArtÃculo 4 â Descripción de los Servicios",body:[{kind:"p",text:"4.1 â La Plataforma permite al Cliente:"},{kind:"ul",items:["generar contenido audiovisual de IA basado en un Avatar Virtual, un Modelo de Marketplace o un Modelo BYO;","acceder a una biblioteca de activos preestablecidos (Avatares Virtuales y Modelos de Marketplace);","importar Modelos BYO según el procedimiento del ArtÃculo 6;
4868","comprar créditos o suscribirse a planes según la Configuración Activa mostrada en el Panel de Control;","descargar Contenido Generado aprobado (cuando corresponda);","acceder a un sistema de soporte."]},{kind:"p",text:"4.2 â La Plataforma utiliza el modelo de IA de Byteplus. El Cliente reconoce que la calidad, disponibilidad y especificaciones técnicas dependen en parte de Byteplus y otros proveedores, y que Fancy Capital opera dentro de los lÃmites de lo que dichos proveedores ponen a disposición."},{kind:"p",text:"4.3 â La generación de contenido está sujeta a moderación automatizada (y, cuando sea necesario, humana). La Plataforma puede negarse a generar, mostrar o entregar Contenido si se detecta una infracción de la PAU, sin derecho a reembolso, indemnización o compensación por ese Contenido individual."}]},{id:"art-5",title:"ArtÃculo 5 â Uso del marketplace de Modelos",body:[{kind:"p",text:"5.1 â La Plataforma ofrece un marketplace de Modelos registrados â personas fÃsicas que han consentido en poner su rostro a disposición para la generación de contenido."},{kind:"p",text:"5.2 â Ningún Contenido Generado que represente a un Modelo de Marketplace se pone a disposición del Cliente sin la aprobación explÃcita previa del Modelo. El Cliente reconoce que:"},{kind:"ul",items:["generar un Contenido no lo hace automáticamente disponible para su descarga;","el Modelo puede negarse, solicitar modificaciones o la eliminación del Contenido;","el Modelo puede retirar la disponibilidad para futuras generaciones en cualquier momento, salvo las aprobaciones ya concedidas."]},{kind:"p",text:"5.3 â El Cliente utilizará el Contenido Generado que represente a un Modelo de Marketplace únicamente dentro de la aprobación concedida (lÃmites territoriales, temporales, sectoriales)."}]},{id:"art-6",title:"ArtÃculo 6 â Modelos BYO (Bring Your Own)",body:[{kind:"p",text:"6.1 â El Cliente Empresarial puede importar el rostro de un tercero (Modelo BYO) únicamente después de proporcionar:"},{kind:"ul",items:["una autorización firmada por la persona representada, conforme a la plantilla proporcionada por Fancy Capital;","una copia del documento de identidad válido del Modelo BYO;","validación positiva de dicha documentación por parte del equipo de cumplimiento de Fancy Capital."]},{kind:"p",text:"6.2 â La importación de Modelos BYO <strong>no está disponible para Clientes Consumidores</strong>, dados los riesgos legales del uso de imágenes de terceros en la generación de IA."},{kind:"p",text:"6.3 â El Cliente Empresarial declara y garantiza, bajo su exclusiva responsabilidad, que la documentación indicada en el punto 6.1 es auténtica, completa y veraz, y que el consentimiento del Modelo BYO fue obtenido libremente, de forma especÃfica, informada y es revocable, en cumplimiento del RGPD y los derechos de imagen."},{kind:"p",text:"6.4 â Fancy Capital podrá denegar o suspender el uso de un Modelo BYO cuando la documentación sea anómala, incompleta o sospechosa."}]},{id:"art-7",title:"ArtÃculo 7 â Suscripciones, créditos y pagos",body:[{kind:"p",text:"7.1 â Los Servicios se prestan de acuerdo con los planes y las condiciones de pago de la Configuración Activa en el Panel de Control, incluidas suscripciones periódicas, paquetes de créditos prepago o combinaciones de los mismos."},{kind:"p",text:"7.2 â Las tarifas se facturan por adelantado. Los créditos comprados tienen la validez indicada en la Configuración Activa y no son reembolsables, salvo por protección obligatoria del consumidor (incluyendo el desistimiento del Consumidor en virtud del ArtÃculo 10, dentro de los lÃmites indicados en el mismo)."},{kind:"p",text:"7.3 â En caso de impago, Fancy Capital podrá suspender el acceso sin previo aviso, sin perjuicio de la recuperación de las sumas adeudadas y los intereses de demora (Decreto Legislativo italiano 231/2002 para Clientes empresariales)."},{kind:"p",text:"7.4 â Los pagos son gestionados por proveedores externos (ej. Stripe). Fancy Capital no almacena datos completos de tarjetas en sus servidores."}]},{id:"art-8",title:"ArtÃculo 8 â Uso aceptable y PAU",body:[{kind:"p",text:"8.1 â El Cliente se compromete a utilizar la Plataforma de conformidad con la PAU, parte integrante de estos T&C."},{kind:"p",text:"8.2 â En particular, el Cliente se compromete a <strong>NO</strong> utilizar la Plataforma para:"},{kind:"ul",items:["generar material de abuso sexual infantil (CSAM), contenido violento, terrorista o de odio;","generar contenido sexual o sexualmente sugerente que represente a personas identificables (Modelos de Marketplace, Modelos BYO o terceros);","generar contenido que suplante a personas reales para engañar al público, cometer fraude, difamar o dañar la reputación (âdeepfakes ilÃcitosâ);","generar contenido que represente a figuras polÃticas, jefes de estado, jueces, autoridades religiosas u otras figuras públicas, salvo con consentimiento escrito especÃfico;","intentar eludir, manipular o deshabilitar las medidas de seguridad, moderación, marca de agua, restricción geográfica o trazabilidad;","cualquier otro uso prohibido por la PAU."]},{kind:"p",text:"8.3 â La infracción de la PAU conlleva las consecuencias establecidas en la misma, incluyendo la suspensión o cierre inmediato de la cuenta."}]},{id:"art-9",title:"ArtÃculo 9 â Derechos sobre el Contenido Generado",body:[{kind:"p",text:"9.1 â Salvo que se disponga lo contrario para el contenido de Modelo de Marketplace o Modelo BYO, el Contenido Generado se licencia al Cliente para uso comercial y no comercial dentro de la Configuración Activa y la PAU."},{kind:"p",text:"9.2 â El Contenido que represente a un Modelo de Marketplace podrá ser utilizado por el Cliente únicamente dentro de los lÃmites de la aprobación del Modelo (territorial, temporal, sectorial) y las regalÃas acordadas."},{kind:"p",text:"9.3 â Fancy Capital no reclama derechos de propiedad intelectual sobre el Contenido Generado, salvo para el uso estadÃstico agregado y anónimo para mejorar el Servicio."},{kind:"p",text:"9.4 â El Cliente otorga a Fancy Capital, por la duración del contrato y únicamente para la prestación técnica de los Servicios, una licencia no exclusiva y libre de regalÃas para alojar, transmitir y procesar indicaciones (prompts), activos cargados y Contenido Generado según sea necesario."},{kind:"p",text:"9.5 â El Cliente garantiza que posee todos los derechos necesarios para cargar sus activos (imágenes, video, indicaciones, marcas comerciales) e indemnizará a Fancy Capital contra cualquier reclamación de terceros."}]},{id:"art-10",title:"ArtÃculo 10 â Derecho de desistimiento del Consumidor",body:[{kind:"p",text:"10.1 â Conforme a los ArtÃculos 52 y siguientes del Código del Consumidor italiano (Decreto Legislativo 206/2005), el Cliente Consumidor tiene derecho a de
4868sistir en un plazo de 14 dÃas desde la celebración del contrato, sin necesidad de justificación, dirigiéndose por escrito a [email protected]."},{kind:"p",text:"10.2 â El Cliente Consumidor reconoce expresamente que, de conformidad con el ArtÃculo 59(m) y (o) del Código del Consumidor, el derecho de desistimiento <strong>no se aplica</strong>: (a) al suministro de contenido digital no entregado en un soporte material cuando la ejecución ha comenzado con el consentimiento expreso del Consumidor y el reconocimiento de la pérdida del derecho de desistimiento (tÃpicamente con el primer uso de un crédito o la primera generación de contenido); (b) a los servicios totalmente ejecutados cuando la ejecución comenzó con el consentimiento expreso del Consumidor y el reconocimiento de la pérdida del derecho de desistimiento."},{kind:"p",text:"10.3 â Fuera de los casos del punto 10.2, el desistimiento válido implica el reembolso de las cantidades pagadas y no consumidas, en un plazo de 14 dÃas desde la recepción de la notificación."}]},{id:"art-11",title:"ArtÃculo 11 â Datos personales",body:[{kind:"p",text:"11.1 â El tratamiento de los datos personales del Cliente se rige por la PolÃtica de Privacidad, disponible en el sitio web y en el Panel de Control."},{kind:"p",text:"11.2 â El Cliente reconoce que la Plataforma puede tratar categorÃas especiales de datos personales (en particular datos biométricos) para la verificación de identidad y la generación de contenido, únicamente sobre la base de un consentimiento explÃcito según el ArtÃculo 9 del RGPD."},{kind:"p",text:"11.3 â Se genera y transmite un identificador seudónimo (âsafety_identifierâ) a Byteplus con cada solicitud de generación, únicamente para permitir la trazabilidad de usos indebidos y la cooperación con las autoridades competentes."},{kind:"p",text:"11.4 â Los registros de uso se conservan durante al menos 180 dÃas por motivos de seguridad, auditorÃa, prevención de fraudes y cumplimiento legal."}]},{id:"art-12",title:"ArtÃculo 12 â LÃmites territoriales y acceso",body:[{kind:"p",text:"12.1 â La Plataforma no está disponible en territorios donde su provisión esté prohibida por normas imperativas. En particular, el acceso <strong>no está permitido desde China continental</strong>. Fancy Capital impone esto mediante restricciones geográficas."},{kind:"p",text:"12.2 â El Cliente no utilizará la Plataforma desde territorios prohibidos ni proporcionará información falsa sobre su ubicación."}]},{id:"art-13",title:"ArtÃculo 13 â Disponibilidad del servicio y mantenimiento",body:[{kind:"p",text:"13.1 â Fancy Capital se compromete a cumplir los estándares de disponibilidad razonables de la industria. Los SLA especÃficos, cuando corresponda, se establecen en la Configuración Activa."},{kind:"p",text:"13.2 â El Servicio puede ser suspendido por mantenimiento programado (con aviso cuando sea posible) o por necesidades de seguridad urgentes, sin derecho a indemnización o compensación."}]},{id:"art-14",title:"ArtÃculo 14 â Limitaciones de responsabilidad",body:[{kind:"p",text:"14.1 â En la medida máxima permitida por la ley aplicable, la responsabilidad total de Fancy Capital en virtud de estos T&C se limita a las cantidades pagadas por el Cliente en los 12 meses anteriores al evento que dio origen a la responsabilidad."},{kind:"p",text:"14.2 â Los lÃmites no se aplican en casos de dolo o negligencia grave de Fancy Capital, ni en los casos protegidos obligatoriamente por la ley a favor de los Clientes Consumidores."},{kind:"p",text:"14.3 â Fancy Capital no será responsable de daños indirectos, pérdida de beneficios, pérdida de oportunidades comerciales, pérdida de datos o daños reputacionales, salvo que la ley lo disponga obligatoriamente."},{kind:"p",text:"14.4 â Fancy Capital no es responsable del uso que el Cliente haga del Contenido Generado fuera de la Plataforma, ni del uso por parte de terceros del Contenido publicado por el Cliente en sus propios canales."}]},{id:"art-15",title:"ArtÃculo 15 â Suspensión y resolución",body:[{kind:"p",text:"15.1 â Fancy Capital podrá suspender de inmediato, total o parcialmente, el acceso del Cliente en casos de:"},{kind:"ul",items:["incumplimiento (incluso sospechado o reportado) de estos T&C, la PAU, la PolÃtica de Privacidad u otros documentos contractuales;","impago de las cantidades debidas;","retrocesión injustificada;","actividad anormal o abusiva detectada en la Plataforma;","solicitud fundamentada de las autoridades competentes;","riesgo para la seguridad de la Plataforma o de terceros."]},{kind:"p",text:"15.2 â En caso de incumplimiento confirmado, Fancy Capital podrá resolver el contrato en virtud del ArtÃculo 1456 del Código Civil italiano, reteniendo las cantidades devengadas y reclamando daños y perjuicios."},{kind:"p",text:"15.3 â Las decisiones de suspensión podrán ser apeladas en [email protected]; el equipo de cumplimiento proporcionará una respuesta fundamentada en un plazo de 15 dÃas."}]},{id:"art-16",title:"ArtÃculo 16 â Modificaciones de los T&C y de la Configuración Activa",body:[{kind:"p",text:"16.1 â Fancy Capital podrá modificar estos T&C y la Configuración Activa:"},{kind:"ul",items:["con un preaviso mÃnimo de 30 dÃas para cambios sustanciales, comunicados por correo electrónico y/o notificación en el Panel de Control;","con un preaviso razonable para cambios no sustanciales (correcciones, actualizaciones regulatorias, mejoras)."]},{kind:"p",text:"16.2 â Los cambios entrarán en vigor en la fecha indicada en el aviso. El uso continuado después de la fecha efectiva constituye su aceptación."},{kind:"p",text:"16.3 â En caso de desacuerdo con cambios sustanciales, el Cliente podrá desistir sin penalización antes de la fecha efectiva dirigiéndose por escrito a [email protected]. Los saldos no utilizados serán reembolsados a prorrata."}]},{id:"art-17",title:"ArtÃculo 17 â Cesión",body:[{kind:"p",text:"17.1 â El Cliente no podrá ceder este contrato o los derechos derivados del mismo a terceros sin el consentimiento previo por escrito de Fancy Capital."},{kind:"p",text:"17.2 â Fancy Capital podrá ceder el contrato a empresas del grupo o en el contexto de operaciones societarias (fusión, escisión, transmisión de negocio), notificándolo al Cliente."}]},{id:"art-18",title:"ArtÃculo 18 â Comunicaciones",body:[{kind:"p",text:"18.1 â Las comunicaciones a Fancy Capital se enviarán a [email protected] o, para comunicaciones formales, al correo electrónico certificado [email protected]."},{kind:"p",text:"18.2 â Las comunicaciones de Fancy Capital al Cliente se enviarán al correo electrónico proporcionado en el registro o mediante notificación en el Panel de Control, y se considerarán recibidas en el momento del envÃo."}]},{id:"art-19",title:"ArtÃculo 19 â Ley aplicable y jurisdicción",body:[{kind:"p",text:"19.1 â Los presentes T&C se rigen por la ley italiana."},{kind:"p",text:"19.2 â Cualquier disputa estará sujeta a la jurisdicción exclusiva del Tribunal de Bérgamo, Italia, sin perjuicio de las protecciones obligatorias del consumidor en virtud de las cuales los Clientes Consumidores pueden acudir al tribunal de su lugar de residencia o domicilio."},{kind:"p",text:"19.3 â Las disputas de consumo también pueden utilizar la plataforma europea ODR en https://ec.europa.eu/consumers/odr/."}]},{id:"art-20",title:"ArtÃculo 20 â Disposiciones finales",body:[{kind:"p",text:"20.1 â Estos T&C, junto con la PAU, la PolÃtica de Privacidad y la Configuración Activa, constituyen el acuerdo completo y sustituyen a los entendimientos previos sobre la materia."},{kind:"p",text:"20.2 â La invalidez o inaplicabilidad de cualquier cláusula individual no afectará a las cláusulas restantes."},{kind:"p",text:"20.3 â La falta o demora por parte de Fancy Capital en el ejercicio de cualquier derecho no constituirá una renuncia al mismo."}]}],closing:[{kind:"h3",text:"Aceptación"},{kind:"p",text:"El Cliente declara haber leÃdo y comprendido estos T&C, la PAU, la PolÃtica de Privacidad y, cuando corresponda, los documentos contractuales relacionados. La aceptación se produce digitalmente al marcar la casilla dedicada en el registro y/o en cada compra posterior en el Panel de Control."},{kind:"h3",text:"Aprobación especÃfica según los ArtÃculos 1341 y 1342 del Código Civil italiano"},{kind:"p",text:"El Cliente, en virtud de los ArtÃculos 1341 y 1342 del Código Civil italiano, aprueba expresamente las siguientes cláusulas: 4.3 (rechazo de generación sin reembolso), 7 (pagos, no reembolsabilidad de créditos), 12 (lÃmites territoriales), 14 (limitaciones de responsabilidad), 15 (suspensión y resolución), 16 (modificaciones), 17 (cesión), 19 (jurisdicción)."}]},t6={title:"Allgemeine Geschäftsbedingungen der Plattform",subt
4868itle:"Fancy Capital S.r.l. â KI-gestützter Dienst zur Erstellung audiovisueller Inhalte (HeroShots-Plattform).",lastUpdated:"28. Mai 2026",version:"1.0",sections:[{id:"art-1",title:"Artikel 1 â Definitionen",body:[{kind:"p",text:"In diesen Allgemeinen Geschäftsbedingungen (âAGBâ) haben die nachfolgend aufgeführten Begriffe die angegebene Bedeutung:"},{kind:"ul",items:["<strong>Fancy Capital oder die Plattform</strong>: Fancy Capital S.r.l., mit Sitz in Albino (BG), Via Crespi 25, 24021, italienische Umsatzsteuer-Identifikationsnummer und Steuernummer 04763600162, REA BG-487411, zertifizierte E-Mail [email protected].","<strong>Kunde</strong>: jede natürliche oder juristische Person, die sich auf der Plattform registriert, um die Dienste zu nutzen, unabhängig davon, ob ein kostenpflichtiger Plan aktiviert wurde.","<strong>Geschäftskunde</strong>: Kunde, der sich als juristische Person (Unternehmen, Organisation, Freiberufler mit Umsatzsteuer-Identifikationsnummer) registriert.","<strong>Verbraucherkunde</strong>: natürliche Person, die zu Zwecken handelt, die weder ihrer gewerblichen noch ihrer selbstständigen beruflichen Tätigkeit zugerechnet werden können, im Sinne von Artikel 3 des italienischen Gesetzesdekrets 206/2005 (Verbrauchergesetzbuch).","<strong>Modell</strong>: natürliche Person, die sich auf der Plattform registriert, um ihr Gesicht auf dem Marktplatz anzubieten. Modelle unterliegen einer separaten Marktplatz-Modellvereinbarung und sind nicht Gegenstand dieser AGB, ausgenommen die Interaktionspunkte mit dem Kunden.","<strong>Dienste</strong>: die Gesamtheit der über die Plattform zur Verfügung gestellten Funktionen, einschlieÃlich KI-basierter Inhaltserstellung, Zugang zum Modell-Marktplatz, BYO-Modell-Import, Kreditverwaltung, Abrechnung und Support.","<strong>Generierte Inhalte</strong>: jegliche audiovisuelle Ausgabe (Bild, Video, Animation), die über die Plattform auf Anfrage des Kunden generiert wird.","<strong>Virtueller Avatar</strong>: KI-generiertes oder fiktives Gesicht, das keiner bestimmten realen Person entspricht.","<strong>Marktplatz-Modell</strong>: Auf der Plattform registriertes Modell, das Geschäftskunden über den Marktplatz zur Verfügung gestellt wird.","<strong>BYO (Bring Your Own) Modell</strong>: eine externe natürliche Person, deren Gesicht von einem Geschäftskunden nach Vorlage einer unterschriebenen Freigabe und einer Kopie des Ausweises des Modells hochgeladen wird.","<strong>Dashboard</strong>: der authentifizierte Bereich des Kunden innerhalb der Plattform, der die Aktive Konfiguration (Plan, Guthaben, Abrechnung, Prozentsätze und aktuelle Geschäftsbedingungen) enthält.","<strong>Aktive Konfiguration</strong>: die kommerziellen und funktionalen Bedingungen, die der Kunde bei der Registrierung, bei der Aktivierung eines Abonnements oder beim Kauf von Guthaben über das Dashboard akzeptiert hat. Sie ist integraler Bestandteil der Vereinbarung.","<strong>Nutzungsrichtlinie (AUP)</strong>: Acceptable Use Policy, verfügbar über das Dashboard und die Fancy Capital Website, integraler Bestandteil dieser AGB.","<strong>Byteplus</strong>: Drittanbieter des generativen KI-Modells, das die Plattform betreibt. Fancy Capital fungiert als Tool-Plattform und übermittelt die Generierungsanfragen des Kunden an Byteplus."]}]},{id:"art-2",title:"Artikel 2 â Gegenstand der Vereinbarung",body:[{kind:"p",text:"2.1 â Diese AGB regeln den Zugang zu und die Nutzung der Dienste."},{kind:"p",text:"2.2 â Durch die Registrierung akzeptiert der Kunde diese AGB, die AUP, die Datenschutzerklärung und gegebenenfalls zusätzliche Vertragsdokumente (Freigabe für BYO-Modelle) vollständig."},{kind:"p",text:"2.3 â Alle kommerziellen Bedingungen (Preise, Prozentsätze, Kreditpreise, Generierungskosten, Downloadkosten, Abonnement-Schwellenwerte, Rabatte) sind im Dashboard des Kunden unter der Aktiven Konfiguration aufgeführt und gelten als akzeptiert, wenn der Kunde einen Plan aktiviert, Guthaben kauft oder eine andere Kaufaktion durchführt. Der Kunde muss die Aktive Konfiguration vor Bestätigung eines Kaufs überprüfen."},{kind:"p",text:"2.4 â Fancy Capital kann die Aktive Konfiguration gemäà den Bestimmungen von Artikel 16 ändern."}]},{id:"art-3",title:"Artikel 3 â Registrierung und Kontoerstellung",body:[{kind:"p",text:"3.1 â Die Registrierung ist kostenfrei und begründet allein keine Zahlungsverpflichtung."},{kind:"p",text:"3.2 â Zur Registrierung muss der Kunde wahrheitsgemäÃe, genaue und aktuelle Informationen angeben:"},{kind:"ul",items:["<strong>Geschäftskunde</strong>: Firmenname, Steuer-/Umsatzsteuer-Identifikationsnummer, eingetragene Adresse, Angaben des gesetzlichen Vertreters, geschäftliche E-Mail-Adresse und alle weiteren von der Plattform angeforderten Informationen.","<strong>Verbraucherkunde</strong>: Vorname, Nachname, E-Mail-Adresse und alle weiteren von der Plattform angeforderten Informationen."]},{kind:"p",text:"3.3 â Die Registrierung ist Personen ab 18 Jahren vorbehalten. Fancy Capital kann jederzeit einen Altersnachweis verlangen."},{kind:"p",text:"3.4 â Der Kunde ist für die Vertraulichkeit der Zugangsdaten und für alle unter seinem Konto durchgeführten Aktivitäten verantwortlich und muss Fancy Capital umgehend über jeden unbefugten oder verdächtigen Zugriff informieren."},{kind:"p",text:"3.5 â Fancy Capital kann eine Registrierung ablehnen, ein Konto sperren oder weitere Informationen anfordern, wenn: (a) die angegebenen Informationen unvollständig, falsch oder nicht überprüfbar sind; (b) der Kunde in einem von der Plattform nicht bedienten Gebiet (siehe Artikel 12) ansässig ist; (c) Anzeichen für einen Verstoà gegen diese AGB oder die AUP vorliegen."}]},{id:"art-4",title:"Artikel 4 â Beschreibung der Dienste",body:[{kind:"p",text:"4.1 â Die Plattform ermöglicht es dem Kunden, Folgendes zu tun:"},{kind:"ul",items:["KI-basierte audiovisuelle Inhalte auf Basis eines Virtuellen Avatars, eines Marktplatz-Modells oder eines BYO-Modells zu generieren;","auf eine Bibliothek voreingestellter Assets (Virtuelle Avatare und Marktplatz-Modelle) zuzugreifen;","BYO-Modelle gemäà dem Verfahren in Artikel 6 zu importieren;","Guthaben zu erwerben oder Abonnements gemäà der im Dashboard angezeigten Aktiven Konfiguration abzuschlieÃen;","genehmigte Generierte Inhalte herunterzuladen (falls zutreffend);","auf ein Support-System zuzugreifen."]},{kind:"p",text:"4.2 â Die Plattform verwendet das KI-Modell von Byteplus. Der Kunde erkennt an, dass Qualität, Verfügbarkeit und technische Spezifikationen teilweise von Byteplus und anderen Anbietern abhängen und dass Fancy Capital innerhalb der Grenzen dessen operiert, was solche Anbieter zur Verfügung stellen."},{kind:"p",text:"4.3 â Die Inhaltserstellung unterliegt automatisierten (und, wo erforderlich, menschlichen) Moderationsprozessen. Die Plattform kann die Generierung, Anzeige oder Bereitstellung von Inhalten ablehnen, wenn ein AUP-Verstoà festgestellt wird, ohne Anspruch auf Rückerstattung, Entschädigung oder Scha
4868densersatz für diesen einzelnen Inhalt."}]},{id:"art-5",title:"Artikel 5 â Nutzung des Modell-Marktplatzes",body:[{kind:"p",text:"5.1 â Die Plattform bietet einen Marktplatz registrierter Modelle â natürlicher Personen, die zugestimmt haben, ihr Gesicht für die Inhaltserstellung zur Verfügung zu stellen."},{kind:"p",text:"5.2 â Keine Generierten Inhalte, die ein Marktplatz-Modell darstellen, werden dem Kunden ohne die vorherige ausdrückliche Genehmigung des Modells zur Verfügung gestellt. Der Kunde erkennt an, dass:"},{kind:"ul",items:["die Generierung eines Inhalts ihn nicht automatisch zum Download bereitstellt;","das Modell die Ablehnung, Ãnderungen oder die Entfernung des Inhalts verlangen kann;","das Modell die Verfügbarkeit für zukünftige Generierungen jederzeit zurückziehen kann, vorbehaltlich bereits erteilter Genehmigungen."]},{kind:"p",text:"5.3 â Der Kunde darf Generierte Inhalte, die ein Marktplatz-Modell darstellen, nur innerhalb der erteilten Genehmigung (territoriale, zeitliche, branchenspezifische Grenzen) nutzen."}]},{id:"art-6",title:"Artikel 6 â BYO (Bring Your Own) Modelle",body:[{kind:"p",text:"6.1 â Der Geschäftskunde kann das Gesicht einer dritten Partei (BYO-Modell) nur importieren, nachdem er Folgendes bereitgestellt hat:"},{kind:"ul",items:["eine vom abgebildeten Person unterzeichnete Freigabe, die der von Fancy Capital bereitgestellten Vorlage entspricht;","eine Kopie des gültigen Ausweisdokuments des BYO-Modells;","positive Validierung dieser Dokumentation durch das Compliance-Team von Fancy Capital."]},{kind:"p",text:"6.2 â Der Import von BYO-Modellen ist für <strong>Verbraucherkunden nicht verfügbar</strong>, angesichts der rechtlichen Risiken der Verwendung von Bildern Dritter bei der KI-Generierung."},{kind:"p",text:"6.3 â Der Geschäftskunde erklärt und garantiert, auf eigene Verantwortung, dass die Dokumentation gemäà 6.1 authentisch, vollständig und wahrheitsgemäà ist und dass die Zustimmung des BYO-Modells frei, spezifisch, informiert und widerruflich eingeholt wurde, in Ãbereinstimmung mit der DSGVO und den Bildrechten."},{kind:"p",text:"6.4 â Fancy Capital kann die Nutzung eines BYO-Modells ablehnen oder aussetzen, wenn die Dokumentation anomal, unvollständig oder verdächtig ist."}]},{id:"art-7",title:"Artikel 7 â Abonnements, Guthaben und Zahlungen",body:[{kind:"p",text:"7.1 â Die Dienste werden gemäà den Plänen und Zahlungsbedingungen in der Aktiven Konfiguration im Dashboard bereitgestellt, einschlieÃlich periodischer Abonnements, Prepaid-Guthabenpakete oder Kombinationen davon."},{kind:"p",text:"7.2 â Gebühren werden im Voraus abgerechnet. Erworbene Guthaben haben die in der Aktiven Konfiguration angegebene Gültigkeit und sind nicht erstattungsfähig, auÃer bei zwingendem Verbraucherschutz (einschlieÃlich Verbraucherwiderruf gemäà Artikel 10, innerhalb der dort angegebenen Grenzen)."},{kind:"p",text:"7.3 â Bei Nichtzahlung kann Fancy Capital den Zugang ohne Vorankündigung sperren, unbeschadet der Eintreibung fälliger Beträge und Verzugszinsen (italienisches Gesetzesdekret 231/2002 für Geschäftskunden)."},{kind:"p",text:"7.4 â Zahlungen werden von Drittanbietern (z.B. Stripe) abgewickelt. Fancy Capital speichert keine vollständigen Kartendaten auf ihren Servern."}]},{id:"art-8",title:"Artikel 8 â Zulässige Nutzung und AUP",body:[{kind:"p",text:"8.1 â Der Kunde erklärt sich damit einverstanden, die Plattform in Ãbereinstimmung mit der AUP, die integraler Bestandteil dieser AGB ist, zu nutzen."},{kind:"p",text:"8.2 â Insbesondere erklärt sich der Kunde damit einverstanden, die Plattform <strong>NICHT</strong> zu nutzen für:"},{kind:"ul",items:["die Erstellung von Material zum sexuellen Missbrauch von Kindern (CSAM), gewalttätigen, terroristischen oder hasserfüllten Inhalten;","die Erstellung sexueller oder sexuell anzüglicher Inhalte, die identifizierbare Personen (Marktplatz-Modelle, BYO-Modelle oder Dritte) darstellen;","die Erstellung von Inhalten, die reale Personen nachahmen, um die Ãffentlichkeit zu täuschen, Betrug zu begehen, zu verleumden oder den Ruf zu schädigen (âunrechtmäÃige Deepfakesâ);","die Erstellung von Inhalten, die politische Persönlichkeiten, Staatsoberhäupter, Richter, religiöse Autoritäten oder andere öffentliche Personen darstellen, auÃer mit spezifischer schriftlicher Zustimmung;","Versuche, Sicherheits-, Moderations-, Wasserzeichen-, Geo-Restriktions- oder RückverfolgbarkeitsmaÃnahmen zu umgehen, zu manipulieren oder zu deaktivieren;","jede andere in der AUP verbotene Nutzung."]},{kind:"p",text:"8.3 â Ein Verstoà gegen die AUP zieht die dort festgelegten Konsequenzen nach sich, einschlieÃlich der sofortigen Kontosperrung oder -schlieÃung."}]},{id:"art-9",title:"Artikel 9 â Rechte an Generierten Inhalten",body:[{kind:"p",text:"9.1 â Soweit nicht anders für Inhalte von Marktplatz- oder BYO-Modellen vorgesehen, werden Generierte Inhalte dem Kunden für kommerzielle und nicht-kommerzielle Nutzung im Rahmen der Aktiven Konfiguration und der AUP lizenziert."},{kind:"p",text:"9.2 â Inhalte, die ein Marktplatz-Modell darstellen, dürfen vom Kunden nur innerhalb der Grenzen der Genehmigung des Modells (territorial, zeitlich, sektoral) und der vereinbarten Lizenzgebühren genutzt werden."},{kind:"p",text:"9.3 â Fancy Capital beansprucht keine IP-Rechte an Generierten Inhalten, auÃer für aggregierte, anonyme statistische Nutzung zur Verbesserung des Dienstes."},{kind:"p",text:"9.4 â Der Kunde gewährt Fancy Capital für die Dauer des Vertrags und ausschlieÃlich für die technische Bereitstellung der Dienste eine nicht-exklusive, gebührenfreie Lizenz zum Hosten, Ãbertragen und Verarbeiten von Prompts, hochgeladenen Assets und Generierten Inhalten nach Bedarf."},{kind:"p",text:"9.5 â Der Kunde sichert zu, alle erforderlichen Rechte zum Hochladen seiner Assets (Bilder, Video, Prompts, Marken) zu besitzen und stellt Fancy Capital von jeglichen Ansprüchen Dritter frei."}]},{id:"art-10",title:"Artikel 10 â Verbraucher-Widerrufsrecht",body:[{kind:"p",text:"10.1 â Gemäà Art. 52 ff. des italienischen Verbrauchergesetzbuches (Gesetzesdekret 206/2005) hat der Verbraucherkunde das Recht, innerhalb von 14 Tagen nach Vertragsabschluss ohne Angabe von Gründen durch schriftliche Mitteilung an [email protected] zu widerrufen."},{kind:"p",text:"10.2 â Der Verbraucherkunde erkennt ausdrücklich an, dass gemäà Artikel 59(m) und (o) des Verbrauchergesetzbuches das Widerrufsrecht <strong>nicht gilt</strong>: (a) für die Lieferung digitaler Inhalte, die nicht auf einem körperlichen Datenträger bereitgestellt werden, wenn die Ausführung mit der ausdrücklichen Zustimmung des Verbrauchers und seiner Kenntnisnahme vom Verlust des Widerrufsrechts begonnen hat (typischerweise bei der ersten Nutzung eines Guthabens oder der ersten Inhaltserstellung); (b) für vollständig erbrachte Dienstleistungen, wenn die Ausführung mit der ausdrücklichen Zustimmung des Verbrauchers und seiner Kenntnisnahme vom Verlust des Widerrufsrechts begonnen hat."},{kind:"p",text:"10.3 â AuÃer in den Fällen von 10.2 führt ein gültiger Widerruf zur Rückerstattung der gezahlten und nicht verbrauchten Beträge innerhalb von 14 Tagen nach Erhalt der Widerrufserklärung."}]},{id:"art-11",title:"Artikel 11 â Persönliche Daten",body:[{kind:"p",text:"11.1 â Die Verarbeitung der personenbezogenen Daten des Kunden richtet sich nach der Datenschutzerklärung, die auf der Website und im Dashboard verfügbar ist."},{kind:"p",text:"11.2 â Der Kunde erkennt an, dass die Plattform besondere Kategorien personenbezogener Daten (insbesondere biometrische Daten) zur Identitätsprüfung und Inhaltserstellung verarbeiten kann, ausschlieÃlich auf Grundlage einer ausdrücklichen Einwilligung gemäà Artikel 9 DSGVO."},{kind:"p",text:"11.3 â Eine pseudonymisierte Kennung (âsafety_identifierâ) wird generiert und bei jeder Generierungsanfrage an Byteplus übermittelt, ausschlieÃlich um die Rückverfolgbarkeit von Missbrauch und die Zusammenarbeit mit den zuständigen Behörden zu ermöglichen."},{kind:"p",text:"11.4 â Nutzungslogs werden für mindestens 180 Tage zu Sicherheits-, Audit-, Betrugsvermeidungs- und rechtlichen Compliance-Zwecken aufbewahrt."}]},{id:"art-12",title:"Artikel 12 â Territoriale Grenzen und Zugang",body:[{kind:"p",text:"12.1 â Die Plattform ist in Gebieten nicht verfügbar, in denen die Bereitstellung durch zwingende Vorschriften verboten ist. Insbesondere ist der Zugang <strong>vom chinesischen Festland aus nicht gestattet</strong>. Fancy Capital setzt dies durch Geoblocking durch."},{kind:"p",text:"12.2 â Der Kunde darf die Plattform nicht von verbotenen Gebieten aus nutzen oder falsche Informationen über seinen Standort angeben."}]},{id:"art-13",title:"Artikel 13 â Dienstverfügbarkeit und Wartung",body:[{kind:"p",text:"13.1 â Fancy Capital verpflichtet sich zu branchenüblichen Verfügbarkeitsstandards. Spezifische SLAs, falls zutreffend, sind in der Aktiven Konfiguration festgelegt."},{kind:"p",text:"13.2 â Der Dienst kann für geplante Wartungsarbeiten (mit Benachrichtigung, wo möglich) oder dringende Sicherheitsbedürfnisse ausgesetzt werden, ohne Anspruch auf Entschädigung oder Scha
4868densersatz."}]},{id:"art-14",title:"Artikel 14 â Haftungsbeschränkungen",body:[{kind:"p",text:"14.1 â Soweit nach geltendem Recht zulässig, ist die gesamte Haftung von Fancy Capital im Rahmen dieser AGB auf die Beträge begrenzt, die der Kunde in den 12 Monaten vor dem haftungsbegründenden Ereignis gezahlt hat."},{kind:"p",text:"14.2 â Die Haftungsbeschränkungen gelten nicht in Fällen von Vorsatz oder grober Fahrlässigkeit von Fancy Capital, noch in Fällen, die gesetzlich zwingend zugunsten von Verbraucherkunden geschützt sind."},{kind:"p",text:"14.3 â Fancy Capital haftet nicht für indirekte Schäden, entgangenen Gewinn, Verlust von Geschäftsmöglichkeiten, Datenverlust oder Reputationsschaden, es sei denn, dies ist gesetzlich zwingend vorgeschrieben."},{kind:"p",text:"14.4 â Fancy Capital haftet nicht für die Nutzung, die der Kunde auÃerhalb der Plattform von Generierten Inhalten macht, noch für die Nutzung von Inhalten durch Dritte, die der Kunde auf seinen eigenen Kanälen veröffentlicht."}]},{id:"art-15",title:"Artikel 15 â Aussetzung und Kündigung",body:[{kind:"p",text:"15.1 â Fancy Capital kann den Zugang des Kunden ganz oder teilweise mit sofortiger Wirkung aussetzen in Fällen von:"},{kind:"ul",items:["Verstoà (auch bei Verdacht oder Meldung) gegen diese AGB, die AUP, die Datenschutzerklärung oder andere Vertragsdokumente;","Nichtzahlung fälliger Beträge;","ungerechtfertigter Rückbuchung;","festgestellter anormaler oder missbräuchlicher Aktivität auf der Plattform;","begründeter Aufforderung durch zuständige Behörden;","Gefahr für die Sicherheit der Plattform oder Dritter."]},{kind:"p",text:"15.2 â Bei bestätigtem Verstoà kann Fancy Capital den Vertrag gemäà Artikel 1456 des italienischen Zivilgesetzbuches kündigen, einbehaltene Beträge behalten und Schadensersatz verfolgen."},{kind:"p",text:"15.3 â Gegen Suspendierungsentscheidungen kann unter [email protected] Berufung eingelegt werden; das Compliance-Team wird innerhalb von 15 Tagen eine begründete Antwort geben."}]},{id:"art-16",title:"Artikel 16 â Ãnderungen der AGB und der Aktiven Konfiguration",body:[{kind:"p",text:"16.1 â Fancy Capital kann diese AGB und die Aktive Konfiguration ändern:"},{kind:"ul",items:["mit einer Frist von mindestens 30 Tagen für wesentliche Ãnderungen, mitgeteilt per E-Mail und/oder Dashboard-Benachrichtigung;","mit angemessener Frist für unwesentliche Ãnderungen (Korrekturen, regulatorische Updates, Verbesserungen)."]},{kind:"p",text:"16.2 â Ãnderungen treten an dem im Hinweis angegebenen Datum in Kraft. Die fortgesetzte Nutzung nach dem Wirksamkeitsdatum stellt eine Akzeptanz dar."},{kind:"p",text:"16.3 â Im Falle einer Meinungsverschiedenheit mit wesentlichen Ãnderungen kann der Kunde vor dem Wirksamkeitsdatum ohne Vertragsstrafe durch schriftliche Mitteilung an [email protected] zurücktreten. Unverbrauchte Guthaben werden anteilig zurückerstattet."}]},{id:"art-17",title:"Artikel 17 â Abtretung",body:[{kind:"p",text:"17.1 â Der Kunde darf diesen Vertrag oder daraus abgeleitete Rechte ohne vorherige schriftliche Zustimmung von Fancy Capital nicht an Dritte abtreten."},{kind:"p",text:"17.2 â Fancy Capital kann den Vertrag an Konzerngesellschaften oder im Rahmen von Unternehmenstransaktionen (Fusion, Spaltung, Unternehmensübertragung) abtreten, wobei der Kunde zu informieren ist."}]},{id:"art-18",title:"Artikel 18 â Mitteilungen",body:[{kind:"p",text:"18.1 â Mitteilungen an Fancy Capital sind an [email protected] oder, für formelle Mitteilungen, an die zertifizierte E-Mail [email protected] zu senden."},{kind:"p",text:"18.2 â Mitteilungen von Fancy Capital an den Kunden werden an die bei der Registrierung angegebene E-Mail-Adresse oder über das Dashboard gesendet und gelten zum Zeitpunkt des Versands als zugegangen."}]},{id:"art-19",title:"Artikel 19 â Anwendbares Recht und Gerichtsstand",body:[{kind:"p",text:"19.1 â Diese AGB unterliegen italienischem Recht."},{kind:"p",text:"19.2 â Jegliche Streitigkeiten unterliegen der ausschlieÃlichen Zuständigkeit des Gerichts von Bergamo, Italien, unbeschadet zwingender Verbraucherschutzbestimmungen, wonach Verbraucherkunden das Gericht ihres Wohnsitzes oder Domizils anrufen können."},{kind:"p",text:"19.3 â Verbraucherstreitigkeiten können auch über die europäische ODR-Plattform unter https://ec.europa.eu/consumers/odr/ beigelegt werden."}]},{id:"art-20",title:"Artikel 20 â Schlussbestimmungen",body:[{kind:"p",text:"20.1 â Diese AGB, zusammen mit der AUP, der Datenschutzerklärung und der Aktiven Konfiguration, stellen die gesamte Vereinbarung dar und ersetzen frühere Absprachen in dieser Angelegenheit."},{kind:"p",text:"20.2 â Die Ungültigkeit oder Undurchsetzbarkeit einer einzelnen Klausel berührt nicht die übrigen Klauseln."},{kind:"p",text:"20.3 â Das Unterlassen oder die Verzögerung von Fancy Capital bei der Durchsetzung eines Rechts stellt keinen Verzicht darauf dar."}]}],closing:[{kind:"h3",text:"Annahme"},{kind:"p",text:"Der Kunde erklärt, diese AGB, die AUP, die Datenschutzerklärung und gegebenenfalls damit verbundene Vertragsdokumente gelesen und verstanden zu haben. Die Annahme erfolgt digital durch Ankreuzen des entsprechenden Kästchens bei der Registrierung und/oder bei jedem späteren Kauf im Dashboard."},{kind:"h3",text:"Spezifische Genehmigung gemäà Artikel 1341 und 1342 des italienischen Zivilgesetzbuches"},{kind:"p",text:"Der Kunde genehmigt gemäà Artikel 1341 und 1342 des italienischen Zivilgesetzbuches ausdrücklich die folgenden Klauseln: 4.3 (Ablehnung der Generierung ohne Rückerstattung), 7 (Zahlungen, Nichtrückerstattbarkeit von Guthaben), 12 (territoriale Grenzen), 14 (Haftungsbeschränkungen), 15 (Aussetzung und Kündigung), 16 (Ãnderungen), 17 (Abtretung), 19 (Gerichtsstand)."}]}
4868,a6={title:"Conditions Générales de la Plateforme",subtitle:"Fancy Capital S.r.l. â Service de génération de contenu audiovisuel alimenté par l'IA (plateforme HeroShots).",lastUpdated:"28 mai 2026",version:"1.0",sections:[{id:"art-1",title:"Article 1 â Définitions",body:[{kind:"p",text:"Dans les présentes Conditions Générales (âC.G.â), les termes suivants ont la signification indiquée ci-dessous :"},{kind:"ul",items:["<strong>Fancy Capital ou la Plateforme</strong> : Fancy Capital S.r.l., dont le siège social est situé à Albino (BG), Via Crespi 25, 24021, Italie, TVA et code fiscal 04763600162, REA BG-487411, e-mail certifié [email protected].","<strong>Client</strong> : toute personne physique ou morale qui s'inscrit sur la Plateforme pour utiliser les Services, indépendamment de l'activation d'un plan payant.","<strong>Client Professionnel</strong> : Client s'inscrivant en tant qu'entité juridique (entreprise, organisation, professionnel avec numéro de TVA).","<strong>Client Consommateur</strong> : personne physique agissant à des fins qui n'entrent pas dans le cadre de son activité commerciale, industrielle, artisanale ou libérale, telle que définie par l'article 3 du décret législatif italien 206/2005 (Code de la consommation).","<strong>Modèle</strong> : personne physique qui s'inscrit sur la Plateforme pour proposer son visage sur le marché. Les Modèles sont régis par un Contrat de Modèle Marketplace distinct et ne font pas l'objet des présentes C.G., à l'exception des points d'interaction avec le Client.","<strong>Services</strong> : l'ensemble des fonctionnalités mises à disposition via la Plateforme, y compris la génération de contenu basée sur l'IA, l'accès au marché des Modèles, l'importation de Modèles BYO, la gestion des crédits, la facturation et le support.","<strong>Contenu Généré</strong> : toute production audiovisuelle (image, vidéo, animation) produite via la Plateforme à la demande du Client.","<strong>Avatar Virtuel</strong> : visage généré par l'IA ou fictif qui ne correspond pas à une personne réelle spécifique.","<strong>Modèle Marketplace</strong> : Modèle enregistré sur la Plateforme et mis à la disposition des Clients Professionnels via le marché.","<strong>Modèle BYO (Bring Your Own Model)</strong> : une personne physique externe à la Plateforme dont le visage est téléchargé par un Client Professionnel après avoir fourni une autorisation signée et une copie de la pièce d'identité du Modèle.","<strong>Tableau de Bord</strong> : la zone authentifiée du Client au sein de la Plateforme, qui contient la Configuration Active (plan, crédits, facturation, pourcentages et conditions commerciales actuelles).","<strong>Configuration Active</strong> : les conditions commerciales et fonctionnelles acceptées par le Client via le Tableau de Bord lors de l'inscription, lors de l'activation d'un abonnement ou de l'achat de crédits. Elle fait partie intégrante du contrat.","<strong>PAU</strong> : Politique d'Utilisation Acceptable, disponible depuis le Tableau de Bord et le site web de Fancy Capital, partie intégrante des présentes C.G.","<strong>Byteplus</strong> : fournisseur tiers du modèle d'IA générative alimentant la Plateforme. Fancy Capital agit en tant que plateforme d'outils et transmet les demandes de génération du Client à Byteplus."]}]},{id:"art-2",title:"Article 2 â Objet du contrat",body:[{kind:"p",text:"2.1 â Les présentes C.G. régissent l'accès et l'utilisation des Services."},{kind:"p",text:"2.2 â En s'inscrivant, le Client accepte pleinement les présentes C.G., la PAU, la Politique de Confidentialité et, le cas échéant, les documents contractuels supplémentaires (Autorisation de Visage Réel pour les Modèles BYO)."},{kind:"p",text:"2.3 â Toutes les conditions commerciales (prix, pourcentages, prix des crédits, coûts de génération, coûts de téléchargement, seuils d'abonnement, remises) sont affichées dans le Tableau de Bord du Client sous la Configuration Active et sont considérées comme acceptées lorsque le Client active un plan, achète des crédits ou effectue toute autre action d'achat. Le Client doit examiner la Configuration Active avant de confirmer tout achat."},{kind:"p",text:"2.4 â Fancy Capital peut modifier la Configuration Active selon les termes de l'Article 16."}]},{id:"art-3",title:"Article 3 â Inscription et création de compte",body:[{kind:"p",text:"3.1 â L'inscription est gratuite et n'entraîne, en soi, aucune obligation de paiement."},{kind:"p",text:"3.2 â Pour s'inscrire, le Client doit fournir des informations véridiques, exactes et à jour :"},{kind:"ul",items:["<strong>Client Professionnel</strong> : raison sociale, code fiscal/TVA, adresse du siège social, coordonnées du représentant légal, email professionnel, et toute autre information demandée par la Plateforme.","<strong>Client Consommateur</strong> : prénom, nom, email, et toute autre information demandée par la Plateforme."]},{kind:"p",text:"3.3 â L'inscription est réservée aux personnes âgées de 18 ans ou plus. Fancy Capital peut exiger une preuve d'âge à tout moment."},{kind:"p",text:"3.4 â Le Client est responsable de la confidentialité de ses identifiants et de toutes les activités effectuées sous son compte, et doit notifier rapidement Fancy Capital de tout accès non autorisé ou suspect."},{kind:"p",text:"3.5 â Fancy Capital peut refuser une inscription, suspendre un compte ou demander des informations supplémentaires lorsque : (a) les informations fournies sont incomplètes, fausses ou invérifiables ; (b) le Client est situé dans un territoire non desservi par la Plateforme (voir Article 12) ; (c) il existe des indices de violation des présentes C.G. ou de la PAU."}]},{id:"art-4",title:"Article 4 â Description des Services",body:[{kind:"p",text:"4.1 â La Plateforme permet au Client de :"},{kind:"ul",items:["générer du contenu audiovisuel IA basé sur un Avatar Virtuel, un Modèle Marketplace ou un Modèle BYO ;","accéder à une bibliothèque d'actifs prédéfinis (Avatars Virtuels et Modèles Marketplace) ;","importer des Modèles BYO selon la procédure de l'Article 6 ;","acheter des crédits ou s'abonner à des plans conformément à la Configuration Active affichée dans le Tableau de Bord ;","télécharger le Contenu Généré approuvé (le cas échéant) ;","accéder à un système de support."]}
4868,{kind:"p",text:"4.2 â La Plateforme utilise le modèle d'IA de Byteplus. Le Client reconnaît que la qualité, la disponibilité et les spécifications techniques dépendent en partie de Byteplus et d'autres fournisseurs, et que Fancy Capital opère dans les limites de ce que ces fournisseurs mettent à disposition."},{kind:"p",text:"4.3 â La génération de contenu est soumise à une modération automatisée (et, si nécessaire, humaine). La Plateforme peut refuser de générer, d'afficher ou de livrer du Contenu lorsqu'une violation de la PAU est détectée, sans droit à remboursement, indemnité ou compensation pour ce Contenu unique."}]},{id:"art-5",title:"Article 5 â Utilisation du marché des Modèles",body:[{kind:"p",text:"5.1 â La Plateforme offre un marché de Modèles enregistrés â personnes physiques ayant consenti à rendre leur visage disponible pour la génération de contenu."},{kind:"p",text:"5.2 â Aucun Contenu Généré représentant un Modèle Marketplace n'est mis à la disposition du Client sans l'approbation explicite préalable du Modèle. Le Client reconnaît que :"},{kind:"ul",items:["la génération d'un Contenu ne le rend pas automatiquement disponible au téléchargement ;","le Modèle peut refuser, demander des modifications ou la suppression du Contenu ;","le Modèle peut retirer sa disponibilité pour de futures générations à tout moment, à l'exception des approbations déjà accordées."]},{kind:"p",text:"5.3 â Le Client ne doit utiliser le Contenu Généré représentant un Modèle Marketplace que dans les limites de l'approbation accordée (limites territoriales, temporelles, sectorielles)."}]},{id:"art-6",title:"Article 6 â Modèles BYO (Bring Your Own Models)",body:[{kind:"p",text:"6.1 â Le Client Professionnel peut importer le visage d'un tiers (Modèle BYO) uniquement après avoir fourni :"},{kind:"ul",items:["une autorisation signée par la personne représentée, conforme au modèle fourni par Fancy Capital ;","une copie du document d'identité valide du Modèle BYO ;","une validation positive de cette documentation par l'équipe de conformité de Fancy Capital."]},{kind:"p",text:"6.2 â L'importation de Modèles BYO n'est <strong>pas disponible pour les Clients Consommateurs</strong>, compte tenu des risques juridiques liés à l'utilisation d'images de tiers dans la génération d'IA."},{kind:"p",text:"6.3 â Le Client Professionnel déclare et garantit, sous sa seule responsabilité, que la documentation visée au point 6.1 est authentique, complète et véridique, et que le consentement du Modèle BYO a été obtenu librement, spécifiquement, en connaissance de cause et est révocable, conformément au GDPR et aux droits à l'image."},{kind:"p",text:"6.4 â Fancy Capital peut refuser ou suspendre l'utilisation d'un Modèle BYO si la documentation est anormale, incomplète ou suspecte."}]},{id:"art-7",title:"Article 7 â Abonnements, crédits et paiements",body:[{kind:"p",text:"7.1 â Les Services sont fournis conformément aux plans et aux conditions de paiement de la Configuration Active située dans le Tableau de Bord, y compris les abonnements périodiques, les packs de crédits prépayés ou leurs combinaisons."},{kind:"p",text:"7.2 â Les frais sont facturés à l'avance. Les crédits achetés ont la validité indiquée dans la Configuration Active et ne sont pas remboursables, sauf protection obligatoire du consommateur (y compris le droit de rétractation du Consommateur en vertu de l'Article 10, dans les limites indiquées dans celui-ci)."},{kind:"p",text:"7.3 â En cas de non-paiement, Fancy Capital peut suspendre l'accès sans préavis, sans préjudice du recouvrement des sommes dues et des intérêts de retard (décret législatif italien 231/2002 pour les Clients Professionnels)."},{kind:"p",text:"7.4 â Les paiements sont gérés par des fournisseurs tiers (par exemple, Stripe). Fancy Capital ne stocke pas les données complètes des cartes sur ses serveurs."}]},{id:"art-8",title:"Article 8 â Utilisation acceptable et PAU",body:[{kind:"p",text:"8.1 â Le Client s'engage à utiliser la Plateforme conformément à la PAU, partie intégrante des présentes C.G."},{kind:"p",text:"8.2 â En particulier, le Client s'engage à <strong>NE PAS</strong> utiliser la Plateforme pour :"},{kind:"ul",items:["générer du matériel d'abus sexuel sur enfants (CSAM), du contenu violent, terroriste, haineux ;","générer du contenu sexuel ou sexuellement suggestif représentant des personnes identifiables (Modèles Marketplace, Modèles BYO ou tiers) ;","générer du contenu usurpant l'identité de personnes réelles pour tromper le public, commettre des fraudes, diffamer ou nuire à la réputation (âdeepfakes illégauxâ) ;","générer du contenu représentant des personnalités politiques, des chefs d'Ãtat, des juges, des autorités religieuses ou d'autres personnalités publiques, sauf accord écrit spécifique ;","tenter de contourner, de modifier ou de désactiver les mesures de sécurité, de modération, de filigrane, de géo-restriction ou de traçabilité ;","toute autre utilisation interdite par la PAU."]},{kind:"p",text:"8.3 â La violation de la PAU entraîne les conséquences y afférentes, y compris la suspension ou la fermeture immédiate du compte."}]},{id:"art-9",title:"Article 9 â Droits sur le Contenu Généré",body:[{kind:"p",text:"9.1 â Sauf disposition contraire pour le contenu du Modèle Marketplace ou BYO, le Contenu Généré est concédé sous licence au Client pour une utilisation commerciale et non commerciale dans le cadre de la Configuration Active et de la PAU."},{kind:"p",text:"9.2 â Le Contenu représentant un Modèle Marketplace ne peut être utilisé par le Client que dans les limites de l'approbation du Modèle (territoriale, temporelle, sectorielle) et des redevances convenues."},{kind:"p",text:"9.3 â Fancy Capital ne revendique aucun droit de propriété intellectuelle sur le Contenu Généré, sauf pour une utilisation statistique agrégée et anonyme afin d'améliorer le Service."},{kind:"p",text:"9.4 â Le Client accorde à Fancy Capital, pour la durée du contrat et uniquement pour la fourniture te
4868chnique des Services, une licence non exclusive et libre de redevance pour héberger, transmettre et traiter les invites, les actifs téléchargés et le Contenu Généré si nécessaire."},{kind:"p",text:"9.5 â Le Client garantit détenir tous les droits nécessaires pour télécharger ses actifs (images, vidéos, invites, marques déposées) et indemnisera Fancy Capital contre toute réclamation de tiers."}]},{id:"art-10",title:"Article 10 â Droit de rétractation du consommateur",body:[{kind:"p",text:"10.1 â Conformément aux articles 52 et suivants du Code de la consommation italien (décret législatif 206/2005), le Client Consommateur a le droit de se rétracter dans les 14 jours suivant la conclusion du contrat, sans donner de motif, en écrivant à [email protected]."},{kind:"p",text:"10.2 â Le Client Consommateur reconnaît expressément que, conformément à l'article 59(m) et (o) du Code de la consommation, le droit de rétractation <strong>ne s'applique pas</strong> : (a) à la fourniture de contenu numérique non fourni sur un support matériel dont l'exécution a commencé avec le consentement exprès du Consommateur et son acceptation de la perte du droit de rétractation (généralement lors de la première utilisation d'un crédit ou de la première génération de contenu) ; (b) aux services pleinement exécutés dont l'exécution a commencé avec le consentement exprès du Consommateur et son acceptation de la perte du droit de rétractation."},{kind:"p",text:"10.3 â En dehors des cas visés à l'article 10.2, une rétractation valable entraîne le remboursement des sommes payées et non consommées, dans les 14 jours suivant la réception de la notification."}]},{id:"art-11",title:"Article 11 â Données personnelles",body:[{kind:"p",text:"11.1 â Le traitement des données personnelles du Client est régi par la Politique de Confidentialité, disponible sur le site web et dans le Tableau de Bord."},{kind:"p",text:"11.2 â Le Client reconnaît que la Plateforme peut traiter des catégories spéciales de données personnelles (en particulier des données biométriques) pour la vérification d'identité et la génération de contenu, uniquement sur la base d'un consentement explicite conformément à l'article 9 du GDPR."},{kind:"p",text:"11.3 â Un identifiant pseudonyme (âsafety_identifierâ) est généré et transmis à Byteplus à chaque demande de génération, uniquement pour permettre la traçabilité des abus et la coopération avec les autorités compétentes."},{kind:"p",text:"11.4 â Les journaux d'utilisation sont conservés pendant au moins 180 jours à des fins de sécurité, d'audit, de prévention de la fraude et de conformité légale."}]},{id:"art-12",title:"Article 12 â Limites territoriales et accès",body:[{kind:"p",text:"12.1 â La Plateforme n'est pas disponible dans les territoires où sa fourniture est interdite par des règles impératives. En particulier, l'accès est <strong>interdit depuis la Chine continentale</strong>. Fancy Capital fait respecter cette interdiction par le biais d'une géo-restriction."},{kind:"p",text:"12.2 â Le Client ne doit pas utiliser la Plateforme depuis des territoires interdits ni fournir de fausses informations sur sa localisation."}]},{id:"art-13",title:"Article 13 â Disponibilité et maintenance du service",body:[{kind:"p",text:"13.1 â Fancy Capital s'engage à respecter les normes de disponibilité habituelles de l'industrie. Les niveaux de service spécifiques, le cas échéant, sont énoncés dans la Configuration Active."},{kind:"p",text:"13.2 â Le Service peut être suspendu pour des raisons de maintenance planifiée (avec préavis si possible) ou des besoins urgents de sécurité, sans droit à indemnité ou compensation."}]},{id:"art-14",title:"Article 14 â Limites de responsabilité",body:[{kind:"p",text:"14.1 â Dans la mesure maximale permise par la loi applicable, la responsabilité globale de Fancy Capital en vertu des présentes C.G. est plafonnée aux montants payés par le Client au cours des 12 mois précédant l'événement donnant lieu à la responsabilité."},{kind:"p",text:"14.2 â Les plafonds ne s'appliquent pas en cas de faute intentionnelle ou de négligence grave de Fancy Capital, ni dans les cas obligatoirement protégés par la loi en faveur des Clients Consommateurs."},{kind:"p",text:"14.3 â Fancy Capital ne sera pas responsable des dommages indirects, de la perte de profits, de la perte d'opportunités commerciales, de la perte de données ou de l'atteinte à la réputation, sauf si la loi l'exige impérativement."},{kind:"p",text:"14.4 â Fancy Capital n'est pas responsable de l'utilisation que le Client fait du Contenu Généré en dehors de la Plateforme, ni de l'utilisation par des tiers du Contenu publié par le Client sur ses propres canaux."}]},{id:"art-15",title:"Article 15 â Suspension et résiliation",body:[{kind:"p",text:"15.1 â Fancy Capital peut suspendre immédiatement, en tout ou en partie, l'accès du Client en cas de :"},{kind:"ul",items:["violation (même suspectée ou signalée) des présentes C.G., de la PAU, de la Politique de Confidentialité ou d'autres documents contractuels ;","non-paiement des sommes dues ;","rétrofacturation injustifiée ;","activité anormale ou abusive détectée sur la Plateforme ;","demande motivée des autorités compétentes ;","risque pour la sécurité de la Plateforme ou des tiers."]},{kind:"p",text:"15.2 â En cas de violation confirmée, Fancy Capital peut résilier le contrat en vertu de l'article 1456 du C
4868ode civil italien, en conservant les montants accumulés et en poursuivant les dommages et intérêts."},{kind:"p",text:"15.3 â Les décisions de suspension peuvent être contestées à [email protected] ; l'équipe de conformité fournira une réponse motivée dans les 15 jours."}]},{id:"art-16",title:"Article 16 â Modifications des C.G. et de la Configuration Active",body:[{kind:"p",text:"16.1 â Fancy Capital peut modifier les présentes C.G. et la Configuration Active :"},{kind:"ul",items:["avec un préavis d'au moins 30 jours pour les modifications substantielles, communiquées par e-mail et/ou notification sur le Tableau de Bord ;","avec un préavis raisonnable pour les modifications non substantielles (corrections, mises à jour réglementaires, améliorations)."]},{kind:"p",text:"16.2 â Les modifications prennent effet à la date indiquée dans l'avis. L'utilisation continue après la date d'entrée en vigueur constitue une acceptation."},{kind:"p",text:"16.3 â En cas de désaccord avec les modifications substantielles, le Client peut se rétracter sans pénalité avant la date d'entrée en vigueur en écrivant à [email protected]. Les soldes inutilisés sont remboursés au prorata."}]},{id:"art-17",title:"Article 17 â Cession",body:[{kind:"p",text:"17.1 â Le Client ne peut céder le présent contrat ou les droits qui en découlent à des tiers sans le consentement écrit préalable de Fancy Capital."},{kind:"p",text:"17.2 â Fancy Capital peut céder le contrat à des sociétés du groupe ou dans le cadre d'opérations corporatives (fusion, scission, transfert d'entreprise), en en informant le Client."}]},{id:"art-18",title:"Article 18 â Communications",body:[{kind:"p",text:"18.1 â Les communications à Fancy Capital sont envoyées à [email protected] ou, pour les communications formelles, à l'e-mail certifié [email protected]."},{kind:"p",text:"18.2 â Les communications de Fancy Capital au Client sont envoyées à l'e-mail fourni lors de l'inscription ou via une notification sur le Tableau de Bord, et sont réputées reçues au moment de l'envoi."}]},{id:"art-19",title:"Article 19 â Droit applicable et juridiction compétente",body:[{kind:"p",text:"19.1 â Les présentes C.G. sont régies par le droit italien."},{kind:"p",text:"19.2 â Tout litige est soumis à la juridiction exclusive du Tribunal de Bergame, Italie, sans préjudice des protections impératives du consommateur en vertu desquelles les Clients Consommateurs peuvent saisir le tribunal de leur lieu de résidence ou de domicile."},{kind:"p",text:"19.3 â Les litiges de consommation peuvent également utiliser la plateforme ODR européenne à l'adresse https://ec.europa.eu/consumers/odr/."}]},{id:"art-20",title:"Article 20 â Dispositions finales",body:[{kind:"p",text:"20.1 â Les présentes C.G., ainsi que la PAU, la Politique de Confidentialité et la Configuration Active, constituent l'intégralité de l'accord et remplacent toute entente antérieure sur le sujet."},{kind:"p",text:"20.2 â L'invalidité ou l'inapplicabilité d'une seule clause n'affecte pas les autres clauses."},{kind:"p",text:"20.3 â Le manquement ou le retard de Fancy Capital à faire valoir un droit ne constitue pas une renonciation à celui-ci."}]}],closing:[{kind:"h3",text:"Acceptation"},{kind:"p",text:"Le Client déclare avoir lu et compris les présentes C.G., la PAU, la Politique de Confidentialité et, le cas échéant, les documents contractuels associés. L'acceptation se fait numériquement en cochant la case dédiée lors de l'inscription et/ou à chaque achat ultérieur dans le Tableau de Bord."},{kind:"h3",text:"Approbation spécifique aux termes des articles 1341 et 1342 du Code civil italien"},{kind:"p",text:"Le Client, aux termes des articles 1341 et 1342 du Code civil italien, approuve expressément les clauses suivantes : 4.3 (refus de génération sans remboursement), 7 (paiements, non-remboursabilité des crédits), 12 (limites territoriales), 14 (limites de responsabilité), 15 (suspension et résiliation), 16 (modifications), 17 (cession), 19 (juridiction)."}]},n6={title:"Privacy Policy",subtitle:"Informativa sul trattamento dei dati personali ai sensi degli articoli 13 e 14 del Regolamento (UE) 2016/679 (GDPR).",lastUpdated:"28 maggio 2026",version:"1.0",sections:[{id:"sez-1",title:"1. Titolare del trattamento",body:[{kind:"p",text:"Il Titolare del trattamento dei dati personali è <strong>Fancy Capital S.r.l.</strong>, con sede legale in Albino (BG), Via Crespi 25, CAP 24021, C.F. e P.IVA 04763600162, REA BG-487411, PEC [email protected] (di seguito anche «Fancy Capital» o «il Titolare»)."},{kind:"p",text:`Per qualsiasi richiesta relativa al trattamento dei propri dati personali, l'Interessato può scrivere a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.`},{kind:"p",text:`Il Responsabile della Protezione dei Dati (DPO), ove nominato, è contattabile all'indirizzo <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.`}]},{id:"sez-2",title:"2. Ambito di applicazione",body:[{kind:"p",text:"La presente informativa si applica al trattamento dei dati personali effettuato attraverso la piattaforma HeroShots, accessibile all'indirizzo heroshots.ai (la «Piattaforma»), nonché attraverso eventuali servizi correlati (email, supporto clienti, comunicazioni commerciali)."},{kind:"p",text:"Le categorie di soggetti i cui dati sono trattati («Interessati») sono:"},{kind:"ul",items:["<strong>Cliente Azienda</strong>: legale rappresentante e referenti operativi indicati dall'azienda registrata sulla Piattaforma.","<strong>Cliente Consumatore</strong>: persona fisica che si registra alla Piattaforma per scopi estranei all'attività professionale.","<strong>
4868Model</strong>: persona fisica che si registra alla Piattaforma per offrire il proprio volto sul marketplace.","<strong>Model BYO (Bring Your Own)</strong>: persona fisica esterna alla Piattaforma il cui volto viene caricato da un Cliente Azienda previa fornitura di liberatoria firmata.","<strong>Visitatori</strong>: persone che navigano sul sito web senza registrarsi."]}]},{id:"sez-3",title:"3. Categorie di dati personali trattati",body:[{kind:"h3",text:"3.1 Dati comuni di registrazione e identificazione"},{kind:"p",text:"Per tutti gli Interessati registrati: nome, cognome, indirizzo email, numero di telefono (se fornito), credenziali di accesso (in forma cifrata), data di nascita, indirizzo, codice fiscale (per Clienti Consumatori e Model), denominazione sociale e dati fiscali (per Clienti Azienda)."},{kind:"h3",text:"3.2 Dati di documento d'identità e dati biometrici"},{kind:"p",text:"Per i Model e per i Clienti che attivano il flusso di verifica identità :"},{kind:"ul",items:["immagine del documento di identità (carta d'identità , passaporto, patente);","dati identificativi estratti dal documento (numero, scadenza, autorità rilasciante);","immagine del volto (selfie / video di liveness) acquisita ai fini della verifica biometrica."]},{kind:"p",text:"Tali dati costituiscono <strong>dati biometrici</strong>, ovvero «categoria particolare di dati personali» ai sensi dell'articolo 9 del GDPR, e sono trattati esclusivamente sulla base di <strong>consenso esplicito</strong> dell'Interessato."},{kind:"p",text:"Per i Model BYO, Fancy Capital riceve dal Cliente Azienda copia del documento di identità del Model BYO, dati anagrafici e liberatoria firmata. Tali dati sono trattati in qualità di responsabile del trattamento per conto del Cliente Azienda (vedi sezione 5)."},{kind:"h3",text:"3.3 Dati di utilizzo della Piattaforma"},{kind:"ul",items:["prompt e parametri inseriti dall'Interessato per la generazione di contenuti;","contenuti generati (immagini, video) e relativi metadati (timestamp, modello AI utilizzato, esito di moderazione);","asset caricati dall'Interessato sulla Piattaforma (immagini, video, ecc.);","attività di approvazione/rifiuto contenuti (per i Model);","dati di navigazione: indirizzo IP, user agent, identificativi di sessione, log di accesso, timestamp di attività , geolocalizzazione approssimativa (a livello di paese, derivata dall'IP)."]},{kind:"h3",text:"3.4 Dati di pagamento e fatturazione"},{kind:"p",text:"Per gli Interessati che attivano abbonamenti o acquistano crediti: dati di fatturazione, dati relativi al metodo di pagamento (gestiti dal provider di pagamento terzo â Fancy Capital <strong>non conserva i dati della carta di credito</strong>), storico delle transazioni."},{kind:"p",text:"Per i Model: dati bancari (IBAN) ai fini della liquidazione dei compensi, dati fiscali necessari agli adempimenti di legge (es. ritenuta d'acconto, Certificazione Unica)."},{kind:"h3",text:"3.5 Identificativo pseudonimo (safety_identifier)"},{kind:"p",text:"La Piattaforma genera, al momento della registrazione, un identificativo pseudonimo univoco («safety_identifier») associato a ciascun Interessato registrato. Tale identificativo è trasmesso al fornitore terzo Byteplus insieme a ogni richiesta di generazione contenuti, al fine di consentire la tracciabilità delle attività ai fini di sicurezza e prevenzione abusi. Il mapping tra safety_identifier e identità reale è conservato cifrato e accessibile esclusivamente al team compliance del Titolare."},{kind:"h3",text:"3.6 Cookie e tecnologie similari"},{kind:"p",text:'La Piattaforma utilizza cookie tecnici, funzionali e â previo consenso â analitici e di marketing. Per il dettaglio si rinvia alla <a class="text-brand-secondary underline" href="/legal/cookies">Cookie Policy</a>.'}]},{id:"sez-4",title:"4. Finalità del trattamento e base giuridica",body:[{kind:"h3",text:"4.1 Erogazione dei Servizi"},{kind:"p",text:"<strong>Finalità :</strong> registrazione e gestione dell'account, accesso alla Piattaforma, erogazione delle funzionalità di generazione contenuti, gestione del marketplace Model, gestione del flusso di approvazione contenuti, comunicazioni operative."},{kind:"p",text:"<strong>Base giuridica:</strong> esecuzione del contratto di cui l'Interessato è parte (art. 6.1.b GDPR)."},{kind:"h3",text:"4.2 Adempimenti contrattuali e fiscali"},{kind:"p",text:"<strong>Finalità :</strong> emissione di fatture, gestione di pagamenti e payout, adempimenti fiscali (CU, ritenuta d'acconto), gestione di re
4868clami e controversie."},{kind:"p",text:"<strong>Base giuridica:</strong> esecuzione del contratto (art. 6.1.b) e adempimento di obblighi legali (art. 6.1.c)."},{kind:"h3",text:"4.3 Verifica dell'identità e trattamento di dati biometrici"},{kind:"p",text:"<strong>Finalità :</strong> verifica dell'identità del Model (o del Cliente, ove applicabile) tramite il servizio iDenfy, al fine di garantire l'autenticità dei soggetti che operano sulla Piattaforma e prevenire frodi, impersonificazioni e abusi."},{kind:"p",text:"<strong>Base giuridica:</strong> consenso esplicito dell'Interessato (art. 9.2.a GDPR) per il trattamento dei dati biometrici, prestato al momento dell'attivazione della verifica."},{kind:"h3",text:"4.4 Sicurezza, prevenzione abusi e cooperazione con il fornitore AI"},{kind:"p",text:"<strong>Finalità :</strong> monitoraggio della Piattaforma per finalità di sicurezza, prevenzione e individuazione di abusi, moderazione di contenuti illeciti, trasmissione del safety_identifier a Byteplus per finalità di tracciabilità ."},{kind:"p",text:"<strong>Base giuridica:</strong> legittimo interesse del Titolare alla sicurezza della Piattaforma e degli Interessati (art. 6.1.f), nonché adempimento di obblighi contrattuali assunti con Byteplus."},{kind:"h3",text:"4.5 Compliance e adempimento di obblighi legali"},{kind:"p",text:"<strong>Finalità :</strong> conservazione di log di compliance per il periodo minimo di 180 giorni, gestione di richieste da parte di autorità competenti, gestione dei diritti degli Interessati ex GDPR."},{kind:"p",text:"<strong>Base giuridica:</strong> adempimento di obblighi legali (art. 6.1.c) e legittimo interesse del Titolare (art. 6.1.f)."},{kind:"h3",text:"4.6 Comunicazioni di servizio e marketing"},{kind:"p",text:"<strong>Finalità :</strong> invio di comunicazioni operative relative al servizio (notifiche di approvazione contenuti, aggiornamenti di stato, modifiche ai T&C) e â previo consenso opzionale â comunicazioni commerciali su nuove funzionalità e offerte."},{kind:"p",text:"<strong>Base giuridica:</strong> esecuzione del contratto (art. 6.1.b) per le comunicazioni di servizio; consenso (art. 6.1.a) per le comunicazioni di marketing, revocabile in qualsiasi momento."}]},{id:"sez-5",title:"5. Ruoli nel trattamento (titolare, contitolare, responsabile)",body:[{kind:"p",text:"Fancy Capital opera, a seconda del contesto, come:"},{kind:"ul",items:["<strong>Titolare autonomo</strong> â per i dati di registrazione, fatturazione, sicurezza, marketing e per la gestione dei rapporti con i Model.","<strong>Responsabile del trattamento ex art. 28 GDPR</strong> â quando tratta i dati dei Model BYO per conto del Cliente Azienda che li ha caricati. In tale ipotesi è sottoscritto un Data Processing Agreement (DPA) con il Cliente Azienda.","<strong>Titolare autonomo</strong> â con il Cliente che utilizza un contenuto di un Model del Marketplace: il Cliente è titolare autonomo per l'uso che fa del contenuto approvato e scaricato dalla Piattaforma."]}]},{id:"sez-6",title:"6. Categorie di destinatari dei dati",body:[{kind:"h3",text:"6.1 Fornitori tecnologici (responsabili del trattamento ex art. 28 GDPR)"},{kind:"ul",items:["<strong>Byteplus</strong>: fornitore del modello AI generativo. Riceve i prompt, gli asset caricati e il safety_identifier per la generazione dei contenuti. Soggetto a DPA.","<strong>iDenfy</strong> (sede UE â Lituania): provider di verifica identità biometrica. Riceve documento d'identità e immagine del volto del Model/Cliente per la verifica. Soggetto a DPA.","<strong>Sightengine / Azure Content Safety</strong> (Microsoft Ireland Operations Ltd, EU): provider di moderazione contenuti. Riceve i prompt e gli output generati per analisi. Soggetto a DPA.","<strong>Cloudflare</strong> (o equivalente WAF provider): per la sicurezza perimetrale, geo-restrizione, anti-DDoS. Tratta indirizzi IP e metadati di richiesta.","<strong>Provider di hosting cloud</strong> (AWS / GCP / Azure, secondo l'infrastruttura in uso): per l'infrastruttura tecnologica della Piattaforma.","<strong>Provider di logging e monitoring</strong> (es. Datadog, ELK su cloud): per la conservazione dei log operativi e di compliance.","<strong>Provider di pagamento</strong> (es. Stripe): per il processo dei pagamenti, in qualità di titolare autonomo per la propria parte di trattamento."]},{kind:"h3",text:"6.2 Altri destinatari"},{kind:"ul",items:["Autorità competenti (Polizia Postale, Garante Privacy, autorità giudiziaria
4868) in caso di richieste motivate o di obblighi di segnalazione.","Consulenti professionali (commercialisti, legali, revisori) per gli adempimenti di legge."]}]},{id:"sez-7",title:"7. Trasferimenti extra-UE",body:[{kind:"p",text:"Alcuni fornitori tecnologici possono trattare dati personali in paesi al di fuori dell'Unione Europea / Spazio Economico Europeo."},{kind:"p",text:"In tali casi, il Titolare adotta le garanzie appropriate previste dagli articoli 44 e seguenti del GDPR, e in particolare:"},{kind:"ul",items:["verifica della presenza di una decisione di adeguatezza della Commissione Europea relativa al Paese destinatario, ove applicabile;","in assenza di decisione di adeguatezza, sottoscrizione di <strong>Clausole Contrattuali Standard</strong> (Standard Contractual Clauses â SCC) approvate dalla Commissione Europea;","valutazione caso per caso del livello di protezione del Paese destinatario (Transfer Impact Assessment) e adozione di misure supplementari tecniche e organizzative ove necessario."]},{kind:"p",text:`L'Interessato può richiedere copia delle garanzie adottate scrivendo a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.`}]},{id:"sez-8",title:"8. Periodi di conservazione dei dati",body:[{kind:"ul",items:["<strong>Dati di registrazione e account:</strong> per tutta la durata del rapporto contrattuale e per ulteriori <strong>10 anni</strong> dalla cessazione, per finalità di documentazione contrattuale e tutela legale.","<strong>Dati di fatturazione e fiscali:</strong> <strong>10 anni</strong> dall'emissione, ai sensi della normativa fiscale e civilistica (art. 2220 c.c.).","<strong>Dati biometrici:</strong> per la durata strettamente necessaria alla verifica dell'identità e per ulteriori 12 mesi a fini probatori, salvo obblighi diversi imposti dalla legge.","<strong>Log di compliance e sicurezza:</strong> minimo <strong>180 giorni</strong>, e fino a 24 mesi per indagini in corso o richieste di autorità .","<strong>Contenuti generati:</strong> conservati nel rispetto della Configurazione Attiva del Cliente; al recesso o cancellazione, i contenuti sono rimossi salvo obblighi di conservazione.","<strong>Liberatorie e documenti BYO:</strong> per la durata dell'utilizzo dei Contenuti e per ulteriori 10 anni a fini probatori.","<strong>Dati di marketing:</strong> fino a revoca del consenso o opposizione."]}]},{id:"sez-9",title:"9. Misure di sicurezza",body:[{kind:"p",text:"Fancy Capital adotta misure tecniche e organizzative adeguate a proteggere i dati personali da accessi non autorizzati, perdita, distruzione o diffusione, in conformità all'articolo 32 del GDPR. In particolare:"},{kind:"ul",items:["cifratura at-rest e in-transit dei dati personali, con particolare attenzione ai dati biometrici e ai documenti d'identità ;","controlli di accesso basati su ruoli (RBAC), con accesso ai dati biometrici e ai log di compliance ristretto al solo team compliance;","autenticazione multi-fattore (MFA) obbligatoria per il personale interno con accesso a dati sensibili;","Web Application Firewall (WAF), geo-restrizione (incluso blocco della Cina continentale), rate limiting e anomaly detection;","audit logging di tutte le azioni di accesso e modifica su dati sensibili;","backup periodici e procedure di disaster recovery;","processi di vendor risk management per i fornitori tecnologici;","formazione del personale interno su sicurezza e protezione dei dati;","policy interne di gestione degli incidenti di sicurezza con notifica all'Autorità di controllo (Garante Privacy) entro 72 ore in caso di data breach significativo, ai sensi degli articoli 33 e 34 GDPR."]}]},{id:"sez-10",title:"10. Diritti dell'Interessato",body:[{kind:"p",text:"L'Interessato ha diritto, ai sensi degli articoli 15-22 del GDPR, di:"},{kind:"ul",items:["accedere ai propri dati personali e ottenerne copia;","ottenere la rettifica dei dati inesatti o l'integrazione di dati incompleti;","ottenere la cancellazione dei dati («diritto all'oblio») nei limiti previsti dalla legge;","ottenere la limitazione del trattamento;","ottenere la portabilità dei dati;","opporsi al trattamento basato sul legittimo interesse o per finalità di marketing diretto;","revocare in qualsiasi momento i consensi prestati, senza pregiudicare la liceità dei trattamenti effettuati prima della revoca;","non essere sottoposto a decisioni interamente automatizzate che producano effetti giuridici o
4868significativi (art. 22 GDPR);",`proporre reclamo al Garante per la protezione dei dati personali (<a class="text-brand-secondary underline" href="https://www.garanteprivacy.it" target="_blank" rel="noreferrer">www.garanteprivacy.it</a>) o all'autorità di controllo dello Stato membro di residenza.`]},{kind:"p",text:`Per esercitare i propri diritti, l'Interessato può scrivere a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Il Titolare risponderà entro un mese dalla ricezione della richiesta, salvo proroghe consentite dalla legge.`}]},{id:"sez-11",title:"11. Revoca del consenso e cancellazione dell'account",body:[{kind:"p",text:"11.1 â L'Interessato può revocare in qualsiasi momento i consensi prestati (per il trattamento dei dati biometrici, per il marketing, ecc.), senza pregiudizio della liceità dei trattamenti effettuati prima della revoca."},{kind:"p",text:`11.2 â La cancellazione dell'account può essere richiesta dall'Interessato dalla Dashboard o scrivendo a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. A seguito della cancellazione:`},{kind:"ul",items:["i dati di registrazione e di profilo vengono pseudonimizzati o cancellati;","i dati biometrici vengono cancellati entro 12 mesi dalla cessazione del rapporto;","i log e i dati di compliance restano conservati per il periodo minimo dichiarato (180 giorni e oltre) per finalità di sicurezza e adempimento di obblighi legali;","i contenuti generati e già consegnati al Cliente possono restare in uso dello stesso, salve violazioni accertate;","per i Model: i contenuti già approvati e scaricati dai Clienti restano nei limiti delle approvazioni concesse."]}]},{id:"sez-12",title:"12. Minori",body:[{kind:"p",text:"La Piattaforma non è destinata a minori di 18 anni. Fancy Capital non raccoglie consapevolmente dati personali di minori. Qualora si dovesse riscontrare la presenza di un account riconducibile a un minore, l'account sarà sospeso e i dati cancellati."}]},{id:"sez-13",title:"13. Processi decisionali automatizzati",body:[{kind:"p",text:`La Piattaforma utilizza sistemi di moderazione automatizzata dei contenuti che possono determinare il blocco o la rimozione di un singolo contenuto. à sempre garantito il diritto all'intervento umano scrivendo ad <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.`},{kind:"p",text:"Fancy Capital non utilizza decisioni interamente automatizzate con effetti giuridici o significativi sull'Interessato senza intervento umano, salvi i casi inderogabilmente previsti dalla legge."}]},{id:"sez-14",title:"14. AI Act UE",body:[{kind:"p",text:"La Piattaforma utilizza tecnologie di intelligenza artificiale generativa. Il Titolare si impegna a rispettare le disposizioni del Regolamento (UE) 2024/1689 («AI Act») man mano che le pertinenti disposizioni diventano applicabili, in particolare per quanto riguarda gli obblighi di trasparenza per i contenuti generati (es. etichettatura dei contenuti AI come tali, ove richiesta dalla legge) e gli obblighi specifici per i sistemi di generazione di volti / impersonificazione di persone reali."}]},{id:"sez-15",title:"15. Modifiche alla Privacy Policy",body:[{kind:"p",text:"Il Titolare si riserva il diritto di modificare la presente Privacy Policy in qualsiasi momento, dandone preavviso agli Interessati registrati tramite email e/o notifica in Dashboard. Le modifiche sostanziali sono comunicate con almeno 30 giorni di anticipo. La data di ultimo aggiornamento è indicata in testa al presente documento."}]},{id:"sez-16",title:"16. Contatti",body:[{kind:"p",text:"Per qualsiasi richiesta o chiarimento relativo alla presente Privacy Policy o al trattamento dei propri dati personali, l'Interessato può scrivere a:"},{kind:"ul",items:['<strong>Titolare:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','<strong>DPO</strong> (se nominato): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Indirizzo postale:</strong> Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italia","<strong>PEC:</strong> [email protected]"]}]}]},r6={title:"Privacy Policy",subtitle:"Information on the processing of personal data under Articles 13 and 14 of Regulation (EU) 2016/679 (GDPR).",lastUpdated:"May 28, 2026",version:"1.0",sections:[{id:"sez-1",title:"1. Data controller",body:[{kind:"p",text:"The data controller is <strong>Fancy Capital S.r.l.</strong>, with registered office in Albino (BG), Via Crespi 25, 24021, Ital
4868ian tax/VAT code 04763600162, REA BG-487411, certified email [email protected] (âFancy Capitalâ or âthe Controllerâ)."},{kind:"p",text:'For any request relating to the processing of personal data, the Data Subject may write to <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:'Where appointed, the Data Protection Officer (DPO) can be reached at <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"sez-2",title:"2. Scope",body:[{kind:"p",text:"This Policy applies to processing carried out through the HeroShots platform at heroshots.ai (the âPlatformâ) and related services (email, support, marketing)."},{kind:"p",text:"Categories of Data Subjects:"},{kind:"ul",items:["<strong>Business Customer</strong>: legal representative and operational contacts of the registered business.","<strong>Consumer Customer</strong>: natural person registered for personal purposes.","<strong>Model</strong>: natural person who registers to offer their face on the marketplace.","<strong>BYO Model</strong>: natural person external to the Platform whose face is uploaded by a Business Customer with a signed release.","<strong>Visitors</strong>: people browsing the website without registering."]}]},{id:"sez-3",title:"3. Categories of personal data",body:[{kind:"h3",text:"3.1 Registration and identification data"},{kind:"p",text:"For all registered Data Subjects: first name, last name, email, phone (if provided), encrypted credentials, date of birth, address, tax code (Consumer Customers and Models), company name and tax data (Business Customers)."},{kind:"h3",text:"3.2 ID document and biometric data"},{kind:"p",text:"For Models and Customers triggering identity verification: image of the ID document, extracted identifiers (number, expiry, issuing authority), face image (selfie / liveness video) acquired for biometric verification."},{kind:"p",text:"Such data constitute <strong>biometric data</strong>, a âspecial category of personal dataâ under Article 9 GDPR, and are processed solely on the basis of <strong>explicit consent</strong>."},{kind:"p",text:"For BYO Models, Fancy Capital receives from the Business Customer a copy of the BYO Model's ID, personal details and a signed release. Such data are processed as processor on behalf of the Business Customer (see section 5)."},{kind:"h3",text:"3.3 Platform usage data"},{kind:"ul",items:["prompts and parameters submitted for content generation;","generated content (images, video) and metadata (timestamp, AI model used, moderation outcome);","assets uploaded to the Platform;","content approval/refusal activity (for Models);","browsing data: IP address, user agent, session identifiers, access logs, activity timestamps, approximate geolocation (country level from IP)."]},{kind:"h3",text:"3.4 Payment and billing data"},{kind:"p",text:"For Data Subjects activating subscriptions or buying credits: billing data, payment method data (handled by our third-party processor â Fancy Capital <strong>does not store full card data</strong>), transaction history."},{kind:"p",text:"For Models: bank details (IBAN) for payouts, tax data required by law (e.g. withholding tax, Italian Certificazione Unica)."},{kind:"h3",text:"3.5 Pseudonymous identifier (safety_identifier)"},{kind:"p",text:"At registration the Platform generates a unique pseudonymous identifier transmitted to Byteplus with each generation request, for traceability and abuse prevention. Mapping to real identity is encrypted and accessible only to the Controller's compliance team."},{kind:"h3",text:"3.6 Cookies and similar technologies"},{kind:"p",text:'The Platform uses strictly necessary, functional and â with consent â analytics and marketing cookies. See the <a class="text-brand-secondary underline" href="/legal/cookies">Cookie Policy</a>.'}]},{id:"sez-4",title:"4. Purposes and legal bases",body:[{kind:"h3",text:"4.1 Service provision"},{kind:"p",text:"<strong>Purpose:</strong> account registration and management, access to the Platform, content generation features, Model marketplace, content approval flow, operational communications."},{kind:"p",text:"<strong>Legal basis:</strong> performance of the contract (Art. 6.1.b GDPR)."},{kind:"h3",text:"4.2 Contractual and tax obligations"},{kind:"p",text:"<strong>Purpose:</strong> invoicing, payments and payouts, tax obligations, complaints and disputes."},{kind:"p",text:"<strong>Legal basis:</strong> performance of the contract (Art. 6.1.b) and legal obligations (Art. 6.1.c)."},{kind:"h3",text:"4.3 Identity verification and biometrics"},{kind:"p",text:"<strong>Purpose:</strong>
4868 identity verification of the Model (or Customer, where applicable) via iDenfy, to prevent fraud, impersonation and abuse."},{kind:"p",text:"<strong>Legal basis:</strong> explicit consent (Art. 9.2.a GDPR) for biometric data."},{kind:"h3",text:"4.4 Security, abuse prevention and cooperation with the AI provider"},{kind:"p",text:"<strong>Purpose:</strong> monitoring for security, prevention/detection of abuse, content moderation, transmission of the safety_identifier to Byteplus for traceability."},{kind:"p",text:"<strong>Legal basis:</strong> legitimate interest of the Controller in securing the Platform (Art. 6.1.f), and contractual obligations with Byteplus."},{kind:"h3",text:"4.5 Compliance and legal obligations"},{kind:"p",text:"<strong>Purpose:</strong> compliance log retention (minimum 180 days), handling requests by competent authorities, exercise of Data Subjects' rights."},{kind:"p",text:"<strong>Legal basis:</strong> legal obligation (Art. 6.1.c) and legitimate interest (Art. 6.1.f)."},{kind:"h3",text:"4.6 Service and marketing communications"},{kind:"p",text:"<strong>Purpose:</strong> operational notifications (content approval, status updates, T&C changes) and â subject to optional consent â commercial messages about new features and offers."},{kind:"p",text:"<strong>Legal basis:</strong> contract performance (Art. 6.1.b) for service messages; consent (Art. 6.1.a), revocable at any time, for marketing."}]},{id:"sez-5",title:"5. Roles in processing",body:[{kind:"p",text:"Depending on the context, Fancy Capital acts as:"},{kind:"ul",items:["<strong>Independent controller</strong> â for registration data, billing, security, marketing, and management of relationships with Models.","<strong>Processor under Art. 28 GDPR</strong> â when handling BYO Model data on behalf of the Business Customer who uploaded them. A Data Processing Agreement (DPA) is signed with the Business Customer.","<strong>Independent controller</strong> â with the Customer who uses content of a Marketplace Model: the Customer becomes independent controller for the downstream use of the approved, downloaded content."]}]},{id:"sez-6",title:"6. Categories of recipients",body:[{kind:"h3",text:"6.1 Technology providers (processors under Art. 28 GDPR)"},{kind:"ul",items:["<strong>Byteplus</strong>: generative AI model provider. Receives prompts, uploaded assets and the safety_identifier. Subject to DPA.","<strong>iDenfy</strong> (EU â Lithuania): biometric identity verification provider. Receives ID document and face image for verification. Subject to DPA.","<strong>Sightengine / Azure Content Safety</strong> (Microsoft Ireland Operations Ltd, EU): content moderation. Receives prompts and outputs for analysis. Subject to DPA.","<strong>Cloudflare</strong> (or equivalent WAF): perimeter security, geo-restriction, anti-DDoS. Processes IPs and request metadata.","<strong>Cloud hosting provider</strong> (AWS / GCP / Azure as deployed): infrastructure.","<strong>Logging/monitoring provider</strong> (e.g. Datadog, cloud ELK): operational and compliance logs.","<strong>Payment provider</strong>
4868 (e.g. Stripe): payment processing, as an independent controller for its own scope."]},{kind:"h3",text:"6.2 Other recipients"},{kind:"ul",items:["Competent authorities (Italian Postal Police, the Italian DPA, judicial authorities) on reasoned request or under reporting obligations.","Professional advisors (accountants, lawyers, auditors) for legal compliance."]}]},{id:"sez-7",title:"7. Transfers outside the EU/EEA",body:[{kind:"p",text:"Some providers may process personal data in countries outside the EU/EEA. In such cases the Controller adopts the safeguards under Articles 44 ff. GDPR:"},{kind:"ul",items:["verification of any European Commission adequacy decision;","where no adequacy decision exists, signature of the Commission's <strong>Standard Contractual Clauses (SCCs)</strong>;","case-by-case assessment of the destination country (Transfer Impact Assessment) and additional technical/organisational measures where necessary."]},{kind:"p",text:'Data Subjects may request a copy of the safeguards at <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"sez-8",title:"8. Retention periods",body:[{kind:"ul",items:["<strong>Registration and account data:</strong> for the duration of the contract and a further <strong>10 years</strong> for contractual documentation and legal defence.","<strong>Billing and tax data:</strong> <strong>10 years</strong> from issuance (Italian tax and civil rules, Art. 2220 of the Civil Code).","<strong>Biometric data:</strong> for the time strictly necessary for verification and a further 12 months for evidentiary purposes, save other legal obligations.","<strong>Compliance and security logs:</strong> minimum <strong>180 days</strong>, up to 24 months for ongoing investigations or authority requests.","<strong>Generated content:</strong> per the Active Configuration; on withdrawal or deletion, content is removed save for retention obligations.","<strong>Releases and BYO documents:</strong> for the duration of use of the Content and a further 10 years for evidentiary purposes.","<strong>Marketing data:</strong> until consent withdrawal or objection."]}]},{id:"sez-9",title:"9. Security measures",body:[{kind:"p",text:"Fancy Capital adopts appropriate technical and organisational measures under Article 32 GDPR, including:"},{kind:"ul",items:["at-rest and in-transit encryption with particular attention to biometric data and ID documents;","role-based access controls (RBAC), with biometric data and compliance logs restricted to the compliance team;","mandatory multi-factor authentication (MFA) for staff with access to sensitive data;","Web Application Firewall (WAF), geo-restriction (including mainland China block), rate limiting and anomaly detection;","audit logging of access to and modification of sensitive data;","periodic backups and disaster recovery procedures;","vendor risk management;","staff training on security and data protection;","internal incident management policies with notification to the Italian DPA within 72 hours of a significant breach (Articles 33 and 34 GDPR)."]}]},{id:"sez-10",title:"10. Rights of the Data Subject",body:[{kind:"p",text:"Under Articles 15â22 GDPR, the Data Subject is entitled to:"},{kind:"ul",items:["access their personal data and obtain a copy;","rectify inaccurate data or complete incomplete data;","erase data (âright to be forgottenâ) within legal limits;","restrict processing;","data portability;","object to processing based on legitimate interest or for direct marketing;","withdraw consent at any time, without prejudice to the lawfulness of prior processing;","not be subject to fully automated decisions producing legal or significant effects (Art. 22 GDPR);",'lodge a complaint with the Italian Data Protection Authority (<a class="text-brand-secondary underline" href="https://www.garanteprivacy.it" target="_blank" rel="noreferrer">www.garanteprivacy.it</a>) or with the supervisory authority of their state of residence.']},{kind:"p",text:'To exercise rights, write to <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. The Controller will reply within one month of receipt, subject to legal extensions.'}]},{id:"sez-11",title:"11. Withdrawal of consent and account deleti
4868on",body:[{kind:"p",text:"11.1 â The Data Subject may withdraw consent at any time (biometric processing, marketing, etc.), without prejudice to the lawfulness of prior processing."},{kind:"p",text:'11.2 â Account deletion can be requested from the Dashboard or at <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Upon deletion:'},{kind:"ul",items:["registration and profile data are pseudonymised or deleted;","biometric data are deleted within 12 months of contract termination;","compliance logs are retained for the minimum stated period (180 days and beyond) for security and legal obligations;","generated content already delivered to the Customer may remain in use, save for confirmed breaches;","for Models: content already approved and downloaded by Customers remains within the granted approvals."]}]},{id:"sez-12",title:"12. Minors",body:[{kind:"p",text:"The Platform is not intended for minors under 18. Fancy Capital does not knowingly collect personal data of minors. If a minor's account is identified, it will be suspended and data erased."}]},{id:"sez-13",title:"13. Automated decision-making",body:[{kind:"p",text:'The Platform uses automated moderation that may block or remove individual content. Human intervention is always available at <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:"Fancy Capital does not deploy fully automated decisions with legal or significant effects without human intervention, save where mandatorily required by law."}]},{id:"sez-14",title:"14. EU AI Act",body:[{kind:"p",text:"The Platform uses generative AI. The Controller commits to comply with Regulation (EU) 2024/1689 (the âAI Actâ) as relevant provisions become applicable, notably transparency obligations for generated content (e.g. labelling, where required by law) and specific obligations for face generation / impersonation systems."}]},{id:"sez-15",title:"15. Changes to this Privacy Policy",body:[{kind:"p",text:"The Controller may update this Policy at any time, giving notice to registered Data Subjects via email and/or Dashboard. Material changes are notified at least 30 days in advance. The last update date is shown at the top of this document."}]},{id:"sez-16",title:"16. Contacts",body:[{kind:"p",text:"For any request or clarification on this Privacy Policy:"},{kind:"ul",items:['<strong>Controller:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','<strong>DPO</strong> (if appointed): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Postal address:</strong> Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy","<strong>Certified email (PEC):</strong> [email protected]"]}]}]},o6={title:"PolÃtica de Privacidad",subtitle:"Información sobre el tratamiento de datos personales de conformidad con los artÃculos 13 y 14 del Reglamento (UE) 2016/679 (RGPD).",lastUpdated:"28 de mayo de 2026",version:"1.0",sections:[{id:"sez-1",title:"1. Responsable del tratamiento",body:[{kind:"p",text:"El responsable del tratamiento es <strong>Fancy Capital S.r.l.</strong>, con domicilio social en Albino (BG), Via Crespi 25, 24021, Código Fiscal/IVA italiano 04763600162, REA BG-487411, c
4868orreo electrónico certificado [email protected] (âFancy Capitalâ o âel Responsableâ)."},{kind:"p",text:'Para cualquier solicitud relacionada con el tratamiento de datos personales, el Interesado puede escribir a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:'Si se nombra, el Delegado de Protección de Datos (DPD) puede ser contactado en <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"sez-2",title:"2. Ãmbito de aplicación",body:[{kind:"p",text:"Esta PolÃtica se aplica al tratamiento realizado a través de la plataforma HeroShots en heroshots.ai (la âPlataformaâ) y servicios relacionados (correo electrónico, soporte, marketing)."},{kind:"p",text:"CategorÃas de Interesados:"},{kind:"ul",items:["<strong>Cliente Empresarial</strong>: representante legal y contactos operativos del negocio registrado.","<strong>Cliente Consumidor</strong>: persona fÃsica registrada para fines personales.","<strong>Modelo</strong>: persona fÃsica que se registra para ofrecer su rostro en el mercado.","<strong>Modelo BYO</strong>: persona fÃsica externa a la Plataforma cuyo rostro es cargado por un Cliente Empresarial con una autorización firmada.","<strong>Visitantes</strong>: personas que navegan por el sitio web sin registrarse."]}]},{id:"sez-3",title:"3. CategorÃas de datos personales",body:[{kind:"h3",text:"3.1 Datos de registro e identificación"},{kind:"p",text:"Para todos los Interesados registrados: nombre, apellidos, correo electrónico, teléfono (si se proporciona), credenciales cifradas, fecha de nacimiento, dirección, código fiscal (Clientes Consumidores y Modelos), nombre de la empresa y datos fiscales (Clientes Empresariales)."},{kind:"h3",text:"3.2 Documento de identidad y datos biométricos"},{kind:"p",text:"Para Modelos y Clientes que activan la verificación de identidad: imagen del documento de identidad, identificadores extraÃdos (número, caducidad, autoridad emisora), imagen facial (selfie / video de vivacidad) adquirida para verificación biométrica."},{kind:"p",text:"Dichos datos constituyen <strong>datos biométricos</strong>, una âcategorÃa especial de datos personalesâ en virtud del artÃculo 9 del RGPD, y se procesan únicamente sobre la base de <strong>consentimiento explÃcito</strong>."},{kind:"p",text:"Para Modelos BYO, Fancy Capital recibe del Cliente Empresarial una copia del documento de identidad del Modelo BYO, datos personales y una autorización firmada. Dichos datos se procesan como encargado del tratamiento en nombre del Cliente Empresarial (véase la sección 5)."},{kind:"h3",text:"3.3 Datos de uso de la Plataforma"},{kind:"ul",items:["prompts y parámetros enviados para la generación de contenido;","contenido generado (imágenes, video) y metadatos (marca de tiempo, modelo de IA utilizado, resultado de moderación);","activos cargados en la Plataforma;","actividad de aprobación/rechazo de contenido (para Modelos);","datos de navegación: dirección IP, agente de usuario, identificadores de sesión, registros de acceso, marcas de tiempo de actividad, geolocalización aproximada (nivel de paÃs desde IP)."]},{kind:"h3",text:"3.4 Datos de pago y facturación"},{kind:"p",text:"Para los Interesados que activan suscripciones o compran créditos: datos de facturación, datos del método de pago (gestionados por nuestro procesador externo â Fancy Capital <strong>no almacena datos completos de la tarjeta</strong>), historial de transacciones."},{kind:"p",text:"Para Modelos: datos bancarios (IBAN) para pagos, datos fiscales requeridos por ley (p. ej., retención de impuestos, Certificación Ãnica italiana)."},{kind:"h3",text:"3.5 Identificador seudónimo (safety_identifier)"},{kind:"p",text:"Al registrarse, la Plataforma genera un identificador seudónimo único que se transmite a Byteplus con cada solicitud de generación, para trazabilidad y prevención de abusos. El mapeo a la identidad real está cifrado y es accesible solo para el equipo de cumplimiento del Responsable."},{kind:"h3",text:"3.6 Cookies y tecnologÃas similares"},{kind:"p",text:'La Plataforma utiliza cookies estrictamente necesarias, funcionales y â
4868con consentimiento â cookies analÃticas y de marketing. Véase la <a class="text-brand-secondary underline" href="/legal/cookies">PolÃtica de Cookies</a>.'}]},{id:"sez-4",title:"4. Finalidades y bases jurÃdicas",body:[{kind:"h3",text:"4.1 Prestación de servicios"},{kind:"p",text:"<strong>Finalidad:</strong> registro y gestión de cuentas, acceso a la Plataforma, funciones de generación de contenido, mercado de Modelos, flujo de aprobación de contenido, comunicaciones operativas."},{kind:"p",text:"<strong>Base jurÃdica:</strong> ejecución del contrato (Art. 6.1.b RGPD)."},{kind:"h3",text:"4.2 Obligaciones contractuales y fiscales"},{kind:"p",text:"<strong>Finalidad:</strong> facturación, pagos y abonos, obligaciones fiscales, reclamaciones y disputas."},{kind:"p",text:"<strong>Base jurÃdica:</strong> ejecución del contrato (Art. 6.1.b) y obligaciones legales (Art. 6.1.c)."},{kind:"h3",text:"4.3 Verificación de identidad y biometrÃa"},{kind:"p",text:"<strong>Finalidad:</strong> verificación de identidad del Modelo (o Cliente, cuando corresponda) a través de iDenfy, para prevenir fraudes, suplantaciones de identidad y abusos."},{kind:"p",text:"<strong>Base jurÃdica:</strong> consentimiento explÃcito (Art. 9.2.a RGPD) para datos biométricos."},{kind:"h3",text:"4.4 Seguridad, prevención de abusos y cooperación con el proveedor de IA"},{kind:"p",text:"<strong>Finalidad:</strong> monitorización para seguridad, prevención/detección de abusos, moderación de contenido, transmisión del safety_identifier a Byteplus para trazabilidad."},{kind:"p",text:"<strong>Base jurÃdica:</strong> interés legÃtimo del Responsable en asegurar la Plataforma (Art. 6.1.f), y obligaciones contractuales con Byteplus."},{kind:"h3",text:"4.5 Cumplimiento y obligaciones legales"},{kind:"p",text:"<strong>Finalidad:</strong> retención de registros de cumplimiento (mÃnimo 180 dÃas), gestión de solicitudes de autoridades competentes, ejercicio de los derechos de los Interesados."},{kind:"p",text:"<strong>Base jurÃdica:</strong> obligación legal (Art. 6.1.c) e interés legÃtimo (Art. 6.1.f)."},{kind:"h3",text:"4.6 Comunicaciones de servicio y marketing"},{kind:"p",text:"<strong>Finalidad:</strong> notificaciones operativas (aprobación de contenido, actualizaciones de estado, cambios en Términos y Condiciones) y âsujeto a consentimiento opcionalâ mensajes comerciales sobre nuevas caracterÃsticas y ofertas."},{kind:"p",text:"<strong>Base jurÃdica:</strong> ejecución del contrato (Art. 6.1.b) para mensajes de servicio; consentimiento (Art. 6.1.a), revocable en cualquier momento, para marketing."}]},{id:"sez-5",title:"5. Roles en el tratamiento",body:[{kind:"p",text:"Dependiendo del contexto, Fancy Capital actúa como:"},{kind:"ul",items:["<strong>Responsable independiente</strong> â para datos de registro, facturación, seguridad, marketing y gestión de relaciones con Modelos.","<strong>Encargado del tratamiento según el Art. 28 RGPD</strong> â al gestionar datos de Modelos BYO en nombre del Cliente Empresarial que los cargó. Se firma un Acuerdo de Procesamiento de Datos (APD) con el Cliente Empresarial.","<strong>Responsable independiente</strong> â con el Cliente que utiliza contenido de un Modelo de Mercado: el Cliente se convierte en responsable independiente para el uso posterior del contenido aprobado y descargado."]}]},{id:"sez-6",title:"6. CategorÃas de destinatarios",body:[{kind:"h3",text:"6.1 Proveedores de tecnologÃa (encargados del tratamiento según el Art. 28 RGPD)"},{kind:"ul",items:["<strong>Byteplus</strong>: proveedor de modelos de IA generativa. Recibe prompts, activos cargados y el safety_identifier. Sujeto a APD.","<strong>iDenfy</strong> (UE â Lituania): proveedor de verificación de identidad biométrica. Recibe el documento de identidad e imagen facial para verificación. Sujeto a APD.","<strong>Sightengine / Azure Content Safety</strong> (Microsoft Ireland Operations Ltd, UE): moderación de contenido. Recibe prompts y salidas para análisis. Sujeto a APD.","<strong>Cloudflare</strong> (o WAF equivalente): seguridad perimetral, restricción geográfica, anti-DDoS. Procesa IPs y metadatos de solicitud.","<strong>Proveedor de alojamiento en la nube</strong> (AWS / GCP / Azure según implementación): infraestructura.","<strong>Proveedor de registro/monitorización</strong> (p. ej., Datadog, ELK en la nube): registros operativos y de cumplimiento.","<strong>Proveedor de pagos</strong> (p. ej., Stripe): procesamiento de pagos, como responsable independiente para su propio ámbito."]},{kind:"h3",text:"6.2 Otros destinatarios"},{kind:"ul",items:["Autoridades competentes (PolicÃa Postal italiana, AGPD italiana, autoridades judiciales) previa solicitud motivada o bajo obligaciones de información.","Asesores profesionales (contables, abogados, auditores) para el cumplimiento legal."]}]},{id:"sez-7",title:"7. Transferencias fuera de la UE/EEE",body:[{kind:"p",text:"Algunos proveedores pueden procesar datos personales en paÃses fuera de la UE/EEE. En tales casos, el Responsable adopta las garantÃas previstas en los artÃculos 44 y ss. del RGPD:"},{kind:"ul",items:["verificación de cualquier decisión de adecuación de la Comisión Europea;","cuando no exista decisión de adecuación, firma de las <strong>Cláusulas Contractuales Tipo (CCT)</strong> de la Comisión;","evaluación caso por caso del paÃs de destino (Evaluación de Impacto de Transferencia) y medidas técnicas/organizativas adicionales cuando sea necesario."]},{kind:"p",text:'Los Interesados pueden solicitar una copia de las garantÃas en <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"sez-8",title:"8. PerÃodos de conservación",body:[{kind:"ul",items:["<strong>Datos de registro y cuenta:</strong> durante la duración del contrato y <strong>10 años</strong> adicionales para documentación contractual y defensa legal.","<strong>Datos de facturación e impuestos:</strong> <strong>10 años</strong> desde la emisión (normativa fiscal y civil italiana, Art. 2220 del Código Civil).","<strong>Datos biométricos:</strong> durante el tiempo estrictamente necesario para la verificación y 12 meses adicionales para fines probatorios, salvo otras obligaciones legales.","<strong>Registros de cumplimiento y seguridad:</strong> mÃnimo <strong>180 dÃas</strong>, hasta 24 meses para investigaciones en curso o solicitudes de autoridad.","<strong>Contenido generado:</strong> según la Configuración Activa; al retirar o eliminar, el contenido se elimina salvo obligaciones de retención.","<strong>Autorizaciones y documentos BYO:</strong> durante la duración del uso del Contenido y 10 años adicionales para fines probatorios.","<strong>Datos de marketing:</strong> hasta la retirada del consentimiento o la objeción."]}]},{id:"sez-9",title:"9. Medidas de seguridad",body:[{kind:"p",text:"Fancy Capital adopta las medidas técnicas y organizativas adecuadas según el artÃculo 32 del RGPD, incluyendo:"},{kind:"ul",items:["cifrado en reposo y en tránsito con especial atención a datos biométricos y documentos de identidad;","controles de acceso basados en roles (RBAC), con datos biométricos y registros de cumplimiento restringidos al equipo de cumplimiento;","autenticación multifactor (MFA) obligatoria para el personal con acceso a datos sensibles;","cortafuegos de aplicaciones web (WAF), restricción geográfica (incluyendo el bloqueo de China continental), limitación de velocidad y detección de anomalÃas;","registro de auditorÃa de acceso y modificación de datos sensibles;","copias de seguridad periódicas y procedimientos de recuperación ante desastres;","gestión de riesgos de proveedores;","formación del personal en seguridad y protección de datos;","polÃticas internas de gestión de incidentes con notificación a la AGPD italiana en un plazo de 72 horas ante una brecha significativa (artÃculos 33 y 34 del RGPD)."]}]},{id:"sez-10",title:"10. Derechos del Interesado",body:[{kind:"p",text:"Según los artÃculos 15â22 del RGPD, el Interesado tiene derecho a:"},{kind:"ul",items:["acceder a sus datos personales y obtener una copia;","rectificar datos inexactos o completar datos incompletos;","suprimir datos (âderecho al olvidoâ) dentro de los lÃmites legales;","limitar el tratamiento;","portabilidad de los datos;","oponerse al tratamiento basado en interés legÃtimo o para marketing directo;","retirar el consentimiento en cualquier momento, sin perjuicio de la licitud del tratamiento anterior;","no ser objeto de decisiones totalmente automatizadas que produzcan efectos jurÃdicos o significativos (Art. 22 RGPD);",'presentar una reclamación ante la Autoridad Garante para la Protección de Datos de Italia (<a class="text-brand-secondary underline" href="https://www.garanteprivacy.it" target="_blank" rel="noreferrer">www.garanteprivacy.it</a>) o ante la autoridad de control de su estado de residencia.']},{kind:"p",text:'Para ejercer los derechos, escriba a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. El Responsable responderá en el plazo de un mes desde la recepción, sujeto a ampliaciones legales.'}]},{id:"sez-11",title:"11. Retirada del consentimiento y eliminación de cuenta",body:[{kind:"p",text:"11.1 â El Interesado puede retirar el consentimiento en cualquier momento (tratamiento biométrico, marketing, etc.), sin perjuicio de la licitud del tratamiento anterior."},{kind:"p",text:'11.2 â La eliminación de la cuenta puede solicitarse desde el Panel de Control o en <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Tras la eliminación:'},{kind:"ul",items:["los datos de registro y perfil se pseudonimizan o eliminan;","los datos biométricos se eliminan en un plazo de 12 meses desde la finalización del contrato;","los registros de cumplimiento se conservan durante el perÃodo mÃnimo establecido (180 dÃas y más) por motivos de seguridad y obligaciones legales;","el contenido generado ya entregado al Cliente puede seguir utilizándose, salvo infracciones confirmadas;","para los Modelos: el contenido ya aprobado y descargado por los Clientes permanece dentro de las aprobaciones concedidas."]}]},{id:"sez-12",title:"12. Menores",body:[{kind:"p",text:"La Plataforma no está destinada a menores de 18 años. Fancy Capital no recopila conscientemente datos personales de menores. Si se identifica una cuenta de un menor, será suspendida y los datos borrados."}]},{id:"sez-13",title:"13. Toma de decisiones automatizada",body:[{kind:"p",text:'La Plataforma utiliza moderación automatizada que puede bloquear o eliminar contenido individual. La intervención humana siempre está disponible en <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:"Fancy Capital no implementa decisiones totalmente automatizadas con efectos jurÃdicos o significativos sin intervención humana, salvo que sea obligatoriamente requerido por ley."}]},{id:"sez-14",title:"14. Ley de IA de la UE",body:[{kind:"p",text:"La Plataforma utiliza IA generativa. El Responsable se compromete a cumplir con el Reglamento (UE) 2024/1689 (la âLey de IAâ) a medida que las disposiciones relevantes sean aplicables, en particular las obligaciones de transparencia para el contenido generado (p. ej., etiquetado, cuando sea requerido por ley) y obligaciones especÃficas para la generación de rostros / sistemas de suplantación de identidad."}]},{id:"sez-15",title:"15. Cambios en esta PolÃtica de Privacidad",body:[{kind:"p",text:"El Responsable podrá actualizar esta PolÃtica en cualquier momento, notificando a los Interesados registrados por correo electrónico y/o en el Panel de Control. Los cambios sustanciales se notificarán con al menos 30 dÃas de antelación. La fecha de la última actualización se muestra en la parte superior de este documento."}]},{id:"sez-16",title:"16. Contactos",body:[{kind:"p",text:"Para cualquier solicitud o aclaración sobre esta PolÃtica de Privacidad:"},{kind:"ul",items:['<strong>Responsable:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','<strong>DPD</strong> (si es nombrado): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Dirección postal:</strong> Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italia","<strong>Correo electrónico certificado (PEC):</strong> [email protected]"]}]}]},i6={title:"Datenschutzerklärung",subtitle:"Informationen zur Verarbeitung personenbezogener Daten gemäà Artikel 13 und 14 der Verordnung (EU) 2016/679 (DSGVO).",lastUpdated:"28. Mai 2026",version:"1.0",sections:[{id:"sez-1",title:"1. Verantwortlicher",body:[{kind:"p",text:"Der Verantwortliche für die Datenverarbeitung ist <strong>Fancy Capital S.r.l.</strong>, mit Sitz in Albino (BG), Via Crespi 25, 24021, italienische Steuernummer/USt-IdNr. 04763600162, REA BG-487411, zertifizierte E-Mail-Adresse [email protected] (âFancy Capitalâ oder âder Verantwortlicheâ)."},{kind:"p",text:'Für Anfragen bezüglich der Verarbeitung personenbezogener Daten kann die betroffene Person an <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> schreiben.'},{kind:"p",text:'Sofern ernannt, ist der Datenschutzbeauftragte (DSB) unter <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> erreichbar.'}]},{id:"sez-2",title:"2. Anwendungsbereich",body:[{kind:"p",text:"Diese Erklärung gilt für die Datenverarbeitung, die über die HeroShots-Plattform unter heroshots.ai (die âPlattformâ) und die damit verbundenen Dienste (E-Mail, Support, Marketing) erfolgt."},{kind:"p",text:"Kategorien der betroffenen Personen:"},{kind:"ul",items:["<strong>Geschäftskunde</strong>: gesetzlicher Vertreter und operative Ansprechpartner des registrierten Unternehmens.","<strong>Verbraucherkunde</strong>: natürliche Person, die sich für persönliche Zwecke registriert.","<strong>
4868Model</strong>: natürliche Person, die sich registriert, um ihr Gesicht auf dem Marktplatz anzubieten.","<strong>BYO-Model</strong>: natürliche Person auÃerhalb der Plattform, deren Gesicht von einem Geschäftskunden mit einer unterzeichneten Freigabeerklärung hochgeladen wird.","<strong>Besucher</strong>: Personen, die die Website besuchen, ohne sich zu registrieren."]}]},{id:"sez-3",title:"3. Kategorien personenbezogener Daten",body:[{kind:"h3",text:"3.1 Registrierungs- und Identifikationsdaten"},{kind:"p",text:"Für alle registrierten betroffenen Personen: Vorname, Nachname, E-Mail-Adresse, Telefonnummer (falls angegeben), verschlüsselte Anmeldeinformationen, Geburtsdatum, Adresse, Steuernummer (Verbraucherkunden und Models), Firmenname und Steuerdaten (Geschäftskunden)."},{kind:"h3",text:"3.2 Ausweisdokument und biometrische Daten"},{kind:"p",text:"Für Models und Kunden, die eine Identitätsprüfung auslösen: Bild des Ausweisdokuments, extrahierte Identifikatoren (Nummer, Ablaufdatum, ausstellende Behörde), Gesichtsbild (Selfie / Liveness-Video), das für die biometrische Ãberprüfung erfasst wird."},{kind:"p",text:"Solche Daten stellen <strong>biometrische Daten</strong> dar, eine âbesondere Kategorie personenbezogener Datenâ gemäà Artikel 9 DSGVO, und werden ausschlieÃlich auf der Grundlage einer <strong>ausdrücklichen Einwilligung</strong> verarbeitet."},{kind:"p",text:"Für BYO-Models erhält Fancy Capital vom Geschäftskunden eine Kopie des Ausweises, der persönlichen Daten und einer unterzeichneten Freigabeerklärung des BYO-Models. Solche Daten werden als Auftragsverarbeiter im Namen des Geschäftskunden verarbeitet (siehe Abschnitt 5)."},{kind:"h3",text:"3.3 Plattform-Nutzungsdaten"},{kind:"ul",items:["Prompts und Parameter, die für die Erstellung von Inhalten übermittelt werden;","erstellte Inhalte (Bilder, Videos) und Metadaten (Zeitstempel, verwendetes KI-Modell, Ergebnis der Moderation);","auf die Plattform hochgeladene Assets;","Aktivitäten zur Genehmigung/Ablehnung von Inhalten (für Models);","Browserdaten: IP-Adresse, User-Agent, Sitzungs-IDs, Zugriffsprotokolle, Zeitstempel von Aktivitäten, ungefähre Geolokalisierung (Länderebene basierend auf der IP)."]},{kind:"h3",text:"3.4 Zahlungs- und Abrechnungsdaten"},{kind:"p",text:"Für betroffene Personen, die Abonnements aktivieren oder Credits kaufen: Abrechnungsdaten, Daten zur Zahlungsmethode (die von unserem Drittanbieter-Zahlungsdienstleister verarbeitet werden â Fancy Capital <strong>speichert keine vollständigen Kartendaten</strong>), Transaktionsverlauf."},{kind:"p",text:"Für Models: Bankverbindung (IBAN) für Auszahlungen, gesetzlich vorgeschriebene Steuerdaten (z. B. Quellensteuer, italienische Certificazione Unica)."},{kind:"h3",text:"3.5 Pseudonymer Identifikator (safety_identifier)"},{kind:"p",text:"Bei der Registrierung generiert die Plattform einen eindeutigen pseudonymen Identifikator, der bei jeder Erstellungsanfrage an Byteplus übermittelt wird, um die Rückverfolgbarkeit und die Verhinderung von Missbrauch zu gewährleisten. Die Zuordnung zur realen Identität ist verschlüsselt und nur für das Compliance-Team des Verantwortlichen zugänglich."},{kind:"h3",text:"3.6 Cookies und ähnliche Technologien"},{kind:"p",text:'Die Plattform verwendet unbedingt erforderliche, funktionale und â mit Einwilligung â Analyse- und Marketing-Cookies. Siehe die <a class="text-brand-secondary underline" href="/legal/cookies">Cookie-Richtlinie</a>.'}]},{id:"sez-4",title:"4. Zwecke und Rechtsgrundlagen",body:[{kind:"h3",text:"4.1 Bereitstellung der Dienste"},{kind:"p",text:"<strong>Zweck:</strong> Registrierung und Verwaltung des Kontos, Zugang zur Plattform, Funktionen zur Inhaltserstellung, Model-Marktplatz, Genehmigungsablauf für Inhalte, operative Mitteilungen."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong> Erfüllung des Vertrags (Art. 6 Abs. 1 lit. b DSGVO)."},{kind:"h3",text:"4.2 Vertragliche und steuerliche Pflichten"},{kind:"p",text:"<strong>Zweck:</strong> Rechnungsstellung, Zahlungen und Auszahlungen, steuerliche Pflichten, Beschwerden und Streitigkeiten."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong> Erfüllung des Vertrags (Art. 6 Abs. 1 lit. b) und gesetzliche Verpflichtungen (Art. 6 Abs. 1 lit. c DSGVO)."},{kind:"h3",text:"4.3 Identitätsprüfung und Biometrie"},{kind:"p",text:"<strong>Zweck:</strong> Identitätsprüfung des Models (oder gegebenenfalls des Kunden) über iDenfy, um Betrug, Identitätsdiebstahl und Missbrauch zu verhindern."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong> Ausdrückliche Einwilligung (Art. 9 Abs. 2 lit. a DSGVO) für biometrische Daten."},{kind:"h3",text:"4.4 Sicherheit, Missbrauchsprävention und Zusammenarbeit mit dem KI-Anbieter"},{kind:"p",text:"<strong>Zweck:</strong> Ãberwachung zur Sicherheit, Vorbeugung/Erkennung von Missbrauch, Inhaltsmoderation, Ãbermittlung des safety_identifier an Byteplus zur Rückverfolgbarkeit."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong>
4868 Berechtigtes Interesse des Verantwortlichen an der Sicherung der Plattform (Art. 6 Abs. 1 lit. f DSGVO) und vertragliche Verpflichtungen gegenüber Byteplus."},{kind:"h3",text:"4.5 Compliance und rechtliche Verpflichtungen"},{kind:"p",text:"<strong>Zweck:</strong> Aufbewahrung von Compliance-Protokollen (mindestens 180 Tage), Bearbeitung von Anfragen zuständiger Behörden, Ausübung der Rechte der betroffenen Personen."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong> Rechtliche Verpflichtung (Art. 6 Abs. 1 lit. c DSGVO) und berechtigtes Interesse (Art. 6 Abs. 1 lit. f DSGVO)."},{kind:"h3",text:"4.6 Service- und Marketingmitteilungen"},{kind:"p",text:"<strong>Zweck:</strong> Operative Benachrichtigungen (Inhaltsgenehmigung, Statusaktualisierungen, Ãnderungen der AGB) und â vorbehaltlich optionaler Einwilligung â kommerzielle Nachrichten über neue Funktionen und Angebote."},{kind:"p",text:"<strong>Rechtsgrundlage:</strong> Vertragserfüllung (Art. 6 Abs. 1 lit. b DSGVO) für Servicemitteilungen; Einwilligung (Art. 6 Abs. 1 lit. a DSGVO), jederzeit widerruflich, für Marketing."}]},{id:"sez-5",title:"5. Rollen bei der Verarbeitung",body:[{kind:"p",text:"Je nach Kontext agiert Fancy Capital als:"},{kind:"ul",items:["<strong>Eigenständiger Verantwortlicher</strong> â für Registrierungsdaten, Abrechnung, Sicherheit, Marketing und die Verwaltung der Beziehungen zu den Models.","<strong>Auftragsverarbeiter gemäà Art. 28 DSGVO</strong> â bei der Verarbeitung von BYO-Model-Daten im Auftrag des Geschäftskunden, der sie hochgeladen hat. Mit dem Geschäftskunden wird ein Auftragsverarbeitungsvertrag (AVV) abgeschlossen.","<strong>Eigenständiger Verantwortlicher</strong> â gegenüber dem Kunden, der Inhalte eines Marktplatz-Models verwendet: Der Kunde wird zum eigenständigen Verantwortlichen für die nachgelagerte Nutzung der genehmigten, heruntergeladenen Inhalte."]}]},{id:"sez-6",title:"6. Kategorien von Empfängern",body:[{kind:"h3",text:"6.1 Technologieanbieter (Auftragsverarbeiter gemäà Art. 28 DSGVO)"},{kind:"ul",items:["<strong>Byteplus</strong>: Anbieter des generativen KI-Modells. Empfängt Prompts, hochgeladene Assets und den safety_identifier. Unterliegt einem AVV.","<strong>iDenfy</strong> (EU â Litauen): Anbieter für biometrische Identitätsprüfung. Empfängt Ausweisdokument und Gesichtsbild zur Ãberprüfung. Unterliegt einem AVV.","<strong>Sightengine / Azure Content Safety</strong> (Microsoft Ireland Operations Ltd, EU): Inhaltsmoderation. Empfängt Prompts und Ausgaben zur Analyse. Unterliegt einem AVV.","<strong>Cloudflare</strong> (oder gleichwertige WAF): Perimetersicherheit, Geo-Restriktion, Anti-DDoS. Verarbeitet IPs und Anfragemetadaten.","<strong>Cloud-Hosting-Anbieter</strong> (AWS / GCP / Azure je nach Bereitstellung): Infrastruktur.","<strong>Anbieter für Protokollierung/Ãberwachung</strong> (z. B. Datadog, cloud ELK): Betriebs- und Compliance-Protokolle.","<strong>Zahlungsanbieter</strong> (z. B. Stripe): Zahlungsabwicklung, als eigenständiger Verantwortlicher für seinen eigenen Bereich."]},{kind:"h3",text:"6.2 Sonstige Empfänger"},{kind:"ul",items:["Zuständige Behörden (italienische Postpolizei, die italienische Datenschutzbehörde, Justizbehörden) auf begründete Anfrage oder im Rahmen von Meldepflichten.","Professionelle Berater (Steuerberater, Rechtsanwälte, Auditoren) zur Einhaltung rechtlicher Vorschriften."]}]},{id:"sez-7",title:"7. Ãbermittlungen auÃerhalb der EU/des EWR",body:[{kind:"p",text:"Einige Anbieter können personenbezogene Daten in Ländern auÃerhalb der EU/des EWR verarbeiten. In solchen Fällen ergreift der Verantwortliche die Garantien gemäà Art. 44 ff. DSGVO:"},{kind:"ul",items:["Prüfung eines etwaigen Angemessenheitsbeschlusses der Europäischen Kommission;","sofern kein Angemessenheitsbeschluss vorliegt, Unterzeichnung der <strong>Standardvertragsklauseln (SCCs)</strong> der Kommission;","fallweise Bewertung des Ziellandes (Transfer Impact Assessment) und gegebenenfalls zusätzliche technische/organisatorische MaÃnahmen."]},{kind:"p",text:'Betroffene Personen können eine Kopie der Garantien unter <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> anfordern.'}]},{id:"sez-8",title:"8. Aufbewahrungsfristen",body:[{kind:"ul",items:["<strong>Registrierungs- und Kontodaten:</strong> für die Dauer des Vertrags und weitere <strong>10 Jahre</strong> für Vertragsunterlagen und zur Rechtsverteidigung.","<strong>Abrechnungs- und Steuerdaten:</strong> <strong>10 Jahre</strong> ab Ausstellung (italienische Steuer- und Zivilrechtsvorschriften, Art. 2220 des italienischen Zivilgesetzbuches).","<strong>Biometrische Daten:</strong> für die zur Ãberprüfung unbedingt erforderliche Zeit und weitere 12 Monate zu Beweiszwecken, vorbehaltlich anderer gesetzlicher Verpflichtungen.","<strong>Compliance- und Sicherheitsprotokolle:</strong> mindestens <strong>180 Tage</strong>, bis zu 24 Monate bei laufenden Ermittlungen oder behördlichen Anfragen.","<strong>Erstellte Inhalte:</strong> gemäà der aktiven Konfiguration; bei Widerruf oder Löschung werden die Inhalte entfernt, vorbehaltlich der Aufbewahrungspflichten.","<strong>Freigabeerklärungen und BYO-Dokumente:</strong> für die Dauer der Nutzung der Inhalte und weitere 10 Jahre zu Beweiszwecken.","<strong>Marketingdaten:</strong> bis zum Widerruf der Einwilligung oder zum Widerspruch."]}]},{id:"sez-9",title:"9. SicherheitsmaÃnahmen",body:[{kind:"p",text:"Fancy Capital ergreift geeignete te
4868chnische und organisatorische MaÃnahmen gemäà Artikel 32 DSGVO, einschlieÃlich:"},{kind:"ul",items:["Verschlüsselung von Daten im Ruhezustand und während der Ãbertragung, mit besonderem Augenmerk auf biometrische Daten und Ausweisdokumente;","rollenbasierte Zugriffskontrollen (RBAC), wobei der Zugriff auf biometrische Daten und Compliance-Protokolle auf das Compliance-Team beschränkt ist;","verpflichtende Multi-Faktor-Authentifizierung (MFA) für Mitarbeiter mit Zugriff auf sensible Daten;","Web Application Firewall (WAF), Geo-Restriktion (einschlieÃlich Sperrung für Festlandchina), Ratenbegrenzung und Anomalieerkennung;","Audit-Protokollierung des Zugriffs auf und der Ãnderung von sensiblen Daten;","regelmäÃige Backups und Notfallwiederherstellungsverfahren;","Risikomanagement für Anbieter;","Schulung der Mitarbeiter zu Sicherheit und Datenschutz;","interne Richtlinien für das Vorfallmanagement mit Meldung an die italienische Datenschutzbehörde innerhalb von 72 Stunden nach einem erheblichen Verstoà (Artikel 33 und 34 DSGVO)."]}]},{id:"sez-10",title:"10. Rechte der betroffenen Person",body:[{kind:"p",text:"Gemäà Artikel 15â22 DSGVO hat die betroffene Person das Recht auf:"},{kind:"ul",items:["Auskunft über ihre personenbezogenen Daten und Erhalt einer Kopie;","Berichtigung unrichtiger Daten oder Vervollständigung unvollständiger Daten;","Löschung von Daten (âRecht auf Vergessenwerdenâ) im Rahmen der gesetzlichen Grenzen;","Einschränkung der Verarbeitung;","Datenübertragbarkeit;","Widerspruch gegen die Verarbeitung auf der Grundlage eines berechtigten Interesses oder für Direktmarketing;","jederzeitigen Widerruf der Einwilligung, ohne dass die RechtmäÃigkeit der vorangegangenen Verarbeitung berührt wird;","Nicht einer ausschlieÃlich auf einer automatisierten Verarbeitung beruhenden Entscheidung unterworfen zu werden, die ihr gegenüber rechtliche Wirkung entfaltet oder sie in ähnlicher Weise erheblich beeinträchtigt (Art. 22 DSGVO);",'eine Beschwerde bei der italienischen Datenschutzbehörde (<a class="text-brand-secondary underline" href="https://www.garanteprivacy.it" target="_blank" rel="noreferrer">www.garanteprivacy.it</a>) oder bei der Aufsichtsbehörde ihres Wohnsitzstaates einzureichen.']},{kind:"p",text:'Zur Ausübung der Rechte schreiben Sie bitte an <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Der Verantwortliche wird innerhalb eines Monats nach Eingang der Anfrage antworten, vorbehaltlich gesetzlicher Fristverlängerungen.'}]},{id:"sez-11",title:"11. Widerruf der Einwilligung und Kontolöschung",body:[{kind:"p",text:"11.1 â Die betroffene Person kann ihre Einwilligung jederzeit widerrufen (biometrische Verarbeitung, Marketing usw.), ohne dass die RechtmäÃigkeit der vor dem Widerruf erfolgten Verarbeitung berührt wird."},{kind:"p",text:'11.2 â Die Löschung des Kontos kann über das Dashboard oder unter <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> beantragt werden. Nach der Löschung:'},{kind:"ul",items:["werden Registrierungs- und Profildaten pseudonymisiert oder gelöscht;","werden biometrische Daten innerhalb von 12 Monaten nach Vertragsbeendigung gelöscht;","werden Compliance-Protokolle für den angegebenen Mindestzeitraum (180 Tage und darüber hinaus) aus Sicherheitsgründen und zur Erfüllung rechtlicher Verpflichtungen aufbewahrt;","bereits an den Kunden gelieferte erstellte Inhalte können weiterverwendet werden, auÃer bei bestätigten VerstöÃen;","für Models: Bereits von Kunden genehmigte und heruntergeladene Inhalte verbleiben im Rahmen der erteilten Genehmigungen."]}]},{id:"sez-12",title:"12. Minderjährige",body:[{kind:"p",text:"Die Plattform ist nicht für Minderjährige unter 18 Jahren bestimmt. Fancy Capital sammelt nicht wissentlich personenbezogene Daten von Minderjährigen. Wenn das Konto eines Minderjährigen identifiziert wird, wird es gesperrt und die Daten werden gelöscht."}]},{id:"sez-13",title:"13. Automatisierte Entscheidungsfindung",body:[{kind:"p",text:'Die Plattform verwendet eine automatisierte Moderation, die einzelne Inhalte blockieren oder entfernen kann. Eine menschliche Intervention ist jederzeit unter <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> möglich.'},{kind:"p",text:"Fancy Capital trifft keine vollautomatisierten Entscheidungen mit rechtlichen oder erheblichen Auswirkungen ohne menschliches Eingreifen, es sei denn, dies ist gesetzlich zwingend vorgeschrieben."}]},{id:"sez-14",title:"14. EU-KI-Gesetz (AI Act)",body:[{kind:"p",text:"Die Plattform verwendet generative KI. Der Verantwortliche verpflichtet sich zur Einhaltung der Verordnung (EU) 2024/1689 (der âAI Actâ), sobald die entsprechenden Bestimmungen anwendbar werden, insbesondere die Transparenzpflichten für generierte Inhalte (z. B. Kennzeichnung, wo gesetzlich vorgeschrieben) und die besonderen Pflichten für Systeme zur Generierung von Gesichtern / Nachahmung von Personen."}]},{id:"sez-15",title:"15. Ãnderungen dieser Datenschutzerklärung",body:[{kind:"p",text:"Der Verantwortliche kann diese Erklärung jederzeit aktualisieren und wird registrierte betroffene Personen per E-Mail und/oder über das Dashboard benachrichtigen. Wesentliche Ãnderungen werden mindestens 30 Tage im Voraus angekündigt. Das Datum der letzten Aktualisierung ist am Anfang dieses Dokuments angegeben."}]},{id:"sez-16",title:"16. Kontakte",body:[{kind:"p",text:"Für Anfragen oder zur Klärung von Fragen zu dieser Datenschutzerklärung:"},{kind:"ul",items:['<strong>Verantwortlicher:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','<strong>DSB</strong> (sofern ernannt): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Postanschrift:</strong> Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italien","<strong>Zertifizierte E-Mail (PEC):</strong> [email protected]"]}]}]},s6={title:"Politique de confidentialité",subtitle:"Informations sur le traitement des données à caractère personnel en vertu des articles 13 et 14 du Règlement (UE) 2016/679 (RGPD).",lastUpdated:"28 mai 2026",version:"1.0",sections:[{id:"sez-1",title:"1. Responsable du traitement",body:[{kind:"p",text:"Le responsable du traitement est <strong>Fancy Capital S.r.l.</strong>
4868, avec siège social à Albino (BG), Via Crespi 25, 24021, Italie, code fiscal/TVA 04763600162, REA BG-487411, adresse e-mail certifiée [email protected] (âFancy Capitalâ ou âle Responsable du traitementâ)."},{kind:"p",text:'Pour toute demande relative au traitement des données à caractère personnel, la Personne Concernée peut écrire à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:`S'il est nommé, le Délégué à la Protection des Données (DPD) peut être contacté à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.`}]},{id:"sez-2",title:"2. Champ d'application",body:[{kind:"p",text:"La présente Politique s'applique aux traitements effectués via la plateforme HeroShots à l'adresse heroshots.ai (la âPlateformeâ) et les services connexes (e-mail, support, marketing)."},{kind:"p",text:"Catégories de Personnes Concernées :"},{kind:"ul",items:["<strong>Client Professionnel</strong> : représentant légal et contacts opérationnels de l'entreprise enregistrée.","<strong>Client Consommateur</strong> : personne physique enregistrée à des fins personnelles.","<strong>Modèle</strong> : personne physique qui s'inscrit pour proposer son visage sur la place de marché.","<strong>Modèle BYO</strong> : personne physique externe à la Plateforme dont le visage est téléchargé par un Client Professionnel avec une décharge signée.","<strong>Visiteurs</strong> : personnes naviguant sur le site web sans s'enregistrer."]}]},{id:"sez-3",title:"3. Catégories de données à caractère personnel",body:[{kind:"h3",text:"3.1 Données d'enregistrement et d'identification"},{kind:"p",text:"Pour toutes les Personnes Concernées enregistrées : prénom, nom, e-mail, téléphone (si fourni), identifiants cryptés, date de naissance, adresse, code fiscal (Clients Consommateurs et Modèles), nom de l'entreprise et données fiscales (Clients Professionnels)."},{kind:"h3",text:"3.2 Document d'identité et données biométriques"},{kind:"p",text:"Pour les Modèles et les Clients nécessitant une vérification d'identité : image du document d'identité, identifiants extraits (numéro, expiration, autorité émettrice), image du visage (selfie / vidéo de vivacité) acquise pour la vérification biométrique."},{kind:"p",text:"Ces données constituent des <strong>données biométriques</strong>, une âcatégorie particulière de données à caractère personnelâ au sens de l'article 9 du RGPD, et sont traitées uniquement sur la base d'un <strong>consentement explicite</strong>."},{kind:"p",text:"Pour les Modèles BYO, Fancy Capital reçoit du Client Professionnel une copie de la pièce d'identité du Modèle BYO, ses données personnelles et une décharge signée. Ces données sont traitées en tant que sous-traitant pour le compte du Client Professionnel (voir section 5)."},{kind:"h3",text:"3.3 Données d'utilisation de la Plateforme"},{kind:"ul",items:["prompts et paramètres soumis pour la génération de contenu ;","contenu généré (images, vidéo) et métadonnées (horodatage, modèle d'IA utilisé, résultat de la modération) ;","actifs téléchargés sur la Plateforme ;","activité d'approbation/de refus de contenu (pour les Modèles) ;","données de navigation : adresse IP, agent utilisateur, identifiants de session, journaux d'accès, horodatages d'activité, géolocalisation approximative (niveau pays à partir de l'IP)."]},{kind:"h3",text:"3.4 Données de paiement et de facturation"},{kind:"p",text:"Pour les Personnes Concernées activant des abonnements ou achetant des crédits : données de facturation, données de méthode de paiement (gérées par notre prestataire tiers â Fancy Capital <strong>ne stocke pas l'ensemble des données de carte</strong>), historique des transactions."},{kind:"p",text:"Pour les Modèles : coordonnées bancaires (IBAN) pour les paiements, données fiscales requises par la loi (par exemple, retenue à la source, Certificazione Unica italienne)."},{kind:"h3",text:"3.5 Identifiant pseudonyme (safety_identifier)"},{kind:"p",text:"Lors de l'enregistrement, la Plateforme génère un identifiant pseudonyme unique transmis à Byteplus à chaque demande de génération, pour la traçabilité et la prévention des abus. Le mappage à l'identité réelle est chiffré et accessible uniquement à l'équipe de conformité du Responsable du traitement."},{kind:"h3",text:"3.6 Cookies et technologies similaires"},{kind:"p",text:`La Plateforme utilise des cookies strictement nécessaires, fonctionnels et â avec consentement â des cookies d'analyse et de marketing. Voir la <a class="text-brand-secondary underline" href="/legal/cookies">Politique en matière de cookies</a>.`}
4868]},{id:"sez-4",title:"4. Finalités et bases légales",body:[{kind:"h3",text:"4.1 Fourniture de services"},{kind:"p",text:"<strong>Finalité :</strong> enregistrement et gestion du compte, accès à la Plateforme, fonctionnalités de génération de contenu, place de marché des Modèles, flux d'approbation de contenu, communications opérationnelles."},{kind:"p",text:"<strong>Base légale :</strong> exécution du contrat (Art. 6.1.b RGPD)."},{kind:"h3",text:"4.2 Obligations contractuelles et fiscales"},{kind:"p",text:"<strong>Finalité :</strong> facturation, paiements et versements, obligations fiscales, plaintes et litiges."},{kind:"p",text:"<strong>Base légale :</strong> exécution du contrat (Art. 6.1.b) et obligations légales (Art. 6.1.c)."},{kind:"h3",text:"4.3 Vérification d'identité et biométrie"},{kind:"p",text:"<strong>Finalité :</strong> vérification de l'identité du Modèle (ou du Client, le cas échéant) via iDenfy, afin de prévenir la fraude, l'usurpation d'identité et les abus."},{kind:"p",text:"<strong>Base légale :</strong> consentement explicite (Art. 9.2.a RGPD) pour les données biométriques."},{kind:"h3",text:"4.4 Sécurité, prévention des abus et coopération avec le fournisseur d'IA"},{kind:"p",text:"<strong>Finalité :</strong> surveillance pour la sécurité, prévention/détection des abus, modération de contenu, transmission de l'identifiant safety_identifier à Byteplus à des fins de traçabilité."},{kind:"p",text:"<strong>Base légale :</strong> intérêt légitime du Responsable du traitement à sécuriser la Plateforme (Art. 6.1.f), et obligations contractuelles avec Byteplus."},{kind:"h3",text:"4.5 Conformité et obligations légales"},{kind:"p",text:"<strong>Finalité :</strong> conservation des journaux de conformité (minimum 180 jours), traitement des demandes des autorités compétentes, exercice des droits des Personnes Concernées."},{kind:"p",text:"<strong>Base légale :</strong> obligation légale (Art. 6.1.c) et intérêt légitime (Art. 6.1.f)."},{kind:"h3",text:"4.6 Communications de service et de marketing"},{kind:"p",text:"<strong>Finalité :</strong> notifications opérationnelles (approbation de contenu, mises à jour de statut, modifications des Conditions Générales) et â sous réserve de consentement optionnel â messages commerciaux concernant de nouvelles fonctionnalités et offres."},{kind:"p",text:"<strong>Base légale :</strong> exécution du contrat (Art. 6.1.b) pour les messages de service ; consentement (Art. 6.1.a), révocable à tout moment, pour le marketing."}]},{id:"sez-5",title:"5. Rôles dans le traitement",body:[{kind:"p",text:"Selon le contexte, Fancy Capital agit en tant que :"},{kind:"ul",items:["<strong>Responsable du traitement indépendant</strong> â pour les données d'enregistrement, la facturation, la sécurité, le marketing et la gestion des relations avec les Modèles.","<strong>Sous-traitant au sens de l'Art. 28 du RGPD</strong> â lors du traitement des données des Modèles BYO pour le compte du Client Professionnel qui les a téléchargées. Un accord de traitement des données (DPA) est signé avec le Client Professionnel.","<strong>Responsable du traitement indépendant</strong> â avec le Client qui utilise le contenu d'un Modèle de la Place de Marché : le Client devient responsable du traitement indépendant pour l'utilisation en aval du contenu approuvé et téléchargé."]}]},{id:"sez-6",title:"6. Catégories de destinataires",body:[{kind:"h3",text:"6.1 Fournisseurs de technologie (sous-traitants au sens de l'Art. 28 du RGPD)"},{kind:"ul",items:["<strong>Byteplus</strong> : fournisseur de modèle d'IA générative. Reçoit les prompts, les actifs téléchargés et l'identifiant safety_identifier. Assujetti à un DPA.","<strong>iDenfy</strong> (UE â Lituanie) : fournisseur de vérification d'identité biométrique. Reçoit le document d'identité et l'image du visage pour vérification. Assujetti à un DPA.","<strong>Sightengine / Azure Content Safety</strong> (Microsoft Ireland Operations Ltd, UE) : modération de contenu. Reçoit les prompts et les sorties pour analyse. Assujetti à un DPA.","<strong>Cloudflare</strong> (ou WAF équivalent) : sécurité périmétrique, géo-restriction, anti-DDoS. Traite les adresses IP et les métadonnées de requête.","<strong>Fournisseur d'hébergement cloud</strong>
4868 (AWS / GCP / Azure tel que déployé) : infrastructure.","<strong>Fournisseur de journalisation/surveillance</strong> (par exemple, Datadog, cloud ELK) : journaux opérationnels et de conformité.","<strong>Fournisseur de services de paiement</strong> (par exemple, Stripe) : traitement des paiements, en tant que responsable du traitement indépendant pour son propre champ d'application."]},{kind:"h3",text:"6.2 Autres destinataires"},{kind:"ul",items:["Autorités compétentes (Police Postale italienne, l'Autorité italienne de protection des données, autorités judiciaires) sur demande motivée ou en vertu d'obligations de déclaration.","Conseillers professionnels (experts-comptables, avocats, auditeurs) pour la conformité légale."]}]},{id:"sez-7",title:"7. Transferts hors UE/EEE",body:[{kind:"p",text:"Certains fournisseurs peuvent traiter des données à caractère personnel dans des pays situés en dehors de l'UE/EEE. Dans de tels cas, le Responsable du traitement adopte les garanties prévues par les articles 44 et suivants du RGPD :"},{kind:"ul",items:["vérification de toute décision d'adéquation de la Commission européenne ;","en l'absence de décision d'adéquation, signature des <strong>Clauses Contractuelles Types (CCT)</strong> de la Commission ;","évaluation au cas par cas du pays de destination (évaluation d'impact du transfert) et mesures techniques/organisationnelles supplémentaires si nécessaire."]},{kind:"p",text:'Les Personnes Concernées peuvent demander une copie des garanties à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"sez-8",title:"8. Durées de conservation",body:[{kind:"ul",items:["<strong>Données d'enregistrement et de compte :</strong> pendant la durée du contrat et <strong>10 ans</strong> supplémentaires pour la documentation contractuelle et la défense juridique.","<strong>Données de facturation et fiscales :</strong> <strong>10 ans</strong> à compter de l'émission (règles fiscales et civiles italiennes, Art. 2220 du Code Civil).","<strong>Données biométriques :</strong> pendant le temps strictement nécessaire à la vérification et 12 mois supplémentaires à des fins probatoires, sauf autres obligations légales.","<strong>Journaux de conformité et de sécurité :</strong> minimum <strong>180 jours</strong>, jusqu'à 24 mois pour les enquêtes en cours ou les demandes des autorités.","<strong>Contenu généré :</strong> selon la configuration active ; en cas de retrait ou de suppression, le contenu est supprimé, sauf obligations de conservation.","<strong>Décharges et documents BYO :</strong> pendant la durée d'utilisation du Contenu et 10 ans supplémentaires à des fins probatoires.","<strong>Données de marketing :</strong> jusqu'au retrait du consentement ou à l'opposition."]}]},{id:"sez-9",title:"9. Mesures de sécurité",body:[{kind:"p",text:"Fancy Capital adopte des mesures techniques et organisationnelles appropriées en vertu de l'article 32 du RGPD, notamment :"},{kind:"ul",items:["chiffrement au repos et en transit avec une attention particulière aux données biométriques et aux documents d'identité ;","contrôles d'accès basés sur les rôles (RBAC), avec des données biométriques et des journaux de conformité restreints à l'équipe de conformité ;","authentification multi-facteurs (MFA) obligatoire pour le personnel ayant accès aux données sensibles ;","Pare-feu d'Application Web (WAF), géo-restriction (y compris le blocage de la Chine continentale), limitation de débit et détection d'anomalies ;","journalisation des accès et des modifications des données sensibles ;","sauvegardes périodiques et procédures de reprise après sinistre ;","gestion des risques des fournisseurs ;","formation du personnel à la sécurité et à la protection des données ;","politiques internes de gestion des incidents avec notification à l'Autorité italienne de protection des données dans les 72 heures suivant une violation significative (Articles 33 et 34 du RGPD)."]}]},{id:"sez-10",title:"10. Droits de la personne concernée",body:[{kind:"p",text:"Conformément aux Articles 15-22 du RGPD, la Personne Concernée a le droit de :"},{kind:"ul",items:["accéder à ses données à caractère personnel et en obtenir une copie ;","rectifier les données inexactes ou compléter les données incomplètes ;","effacer les données (âdroit à l'oubliâ) dans les limites légales ;","limiter le traitement ;","portabilité des données ;","s'opposer au traitement fondé sur l'intérêt légitime ou à des fins de marketing direct ;","retirer son consentement à tout moment, sans préjudice de la licéité du traitement préalable ;","ne pas faire l'objet de décisions entièrement automatisées produisant des effets juridiques ou significatifs (Art. 22 RGPD) ;",`introduire une réclamation auprès de l'Autorité italienne de protection des données (<a class="text-brand-secondary underline" href="https://www.garanteprivacy.it" target="_blank" rel="noreferrer">www.garanteprivacy.it</a>) ou de l'autorité de contrôle de son Ãtat de résidence.`]},{kind:"p",text:`Pour exercer vos droits, écrivez à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Le Responsable du traitement répondra dans un délai d'un mois à compter de la réception, sous réserve des prolongations légales.`}]},{id:"sez-11",title:"11. Retrait du consentement et suppression du compte",body:[{kind:"p",text:"11.1 â La Personne Concernée peut retirer son consentement à tout moment (traitement biométrique, marketing, etc.), sans préjudice de la licéité du traitement préalable."},{kind:"p",text:'11.2 â La suppression du compte peut être demandée depuis le Tableau de bord ou à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Lors de la suppression :'},{kind:"ul",items:["les données d'enregistrement et de profil sont pseudonymisées ou supprimées ;","les données biométriques sont supprimées dans les 12 mois suivant la résiliation du contrat ;","les journaux de conformité sont conservés pendant la période minimale indiquée (180 jours et au-delà ) pour des raisons de sécurité et d'obligations légales ;","le contenu généré déjà livré au Client peut rester utilisé, sauf en cas de violations confirmées ;","pour les Modèles : le contenu déjà approuvé et téléchargé par les Clients reste dans le cadre des approbations accordées."]}]},{id:"sez-12",title:"12. Mineurs",body:[{kind:"p",text:"La Plateforme n'est pas destinée aux mineurs de moins de 18 ans. Fancy Capital ne collecte pas sciemment de données à caractère personnel de mineurs. Si un compte de mineur est identifié, il sera suspendu et les données effacées."}]},{id:"sez-13",title:"13. Prise de décision automatisée",body:[{kind:"p",text:'La Plateforme utilise une modération automatisée qui peut bloquer ou supprimer du contenu individuel. Une intervention humaine est toujours disponible à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'},{kind:"p",text:"Fancy Capital ne déploie pas de décisions entièrement automatisées ayant des effets juridiques ou significatifs sans intervention humaine, sauf si cette intervention est rendue obligatoire par la loi."}]},{id:"sez-14",title:"14. Loi européenne sur l'IA (EU AI Act)",body:[{kind:"p",text:"La Plateforme utilise l'IA générative. Le Responsable du traitement s'engage à se conformer au Règlement (UE) 2024/1689 (la âLoi sur l'IAâ) au fur et à mesure que les dispositions pertinentes deviennent applicables, notamment les obligations de transparence pour le contenu généré (par exemple, l'étiquetage, lorsque requis par la loi) et les obligations spécifiques pour les systèmes de génération de visages / d'usurpation d'identité."}]},{id:"sez-15",title:"15. Modifications de la présente Politique de Confidentialité",body:[{kind:"p",text:"Le Responsable du traitement peut mettre à jour la présente Politique à tout moment, en informant les Personnes Concernées enregistrées par e-mail et/ou via le Tableau de bord. Les modifications substantielles sont notifiées au moins 30 jours à l'avance. La date de la dernière mise à jour est indiquée en haut de ce document."}]},{id:"sez-16",title:"16. Contacts",body:[{kind:"p",text:"Pour toute question ou clarification concernant cette Politique de Confidentialité :"},{kind:"ul",items:['<strong>Responsable du traitement :</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','<strong>DPD</strong> (si nommé) : <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Adresse postale :</strong> Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italie","<strong>E-mail certifié (PEC) :</strong> [email protected]"]}]}]},l6={title:"Acceptable Use Policy (AUP)",subtitle:"Regole d'uso della piattaforma HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 maggio 2026",version:"1.0",sections:[{id:"aup-1",title:"1. Premessa",body:[{kind:"p",text:"La presente Acceptable Use Policy («AUP») disciplina le regole d'uso della piattaforma HeroShots (la «Piattaforma»), gestita da Fancy Capital S.r.l.
4868(«Fancy Capital»). L'AUP si applica a tutti gli utenti della Piattaforma, ivi inclusi Clienti Aziende, Clienti Consumatori e Model."},{kind:"p",text:"Mediante la registrazione e/o l'utilizzo della Piattaforma, l'utente accetta integralmente la presente AUP. L'AUP costituisce parte integrante dei Termini e Condizioni della Piattaforma."},{kind:"p",text:"La violazione, anche solo sospetta o segnalata, della presente AUP può comportare la sospensione immediata dell'account, la rimozione dei contenuti, la risoluzione del contratto, la segnalazione alle autorità competenti e l'eventuale azione di risarcimento."}]},{id:"aup-2",title:"2. Principi generali",body:[{kind:"p",text:"L'utente si impegna a utilizzare la Piattaforma:"},{kind:"ul",items:["nel rispetto della legge applicabile (italiana, europea e â ove applicabile â internazionale);","nel rispetto dei diritti di terzi (diritti della personalità , diritto d'immagine, diritti di proprietà intellettuale, dati personali);","nel rispetto degli altri utenti della Piattaforma;","in buona fede e senza intenti fraudolenti, abusivi o lesivi."]}]},{id:"aup-3",title:"3. Usi vietati",body:[{kind:"p",text:"à espressamente vietato utilizzare la Piattaforma per generare, caricare, distribuire o conservare contenuti che rientrino in una o più delle seguenti categorie:"},{kind:"h3",text:"3.1 Contenuti pedopornografici e relativi a minori"},{kind:"ul",items:["materiale pedopornografico (CSAM) sotto qualsiasi forma, anche generato dall'AI;","qualsiasi contenuto sessuale o sessualmente suggestivo raffigurante minori, anche se l'età è ambigua;","contenuti che ritraggono minori in contesti inappropriati, anche con finalità apparentemente innocue;","contenuti finalizzati al grooming o al contatto inappropriato con minori."]},{kind:"h3",text:"3.2 Contenuti sessuali non consensuali e materiale intimo"},{kind:"ul",items:["contenuti sessualmente espliciti o suggestivi raffiguranti persone identificabili (incluso Model Marketplace e Model BYO) senza specifico ed esplicito consenso scritto;","non-consensual intimate imagery (NCII), incluso «revenge porn» e deepfake pornografici;","contenuti finalizzati alla creazione di materiale di sfruttamento sessuale di adulti senza il loro consenso."]},{kind:"h3",text:"3.3 Deepfake illegittimi e impersonificazione fraudolenta"},{kind:"ul",items:["contenuti che impersonifichino persone reali al fine di ingannare il pubblico circa la loro identità o le loro dichiarazioni;","contenuti finalizzati a commettere frodi, truffe romantiche, frodi finanziarie, manipolazione del mercato;","contenuti che fingano dichiarazioni di personaggi pubblici, politici, dirigenti, magistrati, autorità religiose;","contenuti che integrino le fattispecie di sostituzione di persona (art. 494 c.p.) o di reati informatici."]},{kind:"h3",text:"3.4 Contenuti diffamatori, denigratori e lesivi"},{kind:"ul",items:["contenuti diffamatori, denigratori, ingiuriosi o lesivi dell'onore e della reputazione di persone identificabili;","contenuti finalizzati a molestare, intimidire, ricattare o minacciare persone identificabili;","contenuti che istighino all'odio razziale, etnico, religioso, di genere, di orientamento sessuale o di disabilità ."]},{kind:"h3",text:"3.5 Contenuti illegali e di reato"},{kind:"ul",items:["contenuti che integrino fattispecie di reato (estorsione, truffa, terrorismo, apologia di reato, ecc.);","contenuti finalizzati alla vendita, promozione o uso di sostanze illegali, armi, materiali esplosivi;","contenuti che violino sanzioni internazionali o embarghi commerciali;","contenuti finalizzati a evadere obblighi fiscali, riciclaggio o finanziamento al terrorismo."]},{kind:"h3",text:"3.6 Contenuti politici, religiosi o controversi"},{kind:"p",text:"Salvo specifico ed esplicito consenso scritto del soggetto ritratto:"},{kind:"ul",items:["contenuti raffiguranti personalità politiche, capi di Stato, esponenti di partiti, candidati elettorali;","contenuti raffiguranti autorità religiose o leader spirituali;","contenuti finalizzati a influenzare elezioni o referendum («disinformazione elettorale»);","contenuti che possano essere percepiti come endorsement politico o religioso non autorizzato."]},{kind:"h3",text:"3.7 Violazione di proprietà intellettuale"},{kind:"ul",items:["contenuti che violino diritti di proprietà intellettuale di terzi (marchi registrati, opere protette dal diritto d'autore, design industriale, brevetti);","contenuti che riproducano personaggi, logo, design o elementi di brand di proprietà di terzi senza autorizzazione;","contenuti che incorporino musica, suoni, font o altri elementi non liberamente utilizzabili."]},{kind:"h3",text:"3.8 Abuso tecnico della Piattaforma"},{kind:"ul",items:["tentativi di aggirare, manomettere o disattivare le misure di sicurezza, moderazione, watermarking, geo-restrizione, rate limiting o tracciabilità ;","uso di bot, scraping automatizzato non autorizzato, reverse engineering o tentativi di estrarre i modelli AI sottostanti;","creazione di account multipli per eludere limiti, ban o controlli;","attività che possano compromettere la stabilità , la sicurezza o la disponibilità della Piattaforma (es. DDoS, brute force, exploit);","rivendita o sublicenza non autorizzata dell'accesso alla Piattaforma o dei contenuti generati."]},{kind:"h3",text:"3.9 Sorveglianza, profilazione massiva, identificazione biometrica"},{kind:"ul",items:["uso della Piattaforma per finalità di sorveglianza di massa, identificazione biometrica di soggetti in spazi pubblici, profilazione massiva di terzi;","uso della Piattaforma per identificare o rintracciare singole persone («doxxing»);","uso della Piattaforma in modo incompatibile con le disposizioni dell'AI Act UE (Regolamento (UE) 2024/1689) relative ai sistemi vietati o ad alto rischio."]},{kind:"h3",text:"3.10 Aggiramento dei controlli di consenso"},{kind:"ul",items:["caricamento di volti di terzi senza la documentazione richiesta (liberatoria firmata, copia documento ID);","uso del marketplace Model in modi che aggirino il diritto di approvazione del singolo Model;","falsificazione o manipolazione di documenti di liberatoria o di consensi."]}]},{id:"aup-4",title:"4. Segnalazioni di violazione",body:[{kind:"p",text:"Chiunque ritenga che un contenuto presente sulla Piattaforma o pubblicato a partire dalla Piattaforma violi la presente AUP può inviare una segnalazione a:"},{kind:"ul",items:['<strong>Email:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Modulo in-app:</strong>
4868 funzione «Segnala contenuto» in Dashboard."]},{kind:"p",text:"Le segnalazioni saranno gestite dal team compliance di Fancy Capital, che valuterà tempestivamente la situazione e adotterà le misure necessarie. In caso di violazione confermata, il contenuto sarà rimosso, l'account dell'autore sarà sospeso o chiuso e â ove richiesto dalla gravità del caso â sarà effettuata segnalazione alle autorità competenti."},{kind:"p",text:'Per segnalazioni urgenti relative a contenuti pedopornografici (CSAM), violenza estrema o minacce imminenti, è possibile contattare contestualmente le autorità competenti (es. Polizia Postale, <a class="text-brand-secondary underline" href="https://www.commissariatodips.it" target="_blank" rel="noreferrer">www.commissariatodips.it</a>).'}]},{id:"aup-5",title:"5. Conseguenze della violazione",body:[{kind:"p",text:"In caso di violazione, anche solo sospetta o segnalata da terzi, della presente AUP, Fancy Capital potrà :"},{kind:"ul",items:["rimuovere immediatamente il contenuto interessato (incluse anteprime, asset e contenuti generati);","sospendere temporaneamente l'account dell'utente, in attesa di accertamenti;","chiudere definitivamente l'account dell'utente in caso di violazione confermata;","conservare i log e gli artefatti relativi alla violazione per finalità probatorie e di compliance;","segnalare la violazione alle autorità competenti (Polizia Postale, Garante Privacy, autorità giudiziaria) ove richiesto dalla legge o dalla gravità del caso;","agire per il risarcimento dei danni subiti, ivi inclusi i danni reputazionali e le eventuali sanzioni inflitte a Fancy Capital da parte di Byteplus o di autorità ."]},{kind:"p",text:"In caso di violazioni gravi (in particolare relative a CSAM, terrorismo, deepfake illegittimi, non-consensual intimate imagery), la sospensione dell'account è immediata e la segnalazione alle autorità è obbligatoria."},{kind:"p",text:"L'utente sospeso o chiuso per violazione dell'AUP <strong>perde il diritto</strong> a qualsiasi rimborso, indennizzo o restituzione di crediti residui, di compensi maturati (per i Model) o di importi versati."}]},{id:"aup-6",title:"6. Gradualità delle misure",body:[{kind:"p",text:"Fancy Capital applica le misure di cui sopra con criterio di gradualità , proporzionalità e ragionevolezza, in funzione della gravità della violazione, dell'eventuale recidiva e della cooperazione dell'utente. In linea di principio:"},{kind:"ul",items:["Violazioni lievi e non recidive (es. uso improprio di un singolo prompt, ambiguità interpretativa) â avvertimento scritto + rimozione del contenuto.","Violazioni moderate o recidive (es. ripetuti tentativi di aggirare la moderazione, uso di contenuti privi di liberatoria valida) â sospensione temporanea (7â30 giorni) + rimozione + log.","Violazioni gravi (CSAM, NCII, deepfake illegittimi, frodi, terrorismo, ecc.) â chiusura immediata + segnalazione alle autorità + conservazione probatoria."]},{kind:"p",text:'Le decisioni di sospensione e chiusura possono essere contestate scrivendo a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. Il team compliance riesaminerà il caso e fornirà risposta motivata entro 15 giorni dalla ricezione del ricorso. à sempre garantito il diritto di intervento umano nelle decisioni di sospensione automatica.'}]},{id:"aup-7",title:"7. Modifiche all'AUP",body:[{kind:"p",text:"Fancy Capital si riserva il diritto di modificare la presente AUP per riflettere l'evoluzione della normativa applicabile, le segnalazioni ricevute, l'evoluzione dei rischi e delle prassi di settore. Le modifiche sono comunicate agli utenti registrati tramite email e/o notifica in Dashboard con almeno 30 giorni di anticipo per le modifiche sostanziali."},{kind:"p",text:"La data di ultimo aggiornamento è indicata in testa al presente documento. La versione storica delle modifiche è disponibile su richiesta."}]},{id:"aup-8",title:"8. Contatti",body:[{kind:"ul",items:['Email (segnalazioni, ricorsi e supporto): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','PEC: <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"Indirizzo postale: Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italia"]}]}]},c6={title:"Acceptable Use Policy (AUP)",subtitle:"Rules for using the HeroShots platform (Fancy Capital S.r.l.).",lastUpdated:"May 28, 2026",version:"1.0",sections:[{id:"aup-1",title:"1. Introduction",body:[{kind:"p",text:"This Acceptable Use Policy (âAUPâ) sets the rules for using the HeroShots platform (the âPlatformâ), operated by Fancy Capital S.r.l. It applies to all users â Business Customers, Consumer Customers and Models."},{kind:"p",text:"By registering and/or using the Platform, the user accepts this AUP in full. The AUP is an integral part of the Platform's Terms and Conditions."},{kind:"p",text:"Any breach (including suspected or reported) may result in immediate account suspension, content removal, contract termination, reporting to competent authorities and damages claims."}]},{id:"aup-2",title:"2. General principles",body:[{kind:"p",text:"The user undertakes to use the Platform:"},{kind:"ul",items:["in compliance with applicable Italian, EU and (where applicable)
4868international law;","respecting third-party rights (personality rights, image rights, IP rights, personal data);","respecting other users of the Platform;","in good faith and without fraudulent, abusive or harmful intent."]}]},{id:"aup-3",title:"3. Prohibited uses",body:[{kind:"p",text:"It is expressly forbidden to use the Platform to generate, upload, distribute or store content that falls within one or more of the following categories:"},{kind:"h3",text:"3.1 Child sexual abuse material and minors"},{kind:"ul",items:["child sexual abuse material (CSAM) in any form, including AI-generated;","any sexual or sexually suggestive content depicting minors, even where age is ambiguous;","content depicting minors in inappropriate contexts, even with apparently innocent purposes;","content intended for grooming or inappropriate contact with minors."]},{kind:"h3",text:"3.2 Non-consensual sexual or intimate content"},{kind:"ul",items:["sexually explicit or suggestive content depicting identifiable persons (including Marketplace and BYO Models) without specific written consent;","non-consensual intimate imagery (NCII), including ârevenge pornâ and pornographic deepfakes;","content intended to create non-consensual sexual exploitation material involving adults."]},{kind:"h3",text:"3.3 Unlawful deepfakes and fraudulent impersonation"},{kind:"ul",items:["content impersonating real people to deceive the public about their identity or statements;","content used for fraud, romance scams, financial fraud or market manipulation;","fake statements attributed to public figures, politicians, executives, judges, religious authorities;","content amounting to identity substitution (Art. 494 of the Italian Criminal Code) or computer crimes."]},{kind:"h3",text:"3.4 Defamatory, denigrating and harmful content"},{kind:"ul",items:["defamatory, denigrating, insulting content or content harming the honour and reputation of identifiable persons;","content intended to harass, intimidate, blackmail or threaten identifiable persons;","content inciting racial, ethnic, religious, gender, sexual orientation or disability hatred."]},{kind:"h3",text:"3.5 Illegal content and crimes"},{kind:"ul",items:["content constituting criminal offences (extortion, fraud, terrorism, criminal apology, etc.);","content for the sale, promotion or use of illegal substances, weapons, explosives;","content violating international sanctions or trade embargoes;","content intended for tax evasion, money laundering or terrorism financing."]},{kind:"h3",text:"3.6 Political, religious or controversial content"},{kind:"p",text:"Save for specific, explicit written consent of the depicted person:"},{kind:"ul",items:["content depicting political figures, heads of state, party leaders, electoral candidates;","content depicting religious authorities or spiritual leaders;","content intended to influence elections or referendums (âelectoral disinformationâ);","content perceivable as unauthorised political or religious endorsement."]},{kind:"h3",text:"3.7 Intellectual property infringement"},{kind:"ul",items:["content infringing third-party IP rights (trademarks, copyrighted works, industrial designs, patents);","content reproducing third-party characters, logos, designs or brand elements without authorisation;","content incorporating music, sounds, fonts or other non-freely usable elements."]},{kind:"h3",text:"3.8 Technical abuse of the Platform"},{kind:"ul",items:["attempts to bypass, tamper with or disable security, moderation, watermarking, geo-restriction, rate limiting or traceability;","use of bots, unauthorised automated scraping, reverse engineering or attempts to extract underlying AI models;","creation of multiple accounts to circumvent limits, bans or controls;","activities that may impair Platform stability, security or availability (DDoS, brute force, exploits);","unauthorised resale or sublicensing of Platform access or generated content."]},{kind:"h3",text:"3.9 Surveillance, mass profiling, biometric identification"},{kind:"ul",items:["use of the Platform for mass surveillance, biometric identification in public spaces, or mass profiling of third parties;","use of the Platform to identify or track individual persons (âdoxxingâ);","use incompatible with EU AI Act provisions on prohibited or high-risk systems."]}
4868,{kind:"h3",text:"3.10 Circumvention of consent controls"},{kind:"ul",items:["uploading third-party faces without the required documentation (signed release, ID copy);","using the Model marketplace in ways that bypass a Model's approval right;","falsification or manipulation of releases or consent documents."]}]},{id:"aup-4",title:"4. Reporting violations",body:[{kind:"p",text:"Anyone may report a suspected breach to:"},{kind:"ul",items:['<strong>Email:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>In-app form:</strong> âReport contentâ in the Dashboard."]},{kind:"p",text:"Reports are handled by Fancy Capital's compliance team, which will promptly assess the situation and take the necessary measures. Where confirmed, the content is removed, the author's account suspended or closed and â where the gravity requires â reported to competent authorities."},{kind:"p",text:'For urgent reports concerning CSAM, extreme violence or imminent threats, also contact local authorities (in Italy, the Postal Police: <a class="text-brand-secondary underline" href="https://www.commissariatodips.it" target="_blank" rel="noreferrer">www.commissariatodips.it</a>).'}]},{id:"aup-5",title:"5. Consequences of breach",body:[{kind:"p",text:"On breach (including suspected or reported), Fancy Capital may:"},{kind:"ul",items:["immediately remove the content (including previews, assets and generated outputs);","temporarily suspend the user's account pending investigation;","permanently close the account on confirmed breach;","retain logs and artifacts for evidentiary and compliance purposes;","report the breach to competent authorities (Italian Postal Police, Italian DPA, judiciary) where required by law or the gravity of the case;","pursue damages, including reputational damages and any sanctions imposed on Fancy Capital by Byteplus or authorities."]},{kind:"p",text:"For serious breaches (CSAM, NCII, unlawful deepfakes, fraud, terrorism, etc.), suspension is immediate and reporting to authorities is mandatory."},{kind:"p",text:"Users suspended or closed for AUP breach <strong>lose any right</strong> to refund, indemnity or return of residual credits, accrued payouts (for Models) or amounts paid."}]},{id:"aup-6",title:"6. Gradual enforcement",body:[{kind:"p",text:"Measures are applied with gradualness, proportionality and reasonableness, depending on severity, recidivism and user cooperation. As a principle:"},{kind:"ul",items:["Minor, non-recurring breaches (e.g. misuse of a single prompt, interpretive ambiguity) â written warning + content removal.","Moderate or recurring breaches (e.g. repeated attempts to bypass moderation, content without valid release) â temporary suspension (7â30 days) + removal + log.","Serious breaches (CSAM, NCII, unlawful deepfakes, fraud, terrorism) â immediate closure + reporting to authorities + evidentiary retention."]},{kind:"p",text:'Suspension/closure decisions may be appealed at <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. The compliance team reviews the case and provides a reasoned reply within 15 days. Human intervention in automated suspension decisions is always available.'}]},{id:"aup-7",title:"7. Changes to the AUP",body:[{kind:"p",text:"Fancy Capital may amend this AUP to reflect applicable law, reports received and evolving industry practices. Changes are communicated to registered users by email and/or Dashboard notification with at least 30 days' notice for material changes."},{kind:"p",text:"The last update date is shown at the top of this document. Past versions are available on request."}]},{id:"aup-8",title:"8. Contacts",body:[{kind:"ul",items:['Email (abuse, appeals and support): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','Certified email (PEC): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"Postal address: Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy"]}]}]}
4868,d6={title:"PolÃtica de Uso Aceptable (AUP)",subtitle:"Normas de uso de la plataforma HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 de mayo de 2026",version:"1.0",sections:[{id:"aup-1",title:"1. Introducción",body:[{kind:"p",text:"La presente PolÃtica de Uso Aceptable («AUP») establece las normas para el uso de la plataforma HeroShots (la «Plataforma»), gestionada por Fancy Capital S.r.l. Se aplica a todos los usuarios: Clientes Empresariales, Clientes Consumidores y Modelos."},{kind:"p",text:"Al registrarse o utilizar la Plataforma, el usuario acepta Ãntegramente la presente AUP. La AUP es parte integrante de los Términos y Condiciones de la Plataforma."},{kind:"p",text:"Cualquier incumplimiento (incluidos los presuntos o denunciados) podrá dar lugar a la suspensión inmediata de la cuenta, la retirada de contenidos, la rescisión del contrato, la comunicación a las autoridades competentes y reclamaciones por daños y perjuicios."}]},{id:"aup-2",title:"2. Principios generales",body:[{kind:"p",text:"El usuario se compromete a utilizar la Plataforma:"},{kind:"ul",items:["de conformidad con la legislación aplicable italiana, de la UE y (cuando proceda) internacional;","respetando los derechos de terceros (derechos de la personalidad, derechos de imagen, derechos de propiedad intelectual, datos personales);","respetando a los demás usuarios de la Plataforma;","de buena fe y sin intenciones fraudulentas, abusivas o perjudiciales."]}]},{id:"aup-3",title:"3. Usos prohibidos",body:[{kind:"p",text:"Queda expresamente prohibido el uso de la Plataforma para generar, cargar, distribuir o almacenar contenidos que se incluyan en una o más de las siguientes categorÃas:"},{kind:"h3",text:"3.1 Material de abuso sexual infantil y menores"},{kind:"ul",items:["material de abuso sexual infantil (CSAM) en cualquier forma, incluido el generado por IA;","cualquier contenido sexual o sexualmente sugerente que represente a menores, incluso cuando la edad sea ambigua;","contenido que represente a menores en contextos inapropiados, incluso con fines aparentemente inocentes;","contenido destinado a la captación de menores con fines sexuales («grooming») o al contacto inapropiado con menores."]},{kind:"h3",text:"3.2 Contenido sexual o Ãntimo no consentido"},{kind:"ul",items:["contenido sexualmente explÃcito o sugerente que represente a personas identificables (incluidos los Modelos del Marketplace y BYO) sin un consentimiento especÃfico por escrito;","imágenes Ãntimas no consentidas (NCII), incluyendo la «pornografÃa de venganza» y los «deepfakes» pornográficos;","contenido destinado a crear material de explotación sexual no consentida de adultos."]},{kind:"h3",text:"3.3 «Deepfakes» ilÃcitos y suplantación de identidad fraudulenta"},{kind:"ul",items:["contenido que suplante la identidad de personas reales para engañar al público sobre su identidad o sus declaraciones;","contenido utilizado para fraudes, estafas románticas, fraudes financieros o manipulación del mercado;","declaraciones falsas atribuidas a figuras públicas, polÃticos, directivos, jueces, autoridades religiosas;","contenido constitutivo de suplantación de identidad (art. 494 del Código Penal italiano) o de delitos informáticos."]},{kind:"h3",text:"3.4 Contenido difamatorio, denigrante y perjudicial"},{kind:"ul",items:["contenido difamatorio, denigrante, injurioso o que atente contra el honor y la reputación de personas identificables;","contenido destinado a acosar, intimidar, chantajear o amenazar a personas identificables;","contenido que incite al odio por motivos de raza, etnia, religión, género, orientación sexual o discapacidad."]},{kind:"h3",text:"3.5 Contenido ilegal y delitos"},{kind:"ul",items:["contenido constitutivo de delitos (extorsión, fraude, terrorismo, apologÃa del terrorismo, etc.);","contenido para la venta, promoción o uso de sustancias ilegales, armas, explosivos;","contenido que viole sanciones internacionales o embargos comerciales;","contenido destinado a la evasión fiscal, el blanqueo de capitales o la financiación del terrorismo."]},{kind:"h3",text:"3.6 Contenido polÃtico, religioso o controvertido"},{kind:"p",text:"Salvo consentimiento expreso y por escrito de la persona representada:"},{kind:"ul",items:["contenido que represente a figuras polÃticas, jefes de Estado, lÃderes de partidos, candidatos electorales;","contenido que represente a autoridades religiosas o lÃderes espirituales;","contenido destinado a influir en elecciones o referendos («desinformación electoral»);","contenido que pueda percibirse como un respaldo polÃtico o religioso no autorizado."]},{kind:"h3",text:"3.7 Infracción de la propiedad intelectual"},{kind:"ul",items:["contenido que infrinja los derechos de propiedad intelectual de terceros (marcas, obras protegidas por derechos de autor, diseños industriales, patentes);","contenido que reproduzca personajes, logotipos, diseños o elementos de marca de terceros sin autorización;","contenido que incorpore música, sonidos, fuentes u otros elementos que no sean de libre uso."]},{kind:"h3",text:"3.8 Abuso técnico de la Plataforma"},{kind:"ul",items:["intentos de eludir, manipular o desactivar los sistemas de seguridad, moderación, marcado de agua, georrestricción, limitación de frecuencia o trazabilidad;","uso de bots, «scraping» automatizado no autorizado, ingenierÃa inversa o intentos de extraer los modelos de IA subyace
4868ntes;","creación de múltiples cuentas para eludir lÃmites, prohibiciones o controles;","actividades que puedan perjudicar la estabilidad, seguridad o disponibilidad de la Plataforma (DDoS, fuerza bruta, «exploits»);","reventa o sublicencia no autorizada del acceso a la Plataforma o del contenido generado."]},{kind:"h3",text:"3.9 Vigilancia, elaboración de perfiles masivos, identificación biométrica"},{kind:"ul",items:["uso de la Plataforma para la vigilancia masiva, la identificación biométrica en espacios públicos o la elaboración de perfiles masivos de terceros;","uso de la Plataforma para identificar o rastrear a personas concretas («doxxing»);","uso incompatible con las disposiciones de la Ley de IA de la UE («AI Act») sobre sistemas prohibidos o de alto riesgo."]},{kind:"h3",text:"3.10 Elusión de los controles de consentimiento"},{kind:"ul",items:["cargar rostros de terceros sin la documentación requerida (autorización firmada, copia del documento de identidad);","utilizar el Marketplace de Modelos de forma que se eluda el derecho de aprobación de un Modelo;","falsificación o manipulación de autorizaciones o documentos de consentimiento."]}]},{id:"aup-4",title:"4. Notificación de infracciones",body:[{kind:"p",text:"Cualquier persona puede notificar una presunta infracción a:"},{kind:"ul",items:['<strong>Correo electrónico:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Formulario en la aplicación:</strong> «Notificar contenido» en el Panel de Control."]},{kind:"p",text:"Las notificaciones son gestionadas por el equipo de cumplimiento de Fancy Capital, que evaluará rápidamente la situación y tomará las medidas necesarias. En caso de confirmarse, el contenido se retira, la cuenta del autor se suspende o se cierra y âcuando la gravedad lo requieraâ se informa a las autoridades competentes."},{kind:"p",text:'Para notificaciones urgentes relativas a CSAM, violencia extrema o amenazas inminentes, contacte también con las autoridades locales (en Italia, la PolicÃa Postal: <a class="text-brand-secondary underline" href="https://www.commissariatodips.it" target="_blank" rel="noreferrer">www.commissariatodips.it</a>).'}]},{id:"aup-5",title:"5. Consecuencias del incumplimiento",body:[{kind:"p",text:"En caso de incumplimiento (incluido el presunto o denunciado), Fancy Capital podrá:"},{kind:"ul",items:["retirar inmediatamente el contenido (incluidas las previsualizaciones, los activos y los resultados generados);","suspender temporalmente la cuenta del usuario mientras se investiga;","cerrar permanentemente la cuenta en caso de incumplimiento confirmado;","conservar registros y artefactos con fines probatorios y de cumplimiento;","comunicar el incumplimiento a las autoridades competentes (PolicÃa Postal italiana, Autoridad Italiana de Protección de Datos, poder judicial) cuando lo exija la ley o la gravedad del caso;","reclamar daños y perjuicios, incluidos los daños a la reputación y cualquier sanción impuesta a Fancy Capital por Byteplus o las autoridades."]},{kind:"p",text:"En caso de infracciones graves (CSAM, NCII, «deepfakes» ilÃcitos, fraude, terrorismo, etc.), la suspensión es inmediata y la denuncia a las autoridades es obligatoria."},{kind:"p",text:"Los usuarios cuya cuenta sea suspendida o cerrada por incumplimiento de la AUP <strong>pierden todo derecho</strong> al reembolso, indemnización o devolución de créditos residuales, pagos devengados (para los Modelos) o importes pagados."}]},{id:"aup-6",title:"6. Aplicación gradual de las medidas",body:[{kind:"p",text:"Las medidas se aplican con gradualidad, proporcionalidad y razonabilidad, en función de la gravedad, la reincidencia y la cooperación del usuario. Como principio:"},{kind:"ul",items:["Incumplimientos leves y no recurrentes (p. ej., uso indebido de un único «prompt», ambigüedad interpretativa) â advertencia por escrito + retirada del contenido.","Incumplimientos moderados o recurrentes (p. ej., intentos repetidos de eludir la moderación, contenido sin autorización válida) â suspensión temporal (7â30 dÃas) + retirada + registro.","Incumplimientos graves (CSAM, NCII, «deepfakes» ilÃcitos, fraude, terrorismo) â cierre inmediato + denuncia a las autoridades + conservación de pruebas."]},{kind:"p",text:'Las decisiones de suspensión/cierre pueden recurrirse en <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>. El equipo de cumplimiento revisará el caso y proporcionará una respuesta motivada en un plazo de 15 dÃas. La intervención humana en las decisiones de suspensión automatizadas está siempre disponible.'}]},{id:"aup-7",title:"7. Modificaciones de la AUP",body:[{kind:"p",text:"Fancy Capital podrá modificar esta AUP para reflejar la legislación aplicable, las notificaciones recibidas y la evolución de las prácticas del sector. Las modificaciones se comunican a los usuarios registrados por correo electrónico o mediante notificación en el Panel de Control con un preaviso de al menos 30 dÃas para las modificaciones sustanciales."},{kind:"p",text:"La fecha de la última actualización se muestra en la parte superior de este documento. Las versiones anteriores están disponibles previa solicitud."}]},{id:"aup-8",title:"8. Contacto",body:[{kind:"ul",items:['Correo electrónico (abusos, recursos y soporte): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','Correo electrónico certificado (PEC): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"Dirección postal: Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italia"]}]}]}
4868,u6={title:"Richtlinie zur zulässigen Nutzung (AUP)",subtitle:"Regeln für die Nutzung der HeroShots-Plattform (Fancy Capital S.r.l.).",lastUpdated:"28. Mai 2026",version:"1.0",sections:[{id:"aup-1",title:"1. Einleitung",body:[{kind:"p",text:"Diese Richtlinie zur zulässigen Nutzung (âAUPâ) legt die Regeln für die Nutzung der HeroShots-Plattform (die âPlattformâ) fest, die von Fancy Capital S.r.l. betrieben wird. Sie gilt für alle Nutzer â Geschäftskunden, Privatkunden und Models."},{kind:"p",text:"Durch die Registrierung und/oder Nutzung der Plattform akzeptiert der Nutzer diese AUP vollständig. Die AUP ist integraler Bestandteil der Allgemeinen Geschäftsbedingungen der Plattform."},{kind:"p",text:"Jeder Verstoà (einschlieÃlich vermuteter oder gemeldeter VerstöÃe) kann zur sofortigen Sperrung des Kontos, zur Entfernung von Inhalten, zur Kündigung des Vertrags, zur Meldung an die zuständigen Behörden und zu Schadensersatzansprüchen führen."}]},{id:"aup-2",title:"2. Allgemeine Grundsätze",body:[{kind:"p",text:"Der Nutzer verpflichtet sich, die Plattform wie folgt zu nutzen:"},{kind:"ul",items:["in Ãbereinstimmung mit dem anwendbaren italienischen, EU- und (gegebenenfalls) internationalen Recht;","unter Achtung der Rechte Dritter (Persönlichkeitsrechte, Bildrechte, geistige Eigentumsrechte, personenbezogene Daten);","mit Respekt gegenüber anderen Nutzern der Plattform;","nach Treu und Glauben und ohne betrügerische, missbräuchliche oder schädliche Absicht."]}]},{id:"aup-3",title:"3. Verbotene Nutzungen",body:[{kind:"p",text:"Es ist ausdrücklich verboten, die Plattform zum Erstellen, Hochladen, Verbreiten oder Speichern von Inhalten zu verwenden, die in eine oder mehrere der folgenden Kategorien fallen:"},{kind:"h3",text:"3.1 Material über sexuellen Kindesmissbrauch und Minderjährige"},{kind:"ul",items:["Material über sexuellen Kindesmissbrauch (CSAM) in jeder Form, einschlieÃlich KI-generiertem;","jegliche sexuelle oder sexuell suggestive Inhalte, die Minderjährige darstellen, auch wenn das Alter unklar ist;","Inhalte, die Minderjährige in unangemessenen Kontexten darstellen, selbst zu scheinbar harmlosen Zwecken;","Inhalte, die auf Grooming oder unangemessene Kontaktaufnahme mit Minderjährigen abzielen."]},{kind:"h3",text:"3.2 Nicht-einvernehmliche sexuelle oder intime Inhalte"},{kind:"ul",items:["sexuell explizite oder suggestive Inhalte, die identifizierbare Personen (einschlieÃlich Marketplace- und BYO-Models) ohne deren ausdrückliche schriftliche Zustimmung darstellen;","nicht einvernehmliche intime Bildaufnahmen (NCII), einschlieÃlich âRachepornosâ und pornografischer Deepfakes;","Inhalte, die darauf abzielen, Material zur nicht-einvernehmlichen sexuellen Ausbeutung von Erwachsenen zu erstellen."]},{kind:"h3",text:"3.3 Rechtswidrige Deepfakes und betrügerischer Identitätsmissbrauch"},{kind:"ul",items:["Inhalte, die reale Personen imitieren, um die Ãffentlichkeit über deren Identität oder ÃuÃerungen zu täuschen;","Inhalte, die für Betrug, Liebesbetrug (Romance Scam), Finanzbetrug oder Marktmanipulation verwendet werden;","gefälschte Aussagen, die Personen des öffentlichen Lebens, Politikern, Führungskräften, Richtern oder religiösen Autoritäten zugeschrieben werden;","Inhalte, die eine Identitätstäuschung (Art. 494 des italienischen Strafgesetzbuches) oder Computerkriminalität darstellen."]},{kind:"h3",text:"3.4 Diffamierende, herabwürdigende und schädliche Inhalte"},{kind:"ul",items:["diffamierende, herabwürdigende, beleidigende Inhalte oder Inhalte, die die Ehre und den Ruf identifizierbarer Personen schädigen;","Inhalte, die darauf abzielen, identifizierbare Personen zu belästigen, einzuschüchtern, zu erpressen oder zu bedrohen;","Inhalte, die zu Hass aufgrund von Rasse, ethnischer Herkunft, Religion, Geschlecht, sexueller Orientierung oder Behinderung aufstacheln."]},{kind:"h3",text:"3.5 Illegale Inhalte und Straftaten"},{kind:"ul",items:["Inhalte, die Straftatbestände erfüllen (Erpressung, Betrug, Terrorismus, Verherrlichung von Straftaten usw.);","Inhalte zum Verkauf, zur Bewerbung oder zur Verwendung von illegalen Substanzen, Waffen, Sprengstoffen;","Inhalte, die gegen internationale Sanktionen oder Handelsembargos verstoÃen;","Inhalte, die auf Steuerhinterziehung, Geldwäsche oder Terrorismusfinanzierung abzielen."]},{kind:"h3",text:"3.6 Politische, religiöse oder kontroverse Inhalte"},{kind:"p",text:"Vorbehaltlich der spezifischen, ausdrücklichen schriftlichen Zustimmung der abgebildeten Person:"},{kind:"ul",items:["Inhalte, die politische Persönlichkeiten, Staatsoberhäupter, Parteiführer, Wahlkandidaten darstellen;","Inhalte, die religiöse Autoritäten oder spirituelle Führer darstellen;","Inhalte, die darauf abzielen, Wahlen oder Referenden zu beeinflussen (âWahldesinformationâ);","Inhalte, die als unerlaubte politische oder religiöse Unterstützung wahrgenommen werden können."]},{kind:"h3",text:"3.7 Verletzung geistigen Eigentums"},{kind:"ul",items:["Inhalte, die die geistigen Eigentumsrechte Dritter verletzen (Marken, urheberrechtlich geschützte Werke, Geschmacksmuster, Patente);","Inhalte, die ohne Genehmigung Figuren, Logos, Designs oder Markenelemente Dritter reproduzieren;","Inhalte, die Musik, Töne, Schriftarten oder andere nicht frei nutzbare Elemente enthalten."]},{kind:"h3",text:"3.8 Technischer Missbrauch der Plattform"},{kind:"ul",items:["Versuche, SicherheitsmaÃnahmen, Moderation, Wasserzeichen, geografische Beschränkungen, Ratenbegrenzungen oder die Rückverfolgbarkeit zu umgehen, zu manipulieren oder zu deaktivieren;","Verwendung von Bots, nicht autorisiertem automatisiertem Scraping, Reverse Engineering oder Versuche, die zugrunde liegenden KI-Modelle zu extrahieren;","Erstellung mehrerer Konten zur Umgehung von Limits, Sperren oder Kontrollen;","Aktivitäten, die die Stabilität, Sicherheit oder Verfügbarkeit der Plattform beeinträchtigen können (DDoS, Brute-Force, Exploits);","unerlaubter Weiterverkauf oder Unterlizenzierung des Zugangs zur Plattform oder der generierten Inhalte."]},{kind:"h3",text:"3.9 Ãberwachung, Massenprofiling, biometrische Identifizierung"},{kind:"ul",items:["Nutzung der Plattform zur Massenüberwachung, biometrischen Identifizierung im öffentlichen Raum oder zum Massenprofiling von Dritten;","Nutzung der Plattform zur Identifizierung oder Verfolgung einzelner Personen (âDoxingâ);","Nutzung, die unvereinbar ist mit den Bestimmungen des EU AI Act zu verbotenen oder hochriskanten Systemen."]},{kind:"h3",text:"3.10 Umgehung von Einverständniskontrollen"},{kind:"ul",items:["Hochladen von Gesichtern Dritter ohne die erforderliche Dokumentation (unterzeichnete Freigabeerklärung, Ausweiskopie);","Nutzung des Model-Marktplatzes in einer Weise, die das Genehmigungsrecht eines Models umgeht;","Fälschung oder Manipulation von Freigabe- oder Einverständniserklärungen."]}]},{id:"aup-4",title:"4. Meldung von VerstöÃen",body:[{kind:"p",text:"Jede Person kann einen mutmaÃlichen Verstoà melden an:"},{kind:"ul",items:['<strong>E-Mail:</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>In-App-Formular:</strong> âInhalt meldenâ im Dashboard."]},{kind:"p",text:"Meldungen werden vom Compliance-Team von Fancy Capital bearbeitet, das die Situation umgehend bewertet und die erforderlichen MaÃnahmen ergreift. Bei Bestätigung wird der Inhalt entfernt, das Konto des Autors gesperrt oder geschlossen und â falls die Schwere des Falles es erfordert â an die zuständigen Behörden gemeldet."},{kind:"p",text:'Bei dringenden Meldungen bezüglich CSAM, extremer Gewalt oder unmittelbarer Bedrohungen wenden Sie sich bitte auch an die örtlichen Behörden (in Italien die Postpolizei: <a class="text-brand-secondary underline" href="https://www.commissariatodips.it" target="_blank" rel="noreferrer">www.commissariatodips.it</a>).'}]},{id:"aup-5",title:"5. Folgen eines VerstoÃes",body:[{kind:"p",text:"Bei einem Verstoà (einschlieÃlich eines vermuteten oder gemeldeten) kann Fancy Capital:"},{kind:"ul",items:["den Inhalt (einschlieÃlich Vorschauen, Assets und generierter Ergebnisse) sofort entfernen;","das Konto des Nutzers bis zum Abschluss der Untersuchung vorübergehend sperren;","das Konto bei bestätigtem Verstoà dauerhaft schlieÃen;","Protokolle und Artefakte zu Beweis- und Compliance-Zwecken aufbewahren;","den Verstoà den zuständigen Behörden (italienische Postpolizei, italienische Datenschutzbehörde, Justiz) melden, wenn dies gesetzlich oder aufgrund der Schwere des Falles erforderlich ist;","Schadensersatz geltend machen, einschlieÃlich Reputationsschäden und jeglicher Sanktionen, die Fancy Capital von Byteplus oder Behörden auferlegt werden."]},{kind:"p",text:"Bei schwerwiegenden VerstöÃen (CSAM, NCII, rechtswidrige Deepfakes, Betrug, Terrorismus usw.) erfolgt die Sperrung sofort und die Meldung an die Behörden ist obligatorisch."},{kind:"p",text:"Nutzer, deren Konten wegen eines VerstoÃes gegen die AUP gesperrt oder geschlossen werden, <strong>verlieren jeglichen Anspruch</strong> auf Rückerstattung, Entschädigung oder Rückgabe von Restguthaben, angesammelten Auszahlungen (für Models) oder gezahlten Beträgen."}]},{id:"aup-6",title:"6. Abgestufte Durchsetzung",body:[{kind:"p",text:"Die MaÃnahmen werden schrittweise, verhältnismäÃig und angemessen angewendet, abhängig von der Schwere, der Wiederholung und der Kooperation des Nutzers. Grundsätzlich gilt:"}
4868,{kind:"ul",items:["Geringfügige, einmalige VerstöÃe (z. B. Missbrauch einer einzelnen Eingabeaufforderung, interpretative Unklarheit) â schriftliche Verwarnung + Entfernung des Inhalts.","MäÃige oder wiederholte VerstöÃe (z. B. wiederholte Versuche, die Moderation zu umgehen, Inhalte ohne gültige Freigabe) â vorübergehende Sperrung (7â30 Tage) + Entfernung + Protokollierung.","Schwerwiegende VerstöÃe (CSAM, NCII, rechtswidrige Deepfakes, Betrug, Terrorismus) â sofortige SchlieÃung + Meldung an die Behörden + Beweismittelsicherung."]},{kind:"p",text:'Gegen Entscheidungen zur Sperrung/SchlieÃung kann unter <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a> Widerspruch eingelegt werden. Das Compliance-Team prüft den Fall und gibt innerhalb von 15 Tagen eine begründete Antwort. Menschliches Eingreifen bei automatisierten Sperrentscheidungen ist jederzeit möglich.'}]},{id:"aup-7",title:"7. Ãnderungen der AUP",body:[{kind:"p",text:"Fancy Capital kann diese AUP ändern, um geltendem Recht, erhaltenen Meldungen und sich entwickelnden Branchenpraktiken Rechnung zu tragen. Ãnderungen werden registrierten Nutzern per E-Mail und/oder Benachrichtigung im Dashboard mit einer Frist von mindestens 30 Tagen bei wesentlichen Ãnderungen mitgeteilt."},{kind:"p",text:"Das Datum der letzten Aktualisierung wird am Anfang dieses Dokuments angezeigt. Frühere Versionen sind auf Anfrage erhältlich."}]},{id:"aup-8",title:"8. Kontakt",body:[{kind:"ul",items:['E-Mail (Missbrauch, Widersprüche und Support): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','Zertifizierte E-Mail (PEC): <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"Postanschrift: Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italien"]}]}]},h6={title:"Politique d'Utilisation Acceptable (PUA)",subtitle:"Règles d'utilisation de la plateforme HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 mai 2026",version:"1.0",sections:[{id:"aup-1",title:"1. Introduction",body:[{kind:"p",text:"La présente Politique d'Utilisation Acceptable (« PUA ») définit les règles d'utilisation de la plateforme HeroShots (la « Plateforme »), exploitée par Fancy Capital S.r.l. Elle s'applique à tous les utilisateurs â Clients Professionnels, Clients Consommateurs et Mannequins."},{kind:"p",text:"En s'inscrivant et/ou en utilisant la Plateforme, l'utilisateur accepte intégralement la présente PUA. La PUA fait partie intégrante des Conditions Générales de la Plateforme."},{kind:"p",text:"Toute violation (y compris suspectée ou signalée) peut entraîner la suspension immédiate du compte, la suppression du contenu, la résiliation du contrat, le signalement aux autorités compétentes et des demandes de dommages-intérêts."}]},{id:"aup-2",title:"2. Principes généraux",body:[{kind:"p",text:"L'utilisateur s'engage à utiliser la Plateforme :"},{kind:"ul",items:["dans le respect du droit italien, européen et (le cas échéant) international applicable ;","en respectant les droits des tiers (droits de la personnalité, droits à l'image, droits de propriété intellectuelle, données personnelles) ;","en respectant les autres utilisateurs de la Plateforme ;","de bonne foi et sans intention frauduleuse, abusive ou nuisible."]}]},{id:"aup-3",title:"3. Utilisations interdites",body:[{kind:"p",text:"Il est expressément interdit d'utiliser la Plateforme pour générer, télécharger, distribuer ou stocker du contenu relevant d'une ou plusieurs des catégories suivantes :"},{kind:"h3",text:"3.1 Contenus pédopornographiques et mineurs"},{kind:"ul",items:["les contenus pédopornographiques (CSAM) sous quelque forme que ce soit, y compris ceux générés par IA ;","tout contenu sexuel ou sexuellement suggestif représentant des mineurs, même lorsque l'âge est ambigu ;","le contenu représentant des mineurs dans des contextes inappropriés, même à des fins apparemment innocentes ;","le contenu destiné au « grooming » (sollicitation d'enfants à des fins sexuelles) ou à un contact inapproprié avec des mineurs."]},{kind:"h3",text:"3.2 Contenu sexuel ou intime non consenti"},{kind:"ul",items:["le contenu sexuellement explicite ou suggestif représentant des personnes identifiables (y compris les Mannequins de la Marketplace et BYO) sans leur consentement écrit et spécifique ;","les images intimes non consensuelles (NCII), y compris le « revenge porn » et les « deepfakes » pornographiques ;","le contenu destiné à créer du matériel d'exploitation sexuelle non consensuelle impliquant des adultes."]},{kind:"h3",text:"3.3 « Deepfakes » illicites et usurpation d'identité frauduleuse"},{kind:"ul",items:["le contenu usurpant l'identité de personnes réelles pour tromper le public sur leur identité ou leurs déclarations ;","le contenu utilisé pour la fraude, les escroqueries sentimentales, la fraude financière ou la manipulation de marché ;","les fausses déclarations attribuées à des personnalités publiques, des politiciens, des dirigeants, des juges, des autorités religieuses ;","le contenu constituant une usurpation d'identité (Art. 494 du Code pénal italien) ou des délits informatiques."]},{kind:"h3",text:"3.4 Contenu diffamatoire, dénigrant et préjudiciable"},{kind:"ul",items:["le contenu diffamatoire, dénigrant, insultant ou portant atteinte à l'honneur et à la réputation de personnes identifiables ;","le contenu destiné à harceler, intimider, faire chanter ou menacer des personnes identifiables ;","le contenu incitant à la haine raciale, ethnique, religieuse, de genre, d'orientation sexuelle ou fondée sur le handicap."]},{kind:"h3",text:"3.5 Contenu illégal et infractions pénales"},{kind:"ul",items:["le contenu constituant des infractions pénales (extorsion, fraude, terrorisme, apologie du crime, etc.) ;","le contenu destiné à la vente, la promotion ou l'utilisation de substances illégales, d'armes, d'explosifs ;","le contenu violant les sanctions internationales ou les embargos commerciaux ;","le contenu destiné à l'évasion fiscale, au blanchiment d'argent ou au financement du terrorisme."]},{kind:"h3",text:"3.6 Contenu politique, religieux ou controversé"},{kind:"p",text:"Sauf consentement écrit, spécifique et explicite de la personne représentée :"},{kind:"ul",items:["le contenu représentant des personnalités politiques, des chefs d'Ãtat, des chefs de parti, des candidats à des élections ;","le contenu représentant des autorités religieuses ou des chefs spirituels ;","le contenu destiné à influencer des élections ou des référendums (« désinformation électorale ») ;","le contenu pouvant être perçu comme un soutien politique ou religieux non autorisé."]},{kind:"h3",text:"3.7 Violation de la propriété intellectuelle"},{kind:"ul",items:["le contenu portant atteinte aux droits de propriété intellectuelle de tiers (marques, Åuvres protégées par le droit d'auteur, dessins et modèles industriels, brevets) ;","le contenu reproduisant des personnages, logos, dessins ou éléments de marque de tiers s
4868ans autorisation ;","le contenu intégrant de la musique, des sons, des polices de caractères ou d'autres éléments dont l'utilisation n'est pas libre de droits."]},{kind:"h3",text:"3.8 Abus technique de la Plateforme"},{kind:"ul",items:["les tentatives de contourner, d'altérer ou de désactiver les systèmes de sécurité, de modération, de tatouage numérique (watermarking), de géo-restriction, de limitation du débit ou de traçabilité ;","l'utilisation de bots, le « scraping » automatisé non autorisé, la rétro-ingénierie ou les tentatives d'extraction des modèles d'IA sous-jacents ;","la création de plusieurs comptes pour contourner les limites, les interdictions ou les contrôles ;","les activités susceptibles de compromettre la stabilité, la sécurité ou la disponibilité de la Plateforme (DDoS, force brute, exploits) ;","la revente ou la sous-licence non autorisée de l'accès à la Plateforme ou du contenu généré."]},{kind:"h3",text:"3.9 Surveillance, profilage de masse, identification biométrique"},{kind:"ul",items:["l'utilisation de la Plateforme à des fins de surveillance de masse, d'identification biométrique dans les espaces publics ou de profilage de masse de tiers ;","l'utilisation de la Plateforme pour identifier ou suivre des personnes individuelles (« doxxing ») ;","l'utilisation incompatible avec les dispositions de l'AI Act de l'UE sur les systèmes interdits ou à haut risque."]},{kind:"h3",text:"3.10 Contournement des contrôles de consentement"},{kind:"ul",items:["le téléchargement de visages de tiers sans la documentation requise (autorisation signée, copie de pièce d'identité) ;","l'utilisation de la marketplace des Mannequins de manière à contourner le droit d'approbation d'un Mannequin ;","la falsification ou la manipulation des autorisations ou des documents de consentement."]}]},{id:"aup-4",title:"4. Signalement des violations",body:[{kind:"p",text:"Toute personne peut signaler une violation présumée à :"},{kind:"ul",items:['<strong>E-mail :</strong> <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"<strong>Formulaire dans l'application :</strong> « Signaler un contenu » dans le Tableau de bord."]},{kind:"p",text:"Les signalements sont traités par l'équipe de conformité de Fancy Capital, qui évaluera rapidement la situation et prendra les mesures nécessaires. Si la violation est confirmée, le contenu est supprimé, le compte de l'auteur est suspendu ou fermé et â lorsque la gravité l'exige â signalé aux autorités compétentes."},{kind:"p",text:'Pour les signalements urgents concernant des CSAM, une violence extrême ou des menaces imminentes, contactez également les autorités locales (en Italie, la Police Postale : <a class="text-brand-secondary underline" href="https://www.commissariatodips.it" target="_blank" rel="noreferrer">www.commissariatodips.it</a>).'}]},{id:"aup-5",title:"5. Conséquences de la violation",body:[{kind:"p",text:"En cas de violation (y compris suspectée ou signalée), Fancy Capital peut :"},{kind:"ul",items:["supprimer immédiatement le contenu (y compris les aperçus, les ressources et les résultats générés) ;","suspendre temporairement le compte de l'utilisateur dans l'attente d'une enquête ;","fermer définitivement le compte en cas de violation confirmée ;","conserver les journaux et les artefacts à des fins de preuve et de conformité ;","signaler la violation aux autorités compétentes (Police Postale italienne, Autorité italienne de protection des données, pouvoir judiciaire) lorsque la loi ou la gravité du cas l'exige ;","réclamer des dommages-intérêts, y compris pour atteinte à la réputation et pour toute sanction imposée à Fancy Capital par Byteplus ou les autorités."]},{kind:"p",text:"Pour les violations graves (CSAM, NCII, « deepfakes » illicites, fraude, terrorisme, etc.), la suspension est immédiate et le signalement aux autorités est obligatoire."},{kind:"p",text:"Les utilisateurs dont le compte est suspendu ou fermé pour violation de la PUA <strong>perdent tout droit</strong> au remboursement, à une indemnité ou à la restitution des crédits résiduels, des paiements accumulés (pour les Mannequins) ou des montants versés."}]},{id:"aup-6",title:"6. Application progressive des mesures",body:[{kind:"p",text:"Les mesures sont appliquées avec progressivité, proportionnalité et raisonnabilité, en fonction de la gravité, de la récidive et de la coopération de l'utilisateur. En principe :"},{kind:"ul",items:["Violations mineures et non récurrentes (par ex. mauvaise utilisation d'un seul prompt, ambiguïté d'interprétation) â avertissement écrit + suppression du contenu.","Violations modérées ou récurrentes (par ex. tentatives répétées de contourner la modération, contenu sans autorisation valide) â suspension temporaire (7 à 30 jours) + suppression + consignation.","Violations graves (CSAM, NCII, « deepfakes » illicites, fraude, terrorisme) â fermeture immédiate + signalement aux autorités + conservation des preuves."]},{kind:"p",text:`Les décisions de suspension/fermeture peuvent faire l'objet d'un recours à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>
4868. L'équipe de conformité examine le cas et fournit une réponse motivée dans les 15 jours. Une intervention humaine dans les décisions de suspension automatisées est toujours disponible.`}]},{id:"aup-7",title:"7. Modifications de la PUA",body:[{kind:"p",text:"Fancy Capital peut modifier cette PUA pour refléter le droit applicable, les signalements reçus et l'évolution des pratiques du secteur. Les modifications sont communiquées aux utilisateurs inscrits par e-mail et/ou par notification sur le Tableau de bord avec un préavis d'au moins 30 jours pour les modifications substantielles."},{kind:"p",text:"La date de la dernière mise à jour est indiquée en haut de ce document. Les versions antérieures sont disponibles sur demande."}]},{id:"aup-8",title:"8. Contacts",body:[{kind:"ul",items:['E-mail (abus, recours et assistance) : <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>','Courrier électronique certifié (PEC) : <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>',"Adresse postale : Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italie"]}]}]},p6={title:"Cookie Policy",subtitle:"Informativa sull'uso dei cookie e di tecnologie simili sulla piattaforma HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 maggio 2026",version:"1.0",intro:[{kind:"p",text:"La presente Cookie Policy descrive i cookie e le tecnologie simili (di seguito, collettivamente, «cookie») utilizzati sul sito heroshots.ai e all'interno della piattaforma HeroShots (la «Piattaforma»), gestiti da <strong>Fancy Capital S.r.l.</strong>, con sede legale in Via Crespi 25, 24021 Albino (BG), C.F. / P.IVA 04763600162 («Fancy Capital» o «Titolare»)."},{kind:"p",text:"L'informativa è resa ai sensi dell'art. 122 del D.lgs. 196/2003 (Codice Privacy), del Provvedimento del Garante per la Protezione dei Dati Personali del 10 giugno 2021 e del Regolamento (UE) 2016/679 (GDPR)."}],sections:[{id:"cookies-1",title:"1. Cosa sono i cookie",body:[{kind:"p",text:"I cookie sono piccoli file di testo che i siti visitati inviano al terminale dell'utente, dove vengono memorizzati per essere ritrasmessi agli stessi siti in occasione di visite successive. Tecnologie simili (come pixel, web beacon, local storage, fingerprinting) sono assimilate ai cookie ai fini della presente informativa."}]},{id:"cookies-2",title:"2. Categorie di cookie utilizzati",body:[{kind:"h3",text:"2.1 Cookie tecnici (necessari)"},{kind:"p",text:"Sono utilizzati al solo fine di effettuare la trasmissione di una comunicazione su una rete di comunicazione elettronica, o nella misura strettamente necessaria al fornitore di un servizio della società dell'informazione esplicitamente richiesto dall'utente. Non richiedono il consenso preventivo dell'utente."},{kind:"ul",items:["cookie di sessione e di autenticazione (login, sessione utente);","cookie di sicurezza (prevenzione frodi, CSRF);","cookie di preferenze tecniche (lingua, consenso ai cookie);","cookie di bilanciamento del carico."]},{kind:"h3",text:"2.2 Cookie analitici"},{kind:"p",text:"Sono utilizzati per raccogliere informazioni, in forma aggregata o pseudonimizzata, sul numero di utenti e su come questi visitano il sito. Quando i cookie analitici sono di terze parti e non sono adeguatamente anonimizzati, il loro utilizzo è subordinato al consenso dell'utente."},{kind:"h3",text:"2.3 Cookie di profilazione e marketing"},{kind:"p",text:"Sono utilizzati per tracciare la navigazione dell'utente, analizzare il suo comportamento per finalità di marketing e creare profili sui suoi gusti, abitudini, scelte. Il loro utilizzo è subordinato al consenso esplicito dell'utente."}]},{id:"cookies-3",title:"3. Cookie di terze parti",body:[{kind:"p",text:"Alcuni cookie installati tramite il sito sono gestiti da soggetti terzi (es. provider di analytics, social network, fornitori di servizi di hosting e CDN). Per tali cookie, il trattamento dei dati è disciplinato dalle informative privacy dei rispettivi titolari, a cui si rinvia."},{kind:"p",text:"L'elenco aggiornato dei cookie di terze parti, comprensivo dei link alle relative privacy policy, è disponibile nel pannello di gestione delle preferenze accessibile dal footer del sito."}]},{id:"cookies-4",title:"4. Gestione delle preferenze e Consent Mode",body:[{kind:"p",text:"Al primo accesso al sito, all'utente viene mostrato un banner che consente di accettare, rifiutare o personalizzare le categorie di cookie non tecnici. à possibile modificare le proprie scelte in qualsiasi momento tramite il pannello di gestione accessibile dal footer."},{kind:"p",text:"Fancy Capital adotta il sistema Google Consent Mode v2: le tecnologie di analytics e marketing si attivano solo dopo aver ricevuto il consenso esplicito dell'utente. In assenza di consenso, vengono inviati segnali aggregati e privi di identificatori."}]},{id:"cookies-5",title:"5. Come disabilitare i cookie dal browser",body:[{kind:"p",text:"Indipendentemente dalle scelte effettuate tramite il banner, l'utente può sempre disabilitare o eliminare i cookie tramite le impostazioni del proprio browser. Si segnala che la disattivazione dei cookie tecnici può compromettere il corretto funzionamento del sito."},{kind:"ul",items:["Google Chrome: https://support.google.com/chrome/answer/95647","Mozilla Firefox: https://support.mozilla.org/it/kb/Gestione%20dei%20cookie","Safari: https://support.apple.com/it-it/guide/safari/sfri11471","Microsoft Edge: https://support.microsoft.com/it-it/microsoft-edge"]}]},{id:"cookies-6",title:"6. Titolare del trattamento e contatti",body:[{kind:"p",text:"Titolare del trattamento dei dati personali raccolti tramite cookie è Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG),
4868C.F. / P.IVA 04763600162, PEC [email protected]."},{kind:"p",text:'Per esercitare i diritti previsti dagli artt. 15-22 del GDPR o per qualsiasi richiesta in materia di cookie, è possibile scrivere a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"cookies-7",title:"7. Aggiornamenti",body:[{kind:"p",text:"La presente Cookie Policy può essere aggiornata in qualsiasi momento per riflettere modifiche normative, tecniche o organizzative. La versione vigente è sempre pubblicata su questa pagina con indicazione della data di ultimo aggiornamento."}]}]},m6={title:"Cookie Policy",subtitle:"Information on the use of cookies and similar technologies on the HeroShots platform (Fancy Capital S.r.l.).",lastUpdated:"May 28, 2026",version:"1.0",intro:[{kind:"p",text:'This Cookie Policy describes the cookies and similar technologies (collectively, "cookies") used on heroshots.ai and inside the HeroShots platform (the "Platform"), operated by <strong>Fancy Capital S.r.l.</strong>, registered office Via Crespi 25, 24021 Albino (BG), Italy, VAT/Tax ID 04763600162 ("Fancy Capital" or "Controller").'},{kind:"p",text:"This notice is provided pursuant to art. 122 of Italian Legislative Decree 196/2003, the Italian Data Protection Authority's resolution of 10 June 2021 and Regulation (EU) 2016/679 (GDPR)."}
4868],sections:[{id:"cookies-1",title:"1. What cookies are",body:[{kind:"p",text:"Cookies are small text files that websites place on the user's device and read back on subsequent visits. Similar technologies (pixels, web beacons, local storage, fingerprinting) are treated as cookies for the purpose of this notice."}]},{id:"cookies-2",title:"2. Categories of cookies we use",body:[{kind:"h3",text:"2.1 Strictly necessary cookies"},{kind:"p",text:"Used solely to enable the transmission of a communication or as strictly necessary to provide a service explicitly requested by the user. No prior consent is required."},{kind:"ul",items:["session and authentication cookies (login, user session);","security cookies (fraud prevention, CSRF);","technical preference cookies (language, cookie consent state);","load-balancing cookies."]},{kind:"h3",text:"2.2 Analytics cookies"},{kind:"p",text:"Used to collect aggregated or pseudonymised information about the number of users and how they use the site. When analytics cookies are set by third parties and are not adequately anonymised, their use is subject to the user's prior consent."},{kind:"h3",text:"2.3 Profiling and marketing cookies"},{kind:"p",text:"Used to track users' navigation, analyse their behaviour for marketing purposes and build profiles based on their preferences and habits. Their use requires the user's explicit consent."}]},{id:"cookies-3",title:"3. Third-party cookies",body:[{kind:"p",text:"Some cookies installed through the site are managed by third parties (e.g. analytics providers, social networks, hosting and CDN providers). For such cookies, data processing is governed by the privacy notices of the respective controllers."},{kind:"p",text:"An up-to-date list of third-party cookies, including links to their privacy policies, is available in the preferences panel accessible from the site footer."}]},{id:"cookies-4",title:"4. Managing preferences and Consent Mode",body:[{kind:"p",text:"On first access to the site, a banner allows the user to accept, reject or customise non-technical cookie categories. The user can change these choices at any time through the preferences panel available in the footer."},{kind:"p",text:"Fancy Capital uses Google Consent Mode v2: analytics and marketing technologies are only activated after the user's explicit consent. When consent is missing, only aggregated, identifier-free signals are transmitted."}]},{id:"cookies-5",title:"5. Disabling cookies from your browser",body:[{kind:"p",text:"Regardless of the choices made through the banner, the user can always disable or delete cookies through their browser settings. Disabling strictly necessary cookies may break parts of the site."},{kind:"ul",items:["Google Chrome: https://support.google.com/chrome/answer/95647","Mozilla Firefox: https://support.mozilla.org/kb/cookies-information-websites-store-on-your-computer","Safari: https://support.apple.com/guide/safari/sfri11471","Microsoft Edge: https://support.microsoft.com/microsoft-edge"]}]},{id:"cookies-6",title:"6. Data controller and contacts",body:[{kind:"p",text:"The controller of personal data collected through cookies is Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italy, VAT/Tax ID 04763600162, PEC [email protected]."},{kind:"p",text:'To exercise the rights granted by arts. 15-22 GDPR or for any request related to cookies, please write to <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"cookies-7",title:"7. Updates",body:[{kind:"p",text:"This Cookie Policy may be updated at any time to reflect regulatory, technical or organisational changes. The current version is always published on this page with its last-updated date."}]}]},f6={title:"PolÃtica de Cookies",subtitle:"Información sobre el uso de cookies y tecnologÃas similares en la plataforma HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 de mayo de 2026",version:"1.0",intro:[{kind:"p",text:"Esta PolÃtica de Cookies describe las cookies y tecnologÃas similares (en adelante, conjuntamente, «cookies») utilizadas en el sitio heroshots.ai y dentro de la plataforma HeroShots (la «Plataforma»), gestionados por <strong>Fancy Capital S.r.l.</strong>, con sede legal en Via Crespi 25, 24021 Albino (BG), Italia, NIF/IVA 04763600162 («Fancy Capital» o «Responsable»)."},{kind:"p",text:"Esta información se proporciona conforme al art. 122 del D.lgs. 196/2003, a la Resolución de la Autoridad italiana de protección de datos del 10 de junio de 2021 y al Reglamento (UE) 2016/679 (RGPD)."}],sections:[{id:"cookies-1",title:"1. Qué son las cookies",body:[{kind:"p",text:"Las cookies son pequeños archivos de texto que los sitios web envÃan al dispositivo del usuario, donde se almacenan para ser transmitidos de nuevo en visitas posteriores. Las tecnologÃas similares (pÃxeles, web beacons, almacenamiento local, fingerprinting) se asimilan a las cookies a efectos de esta polÃtica."}]},{id:"cookies-2",title:"2. CategorÃas de cookies utilizadas",body:[{kind:"h3",text:"2.1 Cookies técnicas (necesarias)"},{kind:"p",text:"Se utilizan exclusivamente para permitir la transmisión de una comunicación o en la medida estrictamente necesaria para prestar un servicio solicitado expresamente por el usuario. No requieren consentimiento previo."},{kind:"ul",items:["cookies de sesión y autenticación (inicio de sesión, sesión de usuario);","cookies de seguridad (prevención de fraude, CSRF);","cookies de preferencias técnicas (idioma, estado del consentimiento);","cookies de balanceo de carga."]},{kind:"h3",text:"2.2 Cookies analÃticas"},{kind:"p",text:"Recogen información agregada o seudonimizada sobre el número de usuarios y cómo utilizan el sitio. Cuando las cookies analÃticas son de terceros y no están adecuadamente anonimizadas, su uso requiere consentimiento previo."},{kind:"h3",text:"2.3 Cookies de perfilado y marketing"},{kind:"p",text:"Se utilizan para rastrear la navegación del usuario, analizar su comportamiento con fines de marketing y crear perfiles. Su uso requiere el consentimiento explÃcito del usuario."}]},{id:"cookies-3",title:"3. Cookies de terceros",body:[{kind:"p",text:"Algunas cookies instaladas a través del sitio son gestionadas por terceros (proveedores de analÃtica, redes sociales, hosting y CDN). Para tales cookies, el tratamiento se rige por las polÃticas de privacidad de los respectivos responsables."},{kind:"p",text:"La lista actualizada de cookies de terceros, con enlaces a sus polÃticas de privacidad, está disponible en el panel de gestión de preferencias accesible desde el pie de página."}]},{id:"cookies-4",title:"4. Gestión de preferencias y Consent Mode",body:[{kind:"p",text:"En el primer acceso al sitio se muestra un banner que permite aceptar, rechazar o personalizar las categorÃas de cookies no técnicas. El usuario puede modificar sus elecciones en cualquier momento desde el panel del pie de página."},{kind:"p",text:"Fancy Capital implementa Google Consent Mode v2: las tecnologÃas de analÃtica y marketing se activan únicamente tras el consentimiento explÃcito del usuario. Sin consentimiento solo se envÃan señales agregadas y sin identificadores."}]},{id:"cookies-5",title:"5. Cómo deshabilitar las cookies desde el navegador",body:[{kind:"p",text:"Con independencia de las elecciones realizadas en el banner, el usuario puede deshabilitar o eliminar las cookies desde la configuración de su navegador. Deshabilitar las cookies técnicas puede afectar al funcionamiento del sitio."},{kind:"ul",items:["Google Chrome: https://support.google.com/chrome/answer/95647","Mozilla Firefox: https://support.mozilla.org/es/kb/Borrar%20cookie
4868s","Safari: https://support.apple.com/es-es/guide/safari/sfri11471","Microsoft Edge: https://support.microsoft.com/es-es/microsoft-edge"]}]},{id:"cookies-6",title:"6. Responsable del tratamiento y contactos",body:[{kind:"p",text:"Responsable del tratamiento de los datos personales recogidos mediante cookies es Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italia, NIF/IVA 04763600162, PEC [email protected]."},{kind:"p",text:'Para ejercer los derechos previstos en los arts. 15-22 RGPD o para cualquier consulta sobre cookies, escriba a <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"cookies-7",title:"7. Actualizaciones",body:[{kind:"p",text:"Esta PolÃtica de Cookies puede actualizarse en cualquier momento para reflejar cambios normativos, técnicos u organizativos. La versión vigente se publica siempre en esta página, con la fecha de la última actualización."}]}]},g6={title:"Cookie-Richtlinie",subtitle:"Informationen zur Verwendung von Cookies und ähnlichen Technologien auf der HeroShots-Plattform (Fancy Capital S.r.l.).",lastUpdated:"28. Mai 2026",version:"1.0",intro:[{kind:"p",text:"Diese Cookie-Richtlinie beschreibt die Cookies und ähnliche Technologien (im Folgenden zusammen «Cookies»), die auf heroshots.ai und innerhalb der HeroShots-Plattform (die «Plattform») eingesetzt werden, betrieben von <strong>Fancy Capital S.r.l.</strong>, Sitz: Via Crespi 25, 24021 Albino (BG), Italien, USt-ID/Steuer-ID 04763600162 («Fancy Capital» oder «Verantwortlicher»)."},{kind:"p",text:"Diese Information erfolgt gemäà Art. 122 des italienischen Datenschutzgesetzes (D.lgs. 196/2003), der MaÃnahme der italienischen Datenschutzbehörde vom 10. Juni 2021 sowie der Verordnung (EU) 2016/679 (DSGVO)."}],sections:[{id:"cookies-1",title:"1. Was Cookies sind",body:[{kind:"p",text:"Cookies sind kleine Textdateien, die Websites auf dem Endgerät des Nutzers ablegen und bei späteren Besuchen wieder auslesen. Ãhnliche Technologien (Pixel, Web-Beacons, Local Storage, Fingerprinting) werden im Sinne dieser Richtlinie wie Cookies behandelt."}]},{id:"cookies-2",title:"2. Kategorien der verwendeten Cookies",body:[{kind:"h3",text:"2.1 Technisch notwendige Cookies"},{kind:"p",text:"Werden ausschlieÃlich verwendet, um die Ãbertragung einer Kommunikation zu ermöglichen oder soweit unbedingt erforderlich, um einen vom Nutzer ausdrücklich angeforderten Dienst zu erbringen. Sie erfordern keine vorherige Einwilligung."},{kind:"ul",items:["Sitzungs- und Authentifizierungs-Cookies (Login, Nutzersitzung);","Sicherheits-Cookies (Betrugsprävention, CSRF);","technische Präferenz-Cookies (Sprache, Cookie-Einwilligung);","Load-Balancing-Cookies."]},{kind:"h3",text:"2.2 Analyse-Cookies"},{kind:"p",text:"Erfassen aggregierte oder pseudonymisierte Informationen über die Nutzerzahl und das Nutzungsverhalten. Analyse-Cookies Dritter, die nicht ausreichend anonymisiert sind, dürfen nur mit Einwilligung gesetzt werden."},{kind:"h3",text:"2.3 Profilbildungs- und Marketing-Cookies"},{kind:"p",text:"Werden eingesetzt, um die Navigation der Nutzer nachzuverfolgen, ihr Verhalten zu Marketingzwecken zu analysieren und Profile zu erstellen. Ihr Einsatz erfordert die ausdrückliche Einwilligung der Nutzer."}]},{id:"cookies-3",title:"3. Cookies Dritter",body:[{kind:"p",text:"Einige über die Website gesetzte Cookies werden von Dritten verwaltet (z. B. Analyse-Anbieter, soziale Netzwerke, Hosting- und CDN-Provider). Für diese Cookies gelten die Datenschutzhinweise der jeweiligen Verantwortlichen."},{kind:"p",text:"Die aktuelle Liste der Drittanbieter-Cookies samt Links zu deren Datenschutzerklärungen ist im Präferenz-Panel verfügbar, das im Footer der Website aufgerufen werden kann."}]},{id:"cookies-4",title:"4. Verwaltung der Präferenzen und Consent Mode",body:[{kind:"p",text:"Beim ersten Besuch der Website wird ein Banner eingeblendet, über das die nicht technischen Cookie-Kategorien akzeptiert, abgelehnt oder individuell konfiguriert werden können. Die Auswahl kann jederzeit über das Präferenz-Panel im Footer geändert werden."},{kind:"p",text:"Fancy Capital setzt Google Consent Mode v2 ein: Analyse- und Marketing-Technologien werden erst nach ausdrücklicher Einwilligung aktiviert. Ohne Einwilligung werden nur aggregierte Signale ohne Identifikatoren übertragen."}]},{id:"cookies-5",title:"5. Deaktivierung der Cookies im Browser",body:[{kind:"p",text:"Unabhängig von der über das Banner getroffenen Auswahl können Cookies jederzeit über die Browser-Einstellungen deaktiviert oder gelöscht werden. Die Deaktivierung technisch notwendiger Cookies kann die Funktionsfähigkeit der Website beeinträchtigen."},{kind:"ul",items:["Google Chrome: https://support.google.com/chrome/answer/95647","Mozilla Firefox: https://support.mozilla.org/de/kb/cookies-loeschen-daten-von-websites-entfernen","Safari: https://support.apple.com/de-de/guide/safari/sfri11471","Microsoft Edge: https://support.microsoft.com/de-de/microsoft-edge"]}]},{id:"cookies-6",title:"6. Verantwortlicher und Kontakte",body:[{kind:"p",text:"Verantwortlicher für die mittels Cookies erhobenen personenbezogenen Daten ist Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italien, USt-ID/Steuer-ID 04763600162, PEC [email protected]."},{kind:"p",text:'Zur Ausübung der Rechte nach Art. 15-22 DSGVO oder bei Fragen zu Cookies wenden Sie sich an <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"cookies-7",title:"7. Aktualisierungen",body:[{kind:"p",text:"Diese Cookie-Richtlinie kann jederzeit aktualisiert werden, um rechtlichen, technischen oder organisatorischen Ãnderungen Rechnung zu tragen. Die jeweils gültige Fassung wird mit Datum der letzten Aktualisierung auf dieser Seite veröffentlicht."}]}]},y6={title:"Politique relative aux cookies",subtitle:"Informations sur l'utilisation des cookies et technologies similaires sur la plateforme HeroShots (Fancy Capital S.r.l.).",lastUpdated:"28 mai 2026",version:"1.0",intro:[{kind:"p",text:"La présente Politique relative aux cookies décrit les cookies et technologies similaires (ci-après, collectivement, « cookies ») utilisés sur le site heroshots.ai et au sein de la plateforme HeroShots (la « Plateforme »), exploités par <strong>Fancy Capital S.r.l.</strong>, siège social Via Crespi 25, 24021 Albino (BG), Italie, n° TVA 04763600162 (« Fancy Capital » ou « Responsable »)."},{kind:"p",text:"Ces informations sont fournies en application de l'art. 122 du décret législatif italien 196/2003, de la délibération de l'Autorité italienne de protection des données du 10 juin 2021 et du règlement (UE) 2016/679 (RGPD)."}],sections:[{id:"cookies-1",title:"1. Qu'est-ce qu'un cookie",body:[{kind:"p",text:"Les cookies sont de petits fichiers texte que les sites web déposent sur l'équipement de l'utilisateur et qu'ils relisent lors des visites ultérieures. Les technologies similaires (pixels, web beacons, stockage local, fingerprinting) sont assimilées aux cookies aux fins de la présente politique."}]},{id:"cookies-2",title:"2. Catégories de cookies utilisés",body:[{kind:"h3",text:"2.1 Cookies techniques (strictement nécessaires)"},{kind:"p",text:"Utilisés exclusivement pour permettre la transmission d'une communication ou dans la mesure strictement nécessaire à la fourniture d'un service expressément demandé par l'utilisateur. Aucun consentement préalable n'est requis."},{kind:"ul",items:["cookies de session et d'authentification (connexion, session utilisateur) ;","cookies de sécurité (prévention de la fraude, CSRF) ;","cookies de préférences techniques (langue, état du consentement) ;","cookies d'équilibrage de charge."]},{kind:"h3",text:"2.2 Cookies analytiques"},{kind:"p",text:"Collectent des informations agrégées ou pseudonymisées sur le nombre d'utilisateurs et leur utilisation du site. Lorsque les cookies analytiques sont déposés par des tiers et ne sont pas suffisamment anonymisés, leur utilisation est subordonnée au consentement préalable de l'utilisateur."},{kind:"h3",text:"2.3 Cookies de profilage et de marketing"},{kind:"p",text:"Utilisés pour suivre la navigation des utilisateurs, analyser leur comportement à des fins de marketing et créer des profils. Leur utilisation requiert le consentement explicite de l'utilisateur."}]},{id:"cookies-3",title:"3. Cookies tiers",body:[{kind:"p",text:"Certains cookies installés via le site sont gérés par des tiers (fournisseurs d'analyse, réseaux sociaux, hébergeurs et CDN). Pour ces cookies, le traitement est régi par les politiques de confidentialité des responsables concernés."},{kind:"p",text:"La liste à jour des cookies tiers, avec les liens vers leurs politiques, est disponible dans le panneau de gestion des préférences accessible depuis le pied de page."}]},{id:"cookies-4",title:"4. Gestion des préférences et Consent Mode",body:[{kind:"p",text:"Lors de la première visite, un bandeau permet d'accepter, refuser ou personnaliser les catégories de cookies non techniques. L'utilisateur peut modifier ses choix à tout moment via le panneau accessible dans le pied de page."},{kind:"p",text:"Fancy Capital met en Åuvre Google Consent Mode v2 : les technologies d'analyse et de marketing ne s'activent qu'après le consentement explicite de l'utilisateur. En l'absence de consentement, seuls des signaux agrégés et sans identifiants sont transmis."}]},{id:"cookies-5",title:"5. Désactivation des cookies depuis le navigateur",body:[{kind:"p",text:"Indépendamment des choix effectués via le bandeau, l'utilisateur peut désactiver ou supprimer les cookies depuis les paramètres de son navigateur. La désactivation des cookies strictement nécessaires peut affecter le fonctionnement du site."},{kind:"ul",items:["Google Chrome : https://support.google.com/chrome/answer/95647","Mozilla Firefox : https://support.mozilla.org/fr/kb/effacer-cookie
4868s-supprimer-infos-sites-enregistrees","Safari : https://support.apple.com/fr-fr/guide/safari/sfri11471","Microsoft Edge : https://support.microsoft.com/fr-fr/microsoft-edge"]}]},{id:"cookies-6",title:"6. Responsable du traitement et contacts",body:[{kind:"p",text:"Le responsable du traitement des données personnelles collectées via les cookies est Fancy Capital S.r.l., Via Crespi 25, 24021 Albino (BG), Italie, n° TVA 04763600162, PEC [email protected]."},{kind:"p",text:'Pour exercer les droits prévus aux art. 15-22 du RGPD ou pour toute demande relative aux cookies, écrivez à <a class="text-brand-secondary underline" href="mailto:[email protected]">[email protected]</a>.'}]},{id:"cookies-7",title:"7. Mises à jour",body:[{kind:"p",text:"La présente Politique peut être mise à jour à tout moment pour refléter des évolutions réglementaires, techniques ou organisationnelles. La version en vigueur est toujours publiée sur cette page avec sa date de dernière mise à jour."}]}]},v6={it:ZG,en:XG,es:e6,de:t6,fr:a6},b6={it:n6,en:r6,es:o6,de:i6,fr:s6},w6={it:l6,en:c6,es:d6,de:u6,fr:h6},x6={it:p6,en:m6,es:f6,de:g6,fr:y6},sh=e=>{const t=(e||"en").toLowerCase().slice(0,2);return t==="it"||t==="en"||t==="es"||t==="de"||t==="fr"?t:"en"},lh=e=>e==="it",k6=()=>{const{i18n:e}=we(),t=sh(e.language),a=v6[t];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:a.title,description:a.subtitle,canonical:"https://heroshots.ai/legal/terms"}),i.jsx(Ee,{}),i.jsx("article",{className:"py-16 sm:py-20 flex-grow",children:i.jsx(ih,{doc:a,showBindingNotice:!lh(t)})}),i.jsx(ze,{})]})},C6=()=>{const{i18n:e}=we(),t=sh(e.language),a=b6[t];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:a.title,description:a.subtitle,canonical:"https://heroshots.ai/legal/privacy"}),i.jsx(Ee,{}),i.jsx("article",{className:"py-16 sm:py-20 flex-grow",children:i.jsx(ih,{doc:a,showBindingNotice:!lh(t)})}),i.jsx(ze,{})]})},S6=()=>{const{i18n:e}=we(),t=sh(e.language),a=x6[t];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:a.title,description:a.subtitle,canonical:"https://heroshots.ai/legal/cookies"}),i.jsx(Ee,{}),i.jsx("article",{className:"py-16 sm:py-20 flex-grow",children:i.jsx(ih,{doc:a,showBindingNotice:!lh(t)})}),i.jsx(ze,{})]})},sx=()=>{const{i18n:e}=we(),t=sh(e.language),a=w6[t];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:a.title,description:a.subtitle,canonical:"https://heroshots.ai/legal/aup"}),i.jsx(Ee,{}),i.jsx("article",{className:"py-16 sm:py-20 flex-grow",children:i.jsx(ih,{doc:a,showBindingNotice:!lh(t)})}),i.jsx(ze,{})]})},A6=()=>{const{t:e}=we(),t=[{icon:bo,key:"Claude",title:e("integrations.cardClaudeTitle"),desc:e("integrations.cardClaudeDesc"),href:"/integrations/claude",tag:e("integrations.liveTag")},{icon:xa,key:"Amazon",title:e("integrations.cardAmazonTitle"),desc:e("integrations.cardAmazonDesc"),href:"/product/amazon-import",tag:e("integrations.liveTag")},{icon:zr,key:"SDKs",title:e("integrations.cardSdksTitle"),desc:e("integrations.cardSdksDesc"),href:"/sdks",tag:e("integrations.liveTag")},{icon:iC,key:"API",title:e("integrations.cardApiTitle"),desc:e("integrations.cardApiDesc"),href:"/docs",tag:e("integrations.liveTag")}],a=[{icon:VN,key:"Shopify",title:e("integrations.cardShopifyTitle"),desc:e("integrations.cardShopifyDesc"),tag:e("integrations.soonTag")},{icon:Sn,key:"Zapier",title:e("integrations.cardZapierTitle"),desc:e("integrations.cardZapierDesc"),tag:e("integrations.soonTag")},{icon:wm,key:"ChatGPT",title:e("integrations.cardChatgptTitle"),desc:e("integrations.cardChatgptDesc"),tag:e("integrations.soonTag")}],n={"@context":"https://schema.org","@type":"CollectionPage",name:e("integrations.seoTitle"),description:e("integrations.seoDesc"),url:"https://heroshots.ai/integrations",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"},hasPart:[{"@type":"SoftwareApplication",name:"HeroShots Claude Skill",url:"https://heroshots.ai/integrations/claude",applicationCategory:"BusinessApplication",operatingSystem:"Web"},{"@type":"WebPage",name:"HeroShots Amazon Import",url:"https://heroshots.ai/product/amazon-import"}]};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("integrations.seoTitle"),description:e("integrations.seoDesc"),canonical:"https://heroshots.ai/integrations",jsonLd:[n,Le([{name:"Integrations",path:"/integrations"}])]}),i.jsx(Ee,{}),i.jsx("main",{children:i.jsx("section",{className:"py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-5xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-3xl mx-auto mb-12",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(wt,{className:"h-4 w-4"}),e("integrations.badge")]}),i.jsx("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-display font-bold leading-[1.1] mb-6",children:e("integrations.heroTitle")}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground leading-relaxed",children:e("integrations.heroSubtitle")})]}),i.jsx("h2",{className:"text-xs uppercase tracking-wider font-mono text-muted-foreground mb-4",children:e("integrations.liveTag")}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4 mb-10",children:t.map(r=>i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all",children:i.jsxs(ie,{className:"p-6",children:[i.jsxs("div",{className:"flex items-center justify-between mb-4",children:[i.jsx(r.icon,{className:"h-8 w-8 text-primary"}),i.jsx("span",{className:"text-[10px] uppercase tracking-wider font-mono px-2 py-0.5 rounded bg-primary/10 text-primary",children:r.tag})]}),i.jsx("h3",{className:"font-semibold text-lg mb-2",children:r.title}),i.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:r.desc}),i.jsxs(M,{to:r.href,className:"text-sm text-brand-secondary hover:underline inline-flex items-center gap-1",children:[e("common.learnMore")," ",i.jsx(at,{className:"h-3 w-3"})]})]})},r.key))}),i.jsx("h2",{className:"text-xs uppercase tracking-wider font-mono text-muted-foreground mb-4",children:e("integrations.so
4868onTag")}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4 mb-16",children:a.map(r=>i.jsx(re,{className:"border-border/50 opacity-70",children:i.jsxs(ie,{className:"p-6",children:[i.jsxs("div",{className:"flex items-center justify-between mb-4",children:[i.jsx(r.icon,{className:"h-8 w-8 text-muted-foreground"}),i.jsx("span",{className:"text-[10px] uppercase tracking-wider font-mono px-2 py-0.5 rounded bg-muted text-muted-foreground",children:r.tag})]}),i.jsx("h3",{className:"font-semibold text-lg mb-2",children:r.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:r.desc})]})},r.key))}),i.jsx(re,{className:"border-border/50 bg-muted/20",children:i.jsxs(ie,{className:"p-8 flex flex-col md:flex-row items-start md:items-center justify-between gap-4",children:[i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold text-lg mb-1",children:e("integrations.requestTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("integrations.requestDesc")})]}),i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx(M,{to:"/pre-sales",children:e("integrations.requestCta")})})]})})]})})}),i.jsx(ze,{})]})},P6=()=>{const{t:e}=we(),t=[{title:e("claudeSkill.how1Title"),desc:e("claudeSkill.how1Desc")},{title:e("claudeSkill.how2Title"),desc:e("claudeSkill.how2Desc")},{title:e("claudeSkill.how3Title"),desc:e("claudeSkill.how3Desc")}],a=[{icon:Sn,title:e("claudeSkill.b1Title"),desc:e("claudeSkill.b1Desc")},{icon:Iu,title:e("claudeSkill.b2Title"),desc:e("claudeSkill.b2Desc")},{icon:Pg,title:e("claudeSkill.b3Title"),desc:e("claudeSkill.b3Desc")},{icon:Ha,title:e("claudeSkill.b4Title"),desc:e("claudeSkill.b4Desc")}],n=[1,2,3,4].map(l=>({q:e(`claudeSkill.faq${l}Q`),a:e(`claudeSkill.faq${l}A`)})),r={"@context":"https://schema.org","@type":"SoftwareApplication",name:"HeroShots Claude Skill",applicationCategory:"BusinessApplication",operatingSystem:"Web",description:e("claudeSkill.seoDesc"),url:"https://heroshots.ai/integrations/claude",offers:{"@type":"Offer",price:"0",priceCurrency:"EUR"},publisher:{"@type":"Organization",name:"HeroShots",url:"https://heroshots.ai"}},o={"@context":"https://schema.org","@type":"HowTo",name:e("claudeSkill.setupTitle"),step:[{"@type":"HowToStep",position:1,name:"Add Skill",text:e("claudeSkill.setupStep1")},{"@type":"HowToStep",position:2,name:"Sign in",text:e("claudeSkill.setupStep2")},{"@type":"HowToStep",position:3,name:"Generate",text:e("claudeSkill.setupStep3")}]},s={"@context":"https://schema.org","@type":"FAQPage",mainEntity:n.map(l=>({"@type":"Question",name:l.q,acceptedAnswer:{"@type":"Answer",text:l.a}}))};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("claudeSkill.seoTitle"),description:e("claudeSkill.seoDesc"),canonical:"https://heroshots.ai/integrations/claude",jsonLd:[r,o,s,Le([{name:"Integrations",path:"/integrations"},{name:"Claude Skill",path:"/integrations/claude"}])]}),i.jsx(Ee,{}),i.jsx("main",{children:i.jsx("section",{className:"py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-5xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-3xl mx-auto mb-14",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(bo,{className:"h-4 w-4"}),e("claudeSkill.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("claudeSkill.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("claudeSkill.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("claudeSkill.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("claudeSkill.ctaConnect")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx("a",{href:"#setup",children:e("claudeSkill.ctaDocs")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground mt-4",children:e("claudeSkill.requires")})]}),i.jsxs("section",{className:"mb-16",children:[i.jsxs("div",{className:"text-center mb-10",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold mb-3",children:e("claudeSkill.howTitle")}),i.jsx("p",{className:"text-muted-foreground",children:e("claudeSkill.howSubtitle")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4",children:t.map((l,c)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx("h3",{className:"font-semibold mb-2",children:l.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l.desc})]})},c))})]}),i.jsxs("section",{className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("claudeSkill.benefitsTitle")}),i.jsx("div",{className:"grid md:grid-cols-2 gap-4",children:a.map((l,c)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx(l.icon,{className:"h-6 w-6 text-primary mb-3"}),i.jsx("h3",{className:"font-semibold mb-2",children:l.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l.desc})]})},c))})]}),i.jsxs("section",{id:"setup",className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("claudeSkill.setupTitle")}
4868),i.jsx("ol",{className:"max-w-2xl mx-auto space-y-4",children:[e("claudeSkill.setupStep1"),e("claudeSkill.setupStep2"),e("claudeSkill.setupStep3")].map((l,c)=>i.jsxs("li",{className:"flex gap-4 p-4 rounded-lg border border-border/50 bg-card/40",children:[i.jsx("span",{className:"shrink-0 h-8 w-8 rounded-full bg-primary/10 text-primary flex items-center justify-center font-mono text-sm",children:c+1}),i.jsx("p",{className:"text-sm text-foreground/90 leading-relaxed",children:l})]},c))})]}),i.jsxs("section",{className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("claudeSkill.faqTitle")}),i.jsx(Co,{type:"single",collapsible:!0,className:"max-w-2xl mx-auto space-y-3",children:n.map((l,c)=>i.jsxs(Sr,{value:`c-${c}`,className:"border border-border rounded-lg px-4 sm:px-6 bg-card",children:[i.jsx(Ar,{className:"text-left hover:no-underline py-4",children:i.jsx("span",{className:"font-semibold text-sm sm:text-base",children:l.q})}),i.jsx(Pr,{className:"text-muted-foreground text-sm pt-1 pb-4",children:l.a})]},c))})]}),i.jsx("div",{className:"text-center",children:i.jsxs(M,{to:"/integrations",className:"text-sm text-brand-secondary hover:underline inline-flex items-center gap-1",children:[e("integrations.exploreAll")," ",i.jsx(at,{className:"h-3 w-3"})]})})]})})}),i.jsx(ze,{})]})},T6=()=>{const{t:e}=we(),t=[{title:e("amazonImport.how1Title"),desc:e("amazonImport.how1Desc")},{title:e("amazonImport.how2Title"),desc:e("amazonImport.how2Desc")},{title:e("amazonImport.how3Title"),desc:e("amazonImport.how3Desc")}],a=[e("amazonImport.extracted1"),e("amazonImport.extracted2"),e("amazonImport.extracted3"),e("amazonImport.extracted4"),e("amazonImport.extracted5")],n=[{icon:km,title:e("amazonImport.b1Title"),desc:e("amazonImport.b1Desc")},{icon:Kl,title:e("amazonImport.b2Title"),desc:e("amazonImport.b2Desc")},{icon:Ha,title:e("amazonImport.b3Title"),desc:e("amazonImport.b3Desc")},{icon:zr,title:e("amazonImport.b4Title"),desc:e("amazonImport.b4Desc")}],r=[1,2,3,4].map(l=>({q:e(`amazonImport.faq${l}Q`),a:e(`amazonImport.faq${l}A`)})),o={"@context":"https://schema.org","@type":"HowTo",name:e("amazonImport.howTitle"),step:t.map((l,c)=>({"@type":"HowToStep",position:c+1,name:l.title,text:l.desc}))},s={"@context":"https://schema.org","@type":"FAQPage",mainEntity:r.map(l=>({"@type":"Question",name:l.q,acceptedAnswer:{"@type":"Answer",text:l.a}}))};return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("amazonImport.seoTitle"),description:e("amazonImport.seoDesc"),canonical:"https://heroshots.ai/product/amazon-import",jsonLd:[o,s,Le([{name:"Product",path:"/product"},{name:"Amazon Import",path:"/product/amazon-import"}])]}),i.jsx(Ee,{}),i.jsx("main",{children:i.jsx("section",{className:"py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-5xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-3xl mx-auto mb-12",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(xa,{className:"h-4 w-4"}),e("amazonImport.badge")]}),i.jsxs("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:[e("amazonImport.heroTitle")," ",i.jsx("span",{className:"text-gradient italic",children:e("amazonImport.heroHighlight")})]}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-8 leading-relaxed",children:e("amazonImport.heroSubtitle")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("amazonImport.ctaTry")})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx("a",{href:"#how",children:e("amazonImport.ctaHow")})})]})]}),i.jsx(re,{className:"max-w-2xl mx-auto mb-14 border-border/50 shadow-elegant",children:i.jsxs(ie,{className:"p-6",children:[i.jsx("label",{className:"text-xs uppercase tracking-wider font-mono text-muted-foreground mb-2 block",children:e("amazonImport.urlPreviewLabel")}),i.jsxs("div",{className:"flex gap-2",children:[i.jsx(nn,{readOnly:!0,placeholder:e("amazonImport.urlPreviewPlaceholder"),className:"font-mono text-sm"}),i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx("a",{href:"https://app.heroshots.ai/login",children:e("amazonImport.urlPreviewCta")})})]}),i.jsx("p",{className:"text-xs text-muted-foreground mt-3",children:e("amazonImport.urlPreviewHint")})]})}),i.jsxs("section",{id:"how",className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("amazonImport.howTitle")}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4",children:t.map((l,c)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx("h3",{className:"font-semibold mb-2",children:l.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l.desc})]})},c))})]}),i.jsxs("section",{className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("amazonImport.extractedTitle")}
4868),i.jsx("ul",{className:"max-w-2xl mx-auto space-y-3",children:a.map((l,c)=>i.jsxs("li",{className:"flex gap-3 items-start p-4 rounded-lg border border-border/50 bg-card/40",children:[i.jsx(gl,{className:"h-5 w-5 text-primary shrink-0 mt-0.5"}),i.jsx("span",{className:"text-sm text-foreground/90",children:l})]},c))})]}),i.jsxs("section",{className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("amazonImport.benefitsTitle")}),i.jsx("div",{className:"grid md:grid-cols-2 gap-4",children:n.map((l,c)=>i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx(l.icon,{className:"h-6 w-6 text-primary mb-3"}),i.jsx("h3",{className:"font-semibold mb-2",children:l.title}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l.desc})]})},c))})]}),i.jsx(re,{className:"mb-16 border-yellow-500/20 bg-yellow-500/5 max-w-3xl mx-auto",children:i.jsxs(ie,{className:"p-6 flex gap-4",children:[i.jsx(Iu,{className:"h-6 w-6 text-yellow-600 shrink-0"}),i.jsxs("div",{children:[i.jsx("h3",{className:"font-semibold mb-1",children:e("amazonImport.complianceTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("amazonImport.complianceDesc")})]})]})}),i.jsxs("section",{className:"mb-16",children:[i.jsx("h2",{className:"text-3xl md:text-4xl font-display font-bold text-center mb-10",children:e("amazonImport.faqTitle")}),i.jsx(Co,{type:"single",collapsible:!0,className:"max-w-2xl mx-auto space-y-3",children:r.map((l,c)=>i.jsxs(Sr,{value:`a-${c}`,className:"border border-border rounded-lg px-4 sm:px-6 bg-card",children:[i.jsx(Ar,{className:"text-left hover:no-underline py-4",children:i.jsx("span",{className:"font-semibold text-sm sm:text-base",children:l.q})}),i.jsx(Pr,{className:"text-muted-foreground text-sm pt-1 pb-4",children:l.a})]},c))})]}),i.jsx("div",{className:"text-center",children:i.jsxs(M,{to:"/integrations",className:"text-sm text-brand-secondary hover:underline inline-flex items-center gap-1",children:[e("integrations.exploreAll")," ",i.jsx(at,{className:"h-3 w-3"})]})})]})})}),i.jsx(ze,{})]})},MT=e=>i.jsx("svg",{viewBox:"0 0 780 250",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",...e,children:i.jsx("path",{fill:"#CB3837",d:"M240,250h100v-50h100V0H240V250z M340,50h50v100h-50V50z M0,200h100V50h50v150h50V50h50v150h50V0H0V200z M480,0v200h100V50h50v150h50V50h50v150h50V0H480z"})}),LT=e=>i.jsxs("svg",{viewBox:"0 0 256 255",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",...e,children:[i.jsxs("defs",{children:[i.jsxs("linearGradient",{id:"pyBlue",x1:"12.959%",x2:"79.639%",y1:"12.039%",y2:"78.201%",children:[i.jsx("stop",{offset:"0",stopColor:"#387EB8"}),i.jsx("stop",{offset:"1",stopColor:"#366994"})]}),i.jsxs("linearGradient",{id:"pyYellow",x1:"19.128%",x2:"90.742%",y1:"20.579%",y2:"88.429%",children:[i.jsx("stop",{offset:"0",stopColor:"#FFE052"}),i.jsx("stop",{offset:"1",stopColor:"#FFC331"})]})]}),i.jsx("path",{fill:"url(#pyBlue)",d:"M126.916.072c-64.832 0-60.784 28.115-60.784 28.115l.072 29.128h61.868v8.745H41.631S.145 61.355.145 126.77c0 65.417 36.21 63.097 36.21 63.097h21.61v-30.356s-1.165-36.21 35.632-36.21h61.362s34.475.557 34.475-33.319V33.97S194.67.072 126.916.072ZM92.802 19.66a11.13 11.13 0 0 1 11.13 11.13 11.13 11.13 0 0 1-11.13 11.13 11.13 11.13 0 0 1-11.13-11.13 11.13 11.13 0 0 1 11.13-11.13Z"}),i.jsx("path",{fill:"url(#pyYellow)",d:"M128.757 254.126c64.832 0 60.784-28.115 60.784-28.115l-.072-29.127H127.6v-8.745h86.441s41.486 4.705 41.486-60.712c0-65.416-36.21-63.096-36.21-63.096h-21.61v30.355s1.165 36.21-35.632 36.21h-61.362s-34.475-.557-34.475 33.32v56.013s-5.235 33.897 62.518 33.897Zm34.114-19.586a11.13 11.13 0 0 1-11.13-11.13 11.13 11.13 0 0 1 11.13-11.131 11.13 11.13 0 0 1 11.131 11.13 11.13 11.13 0 0 1-11.131 11.131Z"})]}),OT=e=>i.jsxs("svg",{viewBox:"0 0 128 128",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",...e,children:[i.jsx("ellipse",{cx:"64",cy:"64",rx:"60",ry:"32",fill:"#8892BF"}),i.jsx("path",{fill:"#FFFFFF",d:"M31.6 47.7h9.7c2.85 0 4.9.53 6.15 1.6 1.25 1.06 1.63 2.83 1.13 5.3l-.87 4.3c-.36 1.86-.94 3.19-1.73 4-.79.8-1.87 1.36-3.22 1.66-1.35.3-3.13.45-5.34.45h-4.35l-1.4 7H27L31.6 47.7Zm3.5 4.75-1.94 9.55h1.6c2.35 0 4.1-.18 5.24-.53 1.14-.36 1.92-1.05 2.32-2.06.4-1 .48-2.15.25-3.45-.28-1.5-.85-2.44-1.7-2.82-.85-.38-2.14-.57-3.86-.57l-1.9-.12ZM56.3 42h4.7l-1.15 5.7h4.7c3.2 0 5.4.55 6.6 1.66 1.2 1.1 1.53 2.87 1 5.3l-2.45 12.1h-4.8l2.32-11.5c.25-1.24.17-2.08-.24-2.53-.42-.45-1.3-.68-2.66-.68h-4.2l-2.98 14.7H52.3L56.3 42Zm27.8 5.7h9.7c2.85 0 4.9.53 6.15 1.6 1.25 1.06 1.62 2.83 1.13 5.3l-.87 4.3c-.36 1.86-.94 3.19-1.73 4-.79.8-1.87 1.36-3.22 1.66-1.35.3-3.13.45-5.34.45H85.6l-1.4 7h-4.7l4.6-24.31Zm3.5 4.75-1.94 9.55h1.6c2.35 0 4.1-.18 5.24-.53 1.14-.36 1.92-1.05 2.32-2.06.4-1 .48-2.15.25-3.45-.28-1.5-.85-2.44-1.7-2.82-.85-.38-2.14-.57-3.86-.57l-1.9-.12Z"})]}),I6=()=>{const{t:e}=we(),t=[{key:"js",slug:"javascript",Logo:MT,install:"npm install heroshots",registryUrl:"https://www.npmjs.com/package/heroshots",registryLabel:"npm"}
4868,{key:"python",slug:"python",Logo:LT,install:"pip install heroshots",registryUrl:"https://pypi.org/project/heroshots/",registryLabel:"PyPI"},{key:"php",slug:"php",Logo:OT,install:"composer require heroshots/sdk",registryUrl:"https://packagist.org/packages/heroshots/sdk",registryLabel:"Packagist"}],a=[{"@context":"https://schema.org","@type":"CollectionPage",name:e("sdks.seoTitle"),description:e("sdks.seoDesc"),url:"https://heroshots.ai/sdks",isPartOf:{"@type":"WebSite",name:"HeroShots",url:"https://heroshots.ai"},hasPart:t.map(n=>({"@type":"SoftwareSourceCode",name:e(`sdks.${n.key}.title`),codeRepository:n.registryUrl,programmingLanguage:e(`sdks.${n.key}.language`),url:`https://heroshots.ai/sdks/${n.slug}`}))},Le([{name:"SDKs",path:"/sdks"}])];return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:e("sdks.seoTitle"),description:e("sdks.seoDesc"),canonical:"https://heroshots.ai/sdks",jsonLd:a}),i.jsx(Ee,{}),i.jsx("main",{children:i.jsx("section",{className:"py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-5xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-3xl mx-auto mb-12",children:[i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(zr,{className:"h-4 w-4"})," ",e("sdks.badge")]}),i.jsx("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-display font-bold leading-[1.1] mb-6",children:e("sdks.heroTitle")}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground leading-relaxed mb-4",children:e("sdks.heroSubtitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("sdks.compat")})]}),i.jsx("div",{className:"grid md:grid-cols-3 gap-4 mb-12",children:t.map(n=>i.jsx(re,{className:"border-border/50 hover:shadow-elegant transition-all",children:i.jsxs(ie,{className:"p-6",children:[i.jsx("div",{className:"h-10 mb-4 flex items-center",children:i.jsx(n.Logo,{className:"h-full"})}),i.jsx("h3",{className:"font-semibold text-lg mb-1",children:e(`sdks.${n.key}.title`)}),i.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:e(`sdks.${n.key}.desc`)}),i.jsx("pre",{className:"bg-muted/50 border border-border/50 rounded p-3 text-xs font-mono mb-4 overflow-x-auto",children:i.jsx("code",{children:n.install})}),i.jsxs("div",{className:"flex flex-col gap-2",children:[i.jsx(H,{variant:"outline",size:"sm",asChild:!0,children:i.jsxs(M,{to:`/sdks/${n.slug}`,children:[e("common.learnMore")," ",i.jsx(at,{className:"h-3 w-3 ml-1"})]})}),i.jsxs("a",{href:n.registryUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-brand-secondary hover:underline inline-flex items-center gap-1",children:[e("sdks.viewOn",{registry:n.registryLabel})," ",i.jsx(sC,{className:"h-3 w-3"})]})]})]})},n.key))}),i.jsx(re,{className:"border-border/50 bg-muted/20",children:i.jsxs(ie,{className:"p-8 flex flex-col md:flex-row items-start md:items-center justify-between gap-4",children:[i.jsxs("div",{children:[i.jsx("h3",{className:"font-display text-xl font-semibold mb-1",children:e("sdks.ctaTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:e("sdks.ctaDesc")})]}),i.jsx(H,{variant:"hero",asChild:!0,children:i.jsx(M,{to:"/docs",children:e("sdks.readDocs")})})]})})]})})}),i.jsx(ze,{})]})},Ry=({sdk:e,slug:t,Logo:a,registryUrl:n,registryLabel:r,installCmd:o,codeExample:s})=>{const{t:l}=we(),c=`https://heroshots.ai/sdks/${t}`,d=l(`sdks.${e}.seoTitle`),u=l(`sdks.${e}.seoDesc`),h=[{"@context":"https://schema.org","@type":"SoftwareSourceCode",name:l(`sdks.${e}.title`),description:u,codeRepository:n,programmingLanguage:l(`sdks.${e}.language`),url:c,publisher:{"@type":"Organization",name:"HeroShots",url:"https://heroshots.ai"}},{"@context":"https://schema.org","@type":"HowTo",name:l(`sdks.${e}.howToName`),step:[{"@type":"HowToStep",position:1,name:l("sdks.installTitle"),text:o},{"@type":"HowToStep",position:2,name:l("sdks.authTitle"),text:l("sdks.authText")},{"@type":"HowToStep",position:3,name:l("sdks.quickstartTitle"),text:l(`sdks.${e}.quickstartText`)}]},Le([{name:"SDKs",path:"/sdks"},{name:l(`sdks.${e}.title`),path:`/sdks/${t}`}])],m=[1,2,3].map(p=>({q:l(`sdks.${e}.faq${p}Q`),a:l(`sdks.${e}.faq${p}A`)}));return i.jsxs("div",{className:"min-h-screen flex flex-col",children:[i.jsx(Se,{title:d,description:u,canonical:c,jsonLd:h}),i.jsx(Ee,{}),i.jsx("main",{children:i.jsx("section",{className:"py-14 md:py-20",children:i.jsxs("div",{className:"container max-w-4xl px-4 sm:px-6",children:[i.jsxs("div",{className:"text-center max-w-2xl mx-auto mb-14",children:[i.jsx("div",{className:"mx-auto w-16 h-16 mb-6 flex items-center justify-center",children:i.jsx(a,{className:"w-full h-full"})}),i.jsxs("div",{className:"inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6",children:[i.jsx(zr,{className:"h-4 w-4"}),l("sdks.officialBadge")]}),i.jsx("h1",{className:"text-4xl sm:text-5xl md:text-6xl font-display font-bold leading-[1.1] mb-6",children:l(`sdks.${e}.heroTitle`)}),i.jsx("p",{className:"text-lg md:text-xl text-muted-foreground mb-8 leading-relaxed",children:l(`sdks.${e}.heroSubtitle`)}),i.jsx("p",{className:"text-sm text-muted-foreground mb-8",children:l("sdks.compat")}),i.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center",children:[i.jsx(H,{variant:"hero",size:"lg",asChild:!0,children:i.jsxs("a",{href:n,target:"_blank",rel:"noopener noreferrer",children:[l("sdks.viewOn",{registry:r})," ",i.jsx(sC,{className:"h-4 w-4 ml-1"})]})}),i.jsx(H,{variant:"outline",size:"lg",asChild:!0,children:i.jsx(M,{to:"/docs",children:l("sdks.readDocs")})})]})]}),i.jsxs("section",{className:"mb-12",children:[i.jsxs("h2",{className:"text-2xl font-display font-bold mb-4 flex items-center gap-2",children:[i.jsx(WN,{className:"h-5 w-5 text-primary"})," ",l("sdks.installTitle")]}),i.jsx("pre",{className:"bg-muted/50 border border-border/50 rounded-lg p-4 text-sm font-mono overflow-x-auto",children:i.jsx("code",{children:o})})]}),i.jsxs("section",{className:"mb-12",children:[i.jsx("h2",{className:"text-2xl font-display font-bold mb-4",children:l("sdks.quickstartTitle")}),i.jsx("p",{className:"text-muted-foreground mb-4",children:l(`sdks.${e}.quickstartText`)}),i.jsx("pre",{className:"bg-muted/50 border border-border/50 rounded-lg p-4 text-sm font-mono overflow-x-auto",children:i.jsx("code",{children:s})})]}),i.jsxs("section",{className:"mb-12 grid md:grid-cols-2 gap-4",children:[i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx(Iu,{className:"h-6 w-6 text-primary mb-3"}),i.jsx("h3",{className:"font-semibold mb-2",children:l("sdks.authTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l("sdks.authText")})]})}),i.jsx(re,{className:"border-border/50",children:i.jsxs(ie,{className:"p-6",children:[i.jsx(Sn,{className:"h-6 w-6 text-primary mb-3"}),i.jsx("h3",{className:"font-semibold mb-2",children:l("sdks.errorsTitle")}),i.jsx("p",{className:"text-sm text-muted-foreground",children:l("sdks.errorsText")})]})})]}),i.jsxs("section",{className:"mb-12",children:[i.jsx("h2",{className:"text-2xl md:text-3xl font-display font-bold text-center mb-8",children:l("sdks.faqTitle")}
4868),i.jsx(Co,{type:"single",collapsible:!0,className:"max-w-2xl mx-auto space-y-3",children:m.map((p,b)=>i.jsxs(Sr,{value:`s-${b}`,className:"border border-border rounded-lg px-4 sm:px-6 bg-card",children:[i.jsx(Ar,{className:"text-left hover:no-underline py-4",children:i.jsx("span",{className:"font-semibold text-sm sm:text-base",children:p.q})}),i.jsx(Pr,{className:"text-muted-foreground text-sm pt-1 pb-4",children:p.a})]},b))})]}),i.jsx("div",{className:"text-center",children:i.jsxs(M,{to:"/sdks",className:"text-sm text-brand-secondary hover:underline inline-flex items-center gap-1",children:[l("sdks.viewAll")," ",i.jsx(at,{className:"h-3 w-3"})]})})]})})}),i.jsx(ze,{})]})},j6=`# npm 4869npm install heroshots 4870 4871# pnpm 4872pnpm add heroshots 4873 4874# yarn 4875yarn add heroshots 4876 4877# bun 4878bun add heroshots`,N6=`import { HeroShots } from "heroshots"; 4879 4880const client = new HeroShots({ apiKey: process.env.HEROSHOTS_API_KEY! }); 4881 4882const image = await client.generations.create({ 4883 productUrl: "https://amazon.com/dp/B0EXAMPLE", 4884 model: "avatar_female_01", 4885 location: "sunlit-kitchen", 4886 pose: "holding-product-eye-contact", 4887 duration: 15, // seconds â multiples of 15 4888}); 4889 4890console.log(image.url);`,E6=()=>i.jsx(Ry,{sdk:"js",slug:"javascript",Logo:MT,registryUrl:"https://www.npmjs.com/package/heroshots",registryLabel:"npm",installCmd:j6,codeExample:N6}),z6=`# pip 4891pip install heroshots 4892 4893# poetry 4894poetry add heroshots 4895 4896# uv 4897uv add heroshots`,R6=`from heroshots import HeroShots 4898 4899client = HeroShots(api_key="hs_live_...") 4900 4901image = client.generations.create( 4902 product_url="https://amazon.com/dp/B0EXAMPLE", 4903 model="avatar_female_01", 4904 location="sunlit-kitchen", 4905 pose="holding-product-eye-contact", 4906 duration=15, # seconds â multiples of 15 4907) 4908 4909print(image.url)`,D6=()=>i.jsx(Ry,{sdk:"python",slug:"python",Logo:LT,registryUrl:"https://pypi.org/project/heroshots/",registryLabel:"PyPI",installCmd:z6,codeExample:R6}),_6=`# composer 4910composer require heroshots/sdk`,q6=`<?php 4911require 'vendor/autoload.php'; 4912 4913use HeroShots\\Client; 4914 4915$client = new Client(getenv('HEROSHOTS_API_KEY')); 4916 4917$image = $client->generations()->create([ 4918 'product_url' => 'https://amazon.com/dp/B0EXAMPLE', 4919 'model' => 'avatar_female_01', 4920 'location' => 'sunlit-kitchen', 4921 'pose' => 'holding-product-eye-contact', 4922 'duration' => 15, // seconds â multiples of 15 4923]); 4924 4925echo $image->url;`,U6=()=>i.jsx(Ry,{sdk:"php",slug:"php",Logo:OT,registryUrl:"https://packagist.org/packages/heroshots/sdk",registryLabel:"Packagist",installCmd:_6,codeExample:q6}),M6=["section h1","section h2","section h3","section p.lead, section .lead","[data-reveal]"],L6=()=>(f.useEffect(()=>{if(typeof window>"u"||window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=new IntersectionObserver(g=>{g.forEach(v=>{v.isIntersecting&&(v.target.classList.add("is-in"),t.unobserve(v.target))})},{threshold:.12,rootMargin:"0px 0px -60px 0px"}),a=()=>{M6.forEach(g=>{document.querySelectorAll(g).forEach(v=>{v.dataset.revealTagged||(v.dataset.revealTagged="1",v.classList.add("reveal"),t.observe(v))})})};a();let n=0;const r=window.setInterval(()=>{a(),++n>12&&window.clearInterval(r)},200),o=new MutationObserver(()=>a());o.observe(document.body,{childList:!0,subtree:!0});const s=document.createElement("div");s.className="cursor-light",document.body.appendChild(s);let l=window.innerWidth/2,c=window.innerHeight/2,d=l,u=c,h=0;const m=()=>{l+=(d-l)*.15,c+=(u-c)*.15,s.style.transform=`translate3d(${l}px, ${c}px, 0)`,h=requestAnimationFrame(m)},p=g=>{d=g.clientX,u=g.clientY,document.body.classList.add("has-cursor")},b=()=>document.body.classList.remove("has-cursor");return window.addEventListener("pointermove",p),window.addEventListener("pointerleave",b),m(),()=>{t.disconnect(),o.disconnect(),window.clearInterval(r),window.removeEventListener("pointermove",p),window.removeEventListener("pointerleave",b),cancelAnimationFrame(h),s.remove()}},[]),i.jsxs("div",{className:"site-bg","aria-hidden":"true",children:[i.jsx("div",{className:"site-bg__blob site-bg__blob--a"}),i.jsx("div",{className:"site-bg__blob site-bg__blob--b"})]})),O6=()=>{const{pathname:e,hash:t,key:a}=Wa(),n=KD();return f.useEffect(()=>{var s;if(n==="POP")return;const o=typeof window<"u"&&((s=window.matchMedia)==null?void 0:s.call(window,"(prefers-reduced-motion: reduce)").matches)?"auto":"smooth";if(t){const l=t.replace("#","");let c=0;const d=()=>{const u=document.getElementById(l);if(u){u.scrollIntoView({behavior:o,block:"start"});return}c++<30&&requestAnimationFrame(d)};requestAnimationFrame(d)}else window.scrollTo({top:0,left:0,behavior:o})},[e,t,a,n]),null},G6=()=>{const e=qu(),t=Wa();return f.useEffect(()=>{const a=n=>{var d,u;if(n.defaultPrevented||n.button!==0||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey)return;const r=(d=n.target)==null?void 0:d.closest("a");if(!r)return;const o=r;if(o.target&&o.target!=="_self"||o.hasAttribute("download"))return;const s=o.getAttribute("href");if(!s)return;const c=((u=window.matchMedia)==null?void 0:u.call(window,"(prefers-reduced-motion: reduce)").matches)?"auto":"smooth";if(s.startsWith("#")&&s.length>1){const h=document.getElementById(s.slice(1));h&&(n.preventDefault(),h.scrollIntoView({behavior:c,block:"start"}),history.replaceState(null,"",s));return}try{const h=new URL(o.href,window.location.origin);if(h.origin!==window.location.origin||!h.hash)return;
4925if(h.pathname===t.pathname){const m=document.getElementById(h.hash.slice(1));m&&(n.preventDefault(),m.scrollIntoView({behavior:c,block:"start"}),history.replaceState(null,"",h.pathname+h.search+h.hash))}else n.preventDefault(),e(h.pathname+h.search+h.hash)}catch{}};return document.addEventListener("click",a),()=>document.removeEventListener("click",a)},[e,t.pathname]),null},F6=({children:e})=>{const{pathname:t}=Wa(),[a,n]=f.useState(e),[r,o]=f.useState(t),s=f.useRef(!0);return f.useEffect(()=>{if(s.current){s.current=!1;return}n(e),o(t)},[t,e]),i.jsx("div",{className:"page-transition",children:a},r)},H6=f.lazy(()=>bt(()=>import("./Auth-S39Wvmxt.js"),[])),B6=f.lazy(()=>bt(()=>import("./RoleSelection-BFrElB4_.js"),__vite__mapDeps([0,1]))),V6=f.lazy(()=>bt(()=>import("./DashboardHome-BScCVZE3.js"),__vite__mapDeps([2,3]))),W6=f.lazy(()=>bt(()=>import("./ProjectsPage-CEuR4k_f.js"),__vite__mapDeps([4,3,5]))),$6=f.lazy(()=>bt(()=>import("./ProjectDetailPage-DBWulV7C.js"),__vite__mapDeps([6,3,5,7,8]))),K6=f.lazy(()=>bt(()=>import("./ModelsPage-jXOZGfQd.js"),__vite__mapDeps([9,3]))),Y6=f.lazy(()=>bt(()=>import("./SettingsPage-Y3UOE0e9.js"),__vite__mapDeps([10,3]))),J6=f.lazy(()=>bt(()=>import("./ModelProfilePage-BQoWPr-q.js"),__vite__mapDeps([11,3,7]))),Q6=f.lazy(()=>bt(()=>import("./ModelApprovalsPage-BuI1vomt.js"),__vite__mapDeps([12,3]))),Z6=f.lazy(()=>bt(()=>import("./LogoPage-CpT5c6mi.js"),__vite__mapDeps([13,14]))),X6=f.lazy(()=>bt(()=>import("./CompanyProfile-BX4YBamA.js"),[])),eF=f.lazy(()=>bt(()=>import("./CompanyProfileDeck-u5Oa29LK.js"),__vite__mapDeps([15,8,1,14,7]))),tF=f.lazy(()=>bt(()=>import("./DevEmailPreview-CLz8uZ1v.js"),[])),aF=new vD,nF=ss(typeof window<"u"?window.location.pathname:"/"),rF=()=>(f.useEffect(()=>L_(),[]),i.jsx(wD,{client:aF,children:i.jsx(v_,{basename:SS(nF),children:i.jsx(__,{children:i.jsx(w3,{children:i.jsxs(XC,{children:[i.jsx(EE,{}),i.jsx(cz,{}),i.jsx(L6,{}),i.jsx(O6,{}),i.jsx(G6,{}),i.jsx(F6,{children:i.jsx(f.Suspense,{fallback:null,children:i.jsxs(d_,{children:[i.jsx(oe,{path:"/",element:i.jsx(RL,{})}),i.jsx(oe,{path:"/product",element:i.jsx(ML,{})}),i.jsx(oe,{path:"/product/amazon-import",element:i.jsx(T6,{})}),i.jsx(oe,{path:"/integrations",element:i.jsx(A6,{})}),i.jsx(oe,{path:"/integrations/claude",element:i.jsx(P6,{})}),i.jsx(oe,{path:"/sdks",element:i.jsx(I6,{})}),i.jsx(oe,{path:"/sdks/javascript",element:i.jsx(E6,{})}),i.jsx(oe,{path:"/sdks/python",element:i.jsx(D6,{})}),i.jsx(oe,{path:"/sdks/php",element:i.jsx(U6,{})}),i.jsx(oe,{path:"/pricing",element:i.jsx(iO,{})}),i.jsx(oe,{path:"/pre-sales",element:i.jsx(pO,{})}),i.jsx(oe,{path:"/about",element:i.jsx(mO,{})}),i.jsx(oe,{path:"/solutions",element:i.jsx(fO,{})}),i.jsx(oe,{path:"/solutions/ecommerce",element:i.jsx(gO,{})}),i.jsx(oe,{path:"/solutions/ai-product-photography",element:i.jsx(bO,{})}),i.jsx(oe,{path:"/solutions/agencies",element:i.jsx(wO,{})}),i.jsx(oe,{path:"/blog",element:i.jsx(PO,{})}),i.jsx(oe,{path:"/blog/topic/:slug",element:i.jsx(NO,{})}),i.jsx(oe,{path:"/blog/:slug",element:i.jsx(jO,{})}),i.jsx(oe,{path:"/glossary",element:i.jsx(EO,{})}),i.jsx(oe,{path:"/glossary/:slug",element:i.jsx(zO,{})}),i.jsx(oe,{path:"/compare",element:i.jsx(DO,{})}),i.jsx(oe,{path:"/compare/:slug",element:i.jsx(qO,{})}),i.jsx(oe,{path:"/for-brands",element:i.jsx(UO,{})}),i.jsx(oe,{path:"/for-agencies",element:i.jsx(MO,{})}),i.jsx(oe,{path:"/for-agencies/talent",element:i.jsx(LO,{})}),i.jsx(oe,{path:"/for-agencies/merchant",element:i.jsx($G,{})}),i.jsx(oe,{path:"/for-creators",element:i.jsx(KG,{})}),i.jsx(oe,{path:"/talent",element:i.jsx(YG,{})}),i.jsx(oe,{path:"/docs",element:i.jsx(JG,{})}),i.jsx(oe,{path:"/docs/sdk",element:i.jsx(Xr,{to:"/sdks",replace:!0})}),i.jsx(oe,{path:"/docs/authentication",element:i.jsx(Xr,{to:"/docs",replace:!0})}),i.jsx(oe,{path:"/docs/endpoints",element:i.jsx(Xr,{to:"/docs",replace:!0})}),i.jsx(oe,{path:"/docs/webhooks",element:i.jsx(Xr,{to:"/docs",replace:!0})}),i.jsx(oe,{path:"/faq",element:i.jsx(QG,{})}),i.jsx(oe,{path:"/legal/terms",element:i.jsx(k6,{})}),i.jsx(oe,{path:"/legal/privacy",element:i.jsx(C6,{})}),i.jsx(oe,{path:"/legal/cookies",element:i.jsx(S6,{})}),i.jsx(oe,{path:"/legal/aup",element:i.jsx(sx,{})}),i.jsx(oe,{path:"/legal/acceptable-use",element:i.jsx(sx,{})}),i.jsx(oe,{path:"/auth",element:i.jsx(H6,{})}),i.jsx(oe,{path:"/onboarding/role",element:i.jsx(B6,{})}),i.jsx(oe,{path:"/dashboard",element:i.jsx(Hr,{children:i.jsx(V6,{})})}),i.jsx(oe,{path:"/dashboard/projects",element:i.jsx(Hr,{children:i.jsx(W6,{})})}),i.jsx(oe,{path:"/dashboard/projects/:projectId",element:i.jsx(Hr,{children:i.jsx($6,{})})}),i.jsx(oe,{path:"/dashboard/models",element:i.jsx(Hr,{children:i.jsx(K6,{})})}),i.jsx(oe,{path:"/dashboard/settings",element:i.jsx(Hr,{children:i.jsx(Y6,{})})}),i.jsx(oe,{path:"/dashboard/model-profile",element:i.jsx(Hr,{children:i.jsx(J6,{})})}),i.jsx(oe,{path:"/dashboard/model-approvals",element:i.jsx(Hr,{children:i.jsx(Q6,{})})}),i.jsx(oe,{path:"/logo",element:i.jsx(Z6,{})}),i.jsx(oe,{path:"/company-profile",element:i.jsx(X6,{})}),i.jsx(oe,{path:"/company-profile/:lang",element:i.jsx(eF,{})}),i.jsx(oe,{path:"/dev/email-preview",element:i.jsx(tF,{})}),i.jsx(oe,{path:"*",element:i.jsx(ah,{})})]})})})]})})})})})),oF={translation:{showcase:{bandTitle:"From one product photo to a scene that sells",bandSubtitle:"Same product, no studio, no set. Every scene below is generated
4925with AI from the original photo.",before:"Product photo",after:"Generated scene",afterAlt:"AI-generated scene",aiGenerated:"AI-generated",disclaimer:"Image generated with AI by HeroShots from the original product photo."},nav:{product:"Products",solutions:"Solutions",pricing:"Pricing",docs:"Docs",models:"Models",login:"Log in",tryNow:"Try Now",forBrands:"For Brands",forBrandsDesc:"AI-powered product visuals at scale",forAgencies:"For Agencies",forAgenciesDesc:"Talent & merchant agency solutions",talentAgencies:"Talent Agencies",talentAgenciesDesc:"Represent models, earn commissions on royalties",merchantAgencies:"Merchant Agencies",merchantAgenciesDesc:"Manage content for brands, earn on generations",forCreators:"For Creators",forCreatorsDesc:"Monetize your digital twin",ecommerce:"E-commerce",ecommerceDesc:"Boost your online store conversions",useCases:"Use Cases",whoItsFor:"Who It's For",presales:"Pre-Sales"},common:{loading:"Loading...",noCreditCard:"No credit card required",getStarted:"Get Started",learnMore:"Learn More",startFree:"Start Free",tryItNow:"Try it now",bookDemo:"Book a demo",email:"Email",password:"Password",optional:"(optional)"},promo:{text:"Limited-Time Early Access: Join the waitlist and get exclusive credits at launch. Ends soon."},home:{heroTitle:"Real creators.",heroHighlight:"AI-powered content.",heroSubtitle:"Creators license their likeness as AI avatars. Brands generate authentic UGC at scale â no photoshoot needed.",heroCardBrandTitle:"For Brands",heroCardBrandDesc:"Upload your products, choose a person (external photo, AI avatar, or real model), and generate scroll-stopping UGC in seconds.",heroCardAgencyTitle:"For Agencies",heroCardAgencyDesc:"Talent agencies: manage model rosters and earn commissions on royalties. Merchant agencies: handle content production for brands and earn on every generation.",heroCardModelTitle:"For Models",heroCardModelDesc:"Build your AI avatar with your photos. Brands use your digital twin to generate content â you earn royalties automatically, 24/7.",rated:"Early Access â Join 500+ on the waitlist",whyTitle:"Why HeroShots?",whySubtitle:"The complete platform for creating, publishing, and rewarding AI-generated UGC",vp1Title:"Realism that converts",vp1Desc:"Real people and real products for trustworthy content.",vp2Title:"Frictionless publishing",vp2Desc:"APIs, SDKs, and export-ready assets for your eCommerce (Shopify sync coming soon).",vp3Title:"Model royalties",vp3Desc:"Real models earn royalties when brands use their AI avatar.",howTitle:"How it works",howSubtitle:"Three simple steps to create authentic AI-generated UGC",step1Title:"Upload/Select",step1Desc:"Upload external photos (you assume rights responsibility), pick from our AI avatar library, or select a real model. Upload your product images (Shopify sync coming soon), then write a prompt.",step2Title:"Generate",step2Desc:"Photos or short videos in seconds.",step3Title:"Publish & Reward",step3Desc:"Publish directly to your eCommerce or export the photos for your campaigns.",startCreating:"Start Creating Now",controlTitle:"Take Full Control of the Outcome",controlSubtitle:"HeroShots gives you complete control over Create Engine, Publish Layer, and Reward Layer. No actors, no editing, no delays.",personTitle:"Creator AI Avatar",personDesc:"Three options: (A) Upload external photos or avatars â your brand assumes rights responsibility via a consent flag. (B) Choose from our library of ready-to-use AI avatars. (C) Select a real model from the marketplace â they earn royalties every time you generate content with their likeness.",productTitle:"Product (upload)",productDesc:"Upload your product images (Shopify sync coming soon). Lighting match, hands refinement, brand-safe filters included.",promptTitle:"Prompt (photo/video)",promptDesc:"Describe your creative vision. Batch generation, quality controls, and aspect ratio options available.",publishRewardTitle:"Export & Reward",publishRewardDesc:"Export ready-to-use photos and videos for your eCommerce, product pages, brand s
4925ocial channels, and ad campaigns. Model royalties are calculated automatically (payout via Tik Joy coming soon).",aboutTitle:"Turn Products into AI UGC in Seconds",aboutDesc:"Connect your product. Choose a person. Hit generate. Your product becomes scroll-stopping UGC content - ready to publish and reward. No actors. No editing. No waiting.",stat1Label:"Variants per generation",stat2Label:"First batch of 4 variants",stat3Label:"Languages supported",rolesTitle:"Built for every role",rolesSubtitle:"Whether you're a brand, talent agency, merchant agency, or model â HeroShots adapts to how you work.",useCasesTitle:"Who's It For? Everyone Who Sells Online.",useCasesSubtitle:"From solopreneurs to enterprise brands â if you're running ads, building community, or selling online, HeroShots saves time and boosts ROI.",ecommTitle:"eCommerce Brands",ecommDesc:"Generate massive volumes for A/B tests, localizations, and seasonal campaigns. Use on product detail pages (PDP) and product listing pages (PLP).",dropTitle:"Dropshippers",dropDesc:"Skip Upwork delays. Connect your product and create viral-style UGC in seconds. Launch same day with batch generation.",dtcTitle:"DTC Brands",dtcDesc:"Test dozens of creatives fast. Launch UGC tailored to your niche and metrics. Multi-market campaigns with localization support.",agenciesTitle:"Agencies",agenciesDesc:"Talent agencies earn commissions on model royalties. Merchant agencies manage content production for brands and earn on every generation. One platform, two revenue models.",creatorsTitle:"Models",creatorsDesc:"Build your AI avatar with your photos, videos, voice, and measurements. Brands use your digital twin to generate content for their eCommerce and ads â you earn royalties automatically, 24/7.",marketTitle:"Marketplaces",marketDesc:"Enrich seller content at scale. Provide UGC tools to your merchants and improve conversion rates across the board.",resellerBadge:"Reseller program",resellerTitle:"Reseller program for agencies",resellerDesc:"Wholesale rates and revenue share for agencies that resell HeroShots-generated content to their own end clients.",resellerBullets:["Reseller pricing approx. 30â40% below direct list","Agency dashboard for managing multiple brand workspaces","White-label-friendly delivery formats","Reseller agreement required"],resellerCta:"Apply for the reseller program",resellerNote:"Wholesale numbers are shared after a signed reseller agreement.",ctaTitle:"Ready to transform your content?",ctaSubtitle:"Join the waitlist and be among the first to create AI UGC at scale.",ctaButton:"Get Early Access",earlyUsers:"Early users on the waitlist",avgConversion:"Free images every month",genTime:"From prompt to finished content",howBrandStep1Title:"Upload & Choose",howBrandStep1Desc:"Upload your product images by file (Shopify sync coming soon). Choose a person: external photo, AI avatar, or real model.",howBrandStep2Title:"Generate",howBrandStep2Desc:"Describe the scene with a prompt. Get photos or short videos in seconds.",howBrandStep3Title:"Publish & Export",howBrandStep3Desc:"Publish directly to your eCommerce or export photos for your campaigns.",howAgencyStep1Title:"Onboard Talent or Clients",howAgencyStep1Desc:"Talent agencies: onboard models and build their AI avatars. Merchant agencies: set up brand workspaces and import products per client.",howAgencyStep2Title:"Generate & Manage",howAgencyStep2Desc:"Merchant agencies launch batch content generation across brands. Talent agencies manage model approvals and marketplace presence.",howAgencyStep3Title:"Earn & Report",howAgencyStep3Desc:"Talent agencies earn commissions on model royalties. Merchant agencies earn a percentage on each generation. Both get full analytics and reporting.",howModelStep1Title:"Upload Your Portfolio",howModelStep1Desc:"Upload your photos, videos, voice samples, and body measurements to build your profile.",howModelStep2Title:"Create Your AI Avatar",howModelStep2Desc:"Your digital twin is generated from your assets. Brands select you to generate content for their eCommerce and ads.",howModelStep3Title:"Earn Royalties",howModelStep3Desc:"Every time a brand generates content with your likeness, you earn royalties automatically â 24/7. You never need to publish anything.",controlAgencyFeat1Title:"Talent: Roster & Commissions",controlAgencyFeat1Desc:"Manage your model roster, handle AI avatar creation, and earn automatic commissions on every royalty generated by your talent.",controlAgencyFeat2Title:"Merchant: Multi-Brand Workspace",controlAgencyFeat2Desc:"Separate projects, teams, and billing per brand client. Batch generation and API-first integrations for your existing workflows.",controlAgencyFeat3Title:"Consent, Rights & White-Label",controlAgencyFeat3Desc:"Talent agencies manage model consent and licensing. Merchant agencies deliver white-label outputs with custom SLAs and priority support.",controlAgencyFeat4Title:"Analytics & Dual Revenue",controlAgencyFeat4Desc:"Track model performance and royalty commissions (talent) or generation volume and billing per client (merchant). Full reporting across both models.",controlModelFeat1Title:"Portfolio & Photos",controlModelFeat1Desc:"Upload high-quality photos, videos, voice samples, and body measurements to build your complete AI profile.",controlModelFeat2Title:"AI Avatar Creation",controlModelFeat2Desc:"Your digital twin is generated from your assets. Brands use it to create content for their channels â you never need to post anything.",controlModelFeat3Title:"Rights & Consent",controlModelFeat3Desc:"Explicit consent management, time-boxed licenses, GDPR compliance, and the right to revoke at any time.",controlModelFeat4Title:"Royalty Earnings",controlModelFeat4Desc:"Earn automatically every time a brand generates content with your likeness. Track your earnings in real-time.",seoTitle:"HeroShots â Real Creators, AI-Powered Content",seoDesc:"Creators license their likeness as AI avatars. Brands generate authentic UGC at scale â no photoshoot needed. Photo & video in under 60 seconds."},auth:{platformTitle:"The platform for",ugcContent:"UGC content",atScale:"at scale",platformDesc:"Whether you're a creator or a brand, HeroShots lets you produce authentic, high-performance content with AI.",forCreators:"For Creators",forCreatorsDesc:"Upload your portfolio, manage image rights, and earn from content generated using your digital likeness.",forBrands:"For Brands & Merchant Agencies",forBrandsDesc:"Produce UGC content at scale: upload your products, choose creators, and generate professional photos and videos in minutes. Merchant agencies manage content for multiple brand clients.",aiPowered:"AI-powered",aiPoweredDesc:"An external AI engine generates realistic content from your products and selected creator profiles.",compliance:"Compliance & rights",complianceDesc:"Tracked consents, managed licenses, and full GDPR compliance. Every asset is verifiable and legally protected.",accessPlatform:"Access the platform",welcomeBack:"Welcome back!",welcomeNew:"Welcome!",welcomeBackDesc:"Log in to continue where you left off.",welcomeNewDesc:"Create your account to get started.",continueGoogle:"Continue with Google",continueApple:"Continue with Apple",or:"or",login:"Log in",signup:"Sign up",emailPlaceholder:"[email protected]",forgotPassword:"Forgot password?",loggingIn:"Logging in...",signingUp:"Signing up...",invalidEmail:"Invalid email",passwordMin:"Password must be at least 6 characters",invali
4925dCredentials:"Invalid email or password",confirmEmail:"Please confirm your email before logging in",resetTitle:"Reset password",resetDesc:"Enter your email and we'll send you a link to reset your password.",sending:"Sending...",sendResetLink:"Send reset link",backToLogin:"â Back to login",resetSent:"Recovery email sent! Check your inbox.",alreadyRegistered:"This email is already registered. Try logging in.",signupSuccess:"Registration complete! Check your email to confirm your account."},authRoles:{brand:"For Brands",agency:"For Agencies",model:"For Models",brandFeat1Title:"Product-to-UGC in seconds",brandFeat1Desc:"Upload your product images (Shopify sync coming soon), then choose your person: (A) upload external photos â you accept a rights disclaimer, (B) pick a ready-to-use AI avatar from our library, or (C) select a real model who earns royalties. Generate scroll-stopping UGC instantly.",brandFeat2Title:"A/B test at scale",brandFeat2Desc:"Generate dozens of creative variations for split testing across markets. Optimize campaigns with data-driven content decisions.",brandFeat3Title:"Publish & reward automatically",brandFeat3Desc:"Export content ready to publish on your eCommerce pages and social channels, and activate your creator community with royalty rewards (automated payouts via Tik Joy coming soon).",brandFeat4Title:"Managed account: we generate for you",brandFeat4Desc:"Prefer hands-off? Request a managed account and our in-house team handles the entire generation workflow for you â briefs, prompts, A/B variants and delivery â while you keep full ownership of the assets.",agencyFeat1Title:"Talent Agency: model commissions",agencyFeat1Desc:"Represent models and earn automatic commissions every time a brand uses their AI avatar. Manage rosters, onboarding, and consent from one dashboard.",agencyFeat2Title:"Merchant Agency: multi-brand content",agencyFeat2Desc:"Manage content production for brand clients. Multi-brand workspaces, batch generation, and per-client billing. Earn a percentage on every generation.",agencyFeat3Title:"White-label & enterprise-ready",agencyFeat3Desc:"White-label delivery, custom SLAs, dedicated account management, and priority API access. Built for both talent and merchant agency models.",modelFeat1Title:"Monetize your likeness",modelFeat1Desc:"Upload your photos, videos, voice, and body measurements to create an AI avatar that constantly generates content for you. Earn royalties every time brands use your digital likeness.",modelFeat2Title:"AI-powered reach",modelFeat2Desc:"Your image works for you 24/7 across multiple brands and campaigns. Scale your earnings without extra shoots or commitments.",modelFeat3Title:"Full rights control",modelFeat3Desc:"Explicit consent management, time-boxed licenses, GDPR compliance, and the right to revoke at any time. You stay in control.",apiTitle:"Robust & secure API integration",apiDesc:"Integrate HeroShots into your existing stack with our production-ready REST API. OAuth 2.0 authentication, real-time webhooks, rate limiting, and sandbox environments for safe testing.",apiOauth:"OAuth 2.0",apiWebhooks:"Real-time Webhooks",apiRateLimit:"Rate Limiting",apiRest:"REST API"},signupForm:{model:"Model",brand:"Brand",agency:"Agency",modelDesc:"Creator/model profile",brandDesc:"Single company",agencyDesc:"Manage multiple brands",fullName:"Full name",namePlaceholder:"John Doe",passwordPlaceholder:"At least 6 characters",companyName:"Company Name",companyPlaceholder:"Your company",vatNumber:"VAT Number",vatPlaceholder:"IT01234567890",companyRequired:"Company name is required",vatRequired:"VAT number is required",register:"Sign up",registering:"Signing up..."},role:{welcome:"Welcome to HeroShots!",tellUs:"Tell us who you are to personalize your experience",companyName:"Company Name",vatNumber:"VAT Number",continue:"Continue",configuring:"Configuring...",configured:"Profile configured!",configError:"Error during configuration"},dashboard:{title:"Dashboard",overview:"Platform overview",projects:"Projects",products:"Products",models:"Models",generations:"Generations",assetLibrary:"Asset Library",signOut:"Sign out",getStarted:"Get Started",step1:"Create a <strong>Project</strong> to organize your campaign",step2:"Upload your <strong>Products</strong> with images and attributes",step3:"Select a <strong>
4925Model/Creator</strong> from the library",step4:"Start a <strong>Generation</strong> to create UGC content",step5:"Download assets from the <strong>Library</strong>",manageProjects:"Manage your campaigns and collections",newProject:"New Project",name:"Name",description:"Description",createProject:"Create Project",projectCreated:"Project created!",noProjects:"No projects yet. Create your first!",noDescription:"No description",manageProducts:"Upload and manage your products",selectProject:"Select a project to manage products",modelsCreators:"Models / Creators",exploreModels:"Explore and manage available models",noModels:"No models available. Creators can register and upload their profile.",generationsDesc:"Generations will be processed by your external API",noGenerations:"No generations yet. Select a product and a model to start.",allAssets:"All your generated content",noAssets:"No assets generated. Assets will appear here after generations.",settings:"Settings"},settings:{title:"Settings",subtitle:"Manage your account, billing, and API access",profile:"Profile",billing:"Billing",api:"API",profileInfo:"Profile Information",profileInfoDesc:"Update your personal and company details",role:"Role",companyInfo:"Company Information",companyAddress:"Company Address",saveChanges:"Save Changes",saving:"Saving...",saved:"Profile updated successfully!",saveError:"Error saving profile",billingTitle:"Wallet & Subscription",billingDesc:"Manage your wallet balance and subscription",currentPlan:"Subscription",freePlanDesc:"No active subscription â pay-per-use only",credits:"Wallet Balance",creditsDesc:"Your wallet balance for generations",creditsUnit:"credits",upgradePlan:"Subscribe (â¬99/mo)",buyCredits:"Top Up Wallet",activeSubscription:"Your subscription is active â discounts applied",expired:"Expired",expiresAt:"Expires",watermarkInfo:"Watermark Information",watermarkDcma:"DCMA watermark: protects model rights. Removed only after model approval.",watermarkHeroshots:"HeroShots watermark: applied to content without an active subscription. Upgrade to remove.",transactionHistory:"Transaction History",transactionHistoryDesc:"Recent credits activity",noTransactions:"No transactions yet.",balance:"Balance",apiKeys:"API Keys",apiKeysDesc:"Manage your API keys for programmatic access",apiComingSoon:"API keys management will be available soon. Contact us for early access."},modelProfile:{title:"My Profile",subtitle:"Manage your portfolio, identity, and payment details",portfolio:"Portfolio",identity:"Identity",details:"Details",payments:"Payments",photos:"Photos",photosDesc:"Upload high-quality photos for your AI avatar",videos:"Videos",videosDesc:"Upload videos to enhance your digital twin",voiceSamples:"Voice Samples",voiceDesc:"Upload audio samples for voice cloning",uploadPhotos:"Upload Photos",uploadVideos:"Upload Videos",uploadVoice:"Upload Voice Samples",uploading:"Uploading...",uploadError:"Error uploading file",filesUploaded:"Files uploaded successfully!",idVerification:"Identity Verification",idVerificationDesc:"Upload your ID to verify your identity. This ensures you are the person in the photos.",verificationStatus:"Verification Status",idPending:"Pending review",idVerified:"Identity verified",idRejected:"Verification rejected â please upload a new document",uploadedDocument:"Document on file",documentOnFile:"Your ID document has been uploaded and is being reviewed.",idInstructions:"Upload a clear photo of your passport or national ID card. Both sides if applicable.",uploadId:"Upload ID Document",idUploaded:"ID document uploaded successfully!",profileDetails:"Profile Details",profileDetailsDesc:"Update your public profile information",displayName:"Display Name",languages:"Languages",bio:"Bio",styleTags:"Style Tags",bodyMeasurements:"Body Measurements",height:"Height",chest:"Chest",waist:"Waist",hips:"Hips",royaltyPayments:"Royalty Payments",royaltyDesc:"Configure your payment details for royalty payouts",iban:"IBAN",ibanDesc:"Your IBAN for future royalty payouts (Tik Joy, coming soon)",noModelProfile:"No model profile found. This section is for registered models only."},modelApprovals:{title:"Content Approvals",subtitle:"Review and approve content generated using your likeness",pending:"Pending",history:"History",noPending:"No pending approvals. You're all caught up!",noHistory:"No approval history yet.",statusApproved:"Approved",statusRejected:"Rejected",statusPending:"Pending",blanket:"All content",single:"Single content",royaltyOffer:"Royalty offer",approve:"Approve",reject:"Reject",approved:"Content approved!",rejected:"Content rejected.",error:"Error updating approval"},products:{newProduct:"New Product",images:"Images",uploadImages:"Upload Images",createProduct:"Create Product",created:"Product created!",noProducts:"No products yet. Add your first!",createProjectFirst:"Create a project first to manage products.",productsImported:"products imported"},projectDetail:{manageProducts:"Manage products for this project",addProducts:"Add Products",addProductsDesc:"Choose how to import your products",singleProduct:"Single Product",singleProductDesc:"Add one product manually",folderImport:"Import from Folder",folderImportDesc:"One product per subfolder",folderImportInfo:"Select a folder containing subfolders. Each subfolder becomes a product with its images.",selectFolder:"Select Folder",catalogImport:"CSV / Catalog",catalogImportDesc:"Import products from a CSV file",csvInfo:"Upload a CSV file with at least a 'name' column. The 'sku' column is optional.",csvNoData:"The CSV file contains
4925no data",csvNoNameColumn:"'name' column not found in CSV",selectCsv:"Select CSV File",shopifyImport:"Shopify",comingSoon:"Coming soon"},models:{verified:"Verified"},modelsAvatars:{navTitle:"Models & AI Avatar",title:"Models & AI Avatar",subtitle:"Choose a real model, pick an AI avatar from the library, or create your own custom avatar",realModels:"Real Models",aiAvatars:"AI Avatars",createAvatar:"Create Avatar",realModelsDesc:"Real models earn royalties every time a brand generates content with their likeness. Prices shown are per generation.",royalties:"Royalty per generation",selectModel:"Select Model",avatarFreeInfo:"No selection cost for AI Avatars",avatarFreeInfoDesc:"Selecting an AI avatar is free. You only pay for the content generation cost.",freeToSelect:"Free to select",selectAvatar:"Select Avatar",createAvatarTitle:"Create your custom AI Avatar",createAvatarDesc:"Use our configurator to create a unique AI avatar. Choose features, style, and personality. The configurator will connect via API to the external AI engine.",step1Title:"Choose features",step1Desc:"Select gender, age, ethnicity, and physical traits",step2Title:"Customize style",step2Desc:"Choose clothing, poses, and atmosphere",step3Title:"Generate your avatar",step3Desc:"AI creates your custom avatar",startConfigurator:"Start Configurator",configuratorComingSoon:"The avatar configurator will be available soon. It will connect via API to the external AI engine."},genFlow:{step1Person:"1. Choose the person",source_model:"Real Model",source_avatar:"AI Avatar",source_external:"External Photo",selectAvatar:"Select an AI avatar",step2Products:"2. Assign to products",assignAll:"All products",assignSpecific:"Specific products",step3Details:"3. Type & prompt",selectAtLeastOneProduct:"Select at least one product",generationsCreated:"generations created",errorCreating:"Error creating generations"},wizard:{step1:"Products",step2:"Select Subject",step3:"Assign & Generate",step4:"Results",back:"Back",next:"Next",personAdded:"Person added to selection",addAsPerson:"Add",quickAssign:"Quick assign: apply to all products",allProducts:"all products",globalPrompt:"Global prompt (optional)",original:"Original product",generated:"Generated",waiting:"Waiting...",generating:"Generating...",error:"Generation error",regenerate:"Regenerate",editPrompt:"Edit prompt",customPromptLabel:"Enter a custom prompt for this image:"},generations:{watermarkLegend:"Watermark Legend",dcmaExplain:"Model rights protection. Removed when the model approves your content.",heroshotsExplain:"Applied without active subscription. Upgrade your plan to remove.",noWatermark:"Clean",newGeneration:"New Generation",selectProject:"Select a project",selectProduct:"Select a product",selectModel:"Select a model",modelSource:"Person Source",sourceCatalog:"Real Model (catalog)",sourceExternal:"External Photo (your responsibility)",sourceAvatar:"AI Avatar",externalDisclaimer:"By uploading external photos, you assume full legal responsibility for image rights and consent.",consentLabel:"I confirm I have the rights to use these images",consentRequired:"You must accept the rights disclaimer",uploadExternalPhotos:"Upload Photos",type:"Type",typePhoto:"Photo",typeVideo:"Video",prompt:"Prompt",promptPlaceholder:"Describe the scene, mood, setting...",generate:"Generate",created:"Generation created!"},pricing:{seoTitle:"Pricing â Pay per Use or Packages",seoDesc:"Transparent pricing for AI UGC: pay per generation, pre-buy volume packages, or let us handle full production. Built-in usage rights.",hero:{title:"Pricing that scales with",highlight:"how you use it.",subtitle:"Understand it in 30 seconds. Pay per generation, or add HeroShots Pro for â¬99/month. No tiers, no included credits, no comparison tables â just two ways to use it.",jumpHow:"How it works",jumpPayg:"Pay per use",jumpPackages:"Packages",jumpManaged:"Managed"},explainer:{eyebrow:"How pricing works",title:"Three steps.",titleAccent:"No surprises.",lead:"Every quote is built from three choices. Scroll through the steps â the receipt on the left tells you exactly what changes and why.",tryThis:"try this",receipt:{eyebrow:"Live quote",whatLabel:"What you generate",whoLabel:"Who appears",planLabel:"Plan",feeSub:"+25% platform fee on base",noFeeSub:"no platform fee",included:"included",proSub:"â15% on every video",noDiscountSub:"no discount",imgProSub:"the â¬4.90 first batch stays the same â Pro drops image edits from â¬0.39 to â¬0.23",total:"Total per asset"},base:{img:{label:"First batch · 4 variants",sub:"one project"},v15:{label:"Video · 15s",sub:"most popular"}
4925,v30:{label:"Video · 30s",sub:"long-form"}},creator:{noFee:"no fee",ai:{label:"AI avatar",sub:"from our library or your prompt"},catalog:{label:"Catalog model",sub:"real person from HeroShots"},own:{label:"Your own model",sub:"you bring the talent"}},plan:{noDiscount:"no discount",ppu:{label:"Pay per use",sub:"no monthly fee, full price per generation"},pro:{label:"+ HeroShots Pro",sub:"â¬99/mo · â15% videos, no watermark, priority"}},steps:{0:{title:"Pick what you create.",desc:"The base price covers the AI generation â model, scene, render, delivery. It's the only line on the receipt at step one."},1:{title:"Pick who appears.",desc:"AI avatars cost nothing extra. Real catalog models add a 25% platform fee on top of the base â HeroShots' commission for sourcing, licensing and admin. The model's compensation is covered by the base.",callout:"How the split works. The 25% platform fee has a â¬5 minimum on videos. If a model's rate for a 15s video is â¬10, 25% would be â¬2.50 â but the â¬5 floor applies, so your invoice is â¬15. â¬10 to the model, â¬5 to HeroShots."},2:{title:"Add Pro? (optional)",desc:"Pay-per-use is always available. If you generate every week, HeroShots Pro at â¬99/month gives you â15% on every video, image edits at â¬0.23 instead of â¬0.39, watermark-free downloads and priority queue. Cancel anytime. The â¬4.90 first batch and the â¬1.90 new batches don't change.",callout:"Break-even. Pro pays for itself when monthly video savings beat â¬99 â roughly 19 videos at 30s, or ~13 videos at 60s. Below that, stay pay-per-use."}},foot:{0:"Base price = the technology cost. Always shown first.","1catalog":"The model is paid out of the base. The +25% is HeroShots' commission.","1ai":"AI creators add no fee. Bring-your-own adds â¬300 setup, not per-generation.","2pro":"Pro pays for itself around 19 videos at 30s per month.","2ppu":"Stay pay-per-use as long as you generate occasionally. Activate Pro any month."}},model:{title:"How HeroShots is priced",intro:"Three variables you mix as needed. If you don't want to think about it, pick a package â we'll bundle standard rights.",whatTitle:"What you generate",whatDesc:"Images or videos, each with a base price.",whoTitle:"Who appears in it",whoDesc:"AI avatar, real catalog model, or your own model. Each carries a different creator fee.",whereTitle:"Where it's used",whereDesc:"Organic and owned media are included. Paid digital and broadcast usage add a licensing fee.",footnote:"Want full control? Build your quote variable by variable. Want speed? Pick a package and ship today."},creators:{title:"Choose your creator type",subtitle:"Four ways to populate your videos and images.",setup:"Setup cost",perGen:"Per-generation fee",bestFor:"Best for",aiLibrary:{title:"AI Avatar â library",desc:"Choose from our growing catalog of synthetic avatars. Diverse, multi-lingual, ready in seconds.",setup:"None",setupTooltip:"No setup needed â pick an avatar and generate.",perGen:"Included",bestFor:"rapid testing, performance ads, multi-variant campaigns"},aiCustom:{title:"AI Avatar â custom",desc:"Describe the avatar you want (age, look, vibe, setting). We generate, you validate, then it's yours to reuse.",setup:"â¬100 one-time",setupTooltip:"Covers generation, vetting and persistence of the custom avatar in your account.",perGen:"Included",bestFor:"brand-aligned avatars that don't exist in the library"},catalog:{title:"Catalog Model",desc:"Real models we've onboarded, photographed and licensed. Authenticity that pure AI can't match.",setup:"None",setupTooltip:"No onboarding fee â pick a model from our roster.",perGen:"+25% (min â¬0.90 img / â¬5 video)",bestFor:"trust-sensitive categories (skincare, supplements, finance)"},own:{title:"Your Own Model",desc:"You supply the model with their release. We onboard them and keep that profile exclusive to your account.",setup:"â¬300 one-time / model",setupTooltip:"Covers capture, integration and exclusivity. You handle the model's signed release.",perGen:"Included (no royalty)",bestFor:"brand ambassadors, founder-led content, exclusive campaigns"}},free:{badge:"Free plan",title:"Start free, no card required",subtitle:"Explore HeroShots with 10 watermarked preview images per month and 1 preview video. Upgrade whenever you're ready to publish.",features:["10 images/month with preview watermark","1 preview video","Access to the AI Avatars catalog","Usage rights for internal testing only"],cta:"Create free account",note:"No credit card required"},payg:{badge:"Pay per use",title:"Pay per use, by the image or by the video",subtitle:"Top up your wallet, generate when you need. Every image generation gives you 4 variants â you pick, you iterate, you pay only for what you keep going on.",imagesTitle:"Images",imagesRows:[{label:"First generation of a project (4 variants)",value:"â¬4.90"},{label:"New batch of 4 variants (same project)",value:"â¬1.90"},{label:"Edit on a chosen image",value:"â¬0.39"},{label:"Creator fee (real model)",value:"+25%, min â¬0.90"}],videosTitle:"Videos",videosRows:[{label:"Video ⤠15s",value:"â¬15"},{label:"Video ⤠30s",value:"â¬35"},{label:"Each extra 15s",value:"+â¬7"},{label:"Included retries",value:"2 per video"},{label:"Extra retries",value:"â¬5 every 15s"},{label:"Creator fee (real model)",value:"+25%, min â¬5"}],reworkTitle:"Edit vs new generation",reworkDesc:"Two clear actions, two prices. An edit modifies a single image you already chose (â¬0.39, or â¬0.23 with Pro). A new generation creates a fresh batch of 4 variants in the same project (â¬1.90). The first batch of a project costs â¬4.90 â every batch after that is â¬1.90.",apiTitle:"API access",apiDesc:"API & SDK access is available on Flex (pay-per-use) and Pro. The Free plan does not include API access â upgrade to Flex or Pro to integrate.",catalogEditTitle:"Edits & revisions of catalog models",catalogEditDesc:"Image edits and video revisions of a catalog model don't carry the 25% platform fee: you only pay the base price of the operation (plus the model's rate where applicable)."},packages:{badge:"Managed volume packages",title:"Pre-pay 30-second video units. Our team produces them.",subtitle:"A package is a pool of 30-second video units that the HeroShots team produces from your brief â not self-service credit in the app. If you'd rather generate the videos yourself, that's Pay per use above. The definitions below set out what one unit is, who produces it and which rights it carries.",featured:"Most popular",savingChip:"â14% per unit vs Starter",choose:"Request this package",talk:"Talk to us",termsTitle:"What you are buying",terms:[{term:"Managed production",def:"You send a brief; the HeroShots team writes, generates, reviews and delivers each video. A package is not app credit and can't be spent as self-service generations."},{term:"One unit = 30 seconds",def:"Every video is at least 30 seconds long and is counted in 30-second units, rounded up to the next unit. The video counts below are the maximum, assuming 30 seconds each; longer videos use more units."}
4925,{term:"Avatar and rights",def:"Each video is performed by an avatar from our AI library or by one you already own, and is licensed for organic and owned media. Paid catalog models, paid media and broadcast sit outside every package."}],starter:{name:"Starter",volume:"Up to 5 videos",pool:"5 à 30s units = 2 min 30s",total:"â¬350",perVideo:"â¬70 per 30s unit + VAT"},growth:{name:"Growth",volume:"Up to 10 videos",pool:"10 à 30s units = 5 min",total:"â¬650",perVideo:"â¬65 per 30s unit + VAT"},scale:{name:"Scale",volume:"Up to 25 videos",pool:"25 à 30s units = 12 min 30s",total:"â¬1,500",perVideo:"â¬60 per 30s unit + VAT"},volume:{name:"Volume",volume:"From 50 videos",pool:"From 50 à 30s units",total:"Custom",perVideo:"Talk to us"},unitExampleLabel:"Worked example",unitExample:"Starter is a pool of 5 à 30s units. Spend it as 5 videos of 30 seconds, as 1 video of 2 min 30s, or as any mix that adds up to 5 units â a 60-second video uses 2, a 90-second video uses 3.",includedTitle:"Included in every package",included:["Production by the HeroShots team: script, avatar selection, generation and QA â from your brief to the final file","Up to 3 reworks per delivered video, whatever its length","Organic and owned media rights: your channels, site, email and sales decks","Delivery in 9:16, 1:1 and 16:9"],notIncludedTitle:"Not included in any package",notIncluded:["Advertising and paid media rights â Meta, TikTok, Google, programmatic and any other paid placement","TV and broadcast rights â TV, CTV, DOOH, cinema","Paid catalog models â the person in a package video is an avatar from our AI library or one you already own; a real catalog model carries a +25% creator fee and is priced outside the package","Custom avatar setup and own-model onboarding"],exclusionsNote:"None of these is granted by buying a package. Each one is available and quoted separately.",footnote:"Production starts from a brief you approve, and units are counted against the finished duration of each video."},plans:{badge:"The three plans",title:"Free, Flex, Pro â pick how you pay",subtitle:"Same product, three ways to pay for it. The rates on your plan are locked at activation: any public price changes don't apply retroactively.",colPlan:"Plan",colPrice:"Subscription",colQuality:"Max download quality",colSummary:"In short",free:{name:"Free",price:"â¬0",quality:"720p (watermark)",summary:"10 test images/month · AI library avatars only · 1 preview video/month"},flex:{name:"Flex",price:"â¬0",quality:"1080p",summary:"Pure pay-per-use · no subscription · charges from your wallet"},pro:{name:"Pro",price:"â¬99 / month",quality:"4K",summary:"â15% on video · image edits â¬0.23 · watermark-free · priority queue"}},rights:{badge:"Usage rights",title:"Organic is included. Paid and broadcast add a fee.",subtitle:"Every generation includes organic and owned media. Paid digital ads or TV/broadcast usage are add-ons because they change the value of the asset.",colUsage:"Usage type",col4w:"4 weeks",col6m:"6 months",col2y:"2 years",colPerp:"Perpetual",rows:[{label:"Organic + owned",sub:"social posts, your website, email, sales decks",values:["Included","Included","Included","Included"]},{label:"Paid digital ads",sub:"Meta, TikTok, Google, X, programmatic",values:["+25%","+60%","+120%","+200%"]},{label:"Broadcast / OOH",sub:"TV, CTV, DOOH, cinema",values:["+75%","+175%","+350%","Custom"]}],example1Title:"Example: Growth package on Meta ads for 6 months",example1:`Base: 10 videos à â¬65 = â¬650 4926Paid digital (6m): 10 videos à â¬65 à 60% = â¬390 4927âââââââââââââââââââââââââââââââââââââââââââââââââââââ 4928Total: â¬1,040 + VAT`,example2Title:"Example: Growth + Meta 6 months + TV 4 weeks",example2:`Base: â¬650 4929Paid digital (6m): â¬650 à 60% â¬390 4930Broadcast (4w): â¬650 à 75% â¬488 4931âââââââââââââââââââââââââââââââââââââââââââââââââââââ 4932Total: â¬1,528 + VAT`,footnote:"Rights are tracked at the asset level. Buy organic-only today, upgrade later â we'll charge only the delta."},managed:{badge:"Bespoke and enterprise",title:"Beyond the packages: bespoke and enterprise production.",subtitle:"Packages cover managed production in fixed sizes. This is for brands and agencies that need custom volumes, custom rights and a dedicated account lead.",bullets:["Dedicated account lead","Creative briefing session","Script writing assistance","Generation + QA on our side","Revisions managed by us","Custom volumes, custom rights packages","Service-level commitments on delivery"],range:"Typical project sizes: â¬1,500 to â¬50,000. Below that, a volume package fits; above that is enterprise.",cta:"Talk to us"},reseller:{title:"Are you an agency? Ask about our reseller program.",desc:"Wholesale rates, multi-brand workspaces and white-label-friendly delivery for agencies reselling HeroShots-generated content.",cta:"Apply for the reseller program"},subscription:{badge:"One subscription, optional",title:"HeroShots Pro â â¬99/month",subtitle:"Pay-per-use is always there. Add Pro only if you generate weekly: image edits drop to â¬0.23, every video is â15%, you skip the queue and downloads come watermark-free.",month:"/ month",pro:{name:"HeroShots Pro",price:"â¬99",includes:"Image edits at â¬0.23 instead of â¬0.39 (â40%) · â15% on every video · Priority generation queue · Watermark-free downloads."}},faq:{title:"Frequently asked questions",items:[{q:"What does the creator fee cover?",a:"When you use a real person from our catalog, we pay them a royalty for the use of their likeness in your asset. The 25% creator fee covers their compensation plus our administrative costs of managing the relationship. AI avatars don't have a creator fee because no real person is involved."},{q:"Can I use my own person as the model?",a:"Yes. We charge a one-time â¬300 onboarding fee to capture and integrate them. You're responsible for getting their signed release. From then on, generations using that model carry no creator fee."},{q:"What happens if I'm not happy with a generation?",a:"Images: each image generation gives you 4 variants â if none works, a new batch of 4 in the same project costs â¬1.90. You can also edit a chosen image for â¬0.39 (â¬0.23 with Pro). Videos: every video includes 2 retries on us; extra retries cost â¬5 every 15 seconds of regenerated video."},{q:"Can I use HeroShots-generated content in TV ads?",a:"Yes, but broadcast rights are an add-on (see Usage rights). You can purchase broadcast rights up front or upgrade an existing asset later."},{q:"Do I own the content?",a:"You own the right to use the content within the scope of the rights you've licensed (duration + media type). HeroShots retains rights to the underlying models and avatars. For Your Own Model, you retain all rights to that person's likeness."},{q:"What if a model in the catalog becomes unavailable?",a:"If a catalog model withdraws consent or becomes unavailable, we'll regenerate your content with a different model at no charge, and we'll cover the licensing transition. Your campaign doesn't stop."},{q:"How do payments work?",a:"Pay per use: top up your wallet via card. Packages: invoice or card. Managed/enterprise: standard B2B invoicing with 30-day terms."},{q:"Can I generate something other than videos?",a:"Yes â still images (product shots, lifestyle, packshots), and image-to-vi
4932deo. Audio voiceovers are in the works."},{q:"Do prices change if HeroShots updates its price list?",a:"No. The rates on your plan are the ones valid at activation or your last plan change: updates to the public price list don't apply retroactively to your account. Quotes in-portal and on your invoice always reflect your active plan."},{q:"What if a generation fails because of a platform issue?",a:"Whatever was charged (wallet, Free credits, preview video slot or package credit) is refunded automatically to your account â no ticket needed."}]},finalCta:{title:"Ready to test it on a",highlight:"real product?",subtitle:"Start for free: generate your first video without paying a cent. No credit card required.",primary:"Start for free",secondary:"Talk to an account lead"},footnote:"All prices in EUR and exclusive of VAT. Prices may differ for agency/reseller partners under signed agreements. HeroShots is a product of Fancy Capital SRL."},productPage:{heroTitle:"Your AI content",heroHighlight:"factory.",heroDesc:"From creator AI avatars to product shots, multi-channel export, and creator rewards â HeroShots is the all-in-one platform for AI-generated UGC at scale.",createEngine:"Create Engine",publishLayer:"Publish Layer",rewardLayer:"Reward Layer",createDesc:"Generate authentic photo and video UGC powered by real creator AI avatars",inputs:"Inputs",inputsDesc:"Everything you need to generate content",person:"Creator Avatar",personDesc:"Three options: (A) Upload your own external photos or avatars â your brand accepts a rights disclaimer. (B) Pick from our library of ready-to-use AI avatars. (C) Select a real model from the marketplace â they earn royalties on every generation.",product:"Product",productDesc:"Upload product images (Shopify sync coming soon). Automatic lighting match and brand-safe filters",prompt:"Prompt",promptDesc:"Describe the scene, mood, and setting in natural language. Batch generation and quality controls available",outputsTitle:"Outputs & Quality",outputsDesc:"Professional-grade results",photoVideo:"Photo & Video",photoVideoDesc:"High-resolution photos and short-form videos optimized for ads, social, and product pages",batchGen:"Batch Generation",batchGenDesc:"Create dozens of variations simultaneously for A/B testing across markets",qualityControls:"Quality Controls",qualityControlsDesc:"Lighting match, hands refinement, brand-safe filters, and aspect ratio options",publishDesc:"Export ready-to-publish content for all your channels",ecommerce:"eCommerce",ecommDesc:"REST API and export-ready assets for your PDP/PLP product pages (Shopify App coming soon)",brandSocial:"Brand Social",brandSocialDesc:"Export content ready to post on your brand's Instagram, TikTok, and other channels",userSocial:"Community Publishing",userSocialDesc:"Enable users to post on their own social channels with your products. Powered by Tik Joy â visit tik-joy.com",rewardDesc:"Activate and reward your creator community automatically",briefsCampaigns:"Briefs & Campaigns",briefsDesc:"Create sponsored content briefs with custom rewards and requirements",autoPayout:"Automated Payouts",autoPayoutDesc:"Royalties calculated automatically (payout via Tik Joy coming soon)",stats:{stat1Value:"10Ã",stat1Label:"Faster than a traditional shoot",stat2Value:"â80%",stat2Label:"Content production cost",stat3Value:"50+",stat3Label:"Variants generated in batch",stat4Value:"24/7",stat4Label:"Production with no set"},workflow:{eyebrow:"How it works",title:"From brief to post,",highlight:"in 4 steps.",subtitle:"One platform to generate, publish and reward AI UGC content.",step1Title:"1. Input",step1Desc:"Pick an avatar, upload your product and describe the scene.",step2Title:"2. Generate",step2Desc:"The AI engine produces photo & video in batch with quality controls.",step3Title:"3. Publish",step3Desc:"Export ready-to-publish assets for Shopify, Instagram, TikTok and community channels.",step4Title:"4. Reward",step4Desc:"Automatic royalty calculation for models (payout via Tik Joy coming soon)."},features:{eyebrow:"Capabilities",title:"Everything you need to",highlight:"scale your content.",subtitle:"A complete toolkit built for brands, agencies and creators.",f1Title:"AI avatars of real models",f1Desc:"Verified model marketplace with granular consent and automatic royalties.",f2Title:"Product import",f2Desc:"Import products via manual upload, folder or CSV (Shopify sync coming soon).",f3Title:"Batch generation",f3Desc:"Dozens of variants in parallel for A/B testing, markets and seasons.",f4Title:"Brand-safe controls",f4Desc:"Safety filters, lighting match, hand refinement and multiple aspect ratios.",f5Title:"Multi-channel export",f5Desc:"Export ready-to-publish assets for PDP/PLP, Instagram, TikTok and community channels in clicks.",f6Title:"Smart watermarks & retries",f6Desc:"DCMA and Platform watermarks with retry limits to prevent abuse.",f7Title:"i18n & localization",f7Desc:"5 languages (EN, IT, ES, DE, FR) and market-localized prompts.",f8Title:"API & SDK",f8Desc:"Plug HeroShots into your workflows with documented APIs and SDKs."},integrations:{eyebrow:"Integrations",title:"Works where",highlight:"you already are.",subtitle:"Connect your favorite tools and turn on community channels."},useCases:{eyebrow:"For every role",title:"Built for",highlight:"how you work.",subt
4932itle:"Brands, agencies and models â one product, three tailored flows.",brandTitle:"eCommerce Brands",brandDesc:"Generate product UGC at volume, A/B test creatives and localize per market.",brandCta:"For Brands",agencyTitle:"Agencies",agencyDesc:"Talent or Merchant: represent models or manage multiple brands with recurring revenue.",agencyCta:"For Agencies",creatorTitle:"Models",creatorDesc:"Create your AI avatar and earn royalties every time a brand uses it.",creatorCta:"For Models"},finalCta:{eyebrow:"Get started today",title:"Create your first set of",highlight:"AI content.",subtitle:"10 preview images per month, free. No credit card required.",primary:"Create free account",secondary:"See pricing",disclaimer:"No credit card required"},viewApiDocs:"View API Documentation",seoTitle:"AI UGC Generation Features",seoDesc:"From creator AI avatars to product shots, multi-channel publishing, and automated rewards â HeroShots is the all-in-one platform for AI-generated UGC."},solutions:{title:"Solutions for",highlight:"every role",subtitle:"Whether you're selling products, managing clients, or monetizing your likeness â HeroShots adapts to how you work.",ecommTitle:"eCommerce Brands",ecommDesc:"Generate massive volumes of product UGC for A/B testing, localization, and seasonal campaigns. Upload product images (Shopify sync coming soon).",agenciesTitle:"Agencies (Talent & Merchant)",agenciesDesc:"Talent agencies: represent models and earn royalty commissions. Merchant agencies: manage brand content at scale and earn on every generation. Both from one platform.",creatorsTitle:"Models",creatorsDesc:"Build your AI avatar once â earn royalties every time a brand uses your likeness for eCommerce, ads, and catalogs. No publishing required.",talentTitle:"Community Publishing",talentDesc:"Enable users to post branded content on their own social channels. Powered by Tik Joy (coming soon) â a separate platform for community-driven UGC.",ecommBenefits:["Product page optimization","Multi-variant A/B testing","Seasonal content refresh","International market localization"],agenciesBenefits:["Talent: earn commissions on model royalties","Merchant: multi-brand workspaces & billing","White-label delivery & custom SLAs","Dual revenue model from one account"],creatorsBenefits:["Passive royalty income","AI avatar from your own media","Full rights control & GDPR","Brands use your image 24/7"],talentBenefits:["Powered by Tik Joy (tik-joy.com)","Users post on their own TikTok","Automated reward payouts via Tik Joy (coming soon)","Performance tracking & ROI"],seoTitle:"Solutions for E-commerce, Agencies & Creators",seoDesc:"Discover how HeroShots AI UGC platform serves e-commerce brands, creative agencies, and content creators with tailored solutions."},ecommPage:{title:"eCommerce at",highlight:"scale",subtitle:"Generate massive amounts of product content for testing, localization, and campaignsâall through our REST API and export-ready assets (Shopify App coming soon).",abTest:"A/B Testing at Scale",abTestDesc:"Generate multiple product shot variations instantly to test what resonates with your audience.",localization:"Localization",localizationDesc:"Create culturally relevant content for different markets without expensive photo shoots.",seasonal:"Seasonal Campaigns",seasonalDesc:"Quickly refresh your product imagery for holidays, seasons, and special events.",pdpOpt:"Product Page Optimization",pdpOptDesc:"Populate PDP and PLP pages with lifestyle imagery that converts better than plain product shots.",howItWorks:"How It Works",step1Title:"1. Upload Your Products",step1Desc:"Upload your product images and catalog (Shopify App sync coming soon)",step2Title:"2. Select Products & Create Briefs",step2Desc:"Choose which products need new imagery and describe your vision",step3Title:"3. Generate & Publish",step3Desc:"AI creates authentic lifestyle shots, ready to export to your product pages",step4Title:"4. Track Performance",step4Desc:"Monitor which content drives conversions and optimize accordingly",startTrial:"Start Your Free Trial",seoTitle:"AI UGC for E-commerce",seoDesc:"Generate product photos, lifestyle shots, and social content for your e-commerce store using AI creator avatars. A/B test visuals and boost conversions."}
4932,talentPage:{title:"Lend your image.",highlight:"Earn royalties.",subtitle:"Build your AI avatar with your photos, videos, voice, and measurements. Brands use your digital twin to generate content for their eCommerce and ad campaigns â you earn royalties automatically, 24/7. You never publish anything.",createBrief:"Upload Your Portfolio",createBriefDesc:"Upload high-quality photos, videos, voice samples, and body measurements to build your AI profile.",notifyTalent:"AI Avatar Creation",notifyDesc:"Your digital twin is generated from your assets. Brands browse the marketplace and select you for their campaigns.",generateApprove:"Brands Generate Content",generateDesc:"Brands use your AI avatar to create photos and videos for their eCommerce, catalogs, and ad campaigns. You don't need to do anything.",autoRewards:"Automatic Royalties",autoRewardsDesc:"Every time a brand generates content with your likeness, royalties are calculated automatically (payout via Tik Joy coming soon).",forBrands:"Why brands choose real models",forCreators:"Why models join HeroShots",brandBenefits:["Authentic content with real human faces","Higher trust and conversion vs. AI-only avatars","Legally compliant with tracked consents","Flexible licensing with time-boxed rights","Access to a diverse model marketplace"],creatorBenefits:["E
4932arn passive royalties 24/7 without extra shoots","Your image works across multiple brands and campaigns","Full rights control â revoke at any time","GDPR-compliant consent and data management","No publishing or social media work required"],transparencyTitle:"Transparency & Consent",transparencyDesc:"Every model must explicitly consent to image usage. We handle:",transparencyItems:["Clear consent forms with scope and duration","Image rights management with time-boxed licenses","GDPR-compliant data processing","Revocation options and data deletion rights"],launchProgram:"Join as a Model",seoTitle:"Models & Creator Royalties",seoDesc:"Turn yourself into an AI avatar. License your digital likeness to brands and earn royalties every time your avatar generates content."},docs:{title:"Developer",highlight:"Documentation",subtitle:"Everything you need to integrate HeroShots into your applications and workflows.",auth:"Authentication",authDesc:"API keys or email/password login (JWT), rate limits, and environments",endpoints:"API Endpoints",endpointsDesc:"Complete reference for all API endpoints",webhooks:"Webhooks",webhooksDesc:"Real-time event notifications for your app",sdk:"SDK & Examples",sdkDesc:"Code snippets in JavaScript and Python",viewDocs:"View Docs â",quickStart:"Quick Start",quickStartDesc:"Get up and running in minutes",step1:"1. Get Your API Key",step1Desc:"Sign up and generate your API key from the dashboard",step2:"2. Make Your First Request",step2Desc:"Generate content with a simple POST request",step3:"3. Get Results",step3Desc:"Poll the job endpoint or use webhooks for real-time updates",fullApiRef:"Full API Reference",viewSdk:"View SDK Examples",seoTitle:"API Documentation",seoDesc:"Integrate HeroShots AI UGC generation into your workflow. Authentication, endpoints, and official SDK references."},faq:{title:"Frequently Asked",highlight:"Questions",subtitle:"Everything you need to know about HeroShots â from pricing to privacy.",stillQuestions:"Still have questions?",contactSupport:"Contact our support team â",catGeneral:"General",catPricing:"Pricing & Billing",catContent:"Content & Quality",catCreators:"For Creators & Models",catTech:"Technical & Integrations",catPrivacy:"Privacy & Legal",q1:"What is HeroShots?",a1:"HeroShots is an AI-powered platform that generates authentic UGC (user-generated content) for eCommerce and advertising. Brands upload products, choose a person (real creator or AI avatar), and generate professional photos and videos â without a photoshoot.",q2:"What's the difference between real creators and AI avatars?",a2:"Real creators license their likeness as AI avatars and earn royalties on every generation. They provide authentic, trustworthy content. AI avatars are fully synthetic â no creator fees, unlimited scale, but potentially less authentic feel. You can also upload your own external photos.",q3:"Who is HeroShots for?",a3:"HeroShots is designed for eCommerce brands, marketing agencies (talent and merchant), and creators/models who want to monetize their likeness. Whether you sell products online, manage clients, or want to earn passive royalties â HeroShots adapts.",q4:"Do I need technical skills to use HeroShots?",a4:"Not at all. The platform has a simple wizard: upload products, choose a person, write a prompt, and generate. For advanced use, we offer a full API and Shopify App integration.",q5:"How does pricing work?",a5:"Two layers, no tiers. (1) Pay-per-use from your wallet: first batch of 4 image variants â¬4.90, every following batch â¬1.90, edits â¬0.39 each, videos from â¬15 (â¤15s) to â¬35 (â¤30s). (2) Optional HeroShots Pro â¬99/month: â15% on every video, edits at â¬0.23 instead of â¬0.39, no watermark, priority queue.",q6:"What is the creator fee?",a6:"When you use a real catalog model, a 25% creator fee is added (minimum â¬0.90 per image, â¬5 per video). It covers the model's royalty plus our sourcing and admin. AI avatars and your own models have no creator fee.",q7:"How much do videos cost?",a7:"Video pricing is bracket-based: up to 15 seconds costs â¬15, up to 30 seconds costs â¬35, and each additional 15-second block costs â¬7.00. Creator fees are added separately (25%, minimum â¬5.00).",q8:"What are retries?",a8:"Every video includes 2 retries on us. Extra retries cost â¬5 every 15 seconds of regenerated video. For images you don't really need retries: a new batch of 4 fresh variants costs â¬1.90, and you can edit a chosen image for â¬0.39 (â¬0.23 with Pro).",q9:"What does HeroShots Pro at â¬99/month include?",a9:"Pro is an add-on to pay-per-use. It drops image edits to â¬0.23 (â40%), takes 15% off every video, gives you a watermark-free download on every asset and puts you in the priority queue. It does NOT change the â¬4.90 first batch, the â¬1.90 new batches or the â¬5/15s video retry â that's deliberate, to keep margins honest.",q10:"How do I top up my wallet?",a10:"Go to your dashboard billing settings, click 'Top Up Wallet' and add funds via credit card or bank transfer. Your balance is used automatically for each generation.",q11:"Are there any hidden fees?",a11:"No hidden fees. You pay only for what you generate. Prices are in EUR, VAT excluded. Creator fees are transparent and go directly to creators.",q12:"What quality can I expect from generated content?",a12:"Our outputs are high-resolution (up to 4K for photos, 1080p for videos) with advanced features like lighting match, hands refinement, and brand-safe filters. Quality controls ensure realistic product placement and natural poses.",q13:"How long does generation take?",a13:"Photos typically generate in 30-60 seconds. Videos take 2-5 minutes depending on length and complexity. Batch jobs are processed in parallel for faster throughput.",q14:"Can I generate content in batch?",a14:"Yes! You can select multiple products and generate content for all of them simultaneously. This is ideal for A/B testing, seasonal campaigns, and catalog refreshes.",q15:"What types of content can I generate?",a1
49325:"Photos and short-form videos optimized for eCommerce product pages, social media ads, catalogs, and marketing campaigns. You control the scene, mood, and setting via text prompts.",q16:"What are watermarks and how do I remove them?",a16:"Two watermarks. (1) DCMA â protects creator rights, removed only when the creator approves. (2) HeroShots watermark â applied without an active subscription, removed automatically with HeroShots Pro at â¬99/month.",q17:"How do creators earn money on HeroShots?",a17:"Creators upload photos, videos, and voice samples to build their AI avatar. When a brand generates content using their likeness, the creator earns a royalty automatically â 25% of the generation cost (minimum â¬0.90 per image, â¬5.00 per video). Automated payouts via Tik Joy are coming soon.",q18:"Do I need to post anything as a creator?",a18:"No. As a creator on HeroShots, you never publish anything. Brands use your AI avatar to generate their own content. You earn royalties passively, 24/7.",q19:"How do I verify my identity as a creator?",a19:"Upload a valid ID (passport or national ID) in your dashboard. Our team reviews it to ensure you are the person in the photos. This protects both you and the brands.",q20:"Can I control how my likeness is used?",a20:"Yes. You approve content via the model approval workflow. You can review every generation and decide whether to approve or reject it. The DCMA watermark protects your content until you approve.",q21:"Can I use HeroShots with Shopify?",a21:"The Shopify App â catalog sync and direct publishing to product pages â is coming soon. Today you can upload or connect your products, generate assets via the REST API, official SDKs, or the Claude connector, and export them for your Shopify store.",q22:"Do you have an API?",a22:"Yes. We provide a full REST API with endpoints for generation, product management, model selection, and asset retrieval. SDKs are available in JavaScript and Python.",q23:"What integrations do you support?",a23:"Available today: Amazon product import, a full REST API, official SDKs (JavaScript/npm, Python/PyPI, PHP/Packagist), and the Claude connector (Pro plan). Coming soon: Shopify App, Zapier & Make, and the ChatGPT connector. See the Integrations page for details.",q24:"Can agencies manage multiple brands?",a24:"Yes. Agencies get multi-brand workspaces with separate billing. Talent agencies earn commissions on creator royalties. Merchant agencies earn on every generation they manage for their clients.",q25:"Is HeroShots GDPR compliant?",a25:"Yes. We store data in the EU, use encryption at rest and in transit, enforce strict access controls, and conduct regular security audits. Users have full rights to access, rectify, or delete their data.",q26:"Who owns the generated content?",a26:"You own the commercial rights to use generated content. Image rights for real creators are time-boxed (typically 12-24 months) as defined in the consent agreement. Content generated with AI avatars has no time restrictions.",q27:"How do you handle inappropriate content?",a27:"Automated moderation filters block
4932inappropriate, violent, or adult content. All outputs pass brand-safety checks. Enterprise customers can define custom moderation rules.",q28:"Where is my data stored?",a28:"All data is stored in EU data centers, in compliance with GDPR regulations. We never share personal data with third parties without explicit consent. See our Privacy Policy for full details.",seoTitle:"FAQ â Frequently Asked Questions",seoDesc:"Find answers to common questions about HeroShots AI UGC platform: pricing, creator royalties, content quality, integrations, and privacy."},presales:{title:"Be the first to create",highlight:"real AI UGC",subtitle:"Join our early access program to get notified when HeroShots launches and receive exclusive credits at launch.",earlyCredits:"Early Credits",earlyCreditsDesc:"Get free render credits when we launch.",betaAccess:"Exclusive Beta Access",betaAccessDesc:"Help shape the platform.",partnerPriority:"Partner Priority",partnerPriorityDesc:"Be the first to connect your brand (Shopify store connection coming soon).",joinWaitlist:"Join the Waitlist",onList:"Thanks! You're on the list.",beFirst:"Be among the first to experience HeroShots",thanksTitle:"Thanks! You'll be the first to know when HeroShots launches.",thanksSubtitle:"Check your email for confirmation and next steps.",shareInvite:"Want to invite others? Share this page with your network!",fullName:"Full Name *",companyName:"Company Name",emailRequired:"Email *",consentEmail:"I agree to receive updates and promotional messages about HeroShots. *",consentPrivacy:"I consent to the processing of my personal data as described in the",privacyPolicy:"Privacy Policy",welcomeWaitlist:"Welcome to the waitlist! ð",welcomeDesc:"You'll be the first to know when HeroShots launches.",consentRequired:"Consent required",consentRequiredDesc:"Please accept both consent checkboxes to continue.",validating:"Verifying emailâ¦",emailInvalidTitle:"Invalid email",emailErr:{invalid_syntax:"The email format is not valid.",disposable:"Disposable emails are not accepted. Please use a real address.",no_mx:"The email domain doesn't exist or cannot receive mail.",server_error:"We couldn't verify your email. Please try again shortly.",invalid_message:"Message is required (max 2000 characters)."},messageLabel:"Your message",messagePlaceholder:"Tell us briefly who you are, how you'd use HeroShots, and what matters most to you.",messageRequiredTitle:"Message required",messageRequiredDesc:"Please write a short message so we can understand your interest.",quickQuestions:"Quick Questions",qq1:"When will it launch?",qq1a:"Beta launching Q2 2026. Early access members get first invites.",qq2:"Will I pay anything?",qq2a:"No, registration is free and includes launch credits.",qq3:"Can I invite others?",qq3a:"Yes! Share this page after registration to invite your network.",seoTitle:"Join the Waitlist â Early Access",seoDesc:"Get early access to HeroShots AI UGC platform. Join the waitlist for exclusive credits, beta access, and partner priority."},footer:{tagline:"AI UGC with real people, real products, at scale.",product:"Products",features:"Features",pricing:"Pricing",shopifyApp:"Shopify App (coming soon)",integrations:"Integrations",solutions:"Solutions",ecommerce:"eCommerce",agencies:"Agencies",models:"Models",resources:"Resources",documentation:"Documentation",apiReference:"API Reference",blog:"Blog",faq:"FAQ",legal:"Legal",terms:"Terms of Service",privacy:"Privacy Policy",cookies:"Cookie Policy",dpa:"DPA",allRights:"All rights reserved.",madeInEu:"Made in the EU with ð"},legal:{lastUpdated:"Last updated",version:"Version",toc:"Contents",bindingNotice:"In case of conflict, the Italian version prevails."},company:{heading:"Company",contacts:"Contacts",legalName:"Fancy Capital S.r.l.",registeredOffice:"Registered office",address:"Via Crespi 25, 24021 Albino (BG), Italy",vatId:"VAT / Tax ID",vatValue:"04763600162",rea:"REA",reaValue:"BG-487411",pec:"Certified email (PEC)",pecValue:"[email protected]",shareCapital:"Share capital",shareCapitalValue:"â¬10,000 resolved · â¬10,000 subscribed · â¬2,500 paid-in",startupRegistry:"Registered in the special section for innovative start-ups, Bergamo Companies Register.",email:"Email",emailValue:"[email protected]",privacyEmail:"Privacy / GDPR",abuseEmail:"Abuse reports",appealsEmail:"Appeals",aup:"Acceptable Use Policy"},notFound:{title:"404",message:"Oops! Page not found",back:"Return to Home"},forBrands:{seoTitle:"AI UGC for Brands at Scale",seoDesc:"Upload your products, choose real creator avatars, and generate scroll-stopping UGC photos and videos in seconds. No photoshoot needed.",badge:"For Brands",heroTitle:"Stop hiring photographers.",heroHighlight:"Start generating UGC.",heroSubtitle:"Upload your product, pick a real creator avatar, describe the scene â and get studio-quality UGC in under 60 seconds. Photos, videos, ready to publish.",featuresTitle:"Everything you need to produce UGC at scale",featuresSubtitle:"From product upload to multi-channel export, HeroShots handles the entire content pipeline.",feat1Title:"Product Upload",feat1Desc:"Upload product images directly (Shopify catalog sync coming soon). Lighting matching and brand-safe filters included.",feat2Title:"Real Creator Avatars",feat2Desc:"Choose from a library of licensed AI avatars built by real creators. Every generation pays them royalties automatically.",feat3Title:"AI Generation in Seconds",feat3Desc:"Describe your creative vision with a prompt. Get photo or short video UGC in under 60 seconds. Batch generation available.",feat4Title:"Multi-Channel Export",feat4Desc:"Export ready-to-publish content for your PDPs, social channels, and ad campaigns (direct Shopify and s
4932ocial publishing coming soon).",modesTitle:"Three ways to choose your person",modesSubtitle:"HeroShots gives you full flexibility on who appears in your content â from external photos to licensed creator avatars.",mode1Title:"External Photo Upload",mode1Desc:"Upload your own photos or avatars. You assume legal responsibility for usage rights. A consent flag is required.",mode2Title:"AI Avatar Library",mode2Desc:"Pick from our curated library of ready-to-use AI avatars. No licensing headaches â included in your plan.",mode3Title:"Real Model Marketplace",mode3Desc:"Select a real creator from the marketplace. They've built their own AI avatar and earn royalties every time you generate content with their likeness.",howTitle:"How it works for brands",step1Title:"Upload your product",step1Desc:"From manual upload (Shopify sync coming soon). Add product images, descriptions, and attributes.",step2Title:"Choose a person",step2Desc:"External photo, AI avatar from the library, or a real licensed model from the marketplace.",step3Title:"Write a prompt",step3Desc:"Describe the scene, mood, setting. Choose photo or video output. Set aspect ratio and quality.",step4Title:"Export everywhere",step4Desc:"Export for your store, download for ads, or share on social (direct Shopify and social publishing coming soon). Royalties to creators are calculated automatically.",useCasesTitle:"Built for every brand use case",useCasesSubtitle:"Whether you're a DTC brand, dropshipper, or enterprise â HeroShots adapts to your workflow.",use1Title:"Product Page Imagery",use1Desc:"Generate lifestyle and studio shots for every SKU. A/B test visuals to maximize conversion rates.",use2Title:"Ad Creative at Scale",use2Desc:"Produce dozens of ad variations in minutes. Test different people, scenes, and angles without reshooting.",use3Title:"Seasonal & Localized Content",use3Desc:"Generate holiday campaigns, localized imagery for different markets, and trend-responsive content instantly.",use4Title:"Social Media Content",use4Desc:"Create authentic-looking UGC ready to export for Instagram, TikTok, and Facebook without hiring influencers.",stat1:"Average conversion lift",stat2:"Generation time",stat3:"Cost reduction vs. traditional shoots",ctaTitle:"Ready to transform your content production?",ctaSubtitle:"Join 500+ brands already on the waitlist. Start generating AI UGC today â no credit card required.",seePricing:"See Pricing"},forAgencies:{seoTitle:"AI UGC for Agencies",seoDesc:"Whether you represent models or manage brands, HeroShots gives agencies the tools to scale AI-generated UGC and earn on every generation.",badge:"For Agencies",heroTitle:"One platform.",heroHighlight:"Two ways to grow.",heroSubtitle:"Whether you represent talent or manage brands, HeroShots gives your agency the tools to scale AI content production and unlock new revenue streams.",twoTypesTitle:"Two agency models, one platform",twoTypesSubtitle:"HeroShots supports both talent representation and merchant content management â and you can do both from the same account.",talentCardTitle:"Talent Agency",talentCardDesc:"Represent models and creators in the AI era. Manage their digital avatars, handle licensing, and earn commissions every time a brand uses their likeness.",talentCardBullets:["Manage your roster of AI avatars","Automatic royalty commissions","Digital consent & rights management","Analytics per model"],merchantCardTitle:"Merchant Agency",merchantCardDesc:"Manage AI content production for your brand clients. Handle product uploads, content generation, and delivery â earning a percentage on every generation.",merchantCardBullets:["Multi-brand workspace management","Batch generation for all clients","White-label delivery","Per-client billing & reporting"],bothTitle:"Both? No problem.",bothDesc:"Many agencies represent talent AND manage brand clients. With HeroShots, you can do both from a single account â earning commissions on model royalties while generating content for your merchant clients.",whyTitle:"Why agencies choose HeroShots",ben1Title:"10X content velocity",ben1Desc:"Produce in minutes what used to take weeks. No photographer scheduling, no post-production delays.",ben2Title:"Higher margins per project",ben2Desc:"Reduce production costs dramatically while maintaining premium output quality for your clients.",ben3Title:"New revenue streams",ben3Desc:"Earn commissions on model royalties and percentages on content generations â two revenue streams from one platform.",ben4Title:"Enterprise-ready infrastru
4932cture",ben4Desc:"SSO, custom SLAs, dedicated account management, and priority support for high-volume accounts.",ctaTitle:"Ready to scale your agency's output?",ctaSubtitle:"Book a demo to see how HeroShots can transform your content production across all clients.",seePlans:"See Plans",apiDocs:"API Documentation",resellerBadge:"Reseller program",resellerTitle:"Reseller program for agencies",resellerDesc:"Wholesale rates and revenue share for agencies that resell HeroShots-generated content to their own end clients.",resellerBullets:["Reseller pricing approx. 30â40% below direct list","Agency dashboard for managing multiple brand workspaces","White-label-friendly delivery formats","Reseller agreement required"],resellerCta:"Apply for the reseller program",resellerNote:"Wholesale numbers are shared after a signed reseller agreement."},forAgenciesTalent:{seoTitle:"AI UGC for Talent Agencies",seoDesc:"Manage your roster of AI avatars, handle licensing and consent, and earn commissions every time a brand uses your talent's likeness.",badge:"Talent Agency",heroTitle:"Represent talent",heroHighlight:"in the AI era.",heroSubtitle:"Onboard your models, manage their AI avatars, handle digital consent and licensing â and earn commissions automatically every time a brand generates content with their likeness.",backToHub:"All Agency Solutions",revenueTitle:"Your revenue model",revenueDesc:"You earn a percentage commission on every royalty generated by your represented models. When brands use your talent's AI avatar to create content, royalties and your agency commission are calculated automatically (payout via Tik Joy coming soon).",featuresTitle:"Built for talent representation",featuresSubtitle:"Everything you need to manage and monetize your roster of creators and models in the AI content era.",feat1Title:"Roster Management",feat1Desc:"Onboard models, manage their profiles, photos, videos, and body measurements. Track each talent's performance and earnings from a unified dashboard.",feat2Title:"Automatic Commissions",feat2Desc:"Earn a percentage on every royalty generated by your represented models. Commissions are calculated and paid out automatically â no manual invoicing.",feat3Title:"Analytics Per Model",feat3Desc:"Track which models are generating the most revenue, which brands are using them, and how their earnings trend over time.",feat4Title:"Simplified Onboarding",feat4Desc:"Streamlined workflow to onboard new creators: photo upload, ID verification, consent management, and avatar creation â all guided step by step.",feat5Title:"Digital Consent & Contracts",feat5Desc:"Manage consent forms, time-boxed licenses, and usage restrictions for each model. GDPR-compliant with SHA-256 hashing and full audit trail.",feat6Title:"Rights Protection",feat6Desc:"DCMA watermarks protect your models' rights. Content approval workflows ensure your talent reviews and approves every generated asset.",howTitle:"How talent agencies use HeroShots",step1Title:"Onboard models",step1Desc:"Upload photos, verify identity, and build AI avatars for each talent in your roster.",step2Title:"Approve avatars",step2Desc:"Review and approve each model's AI avatar before it goes live on the marketplace.",step3Title:"Brands use them",step3Desc:"Brands browse the marketplace, select your models, and generate content with their AI avatars.",step4Title:"Earn commissions",step4Desc:"Royalties are paid to models and your agency commission is automatically calculated and transferred.",ctaTitle:"Start representing talent in the AI era",ctaSubtitle:"Book a demo to see how HeroShots can help your agency unlock new revenue from AI-generated content.",seeMerchant:"Merchant Agency Solutions"},forAgenciesMerchant:{seoTitle:"AI UGC for Merchant Agencies",seoDesc:"Manage content production for multiple brand clients. Multi-brand workspaces, batch generation, white-label delivery, and per-client billing.",badge:"Merchant Agency",heroTitle:"Manage AI content",heroHighlight:"for your clients.",heroSubtitle:"Onboard brand clients, upload their products, generate AI content at scale, and deliver white-label assets â all from a single dashboard. Earn a percentage on every generation.",backToHub:"All Agency Solutions",revenueTitle:"Your revenue model",revenueDesc:"You earn a percentage fee on every content generation performed on behalf of your merchant clients. The more content you generate for your brands, the more you earn â automatically tracked and billed through the platform.",featuresTitle:"Built for brand management at scale",featuresSubtitle:"Everything you need to run content operations for multiple brand clients efficie
4932ntly and profitably.",feat1Title:"Multi-Brand Workspaces",feat1Desc:"Create separate workspaces per client. Each with its own products, avatars, brand guidelines, and billing. Unified dashboard for oversight.",feat2Title:"Batch Generation",feat2Desc:"Generate hundreds of assets across multiple brands simultaneously. Launch campaigns for all clients in minutes, not weeks.",feat3Title:"White-Label Delivery",feat3Desc:"Deliver AI-generated UGC under your agency brand. No HeroShots watermark on Enterprise plans. Custom SLAs available.",feat4Title:"Content Approval Workflows",feat4Desc:"Built-in review and approval flows. Clients preview content before final delivery. Models approve before publishing.",feat5Title:"Per-Client Analytics & Billing",feat5Desc:"Track generation volume, costs, and performance per client. Export reports for billing and campaign reviews.",feat6Title:"Product & Catalog Management",feat6Desc:"Import products via CSV, folder upload, or manual upload for each client (Shopify sync coming soon). Manage entire product catalogs from one place.",howTitle:"How merchant agencies use HeroShots",step1Title:"Onboard brand clients",step1Desc:"Set up workspaces per brand. Import their products, catalogs, and brand guidelines.",step2Title:"Upload products",step2Desc:"Import product images via CSV or manual upload for each client (Shopify sync coming soon).",step3Title:"Generate content",step3Desc:"Select models or AI avatars, write prompts, and generate content at scale across all clients.",step4Title:"Deliver & bill",step4Desc:"Export white-label deliverables, share reports, and earn your percentage on every generation.",ctaTitle:"Start managing brand content at scale",ctaSubtitle:"Book a demo to see how HeroShots can transform your agency's content production for all your merchant clients.",logosEyebrow:"Agencies running HeroShots through reseller agreements",logos:["Vesper Milano","Studio Norma","Casa Creativa","House of Loop","+12 more"],resellerFeaturesEyebrow:"What we include",resellerFeaturesTitle:"Six things",resellerFeaturesHighlight:"we do for you.",resellerFeatures:[{n:"01",title:"Wholesale rates",desc:"Reseller pricing significantly below the direct list, scaled to your committed volume. Margins are yours to keep â we don't ask how you bill your client."},{n:"02",title:"Multi-brand workspaces",desc:"A single agency account that contains one workspace per end client. Separate libraries, separate rights tracking, separate billing rollups."},{n:"03",title:"White-label-friendly delivery",desc:"Asset exports stripped of HeroShots branding. Deliver under your name. Optional co-branding for case studies you want to publish."},{n:"04",title:"Dedicated agency lead",desc:"One contact across all your clients. Faster turnaround on quotes, model requests, and rights upgrades than the self-service queue."},{n:"05",title:"Quarterly business reviews",desc:"Roll-up of volumes, savings, and projected next-quarter spend per client. Useful material for your own QBRs."},{n:"06",title:"Co-pitch support",desc:"We'll join your pitches when a prospective end client wants to see the platform live. We pitch the tech, you keep the relationship."}],resellerHowEyebrow:"How it works",resellerHowTitle:"From brief",resellerHowHighlight:"to final delivery.",resellerHowSubtitle:`Five steps. Typically two weeks from "we'd like to apply" to your first client asset delivered under your brand â produced by our studio.`,resellerHowRequiredLabel:"Required for the program:",resellerHowRequired:"a legal entity, VAT number, and at least one end client you're already serving. Independent freelancers are welcome through our standard self-serve plan instead.",resellerSteps:[{title:"You apply",desc:"Fill the form below â agency name, primary contact, brands you currently serve, projected volume. Takes 3 minutes."},{title:"We qualify",desc:"A 30-minute call to understand your client mix, scope, and how you bill them today. Most agencies qualify; we say no when the fit isn't there."},{title:"Reseller agreement",desc:"We send a contract with your wholesale tier, payment terms, and rights pass-through. Signed in 48 hours, on average."},{title:"Onboarding",desc:"Agency account is provisioned with your first end-client workspaces. We run a 90-minute training with your team â generation, briefing, billing."},{title:"You start delivering",desc:"Bill your client however you bill them. Get monthly statements with your invoice-side numbers separated from end-client-side rights costs."}],resellerFaqEyebrow:"FAQ",resellerFaqTitle:"Common",resellerFaqHighlight:"questions.",resellerFaqs:[{q:"What discount tier will I get?",a:"Wholesale tiers are based on committed quarterly volume and rights scope. We share specific numbers during the qualifying call â they are not published publicly."},{q:"Can I rebrand the platform?",a:"We don't offer a fully white-labeled dashboard. We do offer white-label-friendly delivery (no HeroShots branding on the assets themselves) and you remain the contractual party with your end client."},{q:"Who owns the relationship with the end client?",a:"You do. We work behind the curtain. We won't directly approach your clients about HeroShots services unless you explicitly route us in."},{q:"How does billing work?",a:"We invoice your agency monthly with consolidated line items per workspace. You invoice your end clients however you prefer â fixed fees, monthly retainers, project quotes. We don't see your end-client pricing."},{q:"What about rights upgrades?",a:"Rights are tracked at the asset level. You can buy organic-only and upgrade an asset to paid digital or broadcast later â wholesale rates apply to the upgrade delta."},{q:"Can I refer agencies that don't fit?",a:"Yes â we run a referral program for fellow agencies. Talk to your account lead once you're in."}],modelSwitcher:{eyebrow:"Two ways to work with HeroShots",title:"Self
4932-service or done-for-you?",subtitle:"Pick the model that fits your agency: run the platform yourself for your clients, or sign a partner program and let us handle production end-to-end.",selfBadge:"Self-service",selfTitle:"You run the platform",selfDesc:"Create workspaces for your clients, upload products and generate content yourself. Pay-per-use or subscription, full operational control.",selfBullets:["Multi-brand workspaces","Self-service batch generation","Pay-per-use or subscription"],selfCta:"See the self-service platform",managedBadge:"Done-for-you",managedTitle:"We handle production",managedDesc:"Sign a partner program, send us the briefs and we manage end-to-end production: setup, generation, review and white-labeled delivery.",managedBullets:["You send briefs, we produce","Dedicated account & studio","Partner pricing on contract"],managedCta:"Discover the partner program"},selfServiceEyebrow:"Self-service model",managedProgramEyebrow:"Done-for-you model",resellerBadge:"Done-for-you partner program",resellerHeroPretitle:"You send the briefs,",resellerHeroHighlight:"we produce.",resellerHeroSubtitle:"For agencies that want the output without operating the platform. Sign a partner program: you collect client briefs, our team handles setup, generation, revisions and white-labeled asset delivery.",resellerHeroCta:"Apply to the partner program",resellerHeroSeeHow:"See how we work",resellerHeroNote:"Partner pricing isn't public â it requires a signed agreement.",formEyebrow:"Apply for the reseller program",formTitle:"Tell us about",formHighlight:"your agency.",formSubtitle:"We review applications weekly. Required fields are marked with *",formAgency:"Agency name",formAgencyPh:"Vesper Milano",formWebsite:"Website",formContact:"Your name",formContactPh:"First Last",formRole:"Your role",formRolePh:"Head of Creative, Founder, etc.",formEmail:"Work email",formEmailPh:"[email protected]",formVolume:"Projected monthly volume",formVolumeOptions:["1-5 videos","5-15 videos","15-50 videos","50-150 videos","150+ videos"],formBrands:"Brands you currently serve",formBrandsPh:"A few representative brand names â helps us understand your client mix.",formNotes:"Anything else we should know?",formNotesPh:"Specific use cases, urgent campaigns, integration needsâ¦",formDisclaimer:"By submitting you agree to be contacted by HeroShots about the reseller program. We don't share your information.",formSubmit:"Submit application",formSubmitting:"Submittingâ¦",formSuccessBadge:"Application received",formSuccessTitle:"Thanks,",formSuccessFallback:"we'll be in touch",formSuccessBody:"We've received your application. Expect an email from our team within two business days to schedule the qualifying call.",formSubmitAnother:"Submit another",formErrorTitle:"Submission failed",formErrorDesc:"Please try again or contact us directly.",seeTalent:"Talent Agency Solutions"},forCreators:{seoTitle:"AI Avatars for Creators â Earn Royalties",seoDesc:"Turn yourself into an AI avatar. License your digital likeness to brands. Earn royalties every time your avatar generates content â 24/7, passively.",badge:"For Creators & Models",heroTitle:"Your face.",heroHighlight:"Your passive income.",heroSubtitle:"Upload your photos, build your AI avatar, set your licensing terms. Brands use your digital twin to generate UGC â you earn royalties automatically, every single time.",createAvatar:"Create Your Avatar",learnRoyalties:"Learn About Royalties",freeToJoin:"Free to join ⢠No upfront costs ⢠Earn from day one",howTitle:"How it works for creators",howSubtitle:"Four simple steps from signup to passive income",step1Title:"Upload your photos",step1Desc:"Upload high-quality photos of yourself. Different angles, expressions, and outfits help build a better avatar.",step2Title:"Build your AI avatar",step2Desc:"Our AI creates a digital twin of you. You review and approve it before it goes live. You stay in control.",step3Title:"Set your terms",step3Desc:"Define your licensing terms, usage restrictions, and royalty rate. You decide what brands can and cannot do with your likeness.",step4Title:"Earn royalties",step4Desc:"Every time a brand generates content with your avatar, you earn a royalty, calculated automatically (automated payouts via Tik Joy coming soon). No invoicing needed.",featuresTitle:"Your likeness, your rules",featuresSubtitle:"HeroShots puts creators in full control of their digital identity, licensing, and earnings.",feat1Title:"AI Avatar Creation",feat1Desc:"Turn your photos into a high-quality AI avatar that brands can use for UGC generation. Your digital twin, your asset.",feat2Title:"Automatic Royalties",feat2Desc:"Earn a royalty for every piece of content generated
4932with your avatar. Passive income, 24/7. Payouts via Tik Joy coming soon.",feat3Title:"Content Approval",feat3Desc:"Review and approve content before it goes live. If something doesn't look right, you can reject it. Full veto power.",feat4Title:"ID Verification & Consent",feat4Desc:"Industry-standard identity verification protects you and brands. Digital consent with SHA-256 hashing for legal compliance.",feat5Title:"Analytics Dashboard",feat5Desc:"Track how many times your avatar is used, by which brands, and your total earnings. Full transparency.",feat6Title:"Community & Support",feat6Desc:"Join a community of creators monetizing their likeness. Priority support and resources to help you grow.",earningsTitle:"Your earning potential",earningsSubtitle:"The more brands use your avatar, the more you earn. No cap on royalties.",earnStat1Val:"24/7",earnStat1Label:"Passive earning potential",earnStat2Val:"100%",earnStat2Label:"Content approval control",earnStat3Val:"Auto",earnStat3Label:"Royalty calculation",faqTitle:"Frequently asked questions",faq1Q:"Is it free to create an avatar?",faq1A:"Yes, creating your AI avatar is completely free. You only start earning when brands use your avatar to generate content.",faq2Q:"Do I control how my likeness is used?",faq2A:"Absolutely. You set your licensing terms, can restrict certain industries or use cases, and have full approval power over generated content.",faq3Q:"How are royalties calculated?",faq3A:"You earn a royalty for every piece of content generated with your avatar. The rate depends on your tier and the brand's plan. Payouts are automated.",faq4Q:"Can I delete my avatar?",faq4A:"Yes, you can deactivate or permanently delete your avatar at any time. All associated data is removed from our systems.",ctaTitle:"Ready to monetize your likeness?",ctaSubtitle:"Join HeroShots today and start earning passive royalties with your AI avatar."},integrations:{seoTitle:"Integrations â Connect HeroShots to your stack",seoDesc:"Bring HeroShots into the tools you already use. Generate AI UGC from Claude Pro, import products from Amazon, and more.",badge:"Integrations",heroTitle:"HeroShots, right inside your stack.",heroHighlight:"your stack.",heroSubtitle:"Skip the copy-paste. Trigger HeroShots generations from the tools where you already work.",exploreAll:"Explore integrations",liveTag:"Live",soonTag:"Coming soon",cardClaudeTitle:"Claude Pro Skill",cardClaudeDesc:"Generate HeroShots product visuals without leaving your Claude chat. Attach a product, prompt, get the image back inline.",cardAmazonTitle:"Amazon URL Import",cardAmazonDesc:"Paste an Amazon product URL. HeroShots pulls images, title and specs â ready to combine with your model, location and pose.",cardSdksTitle:"Official SDKs (npm, PyPI, Packagist)",cardSdksDesc:"Ship HeroShots in your codebase. Official SDKs for JavaScript, Python and PHP â install with npm, pip or composer.",cardShopifyTitle:"Shopify App",cardShopifyDesc:"Sync your Shopify catalog and publish generated assets straight to product pages.",cardApiTitle:"REST API & SDKs",cardApiDesc:"Official JavaScript, Python, and PHP SDKs and a full REST API for custom workflows.",cardZapierTitle:"Zapier & Make",cardZapierDesc:"Trigger generations from any of 6,000+ apps via Zapier and Make.",cardChatgptTitle:"ChatGPT connector",cardChatgptDesc:"A native ChatGPT connector to run HeroShots generations inside your GPT workspace.",requestTitle:"Missing an integration?",requestDesc:"Tell us which tool you'd like HeroShots to plug into next.",requestCta:"Request an integration"},claudeSkill:{seoTitle:"HeroShots Claude Skill â Generate AI UGC inside Claude Pro",seoDesc:"Connect HeroShots to Claude Pro: upload a product image in chat, prompt the pose and scene, and get a generated visual back without leaving the chat.",badge:"New · Claude Skill",heroTitle:"Generate HeroShots visuals",heroHighlight:"inside Claude.",heroSubtitle:"Attach product images in Claude, describe the scene, and the HeroShots Skill returns a ready-to-use AI UGC image right in the thread.",ctaConnect:"Connect Claude Skill",ctaDocs:"Read the setup guide",requires:"Requires a Claude Pro account and a HeroShots workspace.",howTitle:"How
4932it works",howSubtitle:"Three steps, one chat.",how1Title:"1. Enable the Skill",how1Desc:"In Claude, add the HeroShots Skill and sign in with your HeroShots workspace. Your credits and models follow you.",how2Title:"2. Attach product & prompt",how2Desc:"Drop a product image into the chat, describe the model, location and pose you want, and mention @heroshots.",how3Title:"3. Receive the visual",how3Desc:"HeroShots generates the image and returns it directly inside the Claude conversation, ready to download or iterate on.",benefitsTitle:"Why teams love it",b1Title:"Stay in flow",b1Desc:"No more switching tabs. Brief, generate, iterate â all in the same thread you use to write copy.",b2Title:"Real creators, real consent",b2Desc:"Same licensing, consent and creator royalties as the HeroShots app. Watermarks and model approval rules apply.",b3Title:"Wallet-based billing",b3Desc:"Generations consume your HeroShots wallet. No separate billing, no surprise seats.",b4Title:"Team-ready",b4Desc:"Every seat in your Claude workspace can trigger generations against the same HeroShots project.",setupTitle:"Setup in 60 seconds",setupStep1:"Open Claude Pro â Settings â Skills â Add Skill and search for HeroShots.",setupStep2:"Click Install, then Sign in with HeroShots and pick the workspace you want to bill.",setupStep3:"In any chat, type @heroshots, attach a product image and describe the scene.",faqTitle:"Frequently asked",faq1Q:"Do I need a paid Claude plan?",faq1A:"Yes â the Skill runs on Claude Pro (or Claude Teams / Enterprise). The HeroShots side works with any plan, including Free.",faq2Q:"Which HeroShots plans can use the Skill?",faq2A:"All plans. Free, Pay-per-use and HeroShots Pro all work. Each generation consumes the same wallet/credits it would in the app.",faq3Q:"Are watermarks applied?",faq3A:"Yes â same rules as the app. Free-plan outputs carry the HeroShots watermark; Pro removes it. The DCMA watermark stays until the model approves.",faq4Q:"Does the Skill store my chat data?",faq4A:"The Skill only sends the images and prompt you explicitly attach. HeroShots stores the generated asset in your workspace; Claude keeps the conversation under your Anthropic account."},amazonImport:{seoTitle:"Amazon Product Import for AI UGC",seoDesc:"Paste an Amazon product URL and HeroShots imports the images, title and specs. Pair with a model, location and pose to generate on-brand product UGC in seconds.",badge:"New · Amazon Import",heroTitle:"One URL. One product,",heroHighlight:"ready to shoot.",heroSubtitle:"Paste any Amazon product link. HeroShots grabs the images, title, brand, bullet points and specs â so your product asset is ready to pair with a model, location and pose.",ctaTry:"Try Amazon Import",ctaHow:"See how it works",urlPreviewLabel:"Paste an Amazon URL",urlPreviewPlaceholder:"https://www.amazon.com/dp/B0â¦",urlPreviewCta:"Import product",urlPreviewHint:"Works on amazon.com, .it, .de, .es, .fr and .co.uk.",howTitle:"From URL to campaign in three steps",how1Title:"1. Paste the Amazon link",how1Desc:"In the Products page, choose Import from Amazon and paste the product URL. Marketplaces supported: US, IT, DE, ES, FR, UK.",how2Title:"2. Review the extracted asset",how2Desc:"HeroShots pulls high-res images, title, brand, bullet points and technical specs into a new product. Edit anything before saving.",how3Title:"3. Generate with your creator",how3Desc:"Pick a model or AI avatar, choose a location and pose, write a prompt and generate. Same watermark and royalty rules as any HeroShots product.",extractedTitle:"What we extract",extracted1:"Main product image + gallery in the highest resolution available",extracted2:"Title, brand and category",extracted3:"Bullet points and long description",extracted4:"Dimensions, weight and technical specs",extracted5:"Localised currency and price for reference (never displayed on generated content)",benefitsTitle:"Why sellers use it",b1Title:"No more manual uploads",b1Desc:"Skip downloading, renaming and re-uploading every SKU. One paste, done.",b2Title:"Catalog-ready in seconds",b2Desc:"Bulk-import an entire Amazon store into a HeroShots project by pasting URLs, one per line.",b3Title:"Works for resellers too",b3Desc:"Great for merchant agencies managing multiple Amazon stores. Import once, generate across markets.",b4Title:"Structured, not scraped",b4Desc:"We use Amazon's own product data â title, bullet points, dimensions â so prompts stay accurate.",complianceTitle:"Fair use disclaimer",complianceDesc:'Import products only if you own the rights, are the seller, or are an authorised reseller. HeroShots is not affiliated with Amazon; "Amazon" is a trademark of Amazon.com, Inc.',faqTitle:"Frequently asked",faq1Q:"Which Amazon marketplaces are supported?",faq1A:"amazon.com, amazon.it, amazon.de, amazon.es, amazon.fr and amazon.co.uk today. Ask us if you need another marketplace.",faq2Q:"Does this work for private-label brands only?",faq2A:"It works for any seller or authorised reseller of a product. You are responsible for the rights and trademark permissions of the products you import.",faq3Q:"How many products can I import at once?",faq3A:"You can paste one URL at a time or paste up to 50 URLs in bulk. Pro workspaces get bulk import up to 500 URLs.",faq4Q:"Do you store the Amazon page?",faq4A:"No. We store only the extracted asset â images, title, brand, bullets, specs â inside your workspace, so you can edit and regenerate anytime."},whatsNew:{eyebrow:"What's new",title:"Fresh from the HeroShots roadmap",subtitle:"Two ways to bring HeroShots into your day-to-day workflow.",claudeTitle:"Claude Pro Skill",claudeDesc:"Generate HeroShots visuals directly inside Claude. Attach product images, prompt the scene, get the image back in the same thread.",claudeCta:"Explore the Claude Skill",amazonTitle:"Amazon URL Import",amazonDesc:"Paste an Amazon link â HeroShots imports the product, images and specs, ready to pair with your model and pose.",amazonCta:"Try Amazon Import",sdksTitle:"Official SDKs: npm, PyPI, Packagist",sdksDesc:"The HeroShots API, now in JavaScript, Python and PHP. Install in one line and generate product visuals from your co
4932debase.",sdksCta:"Explore the SDKs",newBadge:"New"},faqIntegrations:{q1:"Can I use HeroShots inside Claude?",a1:"Yes. The HeroShots Skill for Claude Pro lets you attach product images and prompts in the chat and receive the generated image inline. It uses your HeroShots wallet and follows the same consent, watermark and creator royalty rules as the app.",q2:"Can I import products from Amazon URLs?",a2:"Yes. Paste any product URL from amazon.com, .it, .de, .es, .fr or .co.uk and HeroShots imports images, title, brand, bullet points and technical specs as a ready-to-use product asset.",q3:"Do you offer official SDKs?",a3:"Yes. We ship official SDKs for JavaScript (npm i heroshots), Python (pip install heroshots) and PHP (composer require heroshots/sdk). All three are maintained by the HeroShots team and target maximum compatibility with modern frameworks (Next.js, FastAPI, Laravel, Symfony).",q4:"Are the SDKs available on the Free plan?",a4:"The API and SDKs require a paid plan (Pay-per-use or Subscription). The Free plan is limited to the web app.",q5:"Which SDK should I choose?",a5:"Pick the one that matches your stack: JavaScript/TypeScript for Node.js and browser apps, Python for data pipelines and ML workflows, PHP for Laravel, Symfony and WordPress environments. All three expose the same generation API."},sdks:{seoTitle:"HeroShots SDKs â JavaScript, Python, PHP",seoDesc:"Official HeroShots SDKs for npm, PyPI and Packagist. Generate AI product UGC from Node.js, Python or PHP with a single install.",badge:"Official SDKs",officialBadge:"Official SDK",heroTitle:"Ship HeroShots in your codebase.",heroSubtitle:"Official SDKs for the three ecosystems your team already uses. One line to install, one call to generate.",compat:"Maximum compatibility with your stack â works with Node 18+, Python 3.9+, PHP 8.1+, and modern frameworks (Next.js, FastAPI, Laravel, Symfony).",installTitle:"Install",quickstartTitle:"Quickstart",authTitle:"Authentication",authText:"Every SDK reads an API key from environment variables. Generate a key in your HeroShots workspace and export it as HEROSHOTS_API_KEY.",errorsTitle:"Errors & retries",errorsText:"Typed error classes for auth, rate-limit and validation errors. Automatic retries with exponential backoff for transient network failures.",faqTitle:"FAQ",viewOn:"View on {{registry}}",viewAll:"View all SDKs",readDocs:"Read the docs",ctaTitle:"Prefer raw HTTP?",ctaDesc:"Every SDK is a thin wrapper around our REST API â full endpoint reference is in the docs.",footerLabel:"SDKs (npm, PyPI, Packagist)",docsCardTitle:"Official SDKs",docsCardDesc:"JavaScript, Python and PHP SDKs â install with npm, pip or composer.",js:{title:"JavaScript / TypeScript SDK",language:"TypeScript",desc:"Isomorphic client for Node.js and browsers. Fully typed, tree-shakeable, framework-agnostic.",seoTitle:"HeroShots JavaScript SDK (npm) â Node & Browser",seoDesc:"Official HeroShots JavaScript SDK on npm. Generate AI product UGC from Node.js, Next.js, or any modern JavaScript runtime.",heroTitle:"The HeroShots JavaScript SDK",heroSubtitle:"One `npm install heroshots` and you can generate product UGC from Node, Next.js, Remix or your favourite serverless runtime.",quickstartText:"Import the client, pass your API key, and call generations.create with a product URL and the avatar/location/pose you want.",howToName:"Install and generate with the HeroShots JavaScript SDK",faq1Q:"Does it work in the browser?",faq1A:"Yes, but only with a short-lived key issued from your backend. Never ship a long-lived API key in client bundles.",faq2Q:"Is it typed?",faq2A:"Yes. First-class TypeScript types are included; no @types package needed.",faq3Q:"Which Node versions are supported?",faq3A:"Node 18 and newer. The SDK ships as ESM + CJS and works in Next.js, Remix, SvelteKit, Nuxt, Cloudflare Workers, Vercel Edge and Bun."},python:{title:"Python SDK",language:"Python",desc:"Sync and async client for Python 3.9+. Plays nicely with FastAPI, Django, Jupyter and pandas.",seoTitle:"HeroShots Python SDK (PyPI) â Sync & Async",seoDesc:"Official HeroShots Python SDK on PyPI. Batch-generate AI product UGC from scripts, Jupyter, FastAPI or your data pipelines.",heroTitle:"The HeroShots Python SDK",heroSubtitle:"`pip install heroshots` and start generating product visuals from your scripts, notebooks or FastAPI backends.",quickstartText:"Instantiate HeroShots(api_key=...) and call generations.create â the same shape as the REST API, with an async variant for high-throughput jobs.",howToName:"Install and generate with the HeroShots Python SDK",faq1Q:"Is there an async client?",faq1A:"Yes. Both HeroShots (sync) and AsyncHeroShots (asyncio) are exported, sharing the same method surface.",faq2Q:"Which Python ver
4932sions are supported?",faq2A:"Python 3.9 and newer, on CPython and PyPy. Type hints included; works with mypy and pyright.",faq3Q:"Can I use it in Jupyter?",faq3A:"Yes â the sync client is notebook-friendly, and generated image URLs render inline via IPython.display."},php:{title:"PHP SDK",language:"PHP",desc:"PSR-4 client for PHP 8.1+. Framework-agnostic, with first-class support for Laravel and Symfony.",seoTitle:"HeroShots PHP SDK (Packagist) â Laravel & Symfony",seoDesc:"Official HeroShots PHP SDK on Packagist. Automate product UGC generation from Laravel, Symfony, WordPress or any PSR-compliant app.",heroTitle:"The HeroShots PHP SDK",heroSubtitle:"`composer require heroshots/sdk` and call the HeroShots API from Laravel, Symfony or any modern PHP application.",quickstartText:"Autoload with Composer, instantiate the client with your API key, and call generations()->create() with a product URL, avatar, location and pose.",howToName:"Install and generate with the HeroShots PHP SDK",faq1Q:"Which PHP versions are supported?",faq1A:"PHP 8.1 and newer. The SDK is PSR-4 autoloaded, PSR-18 for HTTP and PSR-3 for logging â swap the transport freely.",faq2Q:"Is there a Laravel service provider?",faq2A:"Yes. The package auto-discovers a Laravel service provider and facade; Symfony bundles are also supported.",faq3Q:"Does it support async / queued jobs?",faq3A:"Yes. Long-running generations can be dispatched to Laravel queues or Symfony Messenger; the SDK exposes both blocking and job-based patterns."}}}},iF={it:()=>bt(()=>import("./it-C1csMqAB.js"),[]),es:()=>bt(()=>import("./es-D8SALXUp.js"),[]),de:()=>bt(()=>import("./de-ayQ5JtVb.js"),[]),fr:()=>bt(()=>import("./fr-dzxoZoMo.js"),[])},qs=typeof window<"u"?ss(window.location.pathname):aa;Ct.use(X3).init({resources:{en:oF},lng:qs,fallbackLng:aa,supportedLngs:["en","it","es","de","fr"],interpolation:{escapeValue:!1},initImmediate:!1});const sF=(async()=>{if(qs!==aa)try{const t=(await iF[qs]()).default.translation;Ct.addResourceBundle(qs,"translation",t,!0,!0),await Ct.changeLanguage(qs)}catch{}})();sF.then(()=>{j0(document.getElementById("root")).render(i.jsx(rF,{}))});export{y5 as $,Xe as A,H as B,hf as C,ma as D,at as E,Cn as F,Tu as G,ob as H,nn as I,km as J,xa as K,Jt as L,VN as M,Xr as N,Ag as O,zr as P,OL as Q,wm as R,wt as S,pi as T,$s as U,bf as V,bo as W,Tg as X,SN as Y,Sn as Z,Uu as _,Bn as a,v5 as a0,w1 as a1,x1 as a2,w5 as a3,k1 as a4,C1 as a5,b5 as a6,oC as a7,YN as a8,xm as a9,cb as aa,NN as ab,UN as ac,fm as ad,Dd as ae,Iu as af,Gh as ag,gl as ah,Wa as ai,M as aj,kL as ak,bt as al,_N as am,k_ as an,vo as ao,lb as ap,cF as aq,gx as ar,J as b,Q as c,Zr as d,td as e,uF as f,we as g,qu as h,xi as i,i as j,Ha as k,es as l,Se as m,Ee as n,iC as o,LN as p,re as q,f as r,Qa as s,Ze as t,x3 as u,ie as v,UL as w,xP as x,sd as y,ld as z};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.