@fieldia/viewer 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +10 -1
  2. package/bundle/fieldia.js +4 -607
  3. package/bundle/fieldia.js.map +4 -4
  4. package/package.json +3 -3
  5. package/src/lib/custom-filter.d.mts +16 -0
  6. package/src/lib/custom-filter.d.ts +16 -0
  7. package/src/lib/custom-filter.js +112 -0
  8. package/src/lib/custom-filter.js.map +1 -0
  9. package/src/lib/custom-filter.mjs +109 -0
  10. package/src/lib/custom-filter.mjs.map +1 -0
  11. package/src/lib/dom.d.mts +2 -0
  12. package/src/lib/dom.d.ts +2 -0
  13. package/src/lib/dom.js +3 -0
  14. package/src/lib/dom.js.map +1 -0
  15. package/src/lib/dom.mjs +2 -0
  16. package/src/lib/dom.mjs.map +1 -0
  17. package/src/lib/favourites.d.mts +32 -0
  18. package/src/lib/favourites.d.ts +32 -0
  19. package/src/lib/favourites.js +74 -0
  20. package/src/lib/favourites.js.map +1 -0
  21. package/src/lib/favourites.mjs +69 -0
  22. package/src/lib/favourites.mjs.map +1 -0
  23. package/src/lib/labels.d.mts +46 -0
  24. package/src/lib/labels.d.ts +46 -0
  25. package/src/lib/labels.js +156 -0
  26. package/src/lib/labels.js.map +1 -1
  27. package/src/lib/labels.mjs +156 -0
  28. package/src/lib/labels.mjs.map +1 -1
  29. package/src/lib/list-groups.d.mts +29 -0
  30. package/src/lib/list-groups.d.ts +29 -0
  31. package/src/lib/list-groups.js +86 -0
  32. package/src/lib/list-groups.js.map +1 -0
  33. package/src/lib/list-groups.mjs +83 -0
  34. package/src/lib/list-groups.mjs.map +1 -0
  35. package/src/lib/list-styles.d.mts +4 -0
  36. package/src/lib/list-styles.d.ts +4 -0
  37. package/src/lib/list-styles.js +108 -0
  38. package/src/lib/list-styles.js.map +1 -0
  39. package/src/lib/list-styles.mjs +104 -0
  40. package/src/lib/list-styles.mjs.map +1 -0
  41. package/src/lib/list.d.mts +34 -0
  42. package/src/lib/list.d.ts +34 -0
  43. package/src/lib/list.js +282 -0
  44. package/src/lib/list.js.map +1 -0
  45. package/src/lib/list.mjs +279 -0
  46. package/src/lib/list.mjs.map +1 -0
  47. package/src/lib/search-bar.d.mts +30 -0
  48. package/src/lib/search-bar.d.ts +30 -0
  49. package/src/lib/search-bar.js +205 -0
  50. package/src/lib/search-bar.js.map +1 -0
  51. package/src/lib/search-bar.mjs +201 -0
  52. package/src/lib/search-bar.mjs.map +1 -0
  53. package/src/lib/viewer.d.mts +3 -1
  54. package/src/lib/viewer.d.ts +3 -1
  55. package/src/lib/viewer.js +29 -1
  56. package/src/lib/viewer.js.map +1 -1
  57. package/src/lib/viewer.mjs +29 -1
  58. package/src/lib/viewer.mjs.map +1 -1
package/bundle/fieldia.js CHANGED
@@ -1,608 +1,5 @@
1
- /*! Fieldia 0.7.0 · MIT · https://fieldia.dev */
2
- "use strict";var Fieldia=(()=>{var tt=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var zn=Object.getOwnPropertyNames;var jn=Object.prototype.hasOwnProperty;var Hn=(e,t,n)=>t in e?tt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Bn=(e,t)=>{for(var n in t)tt(e,n,{get:t[n],enumerable:!0})},qn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of zn(t))!jn.call(e,a)&&a!==n&&tt(e,a,{get:()=>t[a],enumerable:!(r=Wn(t,a))||r.enumerable});return e};var Jn=e=>qn(tt({},"__esModule",{value:!0}),e);var Ve=(e,t,n)=>Hn(e,typeof t!="symbol"?t+"":t,n);var jr={};Bn(jr,{DEFAULT_LABELS:()=>On,FIELDIA_CSS:()=>Mn,FIELD_NAME:()=>Zt,FIELD_TYPES:()=>nt,FORMAT_VERSION:()=>it,ICONS:()=>Cn,MESSAGES:()=>Te,VERSION:()=>zr,VIEWER_LABELS:()=>Ce,WIDGET_LABELS:()=>de,binaryWidget:()=>It,browserPreferences:()=>Ut,builtInWidgets:()=>Nn,charTagsWidget:()=>Tt,checkPage:()=>st,checkValue:()=>He,compileModifier:()=>Ae,createForm:()=>pt,createMemoryDataSource:()=>sn,createWidget:()=>ke,displayValue:()=>Vt,drawIcon:()=>et,emptyValue:()=>_e,evaluateModifier:()=>en,expressionContext:()=>Ke,fill:()=>lt,formatBytes:()=>Ye,formatNumber:()=>Pe,hostScheduler:()=>Ge,htmlWidget:()=>Ht,imageWidget:()=>Dt,initialValues:()=>ze,installStyles:()=>Jt,isEmpty:()=>je,isModifierValid:()=>tn,isoWeek:()=>wn,jsonWidget:()=>Bt,kindTextField:()=>mn,labelWidget:()=>Xe,lineForm:()=>gn,lineKind:()=>Me,linesWidget:()=>Ot,linkAddress:()=>Sn,linkCheckboxesWidget:()=>Ct,many2oneWidget:()=>Mt,matchesFilter:()=>ut,memoryPreferences:()=>Tr,mountViewer:()=>Kt,normalizeNumber:()=>At,openFormDialog:()=>St,openSearchDialog:()=>_t,progressbarWidget:()=>Ze,propertiesWidget:()=>zt,referenceWidget:()=>$t,sanitizeHtml:()=>jt,saveProblemOf:()=>ct,saveRefused:()=>on,statusbarWidget:()=>yt,summary:()=>ht,tagsWidget:()=>bt,translatePage:()=>dt,wait:()=>ft,wideColumns:()=>rt,withCalendar:()=>xt});var Zt=/^[A-Za-z_][A-Za-z0-9_]*$/,nt=["char","text","html","integer","float","monetary","boolean","date","datetime","selection","binary","image","many2one","many2many","one2many","reference","properties","json"];function rt(e){return typeof e=="object"?e.wide:e??1}var it="0.1";function Oe(e,t){switch(e.type){case"BinaryOp":return Un(e,t);case"UnaryOp":return _n(e,t);case"Literal":return e.value;case"Identifier":return Kn(t,e.name);default:throw new Error(`Unknown AST node type: ${e.type}`)}}function Un(e,t){let n=Xt(Oe(e.left,t)),r=Xt(Oe(e.right,t)),a=e.operator.toLowerCase(),i=n!==null&&r!==null;switch(a){case"==":return n===r;case"!=":case"<>":return n!==r;case"<":return i&&n<r;case">":return i&&n>r;case"<=":return i&&n<=r;case">=":return i&&n>=r;case"in":return Array.isArray(r)&&r.includes(n);case"not in":return Array.isArray(r)&&!r.includes(n);case"and":return Ee(n)&&Ee(r);case"or":return Ee(n)||Ee(r);default:throw new Error(`Unknown binary operator: ${e.operator}`)}}function _n(e,t){let n=Oe(e.operand,t);if(e.operator.toLowerCase()==="not")return!Ee(n);throw new Error(`Unknown unary operator: ${e.operator}`)}function Xt(e){return e===void 0?null:e}function Ee(e){return Array.isArray(e)?e.length>0:e!==null&&typeof e=="object"?Object.keys(e).length>0:!!e}function Kn(e,t){let n=t.split("."),r=e;for(let a of n){if(r==null)return;r=r[a]}return r}var Rt=new Map([["True",!0],["False",!1],["None",null],["true",!0],["false",!1],["null",null]]);function Je(e){let t=[];if(!e)return t;let n=/(\(|\)|==|!=|<=|>=|<>|<|>|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"|-?\d+\.?\d*|\w+(?:\.\w+)*)/iy,r=/\s*/y,a=0;for(;;){if(r.lastIndex=a,r.exec(e),a=r.lastIndex,a>=e.length)return t;n.lastIndex=a;let i=n.exec(e);if(!i)throw new Error(`Unexpected "${e[a]}" at character ${a+1} of: ${e}`);t.push({type:Yn(i[0]),value:i[0],position:t.length}),a=n.lastIndex}}function Yn(e){let t=e.toLowerCase().trim();return Rt.has(e)?"CONSTANT":t==="and"||t==="or"||t==="not"?"LOGICAL":["==","!=","<>","<",">","<=",">="].includes(e)||t==="in"||t==="not in"?"OPERATOR":e==="("||e===")"?"PAREN":e.startsWith("[")?"LIST":e.startsWith("'")||e.startsWith('"')?"STRING":/^-?\d+\.?\d*$/.test(e)?"NUMBER":"IDENTIFIER"}var Ie=class{constructor(t){Ve(this,"tokens");Ve(this,"position",0);this.tokens=t}parse(){if(this.tokens.length===0)throw new Error("Cannot parse empty expression");let t=this.parseOr();if(!this.isAtEnd())throw new Error(`Unexpected token at position ${this.position}: ${this.peek()?.value}`);return t}parseOr(){let t=this.parseAnd();for(;this.matchLogical("or");){let n=this.previous().value,r=this.parseAnd();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:r}}return t}parseAnd(){let t=this.parseNot();for(;this.matchLogical("and");){let n=this.previous().value,r=this.parseNot();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:r}}return t}parseNot(){if(this.matchLogical("not")){let t=this.previous().value,n=this.parseComparison();return{type:"UnaryOp",operator:t.toLowerCase(),operand:n}}return this.parseComparison()}parseComparison(){let t=this.parseValue(),n=["==","!=","<>","<",">","<=",">=","in","not in"];if(this.matchOperator(...n)){let r=this.previous().value,a=this.parseValue();return{type:"BinaryOp",operator:r.toLowerCase(),left:t,right:a}}return t}parseValue(){if(this.match("PAREN","(")){let t=this.parseOr();return this.consume("PAREN",")","Expected closing parenthesis"),t}if(this.check("STRING"))return{type:"Literal",value:this.advance().value.slice(1,-1)};if(this.check("CONSTANT")){let t=this.advance();return{type:"Literal",value:Rt.get(t.value)??null}}if(this.check("NUMBER")){let t=this.advance();return{type:"Literal",value:Number(t.value)}}if(this.check("LIST")){let t=this.advance();return{type:"Literal",value:Gn(t.value)}}if(this.check("IDENTIFIER"))return{type:"Identifier",name:this.advance().value};throw new Error(`Unexpected token: ${this.peek()?.value||"EOF"}`)}match(t,...n){if(this.check(t)){if(n.length===0)return this.advance(),!0;let r=this.peek();if(r&&n.includes(r.value))return this.advance(),!0}return!1}matchLogical(...t){let n=this.peek();if(n&&n.type==="LOGICAL"){let r=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(r))return this.advance(),!0}return!1}matchOperator(...t){let n=this.peek();if(n&&n.type==="OPERATOR"){let r=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(r))return this.advance(),!0}return!1}check(t){return this.peek()?.type===t}advance(){return this.isAtEnd()||this.position++,this.previous()}peek(){return this.isAtEnd()?null:this.tokens[this.position]}previous(){return this.tokens[this.position-1]}isAtEnd(){return this.position>=this.tokens.length}consume(t,n,r){if(this.check(t)){let a=this.peek();if(a&&a.value===n)return this.advance()}throw new Error(r)}};function Gn(e){try{let t=e.slice(1,-1).trim();if(!t)return[];let n=[],r="",a=!1,i="";for(let o=0;o<t.length;o++){let d=t[o];(d==="'"||d==='"')&&(o===0||t[o-1]!=="\\")&&(a?d===i&&(a=!1,i=""):(a=!0,i=d)),d===","&&!a?(n.push(Qt(r.trim())),r=""):r+=d}return r.trim()&&n.push(Qt(r.trim())),n}catch(t){throw new Error(`Cannot read the list ${e}`,{cause:t})}}function Qt(e){return e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):isNaN(Number(e))?e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e:Number(e)}function Ae(e){if(typeof e!="string"){let n=e===!0;return{source:e,fields:[],evaluate:()=>n}}let t=new Ie(Je(e)).parse();return{source:e,fields:Zn(t),evaluate(n){try{return Ee(Oe(t,n))}catch{return!1}}}}function Zn(e){let t=[],n=r=>{switch(r.type){case"Identifier":{let a=r.name.split(".")[0];t.includes(a)||t.push(a);return}case"BinaryOp":n(r.left),n(r.right);return;case"UnaryOp":n(r.operand);return;default:return}};return n(e),t}var at=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),ot=class{constructor(t){Ve(this,"page",t);Ve(this,"issues",[]);Ve(this,"ids",new Map)}run(){return this.checkFields(this.page.fields,"fields"),this.walkRoot(this.page.layout,"layout"),this.issues}report(t,n){this.issues.push({path:t,message:n})}claim(t,n){let r=this.ids.get(t);r!==void 0?this.report(n,`duplicate id "${t}", also used at ${r}`):this.ids.set(t,n)}need(t,n,r=this.page.fields){if(at(r,t))return r[t];this.report(n,`no field "${t}"`)}checkModifiers(t,n,r=["invisible"]){for(let a of r){let i=t[a];if(typeof i!="string")continue;let o;try{o=Ae(i).fields}catch(d){this.report(`${n}.${a}`,`cannot read "${i}": ${d.message}`);continue}for(let d of o)at(this.page.fields,d)||this.report(`${n}.${a}`,`"${i}" reads "${d}", which is not a field of this page`)}}checkFields(t,n){for(let[r,a]of Object.entries(t)){let i=`${n}.${r}`;if(a.type==="monetary"&&a.currencyField!==void 0){let o=this.need(a.currencyField,`${i}.currencyField`,t);o&&!["many2one","selection","char"].includes(o.type)&&this.report(`${i}.currencyField`,`"${a.currencyField}" is a ${o.type}; a currency field must be a many2one, selection or char`)}if((a.type==="many2one"||a.type==="many2many")&&a.filter){let o=(d,s)=>{if("any"in d)return d.any.forEach((l,p)=>o(l,`${s}.any[${p}]`));if("all"in d)return d.all.forEach((l,p)=>o(l,`${s}.all[${p}]`));d.valueFrom!==void 0&&this.need(d.valueFrom,`${s}.valueFrom`,t)};a.filter.forEach((d,s)=>{o(d,`${i}.filter[${s}]`)})}if(a.type==="properties"&&a.definitions){let o=new Set;a.definitions.forEach((d,s)=>{d.type==="selection"&&!d.options&&this.report(`${i}.definitions[${s}].options`,"a choice property needs its choices"),o.has(d.name)&&this.report(`${i}.definitions[${s}].name`,`"${d.name}" is named twice`),o.add(d.name)})}if(a.type==="one2many"&&(this.checkFields(a.fields,`${i}.fields`),a.lineKinds&&this.checkLineKinds(r,a.lineKinds,a.fields,`${i}.lineKinds`),a.sequenceField!==void 0)){let o=a.fields[a.sequenceField];o?o.type!=="integer"&&this.report(`${i}.sequenceField`,`"${a.sequenceField}" is a ${o.type}; the field that keeps the order of lines must be an integer`):this.report(`${i}.sequenceField`,`"${a.sequenceField}" is not a field of the lines of "${r}"`)}}}checkLineKinds(t,n,r,a){let i=r[n.field];if(!i)this.report(`${a}.field`,`"${n.field}" is not a field of the lines of "${t}"`);else if(i.type!=="selection"&&i.type!=="char")this.report(`${a}.field`,`"${n.field}" is a ${i.type}; the field that says what a line is must be a selection or char`);else if(i.type==="selection")for(let d of["section","note"]){let s=n[d]??d;i.options.some(l=>l.value===s)||this.report(`${a}.${d}`,`"${n.field}" has no option "${s}"`)}let o=r[n.text];o?o.type!=="char"&&o.type!=="text"&&this.report(`${a}.text`,`"${n.text}" is a ${o.type}; a section's or note's text must be a char or text field`):this.report(`${a}.text`,`"${n.text}" is not a field of the lines of "${t}"`)}walkRoot(t,n){if(t.type==="tabs")return this.walkNode(t,n);if(this.claim(t.id,n),t.type==="sheet")return this.walkSheet(t,n);if(t.type==="sections")return this.walkChildren(t.children,n);t.children.forEach((r,a)=>{let i=`${n}.children[${a}]`;this.claim(r.id,i),this.checkModifiers(r,i),this.walkChildren(r.children,i)})}walkChildren(t,n){t.forEach((r,a)=>this.walkNode(r,`${n}.children[${a}]`))}walkNode(t,n){switch(this.claim(t.id,n),this.checkModifiers(t,n,t.type==="field"?["invisible","readonly","required"]:t.type==="section"?["invisible","readonly"]:["invisible"]),t.type){case"field":return this.checkFieldNode(t,n);case"section":return t.collapsible&&!t.title&&this.report(n,"a collapsible section needs a title to fold it by"),t.collapsed&&!t.collapsible&&this.report(n,"collapsed needs collapsible: true"),this.walkChildren(t.children,n);case"tabs":return this.walkTabs(t,n);default:return}}walkTabs(t,n){t.children.forEach((r,a)=>{let i=`${n}.children[${a}]`;this.claim(r.id,i),this.checkModifiers(r,i),this.walkChildren(r.children,i)})}walkSheet(t,n){if(t.title&&(this.need(t.title.field,`${n}.title.field`),t.title.subtitleField!==void 0&&this.need(t.title.subtitleField,`${n}.title.subtitleField`),t.title.avatarField!==void 0&&this.need(t.title.avatarField,`${n}.title.avatarField`)),t.statusbar){let{field:r,visibleStates:a}=t.statusbar,i=this.need(r,`${n}.statusbar.field`);if(i&&i.type!=="selection"&&i.type!=="many2one"&&this.report(`${n}.statusbar.field`,`"${r}" is a ${i.type}; a statusbar needs a selection or many2one`),i?.type==="selection"&&a){let o=new Set(i.options.map(d=>d.value));a.forEach((d,s)=>{o.has(d)||this.report(`${n}.statusbar.visibleStates[${s}]`,`"${d}" is not an option of "${r}"`)})}}t.buttons?.forEach((r,a)=>{this.claim(r.id,`${n}.buttons[${a}]`),this.checkModifiers(r,`${n}.buttons[${a}]`)}),t.statButtons?.forEach((r,a)=>{this.claim(r.id,`${n}.statButtons[${a}]`),this.checkModifiers(r,`${n}.statButtons[${a}]`),r.field!==void 0&&this.need(r.field,`${n}.statButtons[${a}].field`)}),t.ribbon&&(this.claim(t.ribbon.id,`${n}.ribbon`),this.checkModifiers(t.ribbon,`${n}.ribbon`)),t.badges?.forEach((r,a)=>{this.claim(r.id,`${n}.badges[${a}]`),this.checkModifiers(r,`${n}.badges[${a}]`)});for(let r of["above","below"])t.title?.[r]?.forEach((a,i)=>this.walkNode(a,`${n}.title.${r}[${i}]`));t.alerts?.forEach((r,a)=>{this.claim(r.id,`${n}.alerts[${a}]`),this.checkModifiers(r,`${n}.alerts[${a}]`)}),this.walkChildren(t.children,n),t.sidePanel&&(this.claim(t.sidePanel.id,`${n}.sidePanel`),this.checkModifiers(t.sidePanel,`${n}.sidePanel`))}checkFieldNode(t,n){let r=this.need(t.field,`${n}.field`);r&&t.totals&&(r.type!=="one2many"?this.report(`${n}.totals`,`totals only apply to one2many fields; "${t.field}" is a ${r.type}`):t.totals.forEach((a,i)=>{let o=at(r.fields,a)?r.fields[a]:void 0;o?["integer","float","monetary"].includes(o.type)||this.report(`${n}.totals[${i}]`,`"${a}" is a ${o.type}; only integer, float and monetary columns add up`):this.report(`${n}.totals[${i}]`,`"${a}" is not a field of the lines of "${t.field}"`)}));for(let[a,i]of Object.entries(t.options??{}))a.endsWith("Field")&&typeof i=="string"&&this.need(i,`${n}.options.${a}`);if(r&&t.editMode&&r.type!=="one2many"&&this.report(`${n}.editMode`,`editMode only applies to one2many fields; "${t.field}" is a ${r.type}`),r&&t.optionalColumns)if(r.type!=="one2many")this.report(`${n}.optionalColumns`,`optional columns only apply to one2many fields; "${t.field}" is a ${r.type}`);else{let a=t.columns??Object.keys(r.fields).filter(i=>i!==r.lineKinds?.field&&i!==r.sequenceField);for(let i of Object.keys(t.optionalColumns))a.includes(i)||this.report(`${n}.optionalColumns.${i}`,`"${i}" is not a column of "${t.field}"`)}!r||!t.columns||(r.type==="one2many"?t.columns.forEach((a,i)=>{at(r.fields,a)||this.report(`${n}.columns[${i}]`,`"${a}" is not a field of the lines of "${t.field}"`)}):r.type!=="many2many"&&this.report(`${n}.columns`,`columns only apply to one2many and many2many fields; "${t.field}" is a ${r.type}`))}};var Ue=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Xn=["sheet","sections","tabs","wizard"];function st(e){if(!Ue(e))return{ok:!1,issues:[{path:"(page)",message:"a page is a JSON object"}]};let t=[],n=(d,s)=>t.push({path:d,message:s});e.fieldia!=="0.1"&&n("fieldia",`this build reads format ${"0.1"}`),(typeof e.id!="string"||!e.id)&&n("id","a page needs an id");let r=e.data;(!Ue(r)||!(r.kind==="responses"||r.kind==="record"&&typeof r.model=="string"&&r.model))&&n("data",'data is { "kind": "record", "model": \u2026 } or { "kind": "responses" }');let a=e.fields;if(!Ue(a))n("fields","fields is an object of field definitions, by name");else for(let[d,s]of Object.entries(a))(!Ue(s)||!nt.includes(s.type)||typeof s.label!="string")&&n(`fields.${d}`,"a field needs a type Fieldia knows and a label");let i=e.layout;if((!Ue(i)||!Xn.includes(i.type)||!Array.isArray(i.children))&&n("layout","the layout is a sheet, sections, tabs or wizard, with children"),t.length)return{ok:!1,issues:t};let o=e;try{let d=new ot(o).run();return d.length?{ok:!1,issues:d}:{ok:!0,page:o}}catch(d){return{ok:!1,issues:[{path:"(page)",message:`a part of this page cannot be read: ${d.message}`}]}}}var Qn=new Set(["title","description","label","help","placeholder","message","text","confirm","nextLabel","backLabel","finishLabel"]),er=new Set(["lineKinds","filter","default","data"]);function dt(e,t){let n=(r,a)=>{if(typeof r=="string")return a!==null&&Qn.has(a)?t(r):r;if(Array.isArray(r))return r.map(o=>n(o,null));if(r===null||typeof r!="object")return r;let i={};for(let[o,d]of Object.entries(r)){let s=o==="options"&&!Array.isArray(d);i[o]=er.has(o)||s?d:n(d,o)}return i};return n(e,null)}function en(e,t){if(e===void 0)return!1;if(typeof e=="boolean")return e;if(e==="1"||e==="True"||e==="true")return!0;if(e==="0"||e==="False"||e==="false"||e==="")return!1;try{let n=Je(e);if(n.length===0)return!1;let a=new Ie(n).parse(),i=Oe(a,t);return Ee(i)}catch{return!1}}function tn(e){if(e===void 0||typeof e=="boolean"||e==="")return!0;try{let t=Je(e);return t.length===0||new Ie(t).parse(),!0}catch{return!1}}function _e(e){switch(e.type){case"boolean":return!1;case"many2many":case"one2many":return[];case"selection":return e.multiple?[]:null;default:return null}}function ze(e){let t={};for(let[n,r]of Object.entries(e))t[n]=r.default!==void 0?ee(r.default):_e(r);return t}function je(e,t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:!1}function Ke(e,t){let n={};for(let[r,a]of Object.entries(e)){let i=t[r];n[r]=i?tr(i,a):a}return n}function tr(e,t){if(t==null)return null;switch(e.type){case"many2one":return t.id;case"many2many":return t.map(n=>n.id);case"one2many":return t.map(n=>n.key);case"reference":{let n=t;return`${n.model},${n.id}`}case"binary":case"image":return t.name;default:return t}}function Me(e,t){let n=e.lineKinds;if(!n)return null;let r=t[n.field];return r===(n.section??"section")?"section":r===(n.note??"note")?"note":null}function ee(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}var Te={en:{required:"{label} is required",maxLength:"Maximum {max} characters allowed",pattern:"{label} is not in the expected format",text:"{label} must be text",number:"{label} must be a number",integer:"{label} must be a whole number",min:"{label} must be at least {min}",max:"{label} must be at most {max}",decimals:"Maximum {digits} decimal places allowed",boolean:"{label} must be yes or no",dateFormat:"Invalid date format (expected YYYY-MM-DD)",dateInvalid:"Invalid date (check month/day values)",datetimeFormat:"Invalid date and time format (expected YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"Invalid date and time (check the values)",choice:"Must be one of: {options}",choices:"{label} must be a list of choices",record:"{label} must be a record",records:"{label} must be a list of records",reference:"{label} must point to {aModels}",file:"{label} must be a file",fileSize:"{label} is larger than {size}",fileType:"{label} must be {aTypes} file",or:"or"},ar:{required:"{label} \u0645\u0637\u0644\u0648\u0628",maxLength:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {max} \u062D\u0631\u0641\u064B\u0627",pattern:"\u0635\u064A\u063A\u0629 {label} \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629",text:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0635\u064B\u0627",number:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627",integer:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627 \u0635\u062D\u064A\u062D\u064B\u0627",min:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0642\u0644 {label} \u0639\u0646 {min}",max:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0632\u064A\u062F {label} \u0639\u0646 {max}",decimals:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {digits} \u0645\u0646\u0627\u0632\u0644 \u0639\u0634\u0631\u064A\u0629",boolean:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0639\u0645 \u0623\u0648 \u0644\u0627",dateFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DD)",dateInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0634\u0647\u0631 \u0648\u0627\u0644\u064A\u0648\u0645)",datetimeFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u064A\u0646",choice:"\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0642\u064A\u0645\u0629 \u0648\u0627\u062D\u062F\u0629 \u0645\u0646: {options}",choices:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0627\u062E\u062A\u064A\u0627\u0631\u0627\u062A",record:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0633\u062C\u0644\u064B\u0627",records:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0633\u062C\u0644\u0627\u062A",reference:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0634\u064A\u0631 {label} \u0625\u0644\u0649 {models}",file:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641\u064B\u0627",fileSize:"\u062D\u062C\u0645 {label} \u0623\u0643\u0628\u0631 \u0645\u0646 {size}",fileType:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641 {types}",or:"\u0623\u0648"},de:{required:"{label} ist erforderlich",maxLength:"Maximal {max} Zeichen erlaubt",pattern:"{label} hat nicht das erwartete Format",text:"{label} muss Text sein",number:"{label} muss eine Zahl sein",integer:"{label} muss eine ganze Zahl sein",min:"{label} muss mindestens {min} sein",max:"{label} darf h\xF6chstens {max} sein",decimals:"Maximal {digits} Nachkommastellen erlaubt",boolean:"{label} muss ja oder nein sein",dateFormat:"Ung\xFCltiges Datumsformat (erwartet JJJJ-MM-TT)",dateInvalid:"Ung\xFCltiges Datum (Monat und Tag pr\xFCfen)",datetimeFormat:"Ung\xFCltiges Datums- und Zeitformat (erwartet JJJJ-MM-TTTHH:MM:SS)",datetimeInvalid:"Ung\xFCltiges Datum oder ung\xFCltige Uhrzeit",choice:"Muss eines davon sein: {options}",choices:"{label} muss eine Liste von Optionen sein",record:"{label} muss ein Datensatz sein",records:"{label} muss eine Liste von Datens\xE4tzen sein",reference:"{label} muss auf {models} verweisen",file:"{label} muss eine Datei sein",fileSize:"{label} ist gr\xF6\xDFer als {size}",fileType:"{label} muss eine {types}-Datei sein",or:"oder"},fr:{required:"{label} est obligatoire",maxLength:"{max} caract\xE8res au maximum",pattern:"{label} n'a pas le format attendu",text:"{label} doit \xEAtre du texte",number:"{label} doit \xEAtre un nombre",integer:"{label} doit \xEAtre un nombre entier",min:"{label} doit \xEAtre au moins {min}",max:"{label} doit \xEAtre au plus {max}",decimals:"{digits} d\xE9cimales au maximum",boolean:"{label} doit \xEAtre oui ou non",dateFormat:"Format de date invalide (attendu AAAA-MM-JJ)",dateInvalid:"Date invalide (v\xE9rifiez le mois et le jour)",datetimeFormat:"Format de date et heure invalide (attendu AAAA-MM-JJTHH:MM:SS)",datetimeInvalid:"Date ou heure invalide",choice:"Doit \xEAtre parmi : {options}",choices:"{label} doit \xEAtre une liste de choix",record:"{label} doit \xEAtre un enregistrement",records:"{label} doit \xEAtre une liste d'enregistrements",reference:"{label} doit pointer vers {models}",file:"{label} doit \xEAtre un fichier",fileSize:"{label} d\xE9passe {size}",fileType:"{label} doit \xEAtre un fichier {types}",or:"ou"}};function lt(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>r in t?String(t[r]):n)}function He(e,t,n,r=Te.en){let a=e.label||"This field",i=(o,d={})=>lt(r[o],{label:a,...d});if(je(e,t))return n?i("required"):void 0;switch(e.type){case"char":case"text":case"html":return typeof t!="string"?i("text"):(e.type==="char"||e.type==="text")&&e.size!==void 0&&t.length>e.size?i("maxLength",{max:e.size}):e.type==="char"&&e.pattern!==void 0&&!new RegExp(e.pattern).test(t)?i("pattern"):void 0;case"integer":case"float":case"monetary":return typeof t!="number"||!Number.isFinite(t)?i("number"):e.type==="integer"&&!Number.isInteger(t)?i("integer"):e.min!==void 0&&t<e.min?i("min",{min:e.min}):e.max!==void 0&&t>e.max?i("max",{max:e.max}):e.type!=="integer"&&e.digits&&nr(t)>e.digits[1]?i("decimals",{digits:e.digits[1]}):void 0;case"boolean":return typeof t=="boolean"?void 0:i("boolean");case"date":return rr(t,i);case"datetime":return ar(t,i);case"selection":{let o=new Set(e.options.map(s=>s.value)),d=i("choice",{options:e.options.map(s=>s.label).join(", ")});return e.multiple?Array.isArray(t)?t.every(s=>o.has(s))?void 0:d:i("choices"):o.has(t)?void 0:d}case"many2one":return Ft(t)?void 0:i("record");case"many2many":return Array.isArray(t)&&t.every(Ft)?void 0:i("records");case"reference":{let o=t;if(!Ft(t)||typeof o.model!="string")return i("record");if(!e.models.some(d=>d.value===o.model)){let d=rn(e.models.map(s=>s.label),r.or);return i("reference",{models:d,aModels:an(d)})}return}case"binary":case"image":return or(e,t,i,r);default:return}}function nr(e){let t=String(e);if(t.includes("e-"))return Number(t.split("e-")[1]);let n=t.indexOf(".");return n===-1?0:t.length-n-1}function Ft(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&(typeof e.id=="number"||typeof e.id=="string")&&typeof e.label=="string"}function rr(e,t){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e))return t("dateFormat");let[n,r,a]=e.split("-").map(Number);return nn(n,r,a)?void 0:t("dateInvalid")}var ir=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:\d{2})?$/;function ar(e,t){let n=typeof e=="string"?ir.exec(e):null;if(!n)return t("datetimeFormat");let[r,a,i,o,d,s]=n.slice(1).map(l=>Number(l??0));return nn(r,a,i)&&o<24&&d<60&&s<60?void 0:t("datetimeInvalid")}function nn(e,t,n){if(t<1||t>12||n<1)return!1;let r=[31,e%4===0&&(e%100!==0||e%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];return n<=r[t-1]}function or(e,t,n,r){let a=t;if(!sr(t))return n("file");if("maxSize"in e&&e.maxSize!==void 0&&a.size>e.maxSize)return n("fileSize",{size:Ye(e.maxSize)});if(e.type==="binary"&&e.accept&&!e.accept.some(i=>dr(i,a.type))){let i=rn(e.accept.map(lr),r.or);return n("fileType",{types:i,aTypes:an(i)})}}function sr(e){let t=e;return e!==null&&typeof e=="object"&&typeof t.name=="string"&&typeof t.size=="number"}function dr(e,t){return e.endsWith("/*")?t.startsWith(e.slice(0,-1)):e===t}function lr(e){return e.endsWith("/*")?e.slice(0,-2):e==="application/pdf"?"PDF":(e.split("/")[1]??e).toUpperCase()}function rn(e,t){return e.length<=1?e.join(""):`${e.slice(0,-1).join(", ")} ${t} ${e[e.length-1]}`}function an(e){return/^[aeiou]/i.test(e)?`an ${e}`:`a ${e}`}function Ye(e){let t=["bytes","KB","MB","GB"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${Number(n.toFixed(1))} ${t[r]}`}function on(e){return Object.assign(new Error(e.message),{problem:e})}function ct(e){let t=e?.problem;if(t&&typeof t.kind=="string")return t;let n=e instanceof Error?e.message:String(e);return e instanceof TypeError&&/fetch|network|load failed/i.test(n)?{kind:"network",message:n}:{kind:"other",message:n}}function ut(e,t){return t.every(n=>Nt(e,n))}function Nt(e,t){return"any"in t?t.any.some(n=>Nt(e,n)):"all"in t?t.all.every(n=>Nt(e,n)):cr(e,t)}function De(e){return e!=null&&e!==""&&e!==!1&&!(Array.isArray(e)&&!e.length)}function cr(e,t){let n=e[t.field],r=n!==null&&typeof n=="object"&&!Array.isArray(n)&&"id"in n?n.id:n,a=t.value,i=String(r??"");switch(t.op){case"=":return r===a;case"!=":return r!==a;case"<":return De(r)&&r<a;case">":return De(r)&&r>a;case"<=":return De(r)&&r<=a;case">=":return De(r)&&r>=a;case"in":return Array.isArray(a)&&a.includes(r);case"not in":return Array.isArray(a)&&!a.includes(r);case"like":return i.includes(String(a));case"ilike":return i.toLowerCase().includes(String(a).toLowerCase());case"startswith":return i.toLowerCase().startsWith(String(a).toLowerCase());case"endswith":return i.toLowerCase().endsWith(String(a).toLowerCase());case"set":return De(n);case"notset":return!De(n);case"between":{if(!De(r)||!Array.isArray(a))return!1;let[o,d]=a;return r>=o&&r<=d}}}var Ge={setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)};function ft(e,t=Ge){return new Promise(n=>{t.setTimeout(n,e)})}function sn(e={}){let t=ee(e.records??{}),n=[],r=[],a=1e3,i=()=>e.delayMs?ft(e.delayMs,e.scheduler):Promise.resolve(),o=h=>t[h]??(t[h]={}),d=(h,g)=>{let f=o(h)[String(g)]?.[e.labelField?.[h]??"name"];return typeof f=="string"?f:String(g)},s=h=>Math.max(0,...Object.keys(o(h)).map(Number).filter(Number.isFinite))+1,l=h=>Number.isFinite(Number(h))?Number(h):h;function p(h,g){let f=[...h];for(let w of g)w.op==="create"?f.push({key:w.key,id:++a,values:ee(w.values)}):w.op==="update"?f=f.map(b=>b.id===w.id?{...b,values:{...b.values,...ee(w.values)}}:b):f=f.filter(b=>b.id!==w.id);return f}function y(h,g,f){let w=[...h],b=u=>({id:u,label:d(f,u)});for(let u of g)u.op==="link"&&!w.some(E=>E.id===u.id)?w.push(b(u.id)):u.op==="unlink"?w=w.filter(E=>E.id!==u.id):u.op==="set"?w=u.ids.map(b):u.op==="clear"&&(w=[]);return w}function v(h,g){let f=h[g];return f&&"relation"in f?f.relation:g}return{records:t,responses:n,calls:r,async load(h){r.push({method:"load",request:h}),await i();let g=o(h.model)[String(h.id)];if(!g)throw new Error(`No ${h.model} record with id ${h.id}`);return ee(g)},async save(h){r.push({method:"save",request:h}),await i();let g=h.id??s(h.model),f={...o(h.model)[String(g)]??{},...ee(h.changes.values)};for(let[w,b]of Object.entries(h.changes.lines))f[w]=p(f[w]??[],b);for(let[w,b]of Object.entries(h.changes.links))f[w]=y(f[w]??[],b,v(h.fields,w));return o(h.model)[String(g)]=f,{id:g,values:ee(f)}},async onchange(h){r.push({method:"onchange",request:h}),await i();let g=e.onchange?.[h.model]?.[h.changed],f=e.warnings?.[h.model]?.[h.changed],w=g?{values:g(ee(h.values))}:{},b=f?.(ee(h.values));return b?{...w,warning:b}:w},async search(h){r.push({method:"search",request:h}),await i();let g=h.query.trim().toLowerCase();return Object.entries(o(h.model)).filter(([,f])=>ut(f,h.filter??[])).map(([f])=>({id:l(f),label:d(h.model,l(f))})).filter(f=>f.label.toLowerCase().includes(g)).slice(0,h.limit??8)},async create(h){r.push({method:"create",request:h}),await i();let g=o(h.model),f=Object.keys(g).reduce((w,b)=>Math.max(w,Number(b)||0),0)+1;return g[String(f)]={name:h.name},{id:f,label:h.name}},async submit(h){return r.push({method:"submit",request:h}),await i(),n.push(ee(h)),{id:n.length}}}}function pt(e){let{page:t}=e,n=e.scheduler??Ge,r=e.messages??Te.en,a=pr(t.layout),i=t.layout.type==="wizard"?t.layout.children.map(m=>m.id):[],o=()=>`fieldia:draft:${t.id}:${s.recordId??"new"}`,d={...ze(t.fields),...ee(e.values??{})},s={status:e.recordId!=null?"idle":"ready",recordId:e.recordId??null,values:ee(d),errors:{},dirty:[],warning:null,warningField:null,error:null,draft:null,step:i[0]??null,skipped:[],saveProblem:null},l={},p=0,y=0,v=null,h=null,g=new Set,f=new Set,w=null;function b(m){s={...s,...m};for(let x of[...f])x(s)}function u(m){g.add(m);let x=()=>g.delete(m);return m.then(x,x),m}function E(){return w?.values!==s.values&&(w={values:s.values,context:Ke(s.values,t.fields)}),w.context}function k(m){let x=t.fields[m];if(!x)throw new Error(`The page has no field "${m}"`);return x}function F(m){return Object.keys(t.fields).filter(x=>JSON.stringify(m[x]??null)!==JSON.stringify(d[x]??null))}function O(m){let x=a.get(m);if(!x)throw new Error(`The page has no element "${m}"`);let L=E(),S=x.invisible.evaluate(L);for(let z=x.parent;!S&&z;z=a.get(z)?.parent??null)S=a.get(z)?.invisible.evaluate(L)??!1;let N=x.readonly.evaluate(L);for(let z=x.parent;!N&&z;z=a.get(z)?.parent??null)N=a.get(z)?.readonly.evaluate(L)??!1;let T=x.field?t.fields[x.field]:void 0;return{invisible:S,readonly:N||T?.readonly===!0,required:x.required.evaluate(L)||T?.required===!0}}function M(m){let x=S=>{if(!m)return!0;for(let N=S.id;N;N=a.get(N)?.parent??null)if(N===m)return!0;return!1},L=S=>{if(m||!s.skipped.length)return!1;for(let N=S.id;N;N=a.get(N)?.parent??null)if(s.skipped.includes(N))return!0;return!1};return[...a.values()].filter(S=>S.kind==="field"&&x(S)&&!L(S)&&!O(S.id).invisible)}function P(m){let x={};for(let L of M(m)){let S=L.field;if(x[S])continue;let N=t.fields[S],T=He(N,s.values[S],O(L.id).required,r);if(T&&(x[S]=T),N.type==="one2many")for(let z of s.values[S]??[]){let oe=Me(N,z.values);for(let[ae,ue]of Object.entries(N.fields)){if(oe&&ae!==N.lineKinds?.text)continue;let ne=He(ue,z.values[ae],ue.required===!0,r);ne&&(x[`${S}.${z.key}.${ae}`]=ne)}}}return x}function H(m,x={}){let L=Object.keys(s.errors).length?U(m):s.errors;b({values:m,dirty:F(m),errors:L,...x})}function U(m){let x=s;s={...s,values:m};let L=P(s.step??void 0);s=x;let S={};for(let N of Object.keys(s.errors))L[N]&&(S[N]=L[N]);for(let[N,T]of Object.entries(l))JSON.stringify(m[N]??null)===T.value?S[N]??(S[N]=T.message):delete l[N];return S}function re(){let m=e.drafts;m&&(v!==null&&n.clearTimeout(v),v=n.setTimeout(()=>{v=null,m.store.setItem(o(),JSON.stringify({savedAt:new Date().toISOString(),values:s.values}))},m.delayMs??400))}function J(){v!==null&&n.clearTimeout(v),v=null,e.drafts?.store.removeItem(o())}function _(){let m=e.drafts;if(!m)return;let x=m.store.getItem(o());if(!x)return;let L;try{L=JSON.parse(x)}catch{m.store.removeItem(o());return}m.restore==="auto"?H({...s.values,...L.values},{draft:null}):b({draft:{savedAt:L.savedAt}})}function te(){let m=e.autosave;!m||t.data.kind!=="record"||(h!==null&&n.clearTimeout(h),h=n.setTimeout(()=>{h=null,s.dirty.length&&Object.keys(P()).length===0&&u(X())},m.delayMs))}function Z(m){let x=e.dataSource;if(!x?.onchange||t.data.kind!=="record")return;let L=++y,S={model:t.data.model,id:s.recordId,changed:m,values:ee(s.values)};u(x.onchange(S).then(N=>{if(L!==y)return;let T={...s.values,...N.values??{}};H(T,{warning:N.warning??null,warningField:N.warning?m:null})},()=>{}))}function C(m){re(),te(),Z(m)}function $(){let m={values:{},lines:{},links:{}},x=s.recordId===null||s.recordId===void 0,L=x?Object.keys(t.fields).filter(S=>s.dirty.includes(S)||!je(t.fields[S],s.values[S])):s.dirty;for(let S of L){let N=t.fields[S],T=s.values[S],z=x?_e(N):d[S];N.type==="one2many"?m.lines[S]=ur(z??[],T??[]):N.type==="many2many"?m.links[S]=fr(z??[],T??[]):m.values[S]=ee(T)}return m}function W(){let m={};for(let x of M()){let L=x.field;m[L]=ee(s.values[L])}return m}async function X(){let m=P();if(Object.keys(m).length)return b({errors:m}),!1;let x=e.dataSource;l={},b({status:"saving",errors:{},error:null,saveProblem:null});try{if(t.data.kind==="responses"){if(!x?.submit)throw new Error("This page has no data source to send its answers to");return await x.submit({pageId:t.id,values:W()}),J(),b({status:"saved"}),!0}if(!x?.save)throw new Error("This page has no data source to save to");let L=await x.save({model:t.data.model,id:s.recordId,fields:t.fields,changes:$(),values:ee(s.values)});J();let S=L.values?{...s.values,...L.values}:s.values;return d=ee(S),b({status:"saved",recordId:L.id,values:S,dirty:[]}),!0}catch(L){let S=ct(L),N=S.kind==="fields"?S.fields??{}:{};return l=Object.fromEntries(Object.entries(N).map(([T,z])=>[T,{message:z,value:JSON.stringify(s.values[T]??null)}])),b({status:"error",error:S.message,saveProblem:S,errors:{...N}}),!1}}function Q(m){return!e.dataSource?.create||!m||m.readonly?null:m.type==="many2one"||m.type==="many2many"?m.relation:null}async function ce(m,x,L){let S=Q(m),N=e.dataSource;if(!S||!N?.create)throw new Error(`"${x}" cannot make records: its data source has no create, or it is not a link`);return u(N.create({model:S,name:L.trim()}))}async function fe(m,x,L,S,N,T){if(m.type!=="many2one"&&m.type!=="many2many"&&m.type!=="reference")throw new Error(`"${x}" is not a many2one, many2many or reference`);if(m.type==="reference"&&!T)throw new Error(`Searching "${x}" needs a model`);let z=e.dataSource;if(!z?.search)return[];let oe=ne=>"any"in ne?{any:ne.any.map(oe)}:"all"in ne?{all:ne.all.map(oe)}:{field:ne.field,op:ne.op,value:ne.valueFrom!==void 0?L[ne.valueFrom]??null:ne.value??null},ae=m.type==="reference"?void 0:m.filter?.map(oe),ue=m.type==="reference"?T:m.relation;return u(z.search({model:ue,query:S,...ae?{filter:ae}:{},limit:N}))}function pe(m){let x=k(m);if(x.type!=="one2many")throw new Error(`"${m}" is a ${x.type}, not a one2many`);return x}function Se(){return s.step?i.indexOf(s.step):-1}function Fe(m){return a.get(m)?.source?.optional===!0}async function Ne(){let m=e.dataSource;if(!(s.recordId==null||t.data.kind!=="record")){if(!m?.load){b({status:"error",error:"This page has no data source to load from"});return}b({status:"loading",error:null});try{let x=await m.load({model:t.data.model,id:s.recordId,fields:t.fields});d={...ze(t.fields),...x},b({status:"ready",values:ee(d),dirty:[],errors:{}}),_()}catch(x){b({status:"error",error:x.message})}}}let se={page:t,getState:()=>s,subscribe(m){return f.add(m),()=>f.delete(m)},load:()=>u(Ne()),setValue(m,x){k(m),H({...s.values,[m]:ee(x)}),C(m)},node:O,fieldReadonly:m=>k(m).readonly===!0,problem(m){let x=k(m),L=M().filter(S=>S.field===m);return L.length?He(x,s.values[m],L.some(S=>O(S.id).required),r)??null:null},validate(){let m=P();return b({errors:m}),Object.keys(m).length===0},save:()=>u(X()),reset(){J(),l={},b({values:ee(d),dirty:[],errors:{},warning:null,warningField:null,draft:null,step:i[0]??null,skipped:[],saveProblem:null})},changes:$,addLine(m,x={}){let L=pe(m),S=`new-${++p}`,N=s.values[m]??[],T={key:S,values:{...ze(L.fields),...ee(x)}};if(L.sequenceField&&T.values[L.sequenceField]==null){let oe=N.map(ae=>ae.values[L.sequenceField]).filter(ae=>typeof ae=="number");T.values[L.sequenceField]=oe.length?Math.max(...oe)+1:1}let z=[...N,T];return H({...s.values,[m]:z}),C(m),S},updateLine(m,x,L,S){if(!pe(m).fields[L])throw new Error(`The lines of "${m}" have no field "${L}"`);let T=(s.values[m]??[]).map(z=>z.key===x?{...z,values:{...z.values,[L]:ee(S)}}:z);H({...s.values,[m]:T}),C(m)},moveLine(m,x,L){let N=pe(m).sequenceField;if(!N)throw new Error(`The lines of "${m}" keep no order: give the field a sequenceField`);let T=[...s.values[m]??[]],z=T.findIndex(me=>me.key===x);if(z<0)throw new Error(`"${m}" has no line "${x}"`);let oe=Math.max(0,Math.min(L,T.length-1));if(oe===z)return;let ae=T.map(me=>me.values[N]),ue=ae.every((me,be)=>typeof me=="number"&&(be===0||me>ae[be-1]));T.splice(oe,0,...T.splice(z,1));let ne=Math.min(z,oe),Be=Math.max(z,oe),Lt=ue?ae.slice(ne,Be+1):[],Et=T.map((me,be)=>{let ve=ue?be>=ne&&be<=Be?Lt[be-ne]:me.values[N]:be+1;return ve===me.values[N]?me:{...me,values:{...me.values,[N]:ve}}});H({...s.values,[m]:Et}),C(m)},removeLine(m,x){pe(m);let L=(s.values[m]??[]).filter(S=>S.key!==x);H({...s.values,[m]:L}),C(m)},async search(m,x,L=8,S={}){return fe(k(m),m,E(),x,L,S.model)},async previewLine(m,x,L){pe(m);let S=s.values[m]??[],N=S.find(ne=>ne.key===x);if(!N)throw new Error(`"${m}" has no line "${x}"`);let T={...N.values,...L},z=e.dataSource;if(!z?.onchange||t.data.kind!=="record")return T;let oe=S.map(ne=>ne.key===x?{...ne,values:T}:ne),ue=((await z.onchange({model:t.data.model,id:s.recordId,changed:m,values:ee({...s.values,[m]:oe})})).values?.[m]??[]).find(ne=>ne.key===x);return ue?{...T,...ue.values}:T},async searchLine(m,x,L,S,N=8){let T=pe(m),z=T.fields[L];if(!z)throw new Error(`The lines of "${m}" have no field "${L}"`);let oe=(s.values[m]??[]).find(ae=>ae.key===x);if(!oe)throw new Error(`"${m}" has no line "${x}"`);return fe(z,L,Ke(oe.values,T.fields),S,N)},canCreate:m=>Q(t.fields[m])!==null,quickCreate:(m,x)=>ce(t.fields[m],m,x),canCreateLine:(m,x)=>Q(pe(m).fields[x])!==null,quickCreateLine:(m,x,L)=>ce(pe(m).fields[x],x,L),steps:()=>i.filter(m=>!O(m).invisible),next(){if(!s.step)return!1;s.skipped.includes(s.step)&&b({skipped:s.skipped.filter(S=>S!==s.step)});let m=P(s.step);if(Object.keys(m).length)return b({errors:m}),!1;let x=se.steps(),L=i.slice(Se()+1).find(S=>x.includes(S));return L?(b({step:L,errors:{}}),!0):!1},back(){if(!s.step)return!1;let m=se.steps(),x=i.slice(0,Se()).reverse().find(L=>m.includes(L));return x?(b({step:x,errors:{}}),!0):!1},skip(){let m=s.step;if(!m||!Fe(m))return!1;let x=se.steps(),L=x[x.indexOf(m)+1];return L?(b({step:L,errors:{},skipped:[...s.skipped.filter(S=>S!==m),m]}),!0):!1},goTo(m){let x=se.steps(),L=x.indexOf(m),S=s.step?x.indexOf(s.step):-1;if(L===-1||S===-1)return!1;if(L<=S)return b({step:m,errors:{}}),!0;let N=[...s.skipped];for(let T of x.slice(S,L)){if(N.includes(T))continue;let z=P(T);if(Object.keys(z).length){if(Fe(T)){N.push(T);continue}return b({step:T,errors:z,skipped:N}),!1}}return b({step:m,errors:{},skipped:N}),!0},async runAction(m){let x=a.get(m);if(!x||x.kind!=="button"&&x.kind!=="stat")throw new Error(`The page has no button "${m}"`);if(O(m).invisible)return;let L=x.source;await u(Promise.resolve(e.onAction?.({id:m,action:L.action,..."params"in L&&L.params?{params:L.params}:{},recordId:s.recordId,values:ee(s.values)})))},restoreDraft(){let m=e.drafts?.store.getItem(o());if(!m)return;let x=JSON.parse(m);H({...s.values,...x.values},{draft:null})},discardDraft(){J(),b({draft:null})},async settled(){for(;g.size;)await Promise.allSettled([...g])},dispose(){v!==null&&n.clearTimeout(v),h!==null&&n.clearTimeout(h),f.clear()}};return s.recordId==null&&_(),se}function ur(e,t){let n=[],r=new Map(e.filter(i=>i.id!==void 0).map(i=>[i.key,i]));for(let i of t){let o=r.get(i.key);if(i.id===void 0||!o){n.push({op:"create",key:i.key,values:ee(i.values)});continue}let d={};for(let[s,l]of Object.entries(i.values))JSON.stringify(l)!==JSON.stringify(o.values[s])&&(d[s]=ee(l));Object.keys(d).length&&n.push({op:"update",id:i.id,values:d})}let a=new Set(t.map(i=>i.key));for(let i of e)i.id!==void 0&&!a.has(i.key)&&n.push({op:"delete",id:i.id});return n}function fr(e,t){let n=new Set(e.map(a=>a.id)),r=new Set(t.map(a=>a.id));return[...t.filter(a=>!n.has(a.id)).map(a=>({op:"link",id:a.id})),...e.filter(a=>!r.has(a.id)).map(a=>({op:"unlink",id:a.id}))]}function pr(e){let t=new Map,n=(a,i,o,d)=>{t.set(a.id,{id:a.id,parent:i,kind:o,field:d.field,invisible:Ae(d.invisible),readonly:Ae(d.readonly),required:Ae(d.required),source:a})},r=(a,i)=>{for(let o of a)if(o.type==="field")n(o,i,"field",{invisible:o.invisible,readonly:o.readonly,required:o.required,field:o.field});else if(o.type==="button")n(o,i,"button",{invisible:o.invisible});else if(o.type==="tabs"){n(o,i,"other",{invisible:o.invisible});for(let d of o.children)n(d,o.id,"other",{invisible:d.invisible}),r(d.children,d.id)}else o.type==="section"?(n(o,i,"other",{invisible:o.invisible,readonly:o.readonly}),r(o.children,o.id)):n(o,i,"other",{invisible:o.invisible})};if(e.type==="tabs")return r([e],""),t.get(e.id).parent=null,t;if(n(e,null,"other",{}),e.type==="wizard")for(let a of e.children)n(a,e.id,"step",{invisible:a.invisible}),r(a.children,a.id);else if(e.type==="sections")r(e.children,e.id);else{let a=(i,o)=>{o&&n({id:i},e.id,"field",{field:o})};a("#title",e.title?.field),a("#subtitle",e.title?.subtitleField),a("#avatar",e.title?.avatarField),a("#statusbar",e.statusbar?.field);for(let i of e.buttons??[])n(i,e.id,"button",{invisible:i.invisible});for(let i of e.statButtons??[])n(i,e.id,"stat",{invisible:i.invisible});e.ribbon&&n(e.ribbon,e.id,"other",{invisible:e.ribbon.invisible});for(let i of e.alerts??[])n(i,e.id,"other",{invisible:i.invisible});for(let i of e.badges??[])n(i,e.id,"other",{invisible:i.invisible});r([...e.title?.above??[],...e.title?.below??[]],e.id),r(e.children,e.id),e.sidePanel&&n(e.sidePanel,e.id,"other",{invisible:e.sidePanel.invisible})}return t}var dn=new Map;function ln(e,t){let n=`${e}:${t}`,r=dn.get(n);return r||(r=new Intl.NumberFormat(e,{numberingSystem:"latn",minimumFractionDigits:t,maximumFractionDigits:t}),dn.set(n,r)),r}function mr(e){let t=ln(e,1).formatToParts(12345.6);return{group:t.find(n=>n.type==="group")?.value??",",decimal:t.find(n=>n.type==="decimal")?.value??"."}}function Pe(e,t,n="en"){return ln(n,t).format(e)}function At(e,t="en"){let{group:n,decimal:r}=mr(t),a=e.replace(/[٠-٩]/g,i=>String(i.charCodeAt(0)-1632)).replace(/[۰-۹]/g,i=>String(i.charCodeAt(0)-1776)).replace(/٫/g,r).replace(/٬/g,n);return a=a.replace(/[\s\u00a0\u202f]/g,""),n.trim()&&(a=a.split(n).join("")),r==="."?a:a.split(r).join(".")}var de={en:{search:"Search\u2026",noResults:"No results",remove:"Remove {name}",clear:"Clear {label}",addLine:"Add a line",addSection:"Add a section",addNote:"Add a note",deleteLine:"Delete line",total:"Total",lineProblem:"Line {n}: {message}",moreProblems:"and {n} more",chooseColumns:"Choose columns",createNamed:"Create \u201C{name}\u201D",createAndEdit:"Create and edit\u2026",searchMore:"Search more\u2026",openNamed:"Open {name}",openLine:"Open line",chooseDate:"Choose a date",previousMonth:"Previous month",nextMonth:"Next month",weekShort:"Wk",week:"Week",formatting:"Formatting",bold:"Bold",italic:"Italic",underline:"Underline",textStyle:"Text style",paragraph:"Paragraph",heading:"Heading",subheading:"Subheading",bulletList:"Bulleted list",numberList:"Numbered list",alignLeft:"Align left",alignCenter:"Align centre",alignRight:"Align right",link:"Link",linkAddress:"Link address",applyLink:"Apply",removeLink:"Remove link",upload:"Upload a file",uploadImage:"Add a photo",replace:"Replace",removeFile:"Remove",dropHere:"or drop it here",invalidJson:"Not valid JSON"},ar:{search:"\u0628\u062D\u062B\u2026",noResults:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C",remove:"\u0625\u0632\u0627\u0644\u0629 {name}",clear:"\u0645\u0633\u062D {label}",addLine:"\u0625\u0636\u0627\u0641\u0629 \u0633\u0637\u0631",addSection:"\u0625\u0636\u0627\u0641\u0629 \u0642\u0633\u0645",addNote:"\u0625\u0636\u0627\u0641\u0629 \u0645\u0644\u0627\u062D\u0638\u0629",deleteLine:"\u062D\u0630\u0641 \u0627\u0644\u0633\u0637\u0631",total:"\u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",lineProblem:"\u0627\u0644\u0633\u0637\u0631 {n}: {message}",moreProblems:"\u0648{n} \u0623\u062E\u0631\u0649",chooseColumns:"\u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u0623\u0639\u0645\u062F\u0629",createNamed:"\u0625\u0646\u0634\u0627\u0621 \xAB{name}\xBB",createAndEdit:"\u0625\u0646\u0634\u0627\u0621 \u0648\u062A\u0639\u062F\u064A\u0644\u2026",searchMore:"\u0628\u062D\u062B \u0645\u0648\u0633\u0651\u0639\u2026",openNamed:"\u0641\u062A\u062D {name}",openLine:"\u0641\u062A\u062D \u0627\u0644\u0633\u0637\u0631",chooseDate:"\u0627\u062E\u062A\u064A\u0627\u0631 \u062A\u0627\u0631\u064A\u062E",previousMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642",nextMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A",weekShort:"\u0623\u0633\u0628\u0648\u0639",week:"\u0627\u0644\u0623\u0633\u0628\u0648\u0639",formatting:"\u0627\u0644\u062A\u0646\u0633\u064A\u0642",bold:"\u063A\u0627\u0645\u0642",italic:"\u0645\u0627\u0626\u0644",underline:"\u062A\u0633\u0637\u064A\u0631",textStyle:"\u0646\u0645\u0637 \u0627\u0644\u0646\u0635",paragraph:"\u0641\u0642\u0631\u0629",heading:"\u0639\u0646\u0648\u0627\u0646",subheading:"\u0639\u0646\u0648\u0627\u0646 \u0641\u0631\u0639\u064A",bulletList:"\u0642\u0627\u0626\u0645\u0629 \u0646\u0642\u0637\u064A\u0629",numberList:"\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u0642\u0645\u0629",alignLeft:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0633\u0627\u0631",alignCenter:"\u062A\u0648\u0633\u064A\u0637",alignRight:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0645\u064A\u0646",link:"\u0631\u0627\u0628\u0637",linkAddress:"\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",applyLink:"\u062A\u0637\u0628\u064A\u0642",removeLink:"\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0627\u0628\u0637",upload:"\u0631\u0641\u0639 \u0645\u0644\u0641",uploadImage:"\u0625\u0636\u0627\u0641\u0629 \u0635\u0648\u0631\u0629",replace:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644",removeFile:"\u0625\u0632\u0627\u0644\u0629",dropHere:"\u0623\u0648 \u0623\u0641\u0644\u062A\u0647 \u0647\u0646\u0627",invalidJson:"\u0644\u064A\u0633 JSON \u0635\u0627\u0644\u062D\u064B\u0627"},de:{search:"Suchen\u2026",noResults:"Keine Ergebnisse",remove:"{name} entfernen",clear:"{label} leeren",addLine:"Zeile hinzuf\xFCgen",addSection:"Abschnitt hinzuf\xFCgen",addNote:"Notiz hinzuf\xFCgen",deleteLine:"Zeile l\xF6schen",total:"Summe",lineProblem:"Zeile {n}: {message}",moreProblems:"und {n} weitere",chooseColumns:"Spalten ausw\xE4hlen",createNamed:"\u201E{name}\u201C anlegen",createAndEdit:"Anlegen und bearbeiten\u2026",searchMore:"Weitere suchen\u2026",openNamed:"{name} \xF6ffnen",openLine:"Zeile \xF6ffnen",chooseDate:"Datum ausw\xE4hlen",previousMonth:"Vorheriger Monat",nextMonth:"N\xE4chster Monat",weekShort:"KW",week:"Kalenderwoche",formatting:"Formatierung",bold:"Fett",italic:"Kursiv",underline:"Unterstrichen",textStyle:"Textstil",paragraph:"Absatz",heading:"\xDCberschrift",subheading:"Unter\xFCberschrift",bulletList:"Aufz\xE4hlung",numberList:"Nummerierte Liste",alignLeft:"Linksb\xFCndig",alignCenter:"Zentriert",alignRight:"Rechtsb\xFCndig",link:"Link",linkAddress:"Linkadresse",applyLink:"\xDCbernehmen",removeLink:"Link entfernen",upload:"Datei hochladen",uploadImage:"Foto hinzuf\xFCgen",replace:"Ersetzen",removeFile:"Entfernen",dropHere:"oder hier ablegen",invalidJson:"Kein g\xFCltiges JSON"},fr:{search:"Rechercher\u2026",noResults:"Aucun r\xE9sultat",remove:"Retirer {name}",clear:"Effacer {label}",addLine:"Ajouter une ligne",addSection:"Ajouter une section",addNote:"Ajouter une note",deleteLine:"Supprimer la ligne",total:"Total",lineProblem:"Ligne {n} : {message}",moreProblems:"et {n} de plus",chooseColumns:"Choisir les colonnes",createNamed:"Cr\xE9er \xAB {name} \xBB",createAndEdit:"Cr\xE9er et modifier\u2026",searchMore:"Rechercher plus\u2026",openNamed:"Ouvrir {name}",openLine:"Ouvrir la ligne",chooseDate:"Choisir une date",previousMonth:"Mois pr\xE9c\xE9dent",nextMonth:"Mois suivant",weekShort:"Sem.",week:"Semaine",formatting:"Mise en forme",bold:"Gras",italic:"Italique",underline:"Soulign\xE9",textStyle:"Style du texte",paragraph:"Paragraphe",heading:"Titre",subheading:"Sous-titre",bulletList:"Liste \xE0 puces",numberList:"Liste num\xE9rot\xE9e",alignLeft:"Aligner \xE0 gauche",alignCenter:"Centrer",alignRight:"Aligner \xE0 droite",link:"Lien",linkAddress:"Adresse du lien",applyLink:"Appliquer",removeLink:"Supprimer le lien",upload:"T\xE9l\xE9verser un fichier",uploadImage:"Ajouter une photo",replace:"Remplacer",removeFile:"Retirer",dropHere:"ou d\xE9posez-le ici",invalidJson:"JSON invalide"}};var gr=180,cn=8;function mt(e,t){return e.replace(/\{(\w+)\}/g,(n,r)=>t[r]??n)}function gt(e){let{document:t,id:n,labels:r}=e,a=`${n}-list`,i=t.createElement("input");Object.assign(i,{id:n,className:"fd-input fd-combo-input",autocomplete:"off"}),i.setAttribute("role","combobox"),i.setAttribute("aria-autocomplete","list"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",a),i.placeholder=r.search;let o=t.createElement("ul");o.id=a,o.className="fd-listbox",o.setAttribute("role","listbox"),o.hidden=!0;let d=t.createElement("div");d.className="fd-combo",d.append(i,o);let s="",l=null,p="",y=new Map,v=!1,h=[],g=-1,f=0,w,b=!1;function u(){if(o.replaceChildren(),h.forEach((M,P)=>{let H=t.createElement("li");H.id=`${a}-${P}`,H.setAttribute("role","option"),H.setAttribute("aria-selected",String(P===g)),H.className=`fd-option${P===g?" fd-active":""}${M===l||y.has(M)?" fd-option-create":""}`,H.textContent=M.label,H.addEventListener("mousedown",U=>U.preventDefault()),H.addEventListener("click",()=>F(P)),o.append(H)}),!h.length){let M=t.createElement("li");M.className="fd-empty",M.textContent=r.noResults,o.append(M)}g>=0?i.setAttribute("aria-activedescendant",`${a}-${g}`):i.removeAttribute("aria-activedescendant")}function E(){o.hidden=!1,i.setAttribute("aria-expanded","true")}function k(){clearTimeout(w),f++,o.hidden=!0,i.setAttribute("aria-expanded","false"),i.removeAttribute("aria-activedescendant"),g=-1}function F(M){let P=h[M];if(!P)return;let H=p;if(k(),v=!1,P===l&&e.create){e.create(H).then(e.pick,()=>{});return}let U=y.get(P);if(U){U(H).then(re=>re&&e.pick(re),()=>{});return}e.pick(P)}function O(M){clearTimeout(w);let P=++f;w=setTimeout(async()=>{let H=await e.search(M).catch(()=>[]);if(P!==f||t.activeElement!==i)return;let U=h[g],re=U&&U!==l&&!y.has(U)?U.id:void 0,J=e.exclude?.()??new Set,_=H.filter(C=>!J.has(C.id)),te=e.shown!==void 0&&_.length>e.shown;h=te?_.slice(0,e.shown):_;let Z=M.trim();l=null,e.create&&Z&&!H.some(C=>C.label.trim().toLowerCase()===Z.toLowerCase())&&(p=Z,l={id:"__create__",label:mt(r.createNamed,{name:Z})},h=[...h,l]),p=Z,y=new Map((e.more?.(Z,te)??[]).map((C,$)=>[{id:`__more_${$}__`,label:C.label},C.act])),h=[...h,...y.keys()],g=re===void 0?-1:h.findIndex(C=>C.id===re),u(),E()},gr)}return i.addEventListener("input",()=>{v=!0,b||O(i.value)}),i.addEventListener("focus",()=>{b||O("")}),i.addEventListener("keydown",M=>{if(!b)switch(M.key){case"ArrowDown":case"ArrowUp":{if(M.preventDefault(),o.hidden)return O(i.value);if(!h.length)return;g=(g+(M.key==="ArrowDown"?1:-1)+h.length)%h.length,u(),o.children[g]?.scrollIntoView?.({block:"nearest"});return}case"Enter":!o.hidden&&g>=0&&(M.preventDefault(),F(g));return;case"Escape":o.hidden||M.preventDefault(),k(),v=!1,i.value=s;return;case"Backspace":i.value===""&&e.onEmptyBackspace?.();return}}),i.addEventListener("blur",()=>{f++,clearTimeout(w),k();let M=v&&i.value.trim()===""&&s!=="";v=!1,M?e.onCommitEmpty?.():i.value=s}),{element:d,input:i,setText(M){s=M,v||(i.value=M)},setReadonly(M){b=M,i.readOnly=M,M&&k()},close:k}}function un(e,t,n){return n.options?.create!==!1&&e.canCreate(t)?r=>e.quickCreate(t,r):void 0}var Mt=({form:e,name:t,field:n,node:r,id:a,document:i,labels:o=de.en,dialogs:d})=>{let s=n.type==="many2one"?n.relation:"",l=!!d&&d.canOpen(s),p=!1,y=gt({document:i,id:a,labels:o,search:g=>e.search(t,g,cn+1),shown:cn,pick:g=>e.setValue(t,g),onCommitEmpty:()=>e.setValue(t,null),create:un(e,t,r),more:(g,f)=>{if(!d||p)return[];let w=[];return g&&l&&r.options?.create!==!1&&w.push({label:o.createAndEdit,act:b=>d.openRecord(s,{name:b,title:n.label})}),f&&w.push({label:o.searchMore,act:()=>d.searchMore({title:n.label,search:(b,u)=>e.search(t,b,u)})}),w}}),v=l?i.createElement("button"):null;v&&(v.type="button",v.className="fd-combo-open",v.textContent="\u2197",v.hidden=!0,v.addEventListener("click",async()=>{let g=e.getState().values[t];if(!g||!d)return;let f=await d.openRecord(s,{recordId:g.id,title:g.label});f&&f.label!==g.label&&e.setValue(t,f)}));let h=i.createElement("button");return h.type="button",h.className="fd-combo-clear",h.textContent="\xD7",h.setAttribute("aria-label",mt(o.clear,{label:n.label})),h.addEventListener("click",()=>{e.setValue(t,null),y.input.focus()}),y.element.append(h,...v?[v]:[]),{element:y.element,focus:()=>y.input.focus(),update(g){let f=g.value;p=g.readonly,y.setText(f?.label??""),y.setReadonly(g.readonly),h.hidden=!f||g.readonly,v&&(v.hidden=!f,f&&v.setAttribute("aria-label",mt(o.openNamed,{name:f.label}))),y.input.setAttribute("aria-invalid",String(g.invalid)),y.input.setAttribute("aria-required",String(g.required)),g.describedBy&&y.input.setAttribute("aria-describedby",g.describedBy)}}},bt=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=()=>e.getState().values[t]??[],d=a.createElement("div");d.className="fd-tags",d.setAttribute("role","group");let s=a.createElement("ul");s.className="fd-chips";let l=gt({document:a,id:r,labels:i,search:v=>e.search(t,v),pick:v=>{e.setValue(t,[...o(),v]),l.input.value=""},exclude:()=>new Set(o().map(v=>v.id)),onEmptyBackspace:()=>{let v=o();v.length&&e.setValue(t,v.slice(0,-1))},create:un(e,t,n)});d.append(s,l.element);let p=!1,y="";return{element:d,focus:()=>l.input.focus(),update(v){let h=v.value??[],g=JSON.stringify([v.readonly,h]);p=v.readonly,l.setReadonly(p),l.element.hidden=p,l.input.setAttribute("aria-invalid",String(v.invalid)),v.describedBy&&l.input.setAttribute("aria-describedby",v.describedBy),g!==y&&(y=g,fn(s,h,p,i,f=>e.setValue(t,o().filter(w=>w.id!==f.id))),l.setText(""))}}};function fn(e,t,n,r,a){let i=e.ownerDocument;e.replaceChildren(...t.map(o=>{let d=i.createElement("li");d.className="fd-chip";let s=i.createElement("span");if(s.className="fd-chip-label",s.textContent=o.label,d.append(s),!n){let l=i.createElement("button");l.type="button",l.className="fd-chip-remove",l.textContent="\xD7",l.setAttribute("aria-label",mt(r.remove,{name:o.label})),l.addEventListener("click",()=>a(o)),d.append(l)}return d}))}var Tt=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=n.options??{},d=typeof o.separator=="string"&&o.separator?o.separator:",",s=Array.isArray(o.suggestions)?o.suggestions.filter(b=>typeof b=="string"):[],l=b=>typeof b=="string"?b.split(d).map(u=>u.trim()).filter(u=>u!==""):[],p=()=>l(e.getState().values[t]),y=b=>e.setValue(t,b.length?b.join(`${d} `):null),v=b=>{let u=b.trim(),E=p();u&&!E.some(k=>k.toLowerCase()===u.toLowerCase())&&y([...E,u])},h=a.createElement("div");h.className="fd-tags",h.setAttribute("role","group");let g=a.createElement("ul");g.className="fd-chips";let f=gt({document:a,id:r,labels:i,search:async b=>{let u=new Set(p().map(k=>k.toLowerCase())),E=b.trim().toLowerCase();return s.filter(k=>!u.has(k.toLowerCase())&&k.toLowerCase().includes(E)).map(k=>({id:k,label:k}))},pick:b=>{v(b.label),f.input.value=""},onEmptyBackspace:()=>{let b=p();b.length&&y(b.slice(0,-1))}});f.input.addEventListener("keydown",b=>{b.key!=="Enter"||b.defaultPrevented||f.input.value.trim()===""||(b.preventDefault(),v(f.input.value),f.input.value="",f.close())}),f.input.addEventListener("input",()=>{let b=f.input.value.split(d);if(!(b.length<2)){for(let u of b.slice(0,-1))v(u);f.input.value=b[b.length-1].trimStart()}}),f.input.addEventListener("change",()=>{f.input.value.trim()&&v(f.input.value)}),h.append(g,f.element);let w="";return{element:h,focus:()=>f.input.focus(),update(b){let u=l(b.value);f.setReadonly(b.readonly),f.element.hidden=b.readonly,f.input.setAttribute("aria-invalid",String(b.invalid)),b.describedBy&&f.input.setAttribute("aria-describedby",b.describedBy);let E=JSON.stringify([b.readonly,u]);E!==w&&(w=E,fn(g,u.map(k=>({id:k,label:k})),b.readonly,i,k=>y(p().filter(F=>F!==k.label))),f.setText(""))}}},Ct=({form:e,name:t,id:n,document:r})=>{let a=r.createElement("div");a.id=n,a.className="fd-choices fd-choices-checkbox",a.setAttribute("role","group");let i=[],o={readonly:!1,value:[]},d=()=>{let s=new Set(o.value.map(l=>l.id));for(let{record:l,box:p}of i)p.checked=s.has(l.id),p.disabled=o.readonly};return e.search(t,"",50).then(s=>{i=s.map((l,p)=>{let y=r.createElement("input");y.type="checkbox",y.id=`${n}-${p}`,y.addEventListener("change",()=>{let g=e.getState().values[t]??[];e.setValue(t,y.checked?[...g,l]:g.filter(f=>f.id!==l.id))});let v=r.createElement("label");v.className="fd-choice",v.htmlFor=y.id;let h=r.createElement("span");return h.textContent=l.label,v.append(y,h),a.append(v),{record:l,box:y}}),d()}),{element:a,focus:()=>a.querySelector("input")?.focus(),update(s){o={readonly:s.readonly,value:s.value??[]},d()}}},$t=e=>{let{form:t,name:n,field:r,id:a,document:i,labels:o=de.en}=e,d=r.type==="reference"?r.models:[],s=i.createElement("div");s.className="fd-reference";let l=i.createElement("select");l.className="fd-input fd-select",l.setAttribute("aria-label",r.label),l.append(i.createElement("option"));for(let v of d){let h=i.createElement("option");h.value=String(v.value),h.textContent=v.label,l.append(h)}let p="";l.addEventListener("change",()=>{p=l.value,t.setValue(n,null)});let y=gt({document:i,id:a,labels:o,search:v=>p?t.search(n,v,8,{model:p}):Promise.resolve([]),pick:v=>t.setValue(n,{model:p,id:v.id,label:v.label}),onCommitEmpty:()=>t.setValue(n,null)});return s.append(l,y.element),{element:s,focus:()=>p?y.input.focus():l.focus(),update(v){let h=v.value;h&&(p=h.model),l.value=p,l.disabled=v.readonly,y.setText(h?.label??""),y.setReadonly(v.readonly||!p)}}};function pn(e){let t=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?/.exec(e);if(!t)return null;let[,n,r,a,i,o]=t;return new Date(Number(n),Number(r)-1,Number(a),Number(i??0),Number(o??0))}function Vt(e,t,n={},r="en"){let a=(i,o)=>Pe(i,o,r);if(t==null||t==="")return"";switch(e.type){case"many2one":case"reference":return t.label??"";case"many2many":return(t??[]).map(i=>i.label).join(", ");case"selection":{let i=o=>e.options.find(d=>d.value===o)?.label??String(o);return Array.isArray(t)?t.map(i).join(", "):i(t)}case"integer":return a(Number(t),0);case"float":return a(Number(t),e.digits?.[1]??2);case"monetary":{let i=e.currency??(e.currencyField?n[e.currencyField]?.label:void 0),o=a(Number(t),e.digits?.[1]??2);return i?`${i} ${o}`:o}case"date":{let i=pn(String(t));return i?new Intl.DateTimeFormat(r==="en"?"en-GB":r,{day:"numeric",month:"short",year:"numeric",numberingSystem:"latn"}).format(i):String(t)}case"datetime":{let i=pn(String(t));return i?new Intl.DateTimeFormat(r==="en"?"en-GB":r,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit",numberingSystem:"latn"}).format(i):String(t)}case"html":return String(t).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();case"binary":case"image":return t.name??"";case"boolean":return t?"\u2713":"";default:return String(t)}}function mn(e,t){return t==="section"?{...e,type:"char"}:{...e,type:"text"}}function gn(e,t,n){let r=()=>(e.getState().values[t]??[]).find(a=>a.key===n)?.values??{};return{...e,getState:()=>({...e.getState(),values:r()}),setValue:(a,i)=>e.updateLine(t,n,a,i),search:(a,i,o)=>e.searchLine(t,n,a,i,o),canCreate:a=>e.canCreateLine(t,a),quickCreate:(a,i)=>e.quickCreateLine(t,a,i)}}var Ot=({form:e,name:t,field:n,node:r,id:a,document:i,labels:o=de.en,locale:d,dialogs:s})=>{let l=n,p=l.lineKinds,y=(r.columns??Object.keys(l.fields)).filter(J=>l.fields[J]&&J!==p?.field&&J!==l.sequenceField&&r.optionalColumns?.[J]!=="hide"),v=i.createElement("div");v.className="fd-lines",v.id=a,v.setAttribute("role","group");let h=i.createElement("div");h.className="fd-lines-scroll";let g=i.createElement("table");g.className="fd-lines-table";let f=i.createElement("thead"),w=i.createElement("tr");for(let J of y){let _=i.createElement("th");_.scope="col",_.textContent=l.fields[J].label,w.append(_)}let b=i.createElement("th");b.className="fd-lines-tools",w.append(b),f.append(w);let u=i.createElement("tbody");g.append(f,u);let E=(r.totals??[]).filter(J=>y.includes(J)),k=new Map;if(E.length){let J=i.createElement("tfoot"),_=i.createElement("tr");_.className="fd-lines-totals",y.forEach((te,Z)=>{let C=i.createElement("td");E.includes(te)?k.set(te,C):Z===0&&(C.textContent=o.total),_.append(C)}),_.append(i.createElement("td")),J.append(_),g.append(J)}h.append(g);let F=i.createElement("div");F.className="fd-lines-adds";let O=(J,_,te)=>{let Z=i.createElement("button");Z.type="button",Z.className="fd-button fd-button-link fd-lines-add",Z.dataset.add=te,Z.textContent=`+ ${J}`,Z.addEventListener("click",()=>{P=e.addLine(t,_);let C=M.get(P);C&&(C.cells[0]?.widget.focus(),P=null)}),F.append(Z)};O(o.addLine,{},"line"),p&&(O(o.addSection,{[p.field]:p.section??"section"},"section"),O(o.addNote,{[p.field]:p.note??"note"},"note")),v.append(h,F);let M=new Map,P=null,H=!1;function U(J,_,te,Z,C=1){let $=`${a}-${_.key}-${te}`,W={type:"field",id:`${r.id}.${_.key}.${te}`,field:te},X=ke({form:gn(e,t,_.key),name:te,field:Z,node:W,id:$,document:i,labels:o,locale:d,dialogs:s}),Q=i.createElement("td");Q.colSpan=C;let ce=i.createElement("label");ce.className="fd-sr-only",ce.htmlFor=$,ce.textContent=Z.label;let fe=i.createElement("div");return fe.className="fd-cell-error",fe.hidden=!0,Q.append(ce,X.element,fe),J.append(Q),{name:te,def:Z,widget:X,error:fe}}function re(J){let _=i.createElement("tr");_.dataset.line=J.key;let te=Me(l,J.values);te&&(_.className=`fd-line-${te}`);let Z=te&&p?[U(_,J,p.text,mn(l.fields[p.text],te),y.length)]:y.map(W=>U(_,J,W,l.fields[W])),C=i.createElement("td");C.className="fd-lines-tools";let $=i.createElement("button");return $.type="button",$.className="fd-line-delete",$.textContent="\xD7",$.setAttribute("aria-label",o.deleteLine),$.addEventListener("click",()=>e.removeLine(t,J.key)),C.append($),_.append(C),{element:_,kind:te,cells:Z,remove:$}}return{element:v,focus:()=>(u.querySelector("input, select, textarea")??F.querySelector("button"))?.focus(),update(J){H=J.readonly,F.hidden=H;let _=J.value??[],te=e.getState().errors,Z=new Set(_.map(C=>C.key));for(let[C,$]of M)Z.has(C)||($.element.remove(),M.delete(C));_.forEach((C,$)=>{let W=M.get(C.key);W&&W.kind!==Me(l,C.values)&&(W.element.remove(),W=void 0),W||(W=re(C),M.set(C.key,W)),u.children[$]!==W.element&&u.insertBefore(W.element,u.children[$]??null),W.remove.hidden=H,H?W.remove.remove():W.remove.isConnected||W.element.lastElementChild?.append(W.remove);for(let X of W.cells){let Q=te[`${t}.${C.key}.${X.name}`];X.error.hidden=!Q,X.error.textContent=Q??"",X.widget.update({value:C.values[X.name],values:C.values,readonly:H||X.def.readonly===!0,required:X.def.required===!0,invalid:!!Q})}});for(let[C,$]of k){let W=_.filter(X=>!Me(l,X.values)).reduce((X,Q)=>X+Number(Q.values[C]??0),0);$.textContent=Vt(l.fields[C],W,_[0]?.values??{},d)}P&&M.has(P)&&(M.get(P)?.cells[0]?.widget.focus(),P=null)}}};function br(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let a=String(r.result??"");t({name:e.name,type:e.type,size:e.size,data:a.slice(a.indexOf(",")+1)})},r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function bn(e){return({form:t,name:n,field:r,id:a,document:i,labels:o=de.en})=>{let d=i.createElement("div");d.className=`fd-file fd-file-${e}`;let s=i.createElement("input");s.type="file",s.id=a,s.className="fd-sr-only";let l=r.type==="binary"?r.accept:e==="image"?["image/*"]:void 0;l&&(s.accept=l.join(","));let p=i.createElement("img");p.className="fd-image-preview",p.alt=r.label,p.hidden=!0;let y=i.createElement("label");y.className=e==="image"?"fd-file-pick fd-image-pick":"fd-file-pick",y.htmlFor=a;let v=i.createElement("span");v.className="fd-button",v.textContent=e==="image"?o.uploadImage:o.upload;let h=i.createElement("span");h.className="fd-help",h.textContent=o.dropHere,y.append(v,h);let g=i.createElement("div");g.className="fd-file-chosen";let f=i.createElement("span");f.className="fd-file-name";let w=i.createElement("button");w.type="button",w.className="fd-button fd-button-link",w.textContent=o.replace,w.addEventListener("click",()=>s.click());let b=i.createElement("button");b.type="button",b.className="fd-button fd-button-link",b.textContent=o.removeFile,b.addEventListener("click",()=>t.setValue(n,null)),g.append(f,w,b),d.append(s,...e==="image"?[p]:[],y,g);let u=!1,E=async k=>{!k||u||t.setValue(n,await br(k))};return s.addEventListener("change",()=>{E(s.files?.[0]),s.value=""}),d.addEventListener("dragover",k=>{u||(k.preventDefault(),d.classList.add("fd-dragging"))}),d.addEventListener("dragleave",()=>d.classList.remove("fd-dragging")),d.addEventListener("drop",k=>{k.preventDefault(),d.classList.remove("fd-dragging"),E(k.dataTransfer?.files?.[0])}),{element:d,focus:()=>(y.hidden?w:s).focus(),update(k){u=k.readonly;let F=k.value;if(y.hidden=!!F||u,g.hidden=!F,w.hidden=b.hidden=u,s.disabled=u,s.setAttribute("aria-invalid",String(k.invalid)),k.describedBy&&s.setAttribute("aria-describedby",k.describedBy),f.textContent=F?`${F.name} \xB7 ${Ye(F.size)}`:"",e==="image"){let O=F?F.data?`data:${F.type};base64,${F.data}`:F.url??"":"";p.hidden=!O,p.getAttribute("src")!==O&&(O?p.src=O:p.removeAttribute("src"))}}}}}var It=bn("binary"),Dt=bn("image");var hn=new Map;function yn(e,t){let n=hn.get(t);return n||(n=new Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:0,numberingSystem:"latn"}),hn.set(t,n)),n.format(e/100)}var Ze=e=>{let{node:t,id:n,document:r,locale:a="en"}=e,i=t.options??{},o=typeof i.min=="number"?i.min:0,d=typeof i.max=="number"?i.max:100,s=typeof i.maxField=="string"?i.maxField:null,l=typeof i.color=="string"?i.color:"auto",p=i.showPercent!==!1,y=r.createElement("div");y.className="fd-progressbar",y.setAttribute("role","progressbar");let v=r.createElement("div");v.className="fd-progressbar-fill";let h=r.createElement("span");h.className="fd-progressbar-text",y.append(v,h);let g=null,f=y;return i.editable===!0?(g=ke({...e,node:{...t,widget:void 0}}),y.setAttribute("aria-hidden","true"),f=r.createElement("div"),f.className="fd-progressbar-edit",f.append(y,g.element)):y.id=n,{element:f,focus:()=>g?.focus(),update(w){let b=typeof w.value=="number"?w.value:0,u=s?Number(w.values[s]??0):d,E=u>o?Math.min(100,Math.max(0,(b-o)/(u-o)*100)):0,k=Math.round(E*10)/10;v.style.width=`${k}%`,y.setAttribute("aria-valuenow",String(b)),y.setAttribute("aria-valuemin",String(o)),y.setAttribute("aria-valuemax",String(u)),y.setAttribute("aria-valuetext",yn(E,a)),h.textContent=p?yn(E,a):"",y.dataset.tone=l!=="auto"?l:E<30?"danger":E<70?"warning":"success",g?.update(w)}}};function vn(e){return e==null?"":typeof e=="object"&&"label"in e?e.label:String(e)}var Xe=({field:e,node:t,id:n,document:r,locale:a="en"})=>{let i=t.options??{},o=p=>typeof i[p]=="string"?i[p]:"",d=p=>typeof i[p]=="string"?i[p]:null,s=e.type==="integer"?0:e.type==="float"||e.type==="monetary"?e.digits?.[1]??2:null,l=r.createElement("output");return l.id=n,l.className="fd-value-text",{element:l,focus:()=>{},update({value:p,values:y}){if(p==null||p===""){l.textContent="";return}let v=s!==null&&typeof p=="number"?Pe(p,s,a):ht(p,e),h=d("prefixField"),g=d("suffixField"),f=h?vn(y[h]):o("prefix"),w=g?vn(y[g]):o("suffix");l.textContent=[f,v,w].filter(b=>b!=="").join(" ")}}};var yt=({form:e,name:t,field:n,node:r,id:a,document:i})=>{let o=r.options??{},d=o.clickable===!0,s=Array.isArray(o.visibleStates)?o.visibleStates:null,l=i.createElement("ol");l.className="fd-statusbar",l.id=a,l.setAttribute("aria-label",n.label);let p=f=>f&&typeof f=="object"&&"id"in f?`id:${String(f.id)}`:`v:${String(f)}`,y=n.type==="selection"?n.options.map(f=>({key:p(f.value),label:f.label,value:f.value})):[],v=n.type==="selection",h={value:void 0,readonly:!1};function g(){let{value:f,readonly:w}=h,b=f==null?null:p(f),u=y.filter(E=>!s||s.some(k=>p(k)===E.key)||E.key===b);b&&!u.some(E=>E.key===b)&&f&&typeof f=="object"&&(u=[...u,{key:b,label:f.label,value:f}]),l.replaceChildren(...u.map(E=>{let k=i.createElement("span");k.textContent=E.label;let F=i.createElement(d?"button":"span");F instanceof HTMLButtonElement&&(F.type="button",F.disabled=w,F.addEventListener("click",()=>e.setValue(t,E.value))),F.append(k),E.key===b&&F.setAttribute("aria-current","step");let O=i.createElement("li");return O.append(F),O}))}return{element:l,focus:()=>l.querySelector("button:not([disabled])")?.focus(),update(f){h={value:f.value,readonly:f.readonly},g(),v||(v=!0,e.search(t,"",20).then(w=>{y=w.map(b=>({key:p(b),label:b.label,value:b})),g()}).catch(()=>{}))}}};function wn(e){let t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()));t.setUTCDate(t.getUTCDate()+4-(t.getUTCDay()||7));let n=Date.UTC(t.getUTCFullYear(),0,1);return Math.ceil(((t.getTime()-n)/864e5+1)/7)}var xn=e=>String(e).padStart(2,"0"),Pt=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),Le=(e,t)=>new Date(e.getFullYear(),e.getMonth(),e.getDate()+t);function vt(e,t){let n=new Date(e.getFullYear(),e.getMonth()+t+1,0).getDate();return new Date(e.getFullYear(),e.getMonth()+t,Math.min(e.getDate(),n))}function Wt(e,t){if(typeof t!="string"||!t)return null;if(e==="date"){let r=/^(\d{4})-(\d{2})-(\d{2})/.exec(t);return r?new Date(Number(r[1]),Number(r[2])-1,Number(r[3])):null}let n=new Date(t);return Number.isNaN(n.getTime())?null:n}function xt(e,t,n){let{form:r,name:a,id:i,document:o,locale:d="en"}=t,s=t.labels??de.en,l=d==="en"?"en-GB":d,p=new Intl.DateTimeFormat(l,{month:"long",year:"numeric",numberingSystem:"latn"}),y=new Intl.DateTimeFormat(l,{weekday:"long",day:"numeric",month:"long",year:"numeric",numberingSystem:"latn"}),v=new Intl.DateTimeFormat(l,{weekday:"short"}),h=new Intl.DateTimeFormat(l,{weekday:"long"}),g=o.createElement("button");g.type="button",g.className="fd-calendar-button";let f="http://www.w3.org/2000/svg",w=o.createElementNS(f,"svg");w.setAttribute("viewBox","0 0 16 16"),w.setAttribute("aria-hidden","true");for(let[$,W]of[["rect",{x:"2",y:"3",width:"12",height:"11",rx:"1.5"}],["path",{d:"M2 6.5h12M5 1.5v3M11 1.5v3"}]]){let X=o.createElementNS(f,$);for(let[Q,ce]of Object.entries(W))X.setAttribute(Q,ce);w.append(X)}g.append(w),g.setAttribute("aria-label",s.chooseDate),g.setAttribute("aria-haspopup","dialog"),g.setAttribute("aria-expanded","false"),g.setAttribute("aria-controls",`${i}-calendar`);let b=o.createElement("div");b.className="fd-calendar",b.id=`${i}-calendar`,b.setAttribute("role","dialog"),b.hidden=!0;let u=o.createElement("div");u.className="fd-calendar-head";let E=o.createElement("button");E.type="button",E.textContent="\u2039",E.setAttribute("aria-label",s.previousMonth);let k=o.createElement("span");k.className="fd-calendar-title",k.setAttribute("aria-live","polite");let F=o.createElement("button");F.type="button",F.textContent="\u203A",F.setAttribute("aria-label",s.nextMonth),u.append(E,k,F);let O=o.createElement("table");O.className="fd-calendar-grid",O.setAttribute("role","grid"),b.append(u,O);let M=o.createElement("span");M.className="fd-date-pick",M.append(e.element,g,b);let P=new Date,H=!1;function U($){if(n==="date")r.setValue(a,`${$.getFullYear()}-${xn($.getMonth()+1)}-${xn($.getDate())}`);else{let W=Wt("datetime",r.getState().values[a]),X=new Date($.getFullYear(),$.getMonth(),$.getDate(),W?.getHours()??0,W?.getMinutes()??0);r.setValue(a,X.toISOString())}Z()}function re($){let W=Wt(n,r.getState().values[a]),X=new Date,Q=p.format(P);k.textContent=Q,b.setAttribute("aria-label",Q);let ce=new Date(P.getFullYear(),P.getMonth(),1),fe=Le(ce,-((ce.getDay()+6)%7)),pe=o.createElement("tr"),Se=o.createElement("th");Se.scope="col",Se.textContent=s.weekShort,Se.setAttribute("abbr",s.week),pe.append(Se);for(let se=0;se<7;se++){let m=Le(fe,se),x=o.createElement("th");x.scope="col",x.textContent=v.format(m).replace(/\.$/,""),x.setAttribute("abbr",h.format(m)),pe.append(x)}let Fe=o.createElement("thead");Fe.append(pe);let Ne=o.createElement("tbody");for(let se=fe;se<=new Date(P.getFullYear(),P.getMonth()+1,0);se=Le(se,7)){let m=o.createElement("tr"),x=o.createElement("th");x.scope="row",x.className="fd-week",x.textContent=String(wn(se)),m.append(x);for(let L=0;L<7;L++){let S=Le(se,L),N=o.createElement("td"),T=o.createElement("button");T.type="button",T.textContent=String(S.getDate()),T.setAttribute("aria-label",y.format(S)),T.tabIndex=Pt(S,P)?0:-1,S.getMonth()!==P.getMonth()&&T.classList.add("fd-outside"),W&&Pt(S,W)&&T.setAttribute("aria-selected","true"),Pt(S,X)&&T.setAttribute("aria-current","date"),T.disabled=H,T.addEventListener("click",()=>U(S)),T.addEventListener("keydown",z=>_(z,S)),N.append(T),m.append(N)}Ne.append(m)}O.replaceChildren(Fe,Ne),$&&O.querySelector('button[tabindex="0"]')?.focus()}function J($){P=$,re(!0)}function _($,W){let X={ArrowLeft:()=>Le(W,-1),ArrowRight:()=>Le(W,1),ArrowUp:()=>Le(W,-7),ArrowDown:()=>Le(W,7),PageUp:()=>vt(W,-1),PageDown:()=>vt(W,1),Home:()=>Le(W,-((W.getDay()+6)%7)),End:()=>Le(W,6-(W.getDay()+6)%7)};X[$.key]?($.preventDefault(),J(X[$.key]())):($.key==="Enter"||$.key===" ")&&($.preventDefault(),U(W))}function te(){P=Wt(n,r.getState().values[a])??new Date,b.hidden=!1,g.setAttribute("aria-expanded","true"),re(!0)}function Z(){b.hidden||(b.hidden=!0,g.setAttribute("aria-expanded","false"),g.focus())}g.addEventListener("click",()=>b.hidden?te():Z()),E.addEventListener("click",()=>{P=vt(P,-1),re(!1)}),F.addEventListener("click",()=>{P=vt(P,1),re(!1)}),b.addEventListener("keydown",$=>{$.key==="Escape"&&($.preventDefault(),$.stopPropagation(),Z())});let C=$=>{!b.hidden&&!M.contains($.target)&&(b.hidden=!0,g.setAttribute("aria-expanded","false"))};return o.addEventListener("mousedown",C),{element:M,focus:()=>e.focus(),update($){H=$.readonly,g.hidden=$.readonly,$.readonly&&(b.hidden=!0),e.update($)},destroy(){o.removeEventListener("mousedown",C),e.destroy?.()}}}var hr=e=>{let t=e.replace(/_/g," ").trim();return t.charAt(0).toUpperCase()+t.slice(1)};function yr(e,t){let n=hr(e);return typeof t=="boolean"?{name:e,label:n,type:"boolean"}:typeof t=="number"?{name:e,label:n,type:Number.isInteger(t)?"integer":"float"}:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?{name:e,label:n,type:"date"}:{name:e,label:n,type:"char"}}var zt=e=>{let{form:t,name:n,field:r,node:a,id:i,document:o}=e,d=r.type==="properties"?r.definitions:void 0,s=()=>{let g=t.getState().values[n];return g&&typeof g=="object"&&!Array.isArray(g)?g:{}},l={...t,getState:()=>({...t.getState(),values:s()}),setValue:(g,f)=>t.setValue(n,{...s(),[g]:f})},p=o.createElement("div");p.className="fd-properties",p.setAttribute("role","group");let y=[],v="";function h(g){for(let f of y)f.widget.destroy?.();y=g.map(f=>{let w=`${i}-${f.name}`,b={type:f.type,label:f.label,...f.options?{options:f.options}:{}},u={type:"field",id:`${a.id}.${f.name}`,field:f.name},E=ke({...e,form:l,name:f.name,field:b,node:u,id:w});return{definition:f,widget:E}}),p.replaceChildren(...y.map(({definition:f,widget:w})=>{let b=o.createElement("div");b.className="fd-property",b.dataset.type=f.type;let u=o.createElement("label");return u.htmlFor=`${i}-${f.name}`,u.textContent=f.label,b.append(u,w.element),b}))}return{element:p,focus:()=>y[0]?.widget.focus(),destroy:()=>y.forEach(g=>g.widget.destroy?.()),update(g){let f=s(),w=d??Object.keys(f).map(u=>yr(u,f[u])),b=JSON.stringify(w);b!==v&&(v=b,h(w));for(let{definition:u,widget:E}of y)E.update({value:f[u.name]??null,values:f,readonly:g.readonly,required:!1,invalid:!1})}}};var vr=new Set(["P","BR","B","STRONG","I","EM","U","S","UL","OL","LI","A","H1","H2","H3","H4","BLOCKQUOTE","CODE","PRE","SPAN","DIV"]),xr=new Set(["SCRIPT","STYLE","IFRAME","OBJECT","EMBED","TEMPLATE","NOSCRIPT","SVG","MATH"]),wr=new Set(["P","DIV","H1","H2","H3","H4","LI","BLOCKQUOTE","PRE"]),kr=new Set(["left","center","right","justify","start","end"]);function jt(e,t=globalThis.document){let n=t.createElement("template");n.innerHTML=e;let r=i=>{for(let o of[...i.childNodes]){if(o.nodeType===Node.TEXT_NODE)continue;if(o.nodeType!==Node.ELEMENT_NODE){o.remove();continue}let d=o;if(xr.has(d.tagName)){d.remove();continue}if(r(d),!vr.has(d.tagName)){d.replaceWith(...d.childNodes);continue}let s=d.tagName==="A"?d.getAttribute("href"):null,l=wr.has(d.tagName)?d.style?.textAlign?.trim().toLowerCase():"";for(let p of[...d.attributes])d.removeAttribute(p.name);s&&/^(https?:|mailto:)/i.test(s.trim())&&d.setAttribute("href",s.trim()),l&&kr.has(l)&&d.setAttribute("style",`text-align: ${l};`)}};r(n.content);let a=t.createElement("div");return a.append(n.content),a.innerHTML}function Sn(e){let t=e.trim();return/^(https?:\/\/|mailto:)\S+$/i.test(t)?t:/^[^\s@:/]+@[^\s@:/]+\.[^\s@:/]+$/.test(t)?`mailto:${t}`:/^[\w-]+(\.[\w-]+)+([/?#]\S*)?$/.test(t)?`https://${t}`:null}var kn=[["bold","bold","<b>B</b>"],["italic","italic","<i>I</i>"],["underline","underline","<u>U</u>"],["bulletList","insertUnorderedList",'<svg viewBox="0 0 16 16"><circle cx="3" cy="4" r="1.2"/><circle cx="3" cy="8" r="1.2"/><circle cx="3" cy="12" r="1.2"/><path d="M6 4h8M6 8h8M6 12h8"/></svg>'],["numberList","insertOrderedList",'<svg viewBox="0 0 16 16"><path d="M2.5 3h1v3M2 10.5c.5-.8 2-.8 2 .2 0 .8-2 1.3-2 2.3h2M6 4h8M6 8h8M6 12h8"/></svg>'],["alignLeft","justifyLeft",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M2 6.5h8M2 9.5h12M2 12.5h8"/></svg>'],["alignCenter","justifyCenter",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M4 6.5h8M2 9.5h12M4 12.5h8"/></svg>'],["alignRight","justifyRight",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M6 6.5h8M2 9.5h12M6 12.5h8"/></svg>'],["link","createLink",'<svg viewBox="0 0 16 16"><path d="M7 9a3 3 0 0 0 4.2 0l2.3-2.3a3 3 0 0 0-4.2-4.2L8.2 3.6M9 7a3 3 0 0 0-4.2 0L2.5 9.3a3 3 0 0 0 4.2 4.2l1.1-1.1"/></svg>']],Ht=({form:e,name:t,node:n,id:r,document:a,labels:i=de.en})=>{let o=a.createElement("div");o.id=r,o.className="fd-input fd-richtext",o.setAttribute("role","textbox"),o.setAttribute("aria-multiline","true"),o.setAttribute("contenteditable","true");let d=n.options?.toolbar!==!1,s="";o.addEventListener("input",()=>{let y=jt(o.innerHTML,a);s=y,e.setValue(t,y.trim()===""?null:y)}),o.addEventListener("blur",()=>{o.innerHTML!==s&&(o.innerHTML=s)});let l=d?Sr(o,a,i):null,p=o;return l&&(p=a.createElement("div"),p.className="fd-richtext-box",p.setAttribute("role","group"),o.setAttribute("aria-labelledby",`${r}-label`),p.append(l.bar,l.linkRow,o)),{element:p,focus:()=>o.focus(),destroy:()=>l?.destroy(),update(y){l&&(l.bar.hidden=y.readonly,y.readonly&&(l.linkRow.hidden=!0));let v=jt(typeof y.value=="string"?y.value:"",a);(v!==s||a.activeElement!==o)&&(o.innerHTML!==v&&(o.innerHTML=v),s=v),o.setAttribute("contenteditable",String(!y.readonly)),o.setAttribute("aria-readonly",String(y.readonly)),o.setAttribute("aria-invalid",String(y.invalid)),y.describedBy&&o.setAttribute("aria-describedby",y.describedBy)}}};function Sr(e,t,n){let r=t.createElement("div");r.className="fd-richtext-bar",r.setAttribute("role","toolbar"),r.setAttribute("aria-label",n.formatting);let a=null,i=()=>{e.focus();let f=t.getSelection();a&&f&&(f.removeAllRanges(),f.addRange(a))},o=(f,w)=>{i(),t.execCommand?.(f,!1,w)},d=t.createElement("select");d.className="fd-richtext-style",d.setAttribute("aria-label",n.textStyle);for(let[f,w]of[["p","paragraph"],["h2","heading"],["h3","subheading"]]){let b=t.createElement("option");b.value=f,b.textContent=n[w],d.append(b)}d.addEventListener("change",()=>o("formatBlock",`<${d.value}>`));let s=t.createElement("div");s.className="fd-link-row",s.hidden=!0;let l=t.createElement("input");l.className="fd-input",l.type="url",l.placeholder="https://",l.setAttribute("aria-label",n.linkAddress);let p=t.createElement("button");p.type="button",p.className="fd-button fd-link-apply",p.textContent=n.applyLink;let y=t.createElement("button");y.type="button",y.className="fd-button fd-button-link fd-link-remove",y.textContent=n.removeLink,s.append(l,p,y),p.addEventListener("click",()=>{let f=Sn(l.value);if(!f){l.setAttribute("aria-invalid","true");return}l.setAttribute("aria-invalid","false"),i(),t.execCommand?.("createLink",!1,f),s.hidden=!0}),y.addEventListener("click",()=>{i(),t.execCommand?.("unlink",!1),s.hidden=!0}),l.addEventListener("keydown",f=>{f.key==="Enter"?(f.preventDefault(),p.click()):f.key==="Escape"&&(f.preventDefault(),s.hidden=!0,i())});let v=kn.map(([f,w,b])=>{let u=t.createElement("button");return u.type="button",u.className="fd-richtext-tool",u.setAttribute("aria-label",n[f]),u.title=n[f],u.innerHTML=b,u.querySelector("svg")?.setAttribute("aria-hidden","true"),["bold","italic","underline"].includes(w)&&u.setAttribute("aria-pressed","false"),u.addEventListener("mousedown",E=>E.preventDefault()),u.addEventListener("click",()=>{if(w!=="createLink")return o(w);s.hidden=!1,l.value="",l.focus()}),u});r.append(d,...v);let h=[d,...v];h.forEach((f,w)=>f.tabIndex=w===0?0:-1),r.addEventListener("keydown",f=>{if(f.key!=="ArrowRight"&&f.key!=="ArrowLeft")return;let w=h.indexOf(t.activeElement);if(w<0)return;let b=getComputedStyle(r).direction==="rtl",u=f.key==="ArrowRight"!==b?1:-1,E=h[(w+u+h.length)%h.length];f.preventDefault(),h.forEach(k=>k.tabIndex=k===E?0:-1),E.focus()});let g=()=>{let f=t.getSelection();if(!f||!f.rangeCount||!e.contains(f.anchorNode))return;a=f.getRangeAt(0).cloneRange();for(let b of v){let u=kn[v.indexOf(b)][1];b.hasAttribute("aria-pressed")&&b.setAttribute("aria-pressed",String(t.queryCommandState?.(u)??!1))}let w=String(t.queryCommandValue?.("formatBlock")??"").toLowerCase().replace(/[<>]/g,"");d.value=w==="h2"||w==="h3"?w:"p"};return t.addEventListener("selectionchange",g),{bar:r,linkRow:s,destroy:()=>t.removeEventListener("selectionchange",g)}}var Bt=({form:e,name:t,id:n,document:r,labels:a=de.en})=>{let i=r.createElement("div");i.className="fd-json";let o=r.createElement("textarea");o.id=n,o.className="fd-input fd-textarea fd-code",o.spellcheck=!1;let d=r.createElement("div");return d.className="fd-cell-error",d.hidden=!0,i.append(o,d),o.addEventListener("input",()=>{if(o.value.trim()===""){d.hidden=!0,e.setValue(t,null);return}try{let s=JSON.parse(o.value);d.hidden=!0,e.setValue(t,s)}catch{d.hidden=!1,d.textContent=a.invalidJson}}),{element:i,focus:()=>o.focus(),update(s){if(r.activeElement!==o){let l=s.value===null||s.value===void 0?"":JSON.stringify(s.value,null,2);o.value!==l&&(o.value=l)}o.readOnly=s.readonly,o.setAttribute("aria-invalid",String(s.invalid||!d.hidden))}}};function ke(e,t={}){let{field:n,node:r}=e,a=[r.widget?`${n.type}.${r.widget}`:null,n.type==="selection"&&n.multiple?"selection.checkboxes":null,n.type].filter(i=>i!==null);for(let i of a){let o=t[i]??Nn[i];if(o)return o(e)}return Mr(e)}function le(e,t,n={},...r){let a=e.createElement(t);for(let[i,o]of Object.entries(n))o!==void 0&&a.setAttribute(i,o);return a.append(...r),a}function Re(e,t){e.setAttribute("aria-invalid",String(t.invalid)),e.setAttribute("aria-required",String(t.required)),t.describedBy?e.setAttribute("aria-describedby",t.describedBy):e.removeAttribute("aria-describedby")}var kt=e=>e==null?"":String(e);function Qe(e){return({form:t,name:n,field:r,node:a,id:i,document:o})=>{let d=le(o,"input",{id:i,type:e,class:"fd-input",autocomplete:"off"});return r.type==="char"&&r.size!==void 0&&(d.maxLength=r.size),a.placeholder&&(d.placeholder=a.placeholder),d.addEventListener("input",()=>t.setValue(n,d.value===""?null:d.value)),{element:d,focus:()=>d.focus(),update(s){let l=kt(s.value);d.value!==l&&(d.value=l),d.readOnly=s.readonly,Re(d,s)}}}}var Lr=({form:e,name:t,field:n,node:r,id:a,document:i})=>{let o=le(i,"textarea",{id:a,class:"fd-input fd-textarea",rows:"3"});return n.type==="text"&&n.size!==void 0&&(o.maxLength=n.size),r.placeholder&&(o.placeholder=r.placeholder),o.addEventListener("input",()=>e.setValue(t,o.value===""?null:o.value)),{element:o,focus:()=>o.focus(),update(d){let s=kt(d.value);o.value!==s&&(o.value=s),o.readOnly=d.readonly,Re(o,d)}}},Er=/^-?(\d+\.?\d*|\.\d+)$/,Rr=/^-?\.?$/,qt=e=>{let{form:t,name:n,field:r,node:a,id:i,document:o,locale:d="en"}=e,s=r.type==="integer",l=s?0:(r.type==="float"||r.type==="monetary"?r.digits?.[1]:void 0)??2,p=F=>typeof F=="number"?Pe(F,l,d):kt(F),y=le(o,"input",{id:i,type:"text",class:"fd-input fd-number-input",autocomplete:"off"});y.inputMode=s?"numeric":"decimal",a.placeholder&&(y.placeholder=a.placeholder);let v=F=>{let O=At(F.trim(),d);if(O==="")return null;if(Er.test(O))return Number(O);if(!Rr.test(O))return O};y.addEventListener("input",()=>{let F=v(y.value);F!==void 0&&t.setValue(n,F)}),y.addEventListener("blur",()=>{y.value=p(t.getState().values[n])});let h=a.options??{},g=r.type==="monetary"?r.currencyField:void 0,f=g?t.page.fields[g]:void 0,w=g&&f&&h.pickCurrency===!0?ke({...e,name:g,field:f,node:{type:"field",id:`${a.id}.currency`,field:g},id:`${i}-currency`}):null;w&&f&&w.element.querySelector("input, select")?.setAttribute("aria-label",f.label),w?.element.matches("input, select")&&f&&w.element.setAttribute("aria-label",f.label);let b=r.type==="monetary"&&!w?le(o,"span",{class:"fd-currency","aria-hidden":"true"}):null,u=w?.element??b,E=h.symbol==="after";return{element:u?le(o,"span",{class:`fd-number${E?" fd-currency-after":""}${w?" fd-currency-picked":""}`},...E?[y,u]:[u,y]):y,focus:()=>y.focus(),update(F){let O=o.activeElement===y,M=v(y.value),P=M===void 0||M===F.value;if(!(O&&P)){let H=p(F.value);y.value!==H&&(y.value=H)}if(y.readOnly=F.readonly,Re(y,F),w&&g&&w.update({value:F.values[g],values:F.values,readonly:F.readonly,required:!1,invalid:!1}),b&&r.type==="monetary"){let H=r.currencyField?F.values[r.currencyField]:null;b.textContent=H&&typeof H=="object"&&"label"in H?H.label:typeof H=="string"?H:r.currency??""}}}};function Ln(e){return({form:t,name:n,id:r,document:a})=>{let i=le(a,"input",{id:r,type:"checkbox",class:e?"fd-switch":"fd-checkbox",role:e});return i.addEventListener("change",()=>t.setValue(n,i.checked)),{element:i,focus:()=>i.focus(),update(o){i.checked=o.value===!0,i.disabled=o.readonly,Re(i,o)}}}}function Fn(e){return e.type==="selection"?e.options:[]}var Fr=({form:e,name:t,field:n,id:r,document:a})=>{let i=Fn(n),o=le(a,"select",{id:r,class:"fd-input fd-select"},le(a,"option",{value:""}));return i.forEach((d,s)=>o.append(le(a,"option",{value:String(s)},d.label))),o.addEventListener("change",()=>e.setValue(t,o.value===""?null:i[Number(o.value)].value)),{element:o,focus:()=>o.focus(),update(d){let s=i.findIndex(l=>l.value===d.value);o.value=s===-1?"":String(s),o.disabled=d.readonly,Re(o,d)}}};function En(e){return({form:t,name:n,field:r,id:a,document:i})=>{let o=Fn(r),d=le(i,"div",{id:a,class:`fd-choices fd-choices-${e}`,role:e==="radio"?"radiogroup":"group"}),s=o.map((l,p)=>{let y=le(i,"input",{type:e,name:a,value:String(p),id:`${a}-${p}`});return d.append(le(i,"label",{class:"fd-choice",for:`${a}-${p}`},y,le(i,"span",{},l.label))),y});return d.addEventListener("change",()=>{if(e==="radio"){let l=s.findIndex(p=>p.checked);t.setValue(n,l===-1?null:o[l].value)}else t.setValue(n,o.filter((l,p)=>s[p].checked).map(l=>l.value))}),{element:d,focus:()=>(s.find(l=>l.checked)??s[0])?.focus(),update(l){let p=Array.isArray(l.value)?l.value:[l.value];s.forEach((y,v)=>{y.checked=p.includes(o[v].value),y.disabled=l.readonly}),Re(d,l)}}}}function Rn(e){return({form:t,name:n,field:r,id:a,document:i})=>{let o="min"in r&&r.min!==void 0?r.min:e==="rating"?1:0,d="max"in r&&r.max!==void 0?r.max:e==="rating"?5:10,s=le(i,"div",{id:a,class:`fd-points fd-${e}`,role:"radiogroup"}),l=[];for(let p=o;p<=d;p++){let y=le(i,"button",{type:"button",role:"radio","aria-label":`${p} of ${d}`,"data-value":String(p)},e==="rating"?"\u2605":String(p));e==="scale"&&y.removeAttribute("aria-label"),y.addEventListener("click",()=>t.setValue(n,p)),l.push(y),s.append(y)}return s.addEventListener("keydown",p=>{let y=t.getState().values[n],v=typeof y=="number"?y:o-1,h=p.key==="ArrowRight"||p.key==="ArrowUp"?1:p.key==="ArrowLeft"||p.key==="ArrowDown"?-1:0;if(!h)return;p.preventDefault();let g=Math.min(d,Math.max(o,v+h));t.setValue(n,g),l[g-o]?.focus()}),{element:s,focus:()=>(l.find(p=>p.getAttribute("aria-checked")==="true")??l[0])?.focus(),update(p){let y=typeof p.value=="number"?p.value:null;l.forEach((v,h)=>{let g=o+h;v.setAttribute("aria-checked",String(g===y)),v.classList.toggle("fd-on",e==="rating"?y!==null&&g<=y:g===y),v.tabIndex=g===y||y===null&&h===0?0:-1,v.disabled=p.readonly}),Re(s,p)}}}}var Nr=e=>{let{form:t,name:n,id:r,document:a,node:i}=e,o=le(a,"input",{id:r,type:"date",class:"fd-input fd-date"});o.addEventListener("input",()=>t.setValue(n,o.value||null));let d={element:o,focus:()=>o.focus(),update(s){let l=kt(s.value);o.value!==l&&(o.value=l),o.readOnly=s.readonly,Re(o,s)}};return i.options?.weekNumbers===!0?xt(d,e,"date"):d},wt=e=>String(e).padStart(2,"0"),Ar=e=>{let{form:t,name:n,id:r,document:a,node:i}=e,o=le(a,"input",{id:r,type:"datetime-local",class:"fd-input fd-datetime"}),d=l=>{if(typeof l!="string"||!l)return"";let p=new Date(l);return Number.isNaN(p.getTime())?"":`${p.getFullYear()}-${wt(p.getMonth()+1)}-${wt(p.getDate())}T${wt(p.getHours())}:${wt(p.getMinutes())}`};o.addEventListener("input",()=>{if(!o.value)return t.setValue(n,null);let l=new Date(o.value);Number.isNaN(l.getTime())||t.setValue(n,l.toISOString())});let s={element:o,focus:()=>o.focus(),update(l){let p=d(l.value);o.value!==p&&(o.value=p),o.readOnly=l.readonly,Re(o,l)}};return i.options?.weekNumbers===!0?xt(s,e,"datetime"):s};function Mr({field:e,id:t,document:n}){let r=le(n,"span",{id:t,class:"fd-pending","data-fd-pending":e.type});return{element:r,focus:()=>{},update(a){r.textContent=ht(a.value,e)}}}function ht(e,t){if(e==null)return"";switch(t.type){case"many2one":case"reference":return e.label;case"many2many":return e.map(n=>n.label).join(", ");case"one2many":{let n=e.length;return`${n} ${n===1?"line":"lines"}`}case"binary":case"image":return e.name;case"html":return String(e).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();default:return typeof e=="object"?JSON.stringify(e):String(e)}}var Nn={char:Qe("text"),"char.email":Qe("email"),"char.phone":Qe("tel"),"char.url":Qe("url"),"char.password":Qe("password"),"char.tags":Tt,text:Lr,integer:qt,float:qt,monetary:qt,"integer.rating":Rn("rating"),"integer.scale":Rn("scale"),"integer.progressbar":Ze,"integer.label":Xe,"float.label":Xe,"monetary.label":Xe,"float.progressbar":Ze,"monetary.progressbar":Ze,boolean:Ln(),"boolean.toggle":Ln("switch"),selection:Fr,"selection.radio":En("radio"),"selection.checkboxes":En("checkbox"),"selection.statusbar":yt,date:Nr,datetime:Ar,many2one:Mt,"many2one.statusbar":yt,many2many:bt,"many2many.tags":bt,"many2many.checkboxes":Ct,reference:$t,one2many:Ot,binary:It,image:Dt,html:Ht,json:Bt,properties:zt};var Mn=`
3
- /* .fd-theme carries the same tokens for things outside a form, such as a dialog over the page. */
4
- .fd-form, .fd-theme {
5
- --fd-font: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "Noto Sans Arabic", sans-serif;
6
- --fd-text: #212529;
7
- --fd-muted: #6b7280;
8
- --fd-page: #f2f3f5;
9
- --fd-surface: #ffffff;
10
- --fd-border: #cfd4da;
11
- --fd-border-strong: #9aa3ad;
12
- --fd-accent: #002855;
13
- --fd-accent-text: #ffffff;
14
- --fd-accent-soft: #e6ebf2;
15
- --fd-focus: #002855;
16
- --fd-focus-ring: none;
17
- --fd-error: #c62828;
18
- --fd-error-soft: #fdecea;
19
- --fd-success: #2e7d32;
20
- --fd-success-soft: #e8f5e9;
21
- --fd-warning: #8a5300;
22
- --fd-warning-soft: #fff4e0;
23
- --fd-info: #0b5cad;
24
- --fd-info-soft: #e7f0fb;
25
- --fd-radius: 0px;
26
- --fd-control-radius: 0px;
27
- --fd-pad-y: 3px;
28
- --fd-pad-x: 4px;
29
- --fd-input-border: 0 0 1px 0;
30
- --fd-label-weight: 600;
31
- --fd-gap-x: 32px;
32
- --fd-gap-y: 14px;
33
- container-type: inline-size;
34
- font-family: var(--fd-font);
35
- font-size: 14px;
36
- line-height: 1.45;
37
- color: var(--fd-text);
38
- -webkit-text-size-adjust: 100%;
39
- }
40
- .fd-form[data-fd-skin="outlined"], .fd-theme[data-fd-skin="outlined"] {
41
- --fd-text: rgba(0, 0, 0, 0.88);
42
- --fd-muted: rgba(0, 0, 0, 0.55);
43
- --fd-page: #f5f5f5;
44
- --fd-border: #d9d9d9;
45
- --fd-border-strong: #bfbfbf;
46
- --fd-accent: #1677ff;
47
- --fd-accent-soft: #e6f4ff;
48
- --fd-focus: #1677ff;
49
- --fd-focus-ring: 0 0 0 2px rgba(5, 145, 255, 0.12);
50
- --fd-error: #ff4d4f;
51
- --fd-error-soft: #fff2f0;
52
- --fd-radius: 8px;
53
- --fd-control-radius: 6px;
54
- --fd-pad-y: 4px;
55
- --fd-pad-x: 11px;
56
- --fd-input-border: 1px;
57
- --fd-label-weight: 400;
58
- --fd-gap-x: 24px;
59
- --fd-gap-y: 18px;
60
- }
61
- .fd-form *, .fd-form *::before, .fd-form *::after { box-sizing: border-box; }
62
- .fd-form [hidden] { display: none !important; }
63
-
64
- /* ---- page frame ---------------------------------------------------------- */
65
- .fd-page-head { display: grid; gap: 4px; margin-block-end: 20px; }
66
- .fd-page-title { font-size: 22px; font-weight: 650; margin: 0; line-height: 1.25; }
67
- .fd-page-description { color: var(--fd-muted); margin: 0; }
68
-
69
- /* ---- how wide a page goes, and Save above its sections ----------------------- */
70
- .fd-form[data-max-width="narrow"] { --fd-page-max: 640px; }
71
- .fd-form[data-max-width="medium"] { --fd-page-max: 900px; }
72
- .fd-form[data-max-width="wide"] { --fd-page-max: 1180px; }
73
- .fd-form[data-max-width="full"] { --fd-page-max: none; }
74
- .fd-form[data-max-width] > .fd-content:not(:has(> .fd-sheet-page)) { max-width: var(--fd-page-max); margin-inline: auto; }
75
- .fd-actions.fd-actions-top { margin-block-start: 0; padding-block-end: 14px; margin-block-end: 18px; border-block-end: 1px solid var(--fd-border); }
76
-
77
- /* ---- icons: drawn with lines in the colour of the words beside them ------------ */
78
- .fd-icon { width: 1.15em; height: 1.15em; flex: none; vertical-align: -0.2em; }
79
- .fd-section-title .fd-icon, .fd-tab .fd-icon, .fd-button .fd-icon, .fd-step-title .fd-icon { margin-inline-end: 0.4em; }
80
- .fd-section-title .fd-icon { color: var(--fd-muted); }
81
-
82
- /* ---- fields ---------------------------------------------------------------- */
83
- .fd-grid {
84
- display: grid;
85
- grid-template-columns: repeat(var(--fd-columns, 1), minmax(0, 1fr));
86
- gap: var(--fd-gap-y) var(--fd-gap-x);
87
- align-items: start;
88
- }
89
- .fd-field { display: grid; gap: 4px; min-width: 0; grid-column: span min(var(--fd-span, 1), var(--fd-columns, 1)); }
90
- .fd-label { font-weight: var(--fd-label-weight); color: var(--fd-text); }
91
- /* The \u2713 of a field filled in right, by its label. */
92
- .fd-valid-mark { color: var(--fd-success); width: 1em; height: 1em; margin-inline-start: 6px; vertical-align: -0.15em; stroke-width: 2.4; }
93
- .fd-field.fd-required > .fd-label::after { content: " *"; color: var(--fd-error); }
94
- .fd-form[data-fd-skin="outlined"] .fd-field.fd-required > .fd-label::after { content: ""; }
95
- .fd-form[data-fd-skin="outlined"] .fd-field.fd-required > .fd-label::before { content: "* "; color: var(--fd-error); }
96
- .fd-help { color: var(--fd-muted); font-size: 12.5px; }
97
- .fd-error { color: var(--fd-error); font-size: 12.5px; }
98
- .fd-warning {
99
- color: var(--fd-warning); background: var(--fd-warning-soft); font-size: 12.5px;
100
- padding: 3px 8px; border-radius: var(--fd-control-radius); justify-self: start;
101
- }
102
-
103
- /* underline: label beside the value, the way a Flectra sheet reads */
104
- .fd-form[data-fd-skin="underline"] .fd-field {
105
- /* One label width for every field, so a field spanning two columns lines up with its neighbours. */
106
- grid-template-columns: var(--fd-label-width, 11em) minmax(0, 1fr);
107
- column-gap: 12px;
108
- align-items: baseline;
109
- }
110
- .fd-form[data-fd-skin="underline"] .fd-field > .fd-label { grid-column: 1; }
111
- /* A table of lines needs the full width: its label sits above it. */
112
- .fd-form[data-fd-skin="underline"] .fd-field[data-type="one2many"] { grid-template-columns: minmax(0, 1fr); }
113
- .fd-form[data-fd-skin="underline"] .fd-field[data-type="one2many"] > * { grid-column: 1 !important; }
114
- .fd-form[data-fd-skin="underline"] .fd-field > :not(.fd-label) { grid-column: 2; }
115
- /* A label beside every value needs room twice over: the underline skin stacks its columns sooner. */
116
- @container (max-width: 760px) {
117
- .fd-form[data-fd-skin="underline"] .fd-grid { grid-template-columns: minmax(0, 1fr); }
118
- .fd-form[data-fd-skin="underline"] .fd-field { grid-column: auto; }
119
- /* A section that says how many columns it keeps here keeps them, in either skin. */
120
- .fd-form .fd-grid[data-columns-medium] { grid-template-columns: repeat(var(--fd-columns-medium), minmax(0, 1fr)); }
121
- .fd-form .fd-grid[data-columns-medium] > .fd-field { grid-column: span min(var(--fd-span, 1), var(--fd-columns-medium)); }
122
- /* Kept side by side here, the underline skin's fields have no room for a label beside: it goes above. */
123
- .fd-form[data-fd-skin="underline"] .fd-grid[data-columns-medium]:not([data-columns-medium="1"]) .fd-field { grid-template-columns: minmax(0, 1fr); }
124
- .fd-form[data-fd-skin="underline"] .fd-grid[data-columns-medium]:not([data-columns-medium="1"]) .fd-field > * { grid-column: 1 !important; }
125
- }
126
- @container (max-width: 520px) {
127
- .fd-grid { grid-template-columns: minmax(0, 1fr); }
128
- .fd-field { grid-column: auto; }
129
- .fd-form[data-fd-skin="underline"] .fd-field { grid-template-columns: minmax(0, 1fr); }
130
- .fd-form[data-fd-skin="underline"] .fd-field > * { grid-column: 1 !important; }
131
- /* The narrow count, or one column when only the medium one was given. */
132
- .fd-form .fd-grid[data-columns-medium], .fd-form .fd-grid[data-columns-narrow] { grid-template-columns: repeat(var(--fd-columns-narrow, 1), minmax(0, 1fr)); }
133
- .fd-form .fd-grid[data-columns-medium] > .fd-field, .fd-form .fd-grid[data-columns-narrow] > .fd-field { grid-column: span min(var(--fd-span, 1), var(--fd-columns-narrow, 1)); }
134
- }
135
-
136
- /* ---- inputs ---------------------------------------------------------------- */
137
- .fd-input {
138
- width: 100%;
139
- min-width: 0;
140
- font: inherit;
141
- color: inherit;
142
- background: var(--fd-surface);
143
- border: solid var(--fd-border);
144
- border-width: var(--fd-input-border);
145
- border-radius: var(--fd-control-radius);
146
- padding: var(--fd-pad-y) var(--fd-pad-x);
147
- min-height: 30px;
148
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
149
- }
150
- .fd-input::placeholder { color: var(--fd-muted); opacity: 0.8; }
151
- .fd-input:hover { border-color: var(--fd-border-strong); }
152
- .fd-input:focus { outline: none; border-color: var(--fd-focus); box-shadow: var(--fd-focus-ring); }
153
- .fd-form[data-fd-skin="underline"] .fd-input { background: transparent; }
154
- .fd-form[data-fd-skin="underline"] .fd-input:focus { box-shadow: 0 1px 0 0 var(--fd-focus); }
155
- .fd-form[data-fd-skin="underline"] .fd-field.fd-required .fd-input { border-color: var(--fd-accent); }
156
- .fd-input[readonly] { background: transparent; border-color: transparent; padding-inline: 0; }
157
- .fd-form[data-fd-skin="outlined"] .fd-input[readonly] { background: rgba(0, 0, 0, 0.04); border-color: var(--fd-border); padding-inline: var(--fd-pad-x); color: var(--fd-muted); }
158
- /* A whole form locked reads as a record: plain values in either skin, no boxes, and no prompts to type. */
159
- .fd-form[data-readonly] .fd-input[readonly] { background: transparent; border-color: transparent; padding-inline: 0; color: var(--fd-text); }
160
- .fd-form[data-readonly] .fd-input::placeholder { color: transparent; }
161
- .fd-form[data-readonly] select.fd-input:disabled { appearance: none; background: transparent; border-color: transparent; padding-inline: 0; color: var(--fd-text); opacity: 1; }
162
- .fd-input[aria-invalid="true"] { border-color: var(--fd-error); }
163
- .fd-form[data-fd-skin="outlined"] .fd-input[aria-invalid="true"]:focus { box-shadow: 0 0 0 2px rgba(255, 38, 5, 0.06); }
164
- .fd-textarea { resize: vertical; min-height: 64px; }
165
- .fd-select { appearance: auto; }
166
- .fd-number { display: flex; align-items: baseline; gap: 6px; }
167
- .fd-number-input { font-variant-numeric: tabular-nums; }
168
- .fd-currency { color: var(--fd-muted); font-size: 12.5px; font-weight: 600; }
169
- /* With the currency after it, the amount ends right beside it. */
170
- .fd-currency-after > .fd-number-input { text-align: end; }
171
- /* A picked currency is a small box of its own beside the amount. */
172
- .fd-currency-picked { align-items: center; }
173
- .fd-currency-picked > :not(.fd-number-input) { flex: 0 0 104px; min-width: 0; }
174
- .fd-currency-picked > .fd-number-input { flex: 1 1 auto; min-width: 0; }
175
- .fd-pending { color: var(--fd-muted); font-style: italic; }
176
- .fd-pending:empty::before { content: "\u2014"; }
177
-
178
- .fd-checkbox, .fd-choice input { width: 16px; height: 16px; accent-color: var(--fd-accent); margin: 0; }
179
- .fd-switch {
180
- appearance: none; width: 34px; height: 20px; margin: 0; border-radius: 999px; position: relative;
181
- background: var(--fd-border-strong); cursor: pointer; transition: background 0.2s ease;
182
- }
183
- .fd-switch::after {
184
- content: ""; position: absolute; inset-block-start: 2px; inset-inline-start: 2px; width: 16px; height: 16px;
185
- border-radius: 50%; background: #fff; transition: transform 0.2s ease; box-shadow: 0 1px 2px rgba(0,0,0,0.25);
186
- }
187
- .fd-switch:checked { background: var(--fd-accent); }
188
- .fd-switch:checked::after { transform: translateX(14px); }
189
- [dir="rtl"] .fd-switch:checked::after { transform: translateX(-14px); }
190
- .fd-choices { display: flex; flex-wrap: wrap; gap: 6px 18px; }
191
- .fd-choice { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }
192
- .fd-points { display: flex; flex-wrap: wrap; gap: 6px; }
193
- .fd-points button {
194
- font: inherit; cursor: pointer; border: 1px solid var(--fd-border); background: var(--fd-surface);
195
- color: var(--fd-text); border-radius: var(--fd-control-radius); min-width: 34px; height: 34px; padding: 0 8px;
196
- }
197
- .fd-points button.fd-on { background: var(--fd-accent); color: var(--fd-accent-text); border-color: var(--fd-accent); }
198
- .fd-rating button { border: none; background: none; font-size: 24px; color: var(--fd-border-strong); padding: 0 2px; min-width: 0; }
199
- .fd-rating button.fd-on { background: none; color: #f5a623; }
200
- .fd-points button:disabled, .fd-choice input:disabled { cursor: default; }
201
- .fd-form :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
202
- .fd-form .fd-input:focus-visible { outline: none; }
203
-
204
- /* ---- pickers: many2one, many2many, reference ------------------------------ */
205
- .fd-combo { position: relative; display: flex; align-items: center; min-width: 0; }
206
- .fd-combo-input { padding-inline-end: 28px; }
207
- .fd-combo-clear {
208
- position: absolute; inset-inline-end: 4px; border: none; background: none; cursor: pointer; color: var(--fd-muted);
209
- font-size: 16px; line-height: 1; padding: 2px 6px; border-radius: 4px;
210
- }
211
- .fd-combo-clear:hover { color: var(--fd-text); background: var(--fd-page); }
212
- /* A link that can be opened has its open button beside the clear button. */
213
- .fd-combo:has(> .fd-combo-open:not([hidden])) .fd-combo-input { padding-inline-end: 52px; }
214
- .fd-combo-open {
215
- position: absolute; inset-inline-end: 28px; border: none; background: none; cursor: pointer; color: var(--fd-accent);
216
- font-size: 14px; line-height: 1; padding: 2px 6px; border-radius: 4px;
217
- }
218
- .fd-combo-open:hover { background: var(--fd-page); }
219
- .fd-listbox {
220
- position: absolute; inset-inline: 0; inset-block-start: calc(100% + 2px); z-index: 20; margin: 0; padding: 4px 0;
221
- list-style: none; background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 4px);
222
- box-shadow: 0 8px 24px rgba(15, 20, 25, 0.12); max-height: 240px; overflow-y: auto;
223
- }
224
- .fd-option { padding: 6px 12px; cursor: pointer; }
225
- .fd-option:hover, .fd-option.fd-active { background: var(--fd-accent-soft); }
226
- .fd-option-create { color: var(--fd-accent); border-block-start: 1px solid var(--fd-border); }
227
- .fd-empty { padding: 6px 12px; color: var(--fd-muted); font-style: italic; }
228
- .fd-tags { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-width: 0; }
229
- .fd-chips { display: contents; list-style: none; margin: 0; padding: 0; }
230
- .fd-chip {
231
- display: inline-flex; align-items: center; gap: 4px; padding: 1px 4px 1px 10px; border-radius: 999px;
232
- background: var(--fd-accent-soft); color: var(--fd-text); font-size: 13px; line-height: 22px;
233
- }
234
- .fd-chip-remove { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 15px; line-height: 1; padding: 0 4px; border-radius: 999px; }
235
- .fd-chip-remove:hover { color: var(--fd-error); }
236
- .fd-tags .fd-combo { flex: 1 1 140px; }
237
- .fd-reference { display: grid; grid-template-columns: minmax(7em, 34%) minmax(0, 1fr); gap: 8px; }
238
-
239
- /* ---- one2many lines ------------------------------------------------------- */
240
- .fd-lines { display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; min-width: 0; }
241
- /* The table scrolls sideways inside its own box; the grid around it must not grow to the table's width. */
242
- /* position: relative keeps the cells' hidden labels inside the scroll box; without it they widen the page. */
243
- .fd-lines-scroll { overflow-x: auto; min-width: 0; position: relative; }
244
- .fd-lines-table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
245
- .fd-lines-table th { text-align: start; font-weight: 600; color: var(--fd-muted); font-size: 12.5px; padding: 6px 8px; border-block-end: 1px solid var(--fd-border); white-space: nowrap; }
246
- .fd-lines-table td { padding: 4px 8px; border-block-end: 1px solid var(--fd-border); vertical-align: top; min-width: 7em; }
247
- .fd-lines-table td.fd-lines-tools, .fd-lines-table th.fd-lines-tools { width: 32px; min-width: 32px; padding-inline: 0; text-align: center; }
248
- .fd-lines-table .fd-input { min-height: 28px; }
249
- /* A yes/no cell sits level with the inputs beside it. */
250
- .fd-lines-table td > .fd-checkbox, .fd-lines-table td > .fd-switch { margin-block-start: 6px; }
251
- .fd-line-delete { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 16px; line-height: 1; padding: 4px 6px; border-radius: 4px; }
252
- .fd-line-delete:hover { color: var(--fd-error); background: var(--fd-error-soft); }
253
- .fd-lines-totals td { padding: 8px; font-weight: 600; border-block-start: 1px solid var(--fd-border); font-variant-numeric: tabular-nums; }
254
- .fd-lines-adds { display: flex; flex-wrap: wrap; gap: 4px 16px; justify-self: start; }
255
- /* A section heads the lines below it; a note reads as a remark between them. */
256
- .fd-line-section td { background: var(--fd-page); }
257
- .fd-line-section .fd-input { font-weight: 600; }
258
- .fd-line-note .fd-input { font-style: italic; }
259
- .fd-cell-error { color: var(--fd-error); font-size: 12px; }
260
- .fd-sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
261
-
262
- /* ---- files, images, rich text, json ------------------------------------ */
263
- .fd-file { display: grid; gap: 8px; justify-items: start; padding: 6px 0; border-radius: var(--fd-control-radius); }
264
- .fd-file.fd-dragging { outline: 2px dashed var(--fd-accent); outline-offset: 4px; }
265
- .fd-file-pick { display: inline-flex; flex-wrap: wrap; gap: 8px; align-items: center; cursor: pointer; }
266
- .fd-file-chosen { display: inline-flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; }
267
- .fd-file-name { font-variant-numeric: tabular-nums; }
268
- .fd-image-pick {
269
- width: 120px; height: 120px; border: 1px dashed var(--fd-border-strong); border-radius: var(--fd-control-radius);
270
- display: grid; place-content: center; justify-items: center; text-align: center; padding: 8px; background: var(--fd-page);
271
- }
272
- .fd-image-pick .fd-button { border: none; background: none; color: var(--fd-accent); padding: 0; min-height: 0; }
273
- .fd-image-pick:hover { border-color: var(--fd-accent); }
274
- .fd-avatar .fd-image-pick { width: 88px; height: 88px; }
275
- .fd-image-preview { max-width: 160px; max-height: 160px; border-radius: var(--fd-control-radius); border: 1px solid var(--fd-border); object-fit: cover; background: var(--fd-page); }
276
- .fd-richtext { min-height: 96px; line-height: 1.5; overflow-wrap: anywhere; }
277
- .fd-richtext-box { display: grid; gap: 0; min-width: 0; }
278
- .fd-richtext-box > .fd-richtext { border-start-start-radius: 0; border-start-end-radius: 0; }
279
- .fd-richtext-bar {
280
- display: flex; flex-wrap: wrap; align-items: center; gap: 2px; padding: 4px; min-width: 0;
281
- border: 1px solid var(--fd-border); border-block-end: none; border-start-start-radius: var(--fd-control-radius); border-start-end-radius: var(--fd-control-radius);
282
- background: var(--fd-page);
283
- }
284
- .fd-richtext-style { font: inherit; font-size: 12.5px; padding: 3px 6px; margin-inline-end: 4px; border: 1px solid var(--fd-border); border-radius: 4px; background: var(--fd-surface); color: var(--fd-text); }
285
- .fd-richtext-tool {
286
- display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: none; border-radius: 4px;
287
- background: none; cursor: pointer; color: var(--fd-text); font: inherit; font-size: 14px;
288
- }
289
- .fd-richtext-tool:hover { background: var(--fd-surface); }
290
- .fd-richtext-tool[aria-pressed="true"] { background: var(--fd-accent-soft); color: var(--fd-accent); }
291
- .fd-richtext-tool svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.3; stroke-linecap: round; }
292
- .fd-richtext-tool svg circle { fill: currentColor; stroke: none; }
293
- .fd-link-row { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 6px; border: 1px solid var(--fd-border); border-block-end: none; background: var(--fd-surface); }
294
- .fd-link-row > .fd-input { flex: 1 1 200px; min-width: 0; }
295
- .fd-richtext[contenteditable="false"] { background: transparent; border-color: transparent; padding-inline: 0; min-height: 0; }
296
- .fd-richtext p { margin: 0 0 6px; }
297
- .fd-code { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 12.5px; min-height: 96px; }
298
-
299
- /* ---- sections, tabs ---------------------------------------------------- */
300
- .fd-sections { display: grid; gap: 24px; }
301
- .fd-section { border: 0; margin: 0; padding: 0; min-width: 0; display: grid; gap: 14px; }
302
- .fd-section-title { font-size: 15px; font-weight: 650; padding: 0; margin: 0; float: inline-start; width: 100%; }
303
- .fd-section-title + * { clear: both; }
304
- .fd-form[data-fd-skin="underline"] .fd-section-title {
305
- text-transform: uppercase; letter-spacing: 0.05em; font-size: 12.5px; color: var(--fd-muted);
306
- border-block-end: 1px solid var(--fd-border); padding-block-end: 6px; width: 100%;
307
- }
308
- .fd-section-description { color: var(--fd-muted); margin: 0; }
309
- .fd-section-toggle {
310
- font: inherit; color: inherit; background: none; border: 0; padding: 0; margin: 0; cursor: pointer;
311
- display: inline-flex; align-items: center; gap: 8px; text-align: start;
312
- }
313
- .fd-section-toggle:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; border-radius: 2px; }
314
- .fd-section-chevron {
315
- width: 0.5em; height: 0.5em; border: solid currentColor; border-width: 0 2px 2px 0;
316
- transform: rotate(45deg); margin-block-start: -0.2em; transition: transform 0.15s ease; flex: none;
317
- }
318
- .fd-section-folded .fd-section-chevron { transform: rotate(-45deg); margin-block-start: 0; }
319
- [dir="rtl"] .fd-section-folded .fd-section-chevron { transform: rotate(135deg); }
320
- .fd-form[data-fd-skin="outlined"] .fd-sections > .fd-section {
321
- background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: var(--fd-radius); padding: 20px 24px;
322
- }
323
- .fd-tablist { display: flex; gap: 2px; border-block-end: 1px solid var(--fd-border); overflow-x: auto; }
324
- .fd-tab {
325
- font: inherit; background: none; border: none; cursor: pointer; padding: 8px 14px; color: var(--fd-muted);
326
- border-block-end: 2px solid transparent; margin-block-end: -1px; white-space: nowrap;
327
- }
328
- .fd-tab[aria-selected="true"] { color: var(--fd-accent); border-block-end-color: var(--fd-accent); font-weight: 600; }
329
- .fd-tabpanel { padding-block: 16px; display: grid; gap: 16px; }
330
-
331
- /* ---- buttons ---------------------------------------------------------- */
332
- .fd-button {
333
- font: inherit; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; justify-content: center;
334
- min-height: 32px; padding: 4px 14px; border-radius: var(--fd-control-radius);
335
- border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text);
336
- }
337
- .fd-button:hover { border-color: var(--fd-accent); color: var(--fd-accent); }
338
- .fd-button-primary { background: var(--fd-accent); border-color: var(--fd-accent); color: var(--fd-accent-text); }
339
- .fd-button-primary:hover { color: var(--fd-accent-text); filter: brightness(1.12); }
340
- .fd-button-danger { color: var(--fd-error); border-color: var(--fd-error); }
341
- .fd-button-danger:hover { background: var(--fd-error); color: #fff; }
342
- .fd-button-link { border-color: transparent; background: none; color: var(--fd-accent); padding-inline: 4px; }
343
- .fd-form[data-fd-skin="underline"] .fd-button { border-radius: 3px; }
344
- .fd-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
345
- .fd-actions-end { justify-content: flex-end; margin-block-start: 24px; }
346
-
347
- /* ---- record sheet --------------------------------------------------------- */
348
- .fd-sheet-page { background: var(--fd-page); padding: 0 0 32px; min-width: 0; }
349
- .fd-header {
350
- display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center; justify-content: space-between;
351
- background: var(--fd-surface); border-block-end: 1px solid var(--fd-border); padding: 8px 16px;
352
- }
353
- .fd-statusbar { display: flex; list-style: none; margin: 0; padding: 0; overflow-x: auto; }
354
- .fd-statusbar li { display: flex; }
355
- .fd-statusbar button, .fd-statusbar span {
356
- font: inherit; font-size: 13px; border: none; background: var(--fd-page); color: var(--fd-muted);
357
- padding: 5px 18px 5px 22px; margin-inline-start: -6px; white-space: nowrap;
358
- clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 0 100%, 10px 50%);
359
- }
360
- .fd-statusbar li:first-child button, .fd-statusbar li:first-child span { margin-inline-start: 0; padding-inline-start: 14px;
361
- clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 0 100%); }
362
- .fd-statusbar button { cursor: pointer; }
363
- .fd-statusbar [aria-current="step"] { background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 600; }
364
- [dir="rtl"] .fd-statusbar button, [dir="rtl"] .fd-statusbar span { transform: scaleX(-1); }
365
- [dir="rtl"] .fd-statusbar button > *, [dir="rtl"] .fd-statusbar span > * { display: inline-block; transform: scaleX(-1); }
366
- .fd-sheet-layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; max-width: var(--fd-page-max, 1180px); margin: 16px auto 0; padding-inline: 16px; }
367
- /* Save and Discard closing the sheet, when the page puts them at its foot. */
368
- .fd-sheet-foot { margin: 4px -28px -28px; padding: 12px 28px; border-block-start: 1px solid var(--fd-border); border-end-start-radius: inherit; border-end-end-radius: inherit; }
369
- .fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr) minmax(220px, 300px); }
370
- @container (max-width: 860px) { .fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr); } }
371
- .fd-card {
372
- position: relative; background: var(--fd-surface); border: 1px solid var(--fd-border);
373
- border-radius: var(--fd-radius); padding: 24px 28px 28px; display: grid; gap: 18px; min-width: 0;
374
- }
375
- .fd-ribbon-frame { position: absolute; inset: 0; overflow: hidden; border-radius: inherit; pointer-events: none; }
376
- .fd-ribbon {
377
- position: absolute; inset-block-start: 18px; inset-inline-end: -42px; transform: rotate(45deg); width: 160px;
378
- text-align: center; font-size: 12px; font-weight: 700; padding: 4px 0; color: #fff; background: var(--fd-muted);
379
- text-transform: uppercase; letter-spacing: 0.06em; pointer-events: none;
380
- }
381
- [dir="rtl"] .fd-ribbon { transform: rotate(-45deg); }
382
- .fd-ribbon.fd-tone-danger { background: var(--fd-error); }
383
- .fd-ribbon.fd-tone-success { background: var(--fd-success); }
384
- .fd-ribbon.fd-tone-warning { background: #d97706; }
385
- .fd-ribbon.fd-tone-info { background: var(--fd-info); }
386
- .fd-alert { padding: 10px 14px; border-radius: var(--fd-control-radius); border: 1px solid; font-size: 13.5px; display: flex; align-items: flex-start; gap: 10px; }
387
- .fd-alert-message { flex: 1 1 auto; min-width: 0; }
388
- .fd-alert-close { border: none; background: none; color: inherit; cursor: pointer; font: inherit; font-size: 18px; line-height: 1; padding: 0 4px; border-radius: 4px; opacity: 0.75; }
389
- .fd-alert-close:hover { opacity: 1; }
390
- .fd-alert-close:focus-visible { outline: 2px solid var(--fd-focus); opacity: 1; }
391
- .fd-alert.fd-tone-warning { background: var(--fd-warning-soft); border-color: #f0c47a; color: var(--fd-warning); }
392
- .fd-alert.fd-tone-danger { background: var(--fd-error-soft); border-color: #f1a7a7; color: var(--fd-error); }
393
- .fd-alert.fd-tone-success { background: var(--fd-success-soft); border-color: #a7d7ab; color: var(--fd-success); }
394
- .fd-alert.fd-tone-info, .fd-alert:not([class*="fd-tone-"]) { background: var(--fd-info-soft); border-color: #a9c8ef; color: var(--fd-info); }
395
- .fd-stats { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0; margin: -24px -28px 0; border-block-end: 1px solid var(--fd-border); }
396
- .fd-stats:empty { display: none; }
397
- /* A visible ribbon owns the corner: stat buttons keep clear of it. */
398
- .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stats { padding-inline-end: 104px; }
399
- .fd-stat {
400
- font: inherit; background: none; border: none; border-inline-start: 1px solid var(--fd-border); cursor: pointer;
401
- padding: 8px 18px; display: grid; justify-items: start; line-height: 1.2; color: var(--fd-text); min-width: 120px;
402
- }
403
- .fd-stat:hover { background: var(--fd-page); }
404
- .fd-stat:has(> .fd-icon) { grid-template-columns: auto minmax(0, 1fr); align-items: center; column-gap: 10px; }
405
- .fd-stat > .fd-icon { width: 22px; height: 22px; color: var(--fd-muted); }
406
- .fd-stat-words { display: grid; justify-items: start; }
407
- .fd-stat-value { font-weight: 700; font-size: 15px; color: var(--fd-accent); font-variant-numeric: tabular-nums; }
408
- .fd-stat-label { font-size: 12.5px; color: var(--fd-muted); }
409
- .fd-title-row { display: flex; gap: 16px; align-items: flex-start; justify-content: space-between; }
410
- .fd-title { display: grid; gap: 4px; flex: 1 1 auto; min-width: 0; }
411
- .fd-avatar { flex: none; }
412
- .fd-avatar > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
413
- .fd-form[data-fd-skin="underline"] .fd-avatar { grid-template-columns: minmax(0, 1fr); }
414
- .fd-form[data-fd-skin="underline"] .fd-avatar > * { grid-column: 1 !important; }
415
- .fd-avatar .fd-image-pick {
416
- width: 120px; height: 120px; border: 1px dashed var(--fd-border-strong); border-radius: var(--fd-control-radius);
417
- display: grid; place-content: center; justify-items: center; text-align: center; padding: 8px; background: var(--fd-page);
418
- }
419
- .fd-image-pick .fd-button { border: none; background: none; color: var(--fd-accent); padding: 0; min-height: 0; }
420
- .fd-image-pick:hover { border-color: var(--fd-accent); }
421
- .fd-avatar .fd-image-pick { width: 88px; height: 88px; }
422
- .fd-image-preview { width: 88px; height: 88px; }
423
- .fd-avatar .fd-file-pick .fd-help { display: none; }
424
- .fd-avatar .fd-file-name { display: none; }
425
- .fd-avatar .fd-file { justify-items: center; gap: 2px; padding: 0; }
426
- .fd-avatar .fd-file-chosen { gap: 2px 8px; justify-content: center; font-size: 12.5px; }
427
- /* The title and subtitle themselves: big, their labels only for screen readers. */
428
- .fd-title > .fd-field .fd-input { font-size: 24px; font-weight: 600; min-height: 40px; }
429
- .fd-form[data-fd-skin="underline"] .fd-title > .fd-field { grid-template-columns: minmax(0, 1fr); }
430
- .fd-form[data-fd-skin="underline"] .fd-title > .fd-field > * { grid-column: 1; }
431
- .fd-title > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
432
- /* Fields over and under the title: one row, each label beside its control. */
433
- .fd-title-above, .fd-title-below { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 24px; }
434
- .fd-title-above { margin-block-end: 4px; }
435
- .fd-title-below { margin-block-start: 6px; }
436
- .fd-form .fd-title-above > .fd-field, .fd-form .fd-title-below > .fd-field { display: flex; align-items: center; gap: 8px; grid-template-columns: none; }
437
- .fd-form .fd-title-above > .fd-field > *, .fd-form .fd-title-below > .fd-field > * { grid-column: auto !important; }
438
- .fd-title-above .fd-label:empty, .fd-title-below .fd-label:empty { display: none; }
439
- /* A choice over the title, such as Individual or Company, speaks for itself: its label is for screen readers. */
440
- .fd-title-above > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
441
- .fd-title-statusbar { display: flex; }
442
- /* Badges over the title. */
443
- .fd-badges { display: flex; flex-wrap: wrap; gap: 6px; }
444
- .fd-badge {
445
- display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600; line-height: 1; padding: 5px 10px;
446
- border-radius: 999px; border: 1px solid var(--fd-border); background: var(--fd-page); color: var(--fd-muted);
447
- }
448
- .fd-badge .fd-icon { width: 13px; height: 13px; }
449
- .fd-badge.fd-tone-info { background: var(--fd-info-soft); border-color: #a9c8ef; color: var(--fd-info); }
450
- .fd-badge.fd-tone-success { background: var(--fd-success-soft); border-color: #a7d7ab; color: var(--fd-success); }
451
- .fd-badge.fd-tone-warning { background: var(--fd-warning-soft); border-color: #f0c47a; color: var(--fd-warning); }
452
- .fd-badge.fd-tone-danger { background: var(--fd-error-soft); border-color: #f1a7a7; color: var(--fd-error); }
453
- .fd-side { display: grid; gap: 12px; align-content: start; min-width: 0; }
454
-
455
- /* ---- wizard -------------------------------------------------------------- */
456
- .fd-wizard { display: grid; gap: 20px; }
457
- .fd-progress { display: grid; gap: 8px; }
458
- .fd-progress-text { color: var(--fd-muted); font-size: 13px; }
459
- .fd-value-text { display: block; padding-block: 6px; font-variant-numeric: tabular-nums; }
460
- .fd-date-pick { position: relative; display: flex; align-items: center; gap: 6px; min-width: 0; }
461
- .fd-date-pick > .fd-input { flex: 1 1 auto; min-width: 0; }
462
- .fd-calendar-button {
463
- flex: 0 0 auto; display: grid; place-items: center; width: 32px; height: 32px; padding: 0; cursor: pointer;
464
- border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); color: var(--fd-muted);
465
- }
466
- .fd-calendar-button:hover, .fd-calendar-button[aria-expanded="true"] { color: var(--fd-text); background: var(--fd-page); }
467
- .fd-calendar-button svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; }
468
- .fd-calendar {
469
- position: absolute; inset-block-start: calc(100% + 4px); inset-inline-end: 0; z-index: 30; padding: 8px;
470
- background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px);
471
- box-shadow: 0 8px 24px rgba(15, 20, 25, 0.14);
472
- }
473
- .fd-calendar-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 2px 4px 6px; }
474
- .fd-calendar-head button { border: none; background: none; cursor: pointer; font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; color: var(--fd-text); }
475
- .fd-calendar-head button:hover { background: var(--fd-page); }
476
- .fd-calendar-title { font-weight: 600; }
477
- .fd-calendar-grid { border-collapse: collapse; font-variant-numeric: tabular-nums; }
478
- .fd-calendar-grid th { font-size: 11.5px; font-weight: 600; color: var(--fd-muted); padding: 4px 0; width: 34px; text-align: center; }
479
- .fd-calendar-grid .fd-week { color: var(--fd-accent); font-weight: 600; border-inline-end: 1px solid var(--fd-border); }
480
- .fd-calendar-grid td { padding: 1px; }
481
- .fd-calendar-grid td button {
482
- width: 32px; height: 30px; border: none; border-radius: 4px; background: none; cursor: pointer; color: var(--fd-text); font: inherit; font-size: 13px;
483
- }
484
- .fd-calendar-grid td button:hover { background: var(--fd-accent-soft); }
485
- .fd-calendar-grid td button.fd-outside { color: var(--fd-muted); opacity: 0.6; }
486
- .fd-calendar-grid td button[aria-current="date"] { box-shadow: inset 0 0 0 1px var(--fd-accent); }
487
- .fd-calendar-grid td button[aria-selected="true"] { background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 600; }
488
- .fd-calendar-grid td button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
489
- .fd-properties { display: grid; gap: 8px; min-width: 0; }
490
- .fd-property { display: grid; grid-template-columns: minmax(120px, 30%) minmax(0, 1fr); align-items: center; gap: 12px; min-width: 0; }
491
- .fd-property > label { color: var(--fd-muted); font-size: 13px; }
492
- .fd-property[data-type="boolean"] > :last-child { justify-self: start; }
493
- @container (max-width: 520px) { .fd-property { grid-template-columns: minmax(0, 1fr); gap: 4px; } }
494
- .fd-progressbar {
495
- position: relative; height: 22px; min-width: 120px; border-radius: 999px; overflow: hidden;
496
- background: var(--fd-page); border: 1px solid var(--fd-border); font-variant-numeric: tabular-nums;
497
- }
498
- .fd-progressbar-fill { height: 100%; background: var(--fd-success); transition: width 0.2s ease; }
499
- .fd-progressbar[data-tone="warning"] .fd-progressbar-fill { background: #d97706; }
500
- .fd-progressbar[data-tone="danger"] .fd-progressbar-fill { background: var(--fd-error); }
501
- .fd-progressbar[data-tone="info"] .fd-progressbar-fill { background: var(--fd-info); }
502
- .fd-progressbar-text { position: absolute; inset: 0; display: grid; place-items: center; font-size: 12px; font-weight: 600; color: var(--fd-text); }
503
- .fd-progressbar-edit { display: flex; align-items: center; gap: 12px; min-width: 0; }
504
- .fd-progressbar-edit > .fd-progressbar { flex: 1 1 auto; }
505
- .fd-progressbar-edit > .fd-input { flex: 0 0 96px; }
506
- .fd-progress-bar { height: 4px; background: var(--fd-border); border-radius: 999px; overflow: hidden; }
507
- .fd-progress-bar > span { display: block; height: 100%; background: var(--fd-accent); transition: width 0.25s ease; }
508
- .fd-step { display: grid; gap: 18px; }
509
- .fd-step-title { font-size: 18px; font-weight: 650; margin: 0; }
510
- .fd-wizard-nav { display: flex; gap: 8px; justify-content: space-between; }
511
- /* A clickable wizard's steps: numbered, the current one filled, those behind it ticked. */
512
- .fd-steps-list { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0; padding: 0; counter-reset: fd-step; }
513
- .fd-steps-list > li { counter-increment: fd-step; }
514
- .fd-step-link {
515
- font: inherit; font-size: 13.5px; display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
516
- border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-muted); border-radius: 999px; padding: 4px 12px 4px 6px;
517
- }
518
- .fd-step-link::before {
519
- content: counter(fd-step); display: inline-grid; place-items: center; width: 20px; height: 20px; border-radius: 50%;
520
- background: var(--fd-page); color: var(--fd-muted); font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums;
521
- }
522
- .fd-step-link:hover { border-color: var(--fd-accent); color: var(--fd-text); }
523
- .fd-step-link:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
524
- .fd-step-link.fd-step-done { color: var(--fd-text); }
525
- .fd-step-link.fd-step-done::before { content: "\u2713"; background: var(--fd-accent-soft); color: var(--fd-accent); }
526
- /* Skipped is not done: no tick, no colour. */
527
- .fd-step-link.fd-step-skipped { border-style: dashed; color: var(--fd-muted); }
528
- .fd-step-link.fd-step-skipped::before { content: "\u2013"; background: var(--fd-page); color: var(--fd-muted); }
529
- .fd-step-link[aria-current="step"] { border-color: var(--fd-accent); color: var(--fd-accent); font-weight: 600; }
530
- .fd-step-link[aria-current="step"]::before { content: counter(fd-step); background: var(--fd-accent); color: var(--fd-accent-text); }
531
- .fd-wizard-nav .fd-spacer { flex: 1; }
532
-
533
- /* ---- text, status, dialog ------------------------------------------------- */
534
- .fd-text-heading { font-size: 16px; font-weight: 650; margin: 0; }
535
- .fd-text-paragraph { margin: 0; }
536
- .fd-text-note { margin: 0; color: var(--fd-muted); font-size: 13px; }
537
- .fd-status { min-height: 1.4em; color: var(--fd-muted); font-size: 13px; }
538
- .fd-status-box { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
539
- .fd-status-box .fd-retry { font-size: 13px; }
540
- /* Said to screen readers only. */
541
- .fd-announce { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
542
- /* The server out of reach: a banner over the page, with Retry. */
543
- .fd-banner {
544
- display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 10px 14px; margin-block-end: 16px;
545
- border: 1px solid #f0c47a; border-radius: var(--fd-control-radius); background: var(--fd-warning-soft); color: var(--fd-warning); font-size: 13.5px;
546
- }
547
- .fd-banner-text { flex: 1 1 16em; min-width: 0; }
548
- .fd-content > .fd-banner:has(+ .fd-draft + .fd-sheet-page), .fd-content > .fd-banner:has(+ .fd-sheet-page) { margin: 12px 16px 0; }
549
- /* The status as a toast in a corner, or as a bar across the top. */
550
- .fd-status-box.fd-toast {
551
- position: fixed; inset-block-end: max(20px, env(safe-area-inset-bottom, 0px)); inset-inline-end: 20px; z-index: 900;
552
- padding: 10px 16px; border-radius: 8px; background: var(--fd-text); box-shadow: 0 8px 24px rgba(15, 20, 25, 0.25);
553
- }
554
- /* Light words on the dark toast, saved or not: the status's own colours are for a light ground. */
555
- .fd-toast .fd-status, .fd-toast .fd-status.fd-status-saved, .fd-toast .fd-status.fd-status-error { color: var(--fd-surface); font-size: 13.5px; min-height: 0; }
556
- .fd-toast .fd-retry { color: var(--fd-surface); text-decoration: underline; }
557
- .fd-toast:has(.fd-status-error) { background: var(--fd-error); }
558
- .fd-status-box.fd-status-bar { display: flex; justify-content: center; min-height: 32px; padding: 6px 16px; background: var(--fd-surface); border-block-end: 1px solid var(--fd-border); }
559
- .fd-status-bar .fd-status-error { color: var(--fd-error); }
560
- .fd-status.fd-status-error { color: var(--fd-error); }
561
- .fd-status.fd-status-saved { color: var(--fd-success); }
562
- .fd-draft { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; padding: 10px 14px; margin-block-end: 16px;
563
- background: var(--fd-info-soft); border: 1px solid #a9c8ef; border-radius: var(--fd-control-radius); }
564
- .fd-done { padding: 40px 0; text-align: center; display: grid; gap: 12px; justify-items: center; }
565
- .fd-done-title { font-size: 20px; font-weight: 650; margin: 0; }
566
- .fd-dialog-backdrop { position: fixed; inset: 0; background: rgba(15, 20, 25, 0.45); display: grid; place-items: center; z-index: 1000; padding: 16px; }
567
- .fd-dialog {
568
- background: var(--fd-surface); color: var(--fd-text); border-radius: max(var(--fd-radius), 6px); max-width: 420px; width: 100%;
569
- padding: 20px 22px; display: grid; gap: 16px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); font-family: var(--fd-font);
570
- }
571
- .fd-dialog p { margin: 0; }
572
- /* A page in a dialog: a head with its title and \xD7, a body that scrolls, a foot with Discard and Save & Close. */
573
- .fd-form-dialog {
574
- display: flex; flex-direction: column; width: 100%; max-height: min(90vh, 100%); min-height: 0;
575
- background: var(--fd-page); color: var(--fd-text); border-radius: max(var(--fd-radius), 8px);
576
- box-shadow: 0 24px 64px rgba(15, 20, 25, 0.3); overflow: hidden;
577
- }
578
- .fd-form-dialog:focus { outline: none; }
579
- .fd-form-dialog.fd-size-small { max-width: 440px; }
580
- .fd-form-dialog.fd-size-medium { max-width: 760px; }
581
- .fd-form-dialog.fd-size-large { max-width: 1080px; }
582
- .fd-form-dialog-backdrop:has(> .fd-size-full) { padding: 0; }
583
- .fd-form-dialog.fd-size-full { max-width: none; max-height: none; height: 100%; border-radius: 0; }
584
- .fd-form-dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-block-end: 1px solid var(--fd-border); background: var(--fd-surface); }
585
- .fd-form-dialog-title { margin: 0; font-size: 16px; font-weight: 600; }
586
- .fd-dialog-close { border: none; background: none; cursor: pointer; font-size: 22px; line-height: 1; padding: 2px 8px; border-radius: 4px; color: var(--fd-muted); }
587
- .fd-dialog-close:hover { background: var(--fd-page); color: var(--fd-text); }
588
- .fd-form-dialog-body { flex: 1 1 auto; min-height: 0; overflow: auto; container-type: inline-size; }
589
- .fd-form-dialog-body .fd-sheet-layout { margin-block-start: 12px; }
590
- /* The dialog's head names the page; a record in a dialog leaves its side panel (the chatter) to the full page. */
591
- .fd-form-dialog-body .fd-page-title { display: none; }
592
- .fd-form-dialog-body .fd-page-head:not(:has(.fd-page-description)) { display: none; }
593
- .fd-form-dialog-body .fd-sheet-layout.fd-has-side { grid-template-columns: minmax(0, 1fr); }
594
- .fd-form-dialog-body .fd-side { display: none; }
595
- /* Search more\u2026: a search box over a list of rows. */
596
- .fd-search-body { display: grid; gap: 12px; align-content: start; }
597
- .fd-search-list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); overflow: auto; max-height: min(60vh, 520px); }
598
- .fd-search-list .fd-option { padding: 8px 12px; }
599
- .fd-search-list .fd-option + .fd-option { border-block-start: 1px solid var(--fd-border); }
600
- .fd-search-list .fd-empty { padding: 10px 12px; color: var(--fd-muted); }
601
- /* A page with no sheet of its own sits on the dialog's surface, clear of its edges. */
602
- .fd-form-dialog-body:not(:has(.fd-sheet-layout)) { background: var(--fd-surface); padding: 16px 20px 20px; }
603
- .fd-form-dialog-foot { padding: 12px 16px; border-block-start: 1px solid var(--fd-border); background: var(--fd-surface); margin: 0; }
604
- @media (prefers-reduced-motion: reduce) { .fd-form *, .fd-form *::before, .fd-form *::after { transition: none !important; } }
605
- `,An="fieldia-styles";function Jt(e){if(e.getElementById(An))return;let t=e.createElement("style");t.id=An,t.textContent=Mn,(e.head??e.documentElement).append(t)}function Ut(e){let t=()=>{try{return e??globalThis.localStorage??null}catch{return null}};return{get(n){try{let r=t()?.getItem(`fieldia:${n}`);return r==null?null:JSON.parse(r)}catch{return null}},set(n,r){try{t()?.setItem(`fieldia:${n}`,JSON.stringify(r))}catch{}}}}function Tr(){let e=new Map;return{get:t=>e.has(t)?Tn(e.get(t)):null,set:(t,n)=>{e.set(t,Tn(n))}}}var Tn=e=>JSON.parse(JSON.stringify(e));var Cr="http://www.w3.org/2000/svg",Cn={user:'<circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-6 8-6s8 2 8 6"/>',users:'<circle cx="9" cy="8" r="3.5"/><path d="M2 20c0-3.5 3-5.5 7-5.5s7 2 7 5.5"/><circle cx="17" cy="9" r="2.5"/><path d="M16.5 14.5c3 0 5.5 1.6 5.5 4.5"/>',building:'<rect x="4" y="3" width="16" height="18" rx="1"/><path d="M9 21v-4h6v4M8 7h2M14 7h2M8 11h2M14 11h2"/>',home:'<path d="M3 11l9-7 9 7"/><path d="M5 10v10h14V10"/><path d="M10 20v-6h4v6"/>',phone:'<rect x="7" y="2" width="10" height="20" rx="2"/><path d="M11 18h2"/>',mail:'<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/>',pin:'<path d="M12 21s-7-6.5-7-12a7 7 0 0 1 14 0c0 5.5-7 12-7 12z"/><circle cx="12" cy="9" r="2.5"/>',globe:'<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3.2 3 14.8 0 18M12 3c-3 3.2-3 14.8 0 18"/>',calendar:'<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M3 10h18M8 3v4M16 3v4"/>',clock:'<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/>',money:'<rect x="2" y="6" width="20" height="12" rx="2"/><circle cx="12" cy="12" r="3"/><path d="M6 9.5v0M18 14.5v0"/>',cart:'<path d="M3 4h2l2.5 11h11L21 7H6.4"/><circle cx="9" cy="19.5" r="1.5"/><circle cx="17" cy="19.5" r="1.5"/>',box:'<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M4 7.5l8 4.5 8-4.5M12 12v9"/>',truck:'<path d="M2 6h12v10H2zM14 9h4l3 3.5V16h-7"/><circle cx="6.5" cy="17.5" r="1.8"/><circle cx="17" cy="17.5" r="1.8"/>',receipt:'<path d="M6 3h12v18l-3-2-3 2-3-2-3 2z"/><path d="M9 8h6M9 12h6"/>',file:'<path d="M6 3h8l4 4v14H6z"/><path d="M14 3v4h4M9 12h6M9 16h6"/>',edit:'<path d="M4 20h4L19 9l-4-4L4 16z"/><path d="M13.5 6.5l4 4"/>',tag:'<path d="M3 12V4h8l10 10-8 8z"/><circle cx="7.5" cy="8" r="1.5"/>',star:'<path d="M12 3l2.8 6 6.2.6-4.7 4.2 1.4 6.2L12 16.8 6.3 20l1.4-6.2L3 9.6 9.2 9z"/>',lock:'<rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/>',check:'<path d="M5 12.5l4.5 4.5L19 7.5"/>',info:'<circle cx="12" cy="12" r="9"/><path d="M12 11v6M12 7.5v0"/>',warning:'<path d="M12 3l10 18H2z"/><path d="M12 10v5M12 18v0"/>',settings:'<path d="M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1"/><circle cx="15" cy="6" r="2"/><circle cx="9" cy="12" r="2"/><circle cx="17" cy="18" r="2"/>',chart:'<path d="M3 20h18M6 20v-8M11 20V5M16 20v-6"/>',link:'<path d="M10 14a4 4 0 0 0 5.6 0l3-3a4 4 0 0 0-5.6-5.6l-1 1"/><path d="M14 10a4 4 0 0 0-5.6 0l-3 3a4 4 0 0 0 5.6 5.6l1-1"/>',list:'<path d="M8 6h12M8 12h12M8 18h12M4 6v0M4 12v0M4 18v0"/>',chat:'<path d="M4 5h16v11H9l-5 4z"/>'};function et(e,t,n){let r=t?n?.[t]??Cn[t]:void 0;if(r===void 0)return null;let a=e.createElementNS(Cr,"svg");for(let[i,o]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false",class:"fd-icon","data-icon":t}))a.setAttribute(i,o);return a.innerHTML=r,a}var $n=0,$r='button, [href], input, select, textarea, [contenteditable="true"], [tabindex]:not([tabindex="-1"])';function St(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,r=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a={...Ce[e.locale??"en"],...e.labels},i=`fd-dialog-${++$n}`,o=(u,E={},k)=>{let F=t.createElement(u);for(let[O,M]of Object.entries(E))F.setAttribute(O,M);return k!==void 0&&(F.textContent=k),F},d=o("h2",{id:`${i}-title`,class:"fd-form-dialog-title"},e.title),s=o("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),l=o("div",{class:"fd-form-dialog-body"}),p=o("button",{type:"button",class:"fd-button"},a.discard),y=o("button",{type:"button",class:"fd-button fd-button-primary"},a.saveClose),v=o("div",{class:`fd-theme fd-form-dialog fd-size-${e.size??"medium"}`,"data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":d.id,tabindex:"-1"});e.dir&&v.setAttribute("dir",e.dir),v.append(o("div",{class:"fd-form-dialog-head"}),l,o("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"})),v.firstElementChild?.append(d,s),v.lastElementChild?.append(p,y);let h=o("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});h.append(v),n.append(h);let g=Kt(l,{...e,showActions:!1}),f=!1;e.recompute&&Vr(g.form,e.page.fields,e.recompute,()=>f);let w=()=>[...v.querySelectorAll($r)].filter(u=>!u.closest("[hidden], [inert]")&&!u.disabled),b=()=>l.querySelector('input:not([type="hidden"]), select, textarea, [contenteditable="true"]');return(b()??v).focus(),g.form.settled().then(()=>{(t.activeElement===v||!v.contains(t.activeElement))&&b()?.focus()}),new Promise(u=>{let E=k=>{if(f)return;f=!0;let F=g.form.getState(),O={saved:k,recordId:F.recordId??null,values:F.values};g.destroy(),h.remove(),r?.focus(),u(O)};y.addEventListener("click",async()=>{y.disabled=!0;let k=e.mode==="values"?g.check():await g.save();y.disabled=!1,k&&E(!0)}),p.addEventListener("click",()=>E(!1)),s.addEventListener("click",()=>E(!1)),v.addEventListener("keydown",k=>{if(k.key==="Enter"&&(k.ctrlKey||k.metaKey)&&!k.isComposing){if(k.target.closest(".ag-root-wrapper"))return;k.preventDefault(),t.activeElement?.dispatchEvent(new Event("change",{bubbles:!0})),y.click();return}if(!k.defaultPrevented){if(k.key==="Escape")k.preventDefault(),E(!1);else if(k.key==="Tab"){let F=w();if(!F.length)return;let O=F[0],M=F[F.length-1];k.shiftKey&&t.activeElement===O?(k.preventDefault(),M.focus()):!k.shiftKey&&t.activeElement===M&&(k.preventDefault(),O.focus())}}})})}function Vr(e,t,n,r){let a=JSON.stringify(e.getState().values),i=!1;e.subscribe(()=>{let o=e.getState().values,d=JSON.stringify(o);i||d===a||(a=d,n(o).then(s=>{if(!(r()||JSON.stringify(e.getState().values)!==d)){i=!0;for(let[l,p]of Object.entries(s))l in t&&JSON.stringify(o[l]??null)!==JSON.stringify(p??null)&&e.setValue(l,p);i=!1,a=JSON.stringify(e.getState().values)}},()=>{}))})}function _t(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,r=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a=Ce[e.locale??"en"],i=de[e.locale??"en"],o=`fd-dialog-${++$n}`,d=(u,E={},k)=>{let F=t.createElement(u);for(let[O,M]of Object.entries(E))F.setAttribute(O,M);return k!==void 0&&(F.textContent=k),F},s=d("h2",{id:`${o}-title`,class:"fd-form-dialog-title"},e.title),l=d("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),p=d("input",{type:"search",class:"fd-input","aria-label":i.search,placeholder:i.search,"aria-controls":`${o}-list`,autocomplete:"off"}),y=d("ul",{id:`${o}-list`,class:"fd-search-list",role:"listbox","aria-labelledby":s.id}),v=d("button",{type:"button",class:"fd-button"},a.cancel),h=d("div",{class:"fd-theme fd-form-dialog fd-search-dialog fd-size-small","data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":s.id});e.dir&&h.setAttribute("dir",e.dir);let g=d("div",{class:"fd-form-dialog-head"});g.append(s,l);let f=d("div",{class:"fd-form-dialog-body fd-search-body"});f.append(p,y);let w=d("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"});w.append(v),h.append(g,f,w);let b=d("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});return b.append(h),n.append(b),p.focus(),new Promise(u=>{let E=[],k=-1,F=0,O,M=U=>{clearTimeout(O),F++,b.remove(),r?.focus(),u(U)},P=()=>{y.replaceChildren(...E.map((U,re)=>{let J=d("li",{id:`${o}-option-${re}`,role:"option",class:`fd-option${re===k?" fd-active":""}`,"aria-selected":String(re===k)},U.label);return J.addEventListener("click",()=>M(U)),J})),E.length||y.append(d("li",{class:"fd-empty"},i.noResults)),k>=0?p.setAttribute("aria-activedescendant",`${o}-option-${k}`):p.removeAttribute("aria-activedescendant")},H=()=>{clearTimeout(O);let U=++F;O=setTimeout(async()=>{let re=await e.search(p.value,80).catch(()=>[]);U===F&&(E=re,k=-1,P())},180)};p.addEventListener("input",H),p.addEventListener("keydown",U=>{if(U.key==="ArrowDown"||U.key==="ArrowUp"){if(U.preventDefault(),!E.length)return;k=(k+(U.key==="ArrowDown"?1:-1)+E.length)%E.length,P(),y.children[k]?.scrollIntoView?.({block:"nearest"})}else U.key==="Enter"&&k>=0&&(U.preventDefault(),M(E[k]))}),v.addEventListener("click",()=>M(null)),l.addEventListener("click",()=>M(null)),h.addEventListener("keydown",U=>{U.key==="Escape"&&(U.preventDefault(),M(null))}),H()})}function Or(e){return e.layout.type==="sheet"&&e.layout.title?.field?e.layout.title.field:e.fields.name?"name":Object.entries(e.fields).find(([,t])=>t.type==="char")?.[0]??null}function Ir(e,t,n){let r=Object.fromEntries(Object.entries(e).map(([a,i])=>[a,n?{...i,readonly:!0}:i]));return{fieldia:"0.1",id:"values",title:t,data:{kind:"record",model:"values"},fields:r,layout:{type:"sections",id:"values",children:[{type:"section",id:"values-section",columns:2,children:Object.keys(r).map(a=>({type:"field",id:`values-${a}`,field:a}))}]}}}function Dr(e){if(e)return{...e.search?{search:t=>e.search(t)}:{},...e.create?{create:t=>e.create(t)}:{}}}function Vn(e){let t=r=>(typeof e.relatedPages=="function"?e.relatedPages(r):e.relatedPages?.[r])??null,n={locale:e.locale,skin:e.skin,dir:e.dir,widgets:e.widgets,preferences:e.preferences,relatedPages:e.relatedPages,translate:e.translate};return{canOpen:r=>t(r)!==null,async openRecord(r,a){let i=t(r);if(!i)return null;let o=Or(i),d=await St({...n,page:i,dataSource:e.dataSource,recordId:a.recordId??null,values:a.name&&o?{[o]:a.name}:void 0,title:a.title,size:"large"});if(!d.saved||d.recordId===null)return null;let s=o?d.values[o]:null;return{id:d.recordId,label:typeof s=="string"&&s?s:a.name??a.title}},searchMore:r=>_t({title:r.title,search:r.search,locale:e.locale,skin:e.skin,dir:e.dir}),async editValues(r){let a=await St({...n,page:Ir(r.fields,r.title,r.readonly===!0),dataSource:Dr(e.dataSource),values:r.values,title:r.title,mode:"values",...r.recompute?{recompute:r.recompute}:{}});return a.saved?a.values:null}}}var Ce={en:{save:"Save",edit:"Edit",done:"Done",discard:"Discard",saving:"Saving\u2026",saved:"Saved",submit:"Submit",next:"Next",back:"Back",skip:"Skip",steps:"Steps",stepOf:"Step {n} of {total}",submitted:"Thank you. Your answers were sent.",submitAnother:"Submit another response",draftFound:"You have unsaved answers from {time}.",restore:"Restore",discardDraft:"Discard",ok:"OK",cancel:"Cancel",loading:"Loading\u2026",saveClose:"Save & Close",close:"Close",dismiss:"Dismiss",retry:"Retry",notSaved:"Not saved",notSent:"Not sent",checkFields:"{what}. Check: {fields}",offline:"Could not reach the server. Your changes are still here."},ar:{save:"\u062D\u0641\u0638",edit:"\u062A\u0639\u062F\u064A\u0644",done:"\u062A\u0645",discard:"\u062A\u062C\u0627\u0647\u0644",saving:"\u062C\u0627\u0631\u064D \u0627\u0644\u062D\u0641\u0638\u2026",saved:"\u062A\u0645 \u0627\u0644\u062D\u0641\u0638",submit:"\u0625\u0631\u0633\u0627\u0644",next:"\u0627\u0644\u062A\u0627\u0644\u064A",back:"\u0631\u062C\u0648\u0639",skip:"\u062A\u062E\u0637\u064D\u0651",steps:"\u0627\u0644\u062E\u0637\u0648\u0627\u062A",stepOf:"\u0627\u0644\u062E\u0637\u0648\u0629 {n} \u0645\u0646 {total}",submitted:"\u0634\u0643\u0631\u064B\u0627 \u0644\u0643. \u062A\u0645 \u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0627\u062A\u0643.",submitAnother:"\u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0629 \u0623\u062E\u0631\u0649",draftFound:"\u0644\u062F\u064A\u0643 \u0625\u062C\u0627\u0628\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u0641\u0648\u0638\u0629 \u0645\u0646 {time}.",restore:"\u0627\u0633\u062A\u0639\u0627\u062F\u0629",discardDraft:"\u062A\u062C\u0627\u0647\u0644",ok:"\u0645\u0648\u0627\u0641\u0642",cancel:"\u0625\u0644\u063A\u0627\u0621",loading:"\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026",saveClose:"\u062D\u0641\u0638 \u0648\u0625\u063A\u0644\u0627\u0642",close:"\u0625\u063A\u0644\u0627\u0642",dismiss:"\u0625\u062E\u0641\u0627\u0621",retry:"\u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",notSaved:"\u0644\u0645 \u064A\u064F\u062D\u0641\u0638",notSent:"\u0644\u0645 \u064A\u064F\u0631\u0633\u0644",checkFields:"{what}. \u0631\u0627\u062C\u0650\u0639: {fields}",offline:"\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645. \u062A\u0639\u062F\u064A\u0644\u0627\u062A\u0643 \u0645\u0627 \u0632\u0627\u0644\u062A \u0647\u0646\u0627."},de:{save:"Speichern",edit:"Bearbeiten",done:"Fertig",discard:"Verwerfen",saving:"Wird gespeichert\u2026",saved:"Gespeichert",submit:"Absenden",next:"Weiter",back:"Zur\xFCck",skip:"\xDCberspringen",steps:"Schritte",stepOf:"Schritt {n} von {total}",submitted:"Vielen Dank. Ihre Antworten wurden gesendet.",submitAnother:"Weitere Antwort senden",draftFound:"Sie haben ungespeicherte Antworten vom {time}.",restore:"Wiederherstellen",discardDraft:"Verwerfen",ok:"OK",cancel:"Abbrechen",loading:"Wird geladen\u2026",saveClose:"Speichern und schlie\xDFen",close:"Schlie\xDFen",dismiss:"Ausblenden",retry:"Erneut versuchen",notSaved:"Nicht gespeichert",notSent:"Nicht gesendet",checkFields:"{what}. Bitte pr\xFCfen: {fields}",offline:"Der Server ist nicht erreichbar. Ihre \xC4nderungen sind noch da."},fr:{save:"Enregistrer",edit:"Modifier",done:"Termin\xE9",discard:"Annuler les modifications",saving:"Enregistrement\u2026",saved:"Enregistr\xE9",submit:"Envoyer",next:"Suivant",back:"Retour",skip:"Passer",steps:"\xC9tapes",stepOf:"\xC9tape {n} sur {total}",submitted:"Merci. Vos r\xE9ponses ont \xE9t\xE9 envoy\xE9es.",submitAnother:"Envoyer une autre r\xE9ponse",draftFound:"Vous avez des r\xE9ponses non enregistr\xE9es du {time}.",restore:"Restaurer",discardDraft:"Ignorer",ok:"OK",cancel:"Annuler",loading:"Chargement\u2026",saveClose:"Enregistrer et fermer",close:"Fermer",dismiss:"Masquer",retry:"R\xE9essayer",notSaved:"Non enregistr\xE9",notSent:"Non envoy\xE9",checkFields:"{what}. \xC0 v\xE9rifier : {fields}",offline:"Le serveur est injoignable. Vos modifications sont toujours l\xE0."}},On=Ce.en;var Pr=0;function Kt(e,t){let n=e.ownerDocument,r=st(t.page);if(!r.ok)throw new Error(`This page cannot be shown:
606
- ${r.issues.map(c=>` ${c.path}: ${c.message}`).join(`
607
- `)}`);let a=t.translate?dt(r.page,t.translate):r.page,i=t.locale??"en",o=t.preferences??Ut(),d=Vn(t),s=!t.form,l=t.form??pt({...t,page:a,messages:t.messages??Te[i]}),p={...Ce[i],...t.labels},y=de[i],v=t.dir??(i==="ar"?"rtl":void 0),h=`fd${++Pr}`,g=[],f=[],w=c=>`${h}-${c.replace(/[^A-Za-z0-9_-]/g,"_")}`,b=(c,R)=>c.replace(/\{(\w+)\}/g,(A,I)=>String(R[I]??""));Jt(n);function u(c,R={},...A){let I=n.createElement(c);for(let[D,q]of Object.entries(R))q!==void 0&&I.setAttribute(D,q);return I.append(...A),I}function E(c,R){let A=et(n,c,t.icons);return A?[A,R]:[R]}let k=u("form",{class:"fd-form",novalidate:"","data-fd-skin":t.skin??"underline",dir:v,lang:t.locale,"data-max-width":a.maxWidth}),F=t.confirm??Gt;function O(c){let R=a.fields[c.field],A=w(c.id),I=u("div",{class:"fd-field","data-node":c.id,"data-field":c.field,"data-type":R.type});c.colspan&&I.style.setProperty("--fd-span",String(c.colspan));let D=u("label",{class:"fd-label",id:`${A}-label`,for:A},c.label??R.label),q=t.showValid&&!Wr.has(R.type)?et(n,"check"):null;q&&(q.classList.add("fd-valid-mark"),D.append(q));let j=ke({form:l,name:c.field,field:R,node:c,id:A,document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);["INPUT","SELECT","TEXTAREA"].includes(j.element.tagName)||(j.element.getAttribute("role")&&j.element.setAttribute("aria-labelledby",D.id),D.addEventListener("click",()=>j.focus()));let ie=c.help??R.help,Y=ie?u("div",{class:"fd-help",id:`${A}-help`},ie):null,G=u("div",{class:"fd-error",id:`${A}-error`,hidden:""}),he=u("div",{class:"fd-warning",role:"status",hidden:""});return I.append(D,j.element,...Y?[Y]:[],G,he),j.destroy&&f.push(()=>j.destroy?.()),g.push(B=>{let V=l.node(c.id);I.hidden=V.invisible,I.classList.toggle("fd-required",V.required);let K=B.errors[c.field];G.hidden=!K,G.textContent=K??"";let ge=B.warning&&B.warningField===c.field?B.warning:"";if(he.hidden=!ge,he.textContent=ge,q){let we=B.values[c.field],ye=we!=null&&we!==""&&!(Array.isArray(we)&&!we.length),xe=!V.readonly&&!K&&ye&&B.dirty.includes(c.field)&&l.problem(c.field)===null;I.classList.toggle("fd-valid",xe),q.toggleAttribute("hidden",!xe)}j.update({value:B.values[c.field],values:B.values,readonly:V.readonly||C,required:V.required,invalid:!!K,describedBy:[Y?.id,K?G.id:void 0].filter(Boolean).join(" ")||void 0})}),I}function M(c,R){g.push(()=>{c.hidden=l.node(R).invisible})}function P(c){let R=u("button",{type:"button",class:`fd-button fd-button-${c.style??"secondary"}`,"data-node":c.id},...E(c.icon,c.label));return R.addEventListener("click",async()=>{c.confirm&&!await F(c.confirm)||await l.runAction(c.id)}),M(R,c.id),R}function H(c){let R=c.style??"paragraph",A=u(R==="heading"?"h3":"p",{class:`fd-text-${R}`,"data-node":c.id},c.text);return M(A,c.id),A}function U(c){let R=u("div",{class:"fd-slot","data-slot":c.name,"data-node":c.id}),A=t.slots?.[c.name]?.(R,{form:l,name:c.name});return A&&f.push(A),M(R,c.id),R}function re(c,R=1){let A=u("div",{class:"fd-grid"});if(A.style.setProperty("--fd-columns",String(rt(R))),typeof R=="object")for(let I of["medium","narrow"]){let D=R[I];D!==void 0&&(A.setAttribute(`data-columns-${I}`,String(D)),A.style.setProperty(`--fd-columns-${I}`,String(D)))}return A.append(...c.map(Z)),A}let J=new Map;function _(c){let R=u("fieldset",{class:"fd-section","data-node":c.id}),A=c.description?u("p",{class:"fd-section-description"},c.description):null,I=re(c.children,c.columns);if(c.title&&c.collapsible){I.id=w(`${c.id}-content`);let D=u("button",{type:"button",class:"fd-section-toggle","aria-controls":I.id},u("span",{class:"fd-section-chevron","aria-hidden":"true"}),...E(c.icon,c.title)),q=c.collapsed!==!0,j=ie=>{q=ie,D.setAttribute("aria-expanded",String(q)),I.hidden=!q,A&&(A.hidden=!q),R.classList.toggle("fd-section-folded",!q)};D.addEventListener("click",()=>j(!q)),J.set(R,()=>j(!0)),j(q),R.append(u("legend",{class:"fd-section-title"},D))}else c.title&&R.append(u("legend",{class:"fd-section-title"},...E(c.icon,c.title)));return A&&R.append(A),R.append(I),M(R,c.id),R}function te(c){let R=u("div",{class:"fd-tabs","data-node":c.id}),A=u("div",{class:"fd-tablist",role:"tablist"}),I=null,D=c.children[0].id,q=c.children.map(j=>{let ie=w(`${j.id}-tab`),Y=w(`${j.id}-panel`),G=u("button",{type:"button",class:"fd-tab",role:"tab",id:ie,"aria-controls":Y,"data-node":j.id},...E(j.icon,j.label)),he=u("div",{class:"fd-tabpanel",role:"tabpanel",id:Y,"aria-labelledby":ie},re(j.children));return G.addEventListener("click",()=>{I=D=j.id,We(l.getState())}),A.append(G),{tab:j,button:G,panel:he}});return A.addEventListener("keydown",j=>{let ie=q.filter(V=>!V.button.hidden),Y=ie.findIndex(V=>V.tab.id===D),G={ArrowRight:1,ArrowLeft:-1,Home:-Y,End:ie.length-1-Y}[j.key];if(G===void 0||Y===-1)return;j.preventDefault();let he=k.getAttribute("dir")==="rtl"&&(j.key==="ArrowRight"||j.key==="ArrowLeft"),B=ie[(Y+(he?-G:G)+ie.length)%ie.length];I=D=B.tab.id,We(l.getState()),B.button.focus()}),R.append(A,...q.map(j=>j.panel)),g.push(()=>{R.hidden=l.node(c.id).invisible;let j=q.filter(Y=>!l.node(Y.tab.id).invisible);I!==null&&j.some(Y=>Y.tab.id===I)?D=I:j.length&&(D=j[0].tab.id);for(let Y of q){let G=Y.tab.id===D;Y.button.hidden=!j.includes(Y),Y.button.setAttribute("aria-selected",String(G)),Y.button.tabIndex=G?0:-1,Y.panel.hidden=!G}}),R}function Z(c){switch(c.type){case"field":return O(c);case"button":return P(c);case"text":return H(c);case"slot":return U(c);case"section":return _(c);case"tabs":return te(c)}}let C=t.readonly===!0,$=t.editSwitch?u("button",{type:"button",class:"fd-button fd-edit-switch"}):null;$?.addEventListener("click",async()=>{if(C)C=!1;else{if(l.getState().dirty.length&&!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}C=!0}k.toggleAttribute("data-readonly",C),We(l.getState())}),k.toggleAttribute("data-readonly",C),g.push(()=>{$&&($.textContent=C?p.edit:p.done,$.classList.toggle("fd-button-primary",C))});let W=u("div",{class:"fd-status",role:"status","aria-live":"polite"}),X=u("button",{type:"button",class:"fd-button fd-button-link fd-retry",hidden:""},p.retry);X.addEventListener("click",()=>{ue()});let Q=u("div",{class:"fd-status-box"},W,X),ce=()=>a.data.kind==="responses"?p.notSent:p.notSaved;function fe(c){let R=[];for(let I of Object.keys(c.errors)){let D=I.split(".")[0],j=k.querySelector(`.fd-field[data-field="${D}"]:not([hidden]) > .fd-label`)?.firstChild?.textContent??a.fields[D]?.label??D;R.includes(j)||R.push(j)}let A=[...k.querySelectorAll(".fd-field[data-field] > .fd-label")].map(I=>I.firstChild?.textContent??"");return R.sort((I,D)=>(A.indexOf(I)+1||1/0)-(A.indexOf(D)+1||1/0)),R.length?b(p.checkFields,{what:ce(),fields:R.join(", ")}):ce()}let pe;g.push(c=>{let R=c.saveProblem,A=c.status==="saving"?p.saving:c.status==="saved"?p.saved:c.status==="loading"?p.loading:c.status==="error"&&R?R.kind==="fields"?fe(c):R.kind==="other"?R.message:ce():c.status==="error"?c.error??"":"";W.textContent=A,X.hidden=!(c.status==="error"&&R?.kind==="other"),W.classList.toggle("fd-status-error",c.status==="error"),W.classList.toggle("fd-status-saved",c.status==="saved"),t.saveStatus==="toast"&&(clearTimeout(pe),Q.hidden=!A,c.status==="saved"&&(pe=setTimeout(()=>Q.hidden=!0,2500)))});let Se=u("button",{type:"button",class:"fd-button fd-retry"},p.retry);Se.addEventListener("click",()=>{ue()});let Fe=u("div",{class:"fd-banner fd-tone-warning",role:"alert",hidden:""},u("span",{class:"fd-banner-text"},p.offline),Se),Ne=u("div",{class:"fd-announce",role:"alert","aria-live":"assertive"});function se(c){Ne.textContent="",setTimeout(()=>Ne.textContent=c,0)}let m=null;g.push(c=>{c.saveProblem!==m&&(m=c.saveProblem,Fe.hidden=m?.kind!=="network",m&&(m.kind==="rule"?Gt(m.message,!1):m.kind==="fields"?se(fe(c)):m.kind==="other"&&se(m.message)))});let x=u("div",{class:"fd-draft",hidden:""}),L=u("span"),S=u("button",{type:"button",class:"fd-button fd-button-primary"},p.restore),N=u("button",{type:"button",class:"fd-button fd-button-link"},p.discardDraft);S.addEventListener("click",()=>l.restoreDraft()),N.addEventListener("click",()=>l.discardDraft()),x.append(L,S,N),g.push(c=>{x.hidden=!c.draft,c.draft&&(L.textContent=b(p.draftFound,{time:new Date(c.draft.savedAt).toLocaleString()}))});function T(){let c=k.querySelector('[aria-invalid="true"]');if(!c)return;for(let A=c.closest(".fd-section-folded");A;A=A.parentElement?.closest(".fd-section-folded")??null)J.get(A)?.();if(!c.dispatchEvent(new CustomEvent("fd-focus-problem",{cancelable:!0})))return;(c.matches("input, select, textarea, button")?c:c.querySelector("input, select, textarea, button"))?.focus()}let z=u("div",{class:"fd-done",hidden:""},u("p",{class:"fd-done-title"},p.submitted)),oe=u("button",{type:"button",class:"fd-button"},p.submitAnother);z.append(oe);let ae=u("div",{class:"fd-content"});async function ue(){if(!await l.save()){l.getState().saveProblem||se(fe(l.getState())),T();return}a.data.kind==="responses"&&(ae.hidden=!0,z.hidden=!1)}oe.addEventListener("click",()=>{l.reset(),ae.hidden=!1,z.hidden=!0});function ne(){if(!a.title&&!a.description)return null;let c=u("header",{class:"fd-page-head"});return a.title&&c.append(u("h1",{class:"fd-page-title"},a.title)),a.description&&c.append(u("p",{class:"fd-page-description"},a.description)),c}function Be(c){let R=u("div",{class:"fd-sections","data-node":c.id},...c.children.map(Z)),A=u("button",{type:"submit",class:"fd-button fd-button-primary"},a.data.kind==="responses"?p.submit:p.save),I=u("div",{class:"fd-actions fd-actions-end"},Q,A);if(a.data.kind==="record"){let D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset()),I.insertBefore(D,A),g.push(q=>{let j=q.dirty.length>0&&q.status!=="saving"&&!C;A.hidden=!j,D.hidden=!j})}else g.push(()=>A.hidden=C);return $&&I.prepend($),t.showActions===!1?u("div",{},R):a.actionsPosition==="top"?(I.classList.add("fd-actions-top"),u("div",{},I,R)):u("div",{},R,I)}function Lt(c){let R=u("div",{class:"fd-wizard","data-node":c.id}),A=u("div",{class:"fd-progress-text"}),I=u("span");R.append(u("div",{class:"fd-progress"},A,u("div",{class:"fd-progress-bar"},I)));let D=c.clickable?u("ol",{class:"fd-steps-list"}):null,q=new Map;if(D){for(let V of c.children){let K=u("button",{type:"button",class:"fd-step-link"},...E(V.icon,V.label));K.addEventListener("click",()=>{l.goTo(V.id)?B():T()}),q.set(V.id,K),D.append(u("li",{},K))}R.append(u("nav",{class:"fd-steps","aria-label":p.steps},D))}let j=c.children.map(V=>{let K=u("section",{class:"fd-step","data-node":V.id,"aria-labelledby":w(`${V.id}-title`)});return K.append(u("h2",{class:"fd-step-title",id:w(`${V.id}-title`)},...E(V.icon,V.label))),V.description&&K.append(u("p",{class:"fd-section-description"},V.description)),K.append(re(V.children)),R.append(K),{step:V,panel:K}}),ie=u("button",{type:"button",class:"fd-button"},c.backLabel??p.back),Y=u("button",{type:"button",class:"fd-button fd-button-link"},p.skip),G=u("button",{type:"submit",class:"fd-button fd-button-primary"});R.append(u("div",{class:"fd-wizard-nav"},ie,u("span",{class:"fd-spacer"}),Q,Y,G)),ie.addEventListener("click",()=>{l.back()&&B()}),Y.addEventListener("click",()=>{l.skip()&&B()});let he=()=>{let V=l.steps();return V.indexOf(l.getState().step??"")===V.length-1};be=async()=>{if(he())return ue();l.next()?B():T()};function B(){j.find(K=>K.step.id===l.getState().step)?.panel.querySelector("input, select, textarea, [role=radio]")?.focus()}return g.push(V=>{let K=l.steps(),ge=Math.max(0,K.indexOf(V.step??""));A.textContent=b(p.stepOf,{n:ge+1,total:K.length}),I.style.width=`${(ge+1)/Math.max(1,K.length)*100}%`;for(let{step:ye,panel:xe}of j)xe.hidden=ye.id!==V.step;let we=ge===K.length-1;ie.hidden=ge===0,Y.hidden=we||!c.children.find(ye=>ye.id===V.step)?.optional,G.textContent=we?c.finishLabel??p.submit:c.nextLabel??p.next;for(let[ye,xe]of q){let $e=K.indexOf(ye);xe.parentElement.hidden=$e===-1,xe.classList.toggle("fd-step-done",$e!==-1&&$e<ge),xe.classList.toggle("fd-step-skipped",V.skipped.includes(ye)),ye===V.step?xe.setAttribute("aria-current","step"):xe.removeAttribute("aria-current")}}),R}function Et(c){let R=u("div",{class:"fd-sheet-page","data-node":c.id}),A=u("div",{class:"fd-actions"}),I=u("button",{type:"submit",class:"fd-button fd-button-primary"},p.save),D=u("button",{type:"button",class:"fd-button"},p.discard);D.addEventListener("click",()=>l.reset());let q=a.actionsPosition==="bottom",j=u("div",{class:"fd-actions fd-actions-end fd-sheet-foot"});t.showActions===!1?A.append(...(c.buttons??[]).map(P)):q?(A.append(...(c.buttons??[]).map(P)),j.append(Q,D,I)):A.append(I,D,...(c.buttons??[]).map(P),Q),$&&t.showActions!==!1&&A.prepend($),g.push(B=>{let V=B.dirty.length>0&&B.status!=="saving"&&!C;I.hidden=!V,D.hidden=!V});let ie=u("div",{class:"fd-header"},A),Y=c.statusbar?.position==="title";c.statusbar&&!Y&&ie.append(me(c.statusbar));let G=u("div",{class:"fd-card"});if(c.ribbon){let B=u("div",{class:`fd-ribbon fd-tone-${c.ribbon.tone??"muted"}`,"data-node":c.ribbon.id},c.ribbon.label);M(B,c.ribbon.id),G.append(u("div",{class:"fd-ribbon-frame"},B))}if(c.statButtons?.length){let B=u("div",{class:"fd-stats"});for(let V of c.statButtons){let K=u("span",{class:"fd-stat-value"}),ge=et(n,V.icon,t.icons),we=u("span",{class:"fd-stat-words"},K,u("span",{class:"fd-stat-label"},V.label)),ye=u("button",{type:"button",class:"fd-stat","data-node":V.id},...ge?[ge,we]:[we]);ye.addEventListener("click",()=>{l.runAction(V.id)}),g.push(xe=>{ye.hidden=l.node(V.id).invisible;let $e=V.field?xe.values[V.field]:null;K.textContent=$e==null?"":String($e)}),B.append(ye)}G.append(B)}for(let B of c.alerts??[]){let V=u("div",{class:`fd-alert fd-tone-${B.tone??"info"}`,role:"status","data-node":B.id},u("span",{class:"fd-alert-message"},B.message));if(B.dismissible){let K=!1,ge=u("button",{type:"button",class:"fd-alert-close","aria-label":p.dismiss},"\xD7");ge.addEventListener("click",()=>{K=!0,V.hidden=!0}),V.append(ge),g.push(()=>{V.hidden=K||l.node(B.id).invisible})}else M(V,B.id);G.append(V)}if(c.badges?.length){let B=u("div",{class:"fd-badges"});for(let V of c.badges){let K=u("span",{class:`fd-badge fd-tone-${V.tone??"muted"}`,"data-node":V.id},...E(V.icon,V.label));M(K,V.id),B.append(K)}g.push(()=>{B.hidden=[...B.children].every(V=>V.hidden)}),G.append(B)}if(c.title){let B=u("div",{class:"fd-title"});c.title.above?.length&&B.append(u("div",{class:"fd-title-above"},...c.title.above.map(O))),B.append(O({type:"field",id:"#title",field:c.title.field,placeholder:c.title.placeholder})),c.title.subtitleField&&B.append(O({type:"field",id:"#subtitle",field:c.title.subtitleField})),c.title.below?.length&&B.append(u("div",{class:"fd-title-below"},...c.title.below.map(O)));let V=u("div",{class:"fd-title-row"},B);if(c.title.avatarField){let K=O({type:"field",id:"#avatar",field:c.title.avatarField});K.classList.add("fd-avatar"),V.append(K)}G.append(V)}c.statusbar&&Y&&G.append(u("div",{class:"fd-title-statusbar"},me(c.statusbar))),G.append(re(c.children)),q&&t.showActions!==!1&&(G.append(j),g.push(B=>{j.hidden=B.dirty.length===0&&!W.textContent}));let he=u("div",{class:"fd-sheet-layout"},G);return c.sidePanel&&(he.classList.add("fd-has-side"),he.append(u("aside",{class:"fd-side"},U(c.sidePanel)))),R.append(ie,he),R}function me(c){let R=a.fields[c.field],A={clickable:c.clickable===!0};c.visibleStates&&(A.visibleStates=c.visibleStates);let I={type:"field",id:"#statusbar",field:c.field,widget:"statusbar",options:A},D=ke({form:l,name:c.field,field:R,node:I,id:w("statusbar"),document:n,labels:y,preferences:o,locale:i,dialogs:d},t.widgets);return g.push(q=>D.update({value:q.values[c.field],values:q.values,readonly:l.node("#statusbar").readonly||C,required:!1,invalid:!1})),D.element}let be=null,ve=a.layout,qe;ve.type==="sheet"?qe=Et(ve):ve.type==="wizard"?qe=Lt(ve):ve.type==="tabs"?qe=Be({id:`${ve.id}-page`,children:[ve]}):qe=Be(ve);let Yt=ve.type==="sheet"?null:ne();ae.append(...Yt?[Yt]:[],Fe,x,qe),k.append(ae,z,Ne),t.saveStatus==="toast"?(Q.classList.add("fd-toast"),k.append(Q)):t.saveStatus==="bar"&&(Q.classList.add("fd-status-bar"),ae.prepend(Q)),k.addEventListener("submit",c=>{c.preventDefault(),be?be():ue()});function In(){let c=n.activeElement;c&&k.contains(c)&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA")&&c.dispatchEvent(new Event("change",{bubbles:!0}))}function Dn(c){let R=[...k.querySelectorAll(".fd-field")].filter(D=>!D.closest('[hidden], [data-type="one2many"] .fd-field, .fd-form-dialog')&&!D.parentElement?.closest('[data-type="one2many"]')),A=c.closest(".fd-field"),I=R.slice(R.indexOf(A)+1);for(let D of I){let q=D.querySelector('input:not([type="hidden"]):not([readonly]):not([disabled]), select:not([disabled]), textarea:not([readonly]), [contenteditable="true"]');if(q)return q}return null}k.addEventListener("keydown",c=>{if(c.isComposing||c.key!=="Enter")return;let R=t.keys??{};if(c.ctrlKey||c.metaKey){if(R.saveWithCtrlEnter===!1||t.showActions===!1||c.target.closest(".ag-root-wrapper"))return;c.preventDefault(),In(),be?be():ue();return}if(c.defaultPrevented||!R.enterMovesToNext||c.shiftKey||c.altKey)return;let A=c.target;A.tagName!=="INPUT"&&A.tagName!=="SELECT"||A.closest('[data-type="one2many"]')||["button","submit","reset","file"].includes(A.type)||(c.preventDefault(),Dn(A)?.focus())});function Gt(c,R=!0){return new Promise(A=>{let I=u("p",{id:`${h}-confirm`},c),D=u("button",{type:"button",class:"fd-button"},p.cancel),q=u("button",{type:"button",class:"fd-button fd-button-primary"},p.ok),j=u("div",{class:"fd-dialog",role:"alertdialog","aria-modal":"true","aria-labelledby":I.id},I,u("div",{class:"fd-actions fd-actions-end"},...R?[D,q]:[q])),ie=u("div",{class:"fd-dialog-backdrop"},j),Y=G=>{ie.remove(),A(G)};D.addEventListener("click",()=>Y(!1)),q.addEventListener("click",()=>Y(!0)),ie.addEventListener("keydown",G=>{G.key==="Escape"&&Y(!1)}),k.append(ie),q.focus()})}function We(c){for(let R of g)R(c)}e.append(k);let Pn=l.subscribe(We);return We(l.getState()),l.getState().status==="idle"&&l.load(),{form:l,element:k,setSkin(c){k.setAttribute("data-fd-skin",c)},async save(){let c=await l.save();return c||T(),c},check(){let c=l.validate();return c||T(),c},setReadonly(c){C=c,k.toggleAttribute("data-readonly",C),We(l.getState())},isReadonly:()=>C,destroy(){Pn();for(let c of f)c();k.remove(),s&&l.dispose()}}}var Wr=new Set(["boolean","one2many","binary","image","html","json","properties"]);var zr="0.7.0";return Jn(jr);})();
1
+ /*! Fieldia 0.9.0 · MIT · https://fieldia.dev */
2
+ "use strict";var Fieldia=(()=>{var it=Object.defineProperty;var tr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.prototype.hasOwnProperty;var ir=(e,t,n)=>t in e?it(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ar=(e,t)=>{for(var n in t)it(e,n,{get:t[n],enumerable:!0})},or=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of nr(t))!rr.call(e,a)&&a!==n&&it(e,a,{get:()=>t[a],enumerable:!(i=tr(t,a))||i.enumerable});return e};var sr=e=>or(it({},"__esModule",{value:!0}),e);var Ve=(e,t,n)=>ir(e,typeof t!="symbol"?t+"":t,n);var mi={};ar(mi,{DEFAULT_LABELS:()=>Zn,FIELDIA_CSS:()=>Pn,FIELD_NAME:()=>rn,FIELD_TYPES:()=>at,FORMAT_VERSION:()=>st,ICONS:()=>Wn,MESSAGES:()=>Te,VERSION:()=>gi,VIEWER_LABELS:()=>Ce,WIDGET_LABELS:()=>ge,binaryWidget:()=>Wt,browserPreferences:()=>Yt,builtInWidgets:()=>On,charTagsWidget:()=>Ot,checkPage:()=>ct,checkValue:()=>Ue,compileModifier:()=>Ae,createForm:()=>ht,createMemoryDataSource:()=>mn,createWidget:()=>Ee,displayValue:()=>et,drawIcon:()=>ze,emptyValue:()=>Ye,evaluateModifier:()=>sn,expressionContext:()=>Ze,facetsToFilter:()=>gt,fill:()=>Je,formatBytes:()=>Xe,formatNumber:()=>Pe,groupByFields:()=>mt,hostScheduler:()=>Qe,htmlWidget:()=>Ut,imageWidget:()=>Bt,initialValues:()=>He,installStyles:()=>Kt,isEmpty:()=>qe,isModifierValid:()=>dn,isoWeek:()=>An,jsonWidget:()=>_t,kindTextField:()=>kn,labelWidget:()=>nt,lineForm:()=>Sn,lineKind:()=>Me,linesWidget:()=>zt,linkAddress:()=>Tn,linkCheckboxesWidget:()=>Dt,many2oneWidget:()=>It,matchesFilter:()=>_e,memoryPreferences:()=>Kr,mountViewer:()=>Xt,normalizeNumber:()=>Vt,openFormDialog:()=>Ft,openSearchDialog:()=>Zt,progressbarWidget:()=>tt,propertiesWidget:()=>qt,referenceWidget:()=>Pt,sanitizeHtml:()=>Jt,saveProblemOf:()=>ut,saveRefused:()=>un,statusbarWidget:()=>kt,suggestions:()=>pt,summary:()=>wt,tagsWidget:()=>xt,translatePage:()=>ft,wait:()=>bt,wideColumns:()=>ot,withCalendar:()=>Lt});var rn=/^[A-Za-z_][A-Za-z0-9_]*$/,at=["char","text","html","integer","float","monetary","boolean","date","datetime","selection","binary","image","many2one","many2many","one2many","reference","properties","json"];function ot(e){return typeof e=="object"?e.wide:e??1}var st="0.1";function Ie(e,t){switch(e.type){case"BinaryOp":return dr(e,t);case"UnaryOp":return lr(e,t);case"Literal":return e.value;case"Identifier":return cr(t,e.name);default:throw new Error(`Unknown AST node type: ${e.type}`)}}function dr(e,t){let n=an(Ie(e.left,t)),i=an(Ie(e.right,t)),a=e.operator.toLowerCase(),r=n!==null&&i!==null;switch(a){case"==":return n===i;case"!=":case"<>":return n!==i;case"<":return r&&n<i;case">":return r&&n>i;case"<=":return r&&n<=i;case">=":return r&&n>=i;case"in":return Array.isArray(i)&&i.includes(n);case"not in":return Array.isArray(i)&&!i.includes(n);case"and":return Fe(n)&&Fe(i);case"or":return Fe(n)||Fe(i);default:throw new Error(`Unknown binary operator: ${e.operator}`)}}function lr(e,t){let n=Ie(e.operand,t);if(e.operator.toLowerCase()==="not")return!Fe(n);throw new Error(`Unknown unary operator: ${e.operator}`)}function an(e){return e===void 0?null:e}function Fe(e){return Array.isArray(e)?e.length>0:e!==null&&typeof e=="object"?Object.keys(e).length>0:!!e}function cr(e,t){let n=t.split("."),i=e;for(let a of n){if(i==null)return;i=i[a]}return i}var Tt=new Map([["True",!0],["False",!1],["None",null],["true",!0],["false",!1],["null",null]]);function Ke(e){let t=[];if(!e)return t;let n=/(\(|\)|==|!=|<=|>=|<>|<|>|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"|-?\d+\.?\d*|\w+(?:\.\w+)*)/iy,i=/\s*/y,a=0;for(;;){if(i.lastIndex=a,i.exec(e),a=i.lastIndex,a>=e.length)return t;n.lastIndex=a;let r=n.exec(e);if(!r)throw new Error(`Unexpected "${e[a]}" at character ${a+1} of: ${e}`);t.push({type:fr(r[0]),value:r[0],position:t.length}),a=n.lastIndex}}function fr(e){let t=e.toLowerCase().trim();return Tt.has(e)?"CONSTANT":t==="and"||t==="or"||t==="not"?"LOGICAL":["==","!=","<>","<",">","<=",">="].includes(e)||t==="in"||t==="not in"?"OPERATOR":e==="("||e===")"?"PAREN":e.startsWith("[")?"LIST":e.startsWith("'")||e.startsWith('"')?"STRING":/^-?\d+\.?\d*$/.test(e)?"NUMBER":"IDENTIFIER"}var Oe=class{constructor(t){Ve(this,"tokens");Ve(this,"position",0);this.tokens=t}parse(){if(this.tokens.length===0)throw new Error("Cannot parse empty expression");let t=this.parseOr();if(!this.isAtEnd())throw new Error(`Unexpected token at position ${this.position}: ${this.peek()?.value}`);return t}parseOr(){let t=this.parseAnd();for(;this.matchLogical("or");){let n=this.previous().value,i=this.parseAnd();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:i}}return t}parseAnd(){let t=this.parseNot();for(;this.matchLogical("and");){let n=this.previous().value,i=this.parseNot();t={type:"BinaryOp",operator:n.toLowerCase(),left:t,right:i}}return t}parseNot(){if(this.matchLogical("not")){let t=this.previous().value,n=this.parseComparison();return{type:"UnaryOp",operator:t.toLowerCase(),operand:n}}return this.parseComparison()}parseComparison(){let t=this.parseValue(),n=["==","!=","<>","<",">","<=",">=","in","not in"];if(this.matchOperator(...n)){let i=this.previous().value,a=this.parseValue();return{type:"BinaryOp",operator:i.toLowerCase(),left:t,right:a}}return t}parseValue(){if(this.match("PAREN","(")){let t=this.parseOr();return this.consume("PAREN",")","Expected closing parenthesis"),t}if(this.check("STRING"))return{type:"Literal",value:this.advance().value.slice(1,-1)};if(this.check("CONSTANT")){let t=this.advance();return{type:"Literal",value:Tt.get(t.value)??null}}if(this.check("NUMBER")){let t=this.advance();return{type:"Literal",value:Number(t.value)}}if(this.check("LIST")){let t=this.advance();return{type:"Literal",value:ur(t.value)}}if(this.check("IDENTIFIER"))return{type:"Identifier",name:this.advance().value};throw new Error(`Unexpected token: ${this.peek()?.value||"EOF"}`)}match(t,...n){if(this.check(t)){if(n.length===0)return this.advance(),!0;let i=this.peek();if(i&&n.includes(i.value))return this.advance(),!0}return!1}matchLogical(...t){let n=this.peek();if(n&&n.type==="LOGICAL"){let i=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(i))return this.advance(),!0}return!1}matchOperator(...t){let n=this.peek();if(n&&n.type==="OPERATOR"){let i=n.value.toLowerCase();if(t.map(a=>a.toLowerCase()).includes(i))return this.advance(),!0}return!1}check(t){return this.peek()?.type===t}advance(){return this.isAtEnd()||this.position++,this.previous()}peek(){return this.isAtEnd()?null:this.tokens[this.position]}previous(){return this.tokens[this.position-1]}isAtEnd(){return this.position>=this.tokens.length}consume(t,n,i){if(this.check(t)){let a=this.peek();if(a&&a.value===n)return this.advance()}throw new Error(i)}};function ur(e){try{let t=e.slice(1,-1).trim();if(!t)return[];let n=[],i="",a=!1,r="";for(let o=0;o<t.length;o++){let d=t[o];(d==="'"||d==='"')&&(o===0||t[o-1]!=="\\")&&(a?d===r&&(a=!1,r=""):(a=!0,r=d)),d===","&&!a?(n.push(on(i.trim())),i=""):i+=d}return i.trim()&&n.push(on(i.trim())),n}catch(t){throw new Error(`Cannot read the list ${e}`,{cause:t})}}function on(e){return e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):isNaN(Number(e))?e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e:Number(e)}function Ae(e){if(typeof e!="string"){let n=e===!0;return{source:e,fields:[],evaluate:()=>n}}let t=new Oe(Ke(e)).parse();return{source:e,fields:pr(t),evaluate(n){try{return Fe(Ie(t,n))}catch{return!1}}}}function pr(e){let t=[],n=i=>{switch(i.type){case"Identifier":{let a=i.name.split(".")[0];t.includes(a)||t.push(a);return}case"BinaryOp":n(i.left),n(i.right);return;case"UnaryOp":n(i.operand);return;default:return}};return n(e),t}var dt=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),lt=class{constructor(t){Ve(this,"page",t);Ve(this,"issues",[]);Ve(this,"ids",new Map)}run(){return this.checkFields(this.page.fields,"fields"),this.walkRoot(this.page.layout,"layout"),this.issues}report(t,n){this.issues.push({path:t,message:n})}claim(t,n){let i=this.ids.get(t);i!==void 0?this.report(n,`duplicate id "${t}", also used at ${i}`):this.ids.set(t,n)}need(t,n,i=this.page.fields){if(dt(i,t))return i[t];this.report(n,`no field "${t}"`)}checkModifiers(t,n,i=["invisible"]){for(let a of i){let r=t[a];if(typeof r!="string")continue;let o;try{o=Ae(r).fields}catch(d){this.report(`${n}.${a}`,`cannot read "${r}": ${d.message}`);continue}for(let d of o)dt(this.page.fields,d)||this.report(`${n}.${a}`,`"${r}" reads "${d}", which is not a field of this page`)}}checkFields(t,n){for(let[i,a]of Object.entries(t)){let r=`${n}.${i}`;if(a.type==="monetary"&&a.currencyField!==void 0){let o=this.need(a.currencyField,`${r}.currencyField`,t);o&&!["many2one","selection","char"].includes(o.type)&&this.report(`${r}.currencyField`,`"${a.currencyField}" is a ${o.type}; a currency field must be a many2one, selection or char`)}if((a.type==="many2one"||a.type==="many2many")&&a.filter){let o=(d,s)=>{if("any"in d)return d.any.forEach((l,u)=>o(l,`${s}.any[${u}]`));if("all"in d)return d.all.forEach((l,u)=>o(l,`${s}.all[${u}]`));d.valueFrom!==void 0&&this.need(d.valueFrom,`${s}.valueFrom`,t)};a.filter.forEach((d,s)=>{o(d,`${r}.filter[${s}]`)})}if(a.type==="properties"&&a.definitions){let o=new Set;a.definitions.forEach((d,s)=>{d.type==="selection"&&!d.options&&this.report(`${r}.definitions[${s}].options`,"a choice property needs its choices"),o.has(d.name)&&this.report(`${r}.definitions[${s}].name`,`"${d.name}" is named twice`),o.add(d.name)})}if(a.type==="one2many"&&(this.checkFields(a.fields,`${r}.fields`),a.lineKinds&&this.checkLineKinds(i,a.lineKinds,a.fields,`${r}.lineKinds`),a.sequenceField!==void 0)){let o=a.fields[a.sequenceField];o?o.type!=="integer"&&this.report(`${r}.sequenceField`,`"${a.sequenceField}" is a ${o.type}; the field that keeps the order of lines must be an integer`):this.report(`${r}.sequenceField`,`"${a.sequenceField}" is not a field of the lines of "${i}"`)}}}checkLineKinds(t,n,i,a){let r=i[n.field];if(!r)this.report(`${a}.field`,`"${n.field}" is not a field of the lines of "${t}"`);else if(r.type!=="selection"&&r.type!=="char")this.report(`${a}.field`,`"${n.field}" is a ${r.type}; the field that says what a line is must be a selection or char`);else if(r.type==="selection")for(let d of["section","note"]){let s=n[d]??d;r.options.some(l=>l.value===s)||this.report(`${a}.${d}`,`"${n.field}" has no option "${s}"`)}let o=i[n.text];o?o.type!=="char"&&o.type!=="text"&&this.report(`${a}.text`,`"${n.text}" is a ${o.type}; a section's or note's text must be a char or text field`):this.report(`${a}.text`,`"${n.text}" is not a field of the lines of "${t}"`)}walkRoot(t,n){if(t.type==="tabs")return this.walkNode(t,n);if(this.claim(t.id,n),t.type==="sheet")return this.walkSheet(t,n);if(t.type==="sections")return this.walkChildren(t.children,n);if(t.type==="list")return this.walkList(t,n);t.children.forEach((i,a)=>{let r=`${n}.children[${a}]`;this.claim(i.id,r),this.checkModifiers(i,r),this.walkChildren(i.children,r)})}walkList(t,n){this.page.data.kind!=="record"&&this.report("data",'a list shows records: its data needs kind "record" and a model'),t.columns.forEach((r,o)=>this.need(r,`${n}.columns[${o}]`)),t.sort?.forEach((r,o)=>this.need(r.field,`${n}.sort[${o}].field`)),t.searchFields?.forEach((r,o)=>this.need(r,`${n}.searchFields[${o}]`)),t.groupBy?.forEach((r,o)=>this.need(r,`${n}.groupBy[${o}]`));let i=(r,o)=>{if("any"in r)return r.any.forEach((d,s)=>i(d,`${o}.any[${s}]`));if("all"in r)return r.all.forEach((d,s)=>i(d,`${o}.all[${s}]`));this.need(r.field,`${o}.field`),r.valueFrom!==void 0&&this.report(`${o}.valueFrom`,"a list's filter compares with values, not with another field")},a=new Set;t.filters?.forEach((r,o)=>{this.claim(r.id,`${n}.filters[${o}]`),a.add(r.id),r.filter.forEach((d,s)=>i(d,`${n}.filters[${o}].filter[${s}]`))}),t.defaultFilters?.forEach((r,o)=>{a.has(r)||this.report(`${n}.defaultFilters[${o}]`,`no filter "${r}" in this list`)}),t.actions?.forEach((r,o)=>this.claim(r.id,`${n}.actions[${o}]`))}walkChildren(t,n){t.forEach((i,a)=>this.walkNode(i,`${n}.children[${a}]`))}walkNode(t,n){switch(this.claim(t.id,n),this.checkModifiers(t,n,t.type==="field"?["invisible","readonly","required"]:t.type==="section"?["invisible","readonly"]:["invisible"]),t.type){case"field":return this.checkFieldNode(t,n);case"section":return t.collapsible&&!t.title&&this.report(n,"a collapsible section needs a title to fold it by"),t.collapsed&&!t.collapsible&&this.report(n,"collapsed needs collapsible: true"),this.walkChildren(t.children,n);case"tabs":return this.walkTabs(t,n);default:return}}walkTabs(t,n){t.children.forEach((i,a)=>{let r=`${n}.children[${a}]`;this.claim(i.id,r),this.checkModifiers(i,r),this.walkChildren(i.children,r)})}walkSheet(t,n){if(t.title&&(this.need(t.title.field,`${n}.title.field`),t.title.subtitleField!==void 0&&this.need(t.title.subtitleField,`${n}.title.subtitleField`),t.title.avatarField!==void 0&&this.need(t.title.avatarField,`${n}.title.avatarField`)),t.statusbar){let{field:i,visibleStates:a}=t.statusbar,r=this.need(i,`${n}.statusbar.field`);if(r&&r.type!=="selection"&&r.type!=="many2one"&&this.report(`${n}.statusbar.field`,`"${i}" is a ${r.type}; a statusbar needs a selection or many2one`),r?.type==="selection"&&a){let o=new Set(r.options.map(d=>d.value));a.forEach((d,s)=>{o.has(d)||this.report(`${n}.statusbar.visibleStates[${s}]`,`"${d}" is not an option of "${i}"`)})}}t.buttons?.forEach((i,a)=>{this.claim(i.id,`${n}.buttons[${a}]`),this.checkModifiers(i,`${n}.buttons[${a}]`)}),t.statButtons?.forEach((i,a)=>{this.claim(i.id,`${n}.statButtons[${a}]`),this.checkModifiers(i,`${n}.statButtons[${a}]`),i.field!==void 0&&this.need(i.field,`${n}.statButtons[${a}].field`)}),t.ribbon&&(this.claim(t.ribbon.id,`${n}.ribbon`),this.checkModifiers(t.ribbon,`${n}.ribbon`)),t.badges?.forEach((i,a)=>{this.claim(i.id,`${n}.badges[${a}]`),this.checkModifiers(i,`${n}.badges[${a}]`)});for(let i of["above","below"])t.title?.[i]?.forEach((a,r)=>this.walkNode(a,`${n}.title.${i}[${r}]`));t.alerts?.forEach((i,a)=>{this.claim(i.id,`${n}.alerts[${a}]`),this.checkModifiers(i,`${n}.alerts[${a}]`)}),this.walkChildren(t.children,n),t.sidePanel&&(this.claim(t.sidePanel.id,`${n}.sidePanel`),this.checkModifiers(t.sidePanel,`${n}.sidePanel`))}checkFieldNode(t,n){let i=this.need(t.field,`${n}.field`);i&&t.totals&&(i.type!=="one2many"?this.report(`${n}.totals`,`totals only apply to one2many fields; "${t.field}" is a ${i.type}`):t.totals.forEach((a,r)=>{let o=dt(i.fields,a)?i.fields[a]:void 0;o?["integer","float","monetary"].includes(o.type)||this.report(`${n}.totals[${r}]`,`"${a}" is a ${o.type}; only integer, float and monetary columns add up`):this.report(`${n}.totals[${r}]`,`"${a}" is not a field of the lines of "${t.field}"`)}));for(let[a,r]of Object.entries(t.options??{}))a.endsWith("Field")&&typeof r=="string"&&this.need(r,`${n}.options.${a}`);if(i&&t.editMode&&i.type!=="one2many"&&this.report(`${n}.editMode`,`editMode only applies to one2many fields; "${t.field}" is a ${i.type}`),i&&t.optionalColumns)if(i.type!=="one2many")this.report(`${n}.optionalColumns`,`optional columns only apply to one2many fields; "${t.field}" is a ${i.type}`);else{let a=t.columns??Object.keys(i.fields).filter(r=>r!==i.lineKinds?.field&&r!==i.sequenceField);for(let r of Object.keys(t.optionalColumns))a.includes(r)||this.report(`${n}.optionalColumns.${r}`,`"${r}" is not a column of "${t.field}"`)}!i||!t.columns||(i.type==="one2many"?t.columns.forEach((a,r)=>{dt(i.fields,a)||this.report(`${n}.columns[${r}]`,`"${a}" is not a field of the lines of "${t.field}"`)}):i.type!=="many2many"&&this.report(`${n}.columns`,`columns only apply to one2many and many2many fields; "${t.field}" is a ${i.type}`))}};var je=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),gr=["sheet","sections","tabs","wizard"];function ct(e){if(!je(e))return{ok:!1,issues:[{path:"(page)",message:"a page is a JSON object"}]};let t=[],n=(s,l)=>t.push({path:s,message:l});e.fieldia!=="0.1"&&n("fieldia",`this build reads format ${"0.1"}`),(typeof e.id!="string"||!e.id)&&n("id","a page needs an id");let i=e.data;(!je(i)||!(i.kind==="responses"||i.kind==="record"&&typeof i.model=="string"&&i.model))&&n("data",'data is { "kind": "record", "model": \u2026 } or { "kind": "responses" }');let a=e.fields;if(!je(a))n("fields","fields is an object of field definitions, by name");else for(let[s,l]of Object.entries(a))(!je(l)||!at.includes(l.type)||typeof l.label!="string")&&n(`fields.${s}`,"a field needs a type Fieldia knows and a label");let r=e.layout,o=je(r)&&r.type==="list";if((!je(r)||(o?!Array.isArray(r.columns):!gr.includes(r.type)||!Array.isArray(r.children)))&&n("layout","the layout is a sheet, sections, tabs or wizard, with children, or a list with columns"),t.length)return{ok:!1,issues:t};let d=e;try{let s=new lt(d).run();return s.length?{ok:!1,issues:s}:{ok:!0,page:d}}catch(s){return{ok:!1,issues:[{path:"(page)",message:`a part of this page cannot be read: ${s.message}`}]}}}var mr=new Set(["title","description","label","help","placeholder","message","text","confirm","nextLabel","backLabel","finishLabel"]),br=new Set(["lineKinds","filter","default","data"]);function ft(e,t){let n=(i,a)=>{if(typeof i=="string")return a!==null&&mr.has(a)?t(i):i;if(Array.isArray(i))return i.map(o=>n(o,null));if(i===null||typeof i!="object")return i;let r={};for(let[o,d]of Object.entries(i)){let s=o==="options"&&!Array.isArray(d);r[o]=br.has(o)||s?d:n(d,o)}return r};return n(e,null)}function sn(e,t){if(e===void 0)return!1;if(typeof e=="boolean")return e;if(e==="1"||e==="True"||e==="true")return!0;if(e==="0"||e==="False"||e==="false"||e==="")return!1;try{let n=Ke(e);if(n.length===0)return!1;let a=new Oe(n).parse(),r=Ie(a,t);return Fe(r)}catch{return!1}}function dn(e){if(e===void 0||typeof e=="boolean"||e==="")return!0;try{let t=Ke(e);return t.length===0||new Oe(t).parse(),!0}catch{return!1}}function Ye(e){switch(e.type){case"boolean":return!1;case"many2many":case"one2many":return[];case"selection":return e.multiple?[]:null;default:return null}}function He(e){let t={};for(let[n,i]of Object.entries(e))t[n]=i.default!==void 0?le(i.default):Ye(i);return t}function qe(e,t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:!1}function Ze(e,t){let n={};for(let[i,a]of Object.entries(e)){let r=t[i];n[i]=r?hr(r,a):a}return n}function hr(e,t){if(t==null)return null;switch(e.type){case"many2one":return t.id;case"many2many":return t.map(n=>n.id);case"one2many":return t.map(n=>n.key);case"reference":{let n=t;return`${n.model},${n.id}`}case"binary":case"image":return t.name;default:return t}}function Me(e,t){let n=e.lineKinds;if(!n)return null;let i=t[n.field];return i===(n.section??"section")?"section":i===(n.note??"note")?"note":null}function le(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}var Te={en:{required:"{label} is required",maxLength:"Maximum {max} characters allowed",pattern:"{label} is not in the expected format",text:"{label} must be text",number:"{label} must be a number",integer:"{label} must be a whole number",min:"{label} must be at least {min}",max:"{label} must be at most {max}",decimals:"Maximum {digits} decimal places allowed",boolean:"{label} must be yes or no",dateFormat:"Invalid date format (expected YYYY-MM-DD)",dateInvalid:"Invalid date (check month/day values)",datetimeFormat:"Invalid date and time format (expected YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"Invalid date and time (check the values)",choice:"Must be one of: {options}",choices:"{label} must be a list of choices",record:"{label} must be a record",records:"{label} must be a list of records",reference:"{label} must point to {aModels}",file:"{label} must be a file",fileSize:"{label} is larger than {size}",fileType:"{label} must be {aTypes} file",or:"or"},ar:{required:"{label} \u0645\u0637\u0644\u0648\u0628",maxLength:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {max} \u062D\u0631\u0641\u064B\u0627",pattern:"\u0635\u064A\u063A\u0629 {label} \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629",text:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0635\u064B\u0627",number:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627",integer:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0631\u0642\u0645\u064B\u0627 \u0635\u062D\u064A\u062D\u064B\u0627",min:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0642\u0644 {label} \u0639\u0646 {min}",max:"\u064A\u062C\u0628 \u0623\u0644\u0627 \u064A\u0632\u064A\u062F {label} \u0639\u0646 {max}",decimals:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {digits} \u0645\u0646\u0627\u0632\u0644 \u0639\u0634\u0631\u064A\u0629",boolean:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0646\u0639\u0645 \u0623\u0648 \u0644\u0627",dateFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DD)",dateInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u063A\u064A\u0631 \u0635\u062D\u064A\u062D (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0634\u0647\u0631 \u0648\u0627\u0644\u064A\u0648\u0645)",datetimeFormat:"\u0635\u064A\u063A\u0629 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u0629 (\u0627\u0644\u0645\u062A\u0648\u0642\u0639 YYYY-MM-DDTHH:MM:SS)",datetimeInvalid:"\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u063A\u064A\u0631 \u0635\u062D\u064A\u062D\u064A\u0646",choice:"\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0642\u064A\u0645\u0629 \u0648\u0627\u062D\u062F\u0629 \u0645\u0646: {options}",choices:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0627\u062E\u062A\u064A\u0627\u0631\u0627\u062A",record:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0633\u062C\u0644\u064B\u0627",records:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0642\u0627\u0626\u0645\u0629 \u0633\u062C\u0644\u0627\u062A",reference:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0634\u064A\u0631 {label} \u0625\u0644\u0649 {models}",file:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641\u064B\u0627",fileSize:"\u062D\u062C\u0645 {label} \u0623\u0643\u0628\u0631 \u0645\u0646 {size}",fileType:"\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 {label} \u0645\u0644\u0641 {types}",or:"\u0623\u0648"},de:{required:"{label} ist erforderlich",maxLength:"Maximal {max} Zeichen erlaubt",pattern:"{label} hat nicht das erwartete Format",text:"{label} muss Text sein",number:"{label} muss eine Zahl sein",integer:"{label} muss eine ganze Zahl sein",min:"{label} muss mindestens {min} sein",max:"{label} darf h\xF6chstens {max} sein",decimals:"Maximal {digits} Nachkommastellen erlaubt",boolean:"{label} muss ja oder nein sein",dateFormat:"Ung\xFCltiges Datumsformat (erwartet JJJJ-MM-TT)",dateInvalid:"Ung\xFCltiges Datum (Monat und Tag pr\xFCfen)",datetimeFormat:"Ung\xFCltiges Datums- und Zeitformat (erwartet JJJJ-MM-TTTHH:MM:SS)",datetimeInvalid:"Ung\xFCltiges Datum oder ung\xFCltige Uhrzeit",choice:"Muss eines davon sein: {options}",choices:"{label} muss eine Liste von Optionen sein",record:"{label} muss ein Datensatz sein",records:"{label} muss eine Liste von Datens\xE4tzen sein",reference:"{label} muss auf {models} verweisen",file:"{label} muss eine Datei sein",fileSize:"{label} ist gr\xF6\xDFer als {size}",fileType:"{label} muss eine {types}-Datei sein",or:"oder"},fr:{required:"{label} est obligatoire",maxLength:"{max} caract\xE8res au maximum",pattern:"{label} n'a pas le format attendu",text:"{label} doit \xEAtre du texte",number:"{label} doit \xEAtre un nombre",integer:"{label} doit \xEAtre un nombre entier",min:"{label} doit \xEAtre au moins {min}",max:"{label} doit \xEAtre au plus {max}",decimals:"{digits} d\xE9cimales au maximum",boolean:"{label} doit \xEAtre oui ou non",dateFormat:"Format de date invalide (attendu AAAA-MM-JJ)",dateInvalid:"Date invalide (v\xE9rifiez le mois et le jour)",datetimeFormat:"Format de date et heure invalide (attendu AAAA-MM-JJTHH:MM:SS)",datetimeInvalid:"Date ou heure invalide",choice:"Doit \xEAtre parmi : {options}",choices:"{label} doit \xEAtre une liste de choix",record:"{label} doit \xEAtre un enregistrement",records:"{label} doit \xEAtre une liste d'enregistrements",reference:"{label} doit pointer vers {models}",file:"{label} doit \xEAtre un fichier",fileSize:"{label} d\xE9passe {size}",fileType:"{label} doit \xEAtre un fichier {types}",or:"ou"}};function Je(e,t){return e.replace(/\{(\w+)\}/g,(n,i)=>i in t?String(t[i]):n)}function Ue(e,t,n,i=Te.en){let a=e.label||"This field",r=(o,d={})=>Je(i[o],{label:a,...d});if(qe(e,t))return n?r("required"):void 0;switch(e.type){case"char":case"text":case"html":return typeof t!="string"?r("text"):(e.type==="char"||e.type==="text")&&e.size!==void 0&&t.length>e.size?r("maxLength",{max:e.size}):e.type==="char"&&e.pattern!==void 0&&!new RegExp(e.pattern).test(t)?r("pattern"):void 0;case"integer":case"float":case"monetary":return typeof t!="number"||!Number.isFinite(t)?r("number"):e.type==="integer"&&!Number.isInteger(t)?r("integer"):e.min!==void 0&&t<e.min?r("min",{min:e.min}):e.max!==void 0&&t>e.max?r("max",{max:e.max}):e.type!=="integer"&&e.digits&&yr(t)>e.digits[1]?r("decimals",{digits:e.digits[1]}):void 0;case"boolean":return typeof t=="boolean"?void 0:r("boolean");case"date":return vr(t,r);case"datetime":return wr(t,r);case"selection":{let o=new Set(e.options.map(s=>s.value)),d=r("choice",{options:e.options.map(s=>s.label).join(", ")});return e.multiple?Array.isArray(t)?t.every(s=>o.has(s))?void 0:d:r("choices"):o.has(t)?void 0:d}case"many2one":return Ct(t)?void 0:r("record");case"many2many":return Array.isArray(t)&&t.every(Ct)?void 0:r("records");case"reference":{let o=t;if(!Ct(t)||typeof o.model!="string")return r("record");if(!e.models.some(d=>d.value===o.model)){let d=cn(e.models.map(s=>s.label),i.or);return r("reference",{models:d,aModels:fn(d)})}return}case"binary":case"image":return kr(e,t,r,i);default:return}}function yr(e){let t=String(e);if(t.includes("e-"))return Number(t.split("e-")[1]);let n=t.indexOf(".");return n===-1?0:t.length-n-1}function Ct(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&(typeof e.id=="number"||typeof e.id=="string")&&typeof e.label=="string"}function vr(e,t){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e))return t("dateFormat");let[n,i,a]=e.split("-").map(Number);return ln(n,i,a)?void 0:t("dateInvalid")}var xr=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:\d{2})?$/;function wr(e,t){let n=typeof e=="string"?xr.exec(e):null;if(!n)return t("datetimeFormat");let[i,a,r,o,d,s]=n.slice(1).map(l=>Number(l??0));return ln(i,a,r)&&o<24&&d<60&&s<60?void 0:t("datetimeInvalid")}function ln(e,t,n){if(t<1||t>12||n<1)return!1;let i=[31,e%4===0&&(e%100!==0||e%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];return n<=i[t-1]}function kr(e,t,n,i){let a=t;if(!Sr(t))return n("file");if("maxSize"in e&&e.maxSize!==void 0&&a.size>e.maxSize)return n("fileSize",{size:Xe(e.maxSize)});if(e.type==="binary"&&e.accept&&!e.accept.some(r=>Lr(r,a.type))){let r=cn(e.accept.map(Er),i.or);return n("fileType",{types:r,aTypes:fn(r)})}}function Sr(e){let t=e;return e!==null&&typeof e=="object"&&typeof t.name=="string"&&typeof t.size=="number"}function Lr(e,t){return e.endsWith("/*")?t.startsWith(e.slice(0,-1)):e===t}function Er(e){return e.endsWith("/*")?e.slice(0,-2):e==="application/pdf"?"PDF":(e.split("/")[1]??e).toUpperCase()}function cn(e,t){return e.length<=1?e.join(""):`${e.slice(0,-1).join(", ")} ${t} ${e[e.length-1]}`}function fn(e){return/^[aeiou]/i.test(e)?`an ${e}`:`a ${e}`}function Xe(e){let t=["bytes","KB","MB","GB"],n=e,i=0;for(;n>=1024&&i<t.length-1;)n/=1024,i++;return`${Number(n.toFixed(1))} ${t[i]}`}function un(e){return Object.assign(new Error(e.message),{problem:e})}function ut(e){let t=e?.problem;if(t&&typeof t.kind=="string")return t;let n=e instanceof Error?e.message:String(e);return e instanceof TypeError&&/fetch|network|load failed/i.test(n)?{kind:"network",message:n}:{kind:"other",message:n}}function _e(e,t){return t.every(n=>$t(e,n))}function $t(e,t){return"any"in t?t.any.some(n=>$t(e,n)):"all"in t?t.all.every(n=>$t(e,n)):Rr(e,t)}function De(e){return e!=null&&e!==""&&e!==!1&&!(Array.isArray(e)&&!e.length)}function Rr(e,t){let n=e[t.field],i=n!==null&&typeof n=="object"&&!Array.isArray(n)&&"id"in n?n.id:n,a=t.value,r=n!==null&&typeof n=="object"&&!Array.isArray(n)&&"label"in n?String(n.label):String(i??"");switch(t.op){case"=":return i===a;case"!=":return i!==a;case"<":return De(i)&&i<a;case">":return De(i)&&i>a;case"<=":return De(i)&&i<=a;case">=":return De(i)&&i>=a;case"in":return Array.isArray(a)&&a.includes(i);case"not in":return Array.isArray(a)&&!a.includes(i);case"like":return r.includes(String(a));case"ilike":return r.toLowerCase().includes(String(a).toLowerCase());case"startswith":return r.toLowerCase().startsWith(String(a).toLowerCase());case"endswith":return r.toLowerCase().endsWith(String(a).toLowerCase());case"set":return De(n);case"notset":return!De(n);case"between":{if(!De(i)||!Array.isArray(a))return!1;let[o,d]=a;return i>=o&&i<=d}}}var pn=new Set(["char","text","html"]),gn=new Set(["integer","float","monetary"]),Fr=new Set(["many2one","many2many"]);function pt(e,t,n,i={searchFor:"Search {field} for: {text}"}){let a=e.trim();if(!a)return[];let r=[];for(let d of n.searchFields??n.columns){let s=t.fields[d];if(!s)continue;let l=(u,h,x,g)=>r.push({field:d,fieldLabel:s.label,op:u,value:h,valueLabel:x,label:g??Je(i.searchFor,{field:s.label,text:a})});if(pn.has(s.type)||Fr.has(s.type))l("ilike",a,a);else if(s.type==="selection"){let u=a.toLowerCase();for(let h of s.options)h.label.toLowerCase().includes(u)&&l("=",h.value,h.label,`${s.label}: ${h.label}`)}else if(gn.has(s.type)){let u=Number(a.replace(/[\s,]/g,""));a&&Number.isFinite(u)&&l("=",u,a)}}let o=d=>{let s=t.fields[d.field]?.type??"";return pn.has(s)?0:s==="selection"?1:gn.has(s)?2:3};return r.map((d,s)=>({s:d,i:s})).sort((d,s)=>o(d.s)-o(s.s)||d.i-s.i).map(({s:d})=>d)}function gt(e,t){let n=[];for(let i of e)if(i.kind==="field"){let a=i.values.map(r=>({field:i.field,op:r.op,value:r.value}));n.push(a.length===1?a[0]:{any:a})}else if(i.kind==="filters"){let a=i.ids.map(r=>t.filters?.find(o=>o.id===r)?.filter??[]).filter(r=>r.length);a.length===1?n.push(...a[0]):a.length>1&&n.push({any:a.map(r=>r.length===1?r[0]:{all:r})})}else i.kind==="custom"&&n.push(...i.filter);return n}function mt(e){return e.find(t=>t.kind==="groupBy")?.fields??[]}var Qe={setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)};function bt(e,t=Qe){return new Promise(n=>{t.setTimeout(n,e)})}function mn(e={}){let t=le(e.records??{}),n=[],i=[],a=1e3,r=()=>e.delayMs?bt(e.delayMs,e.scheduler):Promise.resolve(),o=g=>t[g]??(t[g]={}),d=(g,m)=>{let c=o(g)[String(m)]?.[e.labelField?.[g]??"name"];return typeof c=="string"?c:String(m)},s=g=>Math.max(0,...Object.keys(o(g)).map(Number).filter(Number.isFinite))+1,l=g=>Number.isFinite(Number(g))?Number(g):g;function u(g,m){let c=[...g];for(let v of m)v.op==="create"?c.push({key:v.key,id:++a,values:le(v.values)}):v.op==="update"?c=c.map(b=>b.id===v.id?{...b,values:{...b.values,...le(v.values)}}:b):c=c.filter(b=>b.id!==v.id);return c}function h(g,m,c){let v=[...g],b=f=>({id:f,label:d(c,f)});for(let f of m)f.op==="link"&&!v.some(L=>L.id===f.id)?v.push(b(f.id)):f.op==="unlink"?v=v.filter(L=>L.id!==f.id):f.op==="set"?v=f.ids.map(b):f.op==="clear"&&(v=[]);return v}function x(g,m){let c=g[m];return c&&"relation"in c?c.relation:m}return{records:t,responses:n,calls:i,async load(g){i.push({method:"load",request:g}),await r();let m=o(g.model)[String(g.id)];if(!m)throw new Error(`No ${g.model} record with id ${g.id}`);return le(m)},async save(g){i.push({method:"save",request:g}),await r();let m=g.id??s(g.model),c={...o(g.model)[String(m)]??{},...le(g.changes.values)};for(let[v,b]of Object.entries(g.changes.lines))c[v]=u(c[v]??[],b);for(let[v,b]of Object.entries(g.changes.links))c[v]=h(c[v]??[],b,x(g.fields,v));return o(g.model)[String(m)]=c,{id:m,values:le(c)}},async onchange(g){i.push({method:"onchange",request:g}),await r();let m=e.onchange?.[g.model]?.[g.changed],c=e.warnings?.[g.model]?.[g.changed],v=m?{values:m(le(g.values))}:{},b=c?.(le(g.values));return b?{...v,warning:b}:v},async search(g){i.push({method:"search",request:g}),await r();let m=g.query.trim().toLowerCase();return Object.entries(o(g.model)).filter(([,c])=>_e(c,g.filter??[])).map(([c])=>({id:l(c),label:d(g.model,l(c))})).filter(c=>c.label.toLowerCase().includes(m)).slice(0,g.limit??8)},async list(g){i.push({method:"list",request:g}),await r();let m=Object.entries(o(g.model)).filter(([,c])=>_e(c,g.filter)).map(([c,v])=>({id:l(c),values:v}));return m.sort((c,v)=>{for(let b of g.sort){let f=Nr(c.values[b.field],v.values[b.field]);if(f.empty)return f.result;if(f.result)return b.desc?-f.result:f.result}return 0}),{total:m.length,records:m.slice(g.offset,g.offset+g.limit).map(({id:c,values:v})=>({id:c,values:Object.fromEntries(g.fields.map(b=>[b,le(v[b]??null)]))}))}},async groups(g){i.push({method:"groups",request:g}),await r();let m=new Map;for(let c of Object.values(o(g.model))){if(!_e(c,g.filter))continue;let v=c[g.field]??null,b=v!==null&&typeof v=="object"&&!Array.isArray(v)&&"id"in v?v:null,f=b?b.id:v,L=JSON.stringify(f),w=m.get(L)??{value:f,label:b?b.label:v===null||v===""?"":String(v),count:0};w.count++,m.set(L,w)}return[...m.values()].sort((c,v)=>c.value===null==(v.value===null)?c.label.localeCompare(v.label):c.value===null?1:-1)},async create(g){i.push({method:"create",request:g}),await r();let m=o(g.model),c=Object.keys(m).reduce((v,b)=>Math.max(v,Number(b)||0),0)+1;return m[String(c)]={name:g.name},{id:c,label:g.name}},async submit(g){return i.push({method:"submit",request:g}),await r(),n.push(le(g)),{id:n.length}}}}function Nr(e,t){let n=o=>o==null||o==="";if(n(e)||n(t))return{result:n(e)===n(t)?0:n(e)?1:-1,empty:n(e)!==n(t)};let i=o=>typeof o=="object"&&o!==null&&"label"in o?o.label:o,[a,r]=[i(e),i(t)];return typeof a=="number"&&typeof r=="number"?{result:a-r,empty:!1}:{result:String(a).localeCompare(String(r)),empty:!1}}function ht(e){let{page:t}=e,n=e.scheduler??Qe,i=e.messages??Te.en,a=Tr(t.layout),r=t.layout.type==="wizard"?t.layout.children.map(y=>y.id):[],o=()=>`fieldia:draft:${t.id}:${s.recordId??"new"}`,d={...He(t.fields),...le(e.values??{})},s={status:e.recordId!=null?"idle":"ready",recordId:e.recordId??null,values:le(d),errors:{},dirty:[],warning:null,warningField:null,error:null,draft:null,step:r[0]??null,skipped:[],saveProblem:null},l={},u=0,h=0,x=null,g=null,m=new Set,c=new Set,v=null;function b(y){s={...s,...y};for(let S of[...c])S(s)}function f(y){m.add(y);let S=()=>m.delete(y);return y.then(S,S),y}function L(){return v?.values!==s.values&&(v={values:s.values,context:Ze(s.values,t.fields)}),v.context}function w(y){let S=t.fields[y];if(!S)throw new Error(`The page has no field "${y}"`);return S}function N(y){return Object.keys(t.fields).filter(S=>JSON.stringify(y[S]??null)!==JSON.stringify(d[S]??null))}function O(y){let S=a.get(y);if(!S)throw new Error(`The page has no element "${y}"`);let A=L(),R=S.invisible.evaluate(A);for(let I=S.parent;!R&&I;I=a.get(I)?.parent??null)R=a.get(I)?.invisible.evaluate(A)??!1;let k=S.readonly.evaluate(A);for(let I=S.parent;!k&&I;I=a.get(I)?.parent??null)k=a.get(I)?.readonly.evaluate(A)??!1;let E=S.field?t.fields[S.field]:void 0;return{invisible:R,readonly:k||E?.readonly===!0,required:S.required.evaluate(A)||E?.required===!0}}function T(y){let S=R=>{if(!y)return!0;for(let k=R.id;k;k=a.get(k)?.parent??null)if(k===y)return!0;return!1},A=R=>{if(y||!s.skipped.length)return!1;for(let k=R.id;k;k=a.get(k)?.parent??null)if(s.skipped.includes(k))return!0;return!1};return[...a.values()].filter(R=>R.kind==="field"&&S(R)&&!A(R)&&!O(R.id).invisible)}function z(y){let S={};for(let A of T(y)){let R=A.field;if(S[R])continue;let k=t.fields[R],E=Ue(k,s.values[R],O(A.id).required,i);if(E&&(S[R]=E),k.type==="one2many")for(let I of s.values[R]??[]){let te=Me(k,I.values);for(let[X,Y]of Object.entries(k.fields)){if(te&&X!==k.lineKinds?.text)continue;let ae=Ue(Y,I.values[X],Y.required===!0,i);ae&&(S[`${R}.${I.key}.${X}`]=ae)}}}return S}function B(y,S={}){let A=Object.keys(s.errors).length?J(y):s.errors;b({values:y,dirty:N(y),errors:A,...S})}function J(y){let S=s;s={...s,values:y};let A=z(s.step??void 0);s=S;let R={};for(let k of Object.keys(s.errors))A[k]&&(R[k]=A[k]);for(let[k,E]of Object.entries(l))JSON.stringify(y[k]??null)===E.value?R[k]??(R[k]=E.message):delete l[k];return R}function de(){let y=e.drafts;y&&(x!==null&&n.clearTimeout(x),x=n.setTimeout(()=>{x=null,y.store.setItem(o(),JSON.stringify({savedAt:new Date().toISOString(),values:s.values}))},y.delayMs??400))}function _(){x!==null&&n.clearTimeout(x),x=null,e.drafts?.store.removeItem(o())}function K(){let y=e.drafts;if(!y)return;let S=y.store.getItem(o());if(!S)return;let A;try{A=JSON.parse(S)}catch{y.store.removeItem(o());return}y.restore==="auto"?B({...s.values,...A.values},{draft:null}):b({draft:{savedAt:A.savedAt}})}function Q(){let y=e.autosave;!y||t.data.kind!=="record"||(g!==null&&n.clearTimeout(g),g=n.setTimeout(()=>{g=null,s.dirty.length&&Object.keys(z()).length===0&&f(F())},y.delayMs))}function ee(y){let S=e.dataSource;if(!S?.onchange||t.data.kind!=="record")return;let A=++h,R={model:t.data.model,id:s.recordId,changed:y,values:le(s.values)};f(S.onchange(R).then(k=>{if(A!==h)return;let E={...s.values,...k.values??{}};B(E,{warning:k.warning??null,warningField:k.warning?y:null})},()=>{}))}function $(y){de(),Q(),ee(y)}function V(){let y={values:{},lines:{},links:{}},S=s.recordId===null||s.recordId===void 0,A=S?Object.keys(t.fields).filter(R=>s.dirty.includes(R)||!qe(t.fields[R],s.values[R])):s.dirty;for(let R of A){let k=t.fields[R],E=s.values[R],I=S?Ye(k):d[R];k.type==="one2many"?y.lines[R]=Ar(I??[],E??[]):k.type==="many2many"?y.links[R]=Mr(I??[],E??[]):y.values[R]=le(E)}return y}function W(){let y={};for(let S of T()){let A=S.field;y[A]=le(s.values[A])}return y}async function F(){let y=z();if(Object.keys(y).length)return b({errors:y}),!1;let S=e.dataSource;l={},b({status:"saving",errors:{},error:null,saveProblem:null});try{if(t.data.kind==="responses"){if(!S?.submit)throw new Error("This page has no data source to send its answers to");return await S.submit({pageId:t.id,values:W()}),_(),b({status:"saved"}),!0}if(!S?.save)throw new Error("This page has no data source to save to");let A=await S.save({model:t.data.model,id:s.recordId,fields:t.fields,changes:V(),values:le(s.values)});_();let R=A.values?{...s.values,...A.values}:s.values;return d=le(R),b({status:"saved",recordId:A.id,values:R,dirty:[]}),!0}catch(A){let R=ut(A),k=R.kind==="fields"?R.fields??{}:{};return l=Object.fromEntries(Object.entries(k).map(([E,I])=>[E,{message:I,value:JSON.stringify(s.values[E]??null)}])),b({status:"error",error:R.message,saveProblem:R,errors:{...k}}),!1}}function D(y){return!e.dataSource?.create||!y||y.readonly?null:y.type==="many2one"||y.type==="many2many"?y.relation:null}async function H(y,S,A){let R=D(y),k=e.dataSource;if(!R||!k?.create)throw new Error(`"${S}" cannot make records: its data source has no create, or it is not a link`);return f(k.create({model:R,name:A.trim()}))}async function ne(y,S,A,R,k,E){if(y.type!=="many2one"&&y.type!=="many2many"&&y.type!=="reference")throw new Error(`"${S}" is not a many2one, many2many or reference`);if(y.type==="reference"&&!E)throw new Error(`Searching "${S}" needs a model`);let I=e.dataSource;if(!I?.search)return[];let te=ae=>"any"in ae?{any:ae.any.map(te)}:"all"in ae?{all:ae.all.map(te)}:{field:ae.field,op:ae.op,value:ae.valueFrom!==void 0?A[ae.valueFrom]??null:ae.value??null},X=y.type==="reference"?void 0:y.filter?.map(te),Y=y.type==="reference"?E:y.relation;return f(I.search({model:Y,query:R,...X?{filter:X}:{},limit:k}))}function re(y){let S=w(y);if(S.type!=="one2many")throw new Error(`"${y}" is a ${S.type}, not a one2many`);return S}function me(){return s.step?r.indexOf(s.step):-1}function ue(y){return a.get(y)?.source?.optional===!0}async function pe(){let y=e.dataSource;if(!(s.recordId==null||t.data.kind!=="record")){if(!y?.load){b({status:"error",error:"This page has no data source to load from"});return}b({status:"loading",error:null});try{let S=await y.load({model:t.data.model,id:s.recordId,fields:t.fields});d={...He(t.fields),...S},b({status:"ready",values:le(d),dirty:[],errors:{}}),K()}catch(S){b({status:"error",error:S.message})}}}let ce={page:t,getState:()=>s,subscribe(y){return c.add(y),()=>c.delete(y)},load:()=>f(pe()),setValue(y,S){w(y),B({...s.values,[y]:le(S)}),$(y)},node:O,fieldReadonly:y=>w(y).readonly===!0,problem(y){let S=w(y),A=T().filter(R=>R.field===y);return A.length?Ue(S,s.values[y],A.some(R=>O(R.id).required),i)??null:null},validate(){let y=z();return b({errors:y}),Object.keys(y).length===0},save:()=>f(F()),reset(){_(),l={},b({values:le(d),dirty:[],errors:{},warning:null,warningField:null,draft:null,step:r[0]??null,skipped:[],saveProblem:null})},changes:V,addLine(y,S={}){let A=re(y),R=`new-${++u}`,k=s.values[y]??[],E={key:R,values:{...He(A.fields),...le(S)}};if(A.sequenceField&&E.values[A.sequenceField]==null){let te=k.map(X=>X.values[A.sequenceField]).filter(X=>typeof X=="number");E.values[A.sequenceField]=te.length?Math.max(...te)+1:1}let I=[...k,E];return B({...s.values,[y]:I}),$(y),R},updateLine(y,S,A,R){if(!re(y).fields[A])throw new Error(`The lines of "${y}" have no field "${A}"`);let E=(s.values[y]??[]).map(I=>I.key===S?{...I,values:{...I.values,[A]:le(R)}}:I);B({...s.values,[y]:E}),$(y)},moveLine(y,S,A){let k=re(y).sequenceField;if(!k)throw new Error(`The lines of "${y}" keep no order: give the field a sequenceField`);let E=[...s.values[y]??[]],I=E.findIndex(ye=>ye.key===S);if(I<0)throw new Error(`"${y}" has no line "${S}"`);let te=Math.max(0,Math.min(A,E.length-1));if(te===I)return;let X=E.map(ye=>ye.values[k]),Y=X.every((ye,xe)=>typeof ye=="number"&&(xe===0||ye>X[xe-1]));E.splice(te,0,...E.splice(I,1));let ae=Math.min(I,te),Ge=Math.max(I,te),At=Y?X.slice(ae,Ge+1):[],Mt=E.map((ye,xe)=>{let he=Y?xe>=ae&&xe<=Ge?At[xe-ae]:ye.values[k]:xe+1;return he===ye.values[k]?ye:{...ye,values:{...ye.values,[k]:he}}});B({...s.values,[y]:Mt}),$(y)},removeLine(y,S){re(y);let A=(s.values[y]??[]).filter(R=>R.key!==S);B({...s.values,[y]:A}),$(y)},async search(y,S,A=8,R={}){return ne(w(y),y,L(),S,A,R.model)},async previewLine(y,S,A){re(y);let R=s.values[y]??[],k=R.find(ae=>ae.key===S);if(!k)throw new Error(`"${y}" has no line "${S}"`);let E={...k.values,...A},I=e.dataSource;if(!I?.onchange||t.data.kind!=="record")return E;let te=R.map(ae=>ae.key===S?{...ae,values:E}:ae),Y=((await I.onchange({model:t.data.model,id:s.recordId,changed:y,values:le({...s.values,[y]:te})})).values?.[y]??[]).find(ae=>ae.key===S);return Y?{...E,...Y.values}:E},async searchLine(y,S,A,R,k=8){let E=re(y),I=E.fields[A];if(!I)throw new Error(`The lines of "${y}" have no field "${A}"`);let te=(s.values[y]??[]).find(X=>X.key===S);if(!te)throw new Error(`"${y}" has no line "${S}"`);return ne(I,A,Ze(te.values,E.fields),R,k)},canCreate:y=>D(t.fields[y])!==null,quickCreate:(y,S)=>H(t.fields[y],y,S),canCreateLine:(y,S)=>D(re(y).fields[S])!==null,quickCreateLine:(y,S,A)=>H(re(y).fields[S],S,A),steps:()=>r.filter(y=>!O(y).invisible),next(){if(!s.step)return!1;s.skipped.includes(s.step)&&b({skipped:s.skipped.filter(R=>R!==s.step)});let y=z(s.step);if(Object.keys(y).length)return b({errors:y}),!1;let S=ce.steps(),A=r.slice(me()+1).find(R=>S.includes(R));return A?(b({step:A,errors:{}}),!0):!1},back(){if(!s.step)return!1;let y=ce.steps(),S=r.slice(0,me()).reverse().find(A=>y.includes(A));return S?(b({step:S,errors:{}}),!0):!1},skip(){let y=s.step;if(!y||!ue(y))return!1;let S=ce.steps(),A=S[S.indexOf(y)+1];return A?(b({step:A,errors:{},skipped:[...s.skipped.filter(R=>R!==y),y]}),!0):!1},goTo(y){let S=ce.steps(),A=S.indexOf(y),R=s.step?S.indexOf(s.step):-1;if(A===-1||R===-1)return!1;if(A<=R)return b({step:y,errors:{}}),!0;let k=[...s.skipped];for(let E of S.slice(R,A)){if(k.includes(E))continue;let I=z(E);if(Object.keys(I).length){if(ue(E)){k.push(E);continue}return b({step:E,errors:I,skipped:k}),!1}}return b({step:y,errors:{},skipped:k}),!0},async runAction(y,S){let A=a.get(y);if(!A||A.kind!=="button"&&A.kind!=="stat")throw new Error(`The page has no button "${y}"`);if(O(y).invisible)return;let R=A.source;await f(Promise.resolve(e.onAction?.({id:y,action:R.action,..."params"in R&&R.params?{params:R.params}:{},recordId:s.recordId,values:le(s.values),...S?{recordIds:[...S.recordIds]}:{}})))},restoreDraft(){let y=e.drafts?.store.getItem(o());if(!y)return;let S=JSON.parse(y);B({...s.values,...S.values},{draft:null})},discardDraft(){_(),b({draft:null})},async settled(){for(;m.size;)await Promise.allSettled([...m])},dispose(){x!==null&&n.clearTimeout(x),g!==null&&n.clearTimeout(g),c.clear()}};return s.recordId==null&&K(),ce}function Ar(e,t){let n=[],i=new Map(e.filter(r=>r.id!==void 0).map(r=>[r.key,r]));for(let r of t){let o=i.get(r.key);if(r.id===void 0||!o){n.push({op:"create",key:r.key,values:le(r.values)});continue}let d={};for(let[s,l]of Object.entries(r.values))JSON.stringify(l)!==JSON.stringify(o.values[s])&&(d[s]=le(l));Object.keys(d).length&&n.push({op:"update",id:r.id,values:d})}let a=new Set(t.map(r=>r.key));for(let r of e)r.id!==void 0&&!a.has(r.key)&&n.push({op:"delete",id:r.id});return n}function Mr(e,t){let n=new Set(e.map(a=>a.id)),i=new Set(t.map(a=>a.id));return[...t.filter(a=>!n.has(a.id)).map(a=>({op:"link",id:a.id})),...e.filter(a=>!i.has(a.id)).map(a=>({op:"unlink",id:a.id}))]}function Tr(e){let t=new Map,n=(a,r,o,d)=>{t.set(a.id,{id:a.id,parent:r,kind:o,field:d.field,invisible:Ae(d.invisible),readonly:Ae(d.readonly),required:Ae(d.required),source:a})},i=(a,r)=>{for(let o of a)if(o.type==="field")n(o,r,"field",{invisible:o.invisible,readonly:o.readonly,required:o.required,field:o.field});else if(o.type==="button")n(o,r,"button",{invisible:o.invisible});else if(o.type==="tabs"){n(o,r,"other",{invisible:o.invisible});for(let d of o.children)n(d,o.id,"other",{invisible:d.invisible}),i(d.children,d.id)}else o.type==="section"?(n(o,r,"other",{invisible:o.invisible,readonly:o.readonly}),i(o.children,o.id)):n(o,r,"other",{invisible:o.invisible})};if(e.type==="tabs")return i([e],""),t.get(e.id).parent=null,t;if(n(e,null,"other",{}),e.type==="wizard")for(let a of e.children)n(a,e.id,"step",{invisible:a.invisible}),i(a.children,a.id);else if(e.type==="sections")i(e.children,e.id);else if(e.type==="list")for(let a of e.actions??[])n(a,e.id,"button",{invisible:a.invisible});else{let a=(r,o)=>{o&&n({id:r},e.id,"field",{field:o})};a("#title",e.title?.field),a("#subtitle",e.title?.subtitleField),a("#avatar",e.title?.avatarField),a("#statusbar",e.statusbar?.field);for(let r of e.buttons??[])n(r,e.id,"button",{invisible:r.invisible});for(let r of e.statButtons??[])n(r,e.id,"stat",{invisible:r.invisible});e.ribbon&&n(e.ribbon,e.id,"other",{invisible:e.ribbon.invisible});for(let r of e.alerts??[])n(r,e.id,"other",{invisible:r.invisible});for(let r of e.badges??[])n(r,e.id,"other",{invisible:r.invisible});i([...e.title?.above??[],...e.title?.below??[]],e.id),i(e.children,e.id),e.sidePanel&&n(e.sidePanel,e.id,"other",{invisible:e.sidePanel.invisible})}return t}var bn=new Map;function hn(e,t){let n=`${e}:${t}`,i=bn.get(n);return i||(i=new Intl.NumberFormat(e,{numberingSystem:"latn",minimumFractionDigits:t,maximumFractionDigits:t}),bn.set(n,i)),i}function Cr(e){let t=hn(e,1).formatToParts(12345.6);return{group:t.find(n=>n.type==="group")?.value??",",decimal:t.find(n=>n.type==="decimal")?.value??"."}}function Pe(e,t,n="en"){return hn(n,t).format(e)}function Vt(e,t="en"){let{group:n,decimal:i}=Cr(t),a=e.replace(/[٠-٩]/g,r=>String(r.charCodeAt(0)-1632)).replace(/[۰-۹]/g,r=>String(r.charCodeAt(0)-1776)).replace(/٫/g,i).replace(/٬/g,n);return a=a.replace(/[\s\u00a0\u202f]/g,""),n.trim()&&(a=a.split(n).join("")),i==="."?a:a.split(i).join(".")}var ge={en:{search:"Search\u2026",noResults:"No results",remove:"Remove {name}",clear:"Clear {label}",addLine:"Add a line",addSection:"Add a section",addNote:"Add a note",deleteLine:"Delete line",total:"Total",lineProblem:"Line {n}: {message}",moreProblems:"and {n} more",chooseColumns:"Choose columns",createNamed:"Create \u201C{name}\u201D",createAndEdit:"Create and edit\u2026",searchMore:"Search more\u2026",openNamed:"Open {name}",openLine:"Open line",chooseDate:"Choose a date",previousMonth:"Previous month",nextMonth:"Next month",weekShort:"Wk",week:"Week",formatting:"Formatting",bold:"Bold",italic:"Italic",underline:"Underline",textStyle:"Text style",paragraph:"Paragraph",heading:"Heading",subheading:"Subheading",bulletList:"Bulleted list",numberList:"Numbered list",alignLeft:"Align left",alignCenter:"Align centre",alignRight:"Align right",link:"Link",linkAddress:"Link address",applyLink:"Apply",removeLink:"Remove link",upload:"Upload a file",uploadImage:"Add a photo",replace:"Replace",removeFile:"Remove",dropHere:"or drop it here",invalidJson:"Not valid JSON"},ar:{search:"\u0628\u062D\u062B\u2026",noResults:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C",remove:"\u0625\u0632\u0627\u0644\u0629 {name}",clear:"\u0645\u0633\u062D {label}",addLine:"\u0625\u0636\u0627\u0641\u0629 \u0633\u0637\u0631",addSection:"\u0625\u0636\u0627\u0641\u0629 \u0642\u0633\u0645",addNote:"\u0625\u0636\u0627\u0641\u0629 \u0645\u0644\u0627\u062D\u0638\u0629",deleteLine:"\u062D\u0630\u0641 \u0627\u0644\u0633\u0637\u0631",total:"\u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",lineProblem:"\u0627\u0644\u0633\u0637\u0631 {n}: {message}",moreProblems:"\u0648{n} \u0623\u062E\u0631\u0649",chooseColumns:"\u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u0623\u0639\u0645\u062F\u0629",createNamed:"\u0625\u0646\u0634\u0627\u0621 \xAB{name}\xBB",createAndEdit:"\u0625\u0646\u0634\u0627\u0621 \u0648\u062A\u0639\u062F\u064A\u0644\u2026",searchMore:"\u0628\u062D\u062B \u0645\u0648\u0633\u0651\u0639\u2026",openNamed:"\u0641\u062A\u062D {name}",openLine:"\u0641\u062A\u062D \u0627\u0644\u0633\u0637\u0631",chooseDate:"\u0627\u062E\u062A\u064A\u0627\u0631 \u062A\u0627\u0631\u064A\u062E",previousMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642",nextMonth:"\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A",weekShort:"\u0623\u0633\u0628\u0648\u0639",week:"\u0627\u0644\u0623\u0633\u0628\u0648\u0639",formatting:"\u0627\u0644\u062A\u0646\u0633\u064A\u0642",bold:"\u063A\u0627\u0645\u0642",italic:"\u0645\u0627\u0626\u0644",underline:"\u062A\u0633\u0637\u064A\u0631",textStyle:"\u0646\u0645\u0637 \u0627\u0644\u0646\u0635",paragraph:"\u0641\u0642\u0631\u0629",heading:"\u0639\u0646\u0648\u0627\u0646",subheading:"\u0639\u0646\u0648\u0627\u0646 \u0641\u0631\u0639\u064A",bulletList:"\u0642\u0627\u0626\u0645\u0629 \u0646\u0642\u0637\u064A\u0629",numberList:"\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u0642\u0645\u0629",alignLeft:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0633\u0627\u0631",alignCenter:"\u062A\u0648\u0633\u064A\u0637",alignRight:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0645\u064A\u0646",link:"\u0631\u0627\u0628\u0637",linkAddress:"\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",applyLink:"\u062A\u0637\u0628\u064A\u0642",removeLink:"\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0627\u0628\u0637",upload:"\u0631\u0641\u0639 \u0645\u0644\u0641",uploadImage:"\u0625\u0636\u0627\u0641\u0629 \u0635\u0648\u0631\u0629",replace:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644",removeFile:"\u0625\u0632\u0627\u0644\u0629",dropHere:"\u0623\u0648 \u0623\u0641\u0644\u062A\u0647 \u0647\u0646\u0627",invalidJson:"\u0644\u064A\u0633 JSON \u0635\u0627\u0644\u062D\u064B\u0627"},de:{search:"Suchen\u2026",noResults:"Keine Ergebnisse",remove:"{name} entfernen",clear:"{label} leeren",addLine:"Zeile hinzuf\xFCgen",addSection:"Abschnitt hinzuf\xFCgen",addNote:"Notiz hinzuf\xFCgen",deleteLine:"Zeile l\xF6schen",total:"Summe",lineProblem:"Zeile {n}: {message}",moreProblems:"und {n} weitere",chooseColumns:"Spalten ausw\xE4hlen",createNamed:"\u201E{name}\u201C anlegen",createAndEdit:"Anlegen und bearbeiten\u2026",searchMore:"Weitere suchen\u2026",openNamed:"{name} \xF6ffnen",openLine:"Zeile \xF6ffnen",chooseDate:"Datum ausw\xE4hlen",previousMonth:"Vorheriger Monat",nextMonth:"N\xE4chster Monat",weekShort:"KW",week:"Kalenderwoche",formatting:"Formatierung",bold:"Fett",italic:"Kursiv",underline:"Unterstrichen",textStyle:"Textstil",paragraph:"Absatz",heading:"\xDCberschrift",subheading:"Unter\xFCberschrift",bulletList:"Aufz\xE4hlung",numberList:"Nummerierte Liste",alignLeft:"Linksb\xFCndig",alignCenter:"Zentriert",alignRight:"Rechtsb\xFCndig",link:"Link",linkAddress:"Linkadresse",applyLink:"\xDCbernehmen",removeLink:"Link entfernen",upload:"Datei hochladen",uploadImage:"Foto hinzuf\xFCgen",replace:"Ersetzen",removeFile:"Entfernen",dropHere:"oder hier ablegen",invalidJson:"Kein g\xFCltiges JSON"},fr:{search:"Rechercher\u2026",noResults:"Aucun r\xE9sultat",remove:"Retirer {name}",clear:"Effacer {label}",addLine:"Ajouter une ligne",addSection:"Ajouter une section",addNote:"Ajouter une note",deleteLine:"Supprimer la ligne",total:"Total",lineProblem:"Ligne {n} : {message}",moreProblems:"et {n} de plus",chooseColumns:"Choisir les colonnes",createNamed:"Cr\xE9er \xAB {name} \xBB",createAndEdit:"Cr\xE9er et modifier\u2026",searchMore:"Rechercher plus\u2026",openNamed:"Ouvrir {name}",openLine:"Ouvrir la ligne",chooseDate:"Choisir une date",previousMonth:"Mois pr\xE9c\xE9dent",nextMonth:"Mois suivant",weekShort:"Sem.",week:"Semaine",formatting:"Mise en forme",bold:"Gras",italic:"Italique",underline:"Soulign\xE9",textStyle:"Style du texte",paragraph:"Paragraphe",heading:"Titre",subheading:"Sous-titre",bulletList:"Liste \xE0 puces",numberList:"Liste num\xE9rot\xE9e",alignLeft:"Aligner \xE0 gauche",alignCenter:"Centrer",alignRight:"Aligner \xE0 droite",link:"Lien",linkAddress:"Adresse du lien",applyLink:"Appliquer",removeLink:"Supprimer le lien",upload:"T\xE9l\xE9verser un fichier",uploadImage:"Ajouter une photo",replace:"Remplacer",removeFile:"Retirer",dropHere:"ou d\xE9posez-le ici",invalidJson:"JSON invalide"}};var $r=180,yn=8;function yt(e,t){return e.replace(/\{(\w+)\}/g,(n,i)=>t[i]??n)}function vt(e){let{document:t,id:n,labels:i}=e,a=`${n}-list`,r=t.createElement("input");Object.assign(r,{id:n,className:"fd-input fd-combo-input",autocomplete:"off"}),r.setAttribute("role","combobox"),r.setAttribute("aria-autocomplete","list"),r.setAttribute("aria-expanded","false"),r.setAttribute("aria-controls",a),r.placeholder=i.search;let o=t.createElement("ul");o.id=a,o.className="fd-listbox",o.setAttribute("role","listbox"),o.hidden=!0;let d=t.createElement("div");d.className="fd-combo",d.append(r,o);let s="",l=null,u="",h=new Map,x=!1,g=[],m=-1,c=0,v,b=!1;function f(){if(o.replaceChildren(),g.forEach((T,z)=>{let B=t.createElement("li");B.id=`${a}-${z}`,B.setAttribute("role","option"),B.setAttribute("aria-selected",String(z===m)),B.className=`fd-option${z===m?" fd-active":""}${T===l||h.has(T)?" fd-option-create":""}`,B.textContent=T.label,B.addEventListener("mousedown",J=>J.preventDefault()),B.addEventListener("click",()=>N(z)),o.append(B)}),!g.length){let T=t.createElement("li");T.className="fd-empty",T.textContent=i.noResults,o.append(T)}m>=0?r.setAttribute("aria-activedescendant",`${a}-${m}`):r.removeAttribute("aria-activedescendant")}function L(){o.hidden=!1,r.setAttribute("aria-expanded","true")}function w(){clearTimeout(v),c++,o.hidden=!0,r.setAttribute("aria-expanded","false"),r.removeAttribute("aria-activedescendant"),m=-1}function N(T){let z=g[T];if(!z)return;let B=u;if(w(),x=!1,z===l&&e.create){e.create(B).then(e.pick,()=>{});return}let J=h.get(z);if(J){J(B).then(de=>de&&e.pick(de),()=>{});return}e.pick(z)}function O(T){clearTimeout(v);let z=++c;v=setTimeout(async()=>{let B=await e.search(T).catch(()=>[]);if(z!==c||t.activeElement!==r)return;let J=g[m],de=J&&J!==l&&!h.has(J)?J.id:void 0,_=e.exclude?.()??new Set,K=B.filter($=>!_.has($.id)),Q=e.shown!==void 0&&K.length>e.shown;g=Q?K.slice(0,e.shown):K;let ee=T.trim();l=null,e.create&&ee&&!B.some($=>$.label.trim().toLowerCase()===ee.toLowerCase())&&(u=ee,l={id:"__create__",label:yt(i.createNamed,{name:ee})},g=[...g,l]),u=ee,h=new Map((e.more?.(ee,Q)??[]).map(($,V)=>[{id:`__more_${V}__`,label:$.label},$.act])),g=[...g,...h.keys()],m=de===void 0?-1:g.findIndex($=>$.id===de),f(),L()},$r)}return r.addEventListener("input",()=>{x=!0,b||O(r.value)}),r.addEventListener("focus",()=>{b||O("")}),r.addEventListener("keydown",T=>{if(!b)switch(T.key){case"ArrowDown":case"ArrowUp":{if(T.preventDefault(),o.hidden)return O(r.value);if(!g.length)return;m=(m+(T.key==="ArrowDown"?1:-1)+g.length)%g.length,f(),o.children[m]?.scrollIntoView?.({block:"nearest"});return}case"Enter":!o.hidden&&m>=0&&(T.preventDefault(),N(m));return;case"Escape":o.hidden||T.preventDefault(),w(),x=!1,r.value=s;return;case"Backspace":r.value===""&&e.onEmptyBackspace?.();return}}),r.addEventListener("blur",()=>{c++,clearTimeout(v),w();let T=x&&r.value.trim()===""&&s!=="";x=!1,T?e.onCommitEmpty?.():r.value=s}),{element:d,input:r,setText(T){s=T,x||(r.value=T)},setReadonly(T){b=T,r.readOnly=T,T&&w()},close:w}}function vn(e,t,n){return n.options?.create!==!1&&e.canCreate(t)?i=>e.quickCreate(t,i):void 0}var It=({form:e,name:t,field:n,node:i,id:a,document:r,labels:o=ge.en,dialogs:d})=>{let s=n.type==="many2one"?n.relation:"",l=!!d&&d.canOpen(s),u=!1,h=vt({document:r,id:a,labels:o,search:m=>e.search(t,m,yn+1),shown:yn,pick:m=>e.setValue(t,m),onCommitEmpty:()=>e.setValue(t,null),create:vn(e,t,i),more:(m,c)=>{if(!d||u)return[];let v=[];return m&&l&&i.options?.create!==!1&&v.push({label:o.createAndEdit,act:b=>d.openRecord(s,{name:b,title:n.label})}),c&&v.push({label:o.searchMore,act:()=>d.searchMore({title:n.label,search:(b,f)=>e.search(t,b,f)})}),v}}),x=l?r.createElement("button"):null;x&&(x.type="button",x.className="fd-combo-open",x.textContent="\u2197",x.hidden=!0,x.addEventListener("click",async()=>{let m=e.getState().values[t];if(!m||!d)return;let c=await d.openRecord(s,{recordId:m.id,title:m.label});c&&c.label!==m.label&&e.setValue(t,c)}));let g=r.createElement("button");return g.type="button",g.className="fd-combo-clear",g.textContent="\xD7",g.setAttribute("aria-label",yt(o.clear,{label:n.label})),g.addEventListener("click",()=>{e.setValue(t,null),h.input.focus()}),h.element.append(g,...x?[x]:[]),{element:h.element,focus:()=>h.input.focus(),update(m){let c=m.value;u=m.readonly,h.setText(c?.label??""),h.setReadonly(m.readonly),g.hidden=!c||m.readonly,x&&(x.hidden=!c,c&&x.setAttribute("aria-label",yt(o.openNamed,{name:c.label}))),h.input.setAttribute("aria-invalid",String(m.invalid)),h.input.setAttribute("aria-required",String(m.required)),m.describedBy&&h.input.setAttribute("aria-describedby",m.describedBy)}}},xt=({form:e,name:t,node:n,id:i,document:a,labels:r=ge.en})=>{let o=()=>e.getState().values[t]??[],d=a.createElement("div");d.className="fd-tags",d.setAttribute("role","group");let s=a.createElement("ul");s.className="fd-chips";let l=vt({document:a,id:i,labels:r,search:x=>e.search(t,x),pick:x=>{e.setValue(t,[...o(),x]),l.input.value=""},exclude:()=>new Set(o().map(x=>x.id)),onEmptyBackspace:()=>{let x=o();x.length&&e.setValue(t,x.slice(0,-1))},create:vn(e,t,n)});d.append(s,l.element);let u=!1,h="";return{element:d,focus:()=>l.input.focus(),update(x){let g=x.value??[],m=JSON.stringify([x.readonly,g]);u=x.readonly,l.setReadonly(u),l.element.hidden=u,l.input.setAttribute("aria-invalid",String(x.invalid)),x.describedBy&&l.input.setAttribute("aria-describedby",x.describedBy),m!==h&&(h=m,xn(s,g,u,r,c=>e.setValue(t,o().filter(v=>v.id!==c.id))),l.setText(""))}}};function xn(e,t,n,i,a){let r=e.ownerDocument;e.replaceChildren(...t.map(o=>{let d=r.createElement("li");d.className="fd-chip";let s=r.createElement("span");if(s.className="fd-chip-label",s.textContent=o.label,d.append(s),!n){let l=r.createElement("button");l.type="button",l.className="fd-chip-remove",l.textContent="\xD7",l.setAttribute("aria-label",yt(i.remove,{name:o.label})),l.addEventListener("click",()=>a(o)),d.append(l)}return d}))}var Ot=({form:e,name:t,node:n,id:i,document:a,labels:r=ge.en})=>{let o=n.options??{},d=typeof o.separator=="string"&&o.separator?o.separator:",",s=Array.isArray(o.suggestions)?o.suggestions.filter(b=>typeof b=="string"):[],l=b=>typeof b=="string"?b.split(d).map(f=>f.trim()).filter(f=>f!==""):[],u=()=>l(e.getState().values[t]),h=b=>e.setValue(t,b.length?b.join(`${d} `):null),x=b=>{let f=b.trim(),L=u();f&&!L.some(w=>w.toLowerCase()===f.toLowerCase())&&h([...L,f])},g=a.createElement("div");g.className="fd-tags",g.setAttribute("role","group");let m=a.createElement("ul");m.className="fd-chips";let c=vt({document:a,id:i,labels:r,search:async b=>{let f=new Set(u().map(w=>w.toLowerCase())),L=b.trim().toLowerCase();return s.filter(w=>!f.has(w.toLowerCase())&&w.toLowerCase().includes(L)).map(w=>({id:w,label:w}))},pick:b=>{x(b.label),c.input.value=""},onEmptyBackspace:()=>{let b=u();b.length&&h(b.slice(0,-1))}});c.input.addEventListener("keydown",b=>{b.key!=="Enter"||b.defaultPrevented||c.input.value.trim()===""||(b.preventDefault(),x(c.input.value),c.input.value="",c.close())}),c.input.addEventListener("input",()=>{let b=c.input.value.split(d);if(!(b.length<2)){for(let f of b.slice(0,-1))x(f);c.input.value=b[b.length-1].trimStart()}}),c.input.addEventListener("change",()=>{c.input.value.trim()&&x(c.input.value)}),g.append(m,c.element);let v="";return{element:g,focus:()=>c.input.focus(),update(b){let f=l(b.value);c.setReadonly(b.readonly),c.element.hidden=b.readonly,c.input.setAttribute("aria-invalid",String(b.invalid)),b.describedBy&&c.input.setAttribute("aria-describedby",b.describedBy);let L=JSON.stringify([b.readonly,f]);L!==v&&(v=L,xn(m,f.map(w=>({id:w,label:w})),b.readonly,r,w=>h(u().filter(N=>N!==w.label))),c.setText(""))}}},Dt=({form:e,name:t,id:n,document:i})=>{let a=i.createElement("div");a.id=n,a.className="fd-choices fd-choices-checkbox",a.setAttribute("role","group");let r=[],o={readonly:!1,value:[]},d=()=>{let s=new Set(o.value.map(l=>l.id));for(let{record:l,box:u}of r)u.checked=s.has(l.id),u.disabled=o.readonly};return e.search(t,"",50).then(s=>{r=s.map((l,u)=>{let h=i.createElement("input");h.type="checkbox",h.id=`${n}-${u}`,h.addEventListener("change",()=>{let m=e.getState().values[t]??[];e.setValue(t,h.checked?[...m,l]:m.filter(c=>c.id!==l.id))});let x=i.createElement("label");x.className="fd-choice",x.htmlFor=h.id;let g=i.createElement("span");return g.textContent=l.label,x.append(h,g),a.append(x),{record:l,box:h}}),d()}),{element:a,focus:()=>a.querySelector("input")?.focus(),update(s){o={readonly:s.readonly,value:s.value??[]},d()}}},Pt=e=>{let{form:t,name:n,field:i,id:a,document:r,labels:o=ge.en}=e,d=i.type==="reference"?i.models:[],s=r.createElement("div");s.className="fd-reference";let l=r.createElement("select");l.className="fd-input fd-select",l.setAttribute("aria-label",i.label),l.append(r.createElement("option"));for(let x of d){let g=r.createElement("option");g.value=String(x.value),g.textContent=x.label,l.append(g)}let u="";l.addEventListener("change",()=>{u=l.value,t.setValue(n,null)});let h=vt({document:r,id:a,labels:o,search:x=>u?t.search(n,x,8,{model:u}):Promise.resolve([]),pick:x=>t.setValue(n,{model:u,id:x.id,label:x.label}),onCommitEmpty:()=>t.setValue(n,null)});return s.append(l,h.element),{element:s,focus:()=>u?h.input.focus():l.focus(),update(x){let g=x.value;g&&(u=g.model),l.value=u,l.disabled=x.readonly,h.setText(g?.label??""),h.setReadonly(x.readonly||!u)}}};function wn(e){let t=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?/.exec(e);if(!t)return null;let[,n,i,a,r,o]=t;return new Date(Number(n),Number(i)-1,Number(a),Number(r??0),Number(o??0))}function et(e,t,n={},i="en"){let a=(r,o)=>Pe(r,o,i);if(t==null||t==="")return"";switch(e.type){case"many2one":case"reference":return t.label??"";case"many2many":return(t??[]).map(r=>r.label).join(", ");case"selection":{let r=o=>e.options.find(d=>d.value===o)?.label??String(o);return Array.isArray(t)?t.map(r).join(", "):r(t)}case"integer":return a(Number(t),0);case"float":return a(Number(t),e.digits?.[1]??2);case"monetary":{let r=e.currency??(e.currencyField?n[e.currencyField]?.label:void 0),o=a(Number(t),e.digits?.[1]??2);return r?`${r} ${o}`:o}case"date":{let r=wn(String(t));return r?new Intl.DateTimeFormat(i==="en"?"en-GB":i,{day:"numeric",month:"short",year:"numeric",numberingSystem:"latn"}).format(r):String(t)}case"datetime":{let r=wn(String(t));return r?new Intl.DateTimeFormat(i==="en"?"en-GB":i,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit",numberingSystem:"latn"}).format(r):String(t)}case"html":return String(t).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();case"binary":case"image":return t.name??"";case"boolean":return t?"\u2713":"";default:return String(t)}}function kn(e,t){return t==="section"?{...e,type:"char"}:{...e,type:"text"}}function Sn(e,t,n){let i=()=>(e.getState().values[t]??[]).find(a=>a.key===n)?.values??{};return{...e,getState:()=>({...e.getState(),values:i()}),setValue:(a,r)=>e.updateLine(t,n,a,r),search:(a,r,o)=>e.searchLine(t,n,a,r,o),canCreate:a=>e.canCreateLine(t,a),quickCreate:(a,r)=>e.quickCreateLine(t,a,r)}}var zt=({form:e,name:t,field:n,node:i,id:a,document:r,labels:o=ge.en,locale:d,dialogs:s})=>{let l=n,u=l.lineKinds,h=(i.columns??Object.keys(l.fields)).filter(_=>l.fields[_]&&_!==u?.field&&_!==l.sequenceField&&i.optionalColumns?.[_]!=="hide"),x=r.createElement("div");x.className="fd-lines",x.id=a,x.setAttribute("role","group");let g=r.createElement("div");g.className="fd-lines-scroll";let m=r.createElement("table");m.className="fd-lines-table";let c=r.createElement("thead"),v=r.createElement("tr");for(let _ of h){let K=r.createElement("th");K.scope="col",K.textContent=l.fields[_].label,v.append(K)}let b=r.createElement("th");b.className="fd-lines-tools",v.append(b),c.append(v);let f=r.createElement("tbody");m.append(c,f);let L=(i.totals??[]).filter(_=>h.includes(_)),w=new Map;if(L.length){let _=r.createElement("tfoot"),K=r.createElement("tr");K.className="fd-lines-totals",h.forEach((Q,ee)=>{let $=r.createElement("td");L.includes(Q)?w.set(Q,$):ee===0&&($.textContent=o.total),K.append($)}),K.append(r.createElement("td")),_.append(K),m.append(_)}g.append(m);let N=r.createElement("div");N.className="fd-lines-adds";let O=(_,K,Q)=>{let ee=r.createElement("button");ee.type="button",ee.className="fd-button fd-button-link fd-lines-add",ee.dataset.add=Q,ee.textContent=`+ ${_}`,ee.addEventListener("click",()=>{z=e.addLine(t,K);let $=T.get(z);$&&($.cells[0]?.widget.focus(),z=null)}),N.append(ee)};O(o.addLine,{},"line"),u&&(O(o.addSection,{[u.field]:u.section??"section"},"section"),O(o.addNote,{[u.field]:u.note??"note"},"note")),x.append(g,N);let T=new Map,z=null,B=!1;function J(_,K,Q,ee,$=1){let V=`${a}-${K.key}-${Q}`,W={type:"field",id:`${i.id}.${K.key}.${Q}`,field:Q},F=Ee({form:Sn(e,t,K.key),name:Q,field:ee,node:W,id:V,document:r,labels:o,locale:d,dialogs:s}),D=r.createElement("td");D.colSpan=$;let H=r.createElement("label");H.className="fd-sr-only",H.htmlFor=V,H.textContent=ee.label;let ne=r.createElement("div");return ne.className="fd-cell-error",ne.hidden=!0,D.append(H,F.element,ne),_.append(D),{name:Q,def:ee,widget:F,error:ne}}function de(_){let K=r.createElement("tr");K.dataset.line=_.key;let Q=Me(l,_.values);Q&&(K.className=`fd-line-${Q}`);let ee=Q&&u?[J(K,_,u.text,kn(l.fields[u.text],Q),h.length)]:h.map(W=>J(K,_,W,l.fields[W])),$=r.createElement("td");$.className="fd-lines-tools";let V=r.createElement("button");return V.type="button",V.className="fd-line-delete",V.textContent="\xD7",V.setAttribute("aria-label",o.deleteLine),V.addEventListener("click",()=>e.removeLine(t,_.key)),$.append(V),K.append($),{element:K,kind:Q,cells:ee,remove:V}}return{element:x,focus:()=>(f.querySelector("input, select, textarea")??N.querySelector("button"))?.focus(),update(_){B=_.readonly,N.hidden=B;let K=_.value??[],Q=e.getState().errors,ee=new Set(K.map($=>$.key));for(let[$,V]of T)ee.has($)||(V.element.remove(),T.delete($));K.forEach(($,V)=>{let W=T.get($.key);W&&W.kind!==Me(l,$.values)&&(W.element.remove(),W=void 0),W||(W=de($),T.set($.key,W)),f.children[V]!==W.element&&f.insertBefore(W.element,f.children[V]??null),W.remove.hidden=B,B?W.remove.remove():W.remove.isConnected||W.element.lastElementChild?.append(W.remove);for(let F of W.cells){let D=Q[`${t}.${$.key}.${F.name}`];F.error.hidden=!D,F.error.textContent=D??"",F.widget.update({value:$.values[F.name],values:$.values,readonly:B||F.def.readonly===!0,required:F.def.required===!0,invalid:!!D})}});for(let[$,V]of w){let W=K.filter(F=>!Me(l,F.values)).reduce((F,D)=>F+Number(D.values[$]??0),0);V.textContent=et(l.fields[$],W,K[0]?.values??{},d)}z&&T.has(z)&&(T.get(z)?.cells[0]?.widget.focus(),z=null)}}};function Vr(e){return new Promise((t,n)=>{let i=new FileReader;i.onload=()=>{let a=String(i.result??"");t({name:e.name,type:e.type,size:e.size,data:a.slice(a.indexOf(",")+1)})},i.onerror=()=>n(i.error),i.readAsDataURL(e)})}function Ln(e){return({form:t,name:n,field:i,id:a,document:r,labels:o=ge.en})=>{let d=r.createElement("div");d.className=`fd-file fd-file-${e}`;let s=r.createElement("input");s.type="file",s.id=a,s.className="fd-sr-only";let l=i.type==="binary"?i.accept:e==="image"?["image/*"]:void 0;l&&(s.accept=l.join(","));let u=r.createElement("img");u.className="fd-image-preview",u.alt=i.label,u.hidden=!0;let h=r.createElement("label");h.className=e==="image"?"fd-file-pick fd-image-pick":"fd-file-pick",h.htmlFor=a;let x=r.createElement("span");x.className="fd-button",x.textContent=e==="image"?o.uploadImage:o.upload;let g=r.createElement("span");g.className="fd-help",g.textContent=o.dropHere,h.append(x,g);let m=r.createElement("div");m.className="fd-file-chosen";let c=r.createElement("span");c.className="fd-file-name";let v=r.createElement("button");v.type="button",v.className="fd-button fd-button-link",v.textContent=o.replace,v.addEventListener("click",()=>s.click());let b=r.createElement("button");b.type="button",b.className="fd-button fd-button-link",b.textContent=o.removeFile,b.addEventListener("click",()=>t.setValue(n,null)),m.append(c,v,b),d.append(s,...e==="image"?[u]:[],h,m);let f=!1,L=async w=>{!w||f||t.setValue(n,await Vr(w))};return s.addEventListener("change",()=>{L(s.files?.[0]),s.value=""}),d.addEventListener("dragover",w=>{f||(w.preventDefault(),d.classList.add("fd-dragging"))}),d.addEventListener("dragleave",()=>d.classList.remove("fd-dragging")),d.addEventListener("drop",w=>{w.preventDefault(),d.classList.remove("fd-dragging"),L(w.dataTransfer?.files?.[0])}),{element:d,focus:()=>(h.hidden?v:s).focus(),update(w){f=w.readonly;let N=w.value;if(h.hidden=!!N||f,m.hidden=!N,v.hidden=b.hidden=f,s.disabled=f,s.setAttribute("aria-invalid",String(w.invalid)),w.describedBy&&s.setAttribute("aria-describedby",w.describedBy),c.textContent=N?`${N.name} \xB7 ${Xe(N.size)}`:"",e==="image"){let O=N?N.data?`data:${N.type};base64,${N.data}`:N.url??"":"";u.hidden=!O,u.getAttribute("src")!==O&&(O?u.src=O:u.removeAttribute("src"))}}}}}var Wt=Ln("binary"),Bt=Ln("image");var En=new Map;function Rn(e,t){let n=En.get(t);return n||(n=new Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:0,numberingSystem:"latn"}),En.set(t,n)),n.format(e/100)}var tt=e=>{let{node:t,id:n,document:i,locale:a="en"}=e,r=t.options??{},o=typeof r.min=="number"?r.min:0,d=typeof r.max=="number"?r.max:100,s=typeof r.maxField=="string"?r.maxField:null,l=typeof r.color=="string"?r.color:"auto",u=r.showPercent!==!1,h=i.createElement("div");h.className="fd-progressbar",h.setAttribute("role","progressbar");let x=i.createElement("div");x.className="fd-progressbar-fill";let g=i.createElement("span");g.className="fd-progressbar-text",h.append(x,g);let m=null,c=h;return r.editable===!0?(m=Ee({...e,node:{...t,widget:void 0}}),h.setAttribute("aria-hidden","true"),c=i.createElement("div"),c.className="fd-progressbar-edit",c.append(h,m.element)):h.id=n,{element:c,focus:()=>m?.focus(),update(v){let b=typeof v.value=="number"?v.value:0,f=s?Number(v.values[s]??0):d,L=f>o?Math.min(100,Math.max(0,(b-o)/(f-o)*100)):0,w=Math.round(L*10)/10;x.style.width=`${w}%`,h.setAttribute("aria-valuenow",String(b)),h.setAttribute("aria-valuemin",String(o)),h.setAttribute("aria-valuemax",String(f)),h.setAttribute("aria-valuetext",Rn(L,a)),g.textContent=u?Rn(L,a):"",h.dataset.tone=l!=="auto"?l:L<30?"danger":L<70?"warning":"success",m?.update(v)}}};function Fn(e){return e==null?"":typeof e=="object"&&"label"in e?e.label:String(e)}var nt=({field:e,node:t,id:n,document:i,locale:a="en"})=>{let r=t.options??{},o=u=>typeof r[u]=="string"?r[u]:"",d=u=>typeof r[u]=="string"?r[u]:null,s=e.type==="integer"?0:e.type==="float"||e.type==="monetary"?e.digits?.[1]??2:null,l=i.createElement("output");return l.id=n,l.className="fd-value-text",{element:l,focus:()=>{},update({value:u,values:h}){if(u==null||u===""){l.textContent="";return}let x=s!==null&&typeof u=="number"?Pe(u,s,a):wt(u,e),g=d("prefixField"),m=d("suffixField"),c=g?Fn(h[g]):o("prefix"),v=m?Fn(h[m]):o("suffix");l.textContent=[c,x,v].filter(b=>b!=="").join(" ")}}};var kt=({form:e,name:t,field:n,node:i,id:a,document:r})=>{let o=i.options??{},d=o.clickable===!0,s=Array.isArray(o.visibleStates)?o.visibleStates:null,l=r.createElement("ol");l.className="fd-statusbar",l.id=a,l.setAttribute("aria-label",n.label);let u=c=>c&&typeof c=="object"&&"id"in c?`id:${String(c.id)}`:`v:${String(c)}`,h=n.type==="selection"?n.options.map(c=>({key:u(c.value),label:c.label,value:c.value})):[],x=n.type==="selection",g={value:void 0,readonly:!1};function m(){let{value:c,readonly:v}=g,b=c==null?null:u(c),f=h.filter(L=>!s||s.some(w=>u(w)===L.key)||L.key===b);b&&!f.some(L=>L.key===b)&&c&&typeof c=="object"&&(f=[...f,{key:b,label:c.label,value:c}]),l.replaceChildren(...f.map(L=>{let w=r.createElement("span");w.textContent=L.label;let N=r.createElement(d?"button":"span");N instanceof HTMLButtonElement&&(N.type="button",N.disabled=v,N.addEventListener("click",()=>e.setValue(t,L.value))),N.append(w),L.key===b&&N.setAttribute("aria-current","step");let O=r.createElement("li");return O.append(N),O}))}return{element:l,focus:()=>l.querySelector("button:not([disabled])")?.focus(),update(c){g={value:c.value,readonly:c.readonly},m(),x||(x=!0,e.search(t,"",20).then(v=>{h=v.map(b=>({key:u(b),label:b.label,value:b})),m()}).catch(()=>{}))}}};function An(e){let t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()));t.setUTCDate(t.getUTCDate()+4-(t.getUTCDay()||7));let n=Date.UTC(t.getUTCFullYear(),0,1);return Math.ceil(((t.getTime()-n)/864e5+1)/7)}var Nn=e=>String(e).padStart(2,"0"),jt=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),Re=(e,t)=>new Date(e.getFullYear(),e.getMonth(),e.getDate()+t);function St(e,t){let n=new Date(e.getFullYear(),e.getMonth()+t+1,0).getDate();return new Date(e.getFullYear(),e.getMonth()+t,Math.min(e.getDate(),n))}function Ht(e,t){if(typeof t!="string"||!t)return null;if(e==="date"){let i=/^(\d{4})-(\d{2})-(\d{2})/.exec(t);return i?new Date(Number(i[1]),Number(i[2])-1,Number(i[3])):null}let n=new Date(t);return Number.isNaN(n.getTime())?null:n}function Lt(e,t,n){let{form:i,name:a,id:r,document:o,locale:d="en"}=t,s=t.labels??ge.en,l=d==="en"?"en-GB":d,u=new Intl.DateTimeFormat(l,{month:"long",year:"numeric",numberingSystem:"latn"}),h=new Intl.DateTimeFormat(l,{weekday:"long",day:"numeric",month:"long",year:"numeric",numberingSystem:"latn"}),x=new Intl.DateTimeFormat(l,{weekday:"short"}),g=new Intl.DateTimeFormat(l,{weekday:"long"}),m=o.createElement("button");m.type="button",m.className="fd-calendar-button";let c="http://www.w3.org/2000/svg",v=o.createElementNS(c,"svg");v.setAttribute("viewBox","0 0 16 16"),v.setAttribute("aria-hidden","true");for(let[V,W]of[["rect",{x:"2",y:"3",width:"12",height:"11",rx:"1.5"}],["path",{d:"M2 6.5h12M5 1.5v3M11 1.5v3"}]]){let F=o.createElementNS(c,V);for(let[D,H]of Object.entries(W))F.setAttribute(D,H);v.append(F)}m.append(v),m.setAttribute("aria-label",s.chooseDate),m.setAttribute("aria-haspopup","dialog"),m.setAttribute("aria-expanded","false"),m.setAttribute("aria-controls",`${r}-calendar`);let b=o.createElement("div");b.className="fd-calendar",b.id=`${r}-calendar`,b.setAttribute("role","dialog"),b.hidden=!0;let f=o.createElement("div");f.className="fd-calendar-head";let L=o.createElement("button");L.type="button",L.textContent="\u2039",L.setAttribute("aria-label",s.previousMonth);let w=o.createElement("span");w.className="fd-calendar-title",w.setAttribute("aria-live","polite");let N=o.createElement("button");N.type="button",N.textContent="\u203A",N.setAttribute("aria-label",s.nextMonth),f.append(L,w,N);let O=o.createElement("table");O.className="fd-calendar-grid",O.setAttribute("role","grid"),b.append(f,O);let T=o.createElement("span");T.className="fd-date-pick",T.append(e.element,m,b);let z=new Date,B=!1;function J(V){if(n==="date")i.setValue(a,`${V.getFullYear()}-${Nn(V.getMonth()+1)}-${Nn(V.getDate())}`);else{let W=Ht("datetime",i.getState().values[a]),F=new Date(V.getFullYear(),V.getMonth(),V.getDate(),W?.getHours()??0,W?.getMinutes()??0);i.setValue(a,F.toISOString())}ee()}function de(V){let W=Ht(n,i.getState().values[a]),F=new Date,D=u.format(z);w.textContent=D,b.setAttribute("aria-label",D);let H=new Date(z.getFullYear(),z.getMonth(),1),ne=Re(H,-((H.getDay()+6)%7)),re=o.createElement("tr"),me=o.createElement("th");me.scope="col",me.textContent=s.weekShort,me.setAttribute("abbr",s.week),re.append(me);for(let ce=0;ce<7;ce++){let y=Re(ne,ce),S=o.createElement("th");S.scope="col",S.textContent=x.format(y).replace(/\.$/,""),S.setAttribute("abbr",g.format(y)),re.append(S)}let ue=o.createElement("thead");ue.append(re);let pe=o.createElement("tbody");for(let ce=ne;ce<=new Date(z.getFullYear(),z.getMonth()+1,0);ce=Re(ce,7)){let y=o.createElement("tr"),S=o.createElement("th");S.scope="row",S.className="fd-week",S.textContent=String(An(ce)),y.append(S);for(let A=0;A<7;A++){let R=Re(ce,A),k=o.createElement("td"),E=o.createElement("button");E.type="button",E.textContent=String(R.getDate()),E.setAttribute("aria-label",h.format(R)),E.tabIndex=jt(R,z)?0:-1,R.getMonth()!==z.getMonth()&&E.classList.add("fd-outside"),W&&jt(R,W)&&E.setAttribute("aria-selected","true"),jt(R,F)&&E.setAttribute("aria-current","date"),E.disabled=B,E.addEventListener("click",()=>J(R)),E.addEventListener("keydown",I=>K(I,R)),k.append(E),y.append(k)}pe.append(y)}O.replaceChildren(ue,pe),V&&O.querySelector('button[tabindex="0"]')?.focus()}function _(V){z=V,de(!0)}function K(V,W){let F={ArrowLeft:()=>Re(W,-1),ArrowRight:()=>Re(W,1),ArrowUp:()=>Re(W,-7),ArrowDown:()=>Re(W,7),PageUp:()=>St(W,-1),PageDown:()=>St(W,1),Home:()=>Re(W,-((W.getDay()+6)%7)),End:()=>Re(W,6-(W.getDay()+6)%7)};F[V.key]?(V.preventDefault(),_(F[V.key]())):(V.key==="Enter"||V.key===" ")&&(V.preventDefault(),J(W))}function Q(){z=Ht(n,i.getState().values[a])??new Date,b.hidden=!1,m.setAttribute("aria-expanded","true"),de(!0)}function ee(){b.hidden||(b.hidden=!0,m.setAttribute("aria-expanded","false"),m.focus())}m.addEventListener("click",()=>b.hidden?Q():ee()),L.addEventListener("click",()=>{z=St(z,-1),de(!1)}),N.addEventListener("click",()=>{z=St(z,1),de(!1)}),b.addEventListener("keydown",V=>{V.key==="Escape"&&(V.preventDefault(),V.stopPropagation(),ee())});let $=V=>{!b.hidden&&!T.contains(V.target)&&(b.hidden=!0,m.setAttribute("aria-expanded","false"))};return o.addEventListener("mousedown",$),{element:T,focus:()=>e.focus(),update(V){B=V.readonly,m.hidden=V.readonly,V.readonly&&(b.hidden=!0),e.update(V)},destroy(){o.removeEventListener("mousedown",$),e.destroy?.()}}}var Ir=e=>{let t=e.replace(/_/g," ").trim();return t.charAt(0).toUpperCase()+t.slice(1)};function Or(e,t){let n=Ir(e);return typeof t=="boolean"?{name:e,label:n,type:"boolean"}:typeof t=="number"?{name:e,label:n,type:Number.isInteger(t)?"integer":"float"}:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?{name:e,label:n,type:"date"}:{name:e,label:n,type:"char"}}var qt=e=>{let{form:t,name:n,field:i,node:a,id:r,document:o}=e,d=i.type==="properties"?i.definitions:void 0,s=()=>{let m=t.getState().values[n];return m&&typeof m=="object"&&!Array.isArray(m)?m:{}},l={...t,getState:()=>({...t.getState(),values:s()}),setValue:(m,c)=>t.setValue(n,{...s(),[m]:c})},u=o.createElement("div");u.className="fd-properties",u.setAttribute("role","group");let h=[],x="";function g(m){for(let c of h)c.widget.destroy?.();h=m.map(c=>{let v=`${r}-${c.name}`,b={type:c.type,label:c.label,...c.options?{options:c.options}:{}},f={type:"field",id:`${a.id}.${c.name}`,field:c.name},L=Ee({...e,form:l,name:c.name,field:b,node:f,id:v});return{definition:c,widget:L}}),u.replaceChildren(...h.map(({definition:c,widget:v})=>{let b=o.createElement("div");b.className="fd-property",b.dataset.type=c.type;let f=o.createElement("label");return f.htmlFor=`${r}-${c.name}`,f.textContent=c.label,b.append(f,v.element),b}))}return{element:u,focus:()=>h[0]?.widget.focus(),destroy:()=>h.forEach(m=>m.widget.destroy?.()),update(m){let c=s(),v=d??Object.keys(c).map(f=>Or(f,c[f])),b=JSON.stringify(v);b!==x&&(x=b,g(v));for(let{definition:f,widget:L}of h)L.update({value:c[f.name]??null,values:c,readonly:m.readonly,required:!1,invalid:!1})}}};var Dr=new Set(["P","BR","B","STRONG","I","EM","U","S","UL","OL","LI","A","H1","H2","H3","H4","BLOCKQUOTE","CODE","PRE","SPAN","DIV"]),Pr=new Set(["SCRIPT","STYLE","IFRAME","OBJECT","EMBED","TEMPLATE","NOSCRIPT","SVG","MATH"]),zr=new Set(["P","DIV","H1","H2","H3","H4","LI","BLOCKQUOTE","PRE"]),Wr=new Set(["left","center","right","justify","start","end"]);function Jt(e,t=globalThis.document){let n=t.createElement("template");n.innerHTML=e;let i=r=>{for(let o of[...r.childNodes]){if(o.nodeType===Node.TEXT_NODE)continue;if(o.nodeType!==Node.ELEMENT_NODE){o.remove();continue}let d=o;if(Pr.has(d.tagName)){d.remove();continue}if(i(d),!Dr.has(d.tagName)){d.replaceWith(...d.childNodes);continue}let s=d.tagName==="A"?d.getAttribute("href"):null,l=zr.has(d.tagName)?d.style?.textAlign?.trim().toLowerCase():"";for(let u of[...d.attributes])d.removeAttribute(u.name);s&&/^(https?:|mailto:)/i.test(s.trim())&&d.setAttribute("href",s.trim()),l&&Wr.has(l)&&d.setAttribute("style",`text-align: ${l};`)}};i(n.content);let a=t.createElement("div");return a.append(n.content),a.innerHTML}function Tn(e){let t=e.trim();return/^(https?:\/\/|mailto:)\S+$/i.test(t)?t:/^[^\s@:/]+@[^\s@:/]+\.[^\s@:/]+$/.test(t)?`mailto:${t}`:/^[\w-]+(\.[\w-]+)+([/?#]\S*)?$/.test(t)?`https://${t}`:null}var Mn=[["bold","bold","<b>B</b>"],["italic","italic","<i>I</i>"],["underline","underline","<u>U</u>"],["bulletList","insertUnorderedList",'<svg viewBox="0 0 16 16"><circle cx="3" cy="4" r="1.2"/><circle cx="3" cy="8" r="1.2"/><circle cx="3" cy="12" r="1.2"/><path d="M6 4h8M6 8h8M6 12h8"/></svg>'],["numberList","insertOrderedList",'<svg viewBox="0 0 16 16"><path d="M2.5 3h1v3M2 10.5c.5-.8 2-.8 2 .2 0 .8-2 1.3-2 2.3h2M6 4h8M6 8h8M6 12h8"/></svg>'],["alignLeft","justifyLeft",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M2 6.5h8M2 9.5h12M2 12.5h8"/></svg>'],["alignCenter","justifyCenter",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M4 6.5h8M2 9.5h12M4 12.5h8"/></svg>'],["alignRight","justifyRight",'<svg viewBox="0 0 16 16"><path d="M2 3.5h12M6 6.5h8M2 9.5h12M6 12.5h8"/></svg>'],["link","createLink",'<svg viewBox="0 0 16 16"><path d="M7 9a3 3 0 0 0 4.2 0l2.3-2.3a3 3 0 0 0-4.2-4.2L8.2 3.6M9 7a3 3 0 0 0-4.2 0L2.5 9.3a3 3 0 0 0 4.2 4.2l1.1-1.1"/></svg>']],Ut=({form:e,name:t,node:n,id:i,document:a,labels:r=ge.en})=>{let o=a.createElement("div");o.id=i,o.className="fd-input fd-richtext",o.setAttribute("role","textbox"),o.setAttribute("aria-multiline","true"),o.setAttribute("contenteditable","true");let d=n.options?.toolbar!==!1,s="";o.addEventListener("input",()=>{let h=Jt(o.innerHTML,a);s=h,e.setValue(t,h.trim()===""?null:h)}),o.addEventListener("blur",()=>{o.innerHTML!==s&&(o.innerHTML=s)});let l=d?Br(o,a,r):null,u=o;return l&&(u=a.createElement("div"),u.className="fd-richtext-box",u.setAttribute("role","group"),o.setAttribute("aria-labelledby",`${i}-label`),u.append(l.bar,l.linkRow,o)),{element:u,focus:()=>o.focus(),destroy:()=>l?.destroy(),update(h){l&&(l.bar.hidden=h.readonly,h.readonly&&(l.linkRow.hidden=!0));let x=Jt(typeof h.value=="string"?h.value:"",a);(x!==s||a.activeElement!==o)&&(o.innerHTML!==x&&(o.innerHTML=x),s=x),o.setAttribute("contenteditable",String(!h.readonly)),o.setAttribute("aria-readonly",String(h.readonly)),o.setAttribute("aria-invalid",String(h.invalid)),h.describedBy&&o.setAttribute("aria-describedby",h.describedBy)}}};function Br(e,t,n){let i=t.createElement("div");i.className="fd-richtext-bar",i.setAttribute("role","toolbar"),i.setAttribute("aria-label",n.formatting);let a=null,r=()=>{e.focus();let c=t.getSelection();a&&c&&(c.removeAllRanges(),c.addRange(a))},o=(c,v)=>{r(),t.execCommand?.(c,!1,v)},d=t.createElement("select");d.className="fd-richtext-style",d.setAttribute("aria-label",n.textStyle);for(let[c,v]of[["p","paragraph"],["h2","heading"],["h3","subheading"]]){let b=t.createElement("option");b.value=c,b.textContent=n[v],d.append(b)}d.addEventListener("change",()=>o("formatBlock",`<${d.value}>`));let s=t.createElement("div");s.className="fd-link-row",s.hidden=!0;let l=t.createElement("input");l.className="fd-input",l.type="url",l.placeholder="https://",l.setAttribute("aria-label",n.linkAddress);let u=t.createElement("button");u.type="button",u.className="fd-button fd-link-apply",u.textContent=n.applyLink;let h=t.createElement("button");h.type="button",h.className="fd-button fd-button-link fd-link-remove",h.textContent=n.removeLink,s.append(l,u,h),u.addEventListener("click",()=>{let c=Tn(l.value);if(!c){l.setAttribute("aria-invalid","true");return}l.setAttribute("aria-invalid","false"),r(),t.execCommand?.("createLink",!1,c),s.hidden=!0}),h.addEventListener("click",()=>{r(),t.execCommand?.("unlink",!1),s.hidden=!0}),l.addEventListener("keydown",c=>{c.key==="Enter"?(c.preventDefault(),u.click()):c.key==="Escape"&&(c.preventDefault(),s.hidden=!0,r())});let x=Mn.map(([c,v,b])=>{let f=t.createElement("button");return f.type="button",f.className="fd-richtext-tool",f.setAttribute("aria-label",n[c]),f.title=n[c],f.innerHTML=b,f.querySelector("svg")?.setAttribute("aria-hidden","true"),["bold","italic","underline"].includes(v)&&f.setAttribute("aria-pressed","false"),f.addEventListener("mousedown",L=>L.preventDefault()),f.addEventListener("click",()=>{if(v!=="createLink")return o(v);s.hidden=!1,l.value="",l.focus()}),f});i.append(d,...x);let g=[d,...x];g.forEach((c,v)=>c.tabIndex=v===0?0:-1),i.addEventListener("keydown",c=>{if(c.key!=="ArrowRight"&&c.key!=="ArrowLeft")return;let v=g.indexOf(t.activeElement);if(v<0)return;let b=getComputedStyle(i).direction==="rtl",f=c.key==="ArrowRight"!==b?1:-1,L=g[(v+f+g.length)%g.length];c.preventDefault(),g.forEach(w=>w.tabIndex=w===L?0:-1),L.focus()});let m=()=>{let c=t.getSelection();if(!c||!c.rangeCount||!e.contains(c.anchorNode))return;a=c.getRangeAt(0).cloneRange();for(let b of x){let f=Mn[x.indexOf(b)][1];b.hasAttribute("aria-pressed")&&b.setAttribute("aria-pressed",String(t.queryCommandState?.(f)??!1))}let v=String(t.queryCommandValue?.("formatBlock")??"").toLowerCase().replace(/[<>]/g,"");d.value=v==="h2"||v==="h3"?v:"p"};return t.addEventListener("selectionchange",m),{bar:i,linkRow:s,destroy:()=>t.removeEventListener("selectionchange",m)}}var _t=({form:e,name:t,id:n,document:i,labels:a=ge.en})=>{let r=i.createElement("div");r.className="fd-json";let o=i.createElement("textarea");o.id=n,o.className="fd-input fd-textarea fd-code",o.spellcheck=!1;let d=i.createElement("div");return d.className="fd-cell-error",d.hidden=!0,r.append(o,d),o.addEventListener("input",()=>{if(o.value.trim()===""){d.hidden=!0,e.setValue(t,null);return}try{let s=JSON.parse(o.value);d.hidden=!0,e.setValue(t,s)}catch{d.hidden=!1,d.textContent=a.invalidJson}}),{element:r,focus:()=>o.focus(),update(s){if(i.activeElement!==o){let l=s.value===null||s.value===void 0?"":JSON.stringify(s.value,null,2);o.value!==l&&(o.value=l)}o.readOnly=s.readonly,o.setAttribute("aria-invalid",String(s.invalid||!d.hidden))}}};function Ee(e,t={}){let{field:n,node:i}=e,a=[i.widget?`${n.type}.${i.widget}`:null,n.type==="selection"&&n.multiple?"selection.checkboxes":null,n.type].filter(r=>r!==null);for(let r of a){let o=t[r]??On[r];if(o)return o(e)}return Gr(e)}function be(e,t,n={},...i){let a=e.createElement(t);for(let[r,o]of Object.entries(n))o!==void 0&&a.setAttribute(r,o);return a.append(...i),a}function Ne(e,t){e.setAttribute("aria-invalid",String(t.invalid)),e.setAttribute("aria-required",String(t.required)),t.describedBy?e.setAttribute("aria-describedby",t.describedBy):e.removeAttribute("aria-describedby")}var Rt=e=>e==null?"":String(e);function rt(e){return({form:t,name:n,field:i,node:a,id:r,document:o})=>{let d=be(o,"input",{id:r,type:e,class:"fd-input",autocomplete:"off"});return i.type==="char"&&i.size!==void 0&&(d.maxLength=i.size),a.placeholder&&(d.placeholder=a.placeholder),d.addEventListener("input",()=>t.setValue(n,d.value===""?null:d.value)),{element:d,focus:()=>d.focus(),update(s){let l=Rt(s.value);d.value!==l&&(d.value=l),d.readOnly=s.readonly,Ne(d,s)}}}}var jr=({form:e,name:t,field:n,node:i,id:a,document:r})=>{let o=be(r,"textarea",{id:a,class:"fd-input fd-textarea",rows:"3"});return n.type==="text"&&n.size!==void 0&&(o.maxLength=n.size),i.placeholder&&(o.placeholder=i.placeholder),o.addEventListener("input",()=>e.setValue(t,o.value===""?null:o.value)),{element:o,focus:()=>o.focus(),update(d){let s=Rt(d.value);o.value!==s&&(o.value=s),o.readOnly=d.readonly,Ne(o,d)}}},Hr=/^-?(\d+\.?\d*|\.\d+)$/,qr=/^-?\.?$/,Gt=e=>{let{form:t,name:n,field:i,node:a,id:r,document:o,locale:d="en"}=e,s=i.type==="integer",l=s?0:(i.type==="float"||i.type==="monetary"?i.digits?.[1]:void 0)??2,u=N=>typeof N=="number"?Pe(N,l,d):Rt(N),h=be(o,"input",{id:r,type:"text",class:"fd-input fd-number-input",autocomplete:"off"});h.inputMode=s?"numeric":"decimal",a.placeholder&&(h.placeholder=a.placeholder);let x=N=>{let O=Vt(N.trim(),d);if(O==="")return null;if(Hr.test(O))return Number(O);if(!qr.test(O))return O};h.addEventListener("input",()=>{let N=x(h.value);N!==void 0&&t.setValue(n,N)}),h.addEventListener("blur",()=>{h.value=u(t.getState().values[n])});let g=a.options??{},m=i.type==="monetary"?i.currencyField:void 0,c=m?t.page.fields[m]:void 0,v=m&&c&&g.pickCurrency===!0?Ee({...e,name:m,field:c,node:{type:"field",id:`${a.id}.currency`,field:m},id:`${r}-currency`}):null;v&&c&&v.element.querySelector("input, select")?.setAttribute("aria-label",c.label),v?.element.matches("input, select")&&c&&v.element.setAttribute("aria-label",c.label);let b=i.type==="monetary"&&!v?be(o,"span",{class:"fd-currency","aria-hidden":"true"}):null,f=v?.element??b,L=g.symbol==="after";return{element:f?be(o,"span",{class:`fd-number${L?" fd-currency-after":""}${v?" fd-currency-picked":""}`},...L?[h,f]:[f,h]):h,focus:()=>h.focus(),update(N){let O=o.activeElement===h,T=x(h.value),z=T===void 0||T===N.value;if(!(O&&z)){let B=u(N.value);h.value!==B&&(h.value=B)}if(h.readOnly=N.readonly,Ne(h,N),v&&m&&v.update({value:N.values[m],values:N.values,readonly:N.readonly,required:!1,invalid:!1}),b&&i.type==="monetary"){let B=i.currencyField?N.values[i.currencyField]:null;b.textContent=B&&typeof B=="object"&&"label"in B?B.label:typeof B=="string"?B:i.currency??""}}}};function Cn(e){return({form:t,name:n,id:i,document:a})=>{let r=be(a,"input",{id:i,type:"checkbox",class:e?"fd-switch":"fd-checkbox",role:e});return r.addEventListener("change",()=>t.setValue(n,r.checked)),{element:r,focus:()=>r.focus(),update(o){r.checked=o.value===!0,r.disabled=o.readonly,Ne(r,o)}}}}function In(e){return e.type==="selection"?e.options:[]}var Jr=({form:e,name:t,field:n,id:i,document:a})=>{let r=In(n),o=be(a,"select",{id:i,class:"fd-input fd-select"},be(a,"option",{value:""}));return r.forEach((d,s)=>o.append(be(a,"option",{value:String(s)},d.label))),o.addEventListener("change",()=>e.setValue(t,o.value===""?null:r[Number(o.value)].value)),{element:o,focus:()=>o.focus(),update(d){let s=r.findIndex(l=>l.value===d.value);o.value=s===-1?"":String(s),o.disabled=d.readonly,Ne(o,d)}}};function $n(e){return({form:t,name:n,field:i,id:a,document:r})=>{let o=In(i),d=be(r,"div",{id:a,class:`fd-choices fd-choices-${e}`,role:e==="radio"?"radiogroup":"group"}),s=o.map((l,u)=>{let h=be(r,"input",{type:e,name:a,value:String(u),id:`${a}-${u}`});return d.append(be(r,"label",{class:"fd-choice",for:`${a}-${u}`},h,be(r,"span",{},l.label))),h});return d.addEventListener("change",()=>{if(e==="radio"){let l=s.findIndex(u=>u.checked);t.setValue(n,l===-1?null:o[l].value)}else t.setValue(n,o.filter((l,u)=>s[u].checked).map(l=>l.value))}),{element:d,focus:()=>(s.find(l=>l.checked)??s[0])?.focus(),update(l){let u=Array.isArray(l.value)?l.value:[l.value];s.forEach((h,x)=>{h.checked=u.includes(o[x].value),h.disabled=l.readonly}),Ne(d,l)}}}}function Vn(e){return({form:t,name:n,field:i,id:a,document:r})=>{let o="min"in i&&i.min!==void 0?i.min:e==="rating"?1:0,d="max"in i&&i.max!==void 0?i.max:e==="rating"?5:10,s=be(r,"div",{id:a,class:`fd-points fd-${e}`,role:"radiogroup"}),l=[];for(let u=o;u<=d;u++){let h=be(r,"button",{type:"button",role:"radio","aria-label":`${u} of ${d}`,"data-value":String(u)},e==="rating"?"\u2605":String(u));e==="scale"&&h.removeAttribute("aria-label"),h.addEventListener("click",()=>t.setValue(n,u)),l.push(h),s.append(h)}return s.addEventListener("keydown",u=>{let h=t.getState().values[n],x=typeof h=="number"?h:o-1,g=u.key==="ArrowRight"||u.key==="ArrowUp"?1:u.key==="ArrowLeft"||u.key==="ArrowDown"?-1:0;if(!g)return;u.preventDefault();let m=Math.min(d,Math.max(o,x+g));t.setValue(n,m),l[m-o]?.focus()}),{element:s,focus:()=>(l.find(u=>u.getAttribute("aria-checked")==="true")??l[0])?.focus(),update(u){let h=typeof u.value=="number"?u.value:null;l.forEach((x,g)=>{let m=o+g;x.setAttribute("aria-checked",String(m===h)),x.classList.toggle("fd-on",e==="rating"?h!==null&&m<=h:m===h),x.tabIndex=m===h||h===null&&g===0?0:-1,x.disabled=u.readonly}),Ne(s,u)}}}}var Ur=e=>{let{form:t,name:n,id:i,document:a,node:r}=e,o=be(a,"input",{id:i,type:"date",class:"fd-input fd-date"});o.addEventListener("input",()=>t.setValue(n,o.value||null));let d={element:o,focus:()=>o.focus(),update(s){let l=Rt(s.value);o.value!==l&&(o.value=l),o.readOnly=s.readonly,Ne(o,s)}};return r.options?.weekNumbers===!0?Lt(d,e,"date"):d},Et=e=>String(e).padStart(2,"0"),_r=e=>{let{form:t,name:n,id:i,document:a,node:r}=e,o=be(a,"input",{id:i,type:"datetime-local",class:"fd-input fd-datetime"}),d=l=>{if(typeof l!="string"||!l)return"";let u=new Date(l);return Number.isNaN(u.getTime())?"":`${u.getFullYear()}-${Et(u.getMonth()+1)}-${Et(u.getDate())}T${Et(u.getHours())}:${Et(u.getMinutes())}`};o.addEventListener("input",()=>{if(!o.value)return t.setValue(n,null);let l=new Date(o.value);Number.isNaN(l.getTime())||t.setValue(n,l.toISOString())});let s={element:o,focus:()=>o.focus(),update(l){let u=d(l.value);o.value!==u&&(o.value=u),o.readOnly=l.readonly,Ne(o,l)}};return r.options?.weekNumbers===!0?Lt(s,e,"datetime"):s};function Gr({field:e,id:t,document:n}){let i=be(n,"span",{id:t,class:"fd-pending","data-fd-pending":e.type});return{element:i,focus:()=>{},update(a){i.textContent=wt(a.value,e)}}}function wt(e,t){if(e==null)return"";switch(t.type){case"many2one":case"reference":return e.label;case"many2many":return e.map(n=>n.label).join(", ");case"one2many":{let n=e.length;return`${n} ${n===1?"line":"lines"}`}case"binary":case"image":return e.name;case"html":return String(e).replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();default:return typeof e=="object"?JSON.stringify(e):String(e)}}var On={char:rt("text"),"char.email":rt("email"),"char.phone":rt("tel"),"char.url":rt("url"),"char.password":rt("password"),"char.tags":Ot,text:jr,integer:Gt,float:Gt,monetary:Gt,"integer.rating":Vn("rating"),"integer.scale":Vn("scale"),"integer.progressbar":tt,"integer.label":nt,"float.label":nt,"monetary.label":nt,"float.progressbar":tt,"monetary.progressbar":tt,boolean:Cn(),"boolean.toggle":Cn("switch"),selection:Jr,"selection.radio":$n("radio"),"selection.checkboxes":$n("checkbox"),"selection.statusbar":kt,date:Ur,datetime:_r,many2one:It,"many2one.statusbar":kt,many2many:xt,"many2many.tags":xt,"many2many.checkboxes":Dt,reference:Pt,one2many:zt,binary:Wt,image:Bt,html:Ut,json:_t,properties:qt};var Pn='.fd-form,.fd-theme{--fd-font: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "Noto Sans Arabic", sans-serif;--fd-text: #212529;--fd-muted: #6b7280;--fd-page: #f2f3f5;--fd-surface: #ffffff;--fd-border: #cfd4da;--fd-border-strong: #9aa3ad;--fd-accent: #002855;--fd-accent-text: #ffffff;--fd-accent-soft: #e6ebf2;--fd-focus: #002855;--fd-focus-ring: none;--fd-error: #c62828;--fd-error-soft: #fdecea;--fd-success: #2e7d32;--fd-success-soft: #e8f5e9;--fd-warning: #8a5300;--fd-warning-soft: #fff4e0;--fd-info: #0b5cad;--fd-info-soft: #e7f0fb;--fd-radius: 0px;--fd-control-radius: 0px;--fd-pad-y: 3px;--fd-pad-x: 4px;--fd-input-border: 0 0 1px 0;--fd-label-weight: 600;--fd-gap-x: 32px;--fd-gap-y: 14px;container-type:inline-size;font-family:var(--fd-font);font-size:14px;line-height:1.45;color:var(--fd-text);-webkit-text-size-adjust:100%}.fd-form[data-fd-skin=outlined],.fd-theme[data-fd-skin=outlined]{--fd-text: rgba(0, 0, 0, .88);--fd-muted: rgba(0, 0, 0, .55);--fd-page: #f5f5f5;--fd-border: #d9d9d9;--fd-border-strong: #bfbfbf;--fd-accent: #1677ff;--fd-accent-soft: #e6f4ff;--fd-focus: #1677ff;--fd-focus-ring: 0 0 0 2px rgba(5, 145, 255, .12);--fd-error: #ff4d4f;--fd-error-soft: #fff2f0;--fd-radius: 8px;--fd-control-radius: 6px;--fd-pad-y: 4px;--fd-pad-x: 11px;--fd-input-border: 1px;--fd-label-weight: 400;--fd-gap-x: 24px;--fd-gap-y: 18px}.fd-form *,.fd-form *:before,.fd-form *:after{box-sizing:border-box}.fd-form [hidden]{display:none!important}.fd-page-head{display:grid;gap:4px;margin-block-end:20px}.fd-page-title{font-size:22px;font-weight:650;margin:0;line-height:1.25}.fd-page-description{color:var(--fd-muted);margin:0}.fd-form[data-max-width=narrow]{--fd-page-max: 640px}.fd-form[data-max-width=medium]{--fd-page-max: 900px}.fd-form[data-max-width=wide]{--fd-page-max: 1180px}.fd-form[data-max-width=full]{--fd-page-max: none}.fd-form[data-max-width]>.fd-content:not(:has(>.fd-sheet-page)){max-width:var(--fd-page-max);margin-inline:auto}.fd-actions.fd-actions-top{margin-block-start:0;padding-block-end:14px;margin-block-end:18px;border-block-end:1px solid var(--fd-border)}.fd-icon{width:1.15em;height:1.15em;flex:none;vertical-align:-.2em}.fd-section-title .fd-icon,.fd-tab .fd-icon,.fd-button .fd-icon,.fd-step-title .fd-icon{margin-inline-end:.4em}.fd-section-title .fd-icon{color:var(--fd-muted)}.fd-grid{display:grid;grid-template-columns:repeat(var(--fd-columns, 1),minmax(0,1fr));gap:var(--fd-gap-y) var(--fd-gap-x);align-items:start}.fd-field{display:grid;gap:4px;min-width:0;grid-column:span min(var(--fd-span, 1),var(--fd-columns, 1))}.fd-label{font-weight:var(--fd-label-weight);color:var(--fd-text)}.fd-valid-mark{color:var(--fd-success);width:1em;height:1em;margin-inline-start:6px;vertical-align:-.15em;stroke-width:2.4}.fd-field.fd-required>.fd-label:after{content:" *";color:var(--fd-error)}.fd-form[data-fd-skin=outlined] .fd-field.fd-required>.fd-label:after{content:""}.fd-form[data-fd-skin=outlined] .fd-field.fd-required>.fd-label:before{content:"* ";color:var(--fd-error)}.fd-help{color:var(--fd-muted);font-size:12.5px}.fd-error{color:var(--fd-error);font-size:12.5px}.fd-warning{color:var(--fd-warning);background:var(--fd-warning-soft);font-size:12.5px;padding:3px 8px;border-radius:var(--fd-control-radius);justify-self:start}.fd-form[data-fd-skin=underline] .fd-field{grid-template-columns:var(--fd-label-width, 11em) minmax(0,1fr);column-gap:12px;align-items:baseline}.fd-form[data-fd-skin=underline] .fd-field>.fd-label{grid-column:1}.fd-form[data-fd-skin=underline] .fd-field[data-type=one2many]{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-field[data-type=one2many]>*{grid-column:1!important}.fd-form[data-fd-skin=underline] .fd-field>:not(.fd-label){grid-column:2}@container (max-width: 760px){.fd-form[data-fd-skin=underline] .fd-grid{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-field{grid-column:auto}.fd-form .fd-grid[data-columns-medium]{grid-template-columns:repeat(var(--fd-columns-medium),minmax(0,1fr))}.fd-form .fd-grid[data-columns-medium]>.fd-field{grid-column:span min(var(--fd-span, 1),var(--fd-columns-medium))}.fd-form[data-fd-skin=underline] .fd-grid[data-columns-medium]:not([data-columns-medium="1"]) .fd-field{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-grid[data-columns-medium]:not([data-columns-medium="1"]) .fd-field>*{grid-column:1!important}}@container (max-width: 520px){.fd-grid{grid-template-columns:minmax(0,1fr)}.fd-field{grid-column:auto}.fd-form[data-fd-skin=underline] .fd-field{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-field>*{grid-column:1!important}.fd-form .fd-grid[data-columns-medium],.fd-form .fd-grid[data-columns-narrow]{grid-template-columns:repeat(var(--fd-columns-narrow, 1),minmax(0,1fr))}.fd-form .fd-grid[data-columns-medium]>.fd-field,.fd-form .fd-grid[data-columns-narrow]>.fd-field{grid-column:span min(var(--fd-span, 1),var(--fd-columns-narrow, 1))}}.fd-input{width:100%;min-width:0;font:inherit;color:inherit;background:var(--fd-surface);border:solid var(--fd-border);border-width:var(--fd-input-border);border-radius:var(--fd-control-radius);padding:var(--fd-pad-y) var(--fd-pad-x);min-height:30px;transition:border-color .15s ease,box-shadow .15s ease}.fd-input::placeholder{color:var(--fd-muted);opacity:.8}.fd-input:hover{border-color:var(--fd-border-strong)}.fd-input:focus{outline:none;border-color:var(--fd-focus);box-shadow:var(--fd-focus-ring)}.fd-form[data-fd-skin=underline] .fd-input{background:transparent}.fd-form[data-fd-skin=underline] .fd-input:focus{box-shadow:0 1px 0 0 var(--fd-focus)}.fd-form[data-fd-skin=underline] .fd-field.fd-required .fd-input{border-color:var(--fd-accent)}.fd-input[readonly]{background:transparent;border-color:transparent;padding-inline:0}.fd-form[data-fd-skin=outlined] .fd-input[readonly]{background:#0000000a;border-color:var(--fd-border);padding-inline:var(--fd-pad-x);color:var(--fd-muted)}.fd-form[data-readonly] .fd-input[readonly]{background:transparent;border-color:transparent;padding-inline:0;color:var(--fd-text)}.fd-form[data-readonly] .fd-input::placeholder{color:transparent}.fd-form[data-readonly] select.fd-input:disabled{appearance:none;background:transparent;border-color:transparent;padding-inline:0;color:var(--fd-text);opacity:1}.fd-input[aria-invalid=true]{border-color:var(--fd-error)}.fd-form[data-fd-skin=outlined] .fd-input[aria-invalid=true]:focus{box-shadow:0 0 0 2px #ff26050f}.fd-textarea{resize:vertical;min-height:64px}.fd-select{appearance:auto}.fd-number{display:flex;align-items:baseline;gap:6px}.fd-number-input{font-variant-numeric:tabular-nums}.fd-currency{color:var(--fd-muted);font-size:12.5px;font-weight:600}.fd-currency-after>.fd-number-input{text-align:end}.fd-currency-picked{align-items:center}.fd-currency-picked>:not(.fd-number-input){flex:0 0 104px;min-width:0}.fd-currency-picked>.fd-number-input{flex:1 1 auto;min-width:0}.fd-pending{color:var(--fd-muted);font-style:italic}.fd-pending:empty:before{content:"\u2014"}.fd-checkbox,.fd-choice input{width:16px;height:16px;accent-color:var(--fd-accent);margin:0}.fd-switch{appearance:none;width:34px;height:20px;margin:0;border-radius:999px;position:relative;background:var(--fd-border-strong);cursor:pointer;transition:background .2s ease}.fd-switch:after{content:"";position:absolute;inset-block-start:2px;inset-inline-start:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .2s ease;box-shadow:0 1px 2px #00000040}.fd-switch:checked{background:var(--fd-accent)}.fd-switch:checked:after{transform:translate(14px)}[dir=rtl] .fd-switch:checked:after{transform:translate(-14px)}.fd-choices{display:flex;flex-wrap:wrap;gap:6px 18px}.fd-choice{display:inline-flex;align-items:center;gap:8px;cursor:pointer}.fd-points{display:flex;flex-wrap:wrap;gap:6px}.fd-points button{font:inherit;cursor:pointer;border:1px solid var(--fd-border);background:var(--fd-surface);color:var(--fd-text);border-radius:var(--fd-control-radius);min-width:34px;height:34px;padding:0 8px}.fd-points button.fd-on{background:var(--fd-accent);color:var(--fd-accent-text);border-color:var(--fd-accent)}.fd-rating button{border:none;background:none;font-size:24px;color:var(--fd-border-strong);padding:0 2px;min-width:0}.fd-rating button.fd-on{background:none;color:#f5a623}.fd-points button:disabled,.fd-choice input:disabled{cursor:default}.fd-form :focus-visible{outline:2px solid var(--fd-focus);outline-offset:2px}.fd-form .fd-input:focus-visible{outline:none}.fd-combo{position:relative;display:flex;align-items:center;min-width:0}.fd-combo-input{padding-inline-end:28px}.fd-combo-clear{position:absolute;inset-inline-end:4px;border:none;background:none;cursor:pointer;color:var(--fd-muted);font-size:16px;line-height:1;padding:2px 6px;border-radius:4px}.fd-combo-clear:hover{color:var(--fd-text);background:var(--fd-page)}.fd-combo:has(>.fd-combo-open:not([hidden])) .fd-combo-input{padding-inline-end:52px}.fd-combo-open{position:absolute;inset-inline-end:28px;border:none;background:none;cursor:pointer;color:var(--fd-accent);font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.fd-combo-open:hover{background:var(--fd-page)}.fd-listbox{position:absolute;inset-inline:0;inset-block-start:calc(100% + 2px);z-index:20;margin:0;padding:4px 0;list-style:none;background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:max(var(--fd-control-radius),4px);box-shadow:0 8px 24px #0f14191f;max-height:240px;overflow-y:auto}.fd-option{padding:6px 12px;cursor:pointer}.fd-option:hover,.fd-option.fd-active{background:var(--fd-accent-soft)}.fd-option-create{color:var(--fd-accent);border-block-start:1px solid var(--fd-border)}.fd-empty{padding:6px 12px;color:var(--fd-muted);font-style:italic}.fd-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0}.fd-chips{display:contents;list-style:none;margin:0;padding:0}.fd-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 4px 1px 10px;border-radius:999px;background:var(--fd-accent-soft);color:var(--fd-text);font-size:13px;line-height:22px}.fd-chip-remove{border:none;background:none;cursor:pointer;color:var(--fd-muted);font-size:15px;line-height:1;padding:0 4px;border-radius:999px}.fd-chip-remove:hover{color:var(--fd-error)}.fd-tags .fd-combo{flex:1 1 140px}.fd-reference{display:grid;grid-template-columns:minmax(7em,34%) minmax(0,1fr);gap:8px}.fd-lines{display:grid;grid-template-columns:minmax(0,1fr);gap:6px;min-width:0}.fd-lines-scroll{overflow-x:auto;min-width:0;position:relative}.fd-lines-table{width:100%;border-collapse:collapse;font-size:13.5px}.fd-lines-table th{text-align:start;font-weight:600;color:var(--fd-muted);font-size:12.5px;padding:6px 8px;border-block-end:1px solid var(--fd-border);white-space:nowrap}.fd-lines-table td{padding:4px 8px;border-block-end:1px solid var(--fd-border);vertical-align:top;min-width:7em}.fd-lines-table td.fd-lines-tools,.fd-lines-table th.fd-lines-tools{width:32px;min-width:32px;padding-inline:0;text-align:center}.fd-lines-table .fd-input{min-height:28px}.fd-lines-table td>.fd-checkbox,.fd-lines-table td>.fd-switch{margin-block-start:6px}.fd-line-delete{border:none;background:none;cursor:pointer;color:var(--fd-muted);font-size:16px;line-height:1;padding:4px 6px;border-radius:4px}.fd-line-delete:hover{color:var(--fd-error);background:var(--fd-error-soft)}.fd-lines-totals td{padding:8px;font-weight:600;border-block-start:1px solid var(--fd-border);font-variant-numeric:tabular-nums}.fd-lines-adds{display:flex;flex-wrap:wrap;gap:4px 16px;justify-self:start}.fd-line-section td{background:var(--fd-page)}.fd-line-section .fd-input{font-weight:600}.fd-line-note .fd-input{font-style:italic}.fd-cell-error{color:var(--fd-error);font-size:12px}.fd-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fd-file{display:grid;gap:8px;justify-items:start;padding:6px 0;border-radius:var(--fd-control-radius)}.fd-file.fd-dragging{outline:2px dashed var(--fd-accent);outline-offset:4px}.fd-file-pick{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center;cursor:pointer}.fd-file-chosen{display:inline-flex;flex-wrap:wrap;gap:4px 10px;align-items:center}.fd-file-name{font-variant-numeric:tabular-nums}.fd-image-pick{width:120px;height:120px;border:1px dashed var(--fd-border-strong);border-radius:var(--fd-control-radius);display:grid;place-content:center;justify-items:center;text-align:center;padding:8px;background:var(--fd-page)}.fd-avatar .fd-image-pick{width:88px;height:88px}.fd-image-preview{max-width:160px;max-height:160px;border-radius:var(--fd-control-radius);border:1px solid var(--fd-border);object-fit:cover;background:var(--fd-page)}.fd-richtext{min-height:96px;line-height:1.5;overflow-wrap:anywhere}.fd-richtext-box{display:grid;gap:0;min-width:0}.fd-richtext-box>.fd-richtext{border-start-start-radius:0;border-start-end-radius:0}.fd-richtext-bar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:4px;min-width:0;border:1px solid var(--fd-border);border-block-end:none;border-start-start-radius:var(--fd-control-radius);border-start-end-radius:var(--fd-control-radius);background:var(--fd-page)}.fd-richtext-style{font:inherit;font-size:12.5px;padding:3px 6px;margin-inline-end:4px;border:1px solid var(--fd-border);border-radius:4px;background:var(--fd-surface);color:var(--fd-text)}.fd-richtext-tool{display:grid;place-items:center;width:28px;height:28px;padding:0;border:none;border-radius:4px;background:none;cursor:pointer;color:var(--fd-text);font:inherit;font-size:14px}.fd-richtext-tool:hover{background:var(--fd-surface)}.fd-richtext-tool[aria-pressed=true]{background:var(--fd-accent-soft);color:var(--fd-accent)}.fd-richtext-tool svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round}.fd-richtext-tool svg circle{fill:currentColor;stroke:none}.fd-link-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:6px;border:1px solid var(--fd-border);border-block-end:none;background:var(--fd-surface)}.fd-link-row>.fd-input{flex:1 1 200px;min-width:0}.fd-richtext[contenteditable=false]{background:transparent;border-color:transparent;padding-inline:0;min-height:0}.fd-richtext p{margin:0 0 6px}.fd-code{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:12.5px;min-height:96px}.fd-sections{display:grid;gap:24px}.fd-section{border:0;margin:0;padding:0;min-width:0;display:grid;gap:14px}.fd-section-title{font-size:15px;font-weight:650;padding:0;margin:0;float:inline-start;width:100%}.fd-section-title+*{clear:both}.fd-form[data-fd-skin=underline] .fd-section-title{text-transform:uppercase;letter-spacing:.05em;font-size:12.5px;color:var(--fd-muted);border-block-end:1px solid var(--fd-border);padding-block-end:6px;width:100%}.fd-section-description{color:var(--fd-muted);margin:0}.fd-section-toggle{font:inherit;color:inherit;background:none;border:0;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center;gap:8px;text-align:start}.fd-section-toggle:focus-visible{outline:2px solid var(--fd-focus);outline-offset:2px;border-radius:2px}.fd-section-chevron{width:.5em;height:.5em;border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg);margin-block-start:-.2em;transition:transform .15s ease;flex:none}.fd-section-folded .fd-section-chevron{transform:rotate(-45deg);margin-block-start:0}[dir=rtl] .fd-section-folded .fd-section-chevron{transform:rotate(135deg)}.fd-form[data-fd-skin=outlined] .fd-sections>.fd-section{background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:var(--fd-radius);padding:20px 24px}.fd-tablist{display:flex;gap:2px;border-block-end:1px solid var(--fd-border);overflow-x:auto}.fd-tab{font:inherit;background:none;border:none;cursor:pointer;padding:8px 14px;color:var(--fd-muted);border-block-end:2px solid transparent;margin-block-end:-1px;white-space:nowrap}.fd-tab[aria-selected=true]{color:var(--fd-accent);border-block-end-color:var(--fd-accent);font-weight:600}.fd-tabpanel{padding-block:16px;display:grid;gap:16px}.fd-button{font:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:6px;justify-content:center;min-height:32px;padding:4px 14px;border-radius:var(--fd-control-radius);border:1px solid var(--fd-border);background:var(--fd-surface);color:var(--fd-text)}.fd-button:hover{border-color:var(--fd-accent);color:var(--fd-accent)}.fd-button-primary{background:var(--fd-accent);border-color:var(--fd-accent);color:var(--fd-accent-text)}.fd-button-primary:hover{color:var(--fd-accent-text);filter:brightness(1.12)}.fd-button-danger{color:var(--fd-error);border-color:var(--fd-error)}.fd-button-danger:hover{background:var(--fd-error);color:#fff}.fd-button-link{border-color:transparent;background:none;color:var(--fd-accent);padding-inline:4px}.fd-form[data-fd-skin=underline] .fd-button{border-radius:3px}.fd-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.fd-actions-end{justify-content:flex-end;margin-block-start:24px}.fd-sheet-page{background:var(--fd-page);padding:0 0 32px;min-width:0}.fd-header{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;justify-content:space-between;background:var(--fd-surface);border-block-end:1px solid var(--fd-border);padding:8px 16px}.fd-statusbar{display:flex;list-style:none;margin:0;padding:0;overflow-x:auto}.fd-statusbar li{display:flex}.fd-statusbar button,.fd-statusbar span{font:inherit;font-size:13px;border:none;background:var(--fd-page);color:var(--fd-muted);padding:5px 18px 5px 22px;margin-inline-start:-6px;white-space:nowrap;clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%,10px 50%)}.fd-statusbar li:first-child button,.fd-statusbar li:first-child span{margin-inline-start:0;padding-inline-start:14px;clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%)}.fd-statusbar button{cursor:pointer}.fd-statusbar [aria-current=step]{background:var(--fd-accent);color:var(--fd-accent-text);font-weight:600}[dir=rtl] .fd-statusbar button,[dir=rtl] .fd-statusbar span{transform:scaleX(-1)}[dir=rtl] .fd-statusbar button>*,[dir=rtl] .fd-statusbar span>*{display:inline-block;transform:scaleX(-1)}.fd-sheet-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;max-width:var(--fd-page-max, 1180px);margin:16px auto 0;padding-inline:16px}.fd-sheet-layout{align-items:start}.fd-sheet-foot{margin:4px -28px -28px;padding:12px 28px;border-block-start:1px solid var(--fd-border);border-end-start-radius:inherit;border-end-end-radius:inherit}.fd-sheet-layout.fd-has-side{grid-template-columns:minmax(0,1fr) minmax(260px,360px)}@container (max-width: 860px){.fd-sheet-layout.fd-has-side{grid-template-columns:minmax(0,1fr)}}.fd-card{position:relative;background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:var(--fd-radius);padding:24px 28px 28px;display:grid;gap:18px;min-width:0}.fd-ribbon-frame{position:absolute;inset:0;overflow:hidden;border-radius:inherit;pointer-events:none}.fd-ribbon{position:absolute;inset-block-start:18px;inset-inline-end:-42px;transform:rotate(45deg);width:160px;text-align:center;font-size:12px;font-weight:700;padding:4px 0;color:#fff;background:var(--fd-muted);text-transform:uppercase;letter-spacing:.06em;pointer-events:none}[dir=rtl] .fd-ribbon{transform:rotate(-45deg)}.fd-ribbon.fd-tone-danger{background:var(--fd-error)}.fd-ribbon.fd-tone-success{background:var(--fd-success)}.fd-ribbon.fd-tone-warning{background:#d97706}.fd-ribbon.fd-tone-info{background:var(--fd-info)}.fd-alert{padding:10px 14px;border-radius:var(--fd-control-radius);border:1px solid;font-size:13.5px;display:flex;align-items:flex-start;gap:10px}.fd-alert-message{flex:1 1 auto;min-width:0}.fd-alert-close{border:none;background:none;color:inherit;cursor:pointer;font:inherit;font-size:18px;line-height:1;padding:0 4px;border-radius:4px;opacity:.75}.fd-alert-close:hover{opacity:1}.fd-alert-close:focus-visible{outline:2px solid var(--fd-focus);opacity:1}.fd-alert.fd-tone-warning{background:var(--fd-warning-soft);border-color:#f0c47a;color:var(--fd-warning)}.fd-alert.fd-tone-danger{background:var(--fd-error-soft);border-color:#f1a7a7;color:var(--fd-error)}.fd-alert.fd-tone-success{background:var(--fd-success-soft);border-color:#a7d7ab;color:var(--fd-success)}.fd-alert.fd-tone-info,.fd-alert:not([class*=fd-tone-]){background:var(--fd-info-soft);border-color:#a9c8ef;color:var(--fd-info)}.fd-stats{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:0;margin:-24px -28px 0;border-block-end:1px solid var(--fd-border)}.fd-stats:empty{display:none}.fd-card:has(>.fd-ribbon-frame>.fd-ribbon:not([hidden])) .fd-stats{padding-inline-end:104px}.fd-stat{font:inherit;background:none;border:none;border-inline-start:1px solid var(--fd-border);cursor:pointer;padding:8px 18px;display:grid;justify-items:start;line-height:1.2;color:var(--fd-text);min-width:120px}.fd-stat:hover{background:var(--fd-page)}.fd-stat:has(>.fd-icon){grid-template-columns:auto minmax(0,1fr);align-items:center;column-gap:10px}.fd-stat>.fd-icon{width:22px;height:22px;color:var(--fd-muted)}.fd-stat-words{display:grid;justify-items:start}.fd-stat-value{font-weight:700;font-size:15px;color:var(--fd-accent);font-variant-numeric:tabular-nums}.fd-stat-label{font-size:12.5px;color:var(--fd-muted)}.fd-title-row{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.fd-title{display:grid;gap:4px;flex:1 1 auto;min-width:0}.fd-avatar{flex:none}.fd-avatar>.fd-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fd-form[data-fd-skin=underline] .fd-avatar{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-avatar>*{grid-column:1!important}.fd-avatar .fd-image-pick{width:120px;height:120px;border:1px dashed var(--fd-border-strong);border-radius:var(--fd-control-radius);display:grid;place-content:center;justify-items:center;text-align:center;padding:8px;background:var(--fd-page)}.fd-image-pick .fd-button{border:none;background:none;color:var(--fd-accent);padding:0;min-height:0}.fd-image-pick:hover{border-color:var(--fd-accent)}.fd-avatar .fd-image-pick,.fd-image-preview{width:88px;height:88px}.fd-avatar .fd-file-pick .fd-help,.fd-avatar .fd-file-name{display:none}.fd-avatar .fd-file{justify-items:center;gap:2px;padding:0}.fd-avatar .fd-file-chosen{gap:2px 8px;justify-content:center;font-size:12.5px}.fd-title>.fd-field .fd-input{font-size:24px;font-weight:600;min-height:40px}.fd-form[data-fd-skin=underline] .fd-title>.fd-field{grid-template-columns:minmax(0,1fr)}.fd-form[data-fd-skin=underline] .fd-title>.fd-field>*{grid-column:1}.fd-title>.fd-field>.fd-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fd-title-above,.fd-title-below{display:flex;flex-wrap:wrap;align-items:center;gap:6px 24px}.fd-title-above{margin-block-end:4px}.fd-title-below{margin-block-start:6px}.fd-form .fd-title-above>.fd-field,.fd-form .fd-title-below>.fd-field{display:flex;align-items:center;gap:8px;grid-template-columns:none}.fd-form .fd-title-above>.fd-field>*,.fd-form .fd-title-below>.fd-field>*{grid-column:auto!important}.fd-title-above .fd-label:empty,.fd-title-below .fd-label:empty{display:none}.fd-title-above>.fd-field>.fd-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fd-title-statusbar{display:flex}.fd-badges{display:flex;flex-wrap:wrap;gap:6px}.fd-badge{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;line-height:1;padding:5px 10px;border-radius:999px;border:1px solid var(--fd-border);background:var(--fd-page);color:var(--fd-muted)}.fd-badge .fd-icon{width:13px;height:13px}.fd-badge.fd-tone-info{background:var(--fd-info-soft);border-color:#a9c8ef;color:var(--fd-info)}.fd-badge.fd-tone-success{background:var(--fd-success-soft);border-color:#a7d7ab;color:var(--fd-success)}.fd-badge.fd-tone-warning{background:var(--fd-warning-soft);border-color:#f0c47a;color:var(--fd-warning)}.fd-badge.fd-tone-danger{background:var(--fd-error-soft);border-color:#f1a7a7;color:var(--fd-error)}.fd-side{display:grid;gap:12px;align-content:start;min-width:0}.fd-wizard{display:grid;gap:20px}.fd-progress{display:grid;gap:8px}.fd-progress-text{color:var(--fd-muted);font-size:13px}.fd-value-text{display:block;padding-block:6px;font-variant-numeric:tabular-nums}.fd-date-pick{position:relative;display:flex;align-items:center;gap:6px;min-width:0}.fd-date-pick>.fd-input{flex:1 1 auto;min-width:0}.fd-calendar-button{flex:0 0 auto;display:grid;place-items:center;width:32px;height:32px;padding:0;cursor:pointer;border:1px solid var(--fd-border);border-radius:var(--fd-control-radius);background:var(--fd-surface);color:var(--fd-muted)}.fd-calendar-button:hover,.fd-calendar-button[aria-expanded=true]{color:var(--fd-text);background:var(--fd-page)}.fd-calendar-button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round}.fd-calendar{position:absolute;inset-block-start:calc(100% + 4px);inset-inline-end:0;z-index:30;padding:8px;background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:max(var(--fd-control-radius),6px);box-shadow:0 8px 24px #0f141924}.fd-calendar-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:2px 4px 6px}.fd-calendar-head button{border:none;background:none;cursor:pointer;font-size:18px;line-height:1;padding:4px 8px;border-radius:4px;color:var(--fd-text)}.fd-calendar-head button:hover{background:var(--fd-page)}.fd-calendar-title{font-weight:600}.fd-calendar-grid{border-collapse:collapse;font-variant-numeric:tabular-nums}.fd-calendar-grid th{font-size:11.5px;font-weight:600;color:var(--fd-muted);padding:4px 0;width:34px;text-align:center}.fd-calendar-grid .fd-week{color:var(--fd-accent);font-weight:600;border-inline-end:1px solid var(--fd-border)}.fd-calendar-grid td{padding:1px}.fd-calendar-grid td button{width:32px;height:30px;border:none;border-radius:4px;background:none;cursor:pointer;color:var(--fd-text);font:inherit;font-size:13px}.fd-calendar-grid td button:hover{background:var(--fd-accent-soft)}.fd-calendar-grid td button.fd-outside{color:var(--fd-muted);opacity:.6}.fd-calendar-grid td button[aria-current=date]{box-shadow:inset 0 0 0 1px var(--fd-accent)}.fd-calendar-grid td button[aria-selected=true]{background:var(--fd-accent);color:var(--fd-accent-text);font-weight:600}.fd-calendar-grid td button:focus-visible{outline:2px solid var(--fd-focus);outline-offset:1px}.fd-properties{display:grid;gap:8px;min-width:0}.fd-property{display:grid;grid-template-columns:minmax(120px,30%) minmax(0,1fr);align-items:center;gap:12px;min-width:0}.fd-property>label{color:var(--fd-muted);font-size:13px}.fd-property[data-type=boolean]>:last-child{justify-self:start}@container (max-width: 520px){.fd-property{grid-template-columns:minmax(0,1fr);gap:4px}}.fd-progressbar{position:relative;height:22px;min-width:120px;border-radius:999px;overflow:hidden;background:var(--fd-page);border:1px solid var(--fd-border);font-variant-numeric:tabular-nums}.fd-progressbar-fill{height:100%;background:var(--fd-success);transition:width .2s ease}.fd-progressbar[data-tone=warning] .fd-progressbar-fill{background:#d97706}.fd-progressbar[data-tone=danger] .fd-progressbar-fill{background:var(--fd-error)}.fd-progressbar[data-tone=info] .fd-progressbar-fill{background:var(--fd-info)}.fd-progressbar-text{position:absolute;inset:0;display:grid;place-items:center;font-size:12px;font-weight:600;color:var(--fd-text)}.fd-progressbar-edit{display:flex;align-items:center;gap:12px;min-width:0}.fd-progressbar-edit>.fd-progressbar{flex:1 1 auto}.fd-progressbar-edit>.fd-input{flex:0 0 96px}.fd-progress-bar{height:4px;background:var(--fd-border);border-radius:999px;overflow:hidden}.fd-progress-bar>span{display:block;height:100%;background:var(--fd-accent);transition:width .25s ease}.fd-step{display:grid;gap:18px}.fd-step-title{font-size:18px;font-weight:650;margin:0}.fd-wizard-nav{display:flex;gap:8px;justify-content:space-between}.fd-steps-list{display:flex;flex-wrap:wrap;gap:8px;list-style:none;margin:0;padding:0;counter-reset:fd-step}.fd-steps-list>li{counter-increment:fd-step}.fd-step-link{font:inherit;font-size:13.5px;display:inline-flex;align-items:center;gap:6px;cursor:pointer;border:1px solid var(--fd-border);background:var(--fd-surface);color:var(--fd-muted);border-radius:999px;padding:4px 12px 4px 6px}.fd-step-link:before{content:counter(fd-step);display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;background:var(--fd-page);color:var(--fd-muted);font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.fd-step-link:hover{border-color:var(--fd-accent);color:var(--fd-text)}.fd-step-link:focus-visible{outline:2px solid var(--fd-focus);outline-offset:2px}.fd-step-link.fd-step-done{color:var(--fd-text)}.fd-step-link.fd-step-done:before{content:"\u2713";background:var(--fd-accent-soft);color:var(--fd-accent)}.fd-step-link.fd-step-skipped{border-style:dashed;color:var(--fd-muted)}.fd-step-link.fd-step-skipped:before{content:"\u2013";background:var(--fd-page);color:var(--fd-muted)}.fd-step-link[aria-current=step]{border-color:var(--fd-accent);color:var(--fd-accent);font-weight:600}.fd-step-link[aria-current=step]:before{content:counter(fd-step);background:var(--fd-accent);color:var(--fd-accent-text)}.fd-wizard-nav .fd-spacer{flex:1}.fd-text-heading{font-size:16px;font-weight:650;margin:0}.fd-text-paragraph{margin:0}.fd-text-note{margin:0;color:var(--fd-muted);font-size:13px}.fd-status{min-height:1.4em;color:var(--fd-muted);font-size:13px}.fd-status-box{display:inline-flex;align-items:center;gap:6px;min-width:0}.fd-status-box .fd-retry{font-size:13px}.fd-announce{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fd-banner{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;padding:10px 14px;margin-block-end:16px;border:1px solid #f0c47a;border-radius:var(--fd-control-radius);background:var(--fd-warning-soft);color:var(--fd-warning);font-size:13.5px}.fd-banner-text{flex:1 1 16em;min-width:0}.fd-content>.fd-banner:has(+.fd-draft+.fd-sheet-page),.fd-content>.fd-banner:has(+.fd-sheet-page){margin:12px 16px 0}.fd-status-box.fd-toast{position:fixed;inset-block-end:max(20px,env(safe-area-inset-bottom,0px));inset-inline-end:20px;z-index:900;padding:10px 16px;border-radius:8px;background:var(--fd-text);box-shadow:0 8px 24px #0f141940}.fd-toast .fd-status,.fd-toast .fd-status.fd-status-saved,.fd-toast .fd-status.fd-status-error{color:var(--fd-surface);font-size:13.5px;min-height:0}.fd-toast .fd-retry{color:var(--fd-surface);text-decoration:underline}.fd-toast:has(.fd-status-error){background:var(--fd-error)}.fd-status-box.fd-status-bar{display:flex;justify-content:center;min-height:32px;padding:6px 16px;background:var(--fd-surface);border-block-end:1px solid var(--fd-border)}.fd-status-bar .fd-status-error,.fd-status.fd-status-error{color:var(--fd-error)}.fd-status.fd-status-saved{color:var(--fd-success)}.fd-draft{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;padding:10px 14px;margin-block-end:16px;background:var(--fd-info-soft);border:1px solid #a9c8ef;border-radius:var(--fd-control-radius)}.fd-done{padding:40px 0;text-align:center;display:grid;gap:12px;justify-items:center}.fd-done-title{font-size:20px;font-weight:650;margin:0}.fd-dialog-backdrop{position:fixed;inset:0;background:#0f141973;display:grid;place-items:center;z-index:1000;padding:16px}.fd-dialog{background:var(--fd-surface);color:var(--fd-text);border-radius:max(var(--fd-radius),6px);max-width:420px;width:100%;padding:20px 22px;display:grid;gap:16px;box-shadow:0 10px 30px #0003;font-family:var(--fd-font)}.fd-dialog p{margin:0}.fd-form-dialog{display:flex;flex-direction:column;width:100%;max-height:min(90vh,100%);min-height:0;background:var(--fd-page);color:var(--fd-text);border-radius:max(var(--fd-radius),8px);box-shadow:0 24px 64px #0f14194d;overflow:hidden}.fd-form-dialog:focus{outline:none}.fd-form-dialog.fd-size-small{max-width:440px}.fd-form-dialog.fd-size-medium{max-width:760px}.fd-form-dialog.fd-size-large{max-width:1080px}.fd-form-dialog-backdrop:has(>.fd-size-full){padding:0}.fd-form-dialog.fd-size-full{max-width:none;max-height:none;height:100%;border-radius:0}.fd-form-dialog-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-block-end:1px solid var(--fd-border);background:var(--fd-surface)}.fd-form-dialog-title{margin:0;font-size:16px;font-weight:600}.fd-dialog-close{border:none;background:none;cursor:pointer;font-size:22px;line-height:1;padding:2px 8px;border-radius:4px;color:var(--fd-muted)}.fd-dialog-close:hover{background:var(--fd-page);color:var(--fd-text)}.fd-form-dialog-body{flex:1 1 auto;min-height:0;overflow:auto;container-type:inline-size}.fd-form-dialog-body .fd-sheet-layout{margin-block-start:12px}.fd-form-dialog-body .fd-page-title{display:none}.fd-form-dialog-body .fd-page-head:not(:has(.fd-page-description)){display:none}.fd-form-dialog-body .fd-sheet-layout.fd-has-side{grid-template-columns:minmax(0,1fr)}.fd-form-dialog-body .fd-side{display:none}.fd-search-body{display:grid;gap:12px;align-content:start}.fd-search-list{list-style:none;margin:0;padding:0;border:1px solid var(--fd-border);border-radius:var(--fd-control-radius);overflow:auto;max-height:min(60vh,520px)}.fd-search-list .fd-option{padding:8px 12px}.fd-search-list .fd-option+.fd-option{border-block-start:1px solid var(--fd-border)}.fd-search-list .fd-empty{padding:10px 12px;color:var(--fd-muted)}.fd-form-dialog-body:not(:has(.fd-sheet-layout)){background:var(--fd-surface);padding:16px 20px 20px}.fd-form-dialog-foot{padding:12px 16px;border-block-start:1px solid var(--fd-border);background:var(--fd-surface);margin:0}@media(prefers-reduced-motion:reduce){.fd-form *,.fd-form *:before,.fd-form *:after{transition:none!important}}',Dn="fieldia-styles";function Kt(e){if(e.getElementById(Dn))return;let t=e.createElement("style");t.id=Dn,t.textContent=Pn,(e.head??e.documentElement).append(t)}function Yt(e){let t=()=>{try{return e??globalThis.localStorage??null}catch{return null}};return{get(n){try{let i=t()?.getItem(`fieldia:${n}`);return i==null?null:JSON.parse(i)}catch{return null}},set(n,i){try{t()?.setItem(`fieldia:${n}`,JSON.stringify(i))}catch{}}}}function Kr(){let e=new Map;return{get:t=>e.has(t)?zn(e.get(t)):null,set:(t,n)=>{e.set(t,zn(n))}}}var zn=e=>JSON.parse(JSON.stringify(e));var Yr="http://www.w3.org/2000/svg",Wn={user:'<circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-6 8-6s8 2 8 6"/>',users:'<circle cx="9" cy="8" r="3.5"/><path d="M2 20c0-3.5 3-5.5 7-5.5s7 2 7 5.5"/><circle cx="17" cy="9" r="2.5"/><path d="M16.5 14.5c3 0 5.5 1.6 5.5 4.5"/>',building:'<rect x="4" y="3" width="16" height="18" rx="1"/><path d="M9 21v-4h6v4M8 7h2M14 7h2M8 11h2M14 11h2"/>',home:'<path d="M3 11l9-7 9 7"/><path d="M5 10v10h14V10"/><path d="M10 20v-6h4v6"/>',phone:'<rect x="7" y="2" width="10" height="20" rx="2"/><path d="M11 18h2"/>',mail:'<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/>',pin:'<path d="M12 21s-7-6.5-7-12a7 7 0 0 1 14 0c0 5.5-7 12-7 12z"/><circle cx="12" cy="9" r="2.5"/>',globe:'<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3.2 3 14.8 0 18M12 3c-3 3.2-3 14.8 0 18"/>',calendar:'<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M3 10h18M8 3v4M16 3v4"/>',clock:'<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/>',money:'<rect x="2" y="6" width="20" height="12" rx="2"/><circle cx="12" cy="12" r="3"/><path d="M6 9.5v0M18 14.5v0"/>',cart:'<path d="M3 4h2l2.5 11h11L21 7H6.4"/><circle cx="9" cy="19.5" r="1.5"/><circle cx="17" cy="19.5" r="1.5"/>',box:'<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M4 7.5l8 4.5 8-4.5M12 12v9"/>',truck:'<path d="M2 6h12v10H2zM14 9h4l3 3.5V16h-7"/><circle cx="6.5" cy="17.5" r="1.8"/><circle cx="17" cy="17.5" r="1.8"/>',receipt:'<path d="M6 3h12v18l-3-2-3 2-3-2-3 2z"/><path d="M9 8h6M9 12h6"/>',file:'<path d="M6 3h8l4 4v14H6z"/><path d="M14 3v4h4M9 12h6M9 16h6"/>',edit:'<path d="M4 20h4L19 9l-4-4L4 16z"/><path d="M13.5 6.5l4 4"/>',tag:'<path d="M3 12V4h8l10 10-8 8z"/><circle cx="7.5" cy="8" r="1.5"/>',star:'<path d="M12 3l2.8 6 6.2.6-4.7 4.2 1.4 6.2L12 16.8 6.3 20l1.4-6.2L3 9.6 9.2 9z"/>',lock:'<rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/>',check:'<path d="M5 12.5l4.5 4.5L19 7.5"/>',info:'<circle cx="12" cy="12" r="9"/><path d="M12 11v6M12 7.5v0"/>',warning:'<path d="M12 3l10 18H2z"/><path d="M12 10v5M12 18v0"/>',settings:'<path d="M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1"/><circle cx="15" cy="6" r="2"/><circle cx="9" cy="12" r="2"/><circle cx="17" cy="18" r="2"/>',chart:'<path d="M3 20h18M6 20v-8M11 20V5M16 20v-6"/>',link:'<path d="M10 14a4 4 0 0 0 5.6 0l3-3a4 4 0 0 0-5.6-5.6l-1 1"/><path d="M14 10a4 4 0 0 0-5.6 0l-3 3a4 4 0 0 0 5.6 5.6l1-1"/>',list:'<path d="M8 6h12M8 12h12M8 18h12M4 6v0M4 12v0M4 18v0"/>',chat:'<path d="M4 5h16v11H9l-5 4z"/>',search:'<circle cx="11" cy="11" r="6.5"/><path d="M16 16l5 5"/>',filter:'<path d="M3 5h18l-7 8.5V20l-4-2v-4.5z"/>',layers:'<path d="M12 3l9 5-9 5-9-5z"/><path d="M3 13l9 5 9-5"/>'};function ze(e,t,n){let i=t?n?.[t]??Wn[t]:void 0;if(i===void 0)return null;let a=e.createElementNS(Yr,"svg");for(let[r,o]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false",class:"fd-icon","data-icon":t}))a.setAttribute(r,o);return a.innerHTML=i,a}var Bn=0,Zr='button, [href], input, select, textarea, [contenteditable="true"], [tabindex]:not([tabindex="-1"])';function Ft(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,i=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a={...Ce[e.locale??"en"],...e.labels},r=`fd-dialog-${++Bn}`,o=(f,L={},w)=>{let N=t.createElement(f);for(let[O,T]of Object.entries(L))N.setAttribute(O,T);return w!==void 0&&(N.textContent=w),N},d=o("h2",{id:`${r}-title`,class:"fd-form-dialog-title"},e.title),s=o("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),l=o("div",{class:"fd-form-dialog-body"}),u=o("button",{type:"button",class:"fd-button"},a.discard),h=o("button",{type:"button",class:"fd-button fd-button-primary"},a.saveClose),x=o("div",{class:`fd-theme fd-form-dialog fd-size-${e.size??"medium"}`,"data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":d.id,tabindex:"-1"});e.dir&&x.setAttribute("dir",e.dir),x.append(o("div",{class:"fd-form-dialog-head"}),l,o("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"})),x.firstElementChild?.append(d,s),x.lastElementChild?.append(u,h);let g=o("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});g.append(x),n.append(g);let m=Xt(l,{...e,showActions:!1}),c=!1;e.recompute&&Xr(m.form,e.page.fields,e.recompute,()=>c);let v=()=>[...x.querySelectorAll(Zr)].filter(f=>!f.closest("[hidden], [inert]")&&!f.disabled),b=()=>l.querySelector('input:not([type="hidden"]), select, textarea, [contenteditable="true"]');return(b()??x).focus(),m.form.settled().then(()=>{(t.activeElement===x||!x.contains(t.activeElement))&&b()?.focus()}),new Promise(f=>{let L=w=>{if(c)return;c=!0;let N=m.form.getState(),O={saved:w,recordId:N.recordId??null,values:N.values};m.destroy(),g.remove(),i?.focus(),f(O)};h.addEventListener("click",async()=>{h.disabled=!0;let w=e.mode==="values"?m.check():await m.save();h.disabled=!1,w&&L(!0)}),u.addEventListener("click",()=>L(!1)),s.addEventListener("click",()=>L(!1)),x.addEventListener("keydown",w=>{if(w.key==="Enter"&&(w.ctrlKey||w.metaKey)&&!w.isComposing){if(w.target.closest(".ag-root-wrapper"))return;w.preventDefault(),t.activeElement?.dispatchEvent(new Event("change",{bubbles:!0})),h.click();return}if(!w.defaultPrevented){if(w.key==="Escape")w.preventDefault(),L(!1);else if(w.key==="Tab"){let N=v();if(!N.length)return;let O=N[0],T=N[N.length-1];w.shiftKey&&t.activeElement===O?(w.preventDefault(),T.focus()):!w.shiftKey&&t.activeElement===T&&(w.preventDefault(),O.focus())}}})})}function Xr(e,t,n,i){let a=JSON.stringify(e.getState().values),r=!1;e.subscribe(()=>{let o=e.getState().values,d=JSON.stringify(o);r||d===a||(a=d,n(o).then(s=>{if(!(i()||JSON.stringify(e.getState().values)!==d)){r=!0;for(let[l,u]of Object.entries(s))l in t&&JSON.stringify(o[l]??null)!==JSON.stringify(u??null)&&e.setValue(l,u);r=!1,a=JSON.stringify(e.getState().values)}},()=>{}))})}function Zt(e){let t=e.container?.ownerDocument??document,n=e.container??t.body,i=t.activeElement instanceof t.defaultView.HTMLElement?t.activeElement:null,a=Ce[e.locale??"en"],r=ge[e.locale??"en"],o=`fd-dialog-${++Bn}`,d=(f,L={},w)=>{let N=t.createElement(f);for(let[O,T]of Object.entries(L))N.setAttribute(O,T);return w!==void 0&&(N.textContent=w),N},s=d("h2",{id:`${o}-title`,class:"fd-form-dialog-title"},e.title),l=d("button",{type:"button",class:"fd-dialog-close","aria-label":a.close},"\xD7"),u=d("input",{type:"search",class:"fd-input","aria-label":r.search,placeholder:r.search,"aria-controls":`${o}-list`,autocomplete:"off"}),h=d("ul",{id:`${o}-list`,class:"fd-search-list",role:"listbox","aria-labelledby":s.id}),x=d("button",{type:"button",class:"fd-button"},a.cancel),g=d("div",{class:"fd-theme fd-form-dialog fd-search-dialog fd-size-small","data-fd-skin":e.skin??"underline",role:"dialog","aria-modal":"true","aria-labelledby":s.id});e.dir&&g.setAttribute("dir",e.dir);let m=d("div",{class:"fd-form-dialog-head"});m.append(s,l);let c=d("div",{class:"fd-form-dialog-body fd-search-body"});c.append(u,h);let v=d("div",{class:"fd-actions fd-actions-end fd-form-dialog-foot"});v.append(x),g.append(m,c,v);let b=d("div",{class:"fd-dialog-backdrop fd-form-dialog-backdrop"});return b.append(g),n.append(b),u.focus(),new Promise(f=>{let L=[],w=-1,N=0,O,T=J=>{clearTimeout(O),N++,b.remove(),i?.focus(),f(J)},z=()=>{h.replaceChildren(...L.map((J,de)=>{let _=d("li",{id:`${o}-option-${de}`,role:"option",class:`fd-option${de===w?" fd-active":""}`,"aria-selected":String(de===w)},J.label);return _.addEventListener("click",()=>T(J)),_})),L.length||h.append(d("li",{class:"fd-empty"},r.noResults)),w>=0?u.setAttribute("aria-activedescendant",`${o}-option-${w}`):u.removeAttribute("aria-activedescendant")},B=()=>{clearTimeout(O);let J=++N;O=setTimeout(async()=>{let de=await e.search(u.value,80).catch(()=>[]);J===N&&(L=de,w=-1,z())},180)};u.addEventListener("input",B),u.addEventListener("keydown",J=>{if(J.key==="ArrowDown"||J.key==="ArrowUp"){if(J.preventDefault(),!L.length)return;w=(w+(J.key==="ArrowDown"?1:-1)+L.length)%L.length,z(),h.children[w]?.scrollIntoView?.({block:"nearest"})}else J.key==="Enter"&&w>=0&&(J.preventDefault(),T(L[w]))}),x.addEventListener("click",()=>T(null)),l.addEventListener("click",()=>T(null)),g.addEventListener("keydown",J=>{J.key==="Escape"&&(J.preventDefault(),T(null))}),B()})}function Qr(e){return e.layout.type==="sheet"&&e.layout.title?.field?e.layout.title.field:e.fields.name?"name":Object.entries(e.fields).find(([,t])=>t.type==="char")?.[0]??null}function ei(e,t,n){let i=Object.fromEntries(Object.entries(e).map(([a,r])=>[a,n?{...r,readonly:!0}:r]));return{fieldia:"0.1",id:"values",title:t,data:{kind:"record",model:"values"},fields:i,layout:{type:"sections",id:"values",children:[{type:"section",id:"values-section",columns:2,children:Object.keys(i).map(a=>({type:"field",id:`values-${a}`,field:a}))}]}}}function ti(e){if(e)return{...e.search?{search:t=>e.search(t)}:{},...e.create?{create:t=>e.create(t)}:{}}}function jn(e){let t=i=>(typeof e.relatedPages=="function"?e.relatedPages(i):e.relatedPages?.[i])??null,n={locale:e.locale,skin:e.skin,dir:e.dir,widgets:e.widgets,preferences:e.preferences,relatedPages:e.relatedPages,translate:e.translate};return{canOpen:i=>t(i)!==null,async openRecord(i,a){let r=t(i);if(!r)return null;let o=Qr(r),d=await Ft({...n,page:r,dataSource:e.dataSource,recordId:a.recordId??null,values:a.name&&o?{[o]:a.name}:void 0,title:a.title,size:"large"});if(!d.saved||d.recordId===null)return null;let s=o?d.values[o]:null;return{id:d.recordId,label:typeof s=="string"&&s?s:a.name??a.title}},searchMore:i=>Zt({title:i.title,search:i.search,locale:e.locale,skin:e.skin,dir:e.dir}),async editValues(i){let a=await Ft({...n,page:ei(i.fields,i.title,i.readonly===!0),dataSource:ti(e.dataSource),values:i.values,title:i.title,mode:"values",...i.recompute?{recompute:i.recompute}:{}});return a.saved?a.values:null}}}var Hn=e=>`favourites:${e.id}`;function Nt(e,t){let n=e.get(Hn(t));return Array.isArray(n)?n:[]}function qn(e,t,n){let i=Nt(t,n).find(a=>a.isDefault);return i?i.facets:e.defaultFilters?.length?[{kind:"filters",ids:[...e.defaultFilters],labels:e.defaultFilters.map(a=>e.filters?.find(r=>r.id===a)?.label??a)}]:[]}function Jn(e){let{page:t,el:n,labels:i,fill:a,preferences:r}=e,o=n("ul",{class:"fd-favourite-list"}),d=n("p",{class:"fd-favourites-none"},i.noFavourites),s=n("input",{class:"fd-input","aria-label":i.searchName,placeholder:i.searchName}),l=n("input",{type:"checkbox"}),u=n("button",{type:"button",class:"fd-button fd-button-primary"},i.save),h=n("div",{class:"fd-favourite-form",hidden:""},s,n("label",{class:"fd-favourite-default"},l,i.useByDefault),u),x=n("button",{type:"button",class:"fd-search-option fd-search-add","aria-expanded":"false"},i.saveSearch),g=c=>r.set(Hn(t),c);function m(){let c=Nt(r,t);d.hidden=c.length>0,o.replaceChildren(...c.map(v=>{let b=n("button",{type:"button",class:"fd-search-option","data-default":v.isDefault?"true":void 0},v.name);b.addEventListener("click",()=>e.apply(v.facets));let f=n("button",{type:"button",class:"fd-favourite-remove","aria-label":a(i.deleteFavourite,{name:v.name})},"\xD7");return f.addEventListener("click",()=>{g(Nt(r,t).filter(L=>L.name!==v.name)),m()}),n("li",{class:"fd-favourite"},b,f)}))}return x.addEventListener("click",()=>{h.hidden=!h.hidden,x.setAttribute("aria-expanded",String(!h.hidden)),h.hidden||s.focus()}),u.addEventListener("click",()=>{let c=s.value.trim();if(!c)return s.focus();let v={name:c,facets:e.current(),...l.checked?{isDefault:!0}:{}},b=Nt(r,t).filter(f=>f.name!==c).map(f=>l.checked?{name:f.name,facets:f.facets}:f);g([...b,v]),s.value="",l.checked=!1,h.hidden=!0,x.setAttribute("aria-expanded","false"),m()}),m(),{list:o,none:d,open:x,form:h}}function ni(e,t,n){let i=e.page.fields[t];return n.value===null?e.labels.none:i.type==="selection"?i.options.find(a=>a.value===n.value)?.label??n.label:i.type==="boolean"?n.value?e.labels.yes:e.labels.no:n.label||String(n.value)}function ri(e){let t=Number(e.dataset.level),n=e.nextElementSibling;for(;n&&Number(n.dataset.level??0)>t;){let i=n.nextElementSibling;n.remove(),n=i}}function Qt(e,t,n,i,a){let{el:r,labels:o}=e,d=a[n],s=[...i,t.value===null?{field:d,op:"notset",value:null}:{field:d,op:"=",value:t.value}],l=r("button",{type:"button",class:"fd-group-toggle","aria-expanded":"false"},r("span",{class:"fd-group-label"},ni(e,d,t))," ",r("span",{class:"fd-group-count"},`(${t.count})`)),u=r("tr",{class:"fd-list-group","data-level":String(n),"aria-level":String(n+1)},r("td",{colspan:String(e.columns)},l));u.style.setProperty("--fd-level",String(n));let h=!1;async function x(){h=!0;try{let m=n+1<a.length?(await e.dataSource.groups?.({model:e.model,field:a[n+1],filter:s}))?.map(c=>Qt(e,c,n+1,s,a))??[]:await g(0);if(!u.isConnected||l.getAttribute("aria-expanded")!=="true")return;u.after(...m),e.changed()}finally{h=!1}}async function g(m){let c=await e.dataSource.list({model:e.model,fields:e.fields,filter:s,sort:e.sort(),offset:m,limit:e.pageSize}),v=c.records.map(w=>e.recordRow(w,n+1)),b=c.total-m-c.records.length;if(b<=0)return v;let f=r("button",{type:"button",class:"fd-button fd-button-link"},e.fill(o.loadMore,{n:b})),L=r("tr",{class:"fd-list-more","data-level":String(n+1)},r("td",{colspan:String(e.columns)},f));return L.style.setProperty("--fd-level",String(n)),f.addEventListener("click",async()=>{f.disabled=!0;let w=await g(m+c.records.length);L.isConnected&&(L.replaceWith(...w),e.changed())}),[...v,L]}return l.addEventListener("click",()=>{let m=l.getAttribute("aria-expanded")==="true";l.setAttribute("aria-expanded",String(!m)),m?(ri(u),e.changed()):h||x()}),u}var ii='.fd-list{display:grid;gap:10px;min-width:0}.fd-list [hidden]{display:none!important}.fd-list-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:34px}.fd-search{position:relative;flex:1 1 360px;max-width:680px;min-width:0;container:fd-search / inline-size}.fd-search-field{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-height:34px;box-sizing:border-box;padding:2px 2px 2px 8px;padding-inline:8px 2px;border:1px solid var(--fd-border);border-radius:var(--fd-control-radius);background:var(--fd-surface)}.fd-search-field:focus-within{border-color:var(--fd-focus);box-shadow:var(--fd-focus-ring)}.fd-search-field>.fd-icon,.fd-search-field>svg{width:16px;height:16px;color:var(--fd-muted);flex:none}.fd-facets{display:contents}.fd-facet{display:inline-flex;align-items:center;gap:4px;max-width:100%;min-width:0;padding-block:2px;padding-inline:6px 2px;border-radius:3px;background:var(--fd-accent-soft);color:var(--fd-accent);font-size:13px;line-height:18px}.fd-facet svg{width:13px;height:13px;flex:none}.fd-facet[data-kind=groupBy]{background:var(--fd-success-soft);color:var(--fd-success)}.fd-facet-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fd-facet-remove{all:unset;cursor:pointer;display:grid;place-items:center;width:18px;height:18px;border-radius:2px;font-size:15px;line-height:1;opacity:.7}.fd-facet-remove:hover,.fd-facet-remove:focus-visible{opacity:1;background:var(--fd-surface)}.fd-search-input{flex:1 1 140px;min-width:100px;border:none;outline:none;background:none;font:inherit;font-size:14px;color:var(--fd-text);padding:5px 4px}.fd-form .fd-search-input:focus-visible{outline:none}.fd-search-toggle{all:unset;cursor:pointer;display:grid;place-items:center;width:30px;height:28px;border-radius:3px;color:var(--fd-muted)}.fd-search-toggle:before{content:"";width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-2px) rotate(45deg)}.fd-search-toggle[aria-expanded=true]:before{transform:translateY(2px) rotate(-135deg)}.fd-search-toggle:hover,.fd-search-toggle[aria-expanded=true]{background:var(--fd-page);color:var(--fd-text)}.fd-search-toggle:focus-visible{outline:2px solid var(--fd-focus)}.fd-search-suggestions,.fd-search-panel{position:absolute;z-index:30;inset-inline:0;top:calc(100% + 4px);box-sizing:border-box;background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:var(--fd-radius);box-shadow:0 10px 28px #0f172a24}.fd-search-suggestions{list-style:none;margin:0;padding:4px 0}.fd-search-suggestions [role=option]{padding:7px 12px;cursor:pointer;font-size:14px}.fd-search-suggestions [role=option][aria-selected=true]{background:var(--fd-accent-soft)}.fd-search-panel{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);padding-block:6px}.fd-search-group{display:flex;flex-direction:column;align-items:stretch;gap:1px;padding:4px 10px 8px;min-width:0}.fd-search-group+.fd-search-group{border-inline-start:1px solid var(--fd-border)}@container fd-search (max-width: 540px){.fd-search-panel{grid-auto-flow:row}.fd-search-group+.fd-search-group{border-inline-start:none;border-block-start:1px solid var(--fd-border);padding-block-start:8px}}.fd-search-heading{display:flex;align-items:center;gap:6px;font-weight:600;font-size:13.5px;padding:4px 6px 6px}.fd-search-heading svg{width:15px;height:15px}.fd-search-group[data-group-kind=filters] .fd-search-heading svg{color:var(--fd-accent)}.fd-search-group[data-group-kind=groupBy] .fd-search-heading svg{color:var(--fd-success)}.fd-search-group[data-group-kind=favourites] .fd-search-heading svg{color:var(--fd-warning)}.fd-search-option{all:unset;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:4px;font-size:14px;color:var(--fd-text)}.fd-search-option:before{content:"";width:14px;flex:none;text-align:center;color:var(--fd-accent);font-weight:700}.fd-search-option[aria-pressed=true]:before{content:"\u2713"}.fd-search-option:hover,.fd-search-option:focus-visible{background:var(--fd-page)}.fd-search-add{color:var(--fd-muted);margin-block-start:4px}.fd-search-add:before{content:"+";color:var(--fd-muted);font-weight:400}.fd-custom-filter,.fd-favourite-form{display:grid;gap:6px;padding:6px}.fd-custom-filter .fd-input,.fd-favourite-form .fd-input{width:100%;box-sizing:border-box;min-height:30px;border:1px solid var(--fd-border);border-radius:var(--fd-control-radius);padding:3px 6px;font:inherit;font-size:13.5px;background:var(--fd-surface);color:var(--fd-text)}.fd-favourite-default{display:flex;align-items:center;gap:6px;font-size:13.5px}.fd-favourite-list{list-style:none;margin:0;padding:0}.fd-favourite{display:flex;align-items:center}.fd-favourite .fd-search-option{flex:1;min-width:0}.fd-favourite .fd-search-option[data-default=true]:before{content:"\u2605";color:var(--fd-warning)}.fd-favourite-remove{all:unset;cursor:pointer;width:24px;height:24px;display:grid;place-items:center;border-radius:4px;color:var(--fd-muted)}.fd-favourite-remove:hover{background:var(--fd-page);color:var(--fd-error)}.fd-favourites-none{margin:0;padding:4px 6px;color:var(--fd-muted);font-size:13px}.fd-list-selection{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:3px 4px 3px 10px;border-radius:var(--fd-control-radius);background:var(--fd-accent-soft)}.fd-list-count{font-weight:600;font-size:13.5px;color:var(--fd-accent);font-variant-numeric:tabular-nums}.fd-pager{display:flex;align-items:center;gap:4px;margin-inline-start:auto}.fd-pager-text{color:var(--fd-muted);font-size:13.5px;font-variant-numeric:tabular-nums;margin-inline-end:6px;white-space:nowrap}.fd-pager-button{min-width:32px;padding-inline:0;font-size:18px;line-height:1}.fd-list-scroll{overflow-x:auto;background:var(--fd-surface);border:1px solid var(--fd-border);border-radius:var(--fd-radius)}.fd-list-table{width:100%;border-collapse:collapse;font-size:14px}.fd-list-table th{text-align:start;font-weight:600;font-size:13px;color:var(--fd-text);padding:8px 10px;border-block-end:1px solid var(--fd-border-strong);white-space:nowrap;background:var(--fd-surface)}.fd-list-table td{padding:7px 10px;border-block-end:1px solid var(--fd-border);max-width:28em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fd-list-table tbody tr:last-child td{border-block-end:none}.fd-list-table .fd-num{text-align:end;font-variant-numeric:tabular-nums}.fd-list-table th.fd-list-check,.fd-list-table td.fd-list-check{width:36px;padding-inline:10px 0}.fd-list-checkbox{width:16px;height:16px;margin:0;vertical-align:middle;accent-color:var(--fd-accent);cursor:pointer}.fd-list-sort{all:unset;box-sizing:border-box;width:100%;cursor:pointer;display:flex;align-items:center;gap:4px;font:inherit;color:inherit}.fd-list-sort:after{content:"";width:0;height:0;border-inline:4px solid transparent;opacity:0}.fd-list-sort:hover:after{opacity:.35;border-block-start:5px solid currentColor}.fd-list-table th[aria-sort=ascending] .fd-list-sort:after{opacity:1;border-block-start:none;border-block-end:5px solid currentColor}.fd-list-table th[aria-sort=descending] .fd-list-sort:after{opacity:1;border-block-end:none;border-block-start:5px solid currentColor}.fd-list-table th.fd-num .fd-list-sort{justify-content:flex-end}.fd-list-table th.fd-num .fd-list-sort:after{order:-1}.fd-list-sort:focus-visible{outline:2px solid var(--fd-focus);outline-offset:2px}.fd-list-row:hover td{background:var(--fd-page)}.fd-list-openable{cursor:pointer}.fd-list-row[aria-selected=true] td{background:var(--fd-accent-soft)}.fd-list-row:focus-visible{outline:2px solid var(--fd-focus);outline-offset:-2px}.fd-list-table[aria-busy=true] tbody{opacity:.6;transition:opacity .2s .15s}.fd-list-group td{padding:0;background:var(--fd-page)}.fd-group-toggle{all:unset;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;padding-inline-start:calc(12px + var(--fd-level, 0) * 22px);font-weight:600;font-size:13.5px;color:var(--fd-text)}.fd-group-toggle:before{content:"";flex:none;width:6px;height:6px;border-top:1.5px solid currentColor;border-right:1.5px solid currentColor;transform:rotate(45deg);transition:transform .12s}.fd-group-toggle:dir(rtl):before{transform:rotate(-135deg)}.fd-group-toggle[aria-expanded=true]:before{transform:rotate(135deg)}.fd-group-toggle:hover{background:var(--fd-accent-soft)}.fd-group-toggle:focus-visible{outline:2px solid var(--fd-focus);outline-offset:-2px}.fd-group-count{color:var(--fd-muted);font-weight:400;font-variant-numeric:tabular-nums}.fd-list-more td{padding:4px 10px;padding-inline-start:calc(46px + var(--fd-level, 0) * 22px)}.fd-list-empty,.fd-list-failed{margin:0;padding:28px 12px;text-align:center;color:var(--fd-muted)}.fd-list-failed{color:var(--fd-error)}';function Un(e){if(e.getElementById("fd-list-styles"))return;let t=e.createElement("style");t.id="fd-list-styles",t.textContent=ii,e.head.append(t)}var ai=[["ilike","opContains"],["=","opIs"],["!=","opIsNot"],["set","opSet"],["notset","opNotSet"]],oi=[["ilike","opContains"],["set","opSet"],["notset","opNotSet"]],si=[["=","opIs"],["!=","opIsNot"],["set","opSet"],["notset","opNotSet"]],di=[["=","opIs"],["!=","opIsNot"],[">","opGreater"],["<","opLess"],["set","opSet"],["notset","opNotSet"]],li=[["=","opIs"],[">","opGreater"],["<","opLess"],["set","opSet"],["notset","opNotSet"]];function en(e){switch(e.type){case"char":case"text":case"html":return ai;case"many2one":case"many2many":return oi;case"selection":return si;case"integer":case"float":case"monetary":return di;case"date":case"datetime":return li;case"boolean":return[["=","opIs"]];default:return[]}}function _n(e){let{page:t,el:n,labels:i}=e,a=Object.entries(t.fields).filter(([,c])=>en(c).length),r=n("select",{class:"fd-input","aria-label":i.field},...a.map(([c,v])=>n("option",{value:c},v.label))),o=n("select",{class:"fd-input","aria-label":i.condition}),d=n("span",{class:"fd-custom-filter-value"}),s=n("button",{type:"button",class:"fd-button fd-button-primary"},i.apply),l=n("div",{class:"fd-custom-filter",hidden:""},r,o,d,s),u=n("button",{type:"button",class:"fd-search-option fd-search-add","aria-expanded":"false"},i.addCustomFilter),h=n("input",{class:"fd-input","aria-label":i.value}),x=()=>t.fields[r.value];function g(){o.replaceChildren(...en(x()).map(([c,v])=>n("option",{value:c},i[v]))),m()}function m(){let c=x();if(c.type==="selection")h=n("select",{class:"fd-input","aria-label":i.value},...c.options.map(v=>n("option",{value:String(v.value)},v.label)));else if(c.type==="boolean")h=n("select",{class:"fd-input","aria-label":i.value},n("option",{value:"true"},i.yes),n("option",{value:"false"},i.no));else{let v=["integer","float","monetary"].includes(c.type)?"number":c.type==="date"?"date":c.type==="datetime"?"datetime-local":"text";h=n("input",{class:"fd-input",type:v,"aria-label":i.value})}d.replaceChildren(h),d.hidden=o.value==="set"||o.value==="notset"}return r.addEventListener("change",g),o.addEventListener("change",()=>d.hidden=o.value==="set"||o.value==="notset"),u.addEventListener("click",()=>{l.hidden=!l.hidden,u.setAttribute("aria-expanded",String(!l.hidden)),l.hidden||r.focus()}),s.addEventListener("click",()=>{let c=x(),v=o.value,b=i[en(c).find(([w])=>w===v)?.[1]??"opIs"],f=null,L="";if(!d.hidden){let w=h.value.trim();if(!w)return h.focus();if(c.type==="selection"){let N=c.options.find(O=>String(O.value)===w);f=N?.value??w,L=N?.label??w}else if(c.type==="boolean")f=w==="true",L=f?i.yes:i.no;else if(["integer","float","monetary"].includes(c.type)){if(f=Number(w),!Number.isFinite(f))return h.focus();L=w}else f=w,L=w}e.add({kind:"custom",label:[c.label,b,L].filter(Boolean).join(" "),filter:[{field:r.value,op:v,value:f}]}),l.hidden=!0,u.setAttribute("aria-expanded","false")}),g(),{button:u,form:l}}function ci(e,t){let n=` ${t.or} `;switch(e.kind){case"field":return`${e.label}: ${e.values.map(i=>i.label).join(n)}`;case"filters":return e.labels.join(n);case"groupBy":return e.labels.join(" > ");case"custom":return e.label}}function Gn(e){let{page:t,node:n,doc:i,el:a,labels:r,fill:o,uid:d}=e,s=e.facets,l=F=>{let D=ze(i,F,e.icons);return D?.setAttribute("aria-hidden","true"),D?[D]:[]};function u(F){s=F,L(),ee(),e.onChange(s)}let h=d(`${n.id}-suggestions`),x=d(`${n.id}-search-panel`),g=a("input",{class:"fd-search-input",role:"combobox",autocomplete:"off",placeholder:r.search,"aria-label":r.searchLabel,"aria-autocomplete":"list","aria-expanded":"false","aria-controls":h}),m=a("div",{class:"fd-facets"}),c=a("ul",{class:"fd-search-suggestions",role:"listbox",id:h,"aria-label":r.searchLabel,hidden:""}),v=a("button",{type:"button",class:"fd-search-toggle","aria-label":r.searchOptions,"aria-expanded":"false","aria-controls":x}),b=[],f=0;function L(){m.replaceChildren(...s.map((F,D)=>{let H=ci(F,r),ne=a("button",{type:"button",class:"fd-facet-remove","aria-label":o(r.removeFacet,{label:H})},"\xD7");ne.addEventListener("click",()=>{u(s.filter((me,ue)=>ue!==D)),g.focus()});let re=F.kind==="groupBy"?"layers":F.kind==="field"?"":"filter";return a("span",{class:"fd-facet","data-kind":F.kind},...re?l(re):[],a("span",{class:"fd-facet-text"},H),ne)}))}function w(){c.replaceChildren(...b.map((F,D)=>{let H=a("li",{role:"option",id:`${h}-${D}`,"aria-selected":String(D===f)},F.label);return H.addEventListener("mousedown",ne=>ne.preventDefault()),H.addEventListener("click",()=>O(F)),H})),c.hidden=b.length===0,g.setAttribute("aria-expanded",String(!c.hidden)),c.hidden?g.removeAttribute("aria-activedescendant"):g.setAttribute("aria-activedescendant",`${h}-${f}`)}function N(){b=[],w()}function O(F){let D={op:F.op,value:F.value,label:F.valueLabel},H=s.findIndex(re=>re.kind==="field"&&re.field===F.field),ne=[...s];if(H<0)ne.push({kind:"field",field:F.field,label:F.fieldLabel,values:[D]});else{let re=ne[H];re.values.some(ue=>ue.op===D.op&&JSON.stringify(ue.value)===JSON.stringify(D.value))||(ne[H]={...re,values:[...re.values,D]})}g.value="",N(),u(ne)}g.addEventListener("input",()=>{b=pt(g.value,t,n,{searchFor:r.searchFor}),f=0,w()}),g.addEventListener("blur",N),g.addEventListener("keydown",F=>{F.isComposing||((F.key==="ArrowDown"||F.key==="ArrowUp")&&b.length?(F.preventDefault(),f=(f+(F.key==="ArrowDown"?1:b.length-1))%b.length,w()):F.key==="Enter"?(F.preventDefault(),b.length&&O(b[f])):F.key==="Backspace"&&!g.value&&s.length?u(s.slice(0,-1)):F.key==="Escape"&&!c.hidden&&(F.preventDefault(),N()))});let T=(F,D,H)=>a("div",{class:"fd-search-heading",id:H},...l(F),D),z=(F,D)=>{let H=s.findIndex(pe=>pe.kind===F),ne=H<0?[]:F==="filters"?s[H].ids:s[H].fields,re=ne.includes(D)?ne.filter(pe=>pe!==D):[...ne,D],me=F==="filters"?{kind:F,ids:re,labels:re.map(pe=>n.filters?.find(ce=>ce.id===pe)?.label??pe)}:{kind:F,fields:re,labels:re.map(pe=>t.fields[pe]?.label??pe)},ue=[...s];H<0?ue.push(me):re.length?ue[H]=me:ue.splice(H,1),u(ue)},B=(n.filters??[]).map(F=>{let D=a("button",{type:"button",class:"fd-search-option","aria-pressed":"false","data-filter":F.id},F.label);return D.addEventListener("click",()=>z("filters",F.id)),D}),J=(n.groupBy??[]).map(F=>{let D=a("button",{type:"button",class:"fd-search-option","aria-pressed":"false","data-group":F},t.fields[F].label);return D.addEventListener("click",()=>z("groupBy",F)),D}),de=_n({page:t,el:a,labels:r,add:F=>u([...s,F])}),_=Jn({page:t,el:a,labels:r,fill:o,preferences:e.preferences,current:()=>s,apply:u}),K=(F,D,H,...ne)=>a("div",{class:"fd-search-group","data-group-kind":F,role:"group","aria-labelledby":`${x}-${F}`},T(D,H,`${x}-${F}`),...ne),Q=a("div",{class:"fd-search-panel",id:x,hidden:""},K("filters","filter",r.filters,...B,de.button,de.form),...J.length?[K("groupBy","layers",r.groupBy,...J)]:[],K("favourites","star",r.favourites,_.list,_.none,_.open,_.form));function ee(){let F=s.find(H=>H.kind==="filters")?.ids??[],D=s.find(H=>H.kind==="groupBy")?.fields??[];for(let H of B)H.setAttribute("aria-pressed",String(F.includes(H.dataset.filter??"")));for(let H of J)H.setAttribute("aria-pressed",String(D.includes(H.dataset.group??"")))}function $(F){Q.hidden=!F,v.setAttribute("aria-expanded",String(F)),F&&N()}v.addEventListener("click",()=>$(Q.hidden)),Q.addEventListener("keydown",F=>{F.key==="Escape"&&(F.preventDefault(),$(!1),v.focus())});let V=a("div",{class:"fd-search"},a("div",{class:"fd-search-field"},...l("search"),m,g,v),c,Q),W=F=>{!Q.hidden&&!V.contains(F.target)&&$(!1)};return i.addEventListener("pointerdown",W),L(),ee(),{element:V,destroy:()=>i.removeEventListener("pointerdown",W)}}var Kn=new Set(["integer","float","monetary"]),fi=new Set(["one2many","many2many","binary","image","html","json","properties"]);function Yn(e){let{page:t,node:n,form:i,el:a,labels:r,fill:o,locale:d,doc:s}=e;Un(s);let l=n.pageSize??40,u=n.sort??[],h=u,x=0,g=0,m=[],c=new WeakMap,v=()=>[...J.querySelectorAll(".fd-list-row")].map(k=>c.get(k)),b=t.data.kind==="record"?t.data.model:"",f=qn(n,e.preferences,t),L=new Set,w=0,N=!1,O=[...new Set(n.columns.flatMap(k=>{let E=t.fields[k];return E.type==="monetary"&&E.currencyField?[k,E.currencyField]:[k]}))],T=(k,E)=>et(t.fields[k],E[k],E,d),z=a("input",{type:"checkbox",class:"fd-list-checkbox","aria-label":r.selectAll}),B=n.columns.map(k=>{let E=t.fields[k],I=a("th",{scope:"col","data-field":k,class:Kn.has(E.type)?"fd-num":void 0});if(fi.has(E.type))I.append(E.label);else{let te=a("button",{type:"button",class:"fd-list-sort"},E.label);te.addEventListener("click",()=>{let X=h[0]?.field===k?!h[0].desc:!1;h=[{field:k,...X?{desc:X}:{}},...u.filter(Y=>Y.field!==k)],x=0,S()}),I.append(te)}return I}),J=a("tbody"),de=a("table",{class:"fd-list-table","aria-label":t.title},a("thead",{},a("tr",{},a("th",{class:"fd-list-check",scope:"col"},z),...B)),J),_=a("p",{class:"fd-list-empty",hidden:""},r.noRecords),K=a("button",{type:"button",class:"fd-button fd-button-link"},r.retry),Q=a("p",{class:"fd-list-failed",role:"alert",hidden:""},r.loadFailed," ",K);K.addEventListener("click",()=>{S()});function ee(k,E=0){let I=T(n.columns[0],k.values)||String(k.id),te=a("input",{type:"checkbox",class:"fd-list-checkbox","aria-label":o(r.selectRecord,{name:I})});te.checked=L.has(k.id),te.addEventListener("change",()=>{te.checked?L.add(k.id):L.delete(k.id),D()});let X=a("tr",{class:e.onOpenRecord?"fd-list-row fd-list-openable":"fd-list-row",tabindex:"0","data-id":String(k.id),"data-level":E?String(E):void 0},a("td",{class:"fd-list-check"},te),...n.columns.map(Y=>a("td",{class:Kn.has(t.fields[Y].type)?"fd-num":void 0},a("bdi",{},T(Y,k.values)))));return X.addEventListener("click",Y=>{let ae=Y.target.closest("td");if(ae?.classList.contains("fd-list-check")){Y.target===ae&&te.click();return}e.onOpenRecord?.(k.id)}),X.addEventListener("keydown",Y=>{Y.target===X&&(Y.key==="Enter"?(Y.preventDefault(),e.onOpenRecord?.(k.id)):Y.key===" "?(Y.preventDefault(),te.click()):(Y.key==="ArrowDown"||Y.key==="ArrowUp")&&(Y.preventDefault(),(Y.key==="ArrowDown"?X.nextElementSibling:X.previousElementSibling)?.focus()))}),c.set(X,k),X}let $=a("span",{class:"fd-list-count",role:"status"}),V=a("button",{type:"button",class:"fd-button fd-button-link"},r.clearSelection),W=(n.actions??[]).map(k=>{let E=a("button",{type:"button",class:`fd-button fd-button-${k.style??"secondary"}`,"data-node":k.id},...e.withIcon(k.icon,k.label));return E.addEventListener("click",async()=>{k.confirm&&!await e.confirm(k.confirm)||(await i.runAction(k.id,{recordIds:[...L]}),await S())}),E}),F=a("div",{class:"fd-list-selection",hidden:""},$,...W,V);V.addEventListener("click",()=>{L.clear();for(let k of J.querySelectorAll(".fd-list-checkbox"))k.checked=!1;D()}),z.addEventListener("change",()=>{for(let k of v())z.checked?L.add(k.id):L.delete(k.id);for(let k of J.querySelectorAll(".fd-list-checkbox"))k.checked=z.checked;D()});function D(){let k=v(),E=k.filter(I=>L.has(I.id)).length;z.checked=k.length>0&&E===k.length,z.indeterminate=E>0&&E<k.length,F.hidden=L.size===0,$.textContent=o(r.selected,{n:L.size});for(let I of J.querySelectorAll(".fd-list-row"))I.setAttribute("aria-selected",String([...L].some(te=>String(te)===I.dataset.id)))}let H=a("span",{class:"fd-pager-text"}),ne=a("button",{type:"button",class:"fd-button fd-pager-button","aria-label":r.previousPage},"\u2039"),re=a("button",{type:"button",class:"fd-button fd-pager-button","aria-label":r.nextPage},"\u203A"),me=a("div",{class:"fd-pager",role:"group"},H,ne,re);ne.addEventListener("click",()=>{x=Math.max(0,x-l),S()}),re.addEventListener("click",()=>{x+=l,S()});function ue(){me.hidden=g===0,H.textContent=o(r.range,{from:x+1,to:Math.min(x+m.length,g),total:g}),ne.disabled=x===0,re.disabled=x+l>=g}function pe(){for(let k of B){let E=h[0]?.field===k.dataset.field?h[0]:null;E?k.setAttribute("aria-sort",E.desc?"descending":"ascending"):k.removeAttribute("aria-sort")}}function ce(){let k=new Set(v().map(E=>E.id));for(let E of[...L])k.has(E)||L.delete(E);D()}let y=k=>({page:t,el:a,labels:r,fill:o,dataSource:k,model:b,fields:O,columns:n.columns.length+1,pageSize:l,sort:()=>h,recordRow:ee,changed:ce});async function S(){let k=++w;pe(),de.setAttribute("aria-busy","true");let E=[];try{let I=gt(f,n),te=mt(f),X=e.dataSource;if(te.length&&X?.groups&&X.list){let Y=await X.groups({model:b,field:te[0],filter:I});if(k!==w||N)return;m=[],g=0,E=Y.map(ae=>Qt(y(X),ae,0,I,te))}else{let Y=X?.list?await X.list({model:b,fields:O,filter:I,sort:h,offset:x,limit:l}):{records:[],total:0};if(k!==w||N)return;if(!Y.records.length&&Y.total>0&&x>0)return x=Math.floor((Y.total-1)/l)*l,S();m=Y.records,g=Y.total,E=m.map(ae=>ee(ae))}Q.hidden=!0}catch{if(k!==w||N)return;m=[],g=0,Q.hidden=!1}J.replaceChildren(...E),_.hidden=E.length>0||!Q.hidden,de.removeAttribute("aria-busy"),ue(),ce()}let A=Gn({page:t,node:n,doc:s,el:a,labels:r,fill:o,uid:e.uid,icons:e.icons,preferences:e.preferences,facets:f,onChange(k){f=k,x=0,S()}}),R=a("div",{class:"fd-list","data-node":n.id},a("div",{class:"fd-list-bar"},A.element,me),F,a("div",{class:"fd-list-scroll"},de),_,Q);return S(),{element:R,reload:S,destroy(){N=!0,A.destroy()}}}var Ce={en:{save:"Save",edit:"Edit",done:"Done",discard:"Discard",saving:"Saving\u2026",saved:"Saved",submit:"Submit",next:"Next",back:"Back",skip:"Skip",steps:"Steps",stepOf:"Step {n} of {total}",submitted:"Thank you. Your answers were sent.",submitAnother:"Submit another response",draftFound:"You have unsaved answers from {time}.",restore:"Restore",discardDraft:"Discard",ok:"OK",cancel:"Cancel",loading:"Loading\u2026",saveClose:"Save & Close",close:"Close",dismiss:"Dismiss",retry:"Retry",notSaved:"Not saved",notSent:"Not sent",checkFields:"{what}. Check: {fields}",offline:"Could not reach the server. Your changes are still here.",previousPage:"Previous page",nextPage:"Next page",range:"{from}\u2013{to} / {total}",selected:"{n} selected",clearSelection:"Clear",selectAll:"Select all",selectRecord:"Select {name}",noRecords:"No records match.",loadFailed:"Could not load the records.",search:"Search\u2026",searchLabel:"Search",searchFor:"Search {field} for: {text}",searchOptions:"Search options",filters:"Filters",groupBy:"Group By",favourites:"Favourites",or:"or",removeFacet:"Remove {label}",addCustomFilter:"Add a custom filter",field:"Field",condition:"Condition",value:"Value",apply:"Apply",saveSearch:"Save current search",searchName:"Name of the search",useByDefault:"Use by default",deleteFavourite:"Delete {name}",noFavourites:"No saved searches yet.",opIs:"is",opIsNot:"is not",opContains:"contains",opGreater:"greater than",opLess:"less than",opSet:"is set",opNotSet:"is not set",yes:"Yes",no:"No",none:"None",loadMore:"Show {n} more"},ar:{save:"\u062D\u0641\u0638",edit:"\u062A\u0639\u062F\u064A\u0644",done:"\u062A\u0645",discard:"\u062A\u062C\u0627\u0647\u0644",saving:"\u062C\u0627\u0631\u064D \u0627\u0644\u062D\u0641\u0638\u2026",saved:"\u062A\u0645 \u0627\u0644\u062D\u0641\u0638",submit:"\u0625\u0631\u0633\u0627\u0644",next:"\u0627\u0644\u062A\u0627\u0644\u064A",back:"\u0631\u062C\u0648\u0639",skip:"\u062A\u062E\u0637\u064D\u0651",steps:"\u0627\u0644\u062E\u0637\u0648\u0627\u062A",stepOf:"\u0627\u0644\u062E\u0637\u0648\u0629 {n} \u0645\u0646 {total}",submitted:"\u0634\u0643\u0631\u064B\u0627 \u0644\u0643. \u062A\u0645 \u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0627\u062A\u0643.",submitAnother:"\u0625\u0631\u0633\u0627\u0644 \u0625\u062C\u0627\u0628\u0629 \u0623\u062E\u0631\u0649",draftFound:"\u0644\u062F\u064A\u0643 \u0625\u062C\u0627\u0628\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u0641\u0648\u0638\u0629 \u0645\u0646 {time}.",restore:"\u0627\u0633\u062A\u0639\u0627\u062F\u0629",discardDraft:"\u062A\u062C\u0627\u0647\u0644",ok:"\u0645\u0648\u0627\u0641\u0642",cancel:"\u0625\u0644\u063A\u0627\u0621",loading:"\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026",saveClose:"\u062D\u0641\u0638 \u0648\u0625\u063A\u0644\u0627\u0642",close:"\u0625\u063A\u0644\u0627\u0642",dismiss:"\u0625\u062E\u0641\u0627\u0621",retry:"\u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",notSaved:"\u0644\u0645 \u064A\u064F\u062D\u0641\u0638",notSent:"\u0644\u0645 \u064A\u064F\u0631\u0633\u0644",checkFields:"{what}. \u0631\u0627\u062C\u0650\u0639: {fields}",offline:"\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645. \u062A\u0639\u062F\u064A\u0644\u0627\u062A\u0643 \u0645\u0627 \u0632\u0627\u0644\u062A \u0647\u0646\u0627.",previousPage:"\u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629",nextPage:"\u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629",range:"{from}\u2013{to} \u0645\u0646 {total}",selected:"\u062A\u0645 \u062A\u062D\u062F\u064A\u062F {n}",clearSelection:"\u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u062A\u062D\u062F\u064A\u062F",selectAll:"\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644",selectRecord:"\u062A\u062D\u062F\u064A\u062F {name}",noRecords:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0633\u062C\u0644\u0627\u062A \u0645\u0637\u0627\u0628\u0642\u0629.",loadFailed:"\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0633\u062C\u0644\u0627\u062A.",search:"\u0628\u062D\u062B\u2026",searchLabel:"\u0628\u062D\u062B",searchFor:"\u0627\u0628\u062D\u062B \u0641\u064A {field} \u0639\u0646: {text}",searchOptions:"\u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0628\u062D\u062B",filters:"\u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629",groupBy:"\u062A\u062C\u0645\u064A\u0639 \u062D\u0633\u0628",favourites:"\u0627\u0644\u0645\u0641\u0636\u0644\u0629",or:"\u0623\u0648",removeFacet:"\u0625\u0632\u0627\u0644\u0629 {label}",addCustomFilter:"\u0625\u0636\u0627\u0641\u0629 \u0639\u0627\u0645\u0644 \u062A\u0635\u0641\u064A\u0629 \u0645\u062E\u0635\u0635",field:"\u0627\u0644\u062D\u0642\u0644",condition:"\u0627\u0644\u0634\u0631\u0637",value:"\u0627\u0644\u0642\u064A\u0645\u0629",apply:"\u062A\u0637\u0628\u064A\u0642",saveSearch:"\u062D\u0641\u0638 \u0627\u0644\u0628\u062D\u062B \u0627\u0644\u062D\u0627\u0644\u064A",searchName:"\u0627\u0633\u0645 \u0627\u0644\u0628\u062D\u062B",useByDefault:"\u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627",deleteFavourite:"\u062D\u0630\u0641 {name}",noFavourites:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0639\u0645\u0644\u064A\u0627\u062A \u0628\u062D\u062B \u0645\u062D\u0641\u0648\u0638\u0629 \u0628\u0639\u062F.",opIs:"\u064A\u0633\u0627\u0648\u064A",opIsNot:"\u0644\u0627 \u064A\u0633\u0627\u0648\u064A",opContains:"\u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649",opGreater:"\u0623\u0643\u0628\u0631 \u0645\u0646",opLess:"\u0623\u0635\u063A\u0631 \u0645\u0646",opSet:"\u0645\u062D\u062F\u062F",opNotSet:"\u063A\u064A\u0631 \u0645\u062D\u062F\u062F",yes:"\u0646\u0639\u0645",no:"\u0644\u0627",none:"\u0628\u0644\u0627 \u0642\u064A\u0645\u0629",loadMore:"\u0639\u0631\u0636 {n} \u0623\u062E\u0631\u0649"},de:{save:"Speichern",edit:"Bearbeiten",done:"Fertig",discard:"Verwerfen",saving:"Wird gespeichert\u2026",saved:"Gespeichert",submit:"Absenden",next:"Weiter",back:"Zur\xFCck",skip:"\xDCberspringen",steps:"Schritte",stepOf:"Schritt {n} von {total}",submitted:"Vielen Dank. Ihre Antworten wurden gesendet.",submitAnother:"Weitere Antwort senden",draftFound:"Sie haben ungespeicherte Antworten vom {time}.",restore:"Wiederherstellen",discardDraft:"Verwerfen",ok:"OK",cancel:"Abbrechen",loading:"Wird geladen\u2026",saveClose:"Speichern und schlie\xDFen",close:"Schlie\xDFen",dismiss:"Ausblenden",retry:"Erneut versuchen",notSaved:"Nicht gespeichert",notSent:"Nicht gesendet",checkFields:"{what}. Bitte pr\xFCfen: {fields}",offline:"Der Server ist nicht erreichbar. Ihre \xC4nderungen sind noch da.",previousPage:"Vorherige Seite",nextPage:"N\xE4chste Seite",range:"{from}\u2013{to} / {total}",selected:"{n} ausgew\xE4hlt",clearSelection:"Auswahl aufheben",selectAll:"Alle ausw\xE4hlen",selectRecord:"{name} ausw\xE4hlen",noRecords:"Keine passenden Eintr\xE4ge.",loadFailed:"Die Eintr\xE4ge konnten nicht geladen werden.",search:"Suchen\u2026",searchLabel:"Suchen",searchFor:"{field} durchsuchen nach: {text}",searchOptions:"Suchoptionen",filters:"Filter",groupBy:"Gruppieren nach",favourites:"Favoriten",or:"oder",removeFacet:"{label} entfernen",addCustomFilter:"Eigenen Filter hinzuf\xFCgen",field:"Feld",condition:"Bedingung",value:"Wert",apply:"Anwenden",saveSearch:"Aktuelle Suche speichern",searchName:"Name der Suche",useByDefault:"Standardm\xE4\xDFig verwenden",deleteFavourite:"{name} l\xF6schen",noFavourites:"Noch keine gespeicherten Suchen.",opIs:"ist",opIsNot:"ist nicht",opContains:"enth\xE4lt",opGreater:"gr\xF6\xDFer als",opLess:"kleiner als",opSet:"ist gesetzt",opNotSet:"ist nicht gesetzt",yes:"Ja",no:"Nein",none:"Ohne Angabe",loadMore:"{n} weitere anzeigen"},fr:{save:"Enregistrer",edit:"Modifier",done:"Termin\xE9",discard:"Annuler les modifications",saving:"Enregistrement\u2026",saved:"Enregistr\xE9",submit:"Envoyer",next:"Suivant",back:"Retour",skip:"Passer",steps:"\xC9tapes",stepOf:"\xC9tape {n} sur {total}",submitted:"Merci. Vos r\xE9ponses ont \xE9t\xE9 envoy\xE9es.",submitAnother:"Envoyer une autre r\xE9ponse",draftFound:"Vous avez des r\xE9ponses non enregistr\xE9es du {time}.",restore:"Restaurer",discardDraft:"Ignorer",ok:"OK",cancel:"Annuler",loading:"Chargement\u2026",saveClose:"Enregistrer et fermer",close:"Fermer",dismiss:"Masquer",retry:"R\xE9essayer",notSaved:"Non enregistr\xE9",notSent:"Non envoy\xE9",checkFields:"{what}. \xC0 v\xE9rifier : {fields}",offline:"Le serveur est injoignable. Vos modifications sont toujours l\xE0.",previousPage:"Page pr\xE9c\xE9dente",nextPage:"Page suivante",range:"{from}\u2013{to} / {total}",selected:"{n} s\xE9lectionn\xE9(s)",clearSelection:"D\xE9s\xE9lectionner",selectAll:"Tout s\xE9lectionner",selectRecord:"S\xE9lectionner {name}",noRecords:"Aucun enregistrement ne correspond.",loadFailed:"Impossible de charger les enregistrements.",search:"Rechercher\u2026",searchLabel:"Rechercher",searchFor:"Rechercher {field} : {text}",searchOptions:"Options de recherche",filters:"Filtres",groupBy:"Regrouper par",favourites:"Favoris",or:"ou",removeFacet:"Retirer {label}",addCustomFilter:"Ajouter un filtre personnalis\xE9",field:"Champ",condition:"Condition",value:"Valeur",apply:"Appliquer",saveSearch:"Enregistrer la recherche",searchName:"Nom de la recherche",useByDefault:"Utiliser par d\xE9faut",deleteFavourite:"Supprimer {name}",noFavourites:"Aucune recherche enregistr\xE9e.",opIs:"est",opIsNot:"n\u2019est pas",opContains:"contient",opGreater:"sup\xE9rieur \xE0",opLess:"inf\xE9rieur \xE0",opSet:"est d\xE9fini",opNotSet:"n\u2019est pas d\xE9fini",yes:"Oui",no:"Non",none:"Aucun",loadMore:"Afficher {n} de plus"}},Zn=Ce.en;var ui=0;function Xt(e,t){let n=e.ownerDocument,i=ct(t.page);if(!i.ok)throw new Error(`This page cannot be shown:
3
+ ${i.issues.map(p=>` ${p.path}: ${p.message}`).join(`
4
+ `)}`);let a=t.translate?ft(i.page,t.translate):i.page,r=t.locale??"en",o=t.preferences??Yt(),d=jn(t),s=!t.form,l=t.form??ht({...t,page:a,messages:t.messages??Te[r]}),u={...Ce[r],...t.labels},h=ge[r],x=t.dir??(r==="ar"?"rtl":void 0),g=`fd${++ui}`,m=[],c=[],v=p=>`${g}-${p.replace(/[^A-Za-z0-9_-]/g,"_")}`,b=(p,M)=>p.replace(/\{(\w+)\}/g,(C,j)=>String(M[j]??""));Kt(n);function f(p,M={},...C){let j=n.createElement(p);for(let[q,Z]of Object.entries(M))Z!==void 0&&j.setAttribute(q,Z);return j.append(...C),j}function L(p,M){let C=ze(n,p,t.icons);return C?[C,M]:[M]}let w=f("form",{class:"fd-form",novalidate:"","data-fd-skin":t.skin??"underline",dir:x,lang:t.locale,"data-max-width":a.maxWidth}),N=t.confirm??nn;function O(p){let M=a.fields[p.field],C=v(p.id),j=f("div",{class:"fd-field","data-node":p.id,"data-field":p.field,"data-type":M.type});p.colspan&&j.style.setProperty("--fd-span",String(p.colspan));let q=f("label",{class:"fd-label",id:`${C}-label`,for:C},p.label??M.label),Z=t.showValid&&!pi.has(M.type)?ze(n,"check"):null;Z&&(Z.classList.add("fd-valid-mark"),q.append(Z));let U=Ee({form:l,name:p.field,field:M,node:p,id:C,document:n,labels:h,preferences:o,locale:r,dialogs:d},t.widgets);["INPUT","SELECT","TEXTAREA"].includes(U.element.tagName)||(U.element.getAttribute("role")&&U.element.setAttribute("aria-labelledby",q.id),q.addEventListener("click",()=>U.focus()));let fe=p.help??M.help,oe=fe?f("div",{class:"fd-help",id:`${C}-help`},fe):null,se=f("div",{class:"fd-error",id:`${C}-error`,hidden:""}),we=f("div",{class:"fd-warning",role:"status",hidden:""});return j.append(q,U.element,...oe?[oe]:[],se,we),U.destroy&&c.push(()=>U.destroy?.()),m.push(G=>{let P=l.node(p.id);j.hidden=P.invisible,j.classList.toggle("fd-required",P.required);let ie=G.errors[p.field];se.hidden=!ie,se.textContent=ie??"";let ve=G.warning&&G.warningField===p.field?G.warning:"";if(we.hidden=!ve,we.textContent=ve,Z){let Le=G.values[p.field],ke=Le!=null&&Le!==""&&!(Array.isArray(Le)&&!Le.length),Se=!P.readonly&&!ie&&ke&&G.dirty.includes(p.field)&&l.problem(p.field)===null;j.classList.toggle("fd-valid",Se),Z.toggleAttribute("hidden",!Se)}U.update({value:G.values[p.field],values:G.values,readonly:P.readonly||$,required:P.required,invalid:!!ie,describedBy:[oe?.id,ie?se.id:void 0].filter(Boolean).join(" ")||void 0})}),j}function T(p,M){m.push(()=>{p.hidden=l.node(M).invisible})}function z(p){let M=f("button",{type:"button",class:`fd-button fd-button-${p.style??"secondary"}`,"data-node":p.id},...L(p.icon,p.label));return M.addEventListener("click",async()=>{p.confirm&&!await N(p.confirm)||await l.runAction(p.id)}),T(M,p.id),M}function B(p){let M=p.style??"paragraph",C=f(M==="heading"?"h3":"p",{class:`fd-text-${M}`,"data-node":p.id},p.text);return T(C,p.id),C}function J(p){let M=f("div",{class:"fd-slot","data-slot":p.name,"data-node":p.id}),C=t.slots?.[p.name]?.(M,{form:l,name:p.name});return C&&c.push(C),T(M,p.id),M}function de(p,M=1){let C=f("div",{class:"fd-grid"});if(C.style.setProperty("--fd-columns",String(ot(M))),typeof M=="object")for(let j of["medium","narrow"]){let q=M[j];q!==void 0&&(C.setAttribute(`data-columns-${j}`,String(q)),C.style.setProperty(`--fd-columns-${j}`,String(q)))}return C.append(...p.map(ee)),C}let _=new Map;function K(p){let M=f("fieldset",{class:"fd-section","data-node":p.id}),C=p.description?f("p",{class:"fd-section-description"},p.description):null,j=de(p.children,p.columns);if(p.title&&p.collapsible){j.id=v(`${p.id}-content`);let q=f("button",{type:"button",class:"fd-section-toggle","aria-controls":j.id},f("span",{class:"fd-section-chevron","aria-hidden":"true"}),...L(p.icon,p.title)),Z=p.collapsed!==!0,U=fe=>{Z=fe,q.setAttribute("aria-expanded",String(Z)),j.hidden=!Z,C&&(C.hidden=!Z),M.classList.toggle("fd-section-folded",!Z)};q.addEventListener("click",()=>U(!Z)),_.set(M,()=>U(!0)),U(Z),M.append(f("legend",{class:"fd-section-title"},q))}else p.title&&M.append(f("legend",{class:"fd-section-title"},...L(p.icon,p.title)));return C&&M.append(C),M.append(j),T(M,p.id),M}function Q(p){let M=f("div",{class:"fd-tabs","data-node":p.id}),C=f("div",{class:"fd-tablist",role:"tablist"}),j=null,q=p.children[0].id,Z=p.children.map(U=>{let fe=v(`${U.id}-tab`),oe=v(`${U.id}-panel`),se=f("button",{type:"button",class:"fd-tab",role:"tab",id:fe,"aria-controls":oe,"data-node":U.id},...L(U.icon,U.label)),we=f("div",{class:"fd-tabpanel",role:"tabpanel",id:oe,"aria-labelledby":fe},de(U.children));return se.addEventListener("click",()=>{j=q=U.id,Be(l.getState())}),C.append(se),{tab:U,button:se,panel:we}});return C.addEventListener("keydown",U=>{let fe=Z.filter(P=>!P.button.hidden),oe=fe.findIndex(P=>P.tab.id===q),se={ArrowRight:1,ArrowLeft:-1,Home:-oe,End:fe.length-1-oe}[U.key];if(se===void 0||oe===-1)return;U.preventDefault();let we=w.getAttribute("dir")==="rtl"&&(U.key==="ArrowRight"||U.key==="ArrowLeft"),G=fe[(oe+(we?-se:se)+fe.length)%fe.length];j=q=G.tab.id,Be(l.getState()),G.button.focus()}),M.append(C,...Z.map(U=>U.panel)),m.push(()=>{M.hidden=l.node(p.id).invisible;let U=Z.filter(oe=>!l.node(oe.tab.id).invisible);j!==null&&U.some(oe=>oe.tab.id===j)?q=j:U.length&&(q=U[0].tab.id);for(let oe of Z){let se=oe.tab.id===q;oe.button.hidden=!U.includes(oe),oe.button.setAttribute("aria-selected",String(se)),oe.button.tabIndex=se?0:-1,oe.panel.hidden=!se}}),M}function ee(p){switch(p.type){case"field":return O(p);case"button":return z(p);case"text":return B(p);case"slot":return J(p);case"section":return K(p);case"tabs":return Q(p)}}let $=t.readonly===!0,V=t.editSwitch?f("button",{type:"button",class:"fd-button fd-edit-switch"}):null;V?.addEventListener("click",async()=>{if($)$=!1;else{if(l.getState().dirty.length&&!await l.save()){l.getState().saveProblem||ce(ne(l.getState())),E();return}$=!0}w.toggleAttribute("data-readonly",$),Be(l.getState())}),w.toggleAttribute("data-readonly",$),m.push(()=>{V&&(V.textContent=$?u.edit:u.done,V.classList.toggle("fd-button-primary",$))});let W=f("div",{class:"fd-status",role:"status","aria-live":"polite"}),F=f("button",{type:"button",class:"fd-button fd-button-link fd-retry",hidden:""},u.retry);F.addEventListener("click",()=>{Y()});let D=f("div",{class:"fd-status-box"},W,F),H=()=>a.data.kind==="responses"?u.notSent:u.notSaved;function ne(p){let M=[];for(let j of Object.keys(p.errors)){let q=j.split(".")[0],U=w.querySelector(`.fd-field[data-field="${q}"]:not([hidden]) > .fd-label`)?.firstChild?.textContent??a.fields[q]?.label??q;M.includes(U)||M.push(U)}let C=[...w.querySelectorAll(".fd-field[data-field] > .fd-label")].map(j=>j.firstChild?.textContent??"");return M.sort((j,q)=>(C.indexOf(j)+1||1/0)-(C.indexOf(q)+1||1/0)),M.length?b(u.checkFields,{what:H(),fields:M.join(", ")}):H()}let re;m.push(p=>{let M=p.saveProblem,C=p.status==="saving"?u.saving:p.status==="saved"?u.saved:p.status==="loading"?u.loading:p.status==="error"&&M?M.kind==="fields"?ne(p):M.kind==="other"?M.message:H():p.status==="error"?p.error??"":"";W.textContent=C,F.hidden=!(p.status==="error"&&M?.kind==="other"),W.classList.toggle("fd-status-error",p.status==="error"),W.classList.toggle("fd-status-saved",p.status==="saved"),t.saveStatus==="toast"&&(clearTimeout(re),D.hidden=!C,p.status==="saved"&&(re=setTimeout(()=>D.hidden=!0,2500)))});let me=f("button",{type:"button",class:"fd-button fd-retry"},u.retry);me.addEventListener("click",()=>{Y()});let ue=f("div",{class:"fd-banner fd-tone-warning",role:"alert",hidden:""},f("span",{class:"fd-banner-text"},u.offline),me),pe=f("div",{class:"fd-announce",role:"alert","aria-live":"assertive"});function ce(p){pe.textContent="",setTimeout(()=>pe.textContent=p,0)}let y=null;m.push(p=>{p.saveProblem!==y&&(y=p.saveProblem,ue.hidden=y?.kind!=="network",y&&(y.kind==="rule"?nn(y.message,!1):y.kind==="fields"?ce(ne(p)):y.kind==="other"&&ce(y.message)))});let S=f("div",{class:"fd-draft",hidden:""}),A=f("span"),R=f("button",{type:"button",class:"fd-button fd-button-primary"},u.restore),k=f("button",{type:"button",class:"fd-button fd-button-link"},u.discardDraft);R.addEventListener("click",()=>l.restoreDraft()),k.addEventListener("click",()=>l.discardDraft()),S.append(A,R,k),m.push(p=>{S.hidden=!p.draft,p.draft&&(A.textContent=b(u.draftFound,{time:new Date(p.draft.savedAt).toLocaleString()}))});function E(){let p=w.querySelector('[aria-invalid="true"]');if(!p)return;for(let C=p.closest(".fd-section-folded");C;C=C.parentElement?.closest(".fd-section-folded")??null)_.get(C)?.();if(!p.dispatchEvent(new CustomEvent("fd-focus-problem",{cancelable:!0})))return;(p.matches("input, select, textarea, button")?p:p.querySelector("input, select, textarea, button"))?.focus()}let I=f("div",{class:"fd-done",hidden:""},f("p",{class:"fd-done-title"},u.submitted)),te=f("button",{type:"button",class:"fd-button"},u.submitAnother);I.append(te);let X=f("div",{class:"fd-content"});async function Y(){if(!await l.save()){l.getState().saveProblem||ce(ne(l.getState())),E();return}a.data.kind==="responses"&&(X.hidden=!0,I.hidden=!1)}te.addEventListener("click",()=>{l.reset(),X.hidden=!1,I.hidden=!0});function ae(){if(!a.title&&!a.description)return null;let p=f("header",{class:"fd-page-head"});return a.title&&p.append(f("h1",{class:"fd-page-title"},a.title)),a.description&&p.append(f("p",{class:"fd-page-description"},a.description)),p}function Ge(p){let M=f("div",{class:"fd-sections","data-node":p.id},...p.children.map(ee)),C=f("button",{type:"submit",class:"fd-button fd-button-primary"},a.data.kind==="responses"?u.submit:u.save),j=f("div",{class:"fd-actions fd-actions-end"},D,C);if(a.data.kind==="record"){let q=f("button",{type:"button",class:"fd-button"},u.discard);q.addEventListener("click",()=>l.reset()),j.insertBefore(q,C),m.push(Z=>{let U=Z.dirty.length>0&&Z.status!=="saving"&&!$;C.hidden=!U,q.hidden=!U})}else m.push(()=>C.hidden=$);return V&&j.prepend(V),t.showActions===!1?f("div",{},M):a.actionsPosition==="top"?(j.classList.add("fd-actions-top"),f("div",{},j,M)):f("div",{},M,j)}function At(p){let M=f("div",{class:"fd-wizard","data-node":p.id}),C=f("div",{class:"fd-progress-text"}),j=f("span");M.append(f("div",{class:"fd-progress"},C,f("div",{class:"fd-progress-bar"},j)));let q=p.clickable?f("ol",{class:"fd-steps-list"}):null,Z=new Map;if(q){for(let P of p.children){let ie=f("button",{type:"button",class:"fd-step-link"},...L(P.icon,P.label));ie.addEventListener("click",()=>{l.goTo(P.id)?G():E()}),Z.set(P.id,ie),q.append(f("li",{},ie))}M.append(f("nav",{class:"fd-steps","aria-label":u.steps},q))}let U=p.children.map(P=>{let ie=f("section",{class:"fd-step","data-node":P.id,"aria-labelledby":v(`${P.id}-title`)});return ie.append(f("h2",{class:"fd-step-title",id:v(`${P.id}-title`)},...L(P.icon,P.label))),P.description&&ie.append(f("p",{class:"fd-section-description"},P.description)),ie.append(de(P.children)),M.append(ie),{step:P,panel:ie}}),fe=f("button",{type:"button",class:"fd-button"},p.backLabel??u.back),oe=f("button",{type:"button",class:"fd-button fd-button-link"},u.skip),se=f("button",{type:"submit",class:"fd-button fd-button-primary"});M.append(f("div",{class:"fd-wizard-nav"},fe,f("span",{class:"fd-spacer"}),D,oe,se)),fe.addEventListener("click",()=>{l.back()&&G()}),oe.addEventListener("click",()=>{l.skip()&&G()});let we=()=>{let P=l.steps();return P.indexOf(l.getState().step??"")===P.length-1};xe=async()=>{if(we())return Y();l.next()?G():E()};function G(){U.find(ie=>ie.step.id===l.getState().step)?.panel.querySelector("input, select, textarea, [role=radio]")?.focus()}return m.push(P=>{let ie=l.steps(),ve=Math.max(0,ie.indexOf(P.step??""));C.textContent=b(u.stepOf,{n:ve+1,total:ie.length}),j.style.width=`${(ve+1)/Math.max(1,ie.length)*100}%`;for(let{step:ke,panel:Se}of U)Se.hidden=ke.id!==P.step;let Le=ve===ie.length-1;fe.hidden=ve===0,oe.hidden=Le||!p.children.find(ke=>ke.id===P.step)?.optional,se.textContent=Le?p.finishLabel??u.submit:p.nextLabel??u.next;for(let[ke,Se]of Z){let $e=ie.indexOf(ke);Se.parentElement.hidden=$e===-1,Se.classList.toggle("fd-step-done",$e!==-1&&$e<ve),Se.classList.toggle("fd-step-skipped",P.skipped.includes(ke)),ke===P.step?Se.setAttribute("aria-current","step"):Se.removeAttribute("aria-current")}}),M}function Mt(p){let M=f("div",{class:"fd-sheet-page","data-node":p.id}),C=f("div",{class:"fd-actions"}),j=f("button",{type:"submit",class:"fd-button fd-button-primary"},u.save),q=f("button",{type:"button",class:"fd-button"},u.discard);q.addEventListener("click",()=>l.reset());let Z=a.actionsPosition==="bottom",U=f("div",{class:"fd-actions fd-actions-end fd-sheet-foot"});t.showActions===!1?C.append(...(p.buttons??[]).map(z)):Z?(C.append(...(p.buttons??[]).map(z)),U.append(D,q,j)):C.append(j,q,...(p.buttons??[]).map(z),D),V&&t.showActions!==!1&&C.prepend(V),m.push(G=>{let P=G.dirty.length>0&&G.status!=="saving"&&!$;j.hidden=!P,q.hidden=!P});let fe=f("div",{class:"fd-header"},C),oe=p.statusbar?.position==="title";p.statusbar&&!oe&&fe.append(ye(p.statusbar));let se=f("div",{class:"fd-card"});if(p.ribbon){let G=f("div",{class:`fd-ribbon fd-tone-${p.ribbon.tone??"muted"}`,"data-node":p.ribbon.id},p.ribbon.label);T(G,p.ribbon.id),se.append(f("div",{class:"fd-ribbon-frame"},G))}if(p.statButtons?.length){let G=f("div",{class:"fd-stats"});for(let P of p.statButtons){let ie=f("span",{class:"fd-stat-value"}),ve=ze(n,P.icon,t.icons),Le=f("span",{class:"fd-stat-words"},ie,f("span",{class:"fd-stat-label"},P.label)),ke=f("button",{type:"button",class:"fd-stat","data-node":P.id},...ve?[ve,Le]:[Le]);ke.addEventListener("click",()=>{l.runAction(P.id)}),m.push(Se=>{ke.hidden=l.node(P.id).invisible;let $e=P.field?Se.values[P.field]:null;ie.textContent=$e==null?"":String($e)}),G.append(ke)}se.append(G)}for(let G of p.alerts??[]){let P=f("div",{class:`fd-alert fd-tone-${G.tone??"info"}`,role:"status","data-node":G.id},f("span",{class:"fd-alert-message"},G.message));if(G.dismissible){let ie=!1,ve=f("button",{type:"button",class:"fd-alert-close","aria-label":u.dismiss},"\xD7");ve.addEventListener("click",()=>{ie=!0,P.hidden=!0}),P.append(ve),m.push(()=>{P.hidden=ie||l.node(G.id).invisible})}else T(P,G.id);se.append(P)}if(p.badges?.length){let G=f("div",{class:"fd-badges"});for(let P of p.badges){let ie=f("span",{class:`fd-badge fd-tone-${P.tone??"muted"}`,"data-node":P.id},...L(P.icon,P.label));T(ie,P.id),G.append(ie)}m.push(()=>{G.hidden=[...G.children].every(P=>P.hidden)}),se.append(G)}if(p.title){let G=f("div",{class:"fd-title"});p.title.above?.length&&G.append(f("div",{class:"fd-title-above"},...p.title.above.map(O))),G.append(O({type:"field",id:"#title",field:p.title.field,placeholder:p.title.placeholder})),p.title.subtitleField&&G.append(O({type:"field",id:"#subtitle",field:p.title.subtitleField})),p.title.below?.length&&G.append(f("div",{class:"fd-title-below"},...p.title.below.map(O)));let P=f("div",{class:"fd-title-row"},G);if(p.title.avatarField){let ie=O({type:"field",id:"#avatar",field:p.title.avatarField});ie.classList.add("fd-avatar"),P.append(ie)}se.append(P)}p.statusbar&&oe&&se.append(f("div",{class:"fd-title-statusbar"},ye(p.statusbar))),se.append(de(p.children)),Z&&t.showActions!==!1&&(se.append(U),m.push(G=>{U.hidden=G.dirty.length===0&&!W.textContent}));let we=f("div",{class:"fd-sheet-layout"},se);return p.sidePanel&&(we.classList.add("fd-has-side"),we.append(f("aside",{class:"fd-side"},J(p.sidePanel)))),M.append(fe,we),M}function ye(p){let M=a.fields[p.field],C={clickable:p.clickable===!0};p.visibleStates&&(C.visibleStates=p.visibleStates);let j={type:"field",id:"#statusbar",field:p.field,widget:"statusbar",options:C},q=Ee({form:l,name:p.field,field:M,node:j,id:v("statusbar"),document:n,labels:h,preferences:o,locale:r,dialogs:d},t.widgets);return m.push(Z=>q.update({value:Z.values[p.field],values:Z.values,readonly:l.node("#statusbar").readonly||$,required:!1,invalid:!1})),q.element}let xe=null,he=a.layout,We;if(he.type==="sheet")We=Mt(he);else if(he.type==="wizard")We=At(he);else if(he.type==="tabs")We=Ge({id:`${he.id}-page`,children:[he]});else if(he.type==="list"){let p=Yn({page:a,node:he,form:l,dataSource:t.dataSource,doc:n,el:f,labels:u,locale:r,fill:b,confirm:N,withIcon:L,uid:v,icons:t.icons,preferences:o,onOpenRecord:t.onOpenRecord});c.push(p.destroy),We=p.element}else We=Ge(he);let tn=he.type==="sheet"?null:ae();X.append(...tn?[tn]:[],ue,S,We),w.append(X,I,pe),t.saveStatus==="toast"?(D.classList.add("fd-toast"),w.append(D)):t.saveStatus==="bar"&&(D.classList.add("fd-status-bar"),X.prepend(D)),w.addEventListener("submit",p=>{p.preventDefault(),he.type!=="list"&&(xe?xe():Y())});function Xn(){let p=n.activeElement;p&&w.contains(p)&&(p.tagName==="INPUT"||p.tagName==="TEXTAREA")&&p.dispatchEvent(new Event("change",{bubbles:!0}))}function Qn(p){let M=[...w.querySelectorAll(".fd-field")].filter(q=>!q.closest('[hidden], [data-type="one2many"] .fd-field, .fd-form-dialog')&&!q.parentElement?.closest('[data-type="one2many"]')),C=p.closest(".fd-field"),j=M.slice(M.indexOf(C)+1);for(let q of j){let Z=q.querySelector('input:not([type="hidden"]):not([readonly]):not([disabled]), select:not([disabled]), textarea:not([readonly]), [contenteditable="true"]');if(Z)return Z}return null}w.addEventListener("keydown",p=>{if(p.isComposing||p.key!=="Enter"||he.type==="list"||p.target.closest(".fd-slot"))return;let M=t.keys??{};if(p.ctrlKey||p.metaKey){if(M.saveWithCtrlEnter===!1||t.showActions===!1||p.target.closest(".ag-root-wrapper"))return;p.preventDefault(),Xn(),xe?xe():Y();return}if(p.defaultPrevented||!M.enterMovesToNext||p.shiftKey||p.altKey)return;let C=p.target;C.tagName!=="INPUT"&&C.tagName!=="SELECT"||C.closest('[data-type="one2many"]')||["button","submit","reset","file"].includes(C.type)||(p.preventDefault(),Qn(C)?.focus())});function nn(p,M=!0){return new Promise(C=>{let j=f("p",{id:`${g}-confirm`},p),q=f("button",{type:"button",class:"fd-button"},u.cancel),Z=f("button",{type:"button",class:"fd-button fd-button-primary"},u.ok),U=f("div",{class:"fd-dialog",role:"alertdialog","aria-modal":"true","aria-labelledby":j.id},j,f("div",{class:"fd-actions fd-actions-end"},...M?[q,Z]:[Z])),fe=f("div",{class:"fd-dialog-backdrop"},U),oe=se=>{fe.remove(),C(se)};q.addEventListener("click",()=>oe(!1)),Z.addEventListener("click",()=>oe(!0)),fe.addEventListener("keydown",se=>{se.key==="Escape"&&oe(!1)}),w.append(fe),Z.focus()})}function Be(p){for(let M of m)M(p)}e.append(w);let er=l.subscribe(Be);return Be(l.getState()),l.getState().status==="idle"&&l.load(),{form:l,element:w,setSkin(p){w.setAttribute("data-fd-skin",p)},async save(){let p=await l.save();return p||E(),p},check(){let p=l.validate();return p||E(),p},setReadonly(p){$=p,w.toggleAttribute("data-readonly",$),Be(l.getState())},isReadonly:()=>$,destroy(){er();for(let p of c)p();w.remove(),s&&l.dispose()}}}var pi=new Set(["boolean","one2many","binary","image","html","json","properties"]);var gi="0.9.0";return sr(mi);})();
608
5
  //# sourceMappingURL=fieldia.js.map