diff --git a/admin/src/components/form/fields/DatepickerField.vue b/admin/src/components/form/fields/DatepickerField.vue index 8c117d7..4d5de0a 100644 --- a/admin/src/components/form/fields/DatepickerField.vue +++ b/admin/src/components/form/fields/DatepickerField.vue @@ -98,10 +98,11 @@ function refreshPartial(): void { return } // Only the editable number segments count: literals, the zone name, the - // day period and the calendar trigger carry the same data attribute. - const segments = Array.from(root.querySelectorAll('[data-reka-date-field-segment]')).filter((el) => - NUMBER_PARTS.has(el.dataset.rekaDateFieldSegment ?? ''), - ) + // day period and the calendar trigger carry the same data attribute. A + // date or datetime renders DateField segments, time mode TimeField ones. + const segments = Array.from( + root.querySelectorAll('[data-reka-date-field-segment], [data-reka-time-field-segment]'), + ).filter((el) => NUMBER_PARTS.has(el.dataset.rekaDateFieldSegment ?? el.dataset.rekaTimeFieldSegment ?? '')) const filled = segments.filter((el) => !el.hasAttribute('data-placeholder')).length partial.value = filled > 0 && filled < segments.length } diff --git a/admin/tests/form/DatepickerField.test.ts b/admin/tests/form/DatepickerField.test.ts new file mode 100644 index 0000000..01ec6a5 --- /dev/null +++ b/admin/tests/form/DatepickerField.test.ts @@ -0,0 +1,204 @@ +// DatepickerField (Phase 12.2, D-18 to D-21; UI-SPEC section 1) mounted on +// its own. The zone is fixed to Europe/Warsaw so a datetime shows a local +// wall clock different from UTC. Covers the two UI-SPEC backstops: the +// calendar popover returns focus to its trigger on Escape and refuses a +// disabled day, and a datetime round trip shows local time but emits UTC +// (ignoreTimezone keeps the wall clock). +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { flushPromises, mount, type DOMWrapper, type VueWrapper } from '@vue/test-utils' +import { resetLocalTimeZone, setLocalTimeZone } from '@internationalized/date' +import DatepickerField from '../../src/components/form/fields/DatepickerField.vue' +import type { FormField } from '../../src/api/types' +import { keydown, resetState } from '../helpers' + +function field(extra: Partial = {}): FormField { + return { name: 'starts_at', label: 'Starts at', type: 'datepicker', mode: 'datetime', ...extra } as FormField +} + +function mountField(f: FormField, modelValue: unknown, extra: Record = {}) { + return mount(DatepickerField, { + props: { field: f, modelValue, controlId: 'field-x', describedBy: 'field-x-comment', ...extra }, + attachTo: document.body, + }) +} + +// Date and datetime segments come from Reka's DateField, time segments +// from its TimeField, each with its own data attribute. +function segment(wrapper: VueWrapper, part: string): DOMWrapper { + const date = wrapper.find(`[data-reka-date-field-segment="${part}"]`) + return date.exists() ? date : wrapper.find(`[data-reka-time-field-segment="${part}"]`) +} + +function parts(wrapper: VueWrapper): string[] { + return wrapper + .findAll('[data-reka-date-field-segment]') + .map((el) => el.attributes('data-reka-date-field-segment') ?? '') + .filter((part) => part !== 'literal' && part !== 'trigger') +} + +function emitted(wrapper: VueWrapper): unknown[] { + return (wrapper.emitted('update:modelValue') ?? []).map((args) => args[0]) +} + +beforeEach(() => { + resetState() + setLocalTimeZone('Europe/Warsaw') +}) + +afterEach(() => { + resetLocalTimeZone() + document.body.innerHTML = '' +}) + +describe('datetime round trip (backstop 2)', () => { + it('shows the stored UTC instant as local wall clock and emits UTC', async () => { + const wrapper = mountField(field(), '2026-10-02T10:30:00Z') + expect(segment(wrapper, 'hour').text()).toBe('12') + expect(segment(wrapper, 'minute').text()).toBe('30') + expect(segment(wrapper, 'timeZoneName').exists()).toBe(true) + await segment(wrapper, 'minute').trigger('keydown', { key: 'ArrowUp' }) + await flushPromises() + expect(emitted(wrapper).at(-1)).toBe('2026-10-02T10:31:00Z') + wrapper.unmount() + }) + + it('keeps the wall clock unchanged with ignoreTimezone', async () => { + const wrapper = mountField(field({ ignoreTimezone: true }), '2026-10-02T10:30:00Z') + expect(segment(wrapper, 'hour').text()).toBe('10') + expect(segment(wrapper, 'timeZoneName').exists()).toBe(false) + await segment(wrapper, 'minute').trigger('keydown', { key: 'ArrowUp' }) + await flushPromises() + expect(emitted(wrapper).at(-1)).toBe('2026-10-02T10:31:00Z') + wrapper.unmount() + }) + + it('emits a date as YYYY-MM-DD in Polish segment order', async () => { + const wrapper = mountField(field({ name: 'released_on', mode: 'date' }), null) + expect(parts(wrapper)).toEqual(['day', 'month', 'year']) + for (const [part, digits] of [['day', '02'], ['month', '10'], ['year', '2026']] as const) { + for (const key of digits) { + await segment(wrapper, part).trigger('keydown', { key }) + } + } + await flushPromises() + expect(emitted(wrapper).at(-1)).toBe('2026-10-02') + wrapper.unmount() + }) +}) + +describe('calendar popover (backstop 1)', () => { + it('returns focus to the trigger on Escape', async () => { + const wrapper = mountField(field({ name: 'released_on', mode: 'date' }), '2026-10-02') + const trigger = wrapper.find('[data-action="open-calendar"]') + ;(trigger.element as HTMLElement).focus() + await trigger.trigger('click') + await flushPromises() + const calendar = document.body.querySelector('[data-datepicker-calendar]') + expect(calendar).not.toBeNull() + const day = calendar!.querySelector('[data-reka-calendar-cell-trigger][data-selected]') ?? + calendar!.querySelector('[data-reka-calendar-cell-trigger]') + day?.focus() + keydown(document.activeElement ?? calendar!, 'Escape') + await flushPromises() + expect(document.body.querySelector('[data-datepicker-calendar]')).toBeNull() + expect(document.activeElement).toBe(trigger.element) + wrapper.unmount() + }) + + it('marks days outside minDate and maxDate disabled and ignores a click on them', async () => { + const wrapper = mountField(field({ name: 'released_on', mode: 'date', minDate: '2026-10-05', maxDate: '2026-10-20' }), '2026-10-10') + await wrapper.find('[data-action="open-calendar"]').trigger('click') + await flushPromises() + const calendar = document.body.querySelector('[data-datepicker-calendar]')! + const cells = Array.from(calendar.querySelectorAll('[data-reka-calendar-cell-trigger]')) + const before = cells.find((el) => el.textContent?.trim() === '4' && !el.hasAttribute('data-outside-view'))! + const inside = cells.find((el) => el.textContent?.trim() === '12' && !el.hasAttribute('data-outside-view'))! + expect(before.hasAttribute('data-disabled')).toBe(true) + expect(inside.hasAttribute('data-disabled')).toBe(false) + before.click() + await flushPromises() + expect(emitted(wrapper)).toEqual([]) + inside.click() + await flushPromises() + expect(emitted(wrapper).at(-1)).toBe('2026-10-12') + wrapper.unmount() + }) + + it('starts the week on the field firstDay, else on the locale first day', async () => { + const heads = async (f: FormField) => { + const wrapper = mountField(f, '2026-10-10') + await wrapper.find('[data-action="open-calendar"]').trigger('click') + await flushPromises() + const first = document.body.querySelector('[data-datepicker-calendar] th')?.textContent?.trim() + wrapper.unmount() + document.body.innerHTML = '' + return first + } + const monday = await heads(field({ name: 'released_on', mode: 'date' })) + const sunday = await heads(field({ name: 'released_on', mode: 'date', firstDay: 0 })) + expect(monday).not.toBe(sunday) + expect(sunday?.toLowerCase()).toMatch(/^n/) + expect(monday?.toLowerCase()).toMatch(/^p/) + }) +}) + +describe('field states', () => { + it('renders read-only text in the display format, or a muted dash', () => { + const shown = mountField(field({ name: 'released_on', mode: 'date', readOnly: true, displayFormat: 'D MMMM YYYY' }), '2026-10-02') + const text = shown.find('[data-datepicker-readonly]') + expect(text.attributes('id')).toBe('field-x') + expect(text.text()).toBe('2 października 2026') + expect(shown.find('[data-reka-date-field-segment]').exists()).toBe(false) + const empty = mountField(field({ readOnly: true }), null) + expect(empty.find('[data-empty]').text()).toBe('—') + const attr = mountField(field({ attributes: { readonly: true } }), null) + expect(attr.find('[data-datepicker-readonly]').exists()).toBe(true) + }) + + it('offers the clear button only on an optional field with a value', async () => { + expect(mountField(field(), '2026-10-02T10:30:00Z').find('[data-action="clear"]').exists()).toBe(true) + expect(mountField(field(), null).find('[data-action="clear"]').exists()).toBe(false) + expect(mountField(field({ required: true }), '2026-10-02T10:30:00Z').find('[data-action="clear"]').exists()).toBe(false) + const wrapper = mountField(field(), '2026-10-02T10:30:00Z') + await wrapper.find('[data-action="clear"]').trigger('click') + expect(emitted(wrapper)).toEqual([null]) + }) + + it('is aria-invalid on a server error, a partly filled value and an out-of-range value', async () => { + const invalid = mountField(field(), '2026-10-02T10:30:00Z', { invalid: true }) + expect(invalid.find('[aria-invalid="true"]').exists()).toBe(true) + const fine = mountField(field(), '2026-10-02T10:30:00Z') + expect(fine.find('[aria-invalid="true"]').exists()).toBe(false) + const range = mountField(field({ name: 'released_on', mode: 'date', minDate: '2026-11-01' }), '2026-10-02') + await flushPromises() + expect(range.find('[aria-invalid="true"]').exists()).toBe(true) + + const partial = mountField(field({ name: 'released_on', mode: 'date' }), null) + await segment(partial, 'day').trigger('keydown', { key: '2' }) + await partial.find('[data-datepicker]').trigger('keyup') + await flushPromises() + expect(partial.find('[aria-invalid="true"]').exists()).toBe(true) + }) + + it('renders time mode with a day period when twelveHour is set and emits HH:MM:SS', async () => { + const wrapper = mountField(field({ name: 'opens_at', mode: 'time', twelveHour: true }), '14:30:00') + expect(wrapper.find('[data-datepicker][data-mode="time"]').exists()).toBe(true) + expect(wrapper.find('[data-action="open-calendar"]').exists()).toBe(false) + expect(segment(wrapper, 'dayPeriod').exists()).toBe(true) + expect(segment(wrapper, 'hour').text()).toBe('2') + await segment(wrapper, 'minute').trigger('keydown', { key: 'ArrowUp' }) + await flushPromises() + expect(emitted(wrapper).at(-1)).toBe('14:31:00') + const day = mountField(field({ name: 'opens_at', mode: 'time' }), '14:30:00') + expect(segment(day, 'dayPeriod').exists()).toBe(false) + }) + + it('marks a partly filled time invalid', async () => { + const wrapper = mountField(field({ name: 'opens_at', mode: 'time' }), null) + expect(wrapper.find('[aria-invalid="true"]').exists()).toBe(false) + await segment(wrapper, 'hour').trigger('keydown', { key: '9' }) + await wrapper.find('[data-datepicker]').trigger('keyup') + await flushPromises() + expect(wrapper.find('[aria-invalid="true"]').exists()).toBe(true) + }) +}) diff --git a/modules/boardwalk/dist/assets/index-ccm5iY7G.js b/modules/boardwalk/dist/assets/index-BfB8esTA.js similarity index 77% rename from modules/boardwalk/dist/assets/index-ccm5iY7G.js rename to modules/boardwalk/dist/assets/index-BfB8esTA.js index 9f40ee2..7c91237 100644 --- a/modules/boardwalk/dist/assets/index-ccm5iY7G.js +++ b/modules/boardwalk/dist/assets/index-BfB8esTA.js @@ -6,4 +6,4 @@ - \`null\` or \`undefined\` if the progress is indeterminate. Defaulting to \`null\`.`),null)}function uS(e){return Oo(e)&&!Number.isNaN(e)&&e>0?e:(console.error(`Invalid prop \`max\` of value \`${e}\` supplied to \`ProgressRoot\`. Only numbers greater than 0 are valid max values. Defaulting to \`${vl}\`.`),vl)}var cS=Z({__name:"ProgressRoot",props:{modelValue:{type:[Number,null],required:!1},max:{type:Number,required:!1,default:vl},getValueLabel:{type:Function,required:!1,default:(e,t)=>Oo(e)?`${Math.round(e/t*vl)}%`:void 0},getValueText:{type:Function,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue","update:max"],setup(e,{emit:t}){const n=e,a=t;He();const r=bt(n,"modelValue",a,{passive:n.modelValue===void 0}),l=bt(n,"max",a,{passive:n.max===void 0});Ie(()=>r.value,async s=>{const i=iS(s,n.max);i!==s&&(await Ue(),r.value=i)},{immediate:!0}),Ie(()=>n.max,s=>{const i=uS(n.max);i!==s&&(l.value=i)},{immediate:!0});const o=k(()=>fn(r.value)?"indeterminate":r.value===l.value?"complete":"loading");return sS({modelValue:r,max:l,progressState:o}),(s,i)=>(v(),H(u(Ke),{"as-child":s.asChild,as:s.as,"aria-valuemax":u(l),"aria-valuemin":0,"aria-valuenow":Oo(u(r))?u(r):void 0,"aria-valuetext":s.getValueText?.(u(r),u(l)),"aria-label":s.getValueLabel(u(r),u(l)),role:"progressbar","data-state":o.value,"data-value":u(r)??void 0,"data-max":u(l)},{default:F(()=>[fe(s.$slots,"default",{modelValue:u(r)})]),_:3},8,["as-child","as","aria-valuemax","aria-valuenow","aria-valuetext","aria-label","data-state","data-value","data-max"]))}}),mi=cS,dS=Z({__name:"ProgressIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=oS();return He(),(a,r)=>(v(),H(u(Ke),Ne(t,{"data-state":u(n).progressState.value,"data-value":u(n).modelValue?.value??void 0,"data-max":u(n).max.value}),{default:F(()=>[fe(a.$slots,"default")]),_:3},16,["data-state","data-value","data-max"]))}}),yi=dS;const[fS,pS]=xt("TimeFieldRoot");function Kl(e,t=$l(an())){return e&&"day"in e?e:mn(t,e)}var hS=Z({inheritAttrs:!1,__name:"TimeFieldRoot",props:{defaultValue:{type:Object,required:!1,default:void 0},defaultPlaceholder:{type:Object,required:!1},placeholder:{type:Object,required:!1,default:void 0},modelValue:{type:[Object,null],required:!1},hourCycle:{type:null,required:!1},step:{type:Object,required:!1},stepSnapping:{type:Boolean,required:!1,default:!1},granularity:{type:String,required:!1},hideTimeZone:{type:Boolean,required:!1},maxValue:{type:Object,required:!1},minValue:{type:Object,required:!1},locale:{type:String,required:!1},disabled:{type:Boolean,required:!1,default:!1},readonly:{type:Boolean,required:!1,default:!1},id:{type:String,required:!1},dir:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","update:placeholder"],setup(e,{expose:t,emit:n}){const a=e,r=n,{disabled:l,readonly:o,granularity:s,defaultValue:i,minValue:c,maxValue:d,stepSnapping:f,dir:p,locale:h}=Bt(a),m=vs(h),x=Ia(p),g=tc(m.value,{hourCycle:dl(a.hourCycle)}),{primitiveElement:y,currentElement:w}=yr(),C=M(new Set),A=k(()=>Cv(a)),L=k(()=>c.value?Kl(c.value):void 0),Y=k(()=>d.value?Kl(d.value):void 0);_t(()=>{Mf(w.value).forEach(ce=>C.value.add(ce))});const z=bt(a,"modelValue",r,{defaultValue:i.value,passive:a.modelValue===void 0}),j=k({get(){return fn(z.value)?z.value:Kl(z.value)},set(ce){return ce?z.value=z.value&&"day"in z.value?ce:new vr(ce.hour,ce.minute,ce.second,z.value?.millisecond):z.value=ce,ce}}),b=Zx({defaultPlaceholder:a.placeholder,defaultValue:z.value}),E=bt(a,"placeholder",r,{defaultValue:a.defaultPlaceholder??b.copy(),passive:a.placeholder===void 0}),V=k({get(){return Kl(E.value)},set(ce){return ce&&(E.value="day"in E.value?ce.copy():new vr(ce.hour,ce.minute,ce.second,E.value?.millisecond)),ce}}),T=k(()=>s.value?s.value:"minute"),K=k(()=>z.value?!!(L.value&&aa(j.value,L.value)||Y.value&&aa(Y.value,j.value)):!1),re=C$(T.value),U=M(z.value?{...ou({value:j.value,formatter:g})}:{...re}),ae=k(()=>nm({granularity:T.value,dateRef:V.value,formatter:g,hideTimeZone:a.hideTimeZone,hourCycle:a.hourCycle,segmentValues:U.value,locale:m,isTimeValue:!0})),Q=k(()=>{const ce=ae.value.arr;return a.hourCycle===12?ce.map(B=>{if(B.part==="hour"&&"hour"in U.value){const G=U.value.hour;if(G!==null){const q=G===0?12:G>12?G-12:G;return{...B,value:q.toString()}}}return B}):ce}),se=k(()=>Q.value.filter(({part:ce})=>ce!=="literal"));Ie(m,ce=>{g.getLocale()!==ce&&(g.setLocale(ce),Ue(()=>{C.value.clear(),Mf(w.value).forEach(B=>C.value.add(B))}))}),Ie(j,ce=>{!fn(ce)&&(!ar(V.value,ce)||V.value.compare(ce)!==0)&&(E.value=ce.copy())}),Ie([j,m],([ce])=>{fn(ce)?Object.values(U.value).every(B=>B!==null)&&fn(ce)&&(U.value={...re}):U.value={...ou({value:ce,formatter:g})}});const ne=M(null),ie=k(()=>Array.from(C.value).findIndex(ce=>ce.getAttribute("data-reka-time-field-segment")===ne.value?.getAttribute("data-reka-time-field-segment"))),de=k(()=>{const ce=x.value==="rtl"?-1:1;return(ce<0?ie.value<0:ie.value>C.value.size-1)?null:Array.from(C.value)[ie.value+ce]}),$e=k(()=>{const ce=x.value==="rtl"?-1:1;return(ce>0?ie.value<0:ie.value>C.value.size-1)?null:Array.from(C.value)[ie.value-ce]}),Ce=wr();function ue(ce){ce.isComposing||$n(ce.key)&&(ce.key===Ce.ARROW_LEFT&&$e.value?.focus(),ce.key===Ce.ARROW_RIGHT&&de.value?.focus())}function Te(ce){ne.value=ce}return pS({locale:m,modelValue:j,placeholder:V,disabled:l,formatter:g,hourCycle:a.hourCycle,step:A,stepSnapping:f,readonly:o,segmentValues:U,isInvalid:K,segmentContents:se,elements:C,setFocusedElement:Te,focusNext(){de.value?.focus()}}),t({setFocusedElement:Te}),(ce,B)=>(v(),H(u(Ke),Ne(ce.$attrs,{ref_key:"primitiveElement",ref:y,role:"group","aria-disabled":u(l)?!0:void 0,"data-disabled":u(l)?"":void 0,"data-readonly":u(o)?"":void 0,"data-invalid":K.value?"":void 0,dir:u(x),onKeydown:ur(ue,["left","right"])}),{default:F(()=>[fe(ce.$slots,"default",{modelValue:u(z),segments:Q.value,isInvalid:K.value}),W(u(Bv),{id:ce.id,as:"input",feature:"focusable",tabindex:"-1",value:u(z)?u(z).toString():"",name:ce.name,disabled:u(l),required:ce.required,onFocus:B[0]||(B[0]=G=>Array.from(C.value)?.[0]?.focus())},null,8,["id","value","name","disabled","required"])]),_:3},16,["aria-disabled","data-disabled","data-readonly","data-invalid","dir"]))}}),vS=hS,mS=Z({__name:"TimeFieldInput",props:{part:{type:null,required:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,n=fS(),a=M(!0),r=M(!1),{handleSegmentClick:l,handleSegmentKeydown:o,handleSegmentBeforeInput:s,handleSegmentCompositionStart:i,handleSegmentCompositionEnd:c,handleSegmentFocusOut:d,attributes:f}=am({hasLeftFocus:a,lastKeyZero:r,placeholder:n.placeholder,hourCycle:n.hourCycle,step:n.step,stepSnapping:n.stepSnapping,segmentValues:n.segmentValues,formatter:n.formatter,part:t.part,disabled:n.disabled,readonly:n.readonly,focusNext:n.focusNext,modelValue:n.modelValue}),p=k(()=>n.disabled.value),h=k(()=>n.readonly.value),m=k(()=>n.isInvalid.value);return(x,g)=>(v(),H(u(Ke),Ne({as:x.as,"as-child":x.asChild},u(f),{contenteditable:p.value||h.value?!1:x.part!=="literal","data-reka-time-field-segment":x.part,"aria-disabled":p.value?!0:void 0,"aria-readonly":h.value?!0:void 0,"data-disabled":p.value?"":void 0,"data-invalid":m.value?"":void 0,"aria-invalid":m.value?!0:void 0},Ip(x.part!=="literal"?{mousedown:u(l),keydown:u(o),beforeinput:u(s),compositionstart:u(i),compositionend:u(c),focusout:()=>{a.value=!0,u(d)()},focusin:y=>{u(n).setFocusedElement(y.target)}}:{})),{default:F(()=>[fe(x.$slots,"default")]),_:3},16,["as","as-child","contenteditable","data-reka-time-field-segment","aria-disabled","aria-readonly","data-disabled","data-invalid","aria-invalid"]))}}),yS=mS;const Po=M(null),im=M(null);let el=null;function um(e){cm(),im.value=e,!(e===null||e<=0)&&(el=setTimeout(()=>{el=null,Mu()},e*800))}function cm(){el!==null&&(clearTimeout(el),el=null)}e_(um);const Ja=Tt(Po);async function gS(e,t){const{data:n,response:a}=await Re.POST("/auth/login",{body:{login:e,password:t}});return!a.ok||!n?!1:(um(typeof n.data.expires_in=="number"?n.data.expires_in:null),!0)}async function dm(){const{data:e,response:t}=await Re.GET("/auth/me");return Po.value=t.ok&&e?e.data:null,Po.value}function fm(){cm(),Po.value=null,im.value=null}async function bS(e){try{await Re.POST("/auth/logout")}catch{}finally{fm(),i_([]),d_([])}e&&await e.replace({name:"login"}).catch(()=>{})}const _S={class:"flex size-[34px] shrink-0 items-center justify-center rounded-full bg-accent text-[13px] font-bold text-on-accent","aria-hidden":"true","data-user-initials":""},xS={class:"flex flex-col leading-tight max-[1099px]:hidden","data-user-identity":""},wS={class:"font-semibold"},kS={key:0,class:"text-[12px] text-muted","data-user-role":""},$S={class:"flex items-center gap-3 px-2 py-2"},CS={class:"flex size-10 shrink-0 items-center justify-center rounded-full bg-accent text-[14px] font-bold text-on-accent","aria-hidden":"true"},SS={class:"flex min-w-0 flex-col leading-tight"},ES={class:"truncate font-bold"},AS={class:"truncate text-[13px] text-muted"},DS=Z({__name:"UserMenu",setup(e){const t=_l(),n=k(()=>{const o=Ja.value;if(!o)return"";const s=`${o.first_name} ${o.last_name}`.trim();return s===""?o.login:s}),a=k(()=>{const o=Ja.value;if(!o)return"";const s=[o.first_name,o.last_name].map(i=>i.trim()).filter(Boolean);return s.length>0?s.slice(0,2).map(i=>i.charAt(0).toUpperCase()).join(""):o.login.slice(0,2).toUpperCase()}),r=k(()=>Ja.value?.role?.name??"");async function l(){await bS(t)}return(o,s)=>(v(),H(u(YC),{modal:!1},{default:F(()=>[W(u(lS),{"data-user-menu":"",disabled:!u(Ja),"aria-label":`${u(D)("backend::lang.nav.user_menu")}: ${n.value}`,class:"flex h-input items-center gap-2.5 rounded-inner px-2 text-left transition-colors duration-150 ease-out hover:bg-hover"},{default:F(()=>[P("span",_S,I(a.value),1),P("span",xS,[P("span",wS,I(n.value),1),r.value?(v(),S("span",kS,I(r.value),1)):le("",!0)]),W(u(ts),{size:16,class:"text-muted","aria-hidden":"true"})]),_:1},8,["disabled","aria-label"]),W(u(tS),null,{default:F(()=>[W(u(ZC),{"data-user-menu-content":"",align:"end","side-offset":8,class:"z-50 flex w-[280px] flex-col rounded-[14px] border border-border bg-surface p-2 text-text shadow-menu"},{default:F(()=>[P("div",$S,[P("span",CS,I(a.value),1),P("span",SS,[P("span",ES,I(n.value),1),P("span",AS,I(u(Ja)?.email),1)])]),W(u(aS),{class:"my-1 h-px bg-border"}),W(u(XC),{"data-action":"logout",class:"flex h-10 cursor-pointer items-center gap-2.5 rounded-control px-3 font-medium outline-none transition-colors duration-150 ease-out data-[highlighted]:bg-hover",onSelect:l},{default:F(()=>[W(u(Eh),{size:18,"aria-hidden":"true"}),P("span",null,I(u(D)("backend::lang.auth.logout")),1)]),_:1})]),_:1})]),_:1})]),_:1}))}}),OS=4e3,ml=M([]),su=new Map;let PS=1;const MS=Tt(ml);function Be(e,t="success"){const n=PS++;return ml.value=[{id:n,text:e,tone:t},...ml.value],su.set(n,setTimeout(()=>pm(n),OS)),n}function pm(e){const t=su.get(e);t!==void 0&&(clearTimeout(t),su.delete(e)),ml.value=ml.value.filter(n=>n.id!==e)}const TS=["role","data-tone"],RS={class:"font-medium"},qS=["aria-label","onClick"],IS=Z({__name:"Toast",setup(e){return(t,n)=>(v(),H(nb,{tag:"div",name:"toast",class:"pointer-events-none fixed inset-x-0 bottom-[88px] z-50 flex flex-col items-center gap-2 px-4"},{default:F(()=>[(v(!0),S(xe,null,Ve(u(MS),a=>(v(),S("div",{key:a.id,role:a.tone==="danger"?"alert":"status","data-tone":a.tone,class:"pointer-events-auto flex max-w-[560px] items-center gap-3 rounded-[14px] bg-[#1d2740] py-3 pr-2.5 pl-3.5 text-white shadow-toast"},[P("span",{class:_e([a.tone==="danger"?"bg-[#f58a8a] text-[#1d2740]":"bg-accent text-on-accent","flex size-[26px] shrink-0 items-center justify-center rounded-full"]),"aria-hidden":"true"},[a.tone==="danger"?(v(),H(u(Ut),{key:0,size:16})):(v(),H(u(fr),{key:1,size:16}))],2),P("span",RS,I(a.text),1),P("button",{type:"button","aria-label":u(D)("backend::lang.form.close"),class:"flex size-8 items-center justify-center rounded-pager text-[#c3cbda] transition-colors duration-150 ease-out hover:bg-side-hover hover:text-white",onClick:r=>u(pm)(a.id)},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,qS)],8,TS))),128))]),_:1}))}}),FS={class:"flex min-h-screen bg-bg text-text"},BS={class:"flex min-w-0 flex-1 flex-col"},NS={class:"flex h-header shrink-0 items-center justify-between gap-4 border-b border-border bg-surface pr-6 pl-8"},VS={class:"min-w-0 flex-1 px-8 py-7"},LS=Z({__name:"AppShell",setup(e){const t=_n(),{collapsed:n,watchViewport:a}=Hh(),r=a();Nt(r);const l=k(()=>us(String(t.params.vendor??""),String(t.params.plugin??"")));return(o,s)=>(v(),S("div",FS,[W(k_),l.value&&!u(n)?(v(),H(A_,{key:0,entry:l.value},null,8,["entry"])):le("",!0),P("div",BS,[P("header",NS,[W(R_),W(DS)]),P("main",VS,[fe(o.$slots,"default")])]),W(IS)]))}}),jS=Z({__name:"App",setup(e){const t=_n(),n=k(()=>t.meta.shell===!0);return(a,r)=>n.value?(v(),H(LS,{key:0},{default:F(()=>[W(u(ji),null,{default:F(({Component:l,route:o})=>[(v(),H(Bn(l),{key:o.path}))]),_:1})]),_:1})):(v(),H(u(ji),{key:1}))}}),US="data-summer-controller",gi=new Map,iu=new Map;let uu="";function hm(){return`${ls.base}/assets/`}function vm(e){if(!e.startsWith(hm())||e.includes("\\"))return!1;for(const n of e){const a=n.codePointAt(0)??0;if(a<=32||a===127)return!1}return!(e.split(/[?#]/,1)[0]??"").split("/").some(n=>{const a=n.toLowerCase().replaceAll("%2e",".");return a==="."||a===".."})}function zS(e){if(!vm(e))return Promise.reject(new Error(`plugin script outside ${hm()}: ${e}`));const t=gi.get(e);if(t)return t;const n=new Promise((a,r)=>{const l=document.createElement("script");l.type="module",l.addEventListener("load",()=>a(),{once:!0}),l.addEventListener("error",()=>{gi.delete(e),l.remove(),r(new Error(`plugin script failed to load: ${e}`))},{once:!0}),l.src=e,document.head.appendChild(l)});return gi.set(e,n),n}function HS(e,t){for(const n of t){const a=`${e} -${n}`;if(!vm(n)||iu.has(a))continue;const r=document.createElement("link");r.rel="stylesheet",r.setAttribute(US,e),r.disabled=e!==uu,r.href=n,iu.set(a,{owner:e,link:r}),document.head.appendChild(r)}}function WS(e){uu=e;for(const{owner:t,link:n}of iu.values())n.disabled=t!==uu}async function mm(e,t){HS(e,t?.styles??[]);const n=t?.scripts??[],a=await Promise.allSettled(n.map(r=>zS(r)));return n.filter((r,l)=>a[l]?.status==="rejected")}const KS={class:"flex min-h-screen items-center justify-center px-4",style:{background:"radial-gradient(ellipse at 50% 35%, #2b3a5c 0%, #1d2740 60%)"}},GS={class:"flex w-full max-w-[400px] flex-col gap-6"},YS={class:"flex items-center justify-center gap-3"},JS={class:"flex size-[34px] items-center justify-center rounded-full bg-accent-soft"},ZS={class:"text-[22px] font-bold tracking-[-0.02em]"},QS={class:"flex flex-col gap-1.5"},XS={class:"font-semibold"},eE={class:"flex flex-col gap-1.5"},tE={class:"font-semibold"},nE=["aria-invalid"],aE={key:0,role:"alert",class:"flex items-center gap-2.5 rounded-control bg-[#fdf0f0] px-3.5 py-3 text-[#c62828]"},rE=["disabled"],lE=Z({__name:"LoginView",setup(e){const t=_n(),n=_l(),a=M(""),r=M(""),l=M(!1),o=M(!1);async function s(){if(!o.value){o.value=!0,l.value=!1;try{if(!await gS(a.value.trim(),r.value)||!await dm()){l.value=!0;return}r.value="",await Promise.all([Vh(),Lh().catch(()=>[])]),await n.replace(Tm(t.query.redirect)??"/")}finally{o.value=!1}}}return(i,c)=>(v(),S("main",KS,[P("div",GS,[P("div",YS,[P("span",JS,[W(u(Pu),{size:20,class:"text-accent","aria-hidden":"true"})]),c[2]||(c[2]=P("span",{class:"text-[18px] font-bold text-white"},[we("Summer"),P("span",{class:"text-accent"},"CMS")],-1))]),P("form",{class:"flex flex-col gap-[18px] rounded-card bg-white p-8 text-[#141b2d] shadow-login",novalidate:"",onSubmit:ht(s,["prevent"])},[P("h1",ZS,I(u(D)("backend::lang.auth.title")),1),P("label",QS,[P("span",XS,I(u(D)("backend::lang.auth.login")),1),Oa(P("input",{"onUpdate:modelValue":c[0]||(c[0]=d=>a.value=d),name:"login",type:"text",autocomplete:"username",required:"",class:"h-input rounded-control border border-[#d2d8e2] bg-white px-3.5"},null,512),[[yo,a.value]])]),P("label",eE,[P("span",tE,I(u(D)("backend::lang.auth.password")),1),Oa(P("input",{"onUpdate:modelValue":c[1]||(c[1]=d=>r.value=d),name:"password",type:"password",autocomplete:"current-password",required:"","aria-invalid":l.value?"true":void 0,class:_e([l.value?"border-[#c62828]":"border-[#d2d8e2]","h-input rounded-control border bg-white px-3.5"])},null,10,nE),[[yo,r.value]])]),l.value?(v(),S("div",aE,[W(u(Ut),{size:18,"aria-hidden":"true"}),P("span",null,I(u(D)("backend::lang.auth.invalid")),1)])):le("",!0),P("button",{type:"submit",disabled:o.value,class:"h-input rounded-control bg-[#22304d] font-semibold text-white disabled:opacity-60"},I(u(D)("backend::lang.auth.submit")),9,rE)],32)])]))}}),oE=/^filter\[(.+)\]$/,sE=/^[1-9]\d*$/;function Ua(e){const t=Array.isArray(e)?e[e.length-1]:e;return typeof t=="string"?t:""}function Rf(e){return sE.test(e)?Number(e):void 0}function iE(e){const t={},n=Ua(e.search).trim();n!==""&&(t.search=n);const a=Ua(e.sort).trim();if(a!==""){t.sort=a;const s=Ua(e.dir);t.dir=s==="desc"?"desc":"asc"}const r=Rf(Ua(e.page));r!==void 0&&(t.page=r);const l=Rf(Ua(e.per_page));l!==void 0&&(t.per_page=l);const o={};for(const s of Object.keys(e).sort()){const i=oE.exec(s)?.[1],c=Ua(e[s]);i&&c!==""&&(o[i]=c)}return Object.keys(o).length>0&&(t.filter=o),t}function ym(e){const t={};e.search&&(t.search=e.search),e.sort&&(t.sort=e.sort,t.dir=e.dir==="desc"?"desc":"asc"),e.page!==void 0&&e.page>1&&(t.page=String(e.page)),e.per_page!==void 0&&(t.per_page=String(e.per_page));for(const n of Object.keys(e.filter??{}).sort()){const a=e.filter?.[n];a!==void 0&&a!==""&&(t[`filter[${n}]`]=a)}return t}function uE(e){return JSON.stringify(ym(e))}const cE=/^\d+$/;function gm(e,t,n){const a=is(t),r=ua(t);if(!a||!r)return"/";const o=((e??"").trim().split(/[?#]/,1)[0]??"").split("/").filter(d=>d!==""),s=[a.vendor,a.plugin,a.controller];if(!s.every((d,f)=>o[f]?.toLowerCase()===d.toLowerCase()))return r;const c=o.slice(s.length);if(c.length===0)return r;if(c.length===1&&c[0]==="create")return`${r}/create`;if(c.length===2&&c[0]==="update"){const d=c[1]===":id"?String(n??""):c[1]??"";return cE.test(d)?`${r}/${d}`:r}return r}const dE={key:0,"data-switch":"true",class:"inline-flex h-6 items-center gap-1 rounded-pill bg-ok-bg px-2.5 text-[12px] font-semibold text-ok-text"},fE={key:1,"data-switch":"false",class:"inline-flex h-6 items-center rounded-pill border border-border-strong px-2.5 text-[12px] font-semibold text-muted"},pE={key:1,class:"text-muted","data-empty":""},hE={key:2,class:"text-[13px] text-muted tabular-nums"},Gl=Z({__name:"CellValue",props:{column:{},value:{}},setup(e){const t=e;function n(f){return f==null||f===""}function a(f){return n(f)?"":Array.isArray(f)?f.map(a).filter(p=>p!=="").join(", "):typeof f=="boolean"?D(f?"backend::lang.list.column_switch_true":"backend::lang.list.column_switch_false"):typeof f=="object"?"":String(f)}function r(f){return String(f).padStart(2,"0")}function l(f){if(typeof f!="string"&&typeof f!="number")return"";const p=new Date(f);return Number.isNaN(p.getTime())?String(f):`${p.getFullYear()}-${r(p.getMonth()+1)}-${r(p.getDate())} ${r(p.getHours())}:${r(p.getMinutes())}`}function o(f){if(typeof f!="string")return"";const p=/^\d{4}-\d{2}-\d{2}/.exec(f.trim());return p?p[0]:f.trim()}function s(f){if(typeof f!="string")return"";const p=/(\d{2}):(\d{2})/.exec(f);return p?`${p[1]}:${p[2]}`:f.trim()}function i(f){return typeof f=="string"?f!==""&&f!=="0"&&f.toLowerCase()!=="false":!!f}const c=k(()=>t.column.type==="switch"?"switch":t.column.type==="datetime"?"datetime":t.column.type==="date"?"date":t.column.type==="time"?"time":"text"),d=k(()=>{switch(c.value){case"datetime":return l(t.value);case"date":return o(t.value);case"time":return s(t.value);default:return a(t.value)}});return(f,p)=>c.value==="switch"&&!n(e.value)?(v(),S(xe,{key:0},[i(e.value)?(v(),S("span",dE,[W(u(Ch),{size:14,"aria-hidden":"true"}),we(I(u(D)("backend::lang.list.column_switch_true")),1)])):(v(),S("span",fE,I(u(D)("backend::lang.list.column_switch_false")),1))],64)):d.value===""?(v(),S("span",pE,"—")):c.value==="datetime"||c.value==="date"||c.value==="time"?(v(),S("span",hE,I(d.value),1)):(v(),S(xe,{key:3},[we(I(d.value),1)],64))}}),vE={class:"overflow-x-auto"},mE={class:"sticky top-0 z-10"},yE={class:"h-row-head border-y border-border bg-subtle"},gE={key:0,scope:"col","data-select":"",class:"w-[52px] pl-5"},bE=["aria-checked","aria-label","disabled"],_E=["aria-sort"],xE=["data-sort","onClick"],wE={key:1,class:"w-[56px] pr-5"},kE=["aria-busy"],$E={key:0,class:"pl-5"},CE={key:1,class:"pr-5"},SE={key:1},EE=["colspan"],AE={class:"text-muted"},DE=["aria-selected","onClick"],OE={key:0,"data-select":"",class:"pl-5"},PE=["aria-checked","aria-label","onClick"],ME={key:0,class:"flex items-center gap-3"},TE={"data-avatar":"",class:"flex size-[30px] shrink-0 items-center justify-center rounded-full bg-subtle text-[12px] font-bold text-text","aria-hidden":"true"},RE=["onClick"],qE={key:1,"data-trailing":"",class:"w-[56px] pr-5"},bm=Z({__name:"DataTable",props:{columns:{},rows:{},loading:{type:Boolean,default:!1},rowLink:{type:Function,default:void 0},selectable:{type:Boolean,default:!1},selected:{default:()=>[]},sortable:{type:Boolean,default:!1},sort:{default:null},variant:{default:"list"},openable:{type:Boolean,default:!1},trailing:{type:Boolean,default:!1}},emits:["update:selected","sort","open"],setup(e,{emit:t}){const n=e,a=t,r=_l();function l(b){const E=b.id;return typeof E=="number"||typeof E=="string"?E:null}function o(b,E){const V=l(b);return V===null?`row-${E}`:String(V)}function s(b){return n.rowLink?n.rowLink(b):null}function i(b,E){if(b.target?.closest("a, button, input, label, select"))return;if(n.openable){const K=b.currentTarget?.querySelector("[data-row-open]")??null;a("open",E,K);return}const T=s(E);T&&r.push(T)}const c=k(()=>n.rows.map(l).filter(b=>b!==null)),d=k(()=>new Set(n.selected.map(String))),f=k(()=>{const b=c.value,E=b.filter(V=>d.value.has(String(V))).length;return E===0?"false":E===b.length?"true":"mixed"});function p(b){const E=l(b);return E!==null&&d.value.has(String(E))}function h(){a("update:selected",f.value==="true"?[]:[...c.value])}function m(b){const E=l(b);E!==null&&(d.value.has(String(E))?a("update:selected",n.selected.filter(V=>String(V)!==String(E))):a("update:selected",[...n.selected,E]))}function x(b){if(n.sort?.column===b.key)return n.sort.dir==="desc"?"descending":"ascending"}function g(b){return n.sortable&&b.sortable}const y=k(()=>n.variant==="relation"),w=k(()=>y.value?"h-[56px]":"h-row"),C=k(()=>y.value?3:8);function A(b){return(typeof b=="string"||typeof b=="number"?String(b):"").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(V=>V.charAt(0).toUpperCase()).join("")}function L(b,E){return E===0?"font-semibold":y.value||b.relation?"text-muted":""}const Y=k(()=>Math.max(n.columns.length+(n.selectable?1:0)+(n.trailing?1:0),1));function z(b,E){a("open",E,b.currentTarget)}const j=["w-3/5","w-2/5","w-1/2","w-3/4","w-1/3","w-2/3","w-1/2","w-2/5"];return(b,E)=>(v(),S("div",vE,[P("table",{class:_e([y.value?"min-w-[480px]":"min-w-[640px]","w-full border-collapse text-left"])},[P("thead",mE,[P("tr",yE,[e.selectable?(v(),S("th",gE,[P("button",{type:"button",role:"checkbox","aria-checked":f.value,"aria-label":u(D)("backend::lang.list.select_all"),disabled:e.loading||c.value.length===0,class:_e([f.value==="false"?"border-border-strong bg-surface":"border-primary bg-primary text-on-primary","flex size-[18px] items-center justify-center rounded-checkbox border disabled:opacity-60"]),onClick:h},[f.value==="mixed"?(v(),H(u(Ah),{key:0,size:14,"aria-hidden":"true"})):f.value==="true"?(v(),H(u(fr),{key:1,size:14,"aria-hidden":"true"})):le("",!0)],10,bE)])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,V=>(v(),S("th",{key:V.key,scope:"col","aria-sort":g(V)?x(V)??"none":void 0,class:_e([x(V)?"text-text":"text-muted","px-3.5 text-[12px] font-semibold first:pl-5 last:pr-5"])},[g(V)?(v(),S("button",{key:0,type:"button","data-sort":V.key,class:"inline-flex items-center gap-1 font-semibold",onClick:T=>a("sort",V.key)},[we(I(V.label)+" ",1),x(V)==="ascending"?(v(),H(u(Sh),{key:0,size:14,"aria-hidden":"true"})):x(V)==="descending"?(v(),H(u($h),{key:1,size:14,"aria-hidden":"true"})):le("",!0)],8,xE)):(v(),S(xe,{key:1},[we(I(V.label),1)],64))],10,_E))),128)),e.trailing?(v(),S("td",wE)):le("",!0)])]),P("tbody",{"aria-busy":e.loading?"true":void 0},[e.loading?(v(!0),S(xe,{key:0},Ve(C.value,V=>(v(),S("tr",{key:`skeleton-${V}`,"data-skeleton":"",class:_e([w.value,"border-b border-border"])},[e.selectable?(v(),S("td",$E,[...E[0]||(E[0]=[P("span",{class:"block size-[18px] rounded-checkbox bg-skel"},null,-1)])])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,T=>(v(),S("td",{key:T.key,class:"px-3.5 first:pl-5 last:pr-5"},[P("span",{class:_e([j[(V-1)%j.length],"block h-3 rounded-[6px] bg-skel"])},null,2)]))),128)),e.trailing?(v(),S("td",CE)):le("",!0)],2))),128)):e.rows.length===0?(v(),S("tr",SE,[P("td",{colspan:Y.value,class:"px-5 py-20 text-center"},[fe(b.$slots,"empty",{},()=>[P("span",AE,I(u(D)("backend::lang.list.no_records")),1)])],8,EE)])):(v(!0),S(xe,{key:2},Ve(e.rows,(V,T)=>(v(),S("tr",{key:o(V,T),class:_e([[w.value,p(V)?"bg-sel":s(V)||e.openable?"hover:bg-hover":"",s(V)||e.openable?"cursor-pointer":""],"border-b border-border transition-colors duration-150 ease-out"]),"aria-selected":e.selectable?p(V)?"true":"false":void 0,onClick:K=>i(K,V)},[e.selectable?(v(),S("td",OE,[P("button",{type:"button",role:"checkbox","aria-checked":p(V)?"true":"false","aria-label":u(D)("backend::lang.list.select_row"),class:_e([p(V)?"border-primary bg-primary text-on-primary":"border-border-strong bg-surface","flex size-[18px] items-center justify-center rounded-checkbox border"]),onClick:K=>m(V)},[p(V)?(v(),H(u(fr),{key:0,size:14,"aria-hidden":"true"})):le("",!0)],10,PE)])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,(K,re)=>(v(),S("td",{key:K.key,class:_e([L(K,re),"px-3.5 first:pl-5 last:pr-5"])},[y.value&&re===0?(v(),S("span",ME,[P("span",TE,I(A(V[K.key])),1),e.openable?(v(),S("button",{key:0,type:"button","data-row-open":"",class:"min-w-0 truncate text-left font-semibold text-text",onClick:U=>z(U,V)},[W(Gl,{column:K,value:V[K.key]},null,8,["column","value"])],8,RE)):(v(),H(Gl,{key:1,column:K,value:V[K.key]},null,8,["column","value"]))])):re===0&&s(V)?(v(),H(u(Nn),{key:1,to:s(V),class:"text-text no-underline"},{default:F(()=>[W(Gl,{column:K,value:V[K.key]},null,8,["column","value"])]),_:2},1032,["to"])):(v(),H(Gl,{key:2,column:K,value:V[K.key]},null,8,["column","value"]))],2))),128)),e.trailing?(v(),S("td",qE,[fe(b.$slots,"trailing",{row:V})])):le("",!0)],10,DE))),128))],8,kE)],2)]))}}),IE=["aria-label"],FE={key:0,class:"flex flex-col gap-1 text-[13px]"},BE={class:"font-semibold text-muted"},NE=["data-filter","value","onChange"],VE=["value"],LE={key:1,class:"flex flex-col gap-1 text-[13px]"},jE={class:"mb-1 font-semibold text-muted"},UE={class:"flex items-center gap-2"},zE=["data-filter","aria-label","value","onChange"],HE=["data-filter","aria-label","value","onChange"],WE={key:2,class:"flex flex-col gap-1 text-[13px]"},KE={class:"font-semibold text-muted"},GE=["data-filter","value","onChange"],YE=["value"],qr="",Yl="h-button rounded-control border border-border-strong bg-surface px-3 text-text",JE=Z({__name:"FilterBar",props:{filters:{},values:{},source:{}},emits:["update"],setup(e,{emit:t}){const n=e,a=t;function r(f){if(f.options&&f.options.length>0)return f.options.map(h=>({value:JSON.stringify(h.value),label:h.label}));const p=[];return f.trueValue!==void 0&&p.push({value:JSON.stringify(f.trueValue),label:D("backend::lang.list.column_switch_true")}),f.falseValue!==void 0&&p.push({value:JSON.stringify(f.falseValue),label:D("backend::lang.list.column_switch_false")}),p}const l=M({});async function o(f){const{data:p}=await Re.GET("/{vendor}/{plugin}/{controller}/filters/{scope}/options",{params:{path:{...n.source,scope:f.name}}});l.value={...l.value,[f.name]:p?.data??[]}}_t(()=>{for(const f of n.filters)f.type==="scope"&&o(f)});const s=Qt({});function i(){for(const f of n.filters){if(f.type!=="daterange")continue;const[p="",h=""]=(n.values[f.name]??"").split(".."),m=s[f.name];(!m||n.values[f.name]!==void 0||m.from!==""&&m.to!=="")&&(s[f.name]={from:p,to:h})}}Ie(()=>n.values,i,{immediate:!0,deep:!0});function c(f,p,h){const m={...s[f.name]??{from:"",to:""},[p]:h};s[f.name]=m,m.from!==""&&m.to!==""?a("update",f.name,`${m.from}..${m.to}`):(m.from===""&&m.to===""||n.values[f.name]!==void 0)&&a("update",f.name,null)}function d(f,p){a("update",f.name,p===qr?null:p)}return(f,p)=>(v(),S("div",{role:"group","aria-label":u(D)("backend::lang.list.filters"),"data-filter-bar":"",class:"flex flex-wrap items-end gap-4 border-t border-border px-5 py-3.5"},[(v(!0),S(xe,null,Ve(e.filters,h=>(v(),S(xe,{key:h.name},[h.type==="switch"?(v(),S("label",FE,[P("span",BE,I(h.label||h.name),1),P("select",{"data-filter":h.name,value:e.values[h.name]??qr,class:_e(Yl),onChange:m=>d(h,m.target.value)},[P("option",{value:qr},I(u(D)("backend::lang.list.filter_all")),1),(v(!0),S(xe,null,Ve(r(h),m=>(v(),S("option",{key:m.value,value:m.value},I(m.label),9,VE))),128))],40,NE)])):h.type==="daterange"?(v(),S("fieldset",LE,[P("legend",jE,I(h.label||h.name),1),P("div",UE,[P("input",{type:"date","data-filter":`${h.name}-from`,"aria-label":u(D)("backend::lang.list.filter_from"),value:s[h.name]?.from??"",class:_e(Yl),onChange:m=>c(h,"from",m.target.value)},null,40,zE),p[0]||(p[0]=P("span",{"aria-hidden":"true"},"–",-1)),P("input",{type:"date","data-filter":`${h.name}-to`,"aria-label":u(D)("backend::lang.list.filter_to"),value:s[h.name]?.to??"",class:_e(Yl),onChange:m=>c(h,"to",m.target.value)},null,40,HE)])])):h.type==="scope"?(v(),S("label",WE,[P("span",KE,I(h.label||h.name),1),(v(),S("select",{key:`${h.name}-${l.value[h.name]?.length??-1}`,"data-filter":h.name,value:e.values[h.name]??qr,class:_e(Yl),onChange:m=>d(h,m.target.value)},[P("option",{value:qr},I(u(D)("backend::lang.list.filter_all")),1),(v(!0),S(xe,null,Ve(l.value[h.name]??[],m=>(v(),S("option",{key:m.value,value:m.value},I(m.label),9,YE))),128))],40,GE))])):le("",!0)],64))),128))],8,IE))}}),ZE=["type","disabled"],lt=Z({__name:"Button",props:{variant:{default:"outline"},size:{default:"md"},type:{default:"button"},disabled:{type:Boolean,default:!1},icon:{default:void 0},to:{default:void 0}},setup(e){const t=e,n={primary:"bg-primary text-on-primary hover:opacity-90",outline:"border border-border-strong bg-surface text-text hover:bg-hover",ghost:"text-muted hover:bg-hover hover:text-text",danger:"border border-danger bg-surface text-danger hover:bg-danger-soft"},a=k(()=>["inline-flex shrink-0 items-center justify-center gap-2 rounded-control px-4 font-semibold whitespace-nowrap no-underline transition-colors duration-150 ease-out disabled:cursor-not-allowed disabled:opacity-60",t.size==="sm"?"h-[38px]":"h-button",n[t.variant]]);return(r,l)=>e.to!==void 0?(v(),H(u(Nn),{key:0,to:e.to,class:_e(a.value)},{default:F(()=>[e.icon?(v(),H(Bn(e.icon),{key:0,size:16,"aria-hidden":"true"})):le("",!0),fe(r.$slots,"default")]),_:3},8,["to","class"])):(v(),S("button",{key:1,type:e.type,disabled:e.disabled,class:_e(a.value)},[e.icon?(v(),H(Bn(e.icon),{key:0,size:16,"aria-hidden":"true"})):le("",!0),fe(r.$slots,"default")],10,ZE))}}),QE={class:"flex flex-wrap items-center justify-between gap-3 px-5 py-4"},XE={key:0,class:"relative block w-[320px] max-w-full"},e3={class:"sr-only"},t3=["value","placeholder"],n3={key:1},a3={class:"flex items-center gap-2.5"},r3={key:0,"data-selected-pill":"",class:"inline-flex h-8 items-center gap-1.5 rounded-pill bg-sel px-3 text-[13px] font-semibold"},l3=Z({__name:"ListToolbar",props:{showSearch:{type:Boolean},search:{},searchPrompt:{},buttons:{},selectedCount:{},selectedLabel:{},deleteLabel:{},actions:{default:()=>[]},busyAction:{default:null}},emits:["update:search","delete","action"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>new Map(n.actions.map(l=>[l.name,l.label])));return(l,o)=>(v(),S("div",QE,[e.showSearch?(v(),S("label",XE,[P("span",e3,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:18,class:"pointer-events-none absolute top-1/2 left-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{type:"search","data-list-search":"",value:e.search,placeholder:e.searchPrompt,class:"h-button w-full rounded-control border border-transparent bg-subtle pr-3.5 pl-10",onInput:o[0]||(o[0]=s=>a("update:search",s.target.value))},null,40,t3)])):(v(),S("span",n3)),P("div",a3,[e.selectedCount>0?(v(),S("span",r3,[W(u(fr),{size:14,"aria-hidden":"true"}),we(I(e.selectedLabel),1)])):le("",!0),(v(!0),S(xe,null,Ve(e.buttons,s=>(v(),S(xe,{key:s},[s==="delete"?(v(),H(lt,{key:0,"data-action":"delete",variant:e.selectedCount>0?"danger":"outline",icon:u(wl),disabled:e.selectedCount===0,onClick:o[1]||(o[1]=i=>a("delete"))},{default:F(()=>[we(I(e.deleteLabel),1)]),_:1},8,["variant","icon","disabled"])):r.value.has(s)?(v(),H(lt,{key:1,variant:"outline",size:"md","data-action":s,disabled:e.busyAction===s,"aria-busy":e.busyAction===s?"true":void 0,onClick:i=>a("action",s)},{default:F(()=>[we(I(r.value.get(s)),1)]),_:2},1032,["data-action","disabled","aria-busy","onClick"])):le("",!0)],64))),128))])]))}}),o3={class:"flex flex-wrap items-center gap-x-6 gap-y-3 border-t border-border px-5 py-3.5 text-[13px] text-muted"},s3={"data-range":""},i3={key:0,class:"flex items-center gap-2"},u3=["value"],c3=["value"],d3=["aria-label"],f3=["disabled"],p3={key:0,"aria-hidden":"true",class:"px-1"},h3=["data-page","aria-current","onClick"],v3=["disabled"],bi="inline-flex h-pager min-w-pager items-center justify-center gap-1 rounded-pager border border-border px-2.5 text-[13px] text-text disabled:cursor-not-allowed disabled:opacity-60 hover:bg-hover",_m=Z({__name:"Pagination",props:{meta:{},loading:{type:Boolean},perPageOptions:{},perPage:{}},emits:["page","perPage"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.meta?.total??0),l=k(()=>n.meta?.page??1),o=k(()=>Math.max(n.meta?.last_page??1,1)),s=k(()=>{const d=n.meta;if(!d||d.total===0)return os("backend::lang.list.results",0);const f=(d.page-1)*d.per_page+1,p=Math.min(d.page*d.per_page,d.total);return D("backend::lang.list.pagination_range",{from:f,to:p,total:d.total})}),i=k(()=>{const d=o.value,f=l.value,p=new Set([1,d,f-1,f,f+1].filter(x=>x>=1&&x<=d));f<=3&&[2,3].forEach(x=>x<=d&&p.add(x)),f>=d-2&&[d-1,d-2].forEach(x=>x>=1&&p.add(x));const h=[...p].sort((x,g)=>x-g),m=[];return h.forEach((x,g)=>{const y=h[g-1];y!==void 0&&x-y>1&&m.push(null),m.push(x)}),m});function c(d){const f=Number(d.target.value);Number.isFinite(f)&&f>0&&a("perPage",f)}return(d,f)=>(v(),S("footer",o3,[P("span",s3,I(e.loading?u(D)("backend::lang.list.loading"):s.value),1),e.perPageOptions.length>1?(v(),S("label",i3,[P("span",null,I(u(D)("backend::lang.list.records_per_page")),1),P("select",{"data-per-page":"",value:String(e.perPage),class:"h-pager rounded-pager border border-border-strong bg-surface px-2 text-text",onChange:c},[(v(!0),S(xe,null,Ve(e.perPageOptions,p=>(v(),S("option",{key:p,value:String(p)},I(p),9,c3))),128))],40,u3)])):le("",!0),!e.loading&&r.value>0?(v(),S("nav",{key:1,"aria-label":u(D)("backend::lang.list.pagination"),class:"ml-auto flex items-center gap-1.5"},[P("button",{type:"button","data-page":"prev",class:_e(bi),disabled:l.value<=1,onClick:f[0]||(f[0]=p=>a("page",l.value-1))},[W(u(ns),{size:14,"aria-hidden":"true"}),we(I(u(D)("backend::lang.list.prev_page")),1)],8,f3),(v(!0),S(xe,null,Ve(i.value,(p,h)=>(v(),S(xe,{key:p??`gap-${h}`},[p===null?(v(),S("span",p3,"…")):(v(),S("button",{key:1,type:"button","data-page":p,"aria-current":p===l.value?"page":void 0,class:_e([bi,p===l.value?"border-transparent bg-sel font-bold":""]),onClick:m=>p!==l.value&&a("page",p)},I(p),11,h3))],64))),128)),P("button",{type:"button","data-page":"next",class:_e(bi),disabled:l.value>=o.value,onClick:f[1]||(f[1]=p=>a("page",l.value+1))},[we(I(u(D)("backend::lang.list.next_page")),1),W(u(xl),{size:14,"aria-hidden":"true"})],8,v3)],8,d3)):le("",!0)]))}}),m3={role:"alert","data-extension-failure":"",class:"flex min-h-input items-center rounded-control border-[1.5px] border-dashed border-border-strong bg-subtle px-3.5 py-2.5 text-[13px] text-muted"},y3={class:"flex min-w-0 items-start gap-2.5"},g3={class:"min-w-0 [overflow-wrap:anywhere]"},mc=Z({__name:"ExtensionFailure",props:{text:{}},setup(e){return(t,n)=>(v(),S("div",m3,[P("span",y3,[W(u(Ut),{size:16,class:"mt-0.5 shrink-0 text-danger","aria-hidden":"true"}),P("span",g3,I(e.text),1)])]))}}),b3=new Set(["div","span","p","strong","em","b","i","u","s","small","mark","code","pre","br","hr","ul","ol","li","dl","dt","dd","h2","h3","h4","h5","h6","table","thead","tbody","tfoot","tr","th","td","caption","section","header","footer","figure","figcaption","blockquote","q","abbr","time","data","meter","progress","sup","sub","a","img"]),_3=new Set(["script","style","template","iframe","object","embed","noscript","textarea","title","xmp","svg","math","form","input","button","select","link","meta","base"]),x3=32,w3=2e3,k3=new Set(["class","title","lang","dir","role"]),$3={a:new Set(["href"]),img:new Set(["src","alt","width","height"]),td:new Set(["colspan","rowspan","scope"]),th:new Set(["colspan","rowspan","scope"]),time:new Set(["datetime"]),data:new Set(["value"]),meter:new Set(["value","min","max","low","high","optimum"]),progress:new Set(["value","max"])},C3=/^(aria|data)-[a-z0-9_-]+$/;function S3(e,t){if(e==="")return!1;for(const n of e){const a=n.codePointAt(0)??0;if(a<=32||a===127)return!1}return e.startsWith("#")?t:e.startsWith("/")?e.length===1||e[1]!=="/"&&e[1]!=="\\":!1}function E3(e,t,n){return k3.has(t)||$3[e]?.has(t)===!0||C3.test(t)?e==="a"&&t==="href"||e==="img"&&t==="src"?S3(n,e==="a"):!0:!1}function A3(e,t){const n={};for(const[a,r]of Object.entries(t??{})){const l=a.toLowerCase();typeof r=="string"&&E3(e,l,r)&&(n[l]=r)}return n}function cu(e,t,n){const a=[];for(const r of e??[]){if(n.left<=0)break;if(r.tag===void 0||r.tag===""){typeof r.text=="string"&&r.text!==""&&(n.left-=1,a.push(r.text));continue}const l=r.tag.toLowerCase();if(_3.has(l))continue;if(!b3.has(l)){a.push(...cu(r.children,t,n));continue}if(t+1>x3)continue;n.left-=1;const o=cu(r.children,t+1,n);a.push(Ht(l,A3(l,r.attrs),o.length>0?o:void 0))}return a}function D3(e){return cu(e,0,{left:w3})}const O3={key:1,"data-partial-loading":"","aria-busy":"true"},P3=["data-partial","aria-busy"],xm=Z({__name:"PartialHost",props:{source:{},name:{},recordId:{default:null},variant:{},reloadKey:{default:0}},setup(e){const t=e,n=M(null),a=M(!1),r=M(!1);let l=0;const o=i=>D3(i.nodes);o.props=["nodes"];async function s(){const i=++l;r.value=!0;let c=null;try{c=(await Re.GET("/{vendor}/{plugin}/{controller}/partials/{name}",{params:{path:{...t.source,name:t.name},query:t.recordId!=null?{id:t.recordId}:void 0}})).data?.data.nodes??null}catch{c=null}i===l&&(r.value=!1,a.value=c===null,n.value=c)}return Ie(()=>t.reloadKey,()=>{s()}),s(),(i,c)=>a.value?(v(),H(mc,{key:0,"data-partial-failed":"",text:u(D)("backend::lang.extension.partial_failed")},null,8,["text"])):n.value===null?(v(),S("div",O3,[P("div",{"data-partial-skeleton":"",class:_e([e.variant==="header"?"h-[80px] w-full rounded-card":"h-[44px] w-full rounded-control","bg-skel"]),"aria-hidden":"true"},null,2)])):n.value.length>0?(v(),S("div",{key:2,class:"summer-partial","data-partial":e.variant,"aria-busy":r.value?"true":void 0},[W(o,{nodes:n.value},null,8,["nodes"])],8,P3)):le("",!0)}}),M3={class:"flex gap-2.5"},T3=["disabled","aria-busy"],Cr=Z({__name:"ConfirmDialog",props:{open:{type:Boolean},message:{},title:{default:void 0},confirmLabel:{default:void 0},cancelLabel:{default:void 0},danger:{type:Boolean,default:!1},busy:{type:Boolean,default:!1}},emits:["update:open","confirm","cancel"],setup(e,{emit:t}){const n=e,a=t;function r(o){!o&&n.busy||(a("update:open",o),o||a("cancel"))}function l(){n.busy||(a("confirm"),a("update:open",!1))}return(o,s)=>(v(),H(u(lk),{open:e.open,"onUpdate:open":r},{default:F(()=>[W(u(ak),null,{default:F(()=>[W(u(tk),{class:"fixed inset-0 z-40 bg-overlay"}),W(u(Yw),{"data-confirm-dialog":"",class:"fixed top-1/2 left-1/2 z-50 flex w-[calc(100%-32px)] max-w-[440px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-modal bg-surface p-6 text-text shadow-pop"},{default:F(()=>[W(u(sk),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(e.title??u(D)("backend::lang.form.confirm")),1)]),_:1}),W(u(Xw),{class:"text-muted"},{default:F(()=>[we(I(e.message),1)]),_:1}),P("div",M3,[W(u(Zw),{"data-action":"cancel",disabled:e.busy,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60"},{default:F(()=>[we(I(e.cancelLabel??u(D)("backend::lang.form.cancel")),1)]),_:1},8,["disabled"]),P("button",{type:"button","data-action":"confirm",disabled:e.busy,"aria-busy":e.busy?"true":void 0,class:_e([e.danger?"bg-danger text-white":"bg-primary text-on-primary","inline-flex h-button flex-1 items-center justify-center gap-2 rounded-control font-semibold hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"]),onClick:l},[e.busy?(v(),H(u(to),{key:0,size:16,class:"animate-spin","aria-hidden":"true"})):le("",!0),we(" "+I(e.confirmLabel??u(D)("backend::lang.form.confirm")),1)],10,T3)])]),_:1})]),_:1})]),_:1},8,["open"]))}});function Sr(){const e=M(null),t=M(!1);let n=null,a=null;function r(i){const c=n;n=null,a=null,e.value=null,c?.(i)}function l(i,c){return r(!1),e.value=i,a=c??null,new Promise(d=>{n=d})}async function o(){if(t.value)return;const i=a;if(i){t.value=!0;try{await i()}finally{t.value=!1}}r(!0)}function s(){t.value||r(!1)}return{request:e,busy:t,ask:l,confirm:o,cancel:s}}const R3={class:"flex flex-col gap-5"},q3={class:"flex flex-wrap items-end justify-between gap-4"},I3={class:"flex flex-col"},F3={class:"text-[26px] font-bold tracking-[-0.02em]"},B3={key:0,"data-record-count":"",class:"text-muted"},N3={key:0,class:"flex items-center gap-2.5"},V3={class:"overflow-hidden rounded-card border border-border bg-surface shadow-card"},L3={key:2,role:"alert",class:"border-t border-border px-5 py-4 text-danger"},j3={key:0,"data-empty-search":"",class:"flex flex-col items-center gap-3"},U3={class:"flex size-14 items-center justify-center rounded-full bg-subtle text-muted"},z3={class:"text-[17px] font-bold"},H3={class:"max-w-[420px] text-muted"},W3={key:1,"data-empty-list":"",class:"text-muted"},K3=300,G3=Z({__name:"ListView",setup(e){const t=_n(),n=_l(),a={vendor:String(t.params.vendor??""),plugin:String(t.params.plugin??""),controller:String(t.params.controller??"")},r=qu(a),l=ua(r)??"/",o=M(null),s=M([]),i=M(null),c=M(!0),d=M(!1),f=M(!1),p=k(()=>d.value||f.value),h=M([]),m=M(!1),x=M(0),g=Sr(),y=k(()=>iE(t.query)),w=M(y.value.search??""),C=k(()=>o.value?.messages),A=k(()=>o.value?.title?o.value.title:us(a.vendor,a.plugin)?.sideMenu.find(q=>q.controller===r)?.label??r),L=k(()=>i.value?Fe(C.value?.recordCount,i.value.total):""),Y=k(()=>o.value?.toolbarButtons??[]),z=k(()=>Y.value.filter(G=>G==="create")),j=k(()=>o.value?.toolbarActions??[]),b=k(()=>Y.value.filter(G=>G==="delete"||j.value.some(q=>q.name===G))),E=M(null),V=k(()=>{const G=o.value?.perPageOptions??[];return G.length>0?G:[o.value?.recordsPerPage||20]}),T=k(()=>y.value.per_page??i.value?.per_page??o.value?.recordsPerPage??20),K=k(()=>y.value.sort?{column:y.value.sort,dir:y.value.dir==="desc"?"desc":"asc"}:null);function re(G){const q=o.value?.recordUrl,te=G.id;return!q||typeof te!="number"&&typeof te!="string"?null:gm(q,r,te)}function U(G){n.replace({path:t.path,query:ym(G)})}let ae=0;async function Q(){const G=++ae;c.value=!0,f.value=!1;const q=await Re.GET("/{vendor}/{plugin}/{controller}",{params:{path:a,query:y.value}});G===ae&&(s.value=q.data?.data??[],i.value=q.data?.meta??null,f.value=!q.data,c.value=!1)}async function se(){const G=await Re.GET("/{vendor}/{plugin}/{controller}/schema/list",{params:{path:a}});o.value=G.data?.data??null,d.value=!o.value,o.value&&mm(r,o.value.assets)}se(),Ie(()=>uE(y.value),()=>{h.value=[],w.value=y.value.search??"",Q()},{immediate:!0});let ne=null;function ie(G){w.value=G,ne!==null&&clearTimeout(ne),ne=setTimeout(()=>{ne=null;const q=G.trim();U({...y.value,search:q===""?void 0:q,page:void 0})},K3)}Nt(()=>{ne!==null&&clearTimeout(ne)});function de(){w.value="",U({...y.value,search:void 0,page:void 0})}function $e(G){const q=K.value;q?.column!==G?U({...y.value,sort:G,dir:"asc",page:void 0}):q.dir==="asc"?U({...y.value,sort:G,dir:"desc",page:void 0}):U({...y.value,sort:void 0,dir:void 0,page:void 0})}function Ce(G){U({...y.value,page:G})}function ue(G){U({...y.value,per_page:G,page:void 0})}function Te(G,q){const te={...y.value.filter??{}};q===null?delete te[G]:te[G]=q,U({...y.value,filter:te,page:void 0})}async function ce(){const G=h.value.map(Number).filter(te=>Number.isInteger(te)&&te>0);if(!(G.length===0||m.value||!await g.ask({message:Fe(C.value?.deleteConfirm,G.length),confirmLabel:D("backend::lang.form.delete"),danger:!0}))){m.value=!0;try{const te=await Re.POST("/{vendor}/{plugin}/{controller}/bulk-delete",{params:{path:a},body:{ids:G}});if(te.data){Be(Fe(C.value?.deleted,te.data.data.deleted)),h.value=[],await Q(),x.value+=1;return}Be(te.error?.error.message||D("backend::lang.list.delete_failed"),"danger")}catch{Be(D("backend::lang.list.delete_failed"),"danger")}finally{m.value=!1}}}async function B(G){if(E.value===null){E.value=G;try{const q=await Re.POST("/{vendor}/{plugin}/{controller}/toolbar/{action}",{params:{path:{...a,action:G}},body:{}});if(q.data){q.data.data.message&&Be(q.data.data.message),await Q(),x.value+=1;return}Be(q.error?.error.message||D("backend::lang.extension.action_failed"),"danger")}catch{Be(D("backend::lang.extension.action_failed"),"danger")}finally{E.value=null}}}return(G,q)=>(v(),S("section",R3,[P("header",q3,[P("div",I3,[P("h1",F3,I(A.value),1),L.value?(v(),S("p",B3,I(L.value),1)):le("",!0)]),z.value.length>0?(v(),S("div",N3,[(v(!0),S(xe,null,Ve(z.value,te=>(v(),H(lt,{key:te,"data-action":"create",variant:"primary",icon:u(Ou),to:`${u(l)}/create`},{default:F(()=>[we(I(u(Fe)(C.value?.create)),1)]),_:1},8,["icon","to"]))),128))])):le("",!0)]),o.value?.headerPartial?(v(),H(xm,{key:0,variant:"header",source:a,name:o.value.headerPartial,"reload-key":x.value},null,8,["name","reload-key"])):le("",!0),P("div",V3,[o.value?(v(),H(l3,{key:0,"show-search":o.value.showSearch,search:w.value,"search-prompt":u(Fe)(C.value?.searchPrompt),buttons:b.value,"selected-count":h.value.length,"selected-label":u(Fe)(C.value?.selected,h.value.length),"delete-label":u(Fe)(C.value?.deleteSelected,h.value.length),actions:j.value,"busy-action":E.value,"onUpdate:search":ie,onDelete:ce,onAction:B},null,8,["show-search","search","search-prompt","buttons","selected-count","selected-label","delete-label","actions","busy-action"])):le("",!0),o.value&&o.value.filters.length>0?(v(),H(JE,{key:1,filters:o.value.filters,values:y.value.filter??{},source:a,onUpdate:Te},null,8,["filters","values"])):le("",!0),p.value&&!c.value?(v(),S("p",L3,I(u(D)("backend::lang.list.load_failed")),1)):(v(),H(bm,{key:3,columns:o.value?.columns??[],rows:s.value,loading:c.value||!o.value,"row-link":re,selectable:o.value?.showCheckboxes??!1,selected:h.value,sortable:o.value?.showSorting??!1,sort:K.value,"onUpdate:selected":q[0]||(q[0]=te=>h.value=te),onSort:$e},{empty:F(()=>[y.value.search?(v(),S("div",j3,[P("span",U3,[W(u(Mh),{size:24,"aria-hidden":"true"})]),P("p",z3,I(u(Fe)(C.value?.emptySearch,void 0,{term:y.value.search})),1),P("p",H3,I(u(Fe)(C.value?.emptySearchHint,void 0,{term:y.value.search})),1),W(lt,{"data-action":"clear-search",onClick:de},{default:F(()=>[we(I(u(D)("backend::lang.list.clear_search")),1)]),_:1})])):(v(),S("p",W3,I(u(Fe)(C.value?.empty)||o.value?.noRecordsMessage||u(D)("backend::lang.list.no_records")),1))]),_:1},8,["columns","rows","loading","selectable","selected","sortable","sort"])),W(_m,{meta:i.value,loading:c.value||!o.value,"per-page-options":V.value,"per-page":T.value,onPage:Ce,onPerPage:ue},null,8,["meta","loading","per-page-options","per-page"])]),W(Cr,{open:u(g).request.value!==null,message:u(g).request.value?.message??"","confirm-label":u(g).request.value?.confirmLabel,danger:u(g).request.value?.danger,onConfirm:u(g).confirm,onCancel:u(g).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])]))}}),pa="X-Session-Key",wm="X-Child-Session-Key",Y3=32;function Mo(){const e=new Uint8Array(Y3);globalThis.crypto.getRandomValues(e);let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function ra(e){try{const t=await e();return{data:t.data?t.data.data:null,status:t.response.status,error:t.error?.error??null}}catch{return{data:null,status:0,error:null}}}async function To(e){try{const t=await e();return t.response.ok&&t.data instanceof Blob?t.data:null}catch{return null}}function Pn(e){return encodeURIComponent(String(e))}function km(e){return`${ls.api}/${Pn(e.vendor)}/${Pn(e.plugin)}/${Pn(e.controller)}`}function J3(e){try{return e===""?null:JSON.parse(e)}catch{return null}}function $m(e){if(!e)return"";for(const t of Object.values(e.details??{})){const n=Array.isArray(t)?t.find(a=>typeof a=="string"&&a!==""):t;if(typeof n=="string"&&n!=="")return n}return e.message??""}function Z3(e,t){const n=t;if((e===200||e===201)&&n?.data)return{ok:!0,item:n.data};const a=$m(n?.error);return e===413?{ok:!1,reason:"too_large",status:e,message:a}:e===422?{ok:!1,reason:"invalid",status:e,message:a}:e===0?{ok:!1,reason:"network",status:e,message:a}:{ok:!1,reason:"failed",status:e,message:a}}function Cm(e,t,n,a){let r=null,l=!1;const o=()=>new Promise(i=>{const c=new XMLHttpRequest;r=c,c.open("POST",e),c.setRequestHeader("X-Requested-With",Bh),c.setRequestHeader("Accept","application/json");for(const[f,p]of Object.entries(n))c.setRequestHeader(f,p);c.upload.onprogress=f=>{f.lengthComputable&&a?.(f.loaded,f.total)},c.onload=()=>i({status:c.status,body:J3(c.responseText)}),c.onerror=()=>i("network"),c.ontimeout=()=>i("network"),c.onabort=()=>i("aborted");const d=new FormData;d.append("file_data",t,t.name),c.send(d)});return{promise:(async()=>{let i=await o();return typeof i=="object"&&i.status===401&&!l&&(await Mu()&&(i=l?"aborted":await o()),typeof i=="object"&&i.status===401&&X0()),i==="aborted"||l?{ok:!1,reason:"aborted",status:0,message:""}:i==="network"?{ok:!1,reason:"network",status:0,message:""}:Z3(i.status,i.body)})(),abort(){l=!0,r?.abort()}}}function Q3(e,t,n,a){const r={...e,id:t,field:n},l={[pa]:a},o=`${km(e)}/${Pn(t)}/files/${Pn(n)}`;return{list:()=>ra(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}",{params:{path:r,header:l}})),upload:(s,i)=>Cm(o,s,{...l},i),update:(s,i)=>ra(()=>Re.PUT("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}",{params:{path:{...r,file:s},header:l},body:i})),remove:s=>ra(()=>Re.DELETE("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}",{params:{path:{...r,file:s},header:l}})),reorder:s=>ra(()=>Re.POST("/{vendor}/{plugin}/{controller}/{id}/files/{field}/reorder",{params:{path:r,header:l},body:{ids:s}})),download:s=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}/download",{params:{path:{...r,file:s},header:l},parseAs:"blob"})),thumb:s=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}/thumb",{params:{path:{...r,file:s},header:l},parseAs:"blob"}))}}function X3(e,t,n,a,r,l,o){const s={...e,id:t,name:n,child:a,field:r},i={[pa]:l,[wm]:o},c=`${km(e)}/${Pn(t)}/relations/${Pn(n)}/records/${Pn(a)}/files/${Pn(r)}`;return{list:()=>ra(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}",{params:{path:s,header:i}})),upload:(d,f)=>Cm(c,d,{...i},f),update:(d,f)=>ra(()=>Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}",{params:{path:{...s,file:d},header:i},body:f})),remove:d=>ra(()=>Re.DELETE("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}",{params:{path:{...s,file:d},header:i}})),reorder:d=>ra(()=>Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/reorder",{params:{path:s,header:i},body:{ids:d}})),download:d=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}/download",{params:{path:{...s,file:d},header:i},parseAs:"blob"})),thumb:d=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}/thumb",{params:{path:{...s,file:d},header:i},parseAs:"blob"}))}}const eA={key:0,role:"alert","data-error-banner":"",class:"flex items-start gap-3 rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},tA={class:"flex flex-col gap-1"},Ol=Z({__name:"FormErrorBanner",props:{errors:{},fieldNames:{}},setup(e){const t=e,n=k(()=>Object.keys(t.errors).length),a=k(()=>Object.entries(t.errors).filter(([r])=>!t.fieldNames.includes(r)).flatMap(([,r])=>r));return(r,l)=>n.value>0?(v(),S("div",eA,[W(u(Ut),{size:20,class:"mt-px shrink-0","aria-hidden":"true"}),P("div",tA,[P("p",null,[P("strong",null,I(u(D)("backend::lang.form.error_title")),1),we(" "+I(u(os)("backend::lang.form.error_fields",n.value)),1)]),(v(!0),S(xe,null,Ve(a.value,(o,s)=>(v(),S("p",{key:s,class:"text-[13px]"},I(o),1))),128))])])):le("",!0)}}),nA=new Set(["readonly","placeholder","maxlength","minlength","min","max","step","autocomplete","spellcheck","pattern"]);function yc(e){const t={};for(const[n,a]of Object.entries(e.attributes??{})){const r=n.toLowerCase();!nA.has(r)||a===null||a===!1||(t[r]=a)}return t}function qa(e){return["w-full rounded-control border bg-surface px-3.5 text-text transition-colors duration-150 ease-out",e?"border-danger":"border-border-strong"].join(" ")}function Sm(e){return typeof e=="string"?e!==""&&e!=="0"&&e.toLowerCase()!=="false":!!e}function Em(e,t){return typeof e=="number"?t?1:0:t}const aA={class:"flex min-w-0 flex-col"},rA=["for"],lA={key:0,class:"text-danger","aria-hidden":"true"},oA=["id"],sA=["id","name","checked","aria-invalid","aria-describedby"],iA=Z({__name:"CheckboxField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>Sm(n.modelValue));function l(o){a("update:modelValue",Em(n.modelValue,o.target.checked))}return(o,s)=>(v(),S("div",{class:_e([e.invalid?"border-danger":"border-border","flex items-center justify-between gap-4 rounded-inner border px-4 py-3.5"]),"data-toggle-card":""},[P("div",aA,[P("label",{for:e.controlId,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",lA," *")):le("",!0)],8,rA),e.field.comment?(v(),S("p",{key:0,id:`${e.controlId}-comment`,class:"text-[13px] text-muted"},I(e.field.comment),9,oA)):le("",!0)]),P("input",{id:e.controlId,type:"checkbox",name:e.field.name,checked:r.value,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"size-5 shrink-0 rounded-[6px] accent-primary",onChange:l},null,40,sA)],2))}});function uA(e){return e==="date"||e==="time"?e:"datetime"}function At(e,t=2){return String(e).padStart(t,"0")}const cA=/(Z|[+-]\d{2}:?\d{2})$/i;function dA(e,t,n=!1){if(typeof t!="string"||t.trim()==="")return null;const a=t.trim();try{if(e==="date")return fv(a.slice(0,10));if(e==="time"){const l=/(\d{2}:\d{2}(:\d{2})?)/.exec(a.includes("T")?a.slice(a.indexOf("T")):a);return l?wx(l[1]):null}const r=cA.test(a)?a.replace(" ","T"):`${a.replace(" ","T")}Z`;return n?mn(Zd(r,"UTC")):Zd(r,an())}catch{return null}}function _i(e){return`${At(e.year,4)}-${At(e.month)}-${At(e.day)}`}function xi(e){return`${At(e.hour)}:${At(e.minute)}:${At(e.second)}`}function qf(e,t,n=!1){if(!t)return null;if(e==="time")return"hour"in t?xi(t):null;if(!("year"in t))return null;if(e==="date")return _i(t);if(n){const l=t instanceof Vn?mn(t):t,o="hour"in l?xi(l):"00:00:00";return`${_i(l)}T${o}Z`}const a=t instanceof Vn?t:zu(t instanceof et?mn(t):t,an()),r=Hu(a,"UTC");return`${_i(r)}T${xi(r)}Z`}const fA={date:"YYYY-MM-DD",datetime:"YYYY-MM-DD HH:mm",time:"HH:mm"},pA=/\[([^\]]*)\]|YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|HH|H|hh|h|mm|ss|A|a/g;function hA(e){return"year"in e?new et(e.year,e.month,e.day):null}function wi(e,t,n,a){return new Yt(e,{...n,timeZone:"UTC"}).formatToParts(t.toDate("UTC")).find(l=>l.type===a)?.value??""}function vA(e,t,n,a){if(!e)return"";const r=n||fA[t],l=hA(e),o="hour"in e?e:null,s=/D/.test(r.replace(/\[[^\]]*\]/g,""));return r.replace(pA,(i,c)=>{if(c!==void 0)return c;switch(i){case"YYYY":return l?At(l.year,4):"";case"YY":return l?At(l.year%100):"";case"MMMM":case"MMM":{if(!l)return"";const d=i==="MMMM"?"long":"short";return s?wi(a,l,{day:"numeric",month:d},"month"):wi(a,l,{month:d},"month")}case"MM":return l?At(l.month):"";case"M":return l?String(l.month):"";case"dddd":case"ddd":return l?wi(a,l,{weekday:i==="dddd"?"long":"short"},"weekday"):"";case"DD":return l?At(l.day):"";case"D":return l?String(l.day):"";case"HH":return o?At(o.hour):"";case"H":return o?String(o.hour):"";case"hh":return o?At(o.hour%12||12):"";case"h":return o?String(o.hour%12||12):"";case"mm":return o?At(o.minute):"";case"ss":return o?At(o.second):"";case"A":return o?o.hour<12?"AM":"PM":"";case"a":return o?o.hour<12?"am":"pm":"";default:return i}})}const mA=new et(2026,10,4);function yA(e,t){if(typeof t=="number"&&Number.isInteger(t)&&t>=0&&t<=6)return t;try{return(7-ps(mA,e))%7}catch{return 1}}function If(e){if(e)try{return fv(e.slice(0,10))}catch{return}}function gA(e,t=$l(an())){const n=If(e.minDate),a=If(e.maxDate);if(n||a)return{min:n,max:a};const r=e.yearRange??[];return r.length===1&&typeof r[0]=="number"?{min:new et(t.year-r[0],1,1),max:new et(t.year+r[0],12,31)}:r.length===2&&typeof r[0]=="number"&&typeof r[1]=="number"?{min:new et(r[0],1,1),max:new et(r[1],12,31)}:{}}function du(e,t,n,a){if(!e||t==="time")return;if(t==="date")return e;const r=new Ma(e.year,e.month,e.day,a?23:0,a?59:0,a?59:0);return n?r:zu(r,an())}function bA(e,t){const n=$l(an());return du(n,e==="time"?"datetime":e,t,!1)??n}const _A=["id","aria-describedby"],xA={key:0},wA={key:1,class:"text-muted","data-empty":""},kA=["aria-label"],$A={class:"flex size-8 shrink-0 items-center justify-center text-muted","aria-hidden":"true"},CA=["data-mode"],SA=["aria-label"],Ir="flex size-8 shrink-0 items-center justify-center rounded-pager text-muted transition-colors duration-150 ease-out hover:bg-hover hover:text-text",EA=Z({__name:"DatepickerField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>uA(n.field.mode)),l=k(()=>r.value==="datetime"&&!!n.field.ignoreTimezone),o=k(()=>il.value||"pl"),s=k(()=>{const Q=n.field.attributes?.readonly;return!!n.field.readOnly||Q!=null&&Q!==!1}),i=k(()=>dA(r.value,n.modelValue,l.value)),c=k(()=>r.value==="time"?null:i.value),d=k(()=>r.value==="time"?i.value:null),f=k(()=>gA(n.field)),p=k(()=>du(f.value.min,r.value,l.value,!1)),h=k(()=>du(f.value.max,r.value,l.value,!0)),m=bA(r.value,l.value),x=k(()=>yA(o.value,n.field.firstDay)),g=k(()=>n.field.twelveHour?12:24),y=k(()=>r.value==="date"?"day":"minute"),w=k(()=>vA(i.value,r.value,n.field.displayFormat,o.value)),C=k(()=>!n.field.required&&i.value!==null&&!s.value),A=k(()=>{const Q=c.value;return Q?!!p.value&&Q.compare(p.value)<0||!!h.value&&Q.compare(h.value)>0:!1}),L=new Set(["day","month","year","hour","minute","second"]),Y=M(null),z=M(!1);function j(){const Q=Y.value;if(!Q){z.value=!1;return}const se=Array.from(Q.querySelectorAll("[data-reka-date-field-segment]")).filter(ie=>L.has(ie.dataset.rekaDateFieldSegment??"")),ne=se.filter(ie=>!ie.hasAttribute("data-placeholder")).length;z.value=ne>0&&ne!!n.invalid||A.value||z.value),V=k(()=>qf(r.value,i.value,l.value));function T(Q){const se=qf(r.value,Q??null,l.value);b(),!(se===V.value&&(se!==null||n.modelValue===null))&&a("update:modelValue",se)}function K(){a("update:modelValue",null),b()}function re(Q){return Q.charAt(0).toLocaleUpperCase(o.value)+Q.slice(1)}const U=k(()=>[qa(E.value),"h-input flex min-w-0 items-center gap-1 pl-3.5 pr-1.5","focus-within:border-primary focus-within:shadow-[0_0_0_3px_var(--c-ring)]","has-[[data-invalid]]:border-danger"]);function ae(Q){return Q==="literal"?"text-muted":Q==="timeZoneName"?"min-w-0 truncate text-[13px] text-muted":"rounded-[4px] px-0.5 tabular-nums outline-none focus:bg-sel focus:text-text focus-visible:outline-none data-[placeholder]:text-placeholder focus:data-[placeholder]:text-text"}return(Q,se)=>s.value?(v(),S("p",{key:0,id:e.controlId,"data-datepicker-readonly":"","aria-describedby":e.describedBy||void 0,class:"flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5 tabular-nums"},[w.value!==""?(v(),S("span",xA,I(w.value),1)):(v(),S("span",wA,"—"))],8,_A)):r.value==="time"?(v(),S("div",{key:1,ref_key:"container",ref:Y,"data-datepicker":"","data-mode":"time",class:_e(U.value),onKeyup:b,onFocusout:b},[W(u(vS),{id:e.controlId,"model-value":d.value,locale:o.value,"hour-cycle":g.value,granularity:"minute",name:e.field.name,required:e.field.required||void 0,"aria-invalid":E.value?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"flex min-w-0 flex-1 items-center","onUpdate:modelValue":T},{default:F(({segments:ne})=>[(v(!0),S(xe,null,Ve(ne,ie=>(v(),H(u(yS),{key:ie.part,part:ie.part,class:_e(ae(ie.part))},{default:F(()=>[we(I(ie.value),1)]),_:2},1032,["part","class"]))),128))]),_:1},8,["id","model-value","locale","hour-cycle","name","required","aria-invalid","aria-describedby"]),C.value?(v(),S("button",{key:0,type:"button","data-action":"clear","aria-label":u(D)("backend::lang.datepicker.clear"),class:_e(Ir),onClick:K},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,kA)):le("",!0),P("span",$A,[W(u(z1),{size:16})])],34)):(v(),H(u(rC),{key:2,id:e.controlId,"model-value":c.value,"default-placeholder":u(m),locale:o.value,granularity:y.value,"hour-cycle":g.value,"hide-time-zone":r.value!=="datetime"||l.value,"min-value":p.value,"max-value":h.value,"week-starts-on":x.value,name:e.field.name,required:e.field.required||void 0,"close-on-select":"","prevent-deselect":"","onUpdate:modelValue":T},{default:F(()=>[P("div",{ref_key:"container",ref:Y,"data-datepicker":"","data-mode":r.value,class:_e(U.value),onKeyup:b,onFocusout:b},[W(u(kC),{"aria-invalid":E.value?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"flex min-w-0 flex-1 items-center overflow-hidden"},{default:F(({segments:ne})=>[(v(!0),S(xe,null,Ve(ne,ie=>(v(),H(u(BC),{key:ie.part,part:ie.part,class:_e(ae(ie.part))},{default:F(()=>[we(I(ie.value),1)]),_:2},1032,["part","class"]))),128))]),_:1},8,["aria-invalid","aria-describedby"]),C.value?(v(),S("button",{key:0,type:"button","data-action":"clear","aria-label":u(D)("backend::lang.datepicker.clear"),class:_e(Ir),onClick:K},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,SA)):le("",!0),W(u(WC),{"data-action":"open-calendar","aria-label":u(D)("backend::lang.datepicker.open_calendar"),class:_e(Ir)},{default:F(()=>[W(u(T1),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])],42,CA),W(u(xC),{"data-datepicker-calendar":"","side-offset":4,align:"end",class:"z-50 w-[284px] rounded-inner border border-border bg-surface p-4 text-text shadow-menu"},{default:F(()=>[W(u(oC),null,{default:F(({weekDays:ne,grid:ie})=>[W(u(RC),{class:"flex h-9 items-center justify-between"},{default:F(()=>[W(u(jC),{"aria-label":u(D)("backend::lang.datepicker.prev_month"),class:_e(Ir)},{default:F(()=>[W(u(ns),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"]),W(u(IC),{class:"font-semibold"},{default:F(({headingValue:de})=>[we(I(re(de)),1)]),_:1}),W(u(VC),{"aria-label":u(D)("backend::lang.datepicker.next_month"),class:_e(Ir)},{default:F(()=>[W(u(xl),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])]),_:1}),(v(!0),S(xe,null,Ve(ie,de=>(v(),H(u(CC),{key:de.value.toString(),class:"mt-2 w-full border-collapse select-none"},{default:F(()=>[W(u(DC),null,{default:F(()=>[W(u(Tf),{class:"flex"},{default:F(()=>[(v(!0),S(xe,null,Ve(ne,$e=>(v(),H(u(MC),{key:$e,class:"flex h-9 w-9 items-center justify-center text-[13px] font-normal text-muted"},{default:F(()=>[we(I($e),1)]),_:2},1024))),128))]),_:2},1024)]),_:2},1024),W(u(EC),null,{default:F(()=>[(v(!0),S(xe,null,Ve(de.rows,($e,Ce)=>(v(),H(u(Tf),{key:`week-${Ce}`,class:"flex"},{default:F(()=>[(v(!0),S(xe,null,Ve($e,ue=>(v(),H(u(iC),{key:ue.toString(),date:ue,class:"p-0"},{default:F(()=>[W(u(cC),{day:ue,month:de.value,class:"flex size-9 items-center justify-center rounded-pager tabular-nums text-text transition-colors duration-150 ease-out hover:bg-hover data-[outside-view]:text-placeholder data-[today]:font-semibold data-[today]:shadow-[inset_0_0_0_1px_var(--c-border-strong)] data-[selected]:bg-primary data-[selected]:font-semibold data-[selected]:text-on-primary data-[disabled]:cursor-not-allowed data-[disabled]:text-placeholder data-[disabled]:opacity-40 data-[disabled]:hover:bg-transparent data-[unavailable]:cursor-not-allowed data-[unavailable]:opacity-40"},null,8,["day","month"])]),_:2},1032,["date"]))),128))]),_:2},1024))),128))]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["id","model-value","default-placeholder","locale","granularity","hour-cycle","hide-time-zone","min-value","max-value","week-starts-on","name","required"]))}}),AA={class:"relative"},DA=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],OA=["value"],Jl="empty",Zl="placeholder",PA=Z({__name:"DropdownField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.field.options??[]);function l(c,d){return c==null||d===null||d===void 0?c===d||c==null&&d==null:String(c)===String(d)}const o=k(()=>{const c=r.value.findIndex(d=>l(d.value,n.modelValue));return c>=0?String(c):n.field.emptyOption!==void 0&&(n.modelValue===null||n.modelValue===void 0||n.modelValue==="")?Jl:Zl}),s=k(()=>o.value===Jl||o.value===Zl);function i(c){const d=c.target.value;if(d===Jl){a("update:modelValue",null);return}const f=r.value[Number(d)];f&&a("update:modelValue",f.value)}return(c,d)=>(v(),S("div",AA,[P("select",{id:e.controlId,name:e.field.name,value:o.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:_e([[u(qa)(e.invalid),s.value?"text-muted":""],"h-input appearance-none pr-10"]),onChange:i},[e.field.emptyOption!==void 0?(v(),S("option",{key:0,value:Jl,class:"text-muted"},I(e.field.emptyOption),1)):le("",!0),o.value===Zl?(v(),S("option",{key:1,value:Zl,disabled:""},I(u(D)("backend::lang.form.select_placeholder")),1)):le("",!0),(v(!0),S(xe,null,Ve(r.value,(f,p)=>(v(),S("option",{key:p,value:String(p),class:"text-text"},I(f.label),9,OA))),128))],42,DA),W(u(ts),{size:16,class:"pointer-events-none absolute top-1/2 right-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"})]))}}),gc=Symbol("summer.form.values"),bc=Symbol("summer.form.patch"),Am=Symbol("summer.form.locale"),Dm=Symbol("summer.form.assets"),Cs=Symbol("summer.form.session"),Ff="summer-action",MA=5e3,TA={class:"flex items-start gap-3"},RA={class:"flex min-w-0 flex-1 flex-col gap-1"},qA={key:0,class:"flex items-center gap-4"},IA=["src"],FA={key:1,class:"flex size-16 shrink-0 items-center justify-center rounded-inner bg-subtle","aria-hidden":"true"},BA=["title"],NA={class:"flex flex-col gap-1.5"},VA=["for"],LA=["id","disabled","aria-invalid","aria-describedby"],jA=["id"],UA={class:"flex flex-col gap-1.5"},zA=["for"],HA=["id","disabled","aria-invalid","aria-describedby"],WA=["id"],KA={class:"flex gap-2.5"},GA=["disabled"],YA=["disabled"],JA=Z({__name:"FileCaptionModal",props:{open:{type:Boolean},file:{},routes:{},preview:{},idPrefix:{}},emits:["update:open","saved","closed"],setup(e,{emit:t}){const n=e,a=t,r=M(""),l=M(""),o=M({}),s=M(!1),i=Sr();function c(g){const y={};for(const[w,C]of Object.entries(g??{})){const A=(Array.isArray(C)?C:[C]).filter(L=>typeof L=="string"&&L!=="");A.length>0&&(y[w]=A)}return y}const d=k(()=>`${n.idPrefix}-caption-title`),f=k(()=>`${n.idPrefix}-caption-description`),p=k(()=>!!n.file&&(r.value!==n.file.title||l.value!==n.file.description));Ie(()=>n.open,g=>{g&&n.file&&(r.value=n.file.title??"",l.value=n.file.description??"",o.value={},s.value=!1)},{immediate:!0});async function h(g){if(g){a("update:open",!0);return}s.value||p.value&&!await i.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function m(){if(!(s.value||!n.file||!n.routes)){s.value=!0;try{const g=await n.routes.update(n.file.id,{title:r.value,description:l.value});if(g.data){o.value={},a("saved",g.data),a("update:open",!1),Be(D("backend::lang.fileupload.details_saved"));return}if(g.status===422){o.value=c(g.error?.details),Object.keys(o.value).length===0&&(o.value={title:[$m(g.error)||D("backend::lang.form.error_generic")]});return}Be(g.error?.message||D("backend::lang.form.error_generic"),"danger")}finally{s.value=!1}}}function x(g){g.preventDefault(),a("closed")}return(g,y)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":h},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-caption-modal":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 overflow-y-auto rounded-modal bg-surface p-6 text-text shadow-pop",onCloseAutoFocus:x},{default:F(()=>[P("div",TA,[P("div",RA,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.attachment")),1)]),_:1}),W(u(fl),{class:"text-muted"},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.help")),1)]),_:1})]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:s.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),e.file?(v(),S("div",qA,[e.preview?(v(),S("img",{key:0,src:e.preview,alt:"",class:"size-16 shrink-0 rounded-inner object-cover"},null,8,IA)):(v(),S("span",FA,[W(u(Lr),{size:16,class:"text-muted"})])),P("span",{class:"min-w-0 truncate text-[13px] text-muted",title:e.file.file_name},I(e.file.file_name),9,BA)])):le("",!0),P("form",{class:"flex flex-col gap-4",novalidate:"",onSubmit:ht(m,["prevent"])},[P("div",NA,[P("label",{for:d.value,class:"font-semibold"},I(u(D)("backend::lang.fileupload.title_label")),9,VA),Oa(P("input",{id:d.value,"onUpdate:modelValue":y[0]||(y[0]=w=>r.value=w),type:"text","data-caption-title":"",disabled:s.value,"aria-invalid":o.value.title?"true":void 0,"aria-describedby":o.value.title?`${d.value}-error`:void 0,class:_e([u(qa)(!!o.value.title),"h-input"])},null,10,LA),[[yo,r.value]]),o.value.title?(v(),S("p",{key:0,id:`${d.value}-error`,class:"flex items-center gap-1.5 text-[13px] text-danger"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(o.value.title.join(" ")),1)],8,jA)):le("",!0)]),P("div",UA,[P("label",{for:f.value,class:"font-semibold"},I(u(D)("backend::lang.fileupload.description_label")),9,zA),Oa(P("textarea",{id:f.value,"onUpdate:modelValue":y[1]||(y[1]=w=>l.value=w),rows:"3","data-caption-description":"",disabled:s.value,"aria-invalid":o.value.description?"true":void 0,"aria-describedby":o.value.description?`${f.value}-error`:void 0,class:_e([u(qa)(!!o.value.description),"min-h-input resize-y py-2.5"])},null,10,HA),[[yo,l.value]]),o.value.description?(v(),S("p",{key:0,id:`${f.value}-error`,class:"flex items-center gap-1.5 text-[13px] text-danger"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(o.value.description.join(" ")),1)],8,WA)):le("",!0)]),P("div",KA,[P("button",{type:"button","data-action":"cancel",disabled:s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:y[2]||(y[2]=w=>h(!1))},I(u(D)("backend::lang.form.cancel")),9,GA),P("button",{type:"submit","data-action":"save-caption",disabled:s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"},I(s.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.fileupload.details_submit")),9,YA)])],32)]),_:1})]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(i).request.value!==null,message:u(i).request.value?.message??"","confirm-label":u(i).request.value?.confirmLabel,danger:u(i).request.value?.danger,onConfirm:u(i).confirm,onCancel:u(i).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),ZA=["id","data-field-name","aria-labelledby","aria-describedby","aria-busy"],QA={key:0,"data-fileupload-loading":"",class:"h-[112px] rounded-control bg-skel","aria-hidden":"true"},XA={key:1,role:"alert","data-fileupload-failed":"",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},eD={key:0,"data-fileupload-empty":"",class:"flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5 text-muted"},tD={key:1,"data-fileupload-grid":"",class:"grid grid-cols-[repeat(auto-fill,minmax(160px,1fr))] gap-4"},nD=["data-file-item","data-state","onDragover","onDrop"],aD={class:"relative flex aspect-square items-center justify-center bg-subtle"},rD=["href","aria-label"],lD=["src","alt","onError"],oD=["aria-label","onClick"],sD=["src","alt"],iD={key:2,"data-preview-unavailable":"",class:"flex flex-col items-center gap-2 text-[13px] text-muted"},uD=["data-handle","aria-label","onKeydown","onDragstart"],cD={key:5,class:"absolute top-2 right-2 flex gap-1"},dD=["data-caption","aria-label","onClick"],fD=["aria-label","onClick"],pD=["aria-label","onClick"],hD={class:"flex flex-col gap-1 p-2"},vD=["title"],mD={class:"flex items-center gap-2 text-[13px] text-muted tabular-nums"},yD={key:0},gD={key:1},bD={key:2},_D={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},xD={key:1,"data-file-error":"",class:"text-[13px] text-danger"},wD={class:"sr-only"},kD={key:2,"data-fileupload-single":"",class:"flex flex-col gap-2"},$D=["data-file-item","data-state"],CD=["src","alt","onError"],SD={key:3,"data-preview-unavailable":"",class:"flex flex-col items-center gap-2 text-[13px] text-muted"},ED={class:"flex min-w-0 flex-1 flex-col gap-1"},AD=["title"],DD={class:"flex items-center gap-2 text-[13px] text-muted tabular-nums"},OD={key:0},PD={key:1},MD={key:2},TD={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},RD={key:1,"data-file-error":"",class:"text-[13px] text-danger"},qD={class:"sr-only"},ID={key:2,class:"mt-1 flex flex-wrap gap-2"},FD={key:3,"data-fileupload-rows":"",class:"flex flex-col gap-2"},BD=["data-file-item","data-state","onDragover","onDrop"],ND={class:"flex items-center gap-3"},VD=["data-handle","aria-label","onKeydown","onDragstart"],LD={class:"flex size-8 shrink-0 items-center justify-center overflow-hidden rounded-pager bg-subtle"},jD=["src","onError"],UD={class:"flex min-w-0 flex-1 flex-col leading-tight"},zD=["title"],HD=["title"],WD=["title"],KD={class:"flex shrink-0 items-center gap-2 text-[13px] text-muted tabular-nums"},GD={key:0},YD={key:1},JD={key:2},ZD={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},QD={class:"flex shrink-0 items-center gap-1"},XD=["href","aria-label"],eO=["aria-label","onClick"],tO=["data-caption","aria-label","onClick"],nO=["aria-label","onClick"],aO=["aria-label","onClick"],rO={key:1,"data-file-error":"",class:"text-[13px] text-danger"},lO={class:"sr-only"},oO=["aria-describedby"],sO={class:"flex size-10 items-center justify-center rounded-full bg-surface","aria-hidden":"true"},iO={class:"text-text"},uO={key:0,"data-fileupload-limits":"",class:"text-[13px] text-muted tabular-nums"},cO={key:5,"data-fileupload-limits":"",class:"text-[13px] text-muted tabular-nums"},dO={key:6,role:"alert","data-fileupload-too-many":"",class:"flex items-center gap-1.5 text-[13px] text-danger"},fO=["accept","multiple"],pO={class:"sr-only","aria-live":"polite","data-fileupload-live":""},hO=1<<20,vO=400,ki="inline-flex size-8 items-center justify-center rounded-pager border border-border bg-surface text-muted hover:text-text",mO="inline-flex size-8 items-center justify-center rounded-pager border border-border bg-surface text-muted hover:bg-danger-soft hover:text-danger",za="inline-flex size-8 shrink-0 items-center justify-center rounded-pager text-muted hover:bg-hover hover:text-text",yO=Z({__name:"FileuploadField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(Cs,null),a=["jpg","jpeg","png","gif","webp"],r=["image/jpeg","image/png","image/gif","image/webp"];let l=1;const o=M([]),s=M("loading"),i=M(!1),c=M(0),d=M(""),f=M(null),p=M(null),h=M(null),m=M(null),x=M(null),g=M(!1),y=M({}),w=M(new Set),C=new Set,A=[],L=n?n.routes(t.field.name):null;let Y=null,z=null,j=!1;const b=k(()=>{const N=t.field.attributes?.readonly;return!!t.field.readOnly||N!=null&&N!==!1}),E=k(()=>t.field.multiple===!0),V=k(()=>t.field.mode==="image"),T=k(()=>E.value?t.field.maxFiles:1),K=k(()=>(n?.recordId??0)!==0),re=k(()=>o.value.filter(N=>N.state!=="failed")),U=k(()=>{if(E.value)return o.value;const N=re.value,ve=N[N.length-1];return o.value.filter(R=>R.state==="failed"||R===ve)}),ae=k(()=>U.value.filter(N=>N.state!=="failed").length),Q=k(()=>b.value||s.value!=="ready"?!1:E.value?T.value===void 0||T.value===null||re.value.lengthE.value&&!b.value&&typeof T.value=="number"&&re.value.length>=T.value),ne=k(()=>t.field.fileTypes?.length?t.field.fileTypes.map(N=>N.toLowerCase()):V.value&&!t.field.mimeTypes?.length?a:null),ie=k(()=>(t.field.fileTypes?.length?t.field.fileTypes:t.field.mimeTypes??[]).join(", ")),de=k(()=>{const N=[];for(const ve of t.field.fileTypes??[])N.push(`.${ve.toLowerCase()}`);for(const ve of t.field.mimeTypes??[])N.push(ve.includes("/")?ve:`.${ve.toLowerCase()}`);return N.length===0&&V.value&&N.push(...r),N.length>0?N.join(","):void 0}),$e=k(()=>t.field.prompt||D(E.value?"backend::lang.fileupload.default_prompt_many":"backend::lang.fileupload.default_prompt"));function Ce(N,ve){return new Intl.NumberFormat(il.value,{minimumFractionDigits:ve,maximumFractionDigits:ve}).format(N)}function ue(N){const ve=["B","kB","MB","GB"];let R=N,be=0;for(;R>=1e3&&be{const N=t.field.maxFilesize;return typeof N=="number"?`${new Intl.NumberFormat(il.value).format(N)} MB`:""}),ce=k(()=>{const N=[];return ie.value!==""&&N.push(D("backend::lang.fileupload.limits_types",{types:ie.value})),Te.value!==""&&N.push(D("backend::lang.fileupload.limits_size",{size:Te.value})),E.value&&typeof T.value=="number"&&N.push(D("backend::lang.fileupload.limits_count",{current:re.value.length,max:T.value})),N.join(" · ")});function B(N){const ve=N.lastIndexOf(".");return ve<0?"":N.slice(ve+1).toLowerCase()}function G(N){const ve=t.field.mimeTypes??[];if(ve.length===0||N.type==="")return!0;const R=N.type.toLowerCase(),be=B(N.name);return ve.some(Je=>{const Et=Je.toLowerCase();return Et.includes("/")?Et.endsWith("/*")?R.startsWith(Et.slice(0,-1)):R===Et:Et===be})}function q(N){const ve=ne.value;if(ve&&!ve.includes(B(N.name)))return D("backend::lang.fileupload.wrong_type",{name:N.name,types:ve.join(", ")});if(!G(N))return D("backend::lang.fileupload.wrong_type",{name:N.name,types:ie.value});const R=t.field.maxFilesize;return typeof R=="number"&&N.size>Math.ceil(R*hO)?D("backend::lang.fileupload.too_large",{name:N.name,size:Te.value}):""}function te(N){return Qt({uid:l++,name:N.file_name,size:N.file_size,state:"done",progress:100,error:"",retryable:!1,file:N,source:null,handle:null})}function ye(N,ve){return Qt({uid:l++,name:N.name,size:N.size,state:ve===""?"queued":"failed",progress:0,error:ve,retryable:!1,file:null,source:oo(N),handle:null})}function _(N){return o.value.find(ve=>ve.uid===N)}async function $(N){if(!L){s.value="failed";return}N&&(s.value="loading");const ve=await L.list();if(j)return;if(!ve.data){N&&(s.value="failed");return}const R=o.value.filter(be=>be.state!=="done");for(const be of o.value)be.state==="done"&&kt(be.uid);o.value=[...ve.data.map(te),...R],s.value="ready"}function O(){b.value||f.value?.click()}function X(N){if(N.length===0||b.value)return;if(c.value=0,!E.value)for(const Je of[...o.value])Je.state!=="failed"&&(Je.state!=="done"||Je.file?.pending)&&ge(Je);let ve=E.value?typeof T.value=="number"?Math.max(T.value-re.value.length,0):Number.POSITIVE_INFINITY:1,R=0;const be=[];for(const Je of N.slice(0,E.value?N.length:1)){const Et=q(Je);if(Et===""&&ve<=0){R++;continue}Et===""&&ve--,be.push(ye(Je,Et))}o.value=[...o.value,...be],c.value=R,pe()}function J(N){const ve=N.target;X(Array.from(ve.files??[])),ve.value=""}function ee(N){return h.value===null&&Array.from(N.dataTransfer?.types??[]).includes("Files")}function me(N){ee(N)&&(N.preventDefault(),i.value=!0)}function he(N){ee(N)&&(N.preventDefault(),i.value=!1,X(Array.from(N.dataTransfer?.files??[])))}function pe(){if(!L||o.value.some(ve=>ve.state==="uploading"))return;const N=o.value.find(ve=>ve.state==="queued");N&&oe(N)}async function oe(N){if(!L||!N.source)return;N.state="uploading",N.progress=0,N.error="",N.retryable=!1;const ve=L.upload(N.source,(Je,Et)=>{N.progress=Et>0?Math.min(100,Math.round(Je/Et*100)):0});N.handle=oo(ve);const R=await ve.promise;N.handle=null;const be=!!_(N.uid);if(R.ok)!be||j?L.remove(R.item.id):(N.state="done",N.progress=100,N.file=R.item,N.name=R.item.file_name,N.size=R.item.file_size,n?.markDirty());else if(be&&R.reason!=="aborted")switch(N.state="failed",R.reason){case"too_large":N.error=Te.value?D("backend::lang.fileupload.too_large",{name:N.name,size:Te.value}):R.message||D("backend::lang.fileupload.upload_failed");break;case"invalid":N.error=R.message||D("backend::lang.fileupload.upload_failed");break;case"network":N.error=D("backend::lang.fileupload.upload_failed"),N.retryable=!0;break;default:N.error=R.message||D("backend::lang.fileupload.upload_failed"),N.retryable=R.status>=500}j||pe()}function Ae(N){N.state!=="failed"||!N.source||(N.state="queued",N.error="",N.retryable=!1,pe())}async function ge(N){const ve=o.value.findIndex(be=>be.uid===N.uid);if(ve<0)return;switch(o.value=o.value.filter(be=>be.uid!==N.uid),kt(N.uid),N.state){case"uploading":N.handle?.abort(),n?.markDirty(),pe();return;case"queued":case"failed":return}if(!L||!N.file)return;n?.markDirty();const R=await L.remove(N.file.id);if(!R.data&&!j){const be=[...o.value];be.splice(Math.min(ve,be.length),0,N),o.value=be,Be(R.error?.message||D("backend::lang.form.error_generic"),"danger")}}function Se(){return o.value.map(N=>N.uid)}function Pe(N){const ve=new Map(o.value.map(Je=>[Je.uid,Je])),R=N.map(Je=>ve.get(Je)).filter(Je=>!!Je),be=o.value.filter(Je=>!N.includes(Je.uid));o.value=[...R,...be]}function Le(){Y!==null&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,Ye()},vO)}async function Ye(){const N=z;if(z=null,!L)return;const ve=o.value.filter(be=>be.state==="done"&&be.file).map(be=>be.file.id);!(await L.reorder(ve)).data&&!j&&(N&&Pe(N),Be(D("backend::lang.fileupload.reorder_failed"),"danger"))}function je(N,ve){const R=o.value.findIndex(Et=>Et.uid===N);if(R<0||ve<0||ve>=o.value.length||ve===R)return!1;z===null&&(z=Se());const be=[...o.value],[Je]=be.splice(R,1);return be.splice(ve,0,Je),o.value=be,d.value=D("backend::lang.fileupload.moved",{name:Je.name,position:ve+1,total:be.length}),Le(),!0}async function nt(N,ve){const R=o.value.findIndex(Je=>Je.uid===ve.uid);let be;switch(N.key){case"ArrowUp":case"ArrowLeft":be=R-1;break;case"ArrowDown":case"ArrowRight":be=R+1;break;default:return}N.preventDefault(),je(ve.uid,be)&&(await Ue(),p.value?.querySelector(`[data-handle="${ve.uid}"]`)?.focus())}function st(N,ve){h.value=ve.uid,N.dataTransfer&&(N.dataTransfer.effectAllowed="move",N.dataTransfer.setData("text/plain",ve.name))}function vt(N,ve){h.value!==null&&(N.preventDefault(),m.value=ve.uid)}function wt(N,ve){h.value!==null&&(N.preventDefault(),je(h.value,o.value.findIndex(R=>R.uid===ve.uid)),Gt())}function Gt(){h.value=null,m.value=null}function Ee(N){const ve=N.file?.content_type??N.source?.type??"";return r.includes(ve.toLowerCase())}function ke(N){return!N.file||!Ee(N)||w.value.has(N.uid)?null:t.field.protected?y.value[N.uid]??null:N.file.thumb_url||N.file.url||null}function Me(){return typeof URL.revokeObjectURL=="function"}function kt(N){const ve=y.value[N];if(ve!==void 0){Me()&&URL.revokeObjectURL(ve);const R={...y.value};delete R[N],y.value=R}C.delete(N)}async function Rl(N){if(!L||!N.file||C.has(N.uid)||typeof URL.createObjectURL!="function")return;C.add(N.uid);const ve=await L.thumb(N.file.id);if(!(j||!_(N.uid)||!C.has(N.uid))){if(!ve){w.value=new Set([...w.value,N.uid]);return}y.value={...y.value,[N.uid]:URL.createObjectURL(ve)}}}Ie(()=>o.value.map(N=>`${N.uid}:${N.state}`).join(","),()=>{if(t.field.protected)for(const N of o.value)N.state==="done"&&Ee(N)&&Rl(N)});function Ss(N){w.value=new Set([...w.value,N.uid])}async function kc(N,ve){if(!L||!N.file||typeof URL.createObjectURL!="function")return;const R=await L.download(N.file.id);if(!R){Be(D("backend::lang.form.error_generic"),"danger");return}const be=URL.createObjectURL(R);A.push(be);const Je=document.createElement("a");Je.href=be,Je.rel="noopener",ve?Je.download=N.file.file_name:Je.target="_blank",Je.click()}function ya(N){return t.field.useCaption&&N.file?.title?N.file.title:N.name}function Es(N){return K.value&&!!N.file?.pending}const ql=k(()=>x.value===null?void 0:_(x.value));function As(N){x.value=N.uid,g.value=!0}function Rm(N){const ve=ql.value;ve&&(ve.file=N)}function qm(){const N=x.value;x.value=null,N!==null&&p.value?.querySelector(`[data-caption="${N}"]`)?.focus()}const Ds=k(()=>{const N=t.field.thumbOptions?.mode;return N==="fit"||N==="auto"?"object-contain":"object-cover"});return _t(()=>{$(!0)}),n&&Ie(n.revision,()=>{$(!1)}),Nt(()=>{j=!0,Y!==null&&(clearTimeout(Y),Y=null);for(const N of o.value)N.handle?.abort();if(Me()){for(const N of Object.values(y.value))URL.revokeObjectURL(N);for(const N of A)URL.revokeObjectURL(N)}}),(N,ve)=>(v(),S("div",{id:e.controlId,ref_key:"root",ref:p,role:"group","data-fileupload":"","data-field-name":e.field.name,"aria-labelledby":e.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0,"aria-busy":s.value==="loading"?"true":void 0,class:"flex min-w-0 flex-col gap-4"},[s.value==="loading"?(v(),S("span",QA)):s.value==="failed"?(v(),S("p",XA,I(u(D)("backend::lang.fileupload.load_failed")),1)):(v(),S(xe,{key:2},[b.value&&U.value.length===0?(v(),S("p",eD,I(u(D)("backend::lang.fileupload.empty")),1)):V.value&&E.value&&U.value.length>0?(v(),S("ul",tD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("li",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:_e([[R.state==="failed"?"border-danger":"border-border",h.value===R.uid?"opacity-50":"",m.value===R.uid&&h.value!==R.uid?"border-2 border-dashed border-primary bg-sel":""],"relative overflow-hidden rounded-inner border bg-surface"]),onDragover:be=>vt(be,R),onDrop:be=>wt(be,R)},[P("div",aD,[R.state==="uploading"?(v(),H(u(to),{key:0,size:20,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):R.state==="done"?(v(),S(xe,{key:2},[ke(R)&&!e.field.protected&&R.file?.url?(v(),S("a",{key:0,href:R.file.url,target:"_blank",rel:"noopener",class:"block size-full","aria-label":u(D)("backend::lang.fileupload.open_preview",{name:R.name})},[P("img",{src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"]),onError:be=>Ss(R)},null,42,lD)],8,rD)):ke(R)?(v(),S("button",{key:1,type:"button",class:"block size-full","aria-label":u(D)("backend::lang.fileupload.open_preview",{name:R.name}),onClick:be=>kc(R,!1)},[P("img",{src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"])},null,10,sD)],8,oD)):w.value.has(R.uid)?(v(),S("span",iD,[W(u(Dd),{size:20,"aria-hidden":"true"}),we(" "+I(u(D)("backend::lang.fileupload.preview_unavailable")),1)])):(v(),H(u(Lr),{key:3,size:20,class:"text-muted","aria-hidden":"true"}))],64)):(v(),H(u(Lr),{key:3,size:20,class:"text-muted","aria-hidden":"true"})),!b.value&&R.state==="done"?(v(),S("button",{key:4,type:"button",draggable:"true","data-handle":R.uid,"aria-label":u(D)("backend::lang.fileupload.move",{name:R.name}),class:_e([ki,"absolute top-2 left-2 cursor-grab"]),onKeydown:be=>nt(be,R),onDragstart:be=>st(be,R),onDragend:Gt},[W(u(Ad),{size:16,"aria-hidden":"true"})],40,uD)):le("",!0),b.value?le("",!0):(v(),S("div",cD,[e.field.useCaption&&R.state==="done"?(v(),S("button",{key:0,type:"button","data-caption":R.uid,"aria-label":u(D)("backend::lang.fileupload.edit_details",{name:R.name}),class:_e(ki),onClick:be=>As(R)},[W(u(zs),{size:16,"aria-hidden":"true"})],8,dD)):le("",!0),R.state==="failed"&&R.retryable?(v(),S("button",{key:1,type:"button","data-action":"retry","aria-label":u(D)("backend::lang.fileupload.retry"),class:_e(ki),onClick:be=>Ae(R)},[W(u(Hs),{size:16,"aria-hidden":"true"})],8,fD)):le("",!0),P("button",{type:"button","data-action":"remove-file","aria-label":R.state==="uploading"||R.state==="queued"?u(D)("backend::lang.fileupload.cancel_upload",{name:R.name}):u(D)("backend::lang.form.remove_item",{name:R.name}),class:_e(mO),onClick:be=>ge(R)},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,pD)]))]),P("div",hD,[P("span",{class:"truncate text-[13px]",title:ya(R)},I(ya(R)),9,vD),P("span",mD,[R.state==="queued"?(v(),S("span",yD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",gD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",bD,I(ue(R.size)),1)),Es(R)?(v(),S("span",_D,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",xD,[P("span",wD,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0)])],42,nD))),128))])):V.value&&!E.value&&U.value.length>0?(v(),S("div",kD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("div",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:"flex items-start gap-4"},[P("div",{class:_e([R.state==="failed"?"border-danger":"border-border","flex size-40 shrink-0 items-center justify-center overflow-hidden rounded-inner border bg-subtle"])},[R.state==="uploading"?(v(),H(u(to),{key:0,size:20,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):ke(R)?(v(),S("img",{key:2,src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"]),onError:be=>Ss(R)},null,42,CD)):w.value.has(R.uid)?(v(),S("span",SD,[W(u(Dd),{size:20,"aria-hidden":"true"}),we(" "+I(u(D)("backend::lang.fileupload.preview_unavailable")),1)])):(v(),H(u(Lr),{key:4,size:20,class:"text-muted","aria-hidden":"true"}))],2),P("div",ED,[P("span",{class:"truncate font-semibold",title:ya(R)},I(ya(R)),9,AD),P("span",DD,[R.state==="queued"?(v(),S("span",OD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",PD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",MD,I(ue(R.size)),1)),Es(R)?(v(),S("span",TD,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",RD,[P("span",qD,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0),b.value?le("",!0):(v(),S("div",ID,[R.state!=="failed"?(v(),H(lt,{key:0,size:"sm",variant:"outline","data-action":"replace-file",icon:u(Ws),onClick:O},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.replace_file")),1)]),_:1},8,["icon"])):le("",!0),R.state==="failed"&&R.retryable?(v(),H(lt,{key:1,size:"sm",variant:"outline","data-action":"retry",icon:u(Hs),onClick:be=>Ae(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.retry")),1)]),_:1},8,["icon","onClick"])):le("",!0),e.field.useCaption&&R.state==="done"?(v(),H(lt,{key:2,size:"sm",variant:"outline","data-caption":R.uid,icon:u(zs),onClick:be=>As(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.details_submit")),1)]),_:1},8,["data-caption","icon","onClick"])):le("",!0),W(lt,{size:"sm",variant:"danger","data-action":"remove-file",icon:u(Wt),onClick:be=>ge(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.remove_file")),1)]),_:1},8,["icon","onClick"])]))])],8,$D))),128))])):U.value.length>0?(v(),S("ul",FD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("li",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:_e([[R.state==="failed"?"border-danger":"border-border",h.value===R.uid?"opacity-50":"",m.value===R.uid&&h.value!==R.uid?"border-2 border-dashed border-primary bg-sel":""],"flex min-h-14 flex-col justify-center gap-1 rounded-inner border bg-surface px-3 py-2"]),onDragover:be=>vt(be,R),onDrop:be=>wt(be,R)},[P("div",ND,[E.value&&!b.value&&R.state==="done"?(v(),S("button",{key:0,type:"button",draggable:"true","data-handle":R.uid,"aria-label":u(D)("backend::lang.fileupload.move",{name:R.name}),class:_e([za,"cursor-grab"]),onKeydown:be=>nt(be,R),onDragstart:be=>st(be,R),onDragend:Gt},[W(u(Ad),{size:16,"aria-hidden":"true"})],40,VD)):le("",!0),P("span",LD,[R.state==="uploading"?(v(),H(u(to),{key:0,size:16,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):ke(R)?(v(),S("img",{key:2,src:ke(R)??void 0,alt:"",class:"size-8 object-cover",onError:be=>Ss(R)},null,40,jD)):(v(),H(u(Lr),{key:3,size:16,class:"text-muted","aria-hidden":"true"}))]),P("span",UD,[e.field.useCaption&&R.file?.title?(v(),S(xe,{key:0},[P("span",{class:"truncate font-semibold",title:R.file.title},I(R.file.title),9,zD),P("span",{class:"truncate text-[13px] text-muted",title:R.name},I(R.name),9,HD)],64)):(v(),S("span",{key:1,class:"truncate",title:R.name},I(R.name),9,WD))]),P("span",KD,[R.state==="queued"?(v(),S("span",GD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",YD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",JD,I(ue(R.size)),1)),Es(R)?(v(),S("span",ZD,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),!E.value&&!b.value&&R.state!=="failed"?(v(),H(lt,{key:1,size:"sm",variant:"outline","data-action":"replace-file",icon:u(Ws),onClick:O},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.replace_file")),1)]),_:1},8,["icon"])):le("",!0),P("span",QD,[R.state==="done"&&R.file?(v(),S(xe,{key:0},[!e.field.protected&&R.file.url?(v(),S("a",{key:0,href:R.file.url,download:"",target:"_blank",rel:"noopener","aria-label":u(D)("backend::lang.fileupload.download",{name:R.name}),class:_e(za)},[W(u(Ed),{size:16,"aria-hidden":"true"})],8,XD)):e.field.protected?(v(),S("button",{key:1,type:"button","data-action":"download","aria-label":u(D)("backend::lang.fileupload.download",{name:R.name}),class:_e(za),onClick:be=>kc(R,!0)},[W(u(Ed),{size:16,"aria-hidden":"true"})],8,eO)):le("",!0),e.field.useCaption&&!b.value?(v(),S("button",{key:2,type:"button","data-caption":R.uid,"aria-label":u(D)("backend::lang.fileupload.edit_details",{name:R.name}),class:_e(za),onClick:be=>As(R)},[W(u(zs),{size:16,"aria-hidden":"true"})],8,tO)):le("",!0)],64)):le("",!0),R.state==="failed"&&R.retryable?(v(),S("button",{key:1,type:"button","data-action":"retry","aria-label":u(D)("backend::lang.fileupload.retry"),class:_e(za),onClick:be=>Ae(R)},[W(u(Hs),{size:16,"aria-hidden":"true"})],8,nO)):le("",!0),b.value?le("",!0):(v(),S("button",{key:2,type:"button","data-action":"remove-file","aria-label":R.state==="uploading"||R.state==="queued"?u(D)("backend::lang.fileupload.cancel_upload",{name:R.name}):u(D)("backend::lang.form.remove_item",{name:R.name}),class:_e([za,"hover:bg-danger-soft hover:text-danger"]),onClick:be=>ge(R)},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,aO))])]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",rO,[P("span",lO,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0)],42,BD))),128))])):le("",!0),Q.value?(v(),S("button",{key:4,type:"button","data-fileupload-dropzone":"","aria-describedby":e.describedBy||void 0,class:_e([[i.value?"border-solid border-primary bg-sel":e.invalid?"border-dashed border-danger bg-subtle":"border-dashed border-border-strong bg-subtle"],"flex min-h-[112px] w-full flex-col items-center justify-center gap-2 rounded-control border-[1.5px] px-4 py-6 text-center transition-colors duration-150 ease-out hover:bg-hover"]),onClick:O,onDragover:me,onDragleave:ve[0]||(ve[0]=R=>i.value=!1),onDrop:he},[P("span",sO,[W(u(Ws),{size:20,class:"text-muted"})]),P("span",iO,I($e.value),1),ce.value!==""?(v(),S("span",uO,I(ce.value),1)):le("",!0)],42,oO)):se.value&&ce.value!==""?(v(),S("p",cO,I(ce.value),1)):le("",!0),c.value>0?(v(),S("p",dO,[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(u(os)("backend::lang.fileupload.too_many",c.value,{max:T.value??0})),1)])):le("",!0)],64)),P("input",{ref_key:"input",ref:f,type:"file",hidden:"",tabindex:"-1","data-fileupload-input":"",accept:de.value,multiple:E.value||void 0,onChange:J},null,40,fO),P("p",pO,I(d.value),1),e.field.useCaption?(v(),H(JA,{key:3,open:g.value,"onUpdate:open":ve[1]||(ve[1]=R=>g.value=R),file:ql.value?.file??null,routes:u(L),preview:ql.value?ke(ql.value):null,"id-prefix":e.controlId,onSaved:Rm,onClosed:qm},null,8,["open","file","routes","preview","id-prefix"])):le("",!0)],8,ZA))}}),gO=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],bO=Z({__name:"NumberField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),l=k(()=>yc(n.field));function o(s){const i=s.target.value.trim();if(i===""){a("update:modelValue",null);return}const c=Number(i);a("update:modelValue",Number.isFinite(c)?c:null)}return(s,i)=>(v(),S("input",Ne({id:e.controlId},l.value,{name:e.field.name,type:"number",inputmode:"decimal",value:r.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"h-input tabular-nums"],onInput:o}),null,16,gO))}}),_O=["id","aria-labelledby","aria-describedby"],xO=Z({__name:"PartialField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e;return(n,a)=>(v(),S("div",{id:e.controlId,role:"group","data-partial-field":"","aria-labelledby":t.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0},[e.source?(v(),H(xm,{key:0,variant:"field",source:e.source,name:t.field.path||t.field.name,"record-id":e.recordId??null},null,8,["source","name","record-id"])):(v(),H(mc,{key:1,"data-partial-failed":"",text:u(D)("backend::lang.extension.partial_failed")},null,8,["text"]))],8,_O))}}),Jt="default";function la(e){return e.tab?`tab:${e.tab}`:Jt}function Ro(e,t){return`${e}-tab-${t}`}function _c(e,t){return`${e}-panel-${t}`}function xc(e,t){const n=e.context;if(n==null)return!0;const a=Array.isArray(n)?n:[n];return a.length===0||a.includes(t)}function zt(e,t){const n={};for(const a of e){if(a.readOnly||!gM(a.type))continue;const r=t[a.name];r!==void 0&&(n[a.name]=r)}return n}function wc(e){const t={};for(const n of e)n.default!==void 0?t[n.name]=n.default:n.type==="switch"||n.type==="checkbox"?t[n.name]=!1:n.type==="relation"&&n.multiple&&(t[n.name]=[]);return t}function Pl(e){const t={};for(const[n,a]of Object.entries(e??{})){const r=Array.isArray(a)?a.filter(l=>typeof l=="string"&&l!==""):typeof a=="string"&&a!==""?[a]:[];r.length>0&&(t[n]=r)}return t}function oa(e){return JSON.stringify(Object.keys(e).sort().map(t=>[t,e[t]]))}function Ml(e,t){const n=document.getElementById(`${e}-${t}`);return n?(n.matches("input, select, textarea, button, [tabindex]")||n.setAttribute("tabindex","-1"),n.focus(),!0):!1}const wO={role:"tablist",class:"inline-flex gap-1 rounded-inner border border-border bg-subtle p-1"},kO=["id","data-tab","aria-selected","aria-controls","tabindex","onClick","onKeydown"],$O=["aria-label"],Om=Z({__name:"FormTabs",props:{tabs:{},modelValue:{},idPrefix:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t;function r(l,o){const s=l.key==="ArrowRight"?1:l.key==="ArrowLeft"?-1:0;if(s===0)return;l.preventDefault();const i=(o+s+n.tabs.length)%n.tabs.length,c=n.tabs[i];c&&(a("update:modelValue",c.key),document.getElementById(Ro(n.idPrefix,i))?.focus())}return(l,o)=>(v(),S("div",wO,[(v(!0),S(xe,null,Ve(e.tabs,(s,i)=>(v(),S("button",{id:u(Ro)(e.idPrefix,i),key:s.key,type:"button",role:"tab","data-tab":s.key,"aria-selected":s.key===e.modelValue?"true":"false","aria-controls":u(_c)(e.idPrefix,i),tabindex:s.key===e.modelValue?0:-1,class:_e([s.key===e.modelValue?"bg-surface text-text shadow-tab":"text-muted hover:text-text","inline-flex h-[34px] items-center gap-2 rounded-tab px-4 font-semibold transition-colors duration-150 ease-out"]),onClick:c=>a("update:modelValue",s.key),onKeydown:c=>r(c,i)},[we(I(s.label)+" ",1),s.errors>0?(v(),S("span",{key:0,"data-tab-errors":"","aria-label":u(os)("backend::lang.form.tab_errors",s.errors),class:"inline-flex h-5 min-w-5 items-center justify-center rounded-pill bg-danger px-1.5 text-[11px] font-bold text-white"},I(s.errors),9,$O)):le("",!0)],42,kO))),128))]))}}),CO={class:"flex items-start gap-3 p-6 pb-4"},SO={key:0,"data-child-loading":"","aria-hidden":"true",class:"grid grid-cols-1 gap-x-6 gap-y-[22px] min-[600px]:grid-cols-2"},EO={key:1,role:"alert","data-child-load-failed":"",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},AO=["id","role","aria-labelledby"],DO=["disabled"],OO={class:"flex items-center gap-2.5 border-t border-border px-6 py-4"},PO={class:"ml-auto flex gap-2.5"},MO=Z({__name:"RelationChildModal",props:{open:{type:Boolean},source:{},ownerId:{},relation:{},schema:{},mode:{},childId:{},sessionKey:{},canDelete:{type:Boolean}},emits:["update:open","changed","gone","closed"],setup(e,{emit:t}){const n=e,a=t,r=M({}),l=M({}),o=M({}),s=M(!1),i=M(!1),c=M(!1),d=M(""),f=M(Jt),p=M(Mo()),h=M(0),m=M(0),x=M(null),g=Sr();let y=0;const w=k(()=>`child-${n.relation}`),C=k(()=>n.mode==="preview"),A=k(()=>n.mode==="create"?"create":"update"),L=k(()=>{const G=((C.value?n.schema.viewForm:n.schema.manageForm)??[]).filter(q=>xc(q,A.value));return C.value?G.map(q=>({...q,readOnly:!0,attributes:{...q.attributes??{},readonly:!0}})):G}),Y=k(()=>L.value.map(B=>B.name)),z=k(()=>{if(!L.value.some(G=>G.tab))return[];const B=[];for(const G of L.value){const q=la(G);let te=B.find(ye=>ye.key===q);te||(te={key:q,label:G.tab||D("backend::lang.form.tab_default"),errors:0},q===Jt?B.unshift(te):B.push(te)),o.value[G.name]&&(te.errors+=1)}return B}),j=k(()=>Math.max(z.value.findIndex(B=>B.key===f.value),0)),b=k(()=>{if(z.value.length===0)return L.value;const B=z.value[j.value]?.key??Jt;return L.value.filter(G=>la(G)===B)}),E=k(()=>{const B=n.schema.messages;return n.mode==="create"?Fe(B.createTitle):Fe(C.value?B.previewTitle:B.updateTitle)}),V=k(()=>Fe(n.mode==="create"?n.schema.messages.createSubmit:n.schema.messages.updateSubmit)),T=k(()=>!C.value&&!s.value&&!i.value&&(h.value>0||oa(zt(L.value,r.value))!==d.value));function K(){return{[pa]:n.sessionKey,[wm]:p.value}}function re(){return{...n.source,id:n.ownerId,name:n.relation}}Dt(Cs,{get key(){return n.sessionKey},get childKey(){return p.value},get recordId(){return n.childId??0},routes:B=>X3(n.source,n.ownerId,n.relation,n.childId??0,B,n.sessionKey,p.value),markDirty:()=>{h.value++},pendingChanges:Tt(h),revision:Tt(m)}),Dt(gc,k(()=>r.value)),Dt(bc,ae);function ae(B,G){if(r.value={...r.value,[B]:G},o.value[B]){const q={...o.value};delete q[B],o.value=q}}function Q(B,G){r.value={...B},l.value=G?.labels??{},d.value=oa(zt(L.value,r.value))}async function se(){await Ue(),x.value?.querySelector('input:not([type="hidden"]):not([tabindex="-1"]), select, textarea, button, [contenteditable="true"], [tabindex="0"]')?.focus()}function ne(){a("update:open",!1),Be(D("backend::lang.relation.child_gone"),"danger"),a("gone")}async function ie(){const B=++y;if(o.value={},i.value=!1,c.value=!1,h.value=0,p.value=Mo(),f.value=Jt,n.mode==="create"||n.childId===null){s.value=!1,Q(wc(L.value)),f.value=z.value[0]?.key??Jt,await se();return}s.value=!0;try{const G=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}",{params:{path:{...re(),child:n.childId},header:K()}});if(B!==y)return;if(G.data)Q(G.data.data,G.data.meta),f.value=z.value[0]?.key??Jt;else if(G.response.status===404){ne();return}else i.value=!0}catch{B===y&&(i.value=!0)}finally{B===y&&(s.value=!1)}B===y&&await se()}Ie(()=>n.open,B=>{B?ie():y++},{immediate:!0});async function de(B){if(B){a("update:open",!0);return}c.value||T.value&&!await g.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function $e(B){o.value=Pl(B);const G=L.value.filter(te=>o.value[te.name]),q=G.find(te=>la(te)===f.value)??G[0];q&&(z.value.length>0&&(f.value=la(q)),await Ue(),Ml(w.value,q.name))}async function Ce(){if(!(c.value||C.value||s.value||i.value)){c.value=!0;try{const B=zt(L.value,r.value),G=n.mode==="create"||n.childId===null?await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records",{params:{path:re(),header:K()},body:B}):await Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}",{params:{path:{...re(),child:n.childId},header:K()},body:B});if(G.data){const te=n.mode==="create"?"created":"updated";o.value={},h.value=0,a("update:open",!1),Be(Fe(te==="created"?n.schema.messages.created:n.schema.messages.updated)),a("changed",te);return}const q=G.response.status;q===422?await $e(G.error?.error.details):q===404?ne():Be(G.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}}async function ue(){if(c.value||n.childId===null)return;const B=n.childId;if(await g.ask({message:Fe(n.schema.messages.deleteOneConfirm),confirmLabel:D("backend::lang.form.delete"),danger:!0})){c.value=!0;try{const q=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/delete",{params:{path:re(),header:{[pa]:n.sessionKey}},body:{ids:[B]}});if(q.data){h.value=0,a("update:open",!1),Be(Fe(n.schema.messages.deleted,q.data.data.deleted||1)),a("changed","deleted");return}if(q.response.status===404){ne();return}Be(q.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}}function Te(B){B.preventDefault()}function ce(B){B.preventDefault(),a("closed")}return(B,G)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":de},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-child-modal":"","data-dialog-content":"","data-mode":e.mode,"aria-modal":"true","aria-describedby":void 0,class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[720px] -translate-x-1/2 -translate-y-1/2 flex-col rounded-modal bg-surface text-text shadow-pop",onOpenAutoFocus:Te,onCloseAutoFocus:ce},{default:F(()=>[P("div",CO,[W(u(Al),{class:"min-w-0 flex-1 text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(E.value),1)]),_:1}),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:c.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),P("div",{ref_key:"body",ref:x,"data-child-body":"",class:"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-6 pb-6"},[s.value?(v(),S("div",SO,[(v(),S(xe,null,Ve(6,q=>P("div",{key:q,class:"flex flex-col gap-1.5"},[...G[3]||(G[3]=[P("span",{class:"block h-3 w-24 rounded-[6px] bg-skel"},null,-1),P("span",{class:"block h-input rounded-control bg-skel"},null,-1)])])),64))])):i.value?(v(),S("p",EO,I(u(D)("backend::lang.relation.child_load_failed")),1)):(v(),S(xe,{key:2},[W(Ol,{errors:o.value,"field-names":Y.value},null,8,["errors","field-names"]),z.value.length>0?(v(),H(Om,{key:0,modelValue:f.value,"onUpdate:modelValue":G[0]||(G[0]=q=>f.value=q),tabs:z.value,"id-prefix":w.value,class:"self-start"},null,8,["modelValue","tabs","id-prefix"])):le("",!0),P("form",{id:z.value.length>0?u(_c)(w.value,j.value):void 0,role:z.value.length>0?"tabpanel":void 0,"aria-labelledby":z.value.length>0?u(Ro)(w.value,j.value):void 0,novalidate:"",onSubmit:ht(Ce,["prevent"])},[P("fieldset",{disabled:c.value||C.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:b.value,values:r.value,errors:o.value,labels:l.value,source:e.source,"record-id":e.childId,"id-prefix":w.value,onUpdate:ae},null,8,["fields","values","errors","labels","source","record-id","id-prefix"])],8,DO)],40,AO)],64))],512),P("div",OO,[e.mode==="update"&&e.canDelete&&!s.value&&!i.value?(v(),H(lt,{key:0,variant:"danger","data-action":"delete-child",icon:u(wl),disabled:c.value,onClick:ue},{default:F(()=>[we(I(u(D)("backend::lang.form.delete")),1)]),_:1},8,["icon","disabled"])):le("",!0),P("div",PO,[C.value?(v(),H(lt,{key:0,variant:"outline","data-action":"cancel",onClick:G[1]||(G[1]=q=>de(!1))},{default:F(()=>[we(I(u(D)("backend::lang.form.close")),1)]),_:1})):(v(),S(xe,{key:1},[W(lt,{variant:"ghost","data-action":"cancel",disabled:c.value,onClick:G[2]||(G[2]=q=>de(!1))},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1},8,["disabled"]),i.value?le("",!0):(v(),H(lt,{key:0,variant:"primary","data-action":"save-child",disabled:c.value||s.value,onClick:Ce},{default:F(()=>[we(I(c.value?u(D)("backend::lang.form.saving"):V.value),1)]),_:1},8,["disabled"]))],64))])])]),_:1},8,["data-mode"])]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(g).request.value!==null,message:u(g).request.value?.message??"","confirm-label":u(g).request.value?.confirmLabel,danger:u(g).request.value?.danger,onConfirm:u(g).confirm,onCancel:u(g).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),TO={class:"flex items-start gap-3"},RO={class:"flex min-w-0 flex-1 flex-col gap-1"},qO=["title"],IO={key:0,class:"truncate text-[13px] text-muted"},FO=["disabled"],BO={class:"relative block"},NO={class:"sr-only"},VO=["value","placeholder"],LO=["aria-multiselectable","aria-label","aria-busy"],jO=["data-candidate","aria-selected","onClick","onKeydown"],UO={class:"flex size-8 shrink-0 items-center justify-center rounded-full bg-subtle text-[12px] font-bold","aria-hidden":"true"},zO={class:"flex min-w-0 flex-1 flex-col leading-tight"},HO={class:"truncate font-semibold"},WO={key:0,class:"truncate text-[13px] text-muted"},KO={key:0,class:"block size-2.5 rounded-full bg-primary"},GO={key:0,role:"presentation",class:"px-1 py-3 text-[13px] text-muted"},YO={key:1,role:"presentation","data-candidates-empty":"",class:"px-1 py-3 text-[13px] text-muted"},JO=["aria-label"],ZO={"data-candidates-range":"",class:"flex-1"},QO=["aria-label","disabled"],XO=["aria-label","disabled"],eP={class:"flex gap-2.5"},tP=["disabled"],nP=["disabled"],aP=["disabled","aria-busy"],rP=5,lP=300,Bf="inline-flex size-[34px] items-center justify-center rounded-tab border border-border text-text hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",oP=Z({__name:"RelationPickerModal",props:{open:{type:Boolean},source:{},recordId:{},relation:{},schema:{},sessionKey:{}},emits:["update:open","linked","closed"],setup(e,{emit:t}){const n=e,a=t,r=M(""),l=M(1),o=M([]),s=M(null),i=M(!1),c=M(!1),d=M(new Set),f=M(null),p=M(1),h=M(null),m=M({}),x=M({}),g=M(null);let y=0,w=null;const C=k(()=>n.schema.manage.list.columns),A=k(()=>C.value[0]?.key??""),L=k(()=>C.value[1]?.key??""),Y=k(()=>d.value.size),z=`relation-${n.relation}-candidates`,j=k(()=>n.schema.pivotForm??[]),b=k(()=>j.value.map(_=>_.name)),E=k(()=>j.value.length>0),V=k(()=>`link-${n.relation}`);function T(){return n.sessionKey?{[pa]:n.sessionKey}:void 0}const K=k(()=>{const _=s.value;if(!_||_.total===0)return"";const $=(_.page-1)*_.per_page+1,O=Math.min(_.page*_.per_page,_.total);return D("backend::lang.relation.candidates_range",{from:$,to:O,total:_.total})}),re=k(()=>Math.max(s.value?.last_page??1,1));function U(_){const $=_.id;return typeof $=="number"&&Number.isInteger($)?$:typeof $=="string"&&/^\d+$/.test($)?Number($):null}function ae(_,$){const O=$===""?void 0:_[$];return typeof O=="string"||typeof O=="number"?String(O):""}function Q(_){return _.split(/[\s@._-]+/).filter(Boolean).slice(0,2).map($=>$.charAt(0).toUpperCase()).join("")}async function se(){const _=++y;i.value=!0;try{const $=r.value.trim(),{data:O}=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates",{params:{path:{...n.source,id:n.recordId,name:n.relation},query:{search:$===""?void 0:$,page:l.value,per_page:rP},header:T()}});if(_!==y)return;o.value=O?.data??[],s.value=O?.meta??null}catch{_===y&&(o.value=[],s.value=null)}finally{_===y&&(i.value=!1)}}function ne(){w!==null&&(clearTimeout(w),w=null),y++,r.value="",l.value=1,o.value=[],s.value=null,i.value=!1,d.value=new Set,p.value=1,h.value=null,m.value={},x.value={}}Ie(()=>n.open,_=>{_?(ne(),se()):ne()},{immediate:!0});function ie(_){r.value=_.target.value,w!==null&&clearTimeout(w),w=setTimeout(()=>{w=null,l.value=1,se()},lP)}function de(_){_<1||_>re.value||_===l.value||(l.value=_,se())}function $e(_){const $=U(_);return $!==null&&d.value.has($)}function Ce(_){const $=U(_);if($===null)return;if(E.value){d.value=new Set([$]),h.value=_;return}const O=new Set(d.value);O.has($)?O.delete($):O.add($),d.value=O}async function ue(){!E.value||d.value.size===0||!h.value||(p.value=2,m.value=wc(j.value),x.value={},await Ue(),g.value?.querySelector('input, select, textarea, button, [contenteditable="true"]')?.focus())}async function Te(){if(c.value)return;p.value=1,x.value={},await Ue(),(document.querySelector(`#${z} [aria-selected="true"]`)??f.value)?.focus()}function ce(_,$){if(m.value={...m.value,[_]:$},x.value[_]){const O={...x.value};delete O[_],x.value=O}}function B(_,$,O){switch(_.key){case" ":_.preventDefault(),Ce($);break;case"Enter":_.preventDefault(),Ce($),E.value&&ue();break;case"ArrowDown":case"ArrowUp":{_.preventDefault();const X=_.currentTarget.parentElement?.querySelectorAll('[role="option"]'),J=_.key==="ArrowDown"?1:-1;X?.[Math.min(Math.max(O+J,0),X.length-1)]?.focus();break}}}function G(_){a("update:open",_)}async function q(){const _=[...d.value];if(c.value||_.length===0)return;const $=E.value;c.value=!0;try{const O=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link",{params:{path:{...n.source,id:n.recordId,name:n.relation},header:T()},body:$?{ids:_.slice(0,1),pivot:zt(j.value,m.value)}:{ids:_}});if(O.data){G(!1),a("linked",O.data.data.linked??_.length);return}const X=O.response.status;if($&&X===422){x.value=Pl(O.error?.error.details);const J=j.value.find(ee=>x.value[ee.name]);J&&(await Ue(),Ml(V.value,J.name));return}if($&&X===404){Be(D("backend::lang.relation.child_gone"),"danger"),d.value=new Set,h.value=null,p.value=1,se();return}if($){Be(D("backend::lang.form.error_generic"),"danger");return}Be(O.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}function te(_){_.preventDefault(),f.value?.focus()}function ye(_){_.preventDefault(),a("closed")}return Nt(()=>{w!==null&&clearTimeout(w)}),(_,$)=>(v(),H(u(Cl),{open:e.open,"onUpdate:open":G},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-picker":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-modal bg-surface p-6 text-text shadow-pop",onOpenAutoFocus:te,onCloseAutoFocus:ye},{default:F(()=>[P("div",TO,[P("div",RO,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(p.value===2?u(Fe)(e.schema.messages.pivotTitle):u(Fe)(e.schema.messages.link)),1)]),_:1}),p.value===1?(v(),H(u(fl),{key:0,class:"text-muted"},{default:F(()=>[we(I(u(Fe)(e.schema.messages.linkHint)),1)]),_:1})):(v(),H(u(fl),{key:1,class:"flex min-w-0 flex-col","data-chosen-record":""},{default:F(()=>[P("span",{class:"truncate font-semibold text-text",title:ae(h.value??{},A.value)},I(ae(h.value??{},A.value)),9,qO),L.value?(v(),S("span",IO,I(ae(h.value??{},L.value)),1)):le("",!0)]),_:1}))]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])]),p.value===2?(v(),S("div",{key:0,ref_key:"stepTwo",ref:g,"data-pivot-step":"",class:"flex min-h-0 flex-col gap-4 overflow-y-auto"},[W(Ol,{errors:x.value,"field-names":b.value},null,8,["errors","field-names"]),P("form",{novalidate:"",onSubmit:ht(q,["prevent"])},[P("fieldset",{disabled:c.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:j.value,values:m.value,errors:x.value,source:e.source,"record-id":null,"id-prefix":V.value,onUpdate:ce},null,8,["fields","values","errors","source","id-prefix"])],8,FO)],32)],512)):le("",!0),Oa(P("label",BO,[P("span",NO,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:18,class:"pointer-events-none absolute top-1/2 left-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{ref_key:"searchInput",ref:f,type:"search","data-candidate-search":"",value:r.value,placeholder:u(Fe)(e.schema.messages.candidateSearch),"aria-controls":z,class:"h-input w-full rounded-control border border-border-strong bg-surface pr-3.5 pl-10",onInput:ie},null,40,VO)],512),[[Bi,p.value===1]]),Oa(P("ul",{id:z,role:"listbox","aria-multiselectable":E.value?"false":"true","aria-label":u(Fe)(e.schema.messages.link),"aria-busy":i.value?"true":void 0,class:"flex min-h-0 flex-col gap-2 overflow-y-auto"},[(v(!0),S(xe,null,Ve(o.value,(O,X)=>(v(),S("li",{key:U(O)??`row-${X}`,role:"option",tabindex:"0","data-candidate":U(O)??void 0,"aria-selected":$e(O)?"true":"false",class:_e([$e(O)?"border-[#e0b020] bg-sel":"border-border hover:bg-hover","flex h-[54px] cursor-pointer items-center gap-3 rounded-inner border px-3 transition-colors duration-150 ease-out"]),onClick:J=>Ce(O),onKeydown:J=>B(J,O,X)},[P("span",UO,I(Q(ae(O,A.value))),1),P("span",zO,[P("span",HO,I(ae(O,A.value)),1),L.value?(v(),S("span",WO,I(ae(O,L.value)),1)):le("",!0)]),E.value?(v(),S("span",{key:0,"data-radio":"",class:_e([$e(O)?"border-primary":"border-border-strong bg-surface","flex size-[18px] shrink-0 items-center justify-center rounded-full border"]),"aria-hidden":"true"},[$e(O)?(v(),S("span",KO)):le("",!0)],2)):(v(),S("span",{key:1,class:_e([$e(O)?"border-primary bg-primary text-on-primary":"border-border-strong bg-surface","flex size-[18px] shrink-0 items-center justify-center rounded-checkbox border"]),"aria-hidden":"true"},[$e(O)?(v(),H(u(fr),{key:0,size:14})):le("",!0)],2))],42,jO))),128)),i.value&&o.value.length===0?(v(),S("li",GO,I(u(D)("backend::lang.list.loading")),1)):!i.value&&o.value.length===0?(v(),S("li",YO,I(u(D)("backend::lang.relation.no_candidates")),1)):le("",!0)],8,LO),[[Bi,p.value===1]]),p.value===1&&s.value&&s.value.total>0?(v(),S("nav",{key:1,"aria-label":u(D)("backend::lang.list.pagination"),class:"flex items-center gap-2 text-[13px] text-muted"},[P("span",ZO,I(K.value),1),P("button",{type:"button","data-page":"prev","aria-label":u(D)("backend::lang.list.prev_page"),class:_e(Bf),disabled:i.value||l.value<=1,onClick:$[0]||($[0]=O=>de(l.value-1))},[W(u(ns),{size:16,"aria-hidden":"true"})],8,QO),P("button",{type:"button","data-page":"next","aria-label":u(D)("backend::lang.list.next_page"),class:_e(Bf),disabled:i.value||l.value>=re.value,onClick:$[1]||($[1]=O=>de(l.value+1))},[W(u(xl),{size:16,"aria-hidden":"true"})],8,XO)],8,JO)):le("",!0),P("div",eP,[p.value===2?(v(),S("button",{key:0,type:"button","data-action":"back",disabled:c.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:Te},I(u(D)("backend::lang.relation.back")),9,tP)):(v(),H(u(gr),{key:1,"data-action":"cancel",class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover"},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1})),E.value&&p.value===1?(v(),S("button",{key:2,type:"button","data-action":"next",disabled:Y.value===0,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:ue},I(u(D)("backend::lang.relation.next")),9,nP)):(v(),S("button",{key:3,type:"button","data-action":"confirm-link",disabled:c.value||Y.value===0,"aria-busy":c.value?"true":void 0,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:q},[E.value?(v(),S(xe,{key:0},[we(I(c.value?u(D)("backend::lang.form.saving"):u(Fe)(e.schema.messages.linkSubmit)),1)],64)):(v(),S(xe,{key:1},[we(I(u(D)("backend::lang.relation.add_count",{count:Y.value})),1)],64))],8,aP))])]),_:1})]),_:1})]),_:1},8,["open"]))}}),sP={class:"flex items-start gap-3"},iP={class:"flex min-w-0 flex-1 flex-col gap-1"},uP={key:0,"data-pivot-loading":"","aria-hidden":"true",class:"flex flex-col gap-1.5"},cP={key:1,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},dP=["disabled"],fP={class:"flex gap-2.5"},pP=["disabled"],hP=["disabled"],vP=Z({__name:"RelationPivotModal",props:{open:{type:Boolean},source:{},ownerId:{},relation:{},schema:{},childId:{},childName:{},sessionKey:{}},emits:["update:open","saved","gone","closed"],setup(e,{emit:t}){const n=e,a=t,r=M({}),l=M({}),o=M(!1),s=M(!1),i=M(!1),c=M(""),d=Sr();let f=0;const p=k(()=>`pivot-${n.relation}`),h=k(()=>n.schema.pivotForm??[]),m=k(()=>h.value.map(j=>j.name)),x=k(()=>!o.value&&!s.value&&oa(zt(h.value,r.value))!==c.value);function g(){return{[pa]:n.sessionKey}}function y(j){return{...n.source,id:n.ownerId,name:n.relation,child:j}}function w(j,b){if(r.value={...r.value,[j]:b},l.value[j]){const E={...l.value};delete E[j],l.value=E}}function C(){a("update:open",!1),Be(D("backend::lang.relation.child_gone"),"danger"),a("gone")}async function A(){const j=++f;if(l.value={},s.value=!1,i.value=!1,r.value={},c.value=oa({}),n.childId!==null){o.value=!0;try{const b=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/pivot/{child}",{params:{path:y(n.childId),header:g()}});if(j!==f)return;b.data?(r.value={...b.data.data},c.value=oa(zt(h.value,r.value))):b.response.status===404?C():s.value=!0}catch{j===f&&(s.value=!0)}finally{j===f&&(o.value=!1)}}}Ie(()=>n.open,j=>{j?A():f++},{immediate:!0});async function L(j){if(j){a("update:open",!0);return}i.value||x.value&&!await d.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function Y(){if(!(i.value||o.value||s.value||n.childId===null)){i.value=!0;try{const j=await Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/pivot/{child}",{params:{path:y(n.childId),header:g()},body:zt(h.value,r.value)});if(j.data){l.value={},c.value=oa(zt(h.value,r.value)),a("update:open",!1),Be(Fe(n.schema.messages.pivotSaved)),a("saved");return}const b=j.response.status;if(b===422){l.value=Pl(j.error?.error.details);const E=h.value.find(V=>l.value[V.name]);E&&(await Ue(),Ml(p.value,E.name))}else b===404?C():Be(D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{i.value=!1}}}function z(j){j.preventDefault(),a("closed")}return(j,b)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":L},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-pivot-modal":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 overflow-y-auto rounded-modal bg-surface p-6 text-text shadow-pop",onCloseAutoFocus:z},{default:F(()=>[P("div",sP,[P("div",iP,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(u(Fe)(e.schema.messages.pivotTitle)),1)]),_:1}),W(u(fl),{class:"truncate text-muted",title:e.childName},{default:F(()=>[we(I(e.childName),1)]),_:1},8,["title"])]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:i.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),o.value?(v(),S("div",uP,[...b[1]||(b[1]=[P("span",{class:"block h-3 w-24 rounded-[6px] bg-skel"},null,-1),P("span",{class:"block h-input rounded-control bg-skel"},null,-1)])])):s.value?(v(),S("p",cP,I(u(D)("backend::lang.relation.child_load_failed")),1)):(v(),S("form",{key:2,class:"flex flex-col gap-4",novalidate:"",onSubmit:ht(Y,["prevent"])},[W(Ol,{errors:l.value,"field-names":m.value},null,8,["errors","field-names"]),P("fieldset",{disabled:i.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:h.value,values:r.value,errors:l.value,source:e.source,"record-id":null,"id-prefix":p.value,onUpdate:w},null,8,["fields","values","errors","source","id-prefix"])],8,dP)],32)),P("div",fP,[P("button",{type:"button","data-action":"cancel",disabled:i.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:b[0]||(b[0]=E=>L(!1))},I(u(D)("backend::lang.form.cancel")),9,pP),P("button",{type:"button","data-action":"save-pivot",disabled:i.value||o.value||s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:Y},I(i.value?u(D)("backend::lang.form.saving"):u(Fe)(e.schema.messages.pivotSubmit)),9,hP)])]),_:1})]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(d).request.value!==null,message:u(d).request.value?.message??"","confirm-label":u(d).request.value?.confirmLabel,danger:u(d).request.value?.danger,onConfirm:u(d).confirm,onCancel:u(d).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),mP=["id","data-relation-name","data-deferred","aria-labelledby","aria-describedby"],yP={class:"flex flex-col gap-2"},gP={class:"flex flex-wrap items-center gap-3"},bP={class:"flex min-w-0 flex-1 flex-col"},_P=["id"],xP=["id"],wP={key:0,class:"relative block w-[220px] max-w-full"},kP={class:"sr-only"},$P=["value","placeholder"],CP={key:0,"data-relation-pending":"",class:"flex items-center gap-2 text-[13px] text-muted"},SP={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},EP={key:1,class:"overflow-hidden rounded-inner border border-border"},AP={"data-relation-empty":"",class:"text-muted"},DP=["aria-label","onClick"],OP=300,PP=Z({__name:"RelationManager",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(Cs,null),a=k(()=>t.field.relation||t.field.name),r=k(()=>typeof t.recordId=="number"?t.recordId:n&&n.recordId===0&&t.field.deferrable?0:null),l=k(()=>r.value===0),o=k(()=>t.source!=null&&r.value!==null),s=n?.key??Mo(),i=M(null),c=M([]),d=M(null),f=M(!0),p=M(!1),h=M(""),m=M(1),x=M(null),g=M([]),y=M(!1),w=M(!1),C=M(!1),A=M("create"),L=M(null),Y=M(!1),z=M(null),j=M("");let b=null,E=null,V=null;const T=Sr();let K=0,re=null;const U=k(()=>i.value?.view.list.columns??[]),ae=k(()=>i.value?.view.toolbarButtons??[]),Q=k(()=>i.value?.messages),se=k(()=>`${t.controlId}-heading`),ne=k(()=>`${t.controlId}-comment`),ie=k(()=>ae.value.includes("create")&&(i.value?.manageForm?.length??0)>0),de=k(()=>ae.value.includes("update")&&(i.value?.manageForm?.length??0)>0),$e=k(()=>i.value?.kind==="belongsToMany"&&(i.value?.pivotForm?.length??0)>0&&(ae.value.includes("link")||ae.value.includes("update"))),Ce=k(()=>(i.value?.viewForm?.length??0)>0),ue=k(()=>de.value?"update":$e.value?"pivot":Ce.value?"preview":null),Te=k(()=>de.value&&$e.value),ce=k(()=>ae.value.includes("unlink")||ae.value.includes("delete"));function B(){return l.value?{[pa]:s}:void 0}function G(){return{...t.source,id:r.value,name:a.value}}function q(){l.value&&n?.markDirty()}async function te(){const{data:Ee}=await Re.GET("/{vendor}/{plugin}/{controller}/schema/relation/{name}",{params:{path:{...t.source,name:a.value}}});i.value=Ee?.data??null}async function ye(){const Ee=++K;f.value=!0,p.value=!1;try{const ke=h.value.trim(),Me={page:m.value};ke!==""&&(Me.search=ke),x.value&&(Me.sort=x.value.column,Me.dir=x.value.dir);const{data:kt}=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}",{params:{path:G(),query:Me,header:B()}});if(Ee!==K)return;c.value=kt?.data??[],d.value=kt?.meta??null,p.value=!kt}catch{Ee===K&&(c.value=[],d.value=null,p.value=!0)}finally{Ee===K&&(f.value=!1)}}async function _(){if(o.value){try{await te()}catch{i.value=null}if(!i.value){f.value=!1,p.value=!0;return}await ye()}}function $(Ee){h.value=Ee.target.value,re!==null&&clearTimeout(re),re=setTimeout(()=>{re=null,m.value=1,g.value=[],ye()},OP)}function O(Ee){m.value=Ee,g.value=[],ye()}function X(Ee){const ke=x.value;ke?.column!==Ee?x.value={column:Ee,dir:"asc"}:ke.dir==="asc"?x.value={column:Ee,dir:"desc"}:x.value=null,m.value=1,g.value=[],ye()}function J(){return g.value.map(Number).filter(Ee=>Number.isInteger(Ee)&&Ee>0)}function ee(Ee){const ke=Ee.id;return typeof ke=="number"&&Number.isInteger(ke)?ke:typeof ke=="string"&&/^\d+$/.test(ke)?Number(ke):null}function me(Ee){const ke=U.value[0]?.key,Me=ke?Ee[ke]:void 0;return typeof Me=="string"||typeof Me=="number"?String(Me):""}async function he(){const Ee=J();if(!(y.value||Ee.length===0||!i.value||!await T.ask({message:Fe(Q.value?.unlinkConfirm,Ee.length),confirmLabel:Fe(Q.value?.unlinkSelected),danger:!0}))){y.value=!0;try{const Me=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink",{params:{path:G(),header:B()},body:{ids:Ee}});if(Me.data){g.value=[],q(),Be(Fe(Q.value?.unlinked,Me.data.data.removed??Ee.length)),await ye();return}Be(Me.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{y.value=!1}}}async function pe(Ee){y.value=!0;try{const ke=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/delete",{params:{path:G(),header:B()},body:{ids:Ee}});if(ke.data){g.value=[],q(),Be(Fe(Q.value?.deleted,ke.data.data.deleted||Ee.length)),await ye();return}Be(ke.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{y.value=!1}}async function oe(){const Ee=J();y.value||Ee.length===0||!i.value||await T.ask({message:Fe(Q.value?.deleteConfirm,Ee.length),confirmLabel:Fe(Q.value?.deleteSelected),danger:!0},()=>pe(Ee))}async function Ae(Ee){q(),Be(Fe(Q.value?.linked,Ee)),g.value=[],await ye()}function ge(Ee){b=Ee.currentTarget??V,A.value="create",L.value=null,C.value=!0}function Se(Ee,ke){const Me=ee(Ee);Me!==null&&(b=ke,z.value=Me,j.value=me(Ee),Y.value=!0)}function Pe(Ee,ke){const Me=ue.value,kt=ee(Ee);if(!(Me===null||kt===null)){if(Me==="pivot"){Se(Ee,ke);return}b=ke,A.value=Me,L.value=kt,C.value=!0}}async function Le(){q(),g.value=[],await ye()}async function Ye(){q(),await ye()}async function je(){g.value=[],await ye()}function nt(){const Ee=b&&b.isConnected?b:null;b=null,Ee?.focus()}function st(){E?.focus()}function vt(Ee){const ke=Ee?.$el;return ke instanceof HTMLElement?ke:null}function wt(Ee){E=vt(Ee)}function Gt(Ee){V=vt(Ee)}return Nt(()=>{re!==null&&clearTimeout(re)}),_(),(Ee,ke)=>o.value?(v(),S("section",{key:0,id:e.controlId,"data-relation-manager":"","data-relation-name":a.value,"data-deferred":l.value?"true":void 0,"aria-labelledby":se.value,"aria-describedby":e.field.comment?ne.value:void 0,tabindex:"-1",class:"flex flex-col gap-4"},[P("div",yP,[P("header",gP,[P("div",bP,[P("h2",{id:se.value,class:"text-[17px] font-bold tracking-[-0.01em]"},I(i.value?.label||e.field.label||a.value),9,_P),e.field.comment?(v(),S("p",{key:0,id:ne.value,class:"text-[13px] text-muted"},I(e.field.comment),9,xP)):le("",!0)]),i.value?.view.showSearch?(v(),S("label",wP,[P("span",kP,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:16,class:"pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{type:"search","data-relation-search":"",value:h.value,placeholder:u(D)("backend::lang.list.search_prompt"),class:"h-[38px] w-full rounded-control border border-transparent bg-subtle pr-3 pl-9",onInput:$,onKeydown:ke[0]||(ke[0]=ur(ht(()=>{},["prevent"]),["enter"]))},null,40,$P)])):le("",!0),(v(!0),S(xe,null,Ve(ae.value,Me=>(v(),S(xe,{key:Me},[Me==="create"&&ie.value?(v(),H(lt,{key:0,ref_for:!0,ref:Gt,"data-action":"create",size:"sm",variant:"primary",icon:u(Ou),disabled:y.value||!i.value,"aria-haspopup":"dialog",onClick:ge},{default:F(()=>[we(I(u(Fe)(Q.value?.create)),1)]),_:1},8,["icon","disabled"])):Me==="link"?(v(),H(lt,{key:1,ref_for:!0,ref:wt,"data-action":"link",size:"sm",variant:ie.value?"outline":"primary",icon:u(qh),disabled:y.value||!i.value,"aria-haspopup":"dialog",onClick:ke[1]||(ke[1]=kt=>w.value=!0)},{default:F(()=>[we(I(u(Fe)(Q.value?.link)),1)]),_:1},8,["variant","icon","disabled"])):Me==="delete"?(v(),H(lt,{key:2,"data-action":"delete",size:"sm",variant:"danger",icon:u(wl),disabled:y.value||g.value.length===0,onClick:oe},{default:F(()=>[we(I(u(Fe)(Q.value?.deleteSelected)),1)]),_:1},8,["icon","disabled"])):Me==="unlink"?(v(),H(lt,{key:3,"data-action":"unlink",size:"sm",variant:"danger",icon:u(Rh),disabled:y.value||g.value.length===0,onClick:he},{default:F(()=>[we(I(u(Fe)(Q.value?.unlinkSelected)),1)]),_:1},8,["icon","disabled"])):le("",!0)],64))),128))]),l.value?(v(),S("p",CP,[W(u(n0),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(u(D)("backend::lang.relation.pending_note")),1)])):le("",!0)]),p.value&&!f.value?(v(),S("p",SP,I(u(D)("backend::lang.relation.load_failed")),1)):(v(),S("div",EP,[W(bm,{selected:g.value,"onUpdate:selected":ke[2]||(ke[2]=Me=>g.value=Me),variant:"relation",columns:U.value,rows:c.value,loading:f.value,selectable:ce.value,sortable:!0,sort:x.value,openable:ue.value!==null,trailing:Te.value,onSort:X,onOpen:Pe},{empty:F(()=>[P("span",AP,I(u(Fe)(Q.value?.empty)),1)]),trailing:F(({row:Me})=>[P("button",{type:"button","data-action":"edit-pivot","aria-label":u(Fe)(Q.value?.editPivot,void 0,{name:me(Me)}),class:"flex size-8 items-center justify-center rounded-pager text-muted transition-colors duration-150 ease-out hover:bg-hover hover:text-text",onClick:kt=>Se(Me,kt.currentTarget)},[W(u(S0),{size:16,"aria-hidden":"true"})],8,DP)]),_:1},8,["selected","columns","rows","loading","selectable","sort","openable","trailing"]),d.value&&d.value.last_page>1?(v(),H(_m,{key:0,meta:d.value,loading:f.value,"per-page-options":[],"per-page":d.value.per_page,onPage:O},null,8,["meta","loading","per-page"])):le("",!0)])),i.value&&ae.value.includes("link")?(v(),H(oP,{key:2,open:w.value,"onUpdate:open":ke[3]||(ke[3]=Me=>w.value=Me),source:e.source,"record-id":r.value,relation:a.value,schema:i.value,"session-key":l.value?u(s):null,onLinked:Ae,onClosed:st},null,8,["open","source","record-id","relation","schema","session-key"])):le("",!0),i.value&&(ie.value||ue.value==="update"||ue.value==="preview")?(v(),H(MO,{key:3,open:C.value,"onUpdate:open":ke[4]||(ke[4]=Me=>C.value=Me),source:e.source,"owner-id":r.value,relation:a.value,schema:i.value,mode:A.value,"child-id":L.value,"session-key":u(s),"can-delete":ae.value.includes("delete"),onChanged:Le,onGone:je,onClosed:nt},null,8,["open","source","owner-id","relation","schema","mode","child-id","session-key","can-delete"])):le("",!0),i.value&&$e.value?(v(),H(vP,{key:4,open:Y.value,"onUpdate:open":ke[5]||(ke[5]=Me=>Y.value=Me),source:e.source,"owner-id":r.value,relation:a.value,schema:i.value,"child-id":z.value,"child-name":j.value,"session-key":u(s),onSaved:Ye,onGone:je,onClosed:nt},null,8,["open","source","owner-id","relation","schema","child-id","child-name","session-key"])):le("",!0),W(Cr,{open:u(T).request.value!==null,message:u(T).request.value?.message??"","confirm-label":u(T).request.value?.confirmLabel,danger:u(T).request.value?.danger,busy:u(T).busy.value,onConfirm:u(T).confirm,onCancel:u(T).cancel},null,8,["open","message","confirm-label","danger","busy","onConfirm","onCancel"])],8,mP)):le("",!0)}}),MP=["id","aria-describedby"],TP=["data-relation"],RP={class:"flex size-[22px] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-on-primary","aria-hidden":"true"},qP={class:"font-semibold"},IP=["aria-label","onClick"],FP=["id","aria-expanded","aria-controls","aria-activedescendant","aria-required","aria-invalid","aria-describedby","value","placeholder"],BP={key:1,class:"relative"},NP=["id","aria-expanded","aria-controls","aria-activedescendant","aria-required","aria-invalid","aria-describedby","value","placeholder"],VP=["id"],LP=["id","data-value","aria-selected","onMousedown"],jP={key:0,role:"presentation",class:"px-3 py-2 text-[13px] text-muted"},UP={key:1,role:"presentation",class:"px-3 py-2 text-[13px] text-muted"},zP={key:2,role:"presentation",class:"p-1"},HP=20,WP=300,KP=Z({__name:"RelationField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.field.readOnly?"readonly":n.field.multiple?"multiple":"single"),l=k(()=>`${n.controlId}-listbox`),o=M({});Ie(()=>n.labels,ne=>{const ie={...o.value};for(const de of ne??[])ie[de.value]=de.label;o.value=ie},{immediate:!0});function s(ne){return typeof ne=="number"&&Number.isInteger(ne)?ne:typeof ne=="string"&&/^\d+$/.test(ne)?Number(ne):null}const i=k(()=>s(n.modelValue)),c=k(()=>Array.isArray(n.modelValue)?n.modelValue.map(s).filter(ne=>ne!==null):[]);function d(ne){return o.value[ne]??String(ne)}function f(ne){return ne.split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(ie=>ie.charAt(0).toUpperCase()).join("")}const p=k(()=>{const ne=n.labels?.[0]?.label;return ne||(n.field.emptyOption??"—")}),h=M(!1),m=M(""),x=M([]),g=M(0),y=M(0),w=M(!1),C=M(-1);let A=0,L=null;const Y=k(()=>g.value{const ne=[];r.value==="single"&&n.field.emptyOption!==void 0&&ne.push({key:"empty",label:n.field.emptyOption,value:null,muted:!0});const ie=new Set(c.value);for(const de of x.value)r.value==="multiple"&&ie.has(de.value)||ne.push({key:`option-${de.value}`,label:de.label,value:de.value,muted:!1});return ne});function b(ne){return`${l.value}-${ne}`}function E(){h.value||(h.value=!0,C.value=-1,z(1,!1))}function V(){h.value=!1,m.value="",C.value=-1,L!==null&&(clearTimeout(L),L=null)}function T(ne){m.value=ne.target.value,h.value=!0,C.value=-1,L!==null&&clearTimeout(L),L=setTimeout(()=>{L=null,z(1,!1)},WP)}function K(){Y.value&&!w.value&&z(g.value+1,!0)}function re(ne){const ie=ne.target;ie.scrollTop+ie.clientHeight>=ie.scrollHeight-24&&K()}function U(ne){r.value==="multiple"?ne.value!==null&&!c.value.includes(ne.value)&&a("update:modelValue",[...c.value,ne.value]):a("update:modelValue",ne.value),V()}function ae(ne){a("update:modelValue",c.value.filter(ie=>ie!==ne))}function Q(ne){switch(ne.key){case"ArrowDown":ne.preventDefault(),h.value?C.value=Math.min(C.value+1,j.value.length-1):E();break;case"ArrowUp":ne.preventDefault(),C.value=Math.max(C.value-1,0);break;case"Enter":if(h.value){ne.preventDefault();const ie=j.value[C.value];ie&&U(ie)}break;case"Escape":h.value&&(ne.preventDefault(),V());break;case"Backspace":r.value==="multiple"&&m.value===""&&c.value.length>0&&ae(c.value[c.value.length-1]);break}}const se=k(()=>i.value!==null?d(i.value):n.field.emptyOption??"");return Nt(()=>{L!==null&&clearTimeout(L)}),(ne,ie)=>r.value==="readonly"?(v(),S("div",{key:0,id:e.controlId,"data-relation-readonly":"","aria-describedby":e.describedBy||void 0,class:_e([e.labels?.[0]?.label?"text-text":"text-muted","flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5"])},I(p.value),11,MP)):(v(),S("div",{key:1,class:"relative","data-relation":r.value},[r.value==="multiple"?(v(),S("div",{key:0,class:_e([e.invalid?"border-danger":"border-border-strong","flex min-h-input flex-wrap items-center gap-1.5 rounded-control border bg-surface p-1.5"])},[(v(!0),S(xe,null,Ve(c.value,de=>(v(),S("span",{key:de,"data-chip":"",class:"inline-flex h-[30px] items-center gap-1.5 rounded-pill bg-subtle pr-1 pl-1"},[P("span",RP,I(f(d(de))),1),P("span",qP,I(d(de)),1),P("button",{type:"button","aria-label":u(D)("backend::lang.form.remove_item",{name:d(de)}),class:"flex size-6 items-center justify-center rounded-full text-muted hover:bg-hover hover:text-text",onClick:$e=>ae(de)},[W(u(Wt),{size:14,"aria-hidden":"true"})],8,IP)]))),128)),P("input",{id:e.controlId,type:"text",role:"combobox",autocomplete:"off","aria-expanded":h.value?"true":"false","aria-controls":l.value,"aria-autocomplete":"list","aria-activedescendant":h.value&&C.value>=0?b(C.value):void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,value:m.value,placeholder:u(D)("backend::lang.form.add_item"),class:"h-[30px] min-w-[120px] flex-1 border-0 bg-transparent px-2 focus-visible:shadow-none",onClick:E,onInput:T,onKeydown:Q,onBlur:V},null,40,FP)],2)):(v(),S("div",BP,[P("input",{id:e.controlId,type:"text",role:"combobox",autocomplete:"off","aria-expanded":h.value?"true":"false","aria-controls":l.value,"aria-autocomplete":"list","aria-activedescendant":h.value&&C.value>=0?b(C.value):void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,value:h.value?m.value:se.value,placeholder:h.value&&se.value||u(D)("backend::lang.form.select_placeholder"),class:_e([[e.invalid?"border-danger":"border-border-strong",!h.value&&i.value===null?"text-muted":"text-text"],"h-input w-full rounded-control border bg-surface pr-10 pl-3.5"]),onClick:E,onInput:T,onKeydown:Q,onBlur:V},null,42,NP),W(u(ts),{size:16,class:"pointer-events-none absolute top-1/2 right-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"})])),Oa(P("ul",{id:l.value,role:"listbox",class:"absolute inset-x-0 top-full z-20 mt-1 max-h-64 overflow-y-auto rounded-inner border border-border bg-surface p-1 shadow-menu",onScroll:re},[(v(!0),S(xe,null,Ve(j.value,(de,$e)=>(v(),S("li",{id:b($e),key:de.key,role:"option","data-value":de.value??"empty","aria-selected":r.value==="single"&&de.value===i.value?"true":"false",class:_e([[de.muted?"text-muted":"text-text",$e===C.value?"bg-hover":""],"flex h-10 cursor-pointer items-center rounded-control px-3 hover:bg-hover"]),onMousedown:ht(Ce=>U(de),["prevent"])},I(de.label),43,LP))),128)),w.value?(v(),S("li",jP,I(u(D)("backend::lang.form.loading_options")),1)):j.value.filter(de=>de.value!==null).length===0?(v(),S("li",UP,I(u(D)("backend::lang.form.no_options")),1)):le("",!0),Y.value&&!w.value?(v(),S("li",zP,[P("button",{type:"button","data-action":"more-options",class:"h-8 w-full rounded-control text-[13px] font-semibold text-muted hover:bg-hover hover:text-text",onMousedown:ht(K,["prevent"])},I(u(D)("backend::lang.form.more_options")),33)])):le("",!0)],40,VP),[[Bi,h.value]])],8,TP))}}),GP={class:"flex min-w-0 flex-col"},YP=["for"],JP={key:0,class:"text-danger","aria-hidden":"true"},ZP=["id"],QP=["id","aria-checked","aria-invalid","aria-describedby"],XP=Z({__name:"SwitchField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>Sm(n.modelValue));function l(){a("update:modelValue",Em(n.modelValue,!r.value))}return(o,s)=>(v(),S("div",{class:_e([e.invalid?"border-danger":"border-border","flex items-center justify-between gap-4 rounded-inner border px-4 py-3.5"]),"data-toggle-card":""},[P("div",GP,[P("label",{for:e.controlId,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",JP," *")):le("",!0)],8,YP),e.field.comment?(v(),S("p",{key:0,id:`${e.controlId}-comment`,class:"text-[13px] text-muted"},I(e.field.comment),9,ZP)):le("",!0)]),P("button",{id:e.controlId,type:"button",role:"switch","aria-checked":r.value?"true":"false","aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:_e([r.value?"bg-primary":"bg-border-strong","relative h-[26px] w-11 shrink-0 rounded-pill transition-colors duration-150 ease-out"]),onClick:l},[P("span",{class:_e([r.value?"translate-x-[18px] bg-on-primary":"translate-x-0 bg-white","absolute top-[3px] left-[3px] size-5 rounded-full shadow-tab transition-transform duration-150 ease-out"]),"aria-hidden":"true"},null,2)],10,QP)],2))}}),eM=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],tM=Z({__name:"TextField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),l=k(()=>yc(n.field));return(o,s)=>(v(),S("input",Ne({id:e.controlId},l.value,{name:e.field.name,type:"text",value:r.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"h-input"],onInput:s[0]||(s[0]=i=>a("update:modelValue",i.target.value))}),null,16,eM))}}),nM=["id","name","rows","value","required","aria-required","aria-invalid","aria-describedby"],aM=Z({__name:"TextareaField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r={tiny:2,small:4,large:8,huge:12,giant:18},l=k(()=>r[n.field.size??""]??5),o=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),s=k(()=>yc(n.field));return(i,c)=>(v(),S("textarea",Ne({id:e.controlId},s.value,{name:e.field.name,rows:l.value,value:o.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"min-h-input resize-y py-2.5"],onInput:c[0]||(c[0]=d=>a("update:modelValue",d.target.value))}),null,16,nM))}}),rM=["id","aria-describedby"],lM={key:0},oM={class:"font-mono text-text"},sM={key:1},iM={class:"font-mono text-text"},Ql="\0",uM=Z({__name:"UnsupportedField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=k(()=>{const[r="",l=""]=D("backend::lang.form.unsupported_field",{type:Ql}).split(Ql);return{before:r,after:l}}),a=k(()=>D("backend::lang.form.unsupported_field",{type:Ql}).includes(Ql));return(r,l)=>(v(),S("div",{id:e.controlId,"data-unsupported-field":"","aria-describedby":e.describedBy||void 0,class:"flex min-h-input items-center gap-2.5 rounded-control border-[1.5px] border-dashed border-border-strong bg-subtle px-3.5 text-[13px] text-muted"},[W(u(Ph),{size:16,"aria-hidden":"true"}),a.value?(v(),S("span",lM,[we(I(n.value.before),1),P("code",oM,I(t.field.type),1),we(I(n.value.after),1)])):(v(),S("span",sM,[we(I(u(D)("backend::lang.form.unsupported_field"))+" ",1),P("code",iM,I(t.field.type),1)]))],8,rM))}}),cM=["id","aria-labelledby","aria-describedby","aria-busy"],dM={key:0,"data-widget-skeleton":"",class:"h-[42px] w-[160px] rounded-control bg-skel","aria-hidden":"true"},fM=Z({__name:"WidgetField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(gc,null),a=it(bc,()=>{}),r=it(Am,null),l=it(Dm,()=>Promise.resolve([])),o=M("loading"),s=M(null);let i=null,c=!1,d=!1;function f(){const C=n?.value??{},A={};for(const L of t.field.fill??[])C[L]!==void 0&&(A[L]=C[L]);return A}const p=k(()=>JSON.stringify(f())),h=k(()=>r?.value||il.value);function m(C){let A;return{promise:new Promise((Y,z)=>{A=setTimeout(()=>z(new Error("widget element was not defined in time")),C)}),cancel:()=>clearTimeout(A)}}async function x(C){const A=await l();if(customElements.get(C))return;if(A.length>0)throw new Error(`plugin script failed: ${A.join(", ")}`);const L=m(MA);try{await Promise.race([customElements.whenDefined(C),L.promise])}finally{L.cancel()}}function g(C){Be(C||D("backend::lang.extension.action_failed"),"danger"),i?.setAttribute("state","error")}async function y(){const C=t.source;if(!(!i||c||!C)){c=!0,i.setAttribute("busy",""),i.removeAttribute("state");try{const A=await Re.POST("/{vendor}/{plugin}/{controller}/widgets/{field}",{params:{path:{...C,field:t.field.name}},body:{record_id:t.recordId??void 0,values:f()}});if(A.data){const L=A.data.data.fill??{};for(const Y of t.field.fill??[])Object.hasOwn(L,Y)&&a(Y,L[Y]);A.data.data.message&&Be(A.data.data.message)}else g(A.error?.error.message)}catch{g()}finally{c=!1,i?.removeAttribute("busy")}}}function w(){y()}return _t(async()=>{const C=t.field.widget??"";try{if(C===""||!t.source)throw new Error("widget field without a tag or controller");if(await x(C),d||!s.value)return;const A=document.createElement(C);A.setAttribute("record-id",t.recordId==null?"":String(t.recordId)),A.setAttribute("field-name",t.field.name),A.setAttribute("locale",h.value),A.setAttribute("fill-values",p.value),A.setAttribute("label",t.field.actionLabel||t.field.label||t.field.name),A.setAttribute("busy-label",D("backend::lang.extension.busy")),A.addEventListener(Ff,w),s.value.append(A),i=A,o.value="ready"}catch{d||(o.value="failed")}}),Ie(p,C=>i?.setAttribute("fill-values",C)),Ie(h,C=>i?.setAttribute("locale",C)),Nt(()=>{d=!0,i?.removeEventListener(Ff,w),i=null}),(C,A)=>o.value==="failed"?(v(),H(mc,{key:0,id:e.controlId,"data-widget-failed":"","aria-describedby":e.describedBy||void 0,text:u(D)("backend::lang.extension.widget_failed")},null,8,["id","aria-describedby","text"])):(v(),S("div",{key:1,id:e.controlId,role:"group","data-widget-host":"","aria-labelledby":e.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0,"aria-busy":o.value==="loading"?"true":void 0,class:"flex min-h-input items-center"},[o.value==="loading"?(v(),S("span",dM)):le("",!0),P("div",{ref_key:"mountPoint",ref:s,class:"contents"},null,512)],8,cM))}}),Er="relation-manager",Pm=new Map([[Er,()=>PP]]),Mm=new Map([["text",tM],["textarea",aM],["number",bO],["dropdown",PA],["switch",XP],["checkbox",iA],["relation",KP],["widget",fM],["partial",xO],["fileupload",yO],["datepicker",EA]]),pM=new Set(["switch","checkbox",Er]),hM=new Set([Er]),vM=new Set([Er,"widget","partial","fileupload"]),mM=new Set(["widget","partial","fileupload"]);function yM(e){return Mm.get(e)??Pm.get(e)?.()??uM}function gM(e){return(Mm.has(e)||Pm.has(e))&&!vM.has(e)}function bM(e){return hM.has(e)}function _M(e){return pM.has(e)}function xM(e){return mM.has(e)}const wM=Z({__name:"FieldRenderer",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>yM(n.field.type));return(l,o)=>(v(),H(Bn(r.value),{field:e.field,"model-value":e.modelValue,"control-id":e.controlId,invalid:e.invalid,"described-by":e.describedBy,labels:e.labels,source:e.source,"record-id":e.recordId,"onUpdate:modelValue":o[0]||(o[0]=s=>a("update:modelValue",s))},null,8,["field","model-value","control-id","invalid","described-by","labels","source","record-id"]))}}),kM=["data-field"],$M=["id"],CM={key:0,class:"text-danger","aria-hidden":"true"},SM=["for"],EM={key:0,class:"text-danger","aria-hidden":"true"},AM=["id"],DM=["id"],OM=Z({__name:"FormField",props:{field:{},modelValue:{},errors:{},labels:{},source:{},recordId:{},idPrefix:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>`${n.idPrefix??"field"}-${n.field.name}`),l=k(()=>r.value),o=k(()=>`${r.value}-comment`),s=k(()=>`${r.value}-error`),i=k(()=>(n.errors?.length??0)>0),c=k(()=>_M(n.field.type)),d=k(()=>xM(n.field.type)),f=k(()=>!c.value&&!!n.field.comment),p=k(()=>[f.value||c.value&&n.field.comment?o.value:"",i.value?s.value:""].filter(Boolean).join(" "));return(h,m)=>(v(),S("div",{class:"flex min-w-0 flex-col gap-1.5","data-field":e.field.name},[d.value&&e.field.label?(v(),S("span",{key:0,id:`${l.value}-label`,class:"font-semibold"},[we(I(e.field.label),1),e.field.required?(v(),S("span",CM," *")):le("",!0)],8,$M)):!c.value&&!d.value?(v(),S("label",{key:1,for:l.value,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",EM," *")):le("",!0)],8,SM)):le("",!0),W(wM,{field:e.field,"model-value":e.modelValue,"control-id":l.value,invalid:i.value,"described-by":p.value,labels:e.labels,source:e.source,"record-id":e.recordId,"onUpdate:modelValue":m[0]||(m[0]=x=>a("update:modelValue",x))},null,8,["field","model-value","control-id","invalid","described-by","labels","source","record-id"]),f.value?(v(),S("p",{key:2,id:o.value,class:"text-[13px] text-muted"},I(e.field.comment),9,AM)):le("",!0),i.value?(v(),S("div",{key:3,id:s.value,class:"flex flex-col gap-0.5 text-[13px] text-danger"},[(v(!0),S(xe,null,Ve(e.errors,(x,g)=>(v(),S("p",{key:g,class:"flex items-center gap-1.5"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(x),1)]))),128))],8,DM)):le("",!0)],8,kM))}}),PM={class:"grid grid-cols-1 gap-x-6 gap-y-[22px] min-[600px]:grid-cols-2"},Tl=Z({__name:"FormGrid",props:{fields:{},values:{},errors:{},labels:{},source:{},recordId:{},idPrefix:{}},emits:["update"],setup(e,{emit:t}){const n=t;function a(r){if(r.type===Er)return"col-span-full";switch(r.span){case"left":return"min-[600px]:col-start-1";case"right":return"min-[600px]:col-start-2";case"auto":case"row":return"";default:return"col-span-full"}}return(r,l)=>(v(),S("div",PM,[(v(!0),S(xe,null,Ve(e.fields,o=>(v(),H(OM,{key:o.name,class:_e(a(o)),field:o,"model-value":e.values[o.name],errors:e.errors[o.name],labels:e.labels?.[o.name],source:e.source,"record-id":e.recordId,"id-prefix":e.idPrefix,"onUpdate:modelValue":s=>n("update",o.name,s)},null,8,["class","field","model-value","errors","labels","source","record-id","id-prefix","onUpdate:modelValue"]))),128))]))}}),MM={class:"flex w-full flex-col gap-5 pb-24"},TM={class:"flex flex-wrap items-center gap-4"},RM={class:"flex min-w-0 flex-1 flex-col"},qM={class:"truncate text-[24px] font-bold tracking-[-0.02em]"},IM={key:0,class:"text-muted"},FM={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},BM=["id","role","aria-labelledby"],NM={class:"fixed inset-x-0 bottom-0 z-30 flex items-center gap-2.5 border-t border-border bg-surface px-8 py-3.5"},VM={class:"ml-auto flex items-center gap-2.5"},Fr="field",Nf=Z({__name:"FormView",setup(e){const t=_n(),n=_l(),a={vendor:String(t.params.vendor??""),plugin:String(t.params.plugin??""),controller:String(t.params.controller??"")},r=qu(a),l=ua(r)??"/",o=t.name==="create"?"create":"update",s=o==="update"?Number(t.params.id):null,i=M(null),c=M({}),d=M({}),f=M({}),p=M(!0),h=M(!1),m=M(!1),x=M(""),g=M(Jt),y=Sr();let w=!1,C=Promise.resolve([]);const A=Mo(),L={[pa]:A},Y=M(0),z=M(0),j=k(()=>(i.value?.fields??[]).filter(q=>xc(q,o)&&(o==="update"||!bM(q.type)||q.type===Er&&!!q.deferrable))),b=k(()=>j.value.map(q=>q.name)),E=k(()=>{if(!j.value.some(te=>te.tab))return[];const q=[];for(const te of j.value){const ye=la(te);let _=q.find($=>$.key===ye);_||(_={key:ye,label:te.tab||D("backend::lang.form.tab_default"),errors:0},ye===Jt?q.unshift(_):q.push(_)),f.value[te.name]&&(_.errors+=1)}return q}),V=k(()=>Math.max(E.value.findIndex(q=>q.key===g.value),0)),T=k(()=>{if(E.value.length===0)return j.value;const q=E.value[V.value]?.key??Jt;return j.value.filter(te=>la(te)===q)}),K=k(()=>{const q=i.value?.fields.find(ye=>ye.type==="text"),te=q?c.value[q.name]:void 0;return typeof te=="string"||typeof te=="number"?String(te).trim():""}),re=k(()=>{if(o==="update"&&K.value!=="")return K.value;const q=o==="create"?i.value?.messages.create:i.value?.messages.update;return Fe(q,void 0,{name:K.value})}),U=k(()=>o==="update"?Fe(i.value?.messages.update,void 0,{name:K.value}):""),ae=k(()=>!p.value&&(Y.value>0||oa(zt(j.value,c.value))!==x.value));function Q(q){q&&(c.value={...q.data},d.value=q.meta.labels??{}),x.value=oa(zt(j.value,c.value))}async function se(){p.value=!0,h.value=!1;const q={path:a},[te,ye]=await Promise.all([Re.GET("/{vendor}/{plugin}/{controller}/schema/form",{params:q}),s!==null?Re.GET("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s}}}):Promise.resolve(null)]);i.value=te.data?.data??null,h.value=!te.data||ye!==null&&!ye.data,i.value&&(C=mm(r,i.value.assets)),i.value&&o==="create"&&(c.value=wc(j.value)),Q(ye?.data),g.value=E.value[0]?.key??Jt,p.value=!1}function ne(q,te){if(c.value={...c.value,[q]:te},f.value[q]){const ye={...f.value};delete ye[q],f.value=ye}}Dt(gc,k(()=>c.value)),Dt(bc,ne),Dt(Am,k(()=>i.value?.meta.locale||il.value)),Dt(Dm,()=>C),Dt(Cs,{key:A,recordId:s??0,routes:q=>Q3(a,s??0,q,A),markDirty:()=>{Y.value++},pendingChanges:Tt(Y),revision:Tt(z)});async function ie(q){f.value=Pl(q?.details);const te=j.value.filter(_=>f.value[_.name]),ye=te.find(_=>la(_)===g.value)??te[0];ye&&(E.value.length>0&&(g.value=la(ye)),await Ue(),Ml(Fr,ye.name))}function de(q,te){const ye=i.value?.redirects,_=(ye?.[o]?.[q]||ye?.default)??"";return gm(_,r,typeof te=="number"||typeof te=="string"?te:null)}async function $e(){if(m.value||!i.value)return null;m.value=!0;try{const q=zt(j.value,c.value),te=s===null?await Re.POST("/{vendor}/{plugin}/{controller}",{params:{path:a,header:L},body:q}):await Re.PUT("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s},header:L},body:q});return te.data?(f.value={},Q(te.data),Y.value=0,z.value++,Be(Fe(i.value.messages.saved,void 0,{name:K.value})),te.data):(te.response.status===422?await ie(te.error?.error):Be(te.error?.error.message||D("backend::lang.form.error_generic"),"danger"),null)}catch{return Be(D("backend::lang.form.error_generic"),"danger"),null}finally{m.value=!1}}async function Ce(q){w=!0;try{await n.push(q)}finally{w=!1}}async function ue(){const q=await $e();q&&o==="create"&&await Ce(de("redirect",q.data.id))}async function Te(){const q=await $e();q&&await Ce(de("redirectClose",q.data.id))}async function ce(){if(!(s===null||m.value||!i.value||!await y.ask({message:Fe(i.value.messages.deleteConfirm,void 0,{name:K.value}),confirmLabel:D("backend::lang.form.delete"),danger:!0}))){m.value=!0;try{const te=await Re.DELETE("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s}}});if(te.data){Be(Fe(i.value.messages.deleted,void 0,{name:K.value})),await Ce(l);return}Be(te.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{m.value=!1}}}async function B(){return w||!ae.value?!0:y.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})}Wb(B),Kb(B);function G(q){ae.value&&(q.preventDefault(),q.returnValue="")}return _t(()=>window.addEventListener("beforeunload",G)),Nt(()=>window.removeEventListener("beforeunload",G)),vn(()=>D_(p.value?"":re.value)),Nt(O_),se(),(q,te)=>(v(),S("section",MM,[P("header",TM,[W(lt,{variant:"outline","data-action":"back",to:u(l),"aria-label":u(D)("backend::lang.form.return_to_list"),class:"size-10! px-0!"},{default:F(()=>[W(u(Du),{size:18,"aria-hidden":"true"})]),_:1},8,["to","aria-label"]),P("div",RM,[P("h1",qM,I(p.value?"":re.value),1),U.value?(v(),S("p",IM,I(U.value),1)):le("",!0)]),E.value.length>0?(v(),H(Om,{key:0,modelValue:g.value,"onUpdate:modelValue":te[0]||(te[0]=ye=>g.value=ye),tabs:E.value,"id-prefix":Fr},null,8,["modelValue","tabs"])):le("",!0)]),h.value&&!p.value?(v(),S("p",FM,I(u(D)("backend::lang.form.load_failed")),1)):i.value?(v(),S(xe,{key:1},[W(Ol,{errors:f.value,"field-names":b.value},null,8,["errors","field-names"]),P("form",{id:E.value.length>0?u(_c)(Fr,V.value):void 0,role:E.value.length>0?"tabpanel":void 0,"aria-labelledby":E.value.length>0?u(Ro)(Fr,V.value):void 0,class:"rounded-card border border-border bg-surface p-7 shadow-card",novalidate:"",onSubmit:ht(ue,["prevent"])},[W(Tl,{fields:T.value,values:c.value,errors:f.value,labels:d.value,source:a,"record-id":u(s),"id-prefix":Fr,onUpdate:ne},null,8,["fields","values","errors","labels","record-id"])],40,BM)],64)):le("",!0),P("footer",NM,[u(o)==="update"?(v(),H(lt,{key:0,variant:"danger","data-action":"delete",icon:u(wl),disabled:m.value||p.value||!i.value,onClick:ce},{default:F(()=>[we(I(u(D)("backend::lang.form.delete")),1)]),_:1},8,["icon","disabled"])):le("",!0),P("div",VM,[W(lt,{variant:"ghost","data-action":"cancel",to:u(l)},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1},8,["to"]),W(lt,{variant:"outline","data-action":"save-close",disabled:m.value||p.value||!i.value,onClick:Te},{default:F(()=>[we(I(u(D)("backend::lang.form.save_and_close")),1)]),_:1},8,["disabled"]),W(lt,{variant:"primary","data-action":"save",disabled:m.value||p.value||!i.value,onClick:ue},{default:F(()=>[we(I(m.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.form.save")),1)]),_:1},8,["disabled"])])]),W(Cr,{open:u(y).request.value!==null,message:u(y).request.value?.message??"","confirm-label":u(y).request.value?.confirmLabel,danger:u(y).request.value?.danger,onConfirm:u(y).confirm,onCancel:u(y).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])]))}}),LM={class:"flex w-full flex-col gap-5 pb-24"},jM={class:"flex items-center gap-4"},UM={class:"flex min-w-0 flex-col"},zM={class:"truncate text-[24px] font-bold tracking-[-0.02em]"},HM={key:0,class:"text-muted"},WM={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},KM={class:"fixed inset-x-0 bottom-0 z-30 flex items-center justify-end gap-2.5 border-t border-border bg-surface px-8 py-3.5"},Vf="setting",GM=Z({__name:"SettingsFormView",setup(e){const t=_n(),n=String(t.params.code??""),a=M(null),r=M({}),l=M({}),o=M(!0),s=M(!1),i=M(!1),c=k(()=>(a.value?.fields??[]).filter(g=>xc(g,"update"))),d=k(()=>c.value.map(g=>g.name)),f=k(()=>zi(n)?.label||a.value?.name||n),p=k(()=>zi(n)?.description??"");async function h(){const g={path:{code:n}},[y,w]=await Promise.all([Re.GET("/settings/{code}/schema",{params:g}),Re.GET("/settings/{code}",{params:g})]);a.value=y.data?.data??null,r.value={...w.data?.data.data??{}},s.value=!y.data||!w.data,o.value=!1}function m(g,y){if(r.value={...r.value,[g]:y},l.value[g]){const w={...l.value};delete w[g],l.value=w}}async function x(){if(!(i.value||!a.value)){i.value=!0;try{const g=await Re.PUT("/settings/{code}",{params:{path:{code:n}},body:zt(c.value,r.value)});if(g.data){l.value={},r.value={...g.data.data.data},Be(D("backend::lang.settings.saved"));return}if(g.response.status===422){l.value=Pl(g.error?.error.details);const y=c.value.find(w=>l.value[w.name]);await Ue(),y&&Ml(Vf,y.name);return}Be(g.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{i.value=!1}}}return h(),(g,y)=>(v(),S("section",LM,[P("header",jM,[W(lt,{variant:"outline","data-action":"back",to:"/settings","aria-label":u(D)("backend::lang.settings.back"),class:"size-10! px-0!"},{default:F(()=>[W(u(Du),{size:18,"aria-hidden":"true"})]),_:1},8,["aria-label"]),P("div",UM,[P("h1",zM,I(f.value),1),p.value?(v(),S("p",HM,I(p.value),1)):le("",!0)])]),s.value&&!o.value?(v(),S("p",WM,I(u(D)("backend::lang.form.load_failed")),1)):a.value?(v(),S(xe,{key:1},[W(Ol,{errors:l.value,"field-names":d.value},null,8,["errors","field-names"]),P("form",{class:"rounded-card border border-border bg-surface p-7 shadow-card",novalidate:"",onSubmit:ht(x,["prevent"])},[W(Tl,{fields:c.value,values:r.value,errors:l.value,source:null,"id-prefix":Vf,onUpdate:m},null,8,["fields","values","errors"])],32)],64)):le("",!0),P("footer",KM,[W(lt,{variant:"ghost",to:"/settings"},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1}),W(lt,{variant:"primary","data-action":"save",disabled:i.value||o.value||!a.value,onClick:x},{default:F(()=>[we(I(i.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.form.save")),1)]),_:1},8,["disabled"])])]))}}),YM={class:"flex flex-col gap-5"},JM={class:"text-[26px] font-bold tracking-[-0.02em]"},ZM={key:0,class:"text-muted"},QM={key:0,class:"text-[13px] font-semibold tracking-[0.02em] text-muted uppercase"},XM={class:"grid grid-cols-1 gap-3 min-[900px]:grid-cols-2"},e4={class:"flex size-10 shrink-0 items-center justify-center rounded-inner bg-subtle text-muted"},t4={class:"flex min-w-0 flex-col"},n4={class:"font-semibold"},a4={key:0,class:"text-[13px] text-muted"},r4=Z({__name:"SettingsIndexView",setup(e){return(t,n)=>(v(),S("section",YM,[P("header",null,[P("h1",JM,I(u(D)("backend::lang.settings.title")),1)]),u(Ld).length===0?(v(),S("p",ZM,I(u(D)("backend::lang.settings.empty")),1)):le("",!0),(v(!0),S(xe,null,Ve(u(Ld),a=>(v(),S("section",{key:a.category,"data-settings-group":"",class:"flex flex-col gap-3"},[a.category?(v(),S("h2",QM,I(a.category),1)):le("",!0),P("div",XM,[(v(!0),S(xe,null,Ve(a.entries,r=>(v(),H(u(Nn),{key:r.code,to:`/settings/${encodeURIComponent(r.code)}`,"data-settings":r.code,class:"flex items-start gap-3.5 rounded-card border border-border bg-surface p-5 text-text no-underline shadow-card hover:bg-hover"},{default:F(()=>[P("span",e4,[(v(),H(Bn(u(ss)(r.icon)),{size:20,"aria-hidden":"true"}))]),P("span",t4,[P("span",n4,I(r.label),1),r.description?(v(),S("span",a4,I(r.description),1)):le("",!0)])]),_:2},1032,["to","data-settings"]))),128))])]))),128))]))}}),l4={class:"flex flex-col items-center gap-2 py-20 text-center"},o4={class:"text-[17px] font-bold"},Lf=Z({__name:"NotFoundView",props:{home:{type:Boolean}},setup(e){return(t,n)=>(v(),S("section",l4,[P("h1",o4,I(e.home?u(D)("backend::lang.nav.empty"):u(D)("backend::lang.page.not_found")),1)]))}});function Tm(e){return typeof e!="string"||e.length===0||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\")?null:e}const s4=new Set(["list","create","record"]);function i4(e){if(typeof e.name!="string"||!s4.has(e.name))return"";const{vendor:t,plugin:n,controller:a}=e.params;return typeof t!="string"||typeof n!="string"||typeof a!="string"?"":qu({vendor:t,plugin:n,controller:a})}function u4(e=Qb(ls.base)){const t=y1({history:e,routes:[{path:"/login",name:"login",component:lE,meta:{public:!0}},{path:"/",name:"home",component:Lf,props:{home:!0},meta:{shell:!0},beforeEnter:()=>u_()??!0},{path:"/settings",name:"settings",component:r4,meta:{shell:!0}},{path:"/settings/:code",name:"settings-form",component:GM,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller",name:"list",component:G3,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller/create",name:"create",component:Nf,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller/:id(\\d+)",name:"record",component:Nf,meta:{shell:!0}},{path:"/:pathMatch(.*)*",name:"not-found",component:Lf,meta:{shell:!0}}]});return t.beforeEach(n=>{const a=Ja.value!==null;return n.meta.public?a&&n.name==="login"?Tm(n.query.redirect)??"/":!0:a?!0:{name:"login",query:{redirect:n.fullPath}}}),t.afterEach((n,a,r)=>{r||WS(i4(n))}),t}const c4="(prefers-color-scheme: dark)";function d4(e=window){const t=e.document.documentElement;if(typeof e.matchMedia!="function")return t.classList.remove("dark"),()=>{};const n=e.matchMedia(c4),a=l=>{t.classList.toggle("dark",l)};a(n.matches);const r=l=>a(l.matches);return n.addEventListener("change",r),()=>n.removeEventListener("change",r)}async function f4(){d4(),await r_().catch(()=>{}),await dm().catch(()=>null)&&await Promise.all([Vh().catch(()=>[]),Lh().catch(()=>[])]);const t=u4();Q0(()=>{fm();const a=t.currentRoute.value;a.name!=="login"&&t.push({name:"login",query:{redirect:a.fullPath}})});const n=pb(jS);n.use(t),await t.isReady(),n.mount("#app")}f4(); +${n}`;if(!vm(n)||iu.has(a))continue;const r=document.createElement("link");r.rel="stylesheet",r.setAttribute(US,e),r.disabled=e!==uu,r.href=n,iu.set(a,{owner:e,link:r}),document.head.appendChild(r)}}function WS(e){uu=e;for(const{owner:t,link:n}of iu.values())n.disabled=t!==uu}async function mm(e,t){HS(e,t?.styles??[]);const n=t?.scripts??[],a=await Promise.allSettled(n.map(r=>zS(r)));return n.filter((r,l)=>a[l]?.status==="rejected")}const KS={class:"flex min-h-screen items-center justify-center px-4",style:{background:"radial-gradient(ellipse at 50% 35%, #2b3a5c 0%, #1d2740 60%)"}},GS={class:"flex w-full max-w-[400px] flex-col gap-6"},YS={class:"flex items-center justify-center gap-3"},JS={class:"flex size-[34px] items-center justify-center rounded-full bg-accent-soft"},ZS={class:"text-[22px] font-bold tracking-[-0.02em]"},QS={class:"flex flex-col gap-1.5"},XS={class:"font-semibold"},eE={class:"flex flex-col gap-1.5"},tE={class:"font-semibold"},nE=["aria-invalid"],aE={key:0,role:"alert",class:"flex items-center gap-2.5 rounded-control bg-[#fdf0f0] px-3.5 py-3 text-[#c62828]"},rE=["disabled"],lE=Z({__name:"LoginView",setup(e){const t=_n(),n=_l(),a=M(""),r=M(""),l=M(!1),o=M(!1);async function s(){if(!o.value){o.value=!0,l.value=!1;try{if(!await gS(a.value.trim(),r.value)||!await dm()){l.value=!0;return}r.value="",await Promise.all([Vh(),Lh().catch(()=>[])]),await n.replace(Tm(t.query.redirect)??"/")}finally{o.value=!1}}}return(i,c)=>(v(),S("main",KS,[P("div",GS,[P("div",YS,[P("span",JS,[W(u(Pu),{size:20,class:"text-accent","aria-hidden":"true"})]),c[2]||(c[2]=P("span",{class:"text-[18px] font-bold text-white"},[we("Summer"),P("span",{class:"text-accent"},"CMS")],-1))]),P("form",{class:"flex flex-col gap-[18px] rounded-card bg-white p-8 text-[#141b2d] shadow-login",novalidate:"",onSubmit:ht(s,["prevent"])},[P("h1",ZS,I(u(D)("backend::lang.auth.title")),1),P("label",QS,[P("span",XS,I(u(D)("backend::lang.auth.login")),1),Oa(P("input",{"onUpdate:modelValue":c[0]||(c[0]=d=>a.value=d),name:"login",type:"text",autocomplete:"username",required:"",class:"h-input rounded-control border border-[#d2d8e2] bg-white px-3.5"},null,512),[[yo,a.value]])]),P("label",eE,[P("span",tE,I(u(D)("backend::lang.auth.password")),1),Oa(P("input",{"onUpdate:modelValue":c[1]||(c[1]=d=>r.value=d),name:"password",type:"password",autocomplete:"current-password",required:"","aria-invalid":l.value?"true":void 0,class:_e([l.value?"border-[#c62828]":"border-[#d2d8e2]","h-input rounded-control border bg-white px-3.5"])},null,10,nE),[[yo,r.value]])]),l.value?(v(),S("div",aE,[W(u(Ut),{size:18,"aria-hidden":"true"}),P("span",null,I(u(D)("backend::lang.auth.invalid")),1)])):le("",!0),P("button",{type:"submit",disabled:o.value,class:"h-input rounded-control bg-[#22304d] font-semibold text-white disabled:opacity-60"},I(u(D)("backend::lang.auth.submit")),9,rE)],32)])]))}}),oE=/^filter\[(.+)\]$/,sE=/^[1-9]\d*$/;function Ua(e){const t=Array.isArray(e)?e[e.length-1]:e;return typeof t=="string"?t:""}function Rf(e){return sE.test(e)?Number(e):void 0}function iE(e){const t={},n=Ua(e.search).trim();n!==""&&(t.search=n);const a=Ua(e.sort).trim();if(a!==""){t.sort=a;const s=Ua(e.dir);t.dir=s==="desc"?"desc":"asc"}const r=Rf(Ua(e.page));r!==void 0&&(t.page=r);const l=Rf(Ua(e.per_page));l!==void 0&&(t.per_page=l);const o={};for(const s of Object.keys(e).sort()){const i=oE.exec(s)?.[1],c=Ua(e[s]);i&&c!==""&&(o[i]=c)}return Object.keys(o).length>0&&(t.filter=o),t}function ym(e){const t={};e.search&&(t.search=e.search),e.sort&&(t.sort=e.sort,t.dir=e.dir==="desc"?"desc":"asc"),e.page!==void 0&&e.page>1&&(t.page=String(e.page)),e.per_page!==void 0&&(t.per_page=String(e.per_page));for(const n of Object.keys(e.filter??{}).sort()){const a=e.filter?.[n];a!==void 0&&a!==""&&(t[`filter[${n}]`]=a)}return t}function uE(e){return JSON.stringify(ym(e))}const cE=/^\d+$/;function gm(e,t,n){const a=is(t),r=ua(t);if(!a||!r)return"/";const o=((e??"").trim().split(/[?#]/,1)[0]??"").split("/").filter(d=>d!==""),s=[a.vendor,a.plugin,a.controller];if(!s.every((d,f)=>o[f]?.toLowerCase()===d.toLowerCase()))return r;const c=o.slice(s.length);if(c.length===0)return r;if(c.length===1&&c[0]==="create")return`${r}/create`;if(c.length===2&&c[0]==="update"){const d=c[1]===":id"?String(n??""):c[1]??"";return cE.test(d)?`${r}/${d}`:r}return r}const dE={key:0,"data-switch":"true",class:"inline-flex h-6 items-center gap-1 rounded-pill bg-ok-bg px-2.5 text-[12px] font-semibold text-ok-text"},fE={key:1,"data-switch":"false",class:"inline-flex h-6 items-center rounded-pill border border-border-strong px-2.5 text-[12px] font-semibold text-muted"},pE={key:1,class:"text-muted","data-empty":""},hE={key:2,class:"text-[13px] text-muted tabular-nums"},Gl=Z({__name:"CellValue",props:{column:{},value:{}},setup(e){const t=e;function n(f){return f==null||f===""}function a(f){return n(f)?"":Array.isArray(f)?f.map(a).filter(p=>p!=="").join(", "):typeof f=="boolean"?D(f?"backend::lang.list.column_switch_true":"backend::lang.list.column_switch_false"):typeof f=="object"?"":String(f)}function r(f){return String(f).padStart(2,"0")}function l(f){if(typeof f!="string"&&typeof f!="number")return"";const p=new Date(f);return Number.isNaN(p.getTime())?String(f):`${p.getFullYear()}-${r(p.getMonth()+1)}-${r(p.getDate())} ${r(p.getHours())}:${r(p.getMinutes())}`}function o(f){if(typeof f!="string")return"";const p=/^\d{4}-\d{2}-\d{2}/.exec(f.trim());return p?p[0]:f.trim()}function s(f){if(typeof f!="string")return"";const p=/(\d{2}):(\d{2})/.exec(f);return p?`${p[1]}:${p[2]}`:f.trim()}function i(f){return typeof f=="string"?f!==""&&f!=="0"&&f.toLowerCase()!=="false":!!f}const c=k(()=>t.column.type==="switch"?"switch":t.column.type==="datetime"?"datetime":t.column.type==="date"?"date":t.column.type==="time"?"time":"text"),d=k(()=>{switch(c.value){case"datetime":return l(t.value);case"date":return o(t.value);case"time":return s(t.value);default:return a(t.value)}});return(f,p)=>c.value==="switch"&&!n(e.value)?(v(),S(xe,{key:0},[i(e.value)?(v(),S("span",dE,[W(u(Ch),{size:14,"aria-hidden":"true"}),we(I(u(D)("backend::lang.list.column_switch_true")),1)])):(v(),S("span",fE,I(u(D)("backend::lang.list.column_switch_false")),1))],64)):d.value===""?(v(),S("span",pE,"—")):c.value==="datetime"||c.value==="date"||c.value==="time"?(v(),S("span",hE,I(d.value),1)):(v(),S(xe,{key:3},[we(I(d.value),1)],64))}}),vE={class:"overflow-x-auto"},mE={class:"sticky top-0 z-10"},yE={class:"h-row-head border-y border-border bg-subtle"},gE={key:0,scope:"col","data-select":"",class:"w-[52px] pl-5"},bE=["aria-checked","aria-label","disabled"],_E=["aria-sort"],xE=["data-sort","onClick"],wE={key:1,class:"w-[56px] pr-5"},kE=["aria-busy"],$E={key:0,class:"pl-5"},CE={key:1,class:"pr-5"},SE={key:1},EE=["colspan"],AE={class:"text-muted"},DE=["aria-selected","onClick"],OE={key:0,"data-select":"",class:"pl-5"},PE=["aria-checked","aria-label","onClick"],ME={key:0,class:"flex items-center gap-3"},TE={"data-avatar":"",class:"flex size-[30px] shrink-0 items-center justify-center rounded-full bg-subtle text-[12px] font-bold text-text","aria-hidden":"true"},RE=["onClick"],qE={key:1,"data-trailing":"",class:"w-[56px] pr-5"},bm=Z({__name:"DataTable",props:{columns:{},rows:{},loading:{type:Boolean,default:!1},rowLink:{type:Function,default:void 0},selectable:{type:Boolean,default:!1},selected:{default:()=>[]},sortable:{type:Boolean,default:!1},sort:{default:null},variant:{default:"list"},openable:{type:Boolean,default:!1},trailing:{type:Boolean,default:!1}},emits:["update:selected","sort","open"],setup(e,{emit:t}){const n=e,a=t,r=_l();function l(b){const E=b.id;return typeof E=="number"||typeof E=="string"?E:null}function o(b,E){const V=l(b);return V===null?`row-${E}`:String(V)}function s(b){return n.rowLink?n.rowLink(b):null}function i(b,E){if(b.target?.closest("a, button, input, label, select"))return;if(n.openable){const K=b.currentTarget?.querySelector("[data-row-open]")??null;a("open",E,K);return}const T=s(E);T&&r.push(T)}const c=k(()=>n.rows.map(l).filter(b=>b!==null)),d=k(()=>new Set(n.selected.map(String))),f=k(()=>{const b=c.value,E=b.filter(V=>d.value.has(String(V))).length;return E===0?"false":E===b.length?"true":"mixed"});function p(b){const E=l(b);return E!==null&&d.value.has(String(E))}function h(){a("update:selected",f.value==="true"?[]:[...c.value])}function m(b){const E=l(b);E!==null&&(d.value.has(String(E))?a("update:selected",n.selected.filter(V=>String(V)!==String(E))):a("update:selected",[...n.selected,E]))}function x(b){if(n.sort?.column===b.key)return n.sort.dir==="desc"?"descending":"ascending"}function g(b){return n.sortable&&b.sortable}const y=k(()=>n.variant==="relation"),w=k(()=>y.value?"h-[56px]":"h-row"),C=k(()=>y.value?3:8);function A(b){return(typeof b=="string"||typeof b=="number"?String(b):"").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(V=>V.charAt(0).toUpperCase()).join("")}function L(b,E){return E===0?"font-semibold":y.value||b.relation?"text-muted":""}const Y=k(()=>Math.max(n.columns.length+(n.selectable?1:0)+(n.trailing?1:0),1));function z(b,E){a("open",E,b.currentTarget)}const j=["w-3/5","w-2/5","w-1/2","w-3/4","w-1/3","w-2/3","w-1/2","w-2/5"];return(b,E)=>(v(),S("div",vE,[P("table",{class:_e([y.value?"min-w-[480px]":"min-w-[640px]","w-full border-collapse text-left"])},[P("thead",mE,[P("tr",yE,[e.selectable?(v(),S("th",gE,[P("button",{type:"button",role:"checkbox","aria-checked":f.value,"aria-label":u(D)("backend::lang.list.select_all"),disabled:e.loading||c.value.length===0,class:_e([f.value==="false"?"border-border-strong bg-surface":"border-primary bg-primary text-on-primary","flex size-[18px] items-center justify-center rounded-checkbox border disabled:opacity-60"]),onClick:h},[f.value==="mixed"?(v(),H(u(Ah),{key:0,size:14,"aria-hidden":"true"})):f.value==="true"?(v(),H(u(fr),{key:1,size:14,"aria-hidden":"true"})):le("",!0)],10,bE)])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,V=>(v(),S("th",{key:V.key,scope:"col","aria-sort":g(V)?x(V)??"none":void 0,class:_e([x(V)?"text-text":"text-muted","px-3.5 text-[12px] font-semibold first:pl-5 last:pr-5"])},[g(V)?(v(),S("button",{key:0,type:"button","data-sort":V.key,class:"inline-flex items-center gap-1 font-semibold",onClick:T=>a("sort",V.key)},[we(I(V.label)+" ",1),x(V)==="ascending"?(v(),H(u(Sh),{key:0,size:14,"aria-hidden":"true"})):x(V)==="descending"?(v(),H(u($h),{key:1,size:14,"aria-hidden":"true"})):le("",!0)],8,xE)):(v(),S(xe,{key:1},[we(I(V.label),1)],64))],10,_E))),128)),e.trailing?(v(),S("td",wE)):le("",!0)])]),P("tbody",{"aria-busy":e.loading?"true":void 0},[e.loading?(v(!0),S(xe,{key:0},Ve(C.value,V=>(v(),S("tr",{key:`skeleton-${V}`,"data-skeleton":"",class:_e([w.value,"border-b border-border"])},[e.selectable?(v(),S("td",$E,[...E[0]||(E[0]=[P("span",{class:"block size-[18px] rounded-checkbox bg-skel"},null,-1)])])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,T=>(v(),S("td",{key:T.key,class:"px-3.5 first:pl-5 last:pr-5"},[P("span",{class:_e([j[(V-1)%j.length],"block h-3 rounded-[6px] bg-skel"])},null,2)]))),128)),e.trailing?(v(),S("td",CE)):le("",!0)],2))),128)):e.rows.length===0?(v(),S("tr",SE,[P("td",{colspan:Y.value,class:"px-5 py-20 text-center"},[fe(b.$slots,"empty",{},()=>[P("span",AE,I(u(D)("backend::lang.list.no_records")),1)])],8,EE)])):(v(!0),S(xe,{key:2},Ve(e.rows,(V,T)=>(v(),S("tr",{key:o(V,T),class:_e([[w.value,p(V)?"bg-sel":s(V)||e.openable?"hover:bg-hover":"",s(V)||e.openable?"cursor-pointer":""],"border-b border-border transition-colors duration-150 ease-out"]),"aria-selected":e.selectable?p(V)?"true":"false":void 0,onClick:K=>i(K,V)},[e.selectable?(v(),S("td",OE,[P("button",{type:"button",role:"checkbox","aria-checked":p(V)?"true":"false","aria-label":u(D)("backend::lang.list.select_row"),class:_e([p(V)?"border-primary bg-primary text-on-primary":"border-border-strong bg-surface","flex size-[18px] items-center justify-center rounded-checkbox border"]),onClick:K=>m(V)},[p(V)?(v(),H(u(fr),{key:0,size:14,"aria-hidden":"true"})):le("",!0)],10,PE)])):le("",!0),(v(!0),S(xe,null,Ve(e.columns,(K,re)=>(v(),S("td",{key:K.key,class:_e([L(K,re),"px-3.5 first:pl-5 last:pr-5"])},[y.value&&re===0?(v(),S("span",ME,[P("span",TE,I(A(V[K.key])),1),e.openable?(v(),S("button",{key:0,type:"button","data-row-open":"",class:"min-w-0 truncate text-left font-semibold text-text",onClick:U=>z(U,V)},[W(Gl,{column:K,value:V[K.key]},null,8,["column","value"])],8,RE)):(v(),H(Gl,{key:1,column:K,value:V[K.key]},null,8,["column","value"]))])):re===0&&s(V)?(v(),H(u(Nn),{key:1,to:s(V),class:"text-text no-underline"},{default:F(()=>[W(Gl,{column:K,value:V[K.key]},null,8,["column","value"])]),_:2},1032,["to"])):(v(),H(Gl,{key:2,column:K,value:V[K.key]},null,8,["column","value"]))],2))),128)),e.trailing?(v(),S("td",qE,[fe(b.$slots,"trailing",{row:V})])):le("",!0)],10,DE))),128))],8,kE)],2)]))}}),IE=["aria-label"],FE={key:0,class:"flex flex-col gap-1 text-[13px]"},BE={class:"font-semibold text-muted"},NE=["data-filter","value","onChange"],VE=["value"],LE={key:1,class:"flex flex-col gap-1 text-[13px]"},jE={class:"mb-1 font-semibold text-muted"},UE={class:"flex items-center gap-2"},zE=["data-filter","aria-label","value","onChange"],HE=["data-filter","aria-label","value","onChange"],WE={key:2,class:"flex flex-col gap-1 text-[13px]"},KE={class:"font-semibold text-muted"},GE=["data-filter","value","onChange"],YE=["value"],qr="",Yl="h-button rounded-control border border-border-strong bg-surface px-3 text-text",JE=Z({__name:"FilterBar",props:{filters:{},values:{},source:{}},emits:["update"],setup(e,{emit:t}){const n=e,a=t;function r(f){if(f.options&&f.options.length>0)return f.options.map(h=>({value:JSON.stringify(h.value),label:h.label}));const p=[];return f.trueValue!==void 0&&p.push({value:JSON.stringify(f.trueValue),label:D("backend::lang.list.column_switch_true")}),f.falseValue!==void 0&&p.push({value:JSON.stringify(f.falseValue),label:D("backend::lang.list.column_switch_false")}),p}const l=M({});async function o(f){const{data:p}=await Re.GET("/{vendor}/{plugin}/{controller}/filters/{scope}/options",{params:{path:{...n.source,scope:f.name}}});l.value={...l.value,[f.name]:p?.data??[]}}_t(()=>{for(const f of n.filters)f.type==="scope"&&o(f)});const s=Qt({});function i(){for(const f of n.filters){if(f.type!=="daterange")continue;const[p="",h=""]=(n.values[f.name]??"").split(".."),m=s[f.name];(!m||n.values[f.name]!==void 0||m.from!==""&&m.to!=="")&&(s[f.name]={from:p,to:h})}}Ie(()=>n.values,i,{immediate:!0,deep:!0});function c(f,p,h){const m={...s[f.name]??{from:"",to:""},[p]:h};s[f.name]=m,m.from!==""&&m.to!==""?a("update",f.name,`${m.from}..${m.to}`):(m.from===""&&m.to===""||n.values[f.name]!==void 0)&&a("update",f.name,null)}function d(f,p){a("update",f.name,p===qr?null:p)}return(f,p)=>(v(),S("div",{role:"group","aria-label":u(D)("backend::lang.list.filters"),"data-filter-bar":"",class:"flex flex-wrap items-end gap-4 border-t border-border px-5 py-3.5"},[(v(!0),S(xe,null,Ve(e.filters,h=>(v(),S(xe,{key:h.name},[h.type==="switch"?(v(),S("label",FE,[P("span",BE,I(h.label||h.name),1),P("select",{"data-filter":h.name,value:e.values[h.name]??qr,class:_e(Yl),onChange:m=>d(h,m.target.value)},[P("option",{value:qr},I(u(D)("backend::lang.list.filter_all")),1),(v(!0),S(xe,null,Ve(r(h),m=>(v(),S("option",{key:m.value,value:m.value},I(m.label),9,VE))),128))],40,NE)])):h.type==="daterange"?(v(),S("fieldset",LE,[P("legend",jE,I(h.label||h.name),1),P("div",UE,[P("input",{type:"date","data-filter":`${h.name}-from`,"aria-label":u(D)("backend::lang.list.filter_from"),value:s[h.name]?.from??"",class:_e(Yl),onChange:m=>c(h,"from",m.target.value)},null,40,zE),p[0]||(p[0]=P("span",{"aria-hidden":"true"},"–",-1)),P("input",{type:"date","data-filter":`${h.name}-to`,"aria-label":u(D)("backend::lang.list.filter_to"),value:s[h.name]?.to??"",class:_e(Yl),onChange:m=>c(h,"to",m.target.value)},null,40,HE)])])):h.type==="scope"?(v(),S("label",WE,[P("span",KE,I(h.label||h.name),1),(v(),S("select",{key:`${h.name}-${l.value[h.name]?.length??-1}`,"data-filter":h.name,value:e.values[h.name]??qr,class:_e(Yl),onChange:m=>d(h,m.target.value)},[P("option",{value:qr},I(u(D)("backend::lang.list.filter_all")),1),(v(!0),S(xe,null,Ve(l.value[h.name]??[],m=>(v(),S("option",{key:m.value,value:m.value},I(m.label),9,YE))),128))],40,GE))])):le("",!0)],64))),128))],8,IE))}}),ZE=["type","disabled"],lt=Z({__name:"Button",props:{variant:{default:"outline"},size:{default:"md"},type:{default:"button"},disabled:{type:Boolean,default:!1},icon:{default:void 0},to:{default:void 0}},setup(e){const t=e,n={primary:"bg-primary text-on-primary hover:opacity-90",outline:"border border-border-strong bg-surface text-text hover:bg-hover",ghost:"text-muted hover:bg-hover hover:text-text",danger:"border border-danger bg-surface text-danger hover:bg-danger-soft"},a=k(()=>["inline-flex shrink-0 items-center justify-center gap-2 rounded-control px-4 font-semibold whitespace-nowrap no-underline transition-colors duration-150 ease-out disabled:cursor-not-allowed disabled:opacity-60",t.size==="sm"?"h-[38px]":"h-button",n[t.variant]]);return(r,l)=>e.to!==void 0?(v(),H(u(Nn),{key:0,to:e.to,class:_e(a.value)},{default:F(()=>[e.icon?(v(),H(Bn(e.icon),{key:0,size:16,"aria-hidden":"true"})):le("",!0),fe(r.$slots,"default")]),_:3},8,["to","class"])):(v(),S("button",{key:1,type:e.type,disabled:e.disabled,class:_e(a.value)},[e.icon?(v(),H(Bn(e.icon),{key:0,size:16,"aria-hidden":"true"})):le("",!0),fe(r.$slots,"default")],10,ZE))}}),QE={class:"flex flex-wrap items-center justify-between gap-3 px-5 py-4"},XE={key:0,class:"relative block w-[320px] max-w-full"},e3={class:"sr-only"},t3=["value","placeholder"],n3={key:1},a3={class:"flex items-center gap-2.5"},r3={key:0,"data-selected-pill":"",class:"inline-flex h-8 items-center gap-1.5 rounded-pill bg-sel px-3 text-[13px] font-semibold"},l3=Z({__name:"ListToolbar",props:{showSearch:{type:Boolean},search:{},searchPrompt:{},buttons:{},selectedCount:{},selectedLabel:{},deleteLabel:{},actions:{default:()=>[]},busyAction:{default:null}},emits:["update:search","delete","action"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>new Map(n.actions.map(l=>[l.name,l.label])));return(l,o)=>(v(),S("div",QE,[e.showSearch?(v(),S("label",XE,[P("span",e3,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:18,class:"pointer-events-none absolute top-1/2 left-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{type:"search","data-list-search":"",value:e.search,placeholder:e.searchPrompt,class:"h-button w-full rounded-control border border-transparent bg-subtle pr-3.5 pl-10",onInput:o[0]||(o[0]=s=>a("update:search",s.target.value))},null,40,t3)])):(v(),S("span",n3)),P("div",a3,[e.selectedCount>0?(v(),S("span",r3,[W(u(fr),{size:14,"aria-hidden":"true"}),we(I(e.selectedLabel),1)])):le("",!0),(v(!0),S(xe,null,Ve(e.buttons,s=>(v(),S(xe,{key:s},[s==="delete"?(v(),H(lt,{key:0,"data-action":"delete",variant:e.selectedCount>0?"danger":"outline",icon:u(wl),disabled:e.selectedCount===0,onClick:o[1]||(o[1]=i=>a("delete"))},{default:F(()=>[we(I(e.deleteLabel),1)]),_:1},8,["variant","icon","disabled"])):r.value.has(s)?(v(),H(lt,{key:1,variant:"outline",size:"md","data-action":s,disabled:e.busyAction===s,"aria-busy":e.busyAction===s?"true":void 0,onClick:i=>a("action",s)},{default:F(()=>[we(I(r.value.get(s)),1)]),_:2},1032,["data-action","disabled","aria-busy","onClick"])):le("",!0)],64))),128))])]))}}),o3={class:"flex flex-wrap items-center gap-x-6 gap-y-3 border-t border-border px-5 py-3.5 text-[13px] text-muted"},s3={"data-range":""},i3={key:0,class:"flex items-center gap-2"},u3=["value"],c3=["value"],d3=["aria-label"],f3=["disabled"],p3={key:0,"aria-hidden":"true",class:"px-1"},h3=["data-page","aria-current","onClick"],v3=["disabled"],bi="inline-flex h-pager min-w-pager items-center justify-center gap-1 rounded-pager border border-border px-2.5 text-[13px] text-text disabled:cursor-not-allowed disabled:opacity-60 hover:bg-hover",_m=Z({__name:"Pagination",props:{meta:{},loading:{type:Boolean},perPageOptions:{},perPage:{}},emits:["page","perPage"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.meta?.total??0),l=k(()=>n.meta?.page??1),o=k(()=>Math.max(n.meta?.last_page??1,1)),s=k(()=>{const d=n.meta;if(!d||d.total===0)return os("backend::lang.list.results",0);const f=(d.page-1)*d.per_page+1,p=Math.min(d.page*d.per_page,d.total);return D("backend::lang.list.pagination_range",{from:f,to:p,total:d.total})}),i=k(()=>{const d=o.value,f=l.value,p=new Set([1,d,f-1,f,f+1].filter(x=>x>=1&&x<=d));f<=3&&[2,3].forEach(x=>x<=d&&p.add(x)),f>=d-2&&[d-1,d-2].forEach(x=>x>=1&&p.add(x));const h=[...p].sort((x,g)=>x-g),m=[];return h.forEach((x,g)=>{const y=h[g-1];y!==void 0&&x-y>1&&m.push(null),m.push(x)}),m});function c(d){const f=Number(d.target.value);Number.isFinite(f)&&f>0&&a("perPage",f)}return(d,f)=>(v(),S("footer",o3,[P("span",s3,I(e.loading?u(D)("backend::lang.list.loading"):s.value),1),e.perPageOptions.length>1?(v(),S("label",i3,[P("span",null,I(u(D)("backend::lang.list.records_per_page")),1),P("select",{"data-per-page":"",value:String(e.perPage),class:"h-pager rounded-pager border border-border-strong bg-surface px-2 text-text",onChange:c},[(v(!0),S(xe,null,Ve(e.perPageOptions,p=>(v(),S("option",{key:p,value:String(p)},I(p),9,c3))),128))],40,u3)])):le("",!0),!e.loading&&r.value>0?(v(),S("nav",{key:1,"aria-label":u(D)("backend::lang.list.pagination"),class:"ml-auto flex items-center gap-1.5"},[P("button",{type:"button","data-page":"prev",class:_e(bi),disabled:l.value<=1,onClick:f[0]||(f[0]=p=>a("page",l.value-1))},[W(u(ns),{size:14,"aria-hidden":"true"}),we(I(u(D)("backend::lang.list.prev_page")),1)],8,f3),(v(!0),S(xe,null,Ve(i.value,(p,h)=>(v(),S(xe,{key:p??`gap-${h}`},[p===null?(v(),S("span",p3,"…")):(v(),S("button",{key:1,type:"button","data-page":p,"aria-current":p===l.value?"page":void 0,class:_e([bi,p===l.value?"border-transparent bg-sel font-bold":""]),onClick:m=>p!==l.value&&a("page",p)},I(p),11,h3))],64))),128)),P("button",{type:"button","data-page":"next",class:_e(bi),disabled:l.value>=o.value,onClick:f[1]||(f[1]=p=>a("page",l.value+1))},[we(I(u(D)("backend::lang.list.next_page")),1),W(u(xl),{size:14,"aria-hidden":"true"})],8,v3)],8,d3)):le("",!0)]))}}),m3={role:"alert","data-extension-failure":"",class:"flex min-h-input items-center rounded-control border-[1.5px] border-dashed border-border-strong bg-subtle px-3.5 py-2.5 text-[13px] text-muted"},y3={class:"flex min-w-0 items-start gap-2.5"},g3={class:"min-w-0 [overflow-wrap:anywhere]"},mc=Z({__name:"ExtensionFailure",props:{text:{}},setup(e){return(t,n)=>(v(),S("div",m3,[P("span",y3,[W(u(Ut),{size:16,class:"mt-0.5 shrink-0 text-danger","aria-hidden":"true"}),P("span",g3,I(e.text),1)])]))}}),b3=new Set(["div","span","p","strong","em","b","i","u","s","small","mark","code","pre","br","hr","ul","ol","li","dl","dt","dd","h2","h3","h4","h5","h6","table","thead","tbody","tfoot","tr","th","td","caption","section","header","footer","figure","figcaption","blockquote","q","abbr","time","data","meter","progress","sup","sub","a","img"]),_3=new Set(["script","style","template","iframe","object","embed","noscript","textarea","title","xmp","svg","math","form","input","button","select","link","meta","base"]),x3=32,w3=2e3,k3=new Set(["class","title","lang","dir","role"]),$3={a:new Set(["href"]),img:new Set(["src","alt","width","height"]),td:new Set(["colspan","rowspan","scope"]),th:new Set(["colspan","rowspan","scope"]),time:new Set(["datetime"]),data:new Set(["value"]),meter:new Set(["value","min","max","low","high","optimum"]),progress:new Set(["value","max"])},C3=/^(aria|data)-[a-z0-9_-]+$/;function S3(e,t){if(e==="")return!1;for(const n of e){const a=n.codePointAt(0)??0;if(a<=32||a===127)return!1}return e.startsWith("#")?t:e.startsWith("/")?e.length===1||e[1]!=="/"&&e[1]!=="\\":!1}function E3(e,t,n){return k3.has(t)||$3[e]?.has(t)===!0||C3.test(t)?e==="a"&&t==="href"||e==="img"&&t==="src"?S3(n,e==="a"):!0:!1}function A3(e,t){const n={};for(const[a,r]of Object.entries(t??{})){const l=a.toLowerCase();typeof r=="string"&&E3(e,l,r)&&(n[l]=r)}return n}function cu(e,t,n){const a=[];for(const r of e??[]){if(n.left<=0)break;if(r.tag===void 0||r.tag===""){typeof r.text=="string"&&r.text!==""&&(n.left-=1,a.push(r.text));continue}const l=r.tag.toLowerCase();if(_3.has(l))continue;if(!b3.has(l)){a.push(...cu(r.children,t,n));continue}if(t+1>x3)continue;n.left-=1;const o=cu(r.children,t+1,n);a.push(Ht(l,A3(l,r.attrs),o.length>0?o:void 0))}return a}function D3(e){return cu(e,0,{left:w3})}const O3={key:1,"data-partial-loading":"","aria-busy":"true"},P3=["data-partial","aria-busy"],xm=Z({__name:"PartialHost",props:{source:{},name:{},recordId:{default:null},variant:{},reloadKey:{default:0}},setup(e){const t=e,n=M(null),a=M(!1),r=M(!1);let l=0;const o=i=>D3(i.nodes);o.props=["nodes"];async function s(){const i=++l;r.value=!0;let c=null;try{c=(await Re.GET("/{vendor}/{plugin}/{controller}/partials/{name}",{params:{path:{...t.source,name:t.name},query:t.recordId!=null?{id:t.recordId}:void 0}})).data?.data.nodes??null}catch{c=null}i===l&&(r.value=!1,a.value=c===null,n.value=c)}return Ie(()=>t.reloadKey,()=>{s()}),s(),(i,c)=>a.value?(v(),H(mc,{key:0,"data-partial-failed":"",text:u(D)("backend::lang.extension.partial_failed")},null,8,["text"])):n.value===null?(v(),S("div",O3,[P("div",{"data-partial-skeleton":"",class:_e([e.variant==="header"?"h-[80px] w-full rounded-card":"h-[44px] w-full rounded-control","bg-skel"]),"aria-hidden":"true"},null,2)])):n.value.length>0?(v(),S("div",{key:2,class:"summer-partial","data-partial":e.variant,"aria-busy":r.value?"true":void 0},[W(o,{nodes:n.value},null,8,["nodes"])],8,P3)):le("",!0)}}),M3={class:"flex gap-2.5"},T3=["disabled","aria-busy"],Cr=Z({__name:"ConfirmDialog",props:{open:{type:Boolean},message:{},title:{default:void 0},confirmLabel:{default:void 0},cancelLabel:{default:void 0},danger:{type:Boolean,default:!1},busy:{type:Boolean,default:!1}},emits:["update:open","confirm","cancel"],setup(e,{emit:t}){const n=e,a=t;function r(o){!o&&n.busy||(a("update:open",o),o||a("cancel"))}function l(){n.busy||(a("confirm"),a("update:open",!1))}return(o,s)=>(v(),H(u(lk),{open:e.open,"onUpdate:open":r},{default:F(()=>[W(u(ak),null,{default:F(()=>[W(u(tk),{class:"fixed inset-0 z-40 bg-overlay"}),W(u(Yw),{"data-confirm-dialog":"",class:"fixed top-1/2 left-1/2 z-50 flex w-[calc(100%-32px)] max-w-[440px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-modal bg-surface p-6 text-text shadow-pop"},{default:F(()=>[W(u(sk),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(e.title??u(D)("backend::lang.form.confirm")),1)]),_:1}),W(u(Xw),{class:"text-muted"},{default:F(()=>[we(I(e.message),1)]),_:1}),P("div",M3,[W(u(Zw),{"data-action":"cancel",disabled:e.busy,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60"},{default:F(()=>[we(I(e.cancelLabel??u(D)("backend::lang.form.cancel")),1)]),_:1},8,["disabled"]),P("button",{type:"button","data-action":"confirm",disabled:e.busy,"aria-busy":e.busy?"true":void 0,class:_e([e.danger?"bg-danger text-white":"bg-primary text-on-primary","inline-flex h-button flex-1 items-center justify-center gap-2 rounded-control font-semibold hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"]),onClick:l},[e.busy?(v(),H(u(to),{key:0,size:16,class:"animate-spin","aria-hidden":"true"})):le("",!0),we(" "+I(e.confirmLabel??u(D)("backend::lang.form.confirm")),1)],10,T3)])]),_:1})]),_:1})]),_:1},8,["open"]))}});function Sr(){const e=M(null),t=M(!1);let n=null,a=null;function r(i){const c=n;n=null,a=null,e.value=null,c?.(i)}function l(i,c){return r(!1),e.value=i,a=c??null,new Promise(d=>{n=d})}async function o(){if(t.value)return;const i=a;if(i){t.value=!0;try{await i()}finally{t.value=!1}}r(!0)}function s(){t.value||r(!1)}return{request:e,busy:t,ask:l,confirm:o,cancel:s}}const R3={class:"flex flex-col gap-5"},q3={class:"flex flex-wrap items-end justify-between gap-4"},I3={class:"flex flex-col"},F3={class:"text-[26px] font-bold tracking-[-0.02em]"},B3={key:0,"data-record-count":"",class:"text-muted"},N3={key:0,class:"flex items-center gap-2.5"},V3={class:"overflow-hidden rounded-card border border-border bg-surface shadow-card"},L3={key:2,role:"alert",class:"border-t border-border px-5 py-4 text-danger"},j3={key:0,"data-empty-search":"",class:"flex flex-col items-center gap-3"},U3={class:"flex size-14 items-center justify-center rounded-full bg-subtle text-muted"},z3={class:"text-[17px] font-bold"},H3={class:"max-w-[420px] text-muted"},W3={key:1,"data-empty-list":"",class:"text-muted"},K3=300,G3=Z({__name:"ListView",setup(e){const t=_n(),n=_l(),a={vendor:String(t.params.vendor??""),plugin:String(t.params.plugin??""),controller:String(t.params.controller??"")},r=qu(a),l=ua(r)??"/",o=M(null),s=M([]),i=M(null),c=M(!0),d=M(!1),f=M(!1),p=k(()=>d.value||f.value),h=M([]),m=M(!1),x=M(0),g=Sr(),y=k(()=>iE(t.query)),w=M(y.value.search??""),C=k(()=>o.value?.messages),A=k(()=>o.value?.title?o.value.title:us(a.vendor,a.plugin)?.sideMenu.find(q=>q.controller===r)?.label??r),L=k(()=>i.value?Fe(C.value?.recordCount,i.value.total):""),Y=k(()=>o.value?.toolbarButtons??[]),z=k(()=>Y.value.filter(G=>G==="create")),j=k(()=>o.value?.toolbarActions??[]),b=k(()=>Y.value.filter(G=>G==="delete"||j.value.some(q=>q.name===G))),E=M(null),V=k(()=>{const G=o.value?.perPageOptions??[];return G.length>0?G:[o.value?.recordsPerPage||20]}),T=k(()=>y.value.per_page??i.value?.per_page??o.value?.recordsPerPage??20),K=k(()=>y.value.sort?{column:y.value.sort,dir:y.value.dir==="desc"?"desc":"asc"}:null);function re(G){const q=o.value?.recordUrl,te=G.id;return!q||typeof te!="number"&&typeof te!="string"?null:gm(q,r,te)}function U(G){n.replace({path:t.path,query:ym(G)})}let ae=0;async function Q(){const G=++ae;c.value=!0,f.value=!1;const q=await Re.GET("/{vendor}/{plugin}/{controller}",{params:{path:a,query:y.value}});G===ae&&(s.value=q.data?.data??[],i.value=q.data?.meta??null,f.value=!q.data,c.value=!1)}async function se(){const G=await Re.GET("/{vendor}/{plugin}/{controller}/schema/list",{params:{path:a}});o.value=G.data?.data??null,d.value=!o.value,o.value&&mm(r,o.value.assets)}se(),Ie(()=>uE(y.value),()=>{h.value=[],w.value=y.value.search??"",Q()},{immediate:!0});let ne=null;function ie(G){w.value=G,ne!==null&&clearTimeout(ne),ne=setTimeout(()=>{ne=null;const q=G.trim();U({...y.value,search:q===""?void 0:q,page:void 0})},K3)}Nt(()=>{ne!==null&&clearTimeout(ne)});function de(){w.value="",U({...y.value,search:void 0,page:void 0})}function $e(G){const q=K.value;q?.column!==G?U({...y.value,sort:G,dir:"asc",page:void 0}):q.dir==="asc"?U({...y.value,sort:G,dir:"desc",page:void 0}):U({...y.value,sort:void 0,dir:void 0,page:void 0})}function Ce(G){U({...y.value,page:G})}function ue(G){U({...y.value,per_page:G,page:void 0})}function Te(G,q){const te={...y.value.filter??{}};q===null?delete te[G]:te[G]=q,U({...y.value,filter:te,page:void 0})}async function ce(){const G=h.value.map(Number).filter(te=>Number.isInteger(te)&&te>0);if(!(G.length===0||m.value||!await g.ask({message:Fe(C.value?.deleteConfirm,G.length),confirmLabel:D("backend::lang.form.delete"),danger:!0}))){m.value=!0;try{const te=await Re.POST("/{vendor}/{plugin}/{controller}/bulk-delete",{params:{path:a},body:{ids:G}});if(te.data){Be(Fe(C.value?.deleted,te.data.data.deleted)),h.value=[],await Q(),x.value+=1;return}Be(te.error?.error.message||D("backend::lang.list.delete_failed"),"danger")}catch{Be(D("backend::lang.list.delete_failed"),"danger")}finally{m.value=!1}}}async function B(G){if(E.value===null){E.value=G;try{const q=await Re.POST("/{vendor}/{plugin}/{controller}/toolbar/{action}",{params:{path:{...a,action:G}},body:{}});if(q.data){q.data.data.message&&Be(q.data.data.message),await Q(),x.value+=1;return}Be(q.error?.error.message||D("backend::lang.extension.action_failed"),"danger")}catch{Be(D("backend::lang.extension.action_failed"),"danger")}finally{E.value=null}}}return(G,q)=>(v(),S("section",R3,[P("header",q3,[P("div",I3,[P("h1",F3,I(A.value),1),L.value?(v(),S("p",B3,I(L.value),1)):le("",!0)]),z.value.length>0?(v(),S("div",N3,[(v(!0),S(xe,null,Ve(z.value,te=>(v(),H(lt,{key:te,"data-action":"create",variant:"primary",icon:u(Ou),to:`${u(l)}/create`},{default:F(()=>[we(I(u(Fe)(C.value?.create)),1)]),_:1},8,["icon","to"]))),128))])):le("",!0)]),o.value?.headerPartial?(v(),H(xm,{key:0,variant:"header",source:a,name:o.value.headerPartial,"reload-key":x.value},null,8,["name","reload-key"])):le("",!0),P("div",V3,[o.value?(v(),H(l3,{key:0,"show-search":o.value.showSearch,search:w.value,"search-prompt":u(Fe)(C.value?.searchPrompt),buttons:b.value,"selected-count":h.value.length,"selected-label":u(Fe)(C.value?.selected,h.value.length),"delete-label":u(Fe)(C.value?.deleteSelected,h.value.length),actions:j.value,"busy-action":E.value,"onUpdate:search":ie,onDelete:ce,onAction:B},null,8,["show-search","search","search-prompt","buttons","selected-count","selected-label","delete-label","actions","busy-action"])):le("",!0),o.value&&o.value.filters.length>0?(v(),H(JE,{key:1,filters:o.value.filters,values:y.value.filter??{},source:a,onUpdate:Te},null,8,["filters","values"])):le("",!0),p.value&&!c.value?(v(),S("p",L3,I(u(D)("backend::lang.list.load_failed")),1)):(v(),H(bm,{key:3,columns:o.value?.columns??[],rows:s.value,loading:c.value||!o.value,"row-link":re,selectable:o.value?.showCheckboxes??!1,selected:h.value,sortable:o.value?.showSorting??!1,sort:K.value,"onUpdate:selected":q[0]||(q[0]=te=>h.value=te),onSort:$e},{empty:F(()=>[y.value.search?(v(),S("div",j3,[P("span",U3,[W(u(Mh),{size:24,"aria-hidden":"true"})]),P("p",z3,I(u(Fe)(C.value?.emptySearch,void 0,{term:y.value.search})),1),P("p",H3,I(u(Fe)(C.value?.emptySearchHint,void 0,{term:y.value.search})),1),W(lt,{"data-action":"clear-search",onClick:de},{default:F(()=>[we(I(u(D)("backend::lang.list.clear_search")),1)]),_:1})])):(v(),S("p",W3,I(u(Fe)(C.value?.empty)||o.value?.noRecordsMessage||u(D)("backend::lang.list.no_records")),1))]),_:1},8,["columns","rows","loading","selectable","selected","sortable","sort"])),W(_m,{meta:i.value,loading:c.value||!o.value,"per-page-options":V.value,"per-page":T.value,onPage:Ce,onPerPage:ue},null,8,["meta","loading","per-page-options","per-page"])]),W(Cr,{open:u(g).request.value!==null,message:u(g).request.value?.message??"","confirm-label":u(g).request.value?.confirmLabel,danger:u(g).request.value?.danger,onConfirm:u(g).confirm,onCancel:u(g).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])]))}}),pa="X-Session-Key",wm="X-Child-Session-Key",Y3=32;function Mo(){const e=new Uint8Array(Y3);globalThis.crypto.getRandomValues(e);let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function ra(e){try{const t=await e();return{data:t.data?t.data.data:null,status:t.response.status,error:t.error?.error??null}}catch{return{data:null,status:0,error:null}}}async function To(e){try{const t=await e();return t.response.ok&&t.data instanceof Blob?t.data:null}catch{return null}}function Pn(e){return encodeURIComponent(String(e))}function km(e){return`${ls.api}/${Pn(e.vendor)}/${Pn(e.plugin)}/${Pn(e.controller)}`}function J3(e){try{return e===""?null:JSON.parse(e)}catch{return null}}function $m(e){if(!e)return"";for(const t of Object.values(e.details??{})){const n=Array.isArray(t)?t.find(a=>typeof a=="string"&&a!==""):t;if(typeof n=="string"&&n!=="")return n}return e.message??""}function Z3(e,t){const n=t;if((e===200||e===201)&&n?.data)return{ok:!0,item:n.data};const a=$m(n?.error);return e===413?{ok:!1,reason:"too_large",status:e,message:a}:e===422?{ok:!1,reason:"invalid",status:e,message:a}:e===0?{ok:!1,reason:"network",status:e,message:a}:{ok:!1,reason:"failed",status:e,message:a}}function Cm(e,t,n,a){let r=null,l=!1;const o=()=>new Promise(i=>{const c=new XMLHttpRequest;r=c,c.open("POST",e),c.setRequestHeader("X-Requested-With",Bh),c.setRequestHeader("Accept","application/json");for(const[f,p]of Object.entries(n))c.setRequestHeader(f,p);c.upload.onprogress=f=>{f.lengthComputable&&a?.(f.loaded,f.total)},c.onload=()=>i({status:c.status,body:J3(c.responseText)}),c.onerror=()=>i("network"),c.ontimeout=()=>i("network"),c.onabort=()=>i("aborted");const d=new FormData;d.append("file_data",t,t.name),c.send(d)});return{promise:(async()=>{let i=await o();return typeof i=="object"&&i.status===401&&!l&&(await Mu()&&(i=l?"aborted":await o()),typeof i=="object"&&i.status===401&&X0()),i==="aborted"||l?{ok:!1,reason:"aborted",status:0,message:""}:i==="network"?{ok:!1,reason:"network",status:0,message:""}:Z3(i.status,i.body)})(),abort(){l=!0,r?.abort()}}}function Q3(e,t,n,a){const r={...e,id:t,field:n},l={[pa]:a},o=`${km(e)}/${Pn(t)}/files/${Pn(n)}`;return{list:()=>ra(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}",{params:{path:r,header:l}})),upload:(s,i)=>Cm(o,s,{...l},i),update:(s,i)=>ra(()=>Re.PUT("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}",{params:{path:{...r,file:s},header:l},body:i})),remove:s=>ra(()=>Re.DELETE("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}",{params:{path:{...r,file:s},header:l}})),reorder:s=>ra(()=>Re.POST("/{vendor}/{plugin}/{controller}/{id}/files/{field}/reorder",{params:{path:r,header:l},body:{ids:s}})),download:s=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}/download",{params:{path:{...r,file:s},header:l},parseAs:"blob"})),thumb:s=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/files/{field}/{file}/thumb",{params:{path:{...r,file:s},header:l},parseAs:"blob"}))}}function X3(e,t,n,a,r,l,o){const s={...e,id:t,name:n,child:a,field:r},i={[pa]:l,[wm]:o},c=`${km(e)}/${Pn(t)}/relations/${Pn(n)}/records/${Pn(a)}/files/${Pn(r)}`;return{list:()=>ra(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}",{params:{path:s,header:i}})),upload:(d,f)=>Cm(c,d,{...i},f),update:(d,f)=>ra(()=>Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}",{params:{path:{...s,file:d},header:i},body:f})),remove:d=>ra(()=>Re.DELETE("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}",{params:{path:{...s,file:d},header:i}})),reorder:d=>ra(()=>Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/reorder",{params:{path:s,header:i},body:{ids:d}})),download:d=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}/download",{params:{path:{...s,file:d},header:i},parseAs:"blob"})),thumb:d=>To(()=>Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}/files/{field}/{file}/thumb",{params:{path:{...s,file:d},header:i},parseAs:"blob"}))}}const eA={key:0,role:"alert","data-error-banner":"",class:"flex items-start gap-3 rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},tA={class:"flex flex-col gap-1"},Ol=Z({__name:"FormErrorBanner",props:{errors:{},fieldNames:{}},setup(e){const t=e,n=k(()=>Object.keys(t.errors).length),a=k(()=>Object.entries(t.errors).filter(([r])=>!t.fieldNames.includes(r)).flatMap(([,r])=>r));return(r,l)=>n.value>0?(v(),S("div",eA,[W(u(Ut),{size:20,class:"mt-px shrink-0","aria-hidden":"true"}),P("div",tA,[P("p",null,[P("strong",null,I(u(D)("backend::lang.form.error_title")),1),we(" "+I(u(os)("backend::lang.form.error_fields",n.value)),1)]),(v(!0),S(xe,null,Ve(a.value,(o,s)=>(v(),S("p",{key:s,class:"text-[13px]"},I(o),1))),128))])])):le("",!0)}}),nA=new Set(["readonly","placeholder","maxlength","minlength","min","max","step","autocomplete","spellcheck","pattern"]);function yc(e){const t={};for(const[n,a]of Object.entries(e.attributes??{})){const r=n.toLowerCase();!nA.has(r)||a===null||a===!1||(t[r]=a)}return t}function qa(e){return["w-full rounded-control border bg-surface px-3.5 text-text transition-colors duration-150 ease-out",e?"border-danger":"border-border-strong"].join(" ")}function Sm(e){return typeof e=="string"?e!==""&&e!=="0"&&e.toLowerCase()!=="false":!!e}function Em(e,t){return typeof e=="number"?t?1:0:t}const aA={class:"flex min-w-0 flex-col"},rA=["for"],lA={key:0,class:"text-danger","aria-hidden":"true"},oA=["id"],sA=["id","name","checked","aria-invalid","aria-describedby"],iA=Z({__name:"CheckboxField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>Sm(n.modelValue));function l(o){a("update:modelValue",Em(n.modelValue,o.target.checked))}return(o,s)=>(v(),S("div",{class:_e([e.invalid?"border-danger":"border-border","flex items-center justify-between gap-4 rounded-inner border px-4 py-3.5"]),"data-toggle-card":""},[P("div",aA,[P("label",{for:e.controlId,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",lA," *")):le("",!0)],8,rA),e.field.comment?(v(),S("p",{key:0,id:`${e.controlId}-comment`,class:"text-[13px] text-muted"},I(e.field.comment),9,oA)):le("",!0)]),P("input",{id:e.controlId,type:"checkbox",name:e.field.name,checked:r.value,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"size-5 shrink-0 rounded-[6px] accent-primary",onChange:l},null,40,sA)],2))}});function uA(e){return e==="date"||e==="time"?e:"datetime"}function At(e,t=2){return String(e).padStart(t,"0")}const cA=/(Z|[+-]\d{2}:?\d{2})$/i;function dA(e,t,n=!1){if(typeof t!="string"||t.trim()==="")return null;const a=t.trim();try{if(e==="date")return fv(a.slice(0,10));if(e==="time"){const l=/(\d{2}:\d{2}(:\d{2})?)/.exec(a.includes("T")?a.slice(a.indexOf("T")):a);return l?wx(l[1]):null}const r=cA.test(a)?a.replace(" ","T"):`${a.replace(" ","T")}Z`;return n?mn(Zd(r,"UTC")):Zd(r,an())}catch{return null}}function _i(e){return`${At(e.year,4)}-${At(e.month)}-${At(e.day)}`}function xi(e){return`${At(e.hour)}:${At(e.minute)}:${At(e.second)}`}function qf(e,t,n=!1){if(!t)return null;if(e==="time")return"hour"in t?xi(t):null;if(!("year"in t))return null;if(e==="date")return _i(t);if(n){const l=t instanceof Vn?mn(t):t,o="hour"in l?xi(l):"00:00:00";return`${_i(l)}T${o}Z`}const a=t instanceof Vn?t:zu(t instanceof et?mn(t):t,an()),r=Hu(a,"UTC");return`${_i(r)}T${xi(r)}Z`}const fA={date:"YYYY-MM-DD",datetime:"YYYY-MM-DD HH:mm",time:"HH:mm"},pA=/\[([^\]]*)\]|YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|HH|H|hh|h|mm|ss|A|a/g;function hA(e){return"year"in e?new et(e.year,e.month,e.day):null}function wi(e,t,n,a){return new Yt(e,{...n,timeZone:"UTC"}).formatToParts(t.toDate("UTC")).find(l=>l.type===a)?.value??""}function vA(e,t,n,a){if(!e)return"";const r=n||fA[t],l=hA(e),o="hour"in e?e:null,s=/D/.test(r.replace(/\[[^\]]*\]/g,""));return r.replace(pA,(i,c)=>{if(c!==void 0)return c;switch(i){case"YYYY":return l?At(l.year,4):"";case"YY":return l?At(l.year%100):"";case"MMMM":case"MMM":{if(!l)return"";const d=i==="MMMM"?"long":"short";return s?wi(a,l,{day:"numeric",month:d},"month"):wi(a,l,{month:d},"month")}case"MM":return l?At(l.month):"";case"M":return l?String(l.month):"";case"dddd":case"ddd":return l?wi(a,l,{weekday:i==="dddd"?"long":"short"},"weekday"):"";case"DD":return l?At(l.day):"";case"D":return l?String(l.day):"";case"HH":return o?At(o.hour):"";case"H":return o?String(o.hour):"";case"hh":return o?At(o.hour%12||12):"";case"h":return o?String(o.hour%12||12):"";case"mm":return o?At(o.minute):"";case"ss":return o?At(o.second):"";case"A":return o?o.hour<12?"AM":"PM":"";case"a":return o?o.hour<12?"am":"pm":"";default:return i}})}const mA=new et(2026,10,4);function yA(e,t){if(typeof t=="number"&&Number.isInteger(t)&&t>=0&&t<=6)return t;try{return(7-ps(mA,e))%7}catch{return 1}}function If(e){if(e)try{return fv(e.slice(0,10))}catch{return}}function gA(e,t=$l(an())){const n=If(e.minDate),a=If(e.maxDate);if(n||a)return{min:n,max:a};const r=e.yearRange??[];return r.length===1&&typeof r[0]=="number"?{min:new et(t.year-r[0],1,1),max:new et(t.year+r[0],12,31)}:r.length===2&&typeof r[0]=="number"&&typeof r[1]=="number"?{min:new et(r[0],1,1),max:new et(r[1],12,31)}:{}}function du(e,t,n,a){if(!e||t==="time")return;if(t==="date")return e;const r=new Ma(e.year,e.month,e.day,a?23:0,a?59:0,a?59:0);return n?r:zu(r,an())}function bA(e,t){const n=$l(an());return du(n,e==="time"?"datetime":e,t,!1)??n}const _A=["id","aria-describedby"],xA={key:0},wA={key:1,class:"text-muted","data-empty":""},kA=["aria-label"],$A={class:"flex size-8 shrink-0 items-center justify-center text-muted","aria-hidden":"true"},CA=["data-mode"],SA=["aria-label"],Ir="flex size-8 shrink-0 items-center justify-center rounded-pager text-muted transition-colors duration-150 ease-out hover:bg-hover hover:text-text",EA=Z({__name:"DatepickerField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>uA(n.field.mode)),l=k(()=>r.value==="datetime"&&!!n.field.ignoreTimezone),o=k(()=>il.value||"pl"),s=k(()=>{const Q=n.field.attributes?.readonly;return!!n.field.readOnly||Q!=null&&Q!==!1}),i=k(()=>dA(r.value,n.modelValue,l.value)),c=k(()=>r.value==="time"?null:i.value),d=k(()=>r.value==="time"?i.value:null),f=k(()=>gA(n.field)),p=k(()=>du(f.value.min,r.value,l.value,!1)),h=k(()=>du(f.value.max,r.value,l.value,!0)),m=bA(r.value,l.value),x=k(()=>yA(o.value,n.field.firstDay)),g=k(()=>n.field.twelveHour?12:24),y=k(()=>r.value==="date"?"day":"minute"),w=k(()=>vA(i.value,r.value,n.field.displayFormat,o.value)),C=k(()=>!n.field.required&&i.value!==null&&!s.value),A=k(()=>{const Q=c.value;return Q?!!p.value&&Q.compare(p.value)<0||!!h.value&&Q.compare(h.value)>0:!1}),L=new Set(["day","month","year","hour","minute","second"]),Y=M(null),z=M(!1);function j(){const Q=Y.value;if(!Q){z.value=!1;return}const se=Array.from(Q.querySelectorAll("[data-reka-date-field-segment], [data-reka-time-field-segment]")).filter(ie=>L.has(ie.dataset.rekaDateFieldSegment??ie.dataset.rekaTimeFieldSegment??"")),ne=se.filter(ie=>!ie.hasAttribute("data-placeholder")).length;z.value=ne>0&&ne!!n.invalid||A.value||z.value),V=k(()=>qf(r.value,i.value,l.value));function T(Q){const se=qf(r.value,Q??null,l.value);b(),!(se===V.value&&(se!==null||n.modelValue===null))&&a("update:modelValue",se)}function K(){a("update:modelValue",null),b()}function re(Q){return Q.charAt(0).toLocaleUpperCase(o.value)+Q.slice(1)}const U=k(()=>[qa(E.value),"h-input flex min-w-0 items-center gap-1 pl-3.5 pr-1.5","focus-within:border-primary focus-within:shadow-[0_0_0_3px_var(--c-ring)]","has-[[data-invalid]]:border-danger"]);function ae(Q){return Q==="literal"?"text-muted":Q==="timeZoneName"?"min-w-0 truncate text-[13px] text-muted":"rounded-[4px] px-0.5 tabular-nums outline-none focus:bg-sel focus:text-text focus-visible:outline-none data-[placeholder]:text-placeholder focus:data-[placeholder]:text-text"}return(Q,se)=>s.value?(v(),S("p",{key:0,id:e.controlId,"data-datepicker-readonly":"","aria-describedby":e.describedBy||void 0,class:"flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5 tabular-nums"},[w.value!==""?(v(),S("span",xA,I(w.value),1)):(v(),S("span",wA,"—"))],8,_A)):r.value==="time"?(v(),S("div",{key:1,ref_key:"container",ref:Y,"data-datepicker":"","data-mode":"time",class:_e(U.value),onKeyup:b,onFocusout:b},[W(u(vS),{id:e.controlId,"model-value":d.value,locale:o.value,"hour-cycle":g.value,granularity:"minute",name:e.field.name,required:e.field.required||void 0,"aria-invalid":E.value?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"flex min-w-0 flex-1 items-center","onUpdate:modelValue":T},{default:F(({segments:ne})=>[(v(!0),S(xe,null,Ve(ne,ie=>(v(),H(u(yS),{key:ie.part,part:ie.part,class:_e(ae(ie.part))},{default:F(()=>[we(I(ie.value),1)]),_:2},1032,["part","class"]))),128))]),_:1},8,["id","model-value","locale","hour-cycle","name","required","aria-invalid","aria-describedby"]),C.value?(v(),S("button",{key:0,type:"button","data-action":"clear","aria-label":u(D)("backend::lang.datepicker.clear"),class:_e(Ir),onClick:K},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,kA)):le("",!0),P("span",$A,[W(u(z1),{size:16})])],34)):(v(),H(u(rC),{key:2,id:e.controlId,"model-value":c.value,"default-placeholder":u(m),locale:o.value,granularity:y.value,"hour-cycle":g.value,"hide-time-zone":r.value!=="datetime"||l.value,"min-value":p.value,"max-value":h.value,"week-starts-on":x.value,name:e.field.name,required:e.field.required||void 0,"close-on-select":"","prevent-deselect":"","onUpdate:modelValue":T},{default:F(()=>[P("div",{ref_key:"container",ref:Y,"data-datepicker":"","data-mode":r.value,class:_e(U.value),onKeyup:b,onFocusout:b},[W(u(kC),{"aria-invalid":E.value?"true":void 0,"aria-describedby":e.describedBy||void 0,class:"flex min-w-0 flex-1 items-center overflow-hidden"},{default:F(({segments:ne})=>[(v(!0),S(xe,null,Ve(ne,ie=>(v(),H(u(BC),{key:ie.part,part:ie.part,class:_e(ae(ie.part))},{default:F(()=>[we(I(ie.value),1)]),_:2},1032,["part","class"]))),128))]),_:1},8,["aria-invalid","aria-describedby"]),C.value?(v(),S("button",{key:0,type:"button","data-action":"clear","aria-label":u(D)("backend::lang.datepicker.clear"),class:_e(Ir),onClick:K},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,SA)):le("",!0),W(u(WC),{"data-action":"open-calendar","aria-label":u(D)("backend::lang.datepicker.open_calendar"),class:_e(Ir)},{default:F(()=>[W(u(T1),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])],42,CA),W(u(xC),{"data-datepicker-calendar":"","side-offset":4,align:"end",class:"z-50 w-[284px] rounded-inner border border-border bg-surface p-4 text-text shadow-menu"},{default:F(()=>[W(u(oC),null,{default:F(({weekDays:ne,grid:ie})=>[W(u(RC),{class:"flex h-9 items-center justify-between"},{default:F(()=>[W(u(jC),{"aria-label":u(D)("backend::lang.datepicker.prev_month"),class:_e(Ir)},{default:F(()=>[W(u(ns),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"]),W(u(IC),{class:"font-semibold"},{default:F(({headingValue:de})=>[we(I(re(de)),1)]),_:1}),W(u(VC),{"aria-label":u(D)("backend::lang.datepicker.next_month"),class:_e(Ir)},{default:F(()=>[W(u(xl),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])]),_:1}),(v(!0),S(xe,null,Ve(ie,de=>(v(),H(u(CC),{key:de.value.toString(),class:"mt-2 w-full border-collapse select-none"},{default:F(()=>[W(u(DC),null,{default:F(()=>[W(u(Tf),{class:"flex"},{default:F(()=>[(v(!0),S(xe,null,Ve(ne,$e=>(v(),H(u(MC),{key:$e,class:"flex h-9 w-9 items-center justify-center text-[13px] font-normal text-muted"},{default:F(()=>[we(I($e),1)]),_:2},1024))),128))]),_:2},1024)]),_:2},1024),W(u(EC),null,{default:F(()=>[(v(!0),S(xe,null,Ve(de.rows,($e,Ce)=>(v(),H(u(Tf),{key:`week-${Ce}`,class:"flex"},{default:F(()=>[(v(!0),S(xe,null,Ve($e,ue=>(v(),H(u(iC),{key:ue.toString(),date:ue,class:"p-0"},{default:F(()=>[W(u(cC),{day:ue,month:de.value,class:"flex size-9 items-center justify-center rounded-pager tabular-nums text-text transition-colors duration-150 ease-out hover:bg-hover data-[outside-view]:text-placeholder data-[today]:font-semibold data-[today]:shadow-[inset_0_0_0_1px_var(--c-border-strong)] data-[selected]:bg-primary data-[selected]:font-semibold data-[selected]:text-on-primary data-[disabled]:cursor-not-allowed data-[disabled]:text-placeholder data-[disabled]:opacity-40 data-[disabled]:hover:bg-transparent data-[unavailable]:cursor-not-allowed data-[unavailable]:opacity-40"},null,8,["day","month"])]),_:2},1032,["date"]))),128))]),_:2},1024))),128))]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["id","model-value","default-placeholder","locale","granularity","hour-cycle","hide-time-zone","min-value","max-value","week-starts-on","name","required"]))}}),AA={class:"relative"},DA=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],OA=["value"],Jl="empty",Zl="placeholder",PA=Z({__name:"DropdownField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.field.options??[]);function l(c,d){return c==null||d===null||d===void 0?c===d||c==null&&d==null:String(c)===String(d)}const o=k(()=>{const c=r.value.findIndex(d=>l(d.value,n.modelValue));return c>=0?String(c):n.field.emptyOption!==void 0&&(n.modelValue===null||n.modelValue===void 0||n.modelValue==="")?Jl:Zl}),s=k(()=>o.value===Jl||o.value===Zl);function i(c){const d=c.target.value;if(d===Jl){a("update:modelValue",null);return}const f=r.value[Number(d)];f&&a("update:modelValue",f.value)}return(c,d)=>(v(),S("div",AA,[P("select",{id:e.controlId,name:e.field.name,value:o.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:_e([[u(qa)(e.invalid),s.value?"text-muted":""],"h-input appearance-none pr-10"]),onChange:i},[e.field.emptyOption!==void 0?(v(),S("option",{key:0,value:Jl,class:"text-muted"},I(e.field.emptyOption),1)):le("",!0),o.value===Zl?(v(),S("option",{key:1,value:Zl,disabled:""},I(u(D)("backend::lang.form.select_placeholder")),1)):le("",!0),(v(!0),S(xe,null,Ve(r.value,(f,p)=>(v(),S("option",{key:p,value:String(p),class:"text-text"},I(f.label),9,OA))),128))],42,DA),W(u(ts),{size:16,class:"pointer-events-none absolute top-1/2 right-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"})]))}}),gc=Symbol("summer.form.values"),bc=Symbol("summer.form.patch"),Am=Symbol("summer.form.locale"),Dm=Symbol("summer.form.assets"),Cs=Symbol("summer.form.session"),Ff="summer-action",MA=5e3,TA={class:"flex items-start gap-3"},RA={class:"flex min-w-0 flex-1 flex-col gap-1"},qA={key:0,class:"flex items-center gap-4"},IA=["src"],FA={key:1,class:"flex size-16 shrink-0 items-center justify-center rounded-inner bg-subtle","aria-hidden":"true"},BA=["title"],NA={class:"flex flex-col gap-1.5"},VA=["for"],LA=["id","disabled","aria-invalid","aria-describedby"],jA=["id"],UA={class:"flex flex-col gap-1.5"},zA=["for"],HA=["id","disabled","aria-invalid","aria-describedby"],WA=["id"],KA={class:"flex gap-2.5"},GA=["disabled"],YA=["disabled"],JA=Z({__name:"FileCaptionModal",props:{open:{type:Boolean},file:{},routes:{},preview:{},idPrefix:{}},emits:["update:open","saved","closed"],setup(e,{emit:t}){const n=e,a=t,r=M(""),l=M(""),o=M({}),s=M(!1),i=Sr();function c(g){const y={};for(const[w,C]of Object.entries(g??{})){const A=(Array.isArray(C)?C:[C]).filter(L=>typeof L=="string"&&L!=="");A.length>0&&(y[w]=A)}return y}const d=k(()=>`${n.idPrefix}-caption-title`),f=k(()=>`${n.idPrefix}-caption-description`),p=k(()=>!!n.file&&(r.value!==n.file.title||l.value!==n.file.description));Ie(()=>n.open,g=>{g&&n.file&&(r.value=n.file.title??"",l.value=n.file.description??"",o.value={},s.value=!1)},{immediate:!0});async function h(g){if(g){a("update:open",!0);return}s.value||p.value&&!await i.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function m(){if(!(s.value||!n.file||!n.routes)){s.value=!0;try{const g=await n.routes.update(n.file.id,{title:r.value,description:l.value});if(g.data){o.value={},a("saved",g.data),a("update:open",!1),Be(D("backend::lang.fileupload.details_saved"));return}if(g.status===422){o.value=c(g.error?.details),Object.keys(o.value).length===0&&(o.value={title:[$m(g.error)||D("backend::lang.form.error_generic")]});return}Be(g.error?.message||D("backend::lang.form.error_generic"),"danger")}finally{s.value=!1}}}function x(g){g.preventDefault(),a("closed")}return(g,y)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":h},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-caption-modal":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 overflow-y-auto rounded-modal bg-surface p-6 text-text shadow-pop",onCloseAutoFocus:x},{default:F(()=>[P("div",TA,[P("div",RA,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.attachment")),1)]),_:1}),W(u(fl),{class:"text-muted"},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.help")),1)]),_:1})]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:s.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),e.file?(v(),S("div",qA,[e.preview?(v(),S("img",{key:0,src:e.preview,alt:"",class:"size-16 shrink-0 rounded-inner object-cover"},null,8,IA)):(v(),S("span",FA,[W(u(Lr),{size:16,class:"text-muted"})])),P("span",{class:"min-w-0 truncate text-[13px] text-muted",title:e.file.file_name},I(e.file.file_name),9,BA)])):le("",!0),P("form",{class:"flex flex-col gap-4",novalidate:"",onSubmit:ht(m,["prevent"])},[P("div",NA,[P("label",{for:d.value,class:"font-semibold"},I(u(D)("backend::lang.fileupload.title_label")),9,VA),Oa(P("input",{id:d.value,"onUpdate:modelValue":y[0]||(y[0]=w=>r.value=w),type:"text","data-caption-title":"",disabled:s.value,"aria-invalid":o.value.title?"true":void 0,"aria-describedby":o.value.title?`${d.value}-error`:void 0,class:_e([u(qa)(!!o.value.title),"h-input"])},null,10,LA),[[yo,r.value]]),o.value.title?(v(),S("p",{key:0,id:`${d.value}-error`,class:"flex items-center gap-1.5 text-[13px] text-danger"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(o.value.title.join(" ")),1)],8,jA)):le("",!0)]),P("div",UA,[P("label",{for:f.value,class:"font-semibold"},I(u(D)("backend::lang.fileupload.description_label")),9,zA),Oa(P("textarea",{id:f.value,"onUpdate:modelValue":y[1]||(y[1]=w=>l.value=w),rows:"3","data-caption-description":"",disabled:s.value,"aria-invalid":o.value.description?"true":void 0,"aria-describedby":o.value.description?`${f.value}-error`:void 0,class:_e([u(qa)(!!o.value.description),"min-h-input resize-y py-2.5"])},null,10,HA),[[yo,l.value]]),o.value.description?(v(),S("p",{key:0,id:`${f.value}-error`,class:"flex items-center gap-1.5 text-[13px] text-danger"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(o.value.description.join(" ")),1)],8,WA)):le("",!0)]),P("div",KA,[P("button",{type:"button","data-action":"cancel",disabled:s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:y[2]||(y[2]=w=>h(!1))},I(u(D)("backend::lang.form.cancel")),9,GA),P("button",{type:"submit","data-action":"save-caption",disabled:s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60"},I(s.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.fileupload.details_submit")),9,YA)])],32)]),_:1})]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(i).request.value!==null,message:u(i).request.value?.message??"","confirm-label":u(i).request.value?.confirmLabel,danger:u(i).request.value?.danger,onConfirm:u(i).confirm,onCancel:u(i).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),ZA=["id","data-field-name","aria-labelledby","aria-describedby","aria-busy"],QA={key:0,"data-fileupload-loading":"",class:"h-[112px] rounded-control bg-skel","aria-hidden":"true"},XA={key:1,role:"alert","data-fileupload-failed":"",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},eD={key:0,"data-fileupload-empty":"",class:"flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5 text-muted"},tD={key:1,"data-fileupload-grid":"",class:"grid grid-cols-[repeat(auto-fill,minmax(160px,1fr))] gap-4"},nD=["data-file-item","data-state","onDragover","onDrop"],aD={class:"relative flex aspect-square items-center justify-center bg-subtle"},rD=["href","aria-label"],lD=["src","alt","onError"],oD=["aria-label","onClick"],sD=["src","alt"],iD={key:2,"data-preview-unavailable":"",class:"flex flex-col items-center gap-2 text-[13px] text-muted"},uD=["data-handle","aria-label","onKeydown","onDragstart"],cD={key:5,class:"absolute top-2 right-2 flex gap-1"},dD=["data-caption","aria-label","onClick"],fD=["aria-label","onClick"],pD=["aria-label","onClick"],hD={class:"flex flex-col gap-1 p-2"},vD=["title"],mD={class:"flex items-center gap-2 text-[13px] text-muted tabular-nums"},yD={key:0},gD={key:1},bD={key:2},_D={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},xD={key:1,"data-file-error":"",class:"text-[13px] text-danger"},wD={class:"sr-only"},kD={key:2,"data-fileupload-single":"",class:"flex flex-col gap-2"},$D=["data-file-item","data-state"],CD=["src","alt","onError"],SD={key:3,"data-preview-unavailable":"",class:"flex flex-col items-center gap-2 text-[13px] text-muted"},ED={class:"flex min-w-0 flex-1 flex-col gap-1"},AD=["title"],DD={class:"flex items-center gap-2 text-[13px] text-muted tabular-nums"},OD={key:0},PD={key:1},MD={key:2},TD={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},RD={key:1,"data-file-error":"",class:"text-[13px] text-danger"},qD={class:"sr-only"},ID={key:2,class:"mt-1 flex flex-wrap gap-2"},FD={key:3,"data-fileupload-rows":"",class:"flex flex-col gap-2"},BD=["data-file-item","data-state","onDragover","onDrop"],ND={class:"flex items-center gap-3"},VD=["data-handle","aria-label","onKeydown","onDragstart"],LD={class:"flex size-8 shrink-0 items-center justify-center overflow-hidden rounded-pager bg-subtle"},jD=["src","onError"],UD={class:"flex min-w-0 flex-1 flex-col leading-tight"},zD=["title"],HD=["title"],WD=["title"],KD={class:"flex shrink-0 items-center gap-2 text-[13px] text-muted tabular-nums"},GD={key:0},YD={key:1},JD={key:2},ZD={key:3,"data-unsaved-chip":"",class:"inline-flex h-6 items-center rounded-pill bg-sel px-2 text-[13px] font-semibold text-text"},QD={class:"flex shrink-0 items-center gap-1"},XD=["href","aria-label"],eO=["aria-label","onClick"],tO=["data-caption","aria-label","onClick"],nO=["aria-label","onClick"],aO=["aria-label","onClick"],rO={key:1,"data-file-error":"",class:"text-[13px] text-danger"},lO={class:"sr-only"},oO=["aria-describedby"],sO={class:"flex size-10 items-center justify-center rounded-full bg-surface","aria-hidden":"true"},iO={class:"text-text"},uO={key:0,"data-fileupload-limits":"",class:"text-[13px] text-muted tabular-nums"},cO={key:5,"data-fileupload-limits":"",class:"text-[13px] text-muted tabular-nums"},dO={key:6,role:"alert","data-fileupload-too-many":"",class:"flex items-center gap-1.5 text-[13px] text-danger"},fO=["accept","multiple"],pO={class:"sr-only","aria-live":"polite","data-fileupload-live":""},hO=1<<20,vO=400,ki="inline-flex size-8 items-center justify-center rounded-pager border border-border bg-surface text-muted hover:text-text",mO="inline-flex size-8 items-center justify-center rounded-pager border border-border bg-surface text-muted hover:bg-danger-soft hover:text-danger",za="inline-flex size-8 shrink-0 items-center justify-center rounded-pager text-muted hover:bg-hover hover:text-text",yO=Z({__name:"FileuploadField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(Cs,null),a=["jpg","jpeg","png","gif","webp"],r=["image/jpeg","image/png","image/gif","image/webp"];let l=1;const o=M([]),s=M("loading"),i=M(!1),c=M(0),d=M(""),f=M(null),p=M(null),h=M(null),m=M(null),x=M(null),g=M(!1),y=M({}),w=M(new Set),C=new Set,A=[],L=n?n.routes(t.field.name):null;let Y=null,z=null,j=!1;const b=k(()=>{const N=t.field.attributes?.readonly;return!!t.field.readOnly||N!=null&&N!==!1}),E=k(()=>t.field.multiple===!0),V=k(()=>t.field.mode==="image"),T=k(()=>E.value?t.field.maxFiles:1),K=k(()=>(n?.recordId??0)!==0),re=k(()=>o.value.filter(N=>N.state!=="failed")),U=k(()=>{if(E.value)return o.value;const N=re.value,ve=N[N.length-1];return o.value.filter(R=>R.state==="failed"||R===ve)}),ae=k(()=>U.value.filter(N=>N.state!=="failed").length),Q=k(()=>b.value||s.value!=="ready"?!1:E.value?T.value===void 0||T.value===null||re.value.lengthE.value&&!b.value&&typeof T.value=="number"&&re.value.length>=T.value),ne=k(()=>t.field.fileTypes?.length?t.field.fileTypes.map(N=>N.toLowerCase()):V.value&&!t.field.mimeTypes?.length?a:null),ie=k(()=>(t.field.fileTypes?.length?t.field.fileTypes:t.field.mimeTypes??[]).join(", ")),de=k(()=>{const N=[];for(const ve of t.field.fileTypes??[])N.push(`.${ve.toLowerCase()}`);for(const ve of t.field.mimeTypes??[])N.push(ve.includes("/")?ve:`.${ve.toLowerCase()}`);return N.length===0&&V.value&&N.push(...r),N.length>0?N.join(","):void 0}),$e=k(()=>t.field.prompt||D(E.value?"backend::lang.fileupload.default_prompt_many":"backend::lang.fileupload.default_prompt"));function Ce(N,ve){return new Intl.NumberFormat(il.value,{minimumFractionDigits:ve,maximumFractionDigits:ve}).format(N)}function ue(N){const ve=["B","kB","MB","GB"];let R=N,be=0;for(;R>=1e3&&be{const N=t.field.maxFilesize;return typeof N=="number"?`${new Intl.NumberFormat(il.value).format(N)} MB`:""}),ce=k(()=>{const N=[];return ie.value!==""&&N.push(D("backend::lang.fileupload.limits_types",{types:ie.value})),Te.value!==""&&N.push(D("backend::lang.fileupload.limits_size",{size:Te.value})),E.value&&typeof T.value=="number"&&N.push(D("backend::lang.fileupload.limits_count",{current:re.value.length,max:T.value})),N.join(" · ")});function B(N){const ve=N.lastIndexOf(".");return ve<0?"":N.slice(ve+1).toLowerCase()}function G(N){const ve=t.field.mimeTypes??[];if(ve.length===0||N.type==="")return!0;const R=N.type.toLowerCase(),be=B(N.name);return ve.some(Je=>{const Et=Je.toLowerCase();return Et.includes("/")?Et.endsWith("/*")?R.startsWith(Et.slice(0,-1)):R===Et:Et===be})}function q(N){const ve=ne.value;if(ve&&!ve.includes(B(N.name)))return D("backend::lang.fileupload.wrong_type",{name:N.name,types:ve.join(", ")});if(!G(N))return D("backend::lang.fileupload.wrong_type",{name:N.name,types:ie.value});const R=t.field.maxFilesize;return typeof R=="number"&&N.size>Math.ceil(R*hO)?D("backend::lang.fileupload.too_large",{name:N.name,size:Te.value}):""}function te(N){return Qt({uid:l++,name:N.file_name,size:N.file_size,state:"done",progress:100,error:"",retryable:!1,file:N,source:null,handle:null})}function ye(N,ve){return Qt({uid:l++,name:N.name,size:N.size,state:ve===""?"queued":"failed",progress:0,error:ve,retryable:!1,file:null,source:oo(N),handle:null})}function _(N){return o.value.find(ve=>ve.uid===N)}async function $(N){if(!L){s.value="failed";return}N&&(s.value="loading");const ve=await L.list();if(j)return;if(!ve.data){N&&(s.value="failed");return}const R=o.value.filter(be=>be.state!=="done");for(const be of o.value)be.state==="done"&&kt(be.uid);o.value=[...ve.data.map(te),...R],s.value="ready"}function O(){b.value||f.value?.click()}function X(N){if(N.length===0||b.value)return;if(c.value=0,!E.value)for(const Je of[...o.value])Je.state!=="failed"&&(Je.state!=="done"||Je.file?.pending)&&ge(Je);let ve=E.value?typeof T.value=="number"?Math.max(T.value-re.value.length,0):Number.POSITIVE_INFINITY:1,R=0;const be=[];for(const Je of N.slice(0,E.value?N.length:1)){const Et=q(Je);if(Et===""&&ve<=0){R++;continue}Et===""&&ve--,be.push(ye(Je,Et))}o.value=[...o.value,...be],c.value=R,pe()}function J(N){const ve=N.target;X(Array.from(ve.files??[])),ve.value=""}function ee(N){return h.value===null&&Array.from(N.dataTransfer?.types??[]).includes("Files")}function me(N){ee(N)&&(N.preventDefault(),i.value=!0)}function he(N){ee(N)&&(N.preventDefault(),i.value=!1,X(Array.from(N.dataTransfer?.files??[])))}function pe(){if(!L||o.value.some(ve=>ve.state==="uploading"))return;const N=o.value.find(ve=>ve.state==="queued");N&&oe(N)}async function oe(N){if(!L||!N.source)return;N.state="uploading",N.progress=0,N.error="",N.retryable=!1;const ve=L.upload(N.source,(Je,Et)=>{N.progress=Et>0?Math.min(100,Math.round(Je/Et*100)):0});N.handle=oo(ve);const R=await ve.promise;N.handle=null;const be=!!_(N.uid);if(R.ok)!be||j?L.remove(R.item.id):(N.state="done",N.progress=100,N.file=R.item,N.name=R.item.file_name,N.size=R.item.file_size,n?.markDirty());else if(be&&R.reason!=="aborted")switch(N.state="failed",R.reason){case"too_large":N.error=Te.value?D("backend::lang.fileupload.too_large",{name:N.name,size:Te.value}):R.message||D("backend::lang.fileupload.upload_failed");break;case"invalid":N.error=R.message||D("backend::lang.fileupload.upload_failed");break;case"network":N.error=D("backend::lang.fileupload.upload_failed"),N.retryable=!0;break;default:N.error=R.message||D("backend::lang.fileupload.upload_failed"),N.retryable=R.status>=500}j||pe()}function Ae(N){N.state!=="failed"||!N.source||(N.state="queued",N.error="",N.retryable=!1,pe())}async function ge(N){const ve=o.value.findIndex(be=>be.uid===N.uid);if(ve<0)return;switch(o.value=o.value.filter(be=>be.uid!==N.uid),kt(N.uid),N.state){case"uploading":N.handle?.abort(),n?.markDirty(),pe();return;case"queued":case"failed":return}if(!L||!N.file)return;n?.markDirty();const R=await L.remove(N.file.id);if(!R.data&&!j){const be=[...o.value];be.splice(Math.min(ve,be.length),0,N),o.value=be,Be(R.error?.message||D("backend::lang.form.error_generic"),"danger")}}function Se(){return o.value.map(N=>N.uid)}function Pe(N){const ve=new Map(o.value.map(Je=>[Je.uid,Je])),R=N.map(Je=>ve.get(Je)).filter(Je=>!!Je),be=o.value.filter(Je=>!N.includes(Je.uid));o.value=[...R,...be]}function Le(){Y!==null&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,Ye()},vO)}async function Ye(){const N=z;if(z=null,!L)return;const ve=o.value.filter(be=>be.state==="done"&&be.file).map(be=>be.file.id);!(await L.reorder(ve)).data&&!j&&(N&&Pe(N),Be(D("backend::lang.fileupload.reorder_failed"),"danger"))}function je(N,ve){const R=o.value.findIndex(Et=>Et.uid===N);if(R<0||ve<0||ve>=o.value.length||ve===R)return!1;z===null&&(z=Se());const be=[...o.value],[Je]=be.splice(R,1);return be.splice(ve,0,Je),o.value=be,d.value=D("backend::lang.fileupload.moved",{name:Je.name,position:ve+1,total:be.length}),Le(),!0}async function nt(N,ve){const R=o.value.findIndex(Je=>Je.uid===ve.uid);let be;switch(N.key){case"ArrowUp":case"ArrowLeft":be=R-1;break;case"ArrowDown":case"ArrowRight":be=R+1;break;default:return}N.preventDefault(),je(ve.uid,be)&&(await Ue(),p.value?.querySelector(`[data-handle="${ve.uid}"]`)?.focus())}function st(N,ve){h.value=ve.uid,N.dataTransfer&&(N.dataTransfer.effectAllowed="move",N.dataTransfer.setData("text/plain",ve.name))}function vt(N,ve){h.value!==null&&(N.preventDefault(),m.value=ve.uid)}function wt(N,ve){h.value!==null&&(N.preventDefault(),je(h.value,o.value.findIndex(R=>R.uid===ve.uid)),Gt())}function Gt(){h.value=null,m.value=null}function Ee(N){const ve=N.file?.content_type??N.source?.type??"";return r.includes(ve.toLowerCase())}function ke(N){return!N.file||!Ee(N)||w.value.has(N.uid)?null:t.field.protected?y.value[N.uid]??null:N.file.thumb_url||N.file.url||null}function Me(){return typeof URL.revokeObjectURL=="function"}function kt(N){const ve=y.value[N];if(ve!==void 0){Me()&&URL.revokeObjectURL(ve);const R={...y.value};delete R[N],y.value=R}C.delete(N)}async function Rl(N){if(!L||!N.file||C.has(N.uid)||typeof URL.createObjectURL!="function")return;C.add(N.uid);const ve=await L.thumb(N.file.id);if(!(j||!_(N.uid)||!C.has(N.uid))){if(!ve){w.value=new Set([...w.value,N.uid]);return}y.value={...y.value,[N.uid]:URL.createObjectURL(ve)}}}Ie(()=>o.value.map(N=>`${N.uid}:${N.state}`).join(","),()=>{if(t.field.protected)for(const N of o.value)N.state==="done"&&Ee(N)&&Rl(N)});function Ss(N){w.value=new Set([...w.value,N.uid])}async function kc(N,ve){if(!L||!N.file||typeof URL.createObjectURL!="function")return;const R=await L.download(N.file.id);if(!R){Be(D("backend::lang.form.error_generic"),"danger");return}const be=URL.createObjectURL(R);A.push(be);const Je=document.createElement("a");Je.href=be,Je.rel="noopener",ve?Je.download=N.file.file_name:Je.target="_blank",Je.click()}function ya(N){return t.field.useCaption&&N.file?.title?N.file.title:N.name}function Es(N){return K.value&&!!N.file?.pending}const ql=k(()=>x.value===null?void 0:_(x.value));function As(N){x.value=N.uid,g.value=!0}function Rm(N){const ve=ql.value;ve&&(ve.file=N)}function qm(){const N=x.value;x.value=null,N!==null&&p.value?.querySelector(`[data-caption="${N}"]`)?.focus()}const Ds=k(()=>{const N=t.field.thumbOptions?.mode;return N==="fit"||N==="auto"?"object-contain":"object-cover"});return _t(()=>{$(!0)}),n&&Ie(n.revision,()=>{$(!1)}),Nt(()=>{j=!0,Y!==null&&(clearTimeout(Y),Y=null);for(const N of o.value)N.handle?.abort();if(Me()){for(const N of Object.values(y.value))URL.revokeObjectURL(N);for(const N of A)URL.revokeObjectURL(N)}}),(N,ve)=>(v(),S("div",{id:e.controlId,ref_key:"root",ref:p,role:"group","data-fileupload":"","data-field-name":e.field.name,"aria-labelledby":e.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0,"aria-busy":s.value==="loading"?"true":void 0,class:"flex min-w-0 flex-col gap-4"},[s.value==="loading"?(v(),S("span",QA)):s.value==="failed"?(v(),S("p",XA,I(u(D)("backend::lang.fileupload.load_failed")),1)):(v(),S(xe,{key:2},[b.value&&U.value.length===0?(v(),S("p",eD,I(u(D)("backend::lang.fileupload.empty")),1)):V.value&&E.value&&U.value.length>0?(v(),S("ul",tD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("li",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:_e([[R.state==="failed"?"border-danger":"border-border",h.value===R.uid?"opacity-50":"",m.value===R.uid&&h.value!==R.uid?"border-2 border-dashed border-primary bg-sel":""],"relative overflow-hidden rounded-inner border bg-surface"]),onDragover:be=>vt(be,R),onDrop:be=>wt(be,R)},[P("div",aD,[R.state==="uploading"?(v(),H(u(to),{key:0,size:20,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):R.state==="done"?(v(),S(xe,{key:2},[ke(R)&&!e.field.protected&&R.file?.url?(v(),S("a",{key:0,href:R.file.url,target:"_blank",rel:"noopener",class:"block size-full","aria-label":u(D)("backend::lang.fileupload.open_preview",{name:R.name})},[P("img",{src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"]),onError:be=>Ss(R)},null,42,lD)],8,rD)):ke(R)?(v(),S("button",{key:1,type:"button",class:"block size-full","aria-label":u(D)("backend::lang.fileupload.open_preview",{name:R.name}),onClick:be=>kc(R,!1)},[P("img",{src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"])},null,10,sD)],8,oD)):w.value.has(R.uid)?(v(),S("span",iD,[W(u(Dd),{size:20,"aria-hidden":"true"}),we(" "+I(u(D)("backend::lang.fileupload.preview_unavailable")),1)])):(v(),H(u(Lr),{key:3,size:20,class:"text-muted","aria-hidden":"true"}))],64)):(v(),H(u(Lr),{key:3,size:20,class:"text-muted","aria-hidden":"true"})),!b.value&&R.state==="done"?(v(),S("button",{key:4,type:"button",draggable:"true","data-handle":R.uid,"aria-label":u(D)("backend::lang.fileupload.move",{name:R.name}),class:_e([ki,"absolute top-2 left-2 cursor-grab"]),onKeydown:be=>nt(be,R),onDragstart:be=>st(be,R),onDragend:Gt},[W(u(Ad),{size:16,"aria-hidden":"true"})],40,uD)):le("",!0),b.value?le("",!0):(v(),S("div",cD,[e.field.useCaption&&R.state==="done"?(v(),S("button",{key:0,type:"button","data-caption":R.uid,"aria-label":u(D)("backend::lang.fileupload.edit_details",{name:R.name}),class:_e(ki),onClick:be=>As(R)},[W(u(zs),{size:16,"aria-hidden":"true"})],8,dD)):le("",!0),R.state==="failed"&&R.retryable?(v(),S("button",{key:1,type:"button","data-action":"retry","aria-label":u(D)("backend::lang.fileupload.retry"),class:_e(ki),onClick:be=>Ae(R)},[W(u(Hs),{size:16,"aria-hidden":"true"})],8,fD)):le("",!0),P("button",{type:"button","data-action":"remove-file","aria-label":R.state==="uploading"||R.state==="queued"?u(D)("backend::lang.fileupload.cancel_upload",{name:R.name}):u(D)("backend::lang.form.remove_item",{name:R.name}),class:_e(mO),onClick:be=>ge(R)},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,pD)]))]),P("div",hD,[P("span",{class:"truncate text-[13px]",title:ya(R)},I(ya(R)),9,vD),P("span",mD,[R.state==="queued"?(v(),S("span",yD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",gD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",bD,I(ue(R.size)),1)),Es(R)?(v(),S("span",_D,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",xD,[P("span",wD,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0)])],42,nD))),128))])):V.value&&!E.value&&U.value.length>0?(v(),S("div",kD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("div",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:"flex items-start gap-4"},[P("div",{class:_e([R.state==="failed"?"border-danger":"border-border","flex size-40 shrink-0 items-center justify-center overflow-hidden rounded-inner border bg-subtle"])},[R.state==="uploading"?(v(),H(u(to),{key:0,size:20,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):ke(R)?(v(),S("img",{key:2,src:ke(R)??void 0,alt:ya(R),class:_e([Ds.value,"size-full"]),onError:be=>Ss(R)},null,42,CD)):w.value.has(R.uid)?(v(),S("span",SD,[W(u(Dd),{size:20,"aria-hidden":"true"}),we(" "+I(u(D)("backend::lang.fileupload.preview_unavailable")),1)])):(v(),H(u(Lr),{key:4,size:20,class:"text-muted","aria-hidden":"true"}))],2),P("div",ED,[P("span",{class:"truncate font-semibold",title:ya(R)},I(ya(R)),9,AD),P("span",DD,[R.state==="queued"?(v(),S("span",OD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",PD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",MD,I(ue(R.size)),1)),Es(R)?(v(),S("span",TD,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",RD,[P("span",qD,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0),b.value?le("",!0):(v(),S("div",ID,[R.state!=="failed"?(v(),H(lt,{key:0,size:"sm",variant:"outline","data-action":"replace-file",icon:u(Ws),onClick:O},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.replace_file")),1)]),_:1},8,["icon"])):le("",!0),R.state==="failed"&&R.retryable?(v(),H(lt,{key:1,size:"sm",variant:"outline","data-action":"retry",icon:u(Hs),onClick:be=>Ae(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.retry")),1)]),_:1},8,["icon","onClick"])):le("",!0),e.field.useCaption&&R.state==="done"?(v(),H(lt,{key:2,size:"sm",variant:"outline","data-caption":R.uid,icon:u(zs),onClick:be=>As(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.details_submit")),1)]),_:1},8,["data-caption","icon","onClick"])):le("",!0),W(lt,{size:"sm",variant:"danger","data-action":"remove-file",icon:u(Wt),onClick:be=>ge(R)},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.remove_file")),1)]),_:1},8,["icon","onClick"])]))])],8,$D))),128))])):U.value.length>0?(v(),S("ul",FD,[(v(!0),S(xe,null,Ve(U.value,R=>(v(),S("li",{key:R.uid,"data-file-item":R.uid,"data-state":R.state,class:_e([[R.state==="failed"?"border-danger":"border-border",h.value===R.uid?"opacity-50":"",m.value===R.uid&&h.value!==R.uid?"border-2 border-dashed border-primary bg-sel":""],"flex min-h-14 flex-col justify-center gap-1 rounded-inner border bg-surface px-3 py-2"]),onDragover:be=>vt(be,R),onDrop:be=>wt(be,R)},[P("div",ND,[E.value&&!b.value&&R.state==="done"?(v(),S("button",{key:0,type:"button",draggable:"true","data-handle":R.uid,"aria-label":u(D)("backend::lang.fileupload.move",{name:R.name}),class:_e([za,"cursor-grab"]),onKeydown:be=>nt(be,R),onDragstart:be=>st(be,R),onDragend:Gt},[W(u(Ad),{size:16,"aria-hidden":"true"})],40,VD)):le("",!0),P("span",LD,[R.state==="uploading"?(v(),H(u(to),{key:0,size:16,class:"animate-spin text-muted","aria-hidden":"true"})):R.state==="failed"?(v(),H(u(Ut),{key:1,size:16,class:"text-danger","aria-hidden":"true"})):ke(R)?(v(),S("img",{key:2,src:ke(R)??void 0,alt:"",class:"size-8 object-cover",onError:be=>Ss(R)},null,40,jD)):(v(),H(u(Lr),{key:3,size:16,class:"text-muted","aria-hidden":"true"}))]),P("span",UD,[e.field.useCaption&&R.file?.title?(v(),S(xe,{key:0},[P("span",{class:"truncate font-semibold",title:R.file.title},I(R.file.title),9,zD),P("span",{class:"truncate text-[13px] text-muted",title:R.name},I(R.name),9,HD)],64)):(v(),S("span",{key:1,class:"truncate",title:R.name},I(R.name),9,WD))]),P("span",KD,[R.state==="queued"?(v(),S("span",GD,I(u(D)("backend::lang.fileupload.queued")),1)):R.state==="uploading"?(v(),S("span",YD,I(u(D)("backend::lang.fileupload.uploading",{percent:R.progress})),1)):(v(),S("span",JD,I(ue(R.size)),1)),Es(R)?(v(),S("span",ZD,I(u(D)("backend::lang.fileupload.unsaved")),1)):le("",!0)]),!E.value&&!b.value&&R.state!=="failed"?(v(),H(lt,{key:1,size:"sm",variant:"outline","data-action":"replace-file",icon:u(Ws),onClick:O},{default:F(()=>[we(I(u(D)("backend::lang.fileupload.replace_file")),1)]),_:1},8,["icon"])):le("",!0),P("span",QD,[R.state==="done"&&R.file?(v(),S(xe,{key:0},[!e.field.protected&&R.file.url?(v(),S("a",{key:0,href:R.file.url,download:"",target:"_blank",rel:"noopener","aria-label":u(D)("backend::lang.fileupload.download",{name:R.name}),class:_e(za)},[W(u(Ed),{size:16,"aria-hidden":"true"})],8,XD)):e.field.protected?(v(),S("button",{key:1,type:"button","data-action":"download","aria-label":u(D)("backend::lang.fileupload.download",{name:R.name}),class:_e(za),onClick:be=>kc(R,!0)},[W(u(Ed),{size:16,"aria-hidden":"true"})],8,eO)):le("",!0),e.field.useCaption&&!b.value?(v(),S("button",{key:2,type:"button","data-caption":R.uid,"aria-label":u(D)("backend::lang.fileupload.edit_details",{name:R.name}),class:_e(za),onClick:be=>As(R)},[W(u(zs),{size:16,"aria-hidden":"true"})],8,tO)):le("",!0)],64)):le("",!0),R.state==="failed"&&R.retryable?(v(),S("button",{key:1,type:"button","data-action":"retry","aria-label":u(D)("backend::lang.fileupload.retry"),class:_e(za),onClick:be=>Ae(R)},[W(u(Hs),{size:16,"aria-hidden":"true"})],8,nO)):le("",!0),b.value?le("",!0):(v(),S("button",{key:2,type:"button","data-action":"remove-file","aria-label":R.state==="uploading"||R.state==="queued"?u(D)("backend::lang.fileupload.cancel_upload",{name:R.name}):u(D)("backend::lang.form.remove_item",{name:R.name}),class:_e([za,"hover:bg-danger-soft hover:text-danger"]),onClick:be=>ge(R)},[W(u(Wt),{size:16,"aria-hidden":"true"})],8,aO))])]),R.state==="uploading"?(v(),H(u(mi),{key:0,"model-value":R.progress,max:100,"aria-label":u(D)("backend::lang.fileupload.uploading",{percent:R.progress}),class:"h-1 w-full overflow-hidden rounded-pill bg-subtle"},{default:F(()=>[W(u(yi),{class:"h-full bg-primary",style:Mn({width:`${R.progress}%`})},null,8,["style"])]),_:2},1032,["model-value","aria-label"])):le("",!0),R.state==="failed"?(v(),S("p",rO,[P("span",lO,I(u(D)("backend::lang.fileupload.upload_error"))+": ",1),we(I(R.error),1)])):le("",!0)],42,BD))),128))])):le("",!0),Q.value?(v(),S("button",{key:4,type:"button","data-fileupload-dropzone":"","aria-describedby":e.describedBy||void 0,class:_e([[i.value?"border-solid border-primary bg-sel":e.invalid?"border-dashed border-danger bg-subtle":"border-dashed border-border-strong bg-subtle"],"flex min-h-[112px] w-full flex-col items-center justify-center gap-2 rounded-control border-[1.5px] px-4 py-6 text-center transition-colors duration-150 ease-out hover:bg-hover"]),onClick:O,onDragover:me,onDragleave:ve[0]||(ve[0]=R=>i.value=!1),onDrop:he},[P("span",sO,[W(u(Ws),{size:20,class:"text-muted"})]),P("span",iO,I($e.value),1),ce.value!==""?(v(),S("span",uO,I(ce.value),1)):le("",!0)],42,oO)):se.value&&ce.value!==""?(v(),S("p",cO,I(ce.value),1)):le("",!0),c.value>0?(v(),S("p",dO,[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(u(os)("backend::lang.fileupload.too_many",c.value,{max:T.value??0})),1)])):le("",!0)],64)),P("input",{ref_key:"input",ref:f,type:"file",hidden:"",tabindex:"-1","data-fileupload-input":"",accept:de.value,multiple:E.value||void 0,onChange:J},null,40,fO),P("p",pO,I(d.value),1),e.field.useCaption?(v(),H(JA,{key:3,open:g.value,"onUpdate:open":ve[1]||(ve[1]=R=>g.value=R),file:ql.value?.file??null,routes:u(L),preview:ql.value?ke(ql.value):null,"id-prefix":e.controlId,onSaved:Rm,onClosed:qm},null,8,["open","file","routes","preview","id-prefix"])):le("",!0)],8,ZA))}}),gO=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],bO=Z({__name:"NumberField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),l=k(()=>yc(n.field));function o(s){const i=s.target.value.trim();if(i===""){a("update:modelValue",null);return}const c=Number(i);a("update:modelValue",Number.isFinite(c)?c:null)}return(s,i)=>(v(),S("input",Ne({id:e.controlId},l.value,{name:e.field.name,type:"number",inputmode:"decimal",value:r.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"h-input tabular-nums"],onInput:o}),null,16,gO))}}),_O=["id","aria-labelledby","aria-describedby"],xO=Z({__name:"PartialField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e;return(n,a)=>(v(),S("div",{id:e.controlId,role:"group","data-partial-field":"","aria-labelledby":t.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0},[e.source?(v(),H(xm,{key:0,variant:"field",source:e.source,name:t.field.path||t.field.name,"record-id":e.recordId??null},null,8,["source","name","record-id"])):(v(),H(mc,{key:1,"data-partial-failed":"",text:u(D)("backend::lang.extension.partial_failed")},null,8,["text"]))],8,_O))}}),Jt="default";function la(e){return e.tab?`tab:${e.tab}`:Jt}function Ro(e,t){return`${e}-tab-${t}`}function _c(e,t){return`${e}-panel-${t}`}function xc(e,t){const n=e.context;if(n==null)return!0;const a=Array.isArray(n)?n:[n];return a.length===0||a.includes(t)}function zt(e,t){const n={};for(const a of e){if(a.readOnly||!gM(a.type))continue;const r=t[a.name];r!==void 0&&(n[a.name]=r)}return n}function wc(e){const t={};for(const n of e)n.default!==void 0?t[n.name]=n.default:n.type==="switch"||n.type==="checkbox"?t[n.name]=!1:n.type==="relation"&&n.multiple&&(t[n.name]=[]);return t}function Pl(e){const t={};for(const[n,a]of Object.entries(e??{})){const r=Array.isArray(a)?a.filter(l=>typeof l=="string"&&l!==""):typeof a=="string"&&a!==""?[a]:[];r.length>0&&(t[n]=r)}return t}function oa(e){return JSON.stringify(Object.keys(e).sort().map(t=>[t,e[t]]))}function Ml(e,t){const n=document.getElementById(`${e}-${t}`);return n?(n.matches("input, select, textarea, button, [tabindex]")||n.setAttribute("tabindex","-1"),n.focus(),!0):!1}const wO={role:"tablist",class:"inline-flex gap-1 rounded-inner border border-border bg-subtle p-1"},kO=["id","data-tab","aria-selected","aria-controls","tabindex","onClick","onKeydown"],$O=["aria-label"],Om=Z({__name:"FormTabs",props:{tabs:{},modelValue:{},idPrefix:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t;function r(l,o){const s=l.key==="ArrowRight"?1:l.key==="ArrowLeft"?-1:0;if(s===0)return;l.preventDefault();const i=(o+s+n.tabs.length)%n.tabs.length,c=n.tabs[i];c&&(a("update:modelValue",c.key),document.getElementById(Ro(n.idPrefix,i))?.focus())}return(l,o)=>(v(),S("div",wO,[(v(!0),S(xe,null,Ve(e.tabs,(s,i)=>(v(),S("button",{id:u(Ro)(e.idPrefix,i),key:s.key,type:"button",role:"tab","data-tab":s.key,"aria-selected":s.key===e.modelValue?"true":"false","aria-controls":u(_c)(e.idPrefix,i),tabindex:s.key===e.modelValue?0:-1,class:_e([s.key===e.modelValue?"bg-surface text-text shadow-tab":"text-muted hover:text-text","inline-flex h-[34px] items-center gap-2 rounded-tab px-4 font-semibold transition-colors duration-150 ease-out"]),onClick:c=>a("update:modelValue",s.key),onKeydown:c=>r(c,i)},[we(I(s.label)+" ",1),s.errors>0?(v(),S("span",{key:0,"data-tab-errors":"","aria-label":u(os)("backend::lang.form.tab_errors",s.errors),class:"inline-flex h-5 min-w-5 items-center justify-center rounded-pill bg-danger px-1.5 text-[11px] font-bold text-white"},I(s.errors),9,$O)):le("",!0)],42,kO))),128))]))}}),CO={class:"flex items-start gap-3 p-6 pb-4"},SO={key:0,"data-child-loading":"","aria-hidden":"true",class:"grid grid-cols-1 gap-x-6 gap-y-[22px] min-[600px]:grid-cols-2"},EO={key:1,role:"alert","data-child-load-failed":"",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},AO=["id","role","aria-labelledby"],DO=["disabled"],OO={class:"flex items-center gap-2.5 border-t border-border px-6 py-4"},PO={class:"ml-auto flex gap-2.5"},MO=Z({__name:"RelationChildModal",props:{open:{type:Boolean},source:{},ownerId:{},relation:{},schema:{},mode:{},childId:{},sessionKey:{},canDelete:{type:Boolean}},emits:["update:open","changed","gone","closed"],setup(e,{emit:t}){const n=e,a=t,r=M({}),l=M({}),o=M({}),s=M(!1),i=M(!1),c=M(!1),d=M(""),f=M(Jt),p=M(Mo()),h=M(0),m=M(0),x=M(null),g=Sr();let y=0;const w=k(()=>`child-${n.relation}`),C=k(()=>n.mode==="preview"),A=k(()=>n.mode==="create"?"create":"update"),L=k(()=>{const G=((C.value?n.schema.viewForm:n.schema.manageForm)??[]).filter(q=>xc(q,A.value));return C.value?G.map(q=>({...q,readOnly:!0,attributes:{...q.attributes??{},readonly:!0}})):G}),Y=k(()=>L.value.map(B=>B.name)),z=k(()=>{if(!L.value.some(G=>G.tab))return[];const B=[];for(const G of L.value){const q=la(G);let te=B.find(ye=>ye.key===q);te||(te={key:q,label:G.tab||D("backend::lang.form.tab_default"),errors:0},q===Jt?B.unshift(te):B.push(te)),o.value[G.name]&&(te.errors+=1)}return B}),j=k(()=>Math.max(z.value.findIndex(B=>B.key===f.value),0)),b=k(()=>{if(z.value.length===0)return L.value;const B=z.value[j.value]?.key??Jt;return L.value.filter(G=>la(G)===B)}),E=k(()=>{const B=n.schema.messages;return n.mode==="create"?Fe(B.createTitle):Fe(C.value?B.previewTitle:B.updateTitle)}),V=k(()=>Fe(n.mode==="create"?n.schema.messages.createSubmit:n.schema.messages.updateSubmit)),T=k(()=>!C.value&&!s.value&&!i.value&&(h.value>0||oa(zt(L.value,r.value))!==d.value));function K(){return{[pa]:n.sessionKey,[wm]:p.value}}function re(){return{...n.source,id:n.ownerId,name:n.relation}}Dt(Cs,{get key(){return n.sessionKey},get childKey(){return p.value},get recordId(){return n.childId??0},routes:B=>X3(n.source,n.ownerId,n.relation,n.childId??0,B,n.sessionKey,p.value),markDirty:()=>{h.value++},pendingChanges:Tt(h),revision:Tt(m)}),Dt(gc,k(()=>r.value)),Dt(bc,ae);function ae(B,G){if(r.value={...r.value,[B]:G},o.value[B]){const q={...o.value};delete q[B],o.value=q}}function Q(B,G){r.value={...B},l.value=G?.labels??{},d.value=oa(zt(L.value,r.value))}async function se(){await Ue(),x.value?.querySelector('input:not([type="hidden"]):not([tabindex="-1"]), select, textarea, button, [contenteditable="true"], [tabindex="0"]')?.focus()}function ne(){a("update:open",!1),Be(D("backend::lang.relation.child_gone"),"danger"),a("gone")}async function ie(){const B=++y;if(o.value={},i.value=!1,c.value=!1,h.value=0,p.value=Mo(),f.value=Jt,n.mode==="create"||n.childId===null){s.value=!1,Q(wc(L.value)),f.value=z.value[0]?.key??Jt,await se();return}s.value=!0;try{const G=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}",{params:{path:{...re(),child:n.childId},header:K()}});if(B!==y)return;if(G.data)Q(G.data.data,G.data.meta),f.value=z.value[0]?.key??Jt;else if(G.response.status===404){ne();return}else i.value=!0}catch{B===y&&(i.value=!0)}finally{B===y&&(s.value=!1)}B===y&&await se()}Ie(()=>n.open,B=>{B?ie():y++},{immediate:!0});async function de(B){if(B){a("update:open",!0);return}c.value||T.value&&!await g.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function $e(B){o.value=Pl(B);const G=L.value.filter(te=>o.value[te.name]),q=G.find(te=>la(te)===f.value)??G[0];q&&(z.value.length>0&&(f.value=la(q)),await Ue(),Ml(w.value,q.name))}async function Ce(){if(!(c.value||C.value||s.value||i.value)){c.value=!0;try{const B=zt(L.value,r.value),G=n.mode==="create"||n.childId===null?await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records",{params:{path:re(),header:K()},body:B}):await Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/records/{child}",{params:{path:{...re(),child:n.childId},header:K()},body:B});if(G.data){const te=n.mode==="create"?"created":"updated";o.value={},h.value=0,a("update:open",!1),Be(Fe(te==="created"?n.schema.messages.created:n.schema.messages.updated)),a("changed",te);return}const q=G.response.status;q===422?await $e(G.error?.error.details):q===404?ne():Be(G.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}}async function ue(){if(c.value||n.childId===null)return;const B=n.childId;if(await g.ask({message:Fe(n.schema.messages.deleteOneConfirm),confirmLabel:D("backend::lang.form.delete"),danger:!0})){c.value=!0;try{const q=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/delete",{params:{path:re(),header:{[pa]:n.sessionKey}},body:{ids:[B]}});if(q.data){h.value=0,a("update:open",!1),Be(Fe(n.schema.messages.deleted,q.data.data.deleted||1)),a("changed","deleted");return}if(q.response.status===404){ne();return}Be(q.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}}function Te(B){B.preventDefault()}function ce(B){B.preventDefault(),a("closed")}return(B,G)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":de},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-child-modal":"","data-dialog-content":"","data-mode":e.mode,"aria-modal":"true","aria-describedby":void 0,class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[720px] -translate-x-1/2 -translate-y-1/2 flex-col rounded-modal bg-surface text-text shadow-pop",onOpenAutoFocus:Te,onCloseAutoFocus:ce},{default:F(()=>[P("div",CO,[W(u(Al),{class:"min-w-0 flex-1 text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(E.value),1)]),_:1}),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:c.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),P("div",{ref_key:"body",ref:x,"data-child-body":"",class:"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-6 pb-6"},[s.value?(v(),S("div",SO,[(v(),S(xe,null,Ve(6,q=>P("div",{key:q,class:"flex flex-col gap-1.5"},[...G[3]||(G[3]=[P("span",{class:"block h-3 w-24 rounded-[6px] bg-skel"},null,-1),P("span",{class:"block h-input rounded-control bg-skel"},null,-1)])])),64))])):i.value?(v(),S("p",EO,I(u(D)("backend::lang.relation.child_load_failed")),1)):(v(),S(xe,{key:2},[W(Ol,{errors:o.value,"field-names":Y.value},null,8,["errors","field-names"]),z.value.length>0?(v(),H(Om,{key:0,modelValue:f.value,"onUpdate:modelValue":G[0]||(G[0]=q=>f.value=q),tabs:z.value,"id-prefix":w.value,class:"self-start"},null,8,["modelValue","tabs","id-prefix"])):le("",!0),P("form",{id:z.value.length>0?u(_c)(w.value,j.value):void 0,role:z.value.length>0?"tabpanel":void 0,"aria-labelledby":z.value.length>0?u(Ro)(w.value,j.value):void 0,novalidate:"",onSubmit:ht(Ce,["prevent"])},[P("fieldset",{disabled:c.value||C.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:b.value,values:r.value,errors:o.value,labels:l.value,source:e.source,"record-id":e.childId,"id-prefix":w.value,onUpdate:ae},null,8,["fields","values","errors","labels","source","record-id","id-prefix"])],8,DO)],40,AO)],64))],512),P("div",OO,[e.mode==="update"&&e.canDelete&&!s.value&&!i.value?(v(),H(lt,{key:0,variant:"danger","data-action":"delete-child",icon:u(wl),disabled:c.value,onClick:ue},{default:F(()=>[we(I(u(D)("backend::lang.form.delete")),1)]),_:1},8,["icon","disabled"])):le("",!0),P("div",PO,[C.value?(v(),H(lt,{key:0,variant:"outline","data-action":"cancel",onClick:G[1]||(G[1]=q=>de(!1))},{default:F(()=>[we(I(u(D)("backend::lang.form.close")),1)]),_:1})):(v(),S(xe,{key:1},[W(lt,{variant:"ghost","data-action":"cancel",disabled:c.value,onClick:G[2]||(G[2]=q=>de(!1))},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1},8,["disabled"]),i.value?le("",!0):(v(),H(lt,{key:0,variant:"primary","data-action":"save-child",disabled:c.value||s.value,onClick:Ce},{default:F(()=>[we(I(c.value?u(D)("backend::lang.form.saving"):V.value),1)]),_:1},8,["disabled"]))],64))])])]),_:1},8,["data-mode"])]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(g).request.value!==null,message:u(g).request.value?.message??"","confirm-label":u(g).request.value?.confirmLabel,danger:u(g).request.value?.danger,onConfirm:u(g).confirm,onCancel:u(g).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),TO={class:"flex items-start gap-3"},RO={class:"flex min-w-0 flex-1 flex-col gap-1"},qO=["title"],IO={key:0,class:"truncate text-[13px] text-muted"},FO=["disabled"],BO={class:"relative block"},NO={class:"sr-only"},VO=["value","placeholder"],LO=["aria-multiselectable","aria-label","aria-busy"],jO=["data-candidate","aria-selected","onClick","onKeydown"],UO={class:"flex size-8 shrink-0 items-center justify-center rounded-full bg-subtle text-[12px] font-bold","aria-hidden":"true"},zO={class:"flex min-w-0 flex-1 flex-col leading-tight"},HO={class:"truncate font-semibold"},WO={key:0,class:"truncate text-[13px] text-muted"},KO={key:0,class:"block size-2.5 rounded-full bg-primary"},GO={key:0,role:"presentation",class:"px-1 py-3 text-[13px] text-muted"},YO={key:1,role:"presentation","data-candidates-empty":"",class:"px-1 py-3 text-[13px] text-muted"},JO=["aria-label"],ZO={"data-candidates-range":"",class:"flex-1"},QO=["aria-label","disabled"],XO=["aria-label","disabled"],eP={class:"flex gap-2.5"},tP=["disabled"],nP=["disabled"],aP=["disabled","aria-busy"],rP=5,lP=300,Bf="inline-flex size-[34px] items-center justify-center rounded-tab border border-border text-text hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",oP=Z({__name:"RelationPickerModal",props:{open:{type:Boolean},source:{},recordId:{},relation:{},schema:{},sessionKey:{}},emits:["update:open","linked","closed"],setup(e,{emit:t}){const n=e,a=t,r=M(""),l=M(1),o=M([]),s=M(null),i=M(!1),c=M(!1),d=M(new Set),f=M(null),p=M(1),h=M(null),m=M({}),x=M({}),g=M(null);let y=0,w=null;const C=k(()=>n.schema.manage.list.columns),A=k(()=>C.value[0]?.key??""),L=k(()=>C.value[1]?.key??""),Y=k(()=>d.value.size),z=`relation-${n.relation}-candidates`,j=k(()=>n.schema.pivotForm??[]),b=k(()=>j.value.map(_=>_.name)),E=k(()=>j.value.length>0),V=k(()=>`link-${n.relation}`);function T(){return n.sessionKey?{[pa]:n.sessionKey}:void 0}const K=k(()=>{const _=s.value;if(!_||_.total===0)return"";const $=(_.page-1)*_.per_page+1,O=Math.min(_.page*_.per_page,_.total);return D("backend::lang.relation.candidates_range",{from:$,to:O,total:_.total})}),re=k(()=>Math.max(s.value?.last_page??1,1));function U(_){const $=_.id;return typeof $=="number"&&Number.isInteger($)?$:typeof $=="string"&&/^\d+$/.test($)?Number($):null}function ae(_,$){const O=$===""?void 0:_[$];return typeof O=="string"||typeof O=="number"?String(O):""}function Q(_){return _.split(/[\s@._-]+/).filter(Boolean).slice(0,2).map($=>$.charAt(0).toUpperCase()).join("")}async function se(){const _=++y;i.value=!0;try{const $=r.value.trim(),{data:O}=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates",{params:{path:{...n.source,id:n.recordId,name:n.relation},query:{search:$===""?void 0:$,page:l.value,per_page:rP},header:T()}});if(_!==y)return;o.value=O?.data??[],s.value=O?.meta??null}catch{_===y&&(o.value=[],s.value=null)}finally{_===y&&(i.value=!1)}}function ne(){w!==null&&(clearTimeout(w),w=null),y++,r.value="",l.value=1,o.value=[],s.value=null,i.value=!1,d.value=new Set,p.value=1,h.value=null,m.value={},x.value={}}Ie(()=>n.open,_=>{_?(ne(),se()):ne()},{immediate:!0});function ie(_){r.value=_.target.value,w!==null&&clearTimeout(w),w=setTimeout(()=>{w=null,l.value=1,se()},lP)}function de(_){_<1||_>re.value||_===l.value||(l.value=_,se())}function $e(_){const $=U(_);return $!==null&&d.value.has($)}function Ce(_){const $=U(_);if($===null)return;if(E.value){d.value=new Set([$]),h.value=_;return}const O=new Set(d.value);O.has($)?O.delete($):O.add($),d.value=O}async function ue(){!E.value||d.value.size===0||!h.value||(p.value=2,m.value=wc(j.value),x.value={},await Ue(),g.value?.querySelector('input, select, textarea, button, [contenteditable="true"]')?.focus())}async function Te(){if(c.value)return;p.value=1,x.value={},await Ue(),(document.querySelector(`#${z} [aria-selected="true"]`)??f.value)?.focus()}function ce(_,$){if(m.value={...m.value,[_]:$},x.value[_]){const O={...x.value};delete O[_],x.value=O}}function B(_,$,O){switch(_.key){case" ":_.preventDefault(),Ce($);break;case"Enter":_.preventDefault(),Ce($),E.value&&ue();break;case"ArrowDown":case"ArrowUp":{_.preventDefault();const X=_.currentTarget.parentElement?.querySelectorAll('[role="option"]'),J=_.key==="ArrowDown"?1:-1;X?.[Math.min(Math.max(O+J,0),X.length-1)]?.focus();break}}}function G(_){a("update:open",_)}async function q(){const _=[...d.value];if(c.value||_.length===0)return;const $=E.value;c.value=!0;try{const O=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link",{params:{path:{...n.source,id:n.recordId,name:n.relation},header:T()},body:$?{ids:_.slice(0,1),pivot:zt(j.value,m.value)}:{ids:_}});if(O.data){G(!1),a("linked",O.data.data.linked??_.length);return}const X=O.response.status;if($&&X===422){x.value=Pl(O.error?.error.details);const J=j.value.find(ee=>x.value[ee.name]);J&&(await Ue(),Ml(V.value,J.name));return}if($&&X===404){Be(D("backend::lang.relation.child_gone"),"danger"),d.value=new Set,h.value=null,p.value=1,se();return}if($){Be(D("backend::lang.form.error_generic"),"danger");return}Be(O.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{c.value=!1}}function te(_){_.preventDefault(),f.value?.focus()}function ye(_){_.preventDefault(),a("closed")}return Nt(()=>{w!==null&&clearTimeout(w)}),(_,$)=>(v(),H(u(Cl),{open:e.open,"onUpdate:open":G},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-picker":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 rounded-modal bg-surface p-6 text-text shadow-pop",onOpenAutoFocus:te,onCloseAutoFocus:ye},{default:F(()=>[P("div",TO,[P("div",RO,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(p.value===2?u(Fe)(e.schema.messages.pivotTitle):u(Fe)(e.schema.messages.link)),1)]),_:1}),p.value===1?(v(),H(u(fl),{key:0,class:"text-muted"},{default:F(()=>[we(I(u(Fe)(e.schema.messages.linkHint)),1)]),_:1})):(v(),H(u(fl),{key:1,class:"flex min-w-0 flex-col","data-chosen-record":""},{default:F(()=>[P("span",{class:"truncate font-semibold text-text",title:ae(h.value??{},A.value)},I(ae(h.value??{},A.value)),9,qO),L.value?(v(),S("span",IO,I(ae(h.value??{},L.value)),1)):le("",!0)]),_:1}))]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label"])]),p.value===2?(v(),S("div",{key:0,ref_key:"stepTwo",ref:g,"data-pivot-step":"",class:"flex min-h-0 flex-col gap-4 overflow-y-auto"},[W(Ol,{errors:x.value,"field-names":b.value},null,8,["errors","field-names"]),P("form",{novalidate:"",onSubmit:ht(q,["prevent"])},[P("fieldset",{disabled:c.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:j.value,values:m.value,errors:x.value,source:e.source,"record-id":null,"id-prefix":V.value,onUpdate:ce},null,8,["fields","values","errors","source","id-prefix"])],8,FO)],32)],512)):le("",!0),Oa(P("label",BO,[P("span",NO,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:18,class:"pointer-events-none absolute top-1/2 left-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{ref_key:"searchInput",ref:f,type:"search","data-candidate-search":"",value:r.value,placeholder:u(Fe)(e.schema.messages.candidateSearch),"aria-controls":z,class:"h-input w-full rounded-control border border-border-strong bg-surface pr-3.5 pl-10",onInput:ie},null,40,VO)],512),[[Bi,p.value===1]]),Oa(P("ul",{id:z,role:"listbox","aria-multiselectable":E.value?"false":"true","aria-label":u(Fe)(e.schema.messages.link),"aria-busy":i.value?"true":void 0,class:"flex min-h-0 flex-col gap-2 overflow-y-auto"},[(v(!0),S(xe,null,Ve(o.value,(O,X)=>(v(),S("li",{key:U(O)??`row-${X}`,role:"option",tabindex:"0","data-candidate":U(O)??void 0,"aria-selected":$e(O)?"true":"false",class:_e([$e(O)?"border-[#e0b020] bg-sel":"border-border hover:bg-hover","flex h-[54px] cursor-pointer items-center gap-3 rounded-inner border px-3 transition-colors duration-150 ease-out"]),onClick:J=>Ce(O),onKeydown:J=>B(J,O,X)},[P("span",UO,I(Q(ae(O,A.value))),1),P("span",zO,[P("span",HO,I(ae(O,A.value)),1),L.value?(v(),S("span",WO,I(ae(O,L.value)),1)):le("",!0)]),E.value?(v(),S("span",{key:0,"data-radio":"",class:_e([$e(O)?"border-primary":"border-border-strong bg-surface","flex size-[18px] shrink-0 items-center justify-center rounded-full border"]),"aria-hidden":"true"},[$e(O)?(v(),S("span",KO)):le("",!0)],2)):(v(),S("span",{key:1,class:_e([$e(O)?"border-primary bg-primary text-on-primary":"border-border-strong bg-surface","flex size-[18px] shrink-0 items-center justify-center rounded-checkbox border"]),"aria-hidden":"true"},[$e(O)?(v(),H(u(fr),{key:0,size:14})):le("",!0)],2))],42,jO))),128)),i.value&&o.value.length===0?(v(),S("li",GO,I(u(D)("backend::lang.list.loading")),1)):!i.value&&o.value.length===0?(v(),S("li",YO,I(u(D)("backend::lang.relation.no_candidates")),1)):le("",!0)],8,LO),[[Bi,p.value===1]]),p.value===1&&s.value&&s.value.total>0?(v(),S("nav",{key:1,"aria-label":u(D)("backend::lang.list.pagination"),class:"flex items-center gap-2 text-[13px] text-muted"},[P("span",ZO,I(K.value),1),P("button",{type:"button","data-page":"prev","aria-label":u(D)("backend::lang.list.prev_page"),class:_e(Bf),disabled:i.value||l.value<=1,onClick:$[0]||($[0]=O=>de(l.value-1))},[W(u(ns),{size:16,"aria-hidden":"true"})],8,QO),P("button",{type:"button","data-page":"next","aria-label":u(D)("backend::lang.list.next_page"),class:_e(Bf),disabled:i.value||l.value>=re.value,onClick:$[1]||($[1]=O=>de(l.value+1))},[W(u(xl),{size:16,"aria-hidden":"true"})],8,XO)],8,JO)):le("",!0),P("div",eP,[p.value===2?(v(),S("button",{key:0,type:"button","data-action":"back",disabled:c.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:Te},I(u(D)("backend::lang.relation.back")),9,tP)):(v(),H(u(gr),{key:1,"data-action":"cancel",class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover"},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1})),E.value&&p.value===1?(v(),S("button",{key:2,type:"button","data-action":"next",disabled:Y.value===0,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:ue},I(u(D)("backend::lang.relation.next")),9,nP)):(v(),S("button",{key:3,type:"button","data-action":"confirm-link",disabled:c.value||Y.value===0,"aria-busy":c.value?"true":void 0,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:q},[E.value?(v(),S(xe,{key:0},[we(I(c.value?u(D)("backend::lang.form.saving"):u(Fe)(e.schema.messages.linkSubmit)),1)],64)):(v(),S(xe,{key:1},[we(I(u(D)("backend::lang.relation.add_count",{count:Y.value})),1)],64))],8,aP))])]),_:1})]),_:1})]),_:1},8,["open"]))}}),sP={class:"flex items-start gap-3"},iP={class:"flex min-w-0 flex-1 flex-col gap-1"},uP={key:0,"data-pivot-loading":"","aria-hidden":"true",class:"flex flex-col gap-1.5"},cP={key:1,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},dP=["disabled"],fP={class:"flex gap-2.5"},pP=["disabled"],hP=["disabled"],vP=Z({__name:"RelationPivotModal",props:{open:{type:Boolean},source:{},ownerId:{},relation:{},schema:{},childId:{},childName:{},sessionKey:{}},emits:["update:open","saved","gone","closed"],setup(e,{emit:t}){const n=e,a=t,r=M({}),l=M({}),o=M(!1),s=M(!1),i=M(!1),c=M(""),d=Sr();let f=0;const p=k(()=>`pivot-${n.relation}`),h=k(()=>n.schema.pivotForm??[]),m=k(()=>h.value.map(j=>j.name)),x=k(()=>!o.value&&!s.value&&oa(zt(h.value,r.value))!==c.value);function g(){return{[pa]:n.sessionKey}}function y(j){return{...n.source,id:n.ownerId,name:n.relation,child:j}}function w(j,b){if(r.value={...r.value,[j]:b},l.value[j]){const E={...l.value};delete E[j],l.value=E}}function C(){a("update:open",!1),Be(D("backend::lang.relation.child_gone"),"danger"),a("gone")}async function A(){const j=++f;if(l.value={},s.value=!1,i.value=!1,r.value={},c.value=oa({}),n.childId!==null){o.value=!0;try{const b=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/pivot/{child}",{params:{path:y(n.childId),header:g()}});if(j!==f)return;b.data?(r.value={...b.data.data},c.value=oa(zt(h.value,r.value))):b.response.status===404?C():s.value=!0}catch{j===f&&(s.value=!0)}finally{j===f&&(o.value=!1)}}}Ie(()=>n.open,j=>{j?A():f++},{immediate:!0});async function L(j){if(j){a("update:open",!0);return}i.value||x.value&&!await d.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})||a("update:open",!1)}async function Y(){if(!(i.value||o.value||s.value||n.childId===null)){i.value=!0;try{const j=await Re.PUT("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/pivot/{child}",{params:{path:y(n.childId),header:g()},body:zt(h.value,r.value)});if(j.data){l.value={},c.value=oa(zt(h.value,r.value)),a("update:open",!1),Be(Fe(n.schema.messages.pivotSaved)),a("saved");return}const b=j.response.status;if(b===422){l.value=Pl(j.error?.error.details);const E=h.value.find(V=>l.value[V.name]);E&&(await Ue(),Ml(p.value,E.name))}else b===404?C():Be(D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{i.value=!1}}}function z(j){j.preventDefault(),a("closed")}return(j,b)=>(v(),S(xe,null,[W(u(Cl),{open:e.open,"onUpdate:open":L},{default:F(()=>[W(u(gs),null,{default:F(()=>[W(u(El),{"data-dialog-overlay":"",class:"fixed inset-0 z-40 bg-overlay"}),W(u(Sl),{"data-relation-pivot-modal":"","data-dialog-content":"","aria-modal":"true",class:"fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100vh-32px)] w-[calc(100%-32px)] max-w-[560px] -translate-x-1/2 -translate-y-1/2 flex-col gap-4 overflow-y-auto rounded-modal bg-surface p-6 text-text shadow-pop",onCloseAutoFocus:z},{default:F(()=>[P("div",sP,[P("div",iP,[W(u(Al),{class:"text-[20px] font-bold tracking-[-0.01em]"},{default:F(()=>[we(I(u(Fe)(e.schema.messages.pivotTitle)),1)]),_:1}),W(u(fl),{class:"truncate text-muted",title:e.childName},{default:F(()=>[we(I(e.childName),1)]),_:1},8,["title"])]),W(u(gr),{"data-action":"close","aria-label":u(D)("backend::lang.form.close"),disabled:i.value,class:"flex size-[34px] shrink-0 items-center justify-center rounded-tab bg-subtle text-muted hover:bg-hover hover:text-text"},{default:F(()=>[W(u(Wt),{size:16,"aria-hidden":"true"})]),_:1},8,["aria-label","disabled"])]),o.value?(v(),S("div",uP,[...b[1]||(b[1]=[P("span",{class:"block h-3 w-24 rounded-[6px] bg-skel"},null,-1),P("span",{class:"block h-input rounded-control bg-skel"},null,-1)])])):s.value?(v(),S("p",cP,I(u(D)("backend::lang.relation.child_load_failed")),1)):(v(),S("form",{key:2,class:"flex flex-col gap-4",novalidate:"",onSubmit:ht(Y,["prevent"])},[W(Ol,{errors:l.value,"field-names":m.value},null,8,["errors","field-names"]),P("fieldset",{disabled:i.value,class:"m-0 min-w-0 border-0 p-0"},[W(Tl,{fields:h.value,values:r.value,errors:l.value,source:e.source,"record-id":null,"id-prefix":p.value,onUpdate:w},null,8,["fields","values","errors","source","id-prefix"])],8,dP)],32)),P("div",fP,[P("button",{type:"button","data-action":"cancel",disabled:i.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control border border-border-strong bg-surface font-semibold hover:bg-hover disabled:cursor-not-allowed disabled:opacity-60",onClick:b[0]||(b[0]=E=>L(!1))},I(u(D)("backend::lang.form.cancel")),9,pP),P("button",{type:"button","data-action":"save-pivot",disabled:i.value||o.value||s.value,class:"inline-flex h-button flex-1 items-center justify-center rounded-control bg-primary font-semibold text-on-primary hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60",onClick:Y},I(i.value?u(D)("backend::lang.form.saving"):u(Fe)(e.schema.messages.pivotSubmit)),9,hP)])]),_:1})]),_:1})]),_:1},8,["open"]),W(Cr,{open:u(d).request.value!==null,message:u(d).request.value?.message??"","confirm-label":u(d).request.value?.confirmLabel,danger:u(d).request.value?.danger,onConfirm:u(d).confirm,onCancel:u(d).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])],64))}}),mP=["id","data-relation-name","data-deferred","aria-labelledby","aria-describedby"],yP={class:"flex flex-col gap-2"},gP={class:"flex flex-wrap items-center gap-3"},bP={class:"flex min-w-0 flex-1 flex-col"},_P=["id"],xP=["id"],wP={key:0,class:"relative block w-[220px] max-w-full"},kP={class:"sr-only"},$P=["value","placeholder"],CP={key:0,"data-relation-pending":"",class:"flex items-center gap-2 text-[13px] text-muted"},SP={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},EP={key:1,class:"overflow-hidden rounded-inner border border-border"},AP={"data-relation-empty":"",class:"text-muted"},DP=["aria-label","onClick"],OP=300,PP=Z({__name:"RelationManager",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(Cs,null),a=k(()=>t.field.relation||t.field.name),r=k(()=>typeof t.recordId=="number"?t.recordId:n&&n.recordId===0&&t.field.deferrable?0:null),l=k(()=>r.value===0),o=k(()=>t.source!=null&&r.value!==null),s=n?.key??Mo(),i=M(null),c=M([]),d=M(null),f=M(!0),p=M(!1),h=M(""),m=M(1),x=M(null),g=M([]),y=M(!1),w=M(!1),C=M(!1),A=M("create"),L=M(null),Y=M(!1),z=M(null),j=M("");let b=null,E=null,V=null;const T=Sr();let K=0,re=null;const U=k(()=>i.value?.view.list.columns??[]),ae=k(()=>i.value?.view.toolbarButtons??[]),Q=k(()=>i.value?.messages),se=k(()=>`${t.controlId}-heading`),ne=k(()=>`${t.controlId}-comment`),ie=k(()=>ae.value.includes("create")&&(i.value?.manageForm?.length??0)>0),de=k(()=>ae.value.includes("update")&&(i.value?.manageForm?.length??0)>0),$e=k(()=>i.value?.kind==="belongsToMany"&&(i.value?.pivotForm?.length??0)>0&&(ae.value.includes("link")||ae.value.includes("update"))),Ce=k(()=>(i.value?.viewForm?.length??0)>0),ue=k(()=>de.value?"update":$e.value?"pivot":Ce.value?"preview":null),Te=k(()=>de.value&&$e.value),ce=k(()=>ae.value.includes("unlink")||ae.value.includes("delete"));function B(){return l.value?{[pa]:s}:void 0}function G(){return{...t.source,id:r.value,name:a.value}}function q(){l.value&&n?.markDirty()}async function te(){const{data:Ee}=await Re.GET("/{vendor}/{plugin}/{controller}/schema/relation/{name}",{params:{path:{...t.source,name:a.value}}});i.value=Ee?.data??null}async function ye(){const Ee=++K;f.value=!0,p.value=!1;try{const ke=h.value.trim(),Me={page:m.value};ke!==""&&(Me.search=ke),x.value&&(Me.sort=x.value.column,Me.dir=x.value.dir);const{data:kt}=await Re.GET("/{vendor}/{plugin}/{controller}/{id}/relations/{name}",{params:{path:G(),query:Me,header:B()}});if(Ee!==K)return;c.value=kt?.data??[],d.value=kt?.meta??null,p.value=!kt}catch{Ee===K&&(c.value=[],d.value=null,p.value=!0)}finally{Ee===K&&(f.value=!1)}}async function _(){if(o.value){try{await te()}catch{i.value=null}if(!i.value){f.value=!1,p.value=!0;return}await ye()}}function $(Ee){h.value=Ee.target.value,re!==null&&clearTimeout(re),re=setTimeout(()=>{re=null,m.value=1,g.value=[],ye()},OP)}function O(Ee){m.value=Ee,g.value=[],ye()}function X(Ee){const ke=x.value;ke?.column!==Ee?x.value={column:Ee,dir:"asc"}:ke.dir==="asc"?x.value={column:Ee,dir:"desc"}:x.value=null,m.value=1,g.value=[],ye()}function J(){return g.value.map(Number).filter(Ee=>Number.isInteger(Ee)&&Ee>0)}function ee(Ee){const ke=Ee.id;return typeof ke=="number"&&Number.isInteger(ke)?ke:typeof ke=="string"&&/^\d+$/.test(ke)?Number(ke):null}function me(Ee){const ke=U.value[0]?.key,Me=ke?Ee[ke]:void 0;return typeof Me=="string"||typeof Me=="number"?String(Me):""}async function he(){const Ee=J();if(!(y.value||Ee.length===0||!i.value||!await T.ask({message:Fe(Q.value?.unlinkConfirm,Ee.length),confirmLabel:Fe(Q.value?.unlinkSelected),danger:!0}))){y.value=!0;try{const Me=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink",{params:{path:G(),header:B()},body:{ids:Ee}});if(Me.data){g.value=[],q(),Be(Fe(Q.value?.unlinked,Me.data.data.removed??Ee.length)),await ye();return}Be(Me.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{y.value=!1}}}async function pe(Ee){y.value=!0;try{const ke=await Re.POST("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/delete",{params:{path:G(),header:B()},body:{ids:Ee}});if(ke.data){g.value=[],q(),Be(Fe(Q.value?.deleted,ke.data.data.deleted||Ee.length)),await ye();return}Be(ke.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{y.value=!1}}async function oe(){const Ee=J();y.value||Ee.length===0||!i.value||await T.ask({message:Fe(Q.value?.deleteConfirm,Ee.length),confirmLabel:Fe(Q.value?.deleteSelected),danger:!0},()=>pe(Ee))}async function Ae(Ee){q(),Be(Fe(Q.value?.linked,Ee)),g.value=[],await ye()}function ge(Ee){b=Ee.currentTarget??V,A.value="create",L.value=null,C.value=!0}function Se(Ee,ke){const Me=ee(Ee);Me!==null&&(b=ke,z.value=Me,j.value=me(Ee),Y.value=!0)}function Pe(Ee,ke){const Me=ue.value,kt=ee(Ee);if(!(Me===null||kt===null)){if(Me==="pivot"){Se(Ee,ke);return}b=ke,A.value=Me,L.value=kt,C.value=!0}}async function Le(){q(),g.value=[],await ye()}async function Ye(){q(),await ye()}async function je(){g.value=[],await ye()}function nt(){const Ee=b&&b.isConnected?b:null;b=null,Ee?.focus()}function st(){E?.focus()}function vt(Ee){const ke=Ee?.$el;return ke instanceof HTMLElement?ke:null}function wt(Ee){E=vt(Ee)}function Gt(Ee){V=vt(Ee)}return Nt(()=>{re!==null&&clearTimeout(re)}),_(),(Ee,ke)=>o.value?(v(),S("section",{key:0,id:e.controlId,"data-relation-manager":"","data-relation-name":a.value,"data-deferred":l.value?"true":void 0,"aria-labelledby":se.value,"aria-describedby":e.field.comment?ne.value:void 0,tabindex:"-1",class:"flex flex-col gap-4"},[P("div",yP,[P("header",gP,[P("div",bP,[P("h2",{id:se.value,class:"text-[17px] font-bold tracking-[-0.01em]"},I(i.value?.label||e.field.label||a.value),9,_P),e.field.comment?(v(),S("p",{key:0,id:ne.value,class:"text-[13px] text-muted"},I(e.field.comment),9,xP)):le("",!0)]),i.value?.view.showSearch?(v(),S("label",wP,[P("span",kP,I(u(D)("backend::lang.list.search")),1),W(u(as),{size:16,class:"pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 text-muted","aria-hidden":"true"}),P("input",{type:"search","data-relation-search":"",value:h.value,placeholder:u(D)("backend::lang.list.search_prompt"),class:"h-[38px] w-full rounded-control border border-transparent bg-subtle pr-3 pl-9",onInput:$,onKeydown:ke[0]||(ke[0]=ur(ht(()=>{},["prevent"]),["enter"]))},null,40,$P)])):le("",!0),(v(!0),S(xe,null,Ve(ae.value,Me=>(v(),S(xe,{key:Me},[Me==="create"&&ie.value?(v(),H(lt,{key:0,ref_for:!0,ref:Gt,"data-action":"create",size:"sm",variant:"primary",icon:u(Ou),disabled:y.value||!i.value,"aria-haspopup":"dialog",onClick:ge},{default:F(()=>[we(I(u(Fe)(Q.value?.create)),1)]),_:1},8,["icon","disabled"])):Me==="link"?(v(),H(lt,{key:1,ref_for:!0,ref:wt,"data-action":"link",size:"sm",variant:ie.value?"outline":"primary",icon:u(qh),disabled:y.value||!i.value,"aria-haspopup":"dialog",onClick:ke[1]||(ke[1]=kt=>w.value=!0)},{default:F(()=>[we(I(u(Fe)(Q.value?.link)),1)]),_:1},8,["variant","icon","disabled"])):Me==="delete"?(v(),H(lt,{key:2,"data-action":"delete",size:"sm",variant:"danger",icon:u(wl),disabled:y.value||g.value.length===0,onClick:oe},{default:F(()=>[we(I(u(Fe)(Q.value?.deleteSelected)),1)]),_:1},8,["icon","disabled"])):Me==="unlink"?(v(),H(lt,{key:3,"data-action":"unlink",size:"sm",variant:"danger",icon:u(Rh),disabled:y.value||g.value.length===0,onClick:he},{default:F(()=>[we(I(u(Fe)(Q.value?.unlinkSelected)),1)]),_:1},8,["icon","disabled"])):le("",!0)],64))),128))]),l.value?(v(),S("p",CP,[W(u(n0),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(u(D)("backend::lang.relation.pending_note")),1)])):le("",!0)]),p.value&&!f.value?(v(),S("p",SP,I(u(D)("backend::lang.relation.load_failed")),1)):(v(),S("div",EP,[W(bm,{selected:g.value,"onUpdate:selected":ke[2]||(ke[2]=Me=>g.value=Me),variant:"relation",columns:U.value,rows:c.value,loading:f.value,selectable:ce.value,sortable:!0,sort:x.value,openable:ue.value!==null,trailing:Te.value,onSort:X,onOpen:Pe},{empty:F(()=>[P("span",AP,I(u(Fe)(Q.value?.empty)),1)]),trailing:F(({row:Me})=>[P("button",{type:"button","data-action":"edit-pivot","aria-label":u(Fe)(Q.value?.editPivot,void 0,{name:me(Me)}),class:"flex size-8 items-center justify-center rounded-pager text-muted transition-colors duration-150 ease-out hover:bg-hover hover:text-text",onClick:kt=>Se(Me,kt.currentTarget)},[W(u(S0),{size:16,"aria-hidden":"true"})],8,DP)]),_:1},8,["selected","columns","rows","loading","selectable","sort","openable","trailing"]),d.value&&d.value.last_page>1?(v(),H(_m,{key:0,meta:d.value,loading:f.value,"per-page-options":[],"per-page":d.value.per_page,onPage:O},null,8,["meta","loading","per-page"])):le("",!0)])),i.value&&ae.value.includes("link")?(v(),H(oP,{key:2,open:w.value,"onUpdate:open":ke[3]||(ke[3]=Me=>w.value=Me),source:e.source,"record-id":r.value,relation:a.value,schema:i.value,"session-key":l.value?u(s):null,onLinked:Ae,onClosed:st},null,8,["open","source","record-id","relation","schema","session-key"])):le("",!0),i.value&&(ie.value||ue.value==="update"||ue.value==="preview")?(v(),H(MO,{key:3,open:C.value,"onUpdate:open":ke[4]||(ke[4]=Me=>C.value=Me),source:e.source,"owner-id":r.value,relation:a.value,schema:i.value,mode:A.value,"child-id":L.value,"session-key":u(s),"can-delete":ae.value.includes("delete"),onChanged:Le,onGone:je,onClosed:nt},null,8,["open","source","owner-id","relation","schema","mode","child-id","session-key","can-delete"])):le("",!0),i.value&&$e.value?(v(),H(vP,{key:4,open:Y.value,"onUpdate:open":ke[5]||(ke[5]=Me=>Y.value=Me),source:e.source,"owner-id":r.value,relation:a.value,schema:i.value,"child-id":z.value,"child-name":j.value,"session-key":u(s),onSaved:Ye,onGone:je,onClosed:nt},null,8,["open","source","owner-id","relation","schema","child-id","child-name","session-key"])):le("",!0),W(Cr,{open:u(T).request.value!==null,message:u(T).request.value?.message??"","confirm-label":u(T).request.value?.confirmLabel,danger:u(T).request.value?.danger,busy:u(T).busy.value,onConfirm:u(T).confirm,onCancel:u(T).cancel},null,8,["open","message","confirm-label","danger","busy","onConfirm","onCancel"])],8,mP)):le("",!0)}}),MP=["id","aria-describedby"],TP=["data-relation"],RP={class:"flex size-[22px] items-center justify-center rounded-full bg-primary text-[10px] font-bold text-on-primary","aria-hidden":"true"},qP={class:"font-semibold"},IP=["aria-label","onClick"],FP=["id","aria-expanded","aria-controls","aria-activedescendant","aria-required","aria-invalid","aria-describedby","value","placeholder"],BP={key:1,class:"relative"},NP=["id","aria-expanded","aria-controls","aria-activedescendant","aria-required","aria-invalid","aria-describedby","value","placeholder"],VP=["id"],LP=["id","data-value","aria-selected","onMousedown"],jP={key:0,role:"presentation",class:"px-3 py-2 text-[13px] text-muted"},UP={key:1,role:"presentation",class:"px-3 py-2 text-[13px] text-muted"},zP={key:2,role:"presentation",class:"p-1"},HP=20,WP=300,KP=Z({__name:"RelationField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.field.readOnly?"readonly":n.field.multiple?"multiple":"single"),l=k(()=>`${n.controlId}-listbox`),o=M({});Ie(()=>n.labels,ne=>{const ie={...o.value};for(const de of ne??[])ie[de.value]=de.label;o.value=ie},{immediate:!0});function s(ne){return typeof ne=="number"&&Number.isInteger(ne)?ne:typeof ne=="string"&&/^\d+$/.test(ne)?Number(ne):null}const i=k(()=>s(n.modelValue)),c=k(()=>Array.isArray(n.modelValue)?n.modelValue.map(s).filter(ne=>ne!==null):[]);function d(ne){return o.value[ne]??String(ne)}function f(ne){return ne.split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(ie=>ie.charAt(0).toUpperCase()).join("")}const p=k(()=>{const ne=n.labels?.[0]?.label;return ne||(n.field.emptyOption??"—")}),h=M(!1),m=M(""),x=M([]),g=M(0),y=M(0),w=M(!1),C=M(-1);let A=0,L=null;const Y=k(()=>g.value{const ne=[];r.value==="single"&&n.field.emptyOption!==void 0&&ne.push({key:"empty",label:n.field.emptyOption,value:null,muted:!0});const ie=new Set(c.value);for(const de of x.value)r.value==="multiple"&&ie.has(de.value)||ne.push({key:`option-${de.value}`,label:de.label,value:de.value,muted:!1});return ne});function b(ne){return`${l.value}-${ne}`}function E(){h.value||(h.value=!0,C.value=-1,z(1,!1))}function V(){h.value=!1,m.value="",C.value=-1,L!==null&&(clearTimeout(L),L=null)}function T(ne){m.value=ne.target.value,h.value=!0,C.value=-1,L!==null&&clearTimeout(L),L=setTimeout(()=>{L=null,z(1,!1)},WP)}function K(){Y.value&&!w.value&&z(g.value+1,!0)}function re(ne){const ie=ne.target;ie.scrollTop+ie.clientHeight>=ie.scrollHeight-24&&K()}function U(ne){r.value==="multiple"?ne.value!==null&&!c.value.includes(ne.value)&&a("update:modelValue",[...c.value,ne.value]):a("update:modelValue",ne.value),V()}function ae(ne){a("update:modelValue",c.value.filter(ie=>ie!==ne))}function Q(ne){switch(ne.key){case"ArrowDown":ne.preventDefault(),h.value?C.value=Math.min(C.value+1,j.value.length-1):E();break;case"ArrowUp":ne.preventDefault(),C.value=Math.max(C.value-1,0);break;case"Enter":if(h.value){ne.preventDefault();const ie=j.value[C.value];ie&&U(ie)}break;case"Escape":h.value&&(ne.preventDefault(),V());break;case"Backspace":r.value==="multiple"&&m.value===""&&c.value.length>0&&ae(c.value[c.value.length-1]);break}}const se=k(()=>i.value!==null?d(i.value):n.field.emptyOption??"");return Nt(()=>{L!==null&&clearTimeout(L)}),(ne,ie)=>r.value==="readonly"?(v(),S("div",{key:0,id:e.controlId,"data-relation-readonly":"","aria-describedby":e.describedBy||void 0,class:_e([e.labels?.[0]?.label?"text-text":"text-muted","flex min-h-input items-center rounded-control border border-border bg-subtle px-3.5"])},I(p.value),11,MP)):(v(),S("div",{key:1,class:"relative","data-relation":r.value},[r.value==="multiple"?(v(),S("div",{key:0,class:_e([e.invalid?"border-danger":"border-border-strong","flex min-h-input flex-wrap items-center gap-1.5 rounded-control border bg-surface p-1.5"])},[(v(!0),S(xe,null,Ve(c.value,de=>(v(),S("span",{key:de,"data-chip":"",class:"inline-flex h-[30px] items-center gap-1.5 rounded-pill bg-subtle pr-1 pl-1"},[P("span",RP,I(f(d(de))),1),P("span",qP,I(d(de)),1),P("button",{type:"button","aria-label":u(D)("backend::lang.form.remove_item",{name:d(de)}),class:"flex size-6 items-center justify-center rounded-full text-muted hover:bg-hover hover:text-text",onClick:$e=>ae(de)},[W(u(Wt),{size:14,"aria-hidden":"true"})],8,IP)]))),128)),P("input",{id:e.controlId,type:"text",role:"combobox",autocomplete:"off","aria-expanded":h.value?"true":"false","aria-controls":l.value,"aria-autocomplete":"list","aria-activedescendant":h.value&&C.value>=0?b(C.value):void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,value:m.value,placeholder:u(D)("backend::lang.form.add_item"),class:"h-[30px] min-w-[120px] flex-1 border-0 bg-transparent px-2 focus-visible:shadow-none",onClick:E,onInput:T,onKeydown:Q,onBlur:V},null,40,FP)],2)):(v(),S("div",BP,[P("input",{id:e.controlId,type:"text",role:"combobox",autocomplete:"off","aria-expanded":h.value?"true":"false","aria-controls":l.value,"aria-autocomplete":"list","aria-activedescendant":h.value&&C.value>=0?b(C.value):void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,value:h.value?m.value:se.value,placeholder:h.value&&se.value||u(D)("backend::lang.form.select_placeholder"),class:_e([[e.invalid?"border-danger":"border-border-strong",!h.value&&i.value===null?"text-muted":"text-text"],"h-input w-full rounded-control border bg-surface pr-10 pl-3.5"]),onClick:E,onInput:T,onKeydown:Q,onBlur:V},null,42,NP),W(u(ts),{size:16,class:"pointer-events-none absolute top-1/2 right-3.5 -translate-y-1/2 text-muted","aria-hidden":"true"})])),Oa(P("ul",{id:l.value,role:"listbox",class:"absolute inset-x-0 top-full z-20 mt-1 max-h-64 overflow-y-auto rounded-inner border border-border bg-surface p-1 shadow-menu",onScroll:re},[(v(!0),S(xe,null,Ve(j.value,(de,$e)=>(v(),S("li",{id:b($e),key:de.key,role:"option","data-value":de.value??"empty","aria-selected":r.value==="single"&&de.value===i.value?"true":"false",class:_e([[de.muted?"text-muted":"text-text",$e===C.value?"bg-hover":""],"flex h-10 cursor-pointer items-center rounded-control px-3 hover:bg-hover"]),onMousedown:ht(Ce=>U(de),["prevent"])},I(de.label),43,LP))),128)),w.value?(v(),S("li",jP,I(u(D)("backend::lang.form.loading_options")),1)):j.value.filter(de=>de.value!==null).length===0?(v(),S("li",UP,I(u(D)("backend::lang.form.no_options")),1)):le("",!0),Y.value&&!w.value?(v(),S("li",zP,[P("button",{type:"button","data-action":"more-options",class:"h-8 w-full rounded-control text-[13px] font-semibold text-muted hover:bg-hover hover:text-text",onMousedown:ht(K,["prevent"])},I(u(D)("backend::lang.form.more_options")),33)])):le("",!0)],40,VP),[[Bi,h.value]])],8,TP))}}),GP={class:"flex min-w-0 flex-col"},YP=["for"],JP={key:0,class:"text-danger","aria-hidden":"true"},ZP=["id"],QP=["id","aria-checked","aria-invalid","aria-describedby"],XP=Z({__name:"SwitchField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>Sm(n.modelValue));function l(){a("update:modelValue",Em(n.modelValue,!r.value))}return(o,s)=>(v(),S("div",{class:_e([e.invalid?"border-danger":"border-border","flex items-center justify-between gap-4 rounded-inner border px-4 py-3.5"]),"data-toggle-card":""},[P("div",GP,[P("label",{for:e.controlId,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",JP," *")):le("",!0)],8,YP),e.field.comment?(v(),S("p",{key:0,id:`${e.controlId}-comment`,class:"text-[13px] text-muted"},I(e.field.comment),9,ZP)):le("",!0)]),P("button",{id:e.controlId,type:"button",role:"switch","aria-checked":r.value?"true":"false","aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:_e([r.value?"bg-primary":"bg-border-strong","relative h-[26px] w-11 shrink-0 rounded-pill transition-colors duration-150 ease-out"]),onClick:l},[P("span",{class:_e([r.value?"translate-x-[18px] bg-on-primary":"translate-x-0 bg-white","absolute top-[3px] left-[3px] size-5 rounded-full shadow-tab transition-transform duration-150 ease-out"]),"aria-hidden":"true"},null,2)],10,QP)],2))}}),eM=["id","name","value","required","aria-required","aria-invalid","aria-describedby"],tM=Z({__name:"TextField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),l=k(()=>yc(n.field));return(o,s)=>(v(),S("input",Ne({id:e.controlId},l.value,{name:e.field.name,type:"text",value:r.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"h-input"],onInput:s[0]||(s[0]=i=>a("update:modelValue",i.target.value))}),null,16,eM))}}),nM=["id","name","rows","value","required","aria-required","aria-invalid","aria-describedby"],aM=Z({__name:"TextareaField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r={tiny:2,small:4,large:8,huge:12,giant:18},l=k(()=>r[n.field.size??""]??5),o=k(()=>n.modelValue===null||n.modelValue===void 0?"":String(n.modelValue)),s=k(()=>yc(n.field));return(i,c)=>(v(),S("textarea",Ne({id:e.controlId},s.value,{name:e.field.name,rows:l.value,value:o.value,required:e.field.required||void 0,"aria-required":e.field.required?"true":void 0,"aria-invalid":e.invalid?"true":void 0,"aria-describedby":e.describedBy||void 0,class:[u(qa)(e.invalid),"min-h-input resize-y py-2.5"],onInput:c[0]||(c[0]=d=>a("update:modelValue",d.target.value))}),null,16,nM))}}),rM=["id","aria-describedby"],lM={key:0},oM={class:"font-mono text-text"},sM={key:1},iM={class:"font-mono text-text"},Ql="\0",uM=Z({__name:"UnsupportedField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=k(()=>{const[r="",l=""]=D("backend::lang.form.unsupported_field",{type:Ql}).split(Ql);return{before:r,after:l}}),a=k(()=>D("backend::lang.form.unsupported_field",{type:Ql}).includes(Ql));return(r,l)=>(v(),S("div",{id:e.controlId,"data-unsupported-field":"","aria-describedby":e.describedBy||void 0,class:"flex min-h-input items-center gap-2.5 rounded-control border-[1.5px] border-dashed border-border-strong bg-subtle px-3.5 text-[13px] text-muted"},[W(u(Ph),{size:16,"aria-hidden":"true"}),a.value?(v(),S("span",lM,[we(I(n.value.before),1),P("code",oM,I(t.field.type),1),we(I(n.value.after),1)])):(v(),S("span",sM,[we(I(u(D)("backend::lang.form.unsupported_field"))+" ",1),P("code",iM,I(t.field.type),1)]))],8,rM))}}),cM=["id","aria-labelledby","aria-describedby","aria-busy"],dM={key:0,"data-widget-skeleton":"",class:"h-[42px] w-[160px] rounded-control bg-skel","aria-hidden":"true"},fM=Z({__name:"WidgetField",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},setup(e){const t=e,n=it(gc,null),a=it(bc,()=>{}),r=it(Am,null),l=it(Dm,()=>Promise.resolve([])),o=M("loading"),s=M(null);let i=null,c=!1,d=!1;function f(){const C=n?.value??{},A={};for(const L of t.field.fill??[])C[L]!==void 0&&(A[L]=C[L]);return A}const p=k(()=>JSON.stringify(f())),h=k(()=>r?.value||il.value);function m(C){let A;return{promise:new Promise((Y,z)=>{A=setTimeout(()=>z(new Error("widget element was not defined in time")),C)}),cancel:()=>clearTimeout(A)}}async function x(C){const A=await l();if(customElements.get(C))return;if(A.length>0)throw new Error(`plugin script failed: ${A.join(", ")}`);const L=m(MA);try{await Promise.race([customElements.whenDefined(C),L.promise])}finally{L.cancel()}}function g(C){Be(C||D("backend::lang.extension.action_failed"),"danger"),i?.setAttribute("state","error")}async function y(){const C=t.source;if(!(!i||c||!C)){c=!0,i.setAttribute("busy",""),i.removeAttribute("state");try{const A=await Re.POST("/{vendor}/{plugin}/{controller}/widgets/{field}",{params:{path:{...C,field:t.field.name}},body:{record_id:t.recordId??void 0,values:f()}});if(A.data){const L=A.data.data.fill??{};for(const Y of t.field.fill??[])Object.hasOwn(L,Y)&&a(Y,L[Y]);A.data.data.message&&Be(A.data.data.message)}else g(A.error?.error.message)}catch{g()}finally{c=!1,i?.removeAttribute("busy")}}}function w(){y()}return _t(async()=>{const C=t.field.widget??"";try{if(C===""||!t.source)throw new Error("widget field without a tag or controller");if(await x(C),d||!s.value)return;const A=document.createElement(C);A.setAttribute("record-id",t.recordId==null?"":String(t.recordId)),A.setAttribute("field-name",t.field.name),A.setAttribute("locale",h.value),A.setAttribute("fill-values",p.value),A.setAttribute("label",t.field.actionLabel||t.field.label||t.field.name),A.setAttribute("busy-label",D("backend::lang.extension.busy")),A.addEventListener(Ff,w),s.value.append(A),i=A,o.value="ready"}catch{d||(o.value="failed")}}),Ie(p,C=>i?.setAttribute("fill-values",C)),Ie(h,C=>i?.setAttribute("locale",C)),Nt(()=>{d=!0,i?.removeEventListener(Ff,w),i=null}),(C,A)=>o.value==="failed"?(v(),H(mc,{key:0,id:e.controlId,"data-widget-failed":"","aria-describedby":e.describedBy||void 0,text:u(D)("backend::lang.extension.widget_failed")},null,8,["id","aria-describedby","text"])):(v(),S("div",{key:1,id:e.controlId,role:"group","data-widget-host":"","aria-labelledby":e.field.label?`${e.controlId}-label`:void 0,"aria-describedby":e.describedBy||void 0,"aria-busy":o.value==="loading"?"true":void 0,class:"flex min-h-input items-center"},[o.value==="loading"?(v(),S("span",dM)):le("",!0),P("div",{ref_key:"mountPoint",ref:s,class:"contents"},null,512)],8,cM))}}),Er="relation-manager",Pm=new Map([[Er,()=>PP]]),Mm=new Map([["text",tM],["textarea",aM],["number",bO],["dropdown",PA],["switch",XP],["checkbox",iA],["relation",KP],["widget",fM],["partial",xO],["fileupload",yO],["datepicker",EA]]),pM=new Set(["switch","checkbox",Er]),hM=new Set([Er]),vM=new Set([Er,"widget","partial","fileupload"]),mM=new Set(["widget","partial","fileupload"]);function yM(e){return Mm.get(e)??Pm.get(e)?.()??uM}function gM(e){return(Mm.has(e)||Pm.has(e))&&!vM.has(e)}function bM(e){return hM.has(e)}function _M(e){return pM.has(e)}function xM(e){return mM.has(e)}const wM=Z({__name:"FieldRenderer",props:{field:{},modelValue:{},controlId:{},invalid:{type:Boolean},describedBy:{},labels:{},source:{},recordId:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>yM(n.field.type));return(l,o)=>(v(),H(Bn(r.value),{field:e.field,"model-value":e.modelValue,"control-id":e.controlId,invalid:e.invalid,"described-by":e.describedBy,labels:e.labels,source:e.source,"record-id":e.recordId,"onUpdate:modelValue":o[0]||(o[0]=s=>a("update:modelValue",s))},null,8,["field","model-value","control-id","invalid","described-by","labels","source","record-id"]))}}),kM=["data-field"],$M=["id"],CM={key:0,class:"text-danger","aria-hidden":"true"},SM=["for"],EM={key:0,class:"text-danger","aria-hidden":"true"},AM=["id"],DM=["id"],OM=Z({__name:"FormField",props:{field:{},modelValue:{},errors:{},labels:{},source:{},recordId:{},idPrefix:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,a=t,r=k(()=>`${n.idPrefix??"field"}-${n.field.name}`),l=k(()=>r.value),o=k(()=>`${r.value}-comment`),s=k(()=>`${r.value}-error`),i=k(()=>(n.errors?.length??0)>0),c=k(()=>_M(n.field.type)),d=k(()=>xM(n.field.type)),f=k(()=>!c.value&&!!n.field.comment),p=k(()=>[f.value||c.value&&n.field.comment?o.value:"",i.value?s.value:""].filter(Boolean).join(" "));return(h,m)=>(v(),S("div",{class:"flex min-w-0 flex-col gap-1.5","data-field":e.field.name},[d.value&&e.field.label?(v(),S("span",{key:0,id:`${l.value}-label`,class:"font-semibold"},[we(I(e.field.label),1),e.field.required?(v(),S("span",CM," *")):le("",!0)],8,$M)):!c.value&&!d.value?(v(),S("label",{key:1,for:l.value,class:"font-semibold"},[we(I(e.field.label||e.field.name),1),e.field.required?(v(),S("span",EM," *")):le("",!0)],8,SM)):le("",!0),W(wM,{field:e.field,"model-value":e.modelValue,"control-id":l.value,invalid:i.value,"described-by":p.value,labels:e.labels,source:e.source,"record-id":e.recordId,"onUpdate:modelValue":m[0]||(m[0]=x=>a("update:modelValue",x))},null,8,["field","model-value","control-id","invalid","described-by","labels","source","record-id"]),f.value?(v(),S("p",{key:2,id:o.value,class:"text-[13px] text-muted"},I(e.field.comment),9,AM)):le("",!0),i.value?(v(),S("div",{key:3,id:s.value,class:"flex flex-col gap-0.5 text-[13px] text-danger"},[(v(!0),S(xe,null,Ve(e.errors,(x,g)=>(v(),S("p",{key:g,class:"flex items-center gap-1.5"},[W(u(Ut),{size:14,class:"shrink-0","aria-hidden":"true"}),P("span",null,I(x),1)]))),128))],8,DM)):le("",!0)],8,kM))}}),PM={class:"grid grid-cols-1 gap-x-6 gap-y-[22px] min-[600px]:grid-cols-2"},Tl=Z({__name:"FormGrid",props:{fields:{},values:{},errors:{},labels:{},source:{},recordId:{},idPrefix:{}},emits:["update"],setup(e,{emit:t}){const n=t;function a(r){if(r.type===Er)return"col-span-full";switch(r.span){case"left":return"min-[600px]:col-start-1";case"right":return"min-[600px]:col-start-2";case"auto":case"row":return"";default:return"col-span-full"}}return(r,l)=>(v(),S("div",PM,[(v(!0),S(xe,null,Ve(e.fields,o=>(v(),H(OM,{key:o.name,class:_e(a(o)),field:o,"model-value":e.values[o.name],errors:e.errors[o.name],labels:e.labels?.[o.name],source:e.source,"record-id":e.recordId,"id-prefix":e.idPrefix,"onUpdate:modelValue":s=>n("update",o.name,s)},null,8,["class","field","model-value","errors","labels","source","record-id","id-prefix","onUpdate:modelValue"]))),128))]))}}),MM={class:"flex w-full flex-col gap-5 pb-24"},TM={class:"flex flex-wrap items-center gap-4"},RM={class:"flex min-w-0 flex-1 flex-col"},qM={class:"truncate text-[24px] font-bold tracking-[-0.02em]"},IM={key:0,class:"text-muted"},FM={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},BM=["id","role","aria-labelledby"],NM={class:"fixed inset-x-0 bottom-0 z-30 flex items-center gap-2.5 border-t border-border bg-surface px-8 py-3.5"},VM={class:"ml-auto flex items-center gap-2.5"},Fr="field",Nf=Z({__name:"FormView",setup(e){const t=_n(),n=_l(),a={vendor:String(t.params.vendor??""),plugin:String(t.params.plugin??""),controller:String(t.params.controller??"")},r=qu(a),l=ua(r)??"/",o=t.name==="create"?"create":"update",s=o==="update"?Number(t.params.id):null,i=M(null),c=M({}),d=M({}),f=M({}),p=M(!0),h=M(!1),m=M(!1),x=M(""),g=M(Jt),y=Sr();let w=!1,C=Promise.resolve([]);const A=Mo(),L={[pa]:A},Y=M(0),z=M(0),j=k(()=>(i.value?.fields??[]).filter(q=>xc(q,o)&&(o==="update"||!bM(q.type)||q.type===Er&&!!q.deferrable))),b=k(()=>j.value.map(q=>q.name)),E=k(()=>{if(!j.value.some(te=>te.tab))return[];const q=[];for(const te of j.value){const ye=la(te);let _=q.find($=>$.key===ye);_||(_={key:ye,label:te.tab||D("backend::lang.form.tab_default"),errors:0},ye===Jt?q.unshift(_):q.push(_)),f.value[te.name]&&(_.errors+=1)}return q}),V=k(()=>Math.max(E.value.findIndex(q=>q.key===g.value),0)),T=k(()=>{if(E.value.length===0)return j.value;const q=E.value[V.value]?.key??Jt;return j.value.filter(te=>la(te)===q)}),K=k(()=>{const q=i.value?.fields.find(ye=>ye.type==="text"),te=q?c.value[q.name]:void 0;return typeof te=="string"||typeof te=="number"?String(te).trim():""}),re=k(()=>{if(o==="update"&&K.value!=="")return K.value;const q=o==="create"?i.value?.messages.create:i.value?.messages.update;return Fe(q,void 0,{name:K.value})}),U=k(()=>o==="update"?Fe(i.value?.messages.update,void 0,{name:K.value}):""),ae=k(()=>!p.value&&(Y.value>0||oa(zt(j.value,c.value))!==x.value));function Q(q){q&&(c.value={...q.data},d.value=q.meta.labels??{}),x.value=oa(zt(j.value,c.value))}async function se(){p.value=!0,h.value=!1;const q={path:a},[te,ye]=await Promise.all([Re.GET("/{vendor}/{plugin}/{controller}/schema/form",{params:q}),s!==null?Re.GET("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s}}}):Promise.resolve(null)]);i.value=te.data?.data??null,h.value=!te.data||ye!==null&&!ye.data,i.value&&(C=mm(r,i.value.assets)),i.value&&o==="create"&&(c.value=wc(j.value)),Q(ye?.data),g.value=E.value[0]?.key??Jt,p.value=!1}function ne(q,te){if(c.value={...c.value,[q]:te},f.value[q]){const ye={...f.value};delete ye[q],f.value=ye}}Dt(gc,k(()=>c.value)),Dt(bc,ne),Dt(Am,k(()=>i.value?.meta.locale||il.value)),Dt(Dm,()=>C),Dt(Cs,{key:A,recordId:s??0,routes:q=>Q3(a,s??0,q,A),markDirty:()=>{Y.value++},pendingChanges:Tt(Y),revision:Tt(z)});async function ie(q){f.value=Pl(q?.details);const te=j.value.filter(_=>f.value[_.name]),ye=te.find(_=>la(_)===g.value)??te[0];ye&&(E.value.length>0&&(g.value=la(ye)),await Ue(),Ml(Fr,ye.name))}function de(q,te){const ye=i.value?.redirects,_=(ye?.[o]?.[q]||ye?.default)??"";return gm(_,r,typeof te=="number"||typeof te=="string"?te:null)}async function $e(){if(m.value||!i.value)return null;m.value=!0;try{const q=zt(j.value,c.value),te=s===null?await Re.POST("/{vendor}/{plugin}/{controller}",{params:{path:a,header:L},body:q}):await Re.PUT("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s},header:L},body:q});return te.data?(f.value={},Q(te.data),Y.value=0,z.value++,Be(Fe(i.value.messages.saved,void 0,{name:K.value})),te.data):(te.response.status===422?await ie(te.error?.error):Be(te.error?.error.message||D("backend::lang.form.error_generic"),"danger"),null)}catch{return Be(D("backend::lang.form.error_generic"),"danger"),null}finally{m.value=!1}}async function Ce(q){w=!0;try{await n.push(q)}finally{w=!1}}async function ue(){const q=await $e();q&&o==="create"&&await Ce(de("redirect",q.data.id))}async function Te(){const q=await $e();q&&await Ce(de("redirectClose",q.data.id))}async function ce(){if(!(s===null||m.value||!i.value||!await y.ask({message:Fe(i.value.messages.deleteConfirm,void 0,{name:K.value}),confirmLabel:D("backend::lang.form.delete"),danger:!0}))){m.value=!0;try{const te=await Re.DELETE("/{vendor}/{plugin}/{controller}/{id}",{params:{path:{...a,id:s}}});if(te.data){Be(Fe(i.value.messages.deleted,void 0,{name:K.value})),await Ce(l);return}Be(te.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{m.value=!1}}}async function B(){return w||!ae.value?!0:y.ask({message:D("backend::lang.form.unsaved_confirm"),confirmLabel:D("backend::lang.form.discard"),danger:!0})}Wb(B),Kb(B);function G(q){ae.value&&(q.preventDefault(),q.returnValue="")}return _t(()=>window.addEventListener("beforeunload",G)),Nt(()=>window.removeEventListener("beforeunload",G)),vn(()=>D_(p.value?"":re.value)),Nt(O_),se(),(q,te)=>(v(),S("section",MM,[P("header",TM,[W(lt,{variant:"outline","data-action":"back",to:u(l),"aria-label":u(D)("backend::lang.form.return_to_list"),class:"size-10! px-0!"},{default:F(()=>[W(u(Du),{size:18,"aria-hidden":"true"})]),_:1},8,["to","aria-label"]),P("div",RM,[P("h1",qM,I(p.value?"":re.value),1),U.value?(v(),S("p",IM,I(U.value),1)):le("",!0)]),E.value.length>0?(v(),H(Om,{key:0,modelValue:g.value,"onUpdate:modelValue":te[0]||(te[0]=ye=>g.value=ye),tabs:E.value,"id-prefix":Fr},null,8,["modelValue","tabs"])):le("",!0)]),h.value&&!p.value?(v(),S("p",FM,I(u(D)("backend::lang.form.load_failed")),1)):i.value?(v(),S(xe,{key:1},[W(Ol,{errors:f.value,"field-names":b.value},null,8,["errors","field-names"]),P("form",{id:E.value.length>0?u(_c)(Fr,V.value):void 0,role:E.value.length>0?"tabpanel":void 0,"aria-labelledby":E.value.length>0?u(Ro)(Fr,V.value):void 0,class:"rounded-card border border-border bg-surface p-7 shadow-card",novalidate:"",onSubmit:ht(ue,["prevent"])},[W(Tl,{fields:T.value,values:c.value,errors:f.value,labels:d.value,source:a,"record-id":u(s),"id-prefix":Fr,onUpdate:ne},null,8,["fields","values","errors","labels","record-id"])],40,BM)],64)):le("",!0),P("footer",NM,[u(o)==="update"?(v(),H(lt,{key:0,variant:"danger","data-action":"delete",icon:u(wl),disabled:m.value||p.value||!i.value,onClick:ce},{default:F(()=>[we(I(u(D)("backend::lang.form.delete")),1)]),_:1},8,["icon","disabled"])):le("",!0),P("div",VM,[W(lt,{variant:"ghost","data-action":"cancel",to:u(l)},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1},8,["to"]),W(lt,{variant:"outline","data-action":"save-close",disabled:m.value||p.value||!i.value,onClick:Te},{default:F(()=>[we(I(u(D)("backend::lang.form.save_and_close")),1)]),_:1},8,["disabled"]),W(lt,{variant:"primary","data-action":"save",disabled:m.value||p.value||!i.value,onClick:ue},{default:F(()=>[we(I(m.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.form.save")),1)]),_:1},8,["disabled"])])]),W(Cr,{open:u(y).request.value!==null,message:u(y).request.value?.message??"","confirm-label":u(y).request.value?.confirmLabel,danger:u(y).request.value?.danger,onConfirm:u(y).confirm,onCancel:u(y).cancel},null,8,["open","message","confirm-label","danger","onConfirm","onCancel"])]))}}),LM={class:"flex w-full flex-col gap-5 pb-24"},jM={class:"flex items-center gap-4"},UM={class:"flex min-w-0 flex-col"},zM={class:"truncate text-[24px] font-bold tracking-[-0.02em]"},HM={key:0,class:"text-muted"},WM={key:0,role:"alert",class:"rounded-inner bg-danger-soft px-[18px] py-3.5 text-danger"},KM={class:"fixed inset-x-0 bottom-0 z-30 flex items-center justify-end gap-2.5 border-t border-border bg-surface px-8 py-3.5"},Vf="setting",GM=Z({__name:"SettingsFormView",setup(e){const t=_n(),n=String(t.params.code??""),a=M(null),r=M({}),l=M({}),o=M(!0),s=M(!1),i=M(!1),c=k(()=>(a.value?.fields??[]).filter(g=>xc(g,"update"))),d=k(()=>c.value.map(g=>g.name)),f=k(()=>zi(n)?.label||a.value?.name||n),p=k(()=>zi(n)?.description??"");async function h(){const g={path:{code:n}},[y,w]=await Promise.all([Re.GET("/settings/{code}/schema",{params:g}),Re.GET("/settings/{code}",{params:g})]);a.value=y.data?.data??null,r.value={...w.data?.data.data??{}},s.value=!y.data||!w.data,o.value=!1}function m(g,y){if(r.value={...r.value,[g]:y},l.value[g]){const w={...l.value};delete w[g],l.value=w}}async function x(){if(!(i.value||!a.value)){i.value=!0;try{const g=await Re.PUT("/settings/{code}",{params:{path:{code:n}},body:zt(c.value,r.value)});if(g.data){l.value={},r.value={...g.data.data.data},Be(D("backend::lang.settings.saved"));return}if(g.response.status===422){l.value=Pl(g.error?.error.details);const y=c.value.find(w=>l.value[w.name]);await Ue(),y&&Ml(Vf,y.name);return}Be(g.error?.error.message||D("backend::lang.form.error_generic"),"danger")}catch{Be(D("backend::lang.form.error_generic"),"danger")}finally{i.value=!1}}}return h(),(g,y)=>(v(),S("section",LM,[P("header",jM,[W(lt,{variant:"outline","data-action":"back",to:"/settings","aria-label":u(D)("backend::lang.settings.back"),class:"size-10! px-0!"},{default:F(()=>[W(u(Du),{size:18,"aria-hidden":"true"})]),_:1},8,["aria-label"]),P("div",UM,[P("h1",zM,I(f.value),1),p.value?(v(),S("p",HM,I(p.value),1)):le("",!0)])]),s.value&&!o.value?(v(),S("p",WM,I(u(D)("backend::lang.form.load_failed")),1)):a.value?(v(),S(xe,{key:1},[W(Ol,{errors:l.value,"field-names":d.value},null,8,["errors","field-names"]),P("form",{class:"rounded-card border border-border bg-surface p-7 shadow-card",novalidate:"",onSubmit:ht(x,["prevent"])},[W(Tl,{fields:c.value,values:r.value,errors:l.value,source:null,"id-prefix":Vf,onUpdate:m},null,8,["fields","values","errors"])],32)],64)):le("",!0),P("footer",KM,[W(lt,{variant:"ghost",to:"/settings"},{default:F(()=>[we(I(u(D)("backend::lang.form.cancel")),1)]),_:1}),W(lt,{variant:"primary","data-action":"save",disabled:i.value||o.value||!a.value,onClick:x},{default:F(()=>[we(I(i.value?u(D)("backend::lang.form.saving"):u(D)("backend::lang.form.save")),1)]),_:1},8,["disabled"])])]))}}),YM={class:"flex flex-col gap-5"},JM={class:"text-[26px] font-bold tracking-[-0.02em]"},ZM={key:0,class:"text-muted"},QM={key:0,class:"text-[13px] font-semibold tracking-[0.02em] text-muted uppercase"},XM={class:"grid grid-cols-1 gap-3 min-[900px]:grid-cols-2"},e4={class:"flex size-10 shrink-0 items-center justify-center rounded-inner bg-subtle text-muted"},t4={class:"flex min-w-0 flex-col"},n4={class:"font-semibold"},a4={key:0,class:"text-[13px] text-muted"},r4=Z({__name:"SettingsIndexView",setup(e){return(t,n)=>(v(),S("section",YM,[P("header",null,[P("h1",JM,I(u(D)("backend::lang.settings.title")),1)]),u(Ld).length===0?(v(),S("p",ZM,I(u(D)("backend::lang.settings.empty")),1)):le("",!0),(v(!0),S(xe,null,Ve(u(Ld),a=>(v(),S("section",{key:a.category,"data-settings-group":"",class:"flex flex-col gap-3"},[a.category?(v(),S("h2",QM,I(a.category),1)):le("",!0),P("div",XM,[(v(!0),S(xe,null,Ve(a.entries,r=>(v(),H(u(Nn),{key:r.code,to:`/settings/${encodeURIComponent(r.code)}`,"data-settings":r.code,class:"flex items-start gap-3.5 rounded-card border border-border bg-surface p-5 text-text no-underline shadow-card hover:bg-hover"},{default:F(()=>[P("span",e4,[(v(),H(Bn(u(ss)(r.icon)),{size:20,"aria-hidden":"true"}))]),P("span",t4,[P("span",n4,I(r.label),1),r.description?(v(),S("span",a4,I(r.description),1)):le("",!0)])]),_:2},1032,["to","data-settings"]))),128))])]))),128))]))}}),l4={class:"flex flex-col items-center gap-2 py-20 text-center"},o4={class:"text-[17px] font-bold"},Lf=Z({__name:"NotFoundView",props:{home:{type:Boolean}},setup(e){return(t,n)=>(v(),S("section",l4,[P("h1",o4,I(e.home?u(D)("backend::lang.nav.empty"):u(D)("backend::lang.page.not_found")),1)]))}});function Tm(e){return typeof e!="string"||e.length===0||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\")?null:e}const s4=new Set(["list","create","record"]);function i4(e){if(typeof e.name!="string"||!s4.has(e.name))return"";const{vendor:t,plugin:n,controller:a}=e.params;return typeof t!="string"||typeof n!="string"||typeof a!="string"?"":qu({vendor:t,plugin:n,controller:a})}function u4(e=Qb(ls.base)){const t=y1({history:e,routes:[{path:"/login",name:"login",component:lE,meta:{public:!0}},{path:"/",name:"home",component:Lf,props:{home:!0},meta:{shell:!0},beforeEnter:()=>u_()??!0},{path:"/settings",name:"settings",component:r4,meta:{shell:!0}},{path:"/settings/:code",name:"settings-form",component:GM,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller",name:"list",component:G3,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller/create",name:"create",component:Nf,meta:{shell:!0}},{path:"/:vendor/:plugin/:controller/:id(\\d+)",name:"record",component:Nf,meta:{shell:!0}},{path:"/:pathMatch(.*)*",name:"not-found",component:Lf,meta:{shell:!0}}]});return t.beforeEach(n=>{const a=Ja.value!==null;return n.meta.public?a&&n.name==="login"?Tm(n.query.redirect)??"/":!0:a?!0:{name:"login",query:{redirect:n.fullPath}}}),t.afterEach((n,a,r)=>{r||WS(i4(n))}),t}const c4="(prefers-color-scheme: dark)";function d4(e=window){const t=e.document.documentElement;if(typeof e.matchMedia!="function")return t.classList.remove("dark"),()=>{};const n=e.matchMedia(c4),a=l=>{t.classList.toggle("dark",l)};a(n.matches);const r=l=>a(l.matches);return n.addEventListener("change",r),()=>n.removeEventListener("change",r)}async function f4(){d4(),await r_().catch(()=>{}),await dm().catch(()=>null)&&await Promise.all([Vh().catch(()=>[]),Lh().catch(()=>[])]);const t=u4();Q0(()=>{fm();const a=t.currentRoute.value;a.name!=="login"&&t.push({name:"login",query:{redirect:a.fullPath}})});const n=pb(jS);n.use(t),await t.isReady(),n.mount("#app")}f4(); diff --git a/modules/boardwalk/dist/index.html b/modules/boardwalk/dist/index.html index db5dadd..7db68f0 100644 --- a/modules/boardwalk/dist/index.html +++ b/modules/boardwalk/dist/index.html @@ -6,7 +6,7 @@ SummerCMS - +